Od pewnego czasu przechodzę powtórną fascynację Atari (poprzednia była za dzieciaka), wgłębiam się w architekturę, oficjalne i nieoficjalne dokumentacje... Parę tygodni już czytam i postanowiłem wreszcie poeksperymentować pod emulatorem w oczekiwaniu na kabel do telewizora.
Ponieważ w dzieciństwie nie miałem stacji dyskietek (była za droga), spędziłem setki godzin na wgrywaniu gier i programów z kaset. Dzisiaj chciałbym powrócić do tego tematu, ale już od strony programistycznej :)
Ale do rzeczy. Sprawa tyczy się Atari 800 XL. Jak podaje Atari Technical Reference Notes, proces bootowania z kasety wygląda następująco:
- czytany jest pierwszy rekord (128 B) z kasety; pierwsze 6 bajtów to nagłówek
- z nagłówka wydobywane są informacje: bajt 0 jest ignorowany, bajt 1 powinien zawierać liczbę rekordów, bajty 2 i 3 adres, pod który skopiowany będzie program, a bajty 4 i 5 adres procedury inicjalizacyjnej programu
- czytane są pozostałe rekordy
- jsr do początku programu + 6 (tu powinna znaleźć się procedura, która ustawi carry clear w przypadku braku błędu i zrobi rts)
- jsr do procedury inicjalizacyjnej (tej wskazanej w nagłówku)
- jsr poprzez wektor zawarty w DOSVEC, aby przekazać kontrolę naszemu programowi
W oparciu o ten opis napisałem program:
opt h-
org $2000
cassette
dta 0 ;ignorowany
dta [end-cassette+127]/128 ;liczba rekordow
dta a($2000) ;adres, pod ktory program bedzie skopiowany
dta a(init) ;adres inicjalizacji
_boot
clc ;powiedzmy monitorowy, ze nie bylo bledu
rts ;powrot do monitora
init
;wylacz silniczek magnetofonu
lda #$3C
sta PACTL
mwa #start DOSVEC ;ustaw DOSVEC na poczatek naszego programu
rts ;powrot do monitora
start
//... (poczatek wlasciwego programu)
//...
end = *
I w zasadzie to działa, ale... po tym jak wykona się rts w procedurze init, atari odgrywa swoją "pieśń startową" czyli słynne "trrrr", która trwa ok. 5 sekund, po czym dopiero następuje skok do mojego programu przez wektor spod DOSVEC. Jeżeli usunę tę instrukcję (rts), to program uruchamia się od razu.
Z tego co pamiętam większość gier i programów wgrywało się z kasety w ten sposób, że nie było przejścia przez fazę "trrrr", tylko gra/program uruchamiał się od razu po wczytaniu. I tu pojawia się pytanie: co się tak naprawdę dzieje podczas "trrrr" i po co w ogóle jest ten dźwięk? Czy mogę bezpiecznie pominąć powrót do monitora, odzyskać bajty ze stosu resetując wskaźnik stosu i przejść do programu od razu?