MAPA PAMIĘCIRozpoczynamy drukowanie stałego cyklu, który ogólnie można nazwać mapą pamięci. Opracowany został na podstawie książki "Mapping the Atari" oraz wieloletnich doświadczeń w programowaniu w asemblerze 6502 na komputerze Atari 800 XL. Będą tu opisywane wszystkie ważniejsze zmienne systemowe, wektory, i procedury znajdujące się w pamięci małego ATARI. Do niektórych lokacji będą podawane ciekawe przykłady wykorzystania w Basicu, a także w asemblerze. Zastosowano oznaczenia: $ poprzedza liczbę zapisaną w notacji szesnastkowej; % poprzedza liczbę zapisaną w notacji dwójkowej. Najogólniej rzecz biorąc, całą pamięć komputera tworzy 65536 ($10000) komórek ponumerowanych od 0 ($0000) do 65535 ($ffff). W każdej takiej komórce może być zapisany bajt danych. Bajt z kolei składa się z ośmiu bitów (bit jest to podstawowa jednostka Informacji 0 lub 1), co daje nam możliwość zapamiętania liczby od %00000000 do %11111111, lub jak kto woli 0-256 ($00-$ff). Tak więc na określenie ADRESU komórki potrzeba aż dwóch bajtów (256*256=65536). Jeden z tych bajtów - ten bardziej znaczący ("stojący z lewej" jak byśmy to określili przyzwyczajeni do pozycyjnego zapisu liczb) nazywamy starszym, a drugi młodszym. Np.: w adresie 255 ($00ff) bajt starszy = 0 ($00), a młodszy = 255($ff); w adresie 258 ($0102) starszy = 1 ($01), a młodszy = 2 ($02). Na marginesie, wystarczy spojrzeć na sposoby zapisu: szesnastkowy i dziesiętny, by przekonać się, który w tym wypadku jest wygodniejszy! Każdą grupę komórek, której starszy bajt adresu jest ten sam, nazywamy stroną pamięci. Każda strona zajmuje więc 256 kolejnych lokacji pamięci. Starszy bajt adresu określa numer strony. W komputerach ATARI XL/XE przyjęto zasadę, że w pamięci adresy dwubajtowe przechowywane są w kolejności starszeństwa bajtów (młodszy, starszy). Jeszcze mała repetycja na temat bajtu. Kolejne bity są ponumerowane w kolejności: najmniej znaczący jest bit zerowy (ten po prawej stronie w standardowym zapisie), a najbardziej znaczący to bit siódmy. Na przykład w liczbie %00100001 ustawione są bity zerowy (0) i piąty (5). W ATARI serii 130 (i więcej) XL pamięci jest trochę więcej, jednak z punktu widzenia mikroprocesora nic się nie zmienia. Dodatkowa pamięć zorganizowana jest w tzw. banki, które za pomocą układów elektronicznych mogą być włączane kolejno (według żądania) zawsze w ten sam obszar pamięci ($0000-$ffff). Szczegóły techniczne są teraz nieważne, zostaną omówione, gdy dojdziemy do opisu komórki odpowiadającej za przełączanie banków. Najogólniej pamięć można podzielić na RAM (pamięć zapisywalna) i ROM (pamięć stała). Jak same nazwy wskazują zawartość RAM-u może być dowolnie zmieniana, natomiast dane w ROM-ie zapisane są na stałe. RAM nazywamy też pamięcią operacyjną, gdyż w niej właśnie wykonują się nasze programy, trzymane są dane itp. W ROM-ie natomiast umieszczony jest system operacyjny komputera, rejestry WE/WY, słowem wszystkie niezbędne procedury potrzebne, by komputer w momencie włączenia go do prądu "ożył". Parę słówek:
Lokacje $00-$7f (0-127) używane są przez system operacyjny (OS). Lokacje $80-$ff (128-255) zarezerwowane są dla BASIC-u jeżeli jest on włączony.
W praktyce nie spotkałem się z przypadkiem, by były kiedykolwiek zmieniane lub ich zmiana wpływała na pracę systemu.
Wektor inicjalizacji kasetowej. OS skacze przez ten wektor po udanym procesie BOOT z kasety.
1. Wskaźnik testu pamięci używany w czasie procedury startowej (przy włączaniu komputera). 2. Używane także do przechowywania adresu pod jaki wczytują się dane w procesie BOOT z dysku.
Pomocniczy rejestr używany do określania wielkości pamięci RAM w czasie procedury startowej. Zawiera 1 gdy jest włączony basic lub cartridge A.
Rejestr procedury testującej RAM. Zawiera 1 gdy włożony jest cartridge B.
Flaga "ciepłego startu". 0 oznacza proces startowy; $ff (255) oznacza, że został naciśnięty RESET.
Flaga powodzenia procedury BOOT. 1. udał się BOOT z dysku; 2. udał się BOOT z kasety.
Wektor powrotu do załadowanego oprogramowania Przez ten adres skacze BASIC po komendzie DOS, tudzież porządnie napisane programy wracają do DOS-u (COS-u) też skacząc przez ten wektor
Wektor inicjalizacji dyskowej. Jeżeli wykonany był BOOT dyskowy, to naciśnięcie RESET-u spowoduje skok przez ten adres.
Wskaźnik końca programu w BASICU. Komórki o adresach 08-01 są zerowane tylko przy "zimnym starcie"
Maska przerwań układu POKEY. Cień lokacji $d20e (53774). Ustawione poszczególne bity oznaczają:
Flaga oznaczająca, czy został naciśnięty klawisz BREAK. Zero oznacza; naciśnięcie, każda inna wartość (standardowo $80) wskazuje, że nie był naciskany. Uwaga: gdy używamy tej komórki do obsługi klawisza BREAK musimy ją sami kasować po wykryciu naciśnięcia.
Wewnętrzny zegar czasu rzeczywistego. Przy włączaniu komputera jest on zerowany, tak jak i przy ciepłym starcie. Zawartość komórki $0014 (20) jest zwiększana co 1/50 sekundy przez standardowe przerwanie synchronizacji pionowej. Gdy osiągnie 0 (256) zwiększana jest zawartość $0013 (19). Analogicznie po 256 zwiększeniach komórki 19, do 18 dodawane jest 1.
Pomocniczy wskaźnik adresu aktualnego bufora dyskowego.
Numer komendy CIO. Używany przez CIO do wyszukiwania właściwego rozkazu w tabeli komend konkretnego handlera.
Wektor programu dyskowego zarządzania plikami. Nie wszystkie DOS-y go używają.
Wektor miejsca pamięci zarezerwowanego dla dyskowych programów użytkowych. Nie wszystkie DOS-y go używają.
Timeout drukarki. Standardowo ustawiany na wartość 30 (ok. 32 sekund). Jeżeli po tym czasie drukarka nie odpowie, to występuje bląd 138.
Wskaźnik aktualnej pozycji (bajtu) w buforze drukarki. Przyjmuje wartości od zera do wartości komórki $1e (30).
Rozmiar bufora drukarki. Standardowo ustawiany na 40.
Pomocniczy rejestr handlera drukarki. cdn.
|