Tajemnice ATARI

MAPA PAMIĘCI

    Lokacje 00128 do 00202 ($0092-$00ca) zarezerwowane są do użytku ROM-u Basic-a (te od 128 do 145 opisaliśmy miesiąc temu). Lokacje 00176 do 00207 ($00b0-$00cf) zarezerwowane są przez Assembler Editor, należy o tym pamiętać podczas użytkowania tegoż, gdyż korzystanie z tych lokacji pamięci może spowodować zawieszenie pracy systemu operacyjnego.

   Oto znaczenie niektórych komórek pamięci używanych przez ROM Basic-a.

$00ba,$00bb 00186,00187 STOPLN
   Numer wiersza, w którym zostało przerwane wykonywanie programu w Basic-u, czy to wskutek wciśnięcia klawisza BREAK, ze względu na wystąpienie błędu, z powodu wystąpienia instrukcji STOP czy też aktywnej instrukcji TRAP. Wywołanie instrukcji GOTO PEEK(186)+ 256*PEEK(187) spowoduje uruchomienie programu od miejsca, w którym został przerwany.

$00c3 00195 ERRSAVE
   Zawiera numer błędu, który wystąpił w wykonywanym programie.

$00c9 00201 PTABW
   Komórka ta określa liczbę znaków, o jaką odległe są rzędy napisów wyświetlanych przy pomocy rozkazu PRINT, jeśli jego argumenty oddziela się przecinkami. Domyślna wartość 10 oznacza umieszczanie kolejnych napisów co 10 znaków. Dotyczy to oczywiście początków napisów, bo ich końce znajdą się w miejscu zależnym od długości napisu. Zdarza się więc, że jeden napis przekracza kolumnę, gdzie powinien znaleźć się następny. Jest ona wtedy po prostu pomijana (nie można wyświetlić jednego tekstu na drugim). PTABW nie ma natomiast nic wspólnego z klawiszem TAB, którego działaniem rządzi tablica TABMAP (komórki od $2a3 do $2b1).

$00cb-$00d1 00203-00209 .....
   Nie używane ani przez Basic, ani przez system operacyjny lokacje pamięci na stronie zerowej. Mogą one być swobodnie używane przez programy użytkownika bez obawy ingerencji w ich zawartość systemu operacyjnego. Znaczenie tych komórek: wiele rozkazów mikroprocesora odnosi się do adresowania tylko strony zerowej, programy korzystające z tych lokacji są krótsze i działają szybciej (rozkaz zajmuje tylko dwa bajty, bo starszy bajt jest równy zero).

$00d2,$00d3 00210,00211 .....
   Komórki pamięci zarezerwowane do użytku przez Basic lub inny cartridge.

   Lokacje pamięci od 00212 do 00255 ($00d4-$00ff) używane są przez procedury operacji zmiennoprzecinkowych. Znajdują się one w ROM-ie, zajmują lokacje od 55296 do 57333 ($d800-$e031). Jeżeli procedury operacji zmiennoprzecinkowych nie są używane to komórki pamięci na stronie zerowej (00212 do 00255 ($00d4-$00ff)) są w gestiiużytkownika. Liczby w postaci zmiennoprzecinkowej zapisywane są w sześciu bajtach. Pierwszy z nich jest cechą zapisaną w kodzie BCD (gdzie jeśli 7 bit jest zerem to liczba jest dodatnia, gdy jedynką - ujemna). Pozostałe bajty stanowią mantysę.

$00d4-$00d9 00212-00217 FRO
   Rejestr zmiennoprzecinkowy nr 0. Zawartości komórek 00212 i 00213 ($00d4,$00d5) stanowią dwubajtową wartość w postaci szesnastkowej z zakresu od O do 65535 ($0000-$ffff) zwracaną programowi w Basic-u (młodszy bajt zawiera 00212 ($00d4), starszy 00213 ($00d5)). Jeżeli chce się użyć 16 bitowej wartości w postaci zmiennoprzecinkowej, powinno się te dwa bajty załadować do pierwszych dwóch komórek FRO, a następnie wykonać JSR 55722 ($d9aa), gdzie nastąpi konwersja liczby całkowitej na jej postać zmiennoprzecinkową. Wynik zostanie zapisany we FRO.

$00da-$00df 00218-00223 FRE
   Dodatkowy rejestr zmiennoprzecinkowy (prawdopodobnie).

$00e0-$00e5 00224-00229 FR1
   Rejestr zmiennoprzecinkowy nr 1. Jego długość jest równa 6 bajtów, ich znaczenie jest takie samo jak w przypadku rejestru FRO (lokacje 00212-00217 ($00d4-$00d9)). Procedury obsługi operacji zmiennoprzecinkowych często wymieniają zawartości rejestrów FRO i FR1 oraz używają obydwu do operacji arytmetycznych.

$00e6-$00eb 00230-00235 FR2
   Rejestr zmiennoprzecinkowy nr 2. Znaczenie analogiczne do rejestrów FRO i FR1 (powyżej).

$00ec 00236 FRX
   Pomocniczy rejestr zmiennoprzecinkowy.

$00ed 00237 EEXP
   Wartość cechy liczby zmiennoprzecinkowej.

$00ee 00238 NSIGN
   Znak liczby zmiennoprzecinkowej.

$00ef 00239 ESIGN
   Znak cechy liczby zmiennoprzecinkowej.

$00f0 00240 FCHRFLG
   Flaga (znacznik) pierwszego znaczka.

$00f1 00241 DIGRT
   Liczba cyfr w części ułamkowej liczby

$00f2 00242 CIX
   Zawiera wskaźnik początku zapisu liczby w wejściowym buforze tekstowym, którego adres jest zapisany w INBUFF (poniżej).

$00f3,$00f4 00243,00244 INBUFF
   Komórki te są wskaźnikiem pobieranego bufora tekstowego. Linia programu wprowadzanego przez użytkownika zostaje zamieniona z kodu ATASCII na postać zmienno-przecinkową. Rezultat tej operacji jest zapisywany w buforze umieszczonym w lokacjach od 01408 do 01535 ($0580-$05ff).

$00f5-$00fa 00245-00250 ZTEMP1/2/3
   Tymczasowy rejestr operacji zmiennoprzecinkowych.

$00fb 00251 RADFLG
   Komórka wskazuje na jednostki wykonywania operacji trygonometrycznych. Jeżeli jest równa zero to wszystkie funkcje trygonomeryczne będą wykonywane w radianach, jeżeli równa jest 6 - to w stopniach. Komenda NEW Basic-a lub RESET ustawiają komórkę RADFLG w tryb radianowy (wartość zero). Zwana jest również DEGFLG.

$00fc,$00fd 00252,00253 FLPTR
   Wskaźnik rejestru operacji zmiennoprzecinkowych. Używany do wskazywania liczb umiejscowionych poza standardowymi rejestrami.

$00fe,$00ff 00254,00255 FPTR2
   Znaczenie podobne do FLPTR (powyżej).

   Tak przedstawia się zawartość zerowej strony pamięci. Strona pierwsza jest zajęta przez stos. Są to lokacje pamięci od 256 do 511 ($100-$1ff). Strukturę stosu i jego działanie jest opisywane bardzo obrazowym porównaniem ze stosem książek. Bajt, który został położony ostatni na stos jest z niego pobierany jako pierwszy. Instrukcje JSR, PHA i PHP języka maszynowego powodują zapis na stosie, instrukcje RTS, PLA, PLP i RTI pobierają zeń bajty. Instrukcja skoku do podprogramu (JSR) powoduje położenie na stosie dwubajtowego adresu powrotu z wywołanej procedury w kolejności starszy bajt (MSB), młodszy bajt (LSB). Stos wzrasta w kierunku adresów mniejszych, tzn. położenie na stos kolejnego bajtu spowoduje jego zapamiętanie w komórce pamięci o adresie o jeden mniejszym od adresu zapamiętania ostatniego bajtu. Poziom zapełnienia stosu opisuje rejestr mikroprocesora S, którego wartość maleje wraz ze wzrostem zapełnienia stosu. Wartość S=255 ($ff) oznacza stos pusty, gdy S=0 to stos jest pełny. Istnieje możliwość bezpośredniej ingerencji w poziom wypełnienia stosu, dzieje się to poprzez zmianę wartości rejestru S, którą umożliwia instrukcja TXS języka maszynowego. Przykładowo instrukcje LDX #$ff TXS spowodują poinformowanie mikroprocesora, że stos jest pusty. Podczas operacji na stosie może wystąpić niebezpieczny stan jego przepełnienia. Polega on na dalszym kładzeniu na stosie bajtów pomimo, że jest on już pełny (S=0). Powoduje to zmniejszenie wartości rejestru S (S=255 ($ff)) czyli wskazanie, że stos jest pusty. Jest to stan destabilizujący pracę programu (bo nie można odtworzyć wszystkich wartości zapamiętanych na stosie), należy się go zdecydowanie wystrzegać. Inicjalizacja systemu lub naciśnięcie klawisza RESET powoduje wyzerowanie stosu (S=255 ($ff)). Zwykle stos jest zapełniony tylko częściowo, osobiście nie spotkałem się z przypadkiem większego zapełnienia stosu niż do połowy. Poniżej zamieszczony jest program umożliwiający podglądnięcie zawartości stosu. Naciśnięcie klawisza ESC spowoduje opuszczenie programu i powrót do programu nadrzędnego. Program napisany w asemblerze:

       ORG $600
       LDY #0
NEXT   LDA $100,Y
       STA ($58),Y
       INY
       BNE NEXT
* Koniec wypisywania stosu
       LDA $2FC
       CMP #$lC
* Czy naciśnięto klawisz ESC
       BNE NEXT
       DEY 
       STY $2FC
* Instrukcja PLA wymagana jest tylko
* przy wywoływaniu z poziomu języka Basic
       PLA
       RTS
   Program napisany w Basic-u:

10 FOR Q=1536 TO 1554
20 READ A:POKE Q,A
30 NEXT Q
40 I=USR(1536)
50 DATA 160,0,185,0,1,145,88,200,208,248,
173,252,2,201,28,208,241,104,96
   Wyświetlane znaczki są zawartością stosu wypisywaną w wewnętrznym kodzie pamięci ekranu. Bardzo szybko zmieniające się wartości świadczą o działalności przerwań. W górnej części ekranu wyświetlany jest cały stos, tylko jego mała część jest zajęta. Z tego powodu niektóre krótkie programy korzystają z lokacji pamięci zbliżonych do szczytu stosu.

   Lokacje pamięci od 512 do 1151 ($200-$47f) są używane przez system operacyjny jako zmienne robocze, tablice i bufory danych. W tych rejonach pamięci lokacje od 512 do 553 ($200-$229) używane są jako wektory przerwań, a lokacje od 554 do 623 ($22a-26f) jako zmienne systemowe ogólnego zastosowania.

   Rozróżniamy dwa rodzaje przerwań: Przerwanie niema-skowalne (ang. Non-Maskable Interrupt (NMI)) uaktywniane przez układ ANTIC oraz przerwanie maskowalne (ang. Interrupt ReOuest (IRQ)) wywoływane przez układy POKEY i PIA. Do przerwań NMI zalicza się przerwanie VBLANK (opisują go lokacje od 546 do 549 ($222-$225)), przerwanie Display Listy (DLI) oraz przerwanie wywołane przez naciśnięcie klawisza RESET. Przerwania IRQ są uaktywniane przez urządzenia zewnętrzne, przerwanie magistrali danych, przerwanie klawisza BREAK i pozostałych klawiszy klawiatury komputera oraz przez przerwanie wywołane instrukcją BRK mikroprocesora 6502. Umieszczenie wektorów przerwań w pamięci RAM umożliwia ich zamianę na wektory wskazujące procedury użytkownika. Nie jest możliwa zmiana wektora obsługi przerwania wywołanego przez naciśnięcie klawisza RESET ze względu na jego umieszczenie w pamięci ROM (lokacje 65532 (LSB) i 65533 (MSB) ($fffc i $fffd)). Zwykle wektor ten jest ustawiony na wartość 49834 ($c2aa), tam zaczyna się obsługa przerwania RESET-u. Brak możliwości zmiany tego wektora nie oznacza bynajmniej bezbronności programów po naciśnięciu klawisza RESET (istnieją przecież programy "RESEToodporne"). Należy pamiętać, aby procedury pisane przez użytkownika obsługiwane przez przerwania były jak najkrótsze, gdyż zwalniają one działanie właściwego programu, a w skrajnych przypadkach mogą spowodować nawet poważne usterki w działaniu systemu operacyjnego.



Powrót na start | Powrót do spisu treści | Powrót na stronę główną

Pixel 2001