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.
Zawiera numer błędu, który wystąpił w wykonywanym programie.
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).
Pomocniczy rejestr zmiennoprzecinkowy.
Wartość cechy liczby zmiennoprzecinkowej.
Znak liczby zmiennoprzecinkowej.
Znak cechy liczby zmiennoprzecinkowej.
Flaga (znacznik) pierwszego znaczka.
Liczba cyfr w części ułamkowej liczby
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.
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.
|