hacking Apple I

W zasadzie to hacking z tego mały, ale – jest to fajna zabawa trochę z asemblerem i komputerem Apple I do której zainspirował mnie Jacek Łupina z Apple Muzeum Polska podczas otwarcia ekspozycji w Fabryce Norblina w Warszawie.

W manualu (liczącym kilkanaście stron!) do Apple I jako procedurę testową opublikowano coś takiego:

FIRST: 
Hit the RESET button to enter the system monitor. A backslash should be displayed, and the cursor should drop to the next line. 
SECOND:  
Type - 0: A9 b 0 b AA b 20 b EF b FF b E8 b 8A b 4C b 2 b 0 (RET) (0 is a zero, NOT an alpha "0"; b means blank or space; and (RET) hit the "return" key on the keyboard) 
THIRD: 
Type - 0 . A (RET) (This should print out, on the display, program you have just entered. ) 
FOURTH: 
Type - R (RET) (R means run the program. ) THE PROGRAM SHOULD THEN PRINT OUT ON THE DISPLAY A CONTINUOUS STREAM OF ASCII CHARACTERS. TO STOP THE PROGRAM AND RETURN TO THE SYSTEM MONITOR, HIT THE "RESET" BUTTON. TO RUN AGAIN, TYPE : R (RET). 

No fajnie, tylko co tam się dzieje? Manual do Apple I to 12 stron, ale jakoś sobie poradzimy, wszystko jest dzisiaj proste. Po pierwsze, przeczytajmy dokładnie co jest napisane i wpiszmy to co potrzeba czyli:

A9 0 AA 20 EF FF E8 8A 4C 2 0

To wartości hexadecymalne czyli szestnastkowe. W tych 10 bajtach jest ukryty programik.

Programik, który autorzy Apple I proponują nam wprowadzić testuje zarówno klawiaturę jak i zestaw znaków w pamięci ROM jak i pamięć RAM. Klawiaturę – bo jakoś musimy to wprowadzić, pamięć ROM, bo do niej się odwołujemy, pamięć RAM, bo do niej wprowadzamy kod i uruchamiamy go w niej. Tak na szybko – pod tymi bajtami danych kryje się:

LDA #$00
loop: TAX
JSR $FFEF
INX
TXA
JMP loop

szybki translator co dana mnemonika asemblera oznacza:
LDA – Load Accumulator – załaduj wartość do akumulatora (A), czyli w tym przypadku go zerujemy
TAX – Transfer Accumulator to X – ładujemy zawartość akumulatora (A) do rejestru X
JSR – Jump to Subroutine, skaczemy do procedury w pamięci ROM, dobra wiadomość – będzie można z niej wrócić
INX – Increment X Register czyli zwiększenie o jeden rejestru X
TXA – Transfer X to Accumulator, czyli z rejestru X zapisujemy do akumulatora (A)
JMP – JuMP – skok ale bezwzględny, bez powrotu – w tym przypadku jest to po prostu pętla

Co znajduje się pod adresem $FFEF w pamięci ROM Apple I? Odpowiedź jest podana na stronie 7 manuala Apple I:

FFEF: BIT DSP   ;// DA bit (B7) cleared yet?
FFF2: BMI ECHO  ;// No, wait for display.
FFF4: STA DSP   ;// Output character. Sets DA.
FFF7: RTS       ;// Return.

D012 to adres zmiennej systemowej (DSP), która odwzorowuje rejestr/port PIA (6820). DSP DATA składa się z siedmiu młodszych bitów danych oraz starszego bitu oznaczającego “display ready” (1 oznacza “ready”, 0 oznacza “busy”).

BTW – w Apple I mamy cztery porty:

$d010 ; kbd – read key

$d011 ; kbdcr – control port

$d012 ; dsp – write ascii

$d012; dspcr – control port

No dobra, co tam w kodzie ROM piszczy:

BIT – wykonuje operację logiczną AND na liczbie z rejestrem akumulatora. Flagi N i V odpowiadają wynikowi operacji dla bitów 7 i 6, nas w tym przypadku interesuje tylko bit 7 czyli “display ready”.
BMI – Branch on MInus – w tym przypadku – jeżeli bit 7 jest zapalony to lecimy dalej do następnego rozkazu
STA – STore Accumulator – zapamiętujemy w rejestrze DSP wartość z akumulator (A). To jest moment, w którym znak o danej wartości kodowej wędruje na ekran.
RTS – Return from Subroutine – i wracamy skąd nas wołano (czyli z programu głównego)

Co więc robi ten programik wprowadzany w monitorze Apple I? Drukuje na ekranie w pętli 64 znaki z pamięci ROM Apple I. Dlaczego nie więcej? Bo więcej nie ma i na więcej nie ma już miejsca w 8bitowym rejestrze, bo ostatni bit wykorzystywany jest do statusu, bo Apple I ma “pamięć ekranu” typu shift-register składającą się z 1024 rejestrów do których dostęp jest w ramach 1024 cykli. To przykład mistrzostwa redukcji w celu zmniejszenia kosztów: chipsety Signetics 2504 mają po 6 linii (6 linii na wejścia bitów i tyle samo na bity wyjściowe) plus dwie linie zasilające (+-5V) oraz dwie linie zegarowe. Jak to działa – co cykl jest przesuwany znacznik rejestru, nie jest możliwe przeskoczenie do konkretnej komórki pamięci bez pominięcia upłynięcia potrzebnych do przesunięcia znacznika rejestru cykli zegarowych.

Garść przydatnych rzeczy:

Dissasembler online 6502

online emulator Apple I

emulator Apple I ze źródłami

Zrzut ROM Apple I z komentarzami

spis instrukcji procesora 6502 z wyjaśnieniami

bardzo fajny artykuł o shift-register memory

Apple Muzeum Polska, gdzie możecie obejrzeć działającą replikę komputera Apple I w wyjątkowej oprawie, warto, bo zdecydowanie robi to większe wrażenie niż odpalenie emulatora. A wpisanie dziesięciu liczb hexadecymalnych i odpalenie programu w asemblerze na pokładzie komputera z 1977 roku musi robić wrażenie 🙂

Apple Muzeum Polska to ogromna kolekcja komputerów firmy Apple (i nie tylko) Jacka Łupiny, którą miałem okazję obejrzeć jeszcze w pierwszej lokalizacji. Z samym Jackiem miałem przyjemność organizować dwie imprezy Retro Apple w Hackroom122. To jedna z najobszerniejszych kolekcji w Europie, jeśli nie na świecie, polecam obejrzeć – to kawał historii komputeryzacji tej planety, włącznie z rewolucją designu i UX w komputerach.