Powrót do spisu treści |
WPROWADZENIEInterpreter Atari Basic zajmuje obszar 8 KB pamięci ROM od adresu $A000 (40960) do $BFFF (49151). Jest on umieszczony w przestrzeni adresowej komputera na prawach cartridge'a (zob. "Mapa pamięci Atari XL/XE. Podstawowe procedury systemu operacyjnego"). W przypadku odłączenia go, pojawia się w tym obszarze blok 8 KB pamięci RAM. Ponadto interpreter wykorzystuje do pracy połowę strony zerowej RAM od $80 (128) do $FF (255) oraz obszary stosu kontroli składni $0480-$057D (1152-1405) i bufora wejściowego $0580-$05FF (1408-1535).Program w języku Basic jest zapisywany począwszy od najniższego wolnego adresu pamięci RAM. Adres ten jest przechowywany w rejestrze MEMLO (MEMory LOw address). Przy braku DOS-u lub innego programu zarządzającego rejestr MEMLO zawiera wartość $0700 (1792), w przeciwnym przypadku wskazuje na pierwszy bajt powyżej obszaru zajętego przez ten program. Struktura programu Basica zapisanego w pamięci RAM jest pokazana na rysunku 1. Bufor tokenizacji jest 256-bajtowym buforem wejściowym, w którym przechowywany jest wprowadzony wiersz programu podczas procesu tokenizacji. Proces ten zostanie opisany w dalszej części książki. Tablica nazw zmiennych zawiera zapisane w kodzie ASCII nazwy wszystkich zmiennych użytych w programie. Maksymalna pojemność tablicy wynosi 128 zmiennych. Ponieważ nazwa w Basicu może mieć do 128 znaków, to maksymalna długość tablicy nazw wynosi 16 KB! Poszczególne nazwy nie są od siebie oddzielone, a koniec nazwy jest oznaczony ustawieniem najstarszego bitu w ostatnim znaku nazwy. Dla zmiennych tekstowych ostatnim znakiem nazwy jest zawsze "$", a dla zmiennych tablicowych "(". Tablica wartości zmiennych zawiera informacje dotyczące aktualnej wartości każdej zmiennej. Do zapisania każdej wartości przeznaczone jest osiem bajtów, przy czym wartości zmiennych różnych typów są zapisywane w różny sposób. We wszystkich przypadkach pierwszy bajt oznacza typ zmiennej, a drugi - jej numer w tablicy nazw. Typy zmiennych są oznaczone w tablicy wartości następująco: Dla prostej zmiennej liczbowej pozostałe sześć bajtów zawiera wartość zapisaną w kodzie BCD (w formacie liczby zmiennoprzecinkowej). Bajty 3 i 4 zmiennych indeksowanych (tablicowych i tekstowych) zawierają odległość początku danych zmiennej od początku tablicy zmiennych indeksowanych (zob. niżej). Pozostałe bajty określają wielkość zmiennych. Dla zmiennych tablicowych bajty 5 i 6 zawierają pierwszy wymiar zmiennej zwiększony o jeden (liczba kolumn), a bajty 7 i 8 - drugi wymiar, także zwiększony o jeden (liczba wierszy). Zero oznacza w tym przypadku brak wymiaru (zmienna tablicowa jednowymiarowa). Dla zmiennych tekstowych bajty 5 i 6 zawierają aktualną długość zmiennej, a bajty 7 i 8 - zadeklarowany wymiar zmiennej. Tablica instrukcji zawiera zakodowane w procesie tokenizacji wszystkie wiersze programu oraz wiersze wprowadzone w trybie bezpośrednim. Format zapisu w tej tablicy jest opisany w rozdziale poświęconym kontroli składni. Tablica zmiennych indeksowanych służy do przechowania wszystkich wartości zmiennych tablicowych i tekstowych. Dla każdego znaku zmiennej tekstowej jest przewidziany jeden bajt (znak kodu ATASCII), zaś dla każdego elementu zmiennej tablicowej sześć bajtów (liczba zmiennoprzecinkowa). Stos bieżący służy do przechowywania adresów powrotnych dla instrukcji GOSUB i FOR oraz wartości niezbędnych do prawidłowego przebiegu pętli FOR/NEXT. Informacja dla instrukcji GOSUB zajmuje cztery bajty. Pierwszy - równy $00 - jest symbolem GOSUB, w dwóch następnych bajtach zapisany jest numer wiersza programu zawierającego instrukcję GOSUB, a w ostatnim bajcie umieszczona jest odległość GOSUB od początku tego wiersza. W przypadku instrukcji FOR na stos zapisywane jest szesnaście bajtów. Pierwsze dwanaście z nich zajmują wartości końca pętli i kroku licznika, obie w formacie liczb zmiennoprzecinkowych (po 6 bajtów). W trzynastym bajcie znajduje się zwiększony o 128 (ustawiony bit 7) numer zmiennej będącej zmienną sterującą pętli. W bajtach 14 i 15 zapisany jest numer wiersza programu zawierającego instrukcję FOR, a w ostatnim bajcie umieszczona jest odległość FOR od początku tego wiersza. Wszystkie wymienione wyżej bloki programu są ruchome, a ich aktualne adresy znajdują się w rejestrach RAM na stronie zerowej. Początek bufora tokenizacji wskazywany jest wektorem LOMEM (LOw MEMory address). Tablica nazw zmiennych rozciąga się od adresu zawartego w rejestrze VNTP (Variable Name Table Pointer) do adresu zawartego w VNTD (Variable Name Table enD). Tablica wartości zmiennych jest wskazywana wektorem VVTP (Variable Value Table Pointer), zaś tablica instrukcji wektorem STMTAB (STateMent TABle). Wektor STARP (STring and ARray table Pointer) wskazuje początek tablicy zmiennych indeksowanych. Adres stosu bieżącego zawarty jest w rejestrze RUNSTK (RUNtime STacK). Koniec obszaru zajętego przez program Basica wskazywany jest przez wektor BMEMHI (Basic MEMory HIgh address). Ponadto znajduje się tu wektor STMCUR (STateMent CURrent address), który wskazuje aktualnie wykonywany wiersz programu Basica, a w przypadku oczekiwania na wprowadzenie danych - początek wiersza trybu bezpośredniego. |