Służą mu do tego celu komórki o adresach 43, 44, 45, 46, 55, 56 ($, 2B, 2C, 2D, 2E, 37 i 38). Tak naprawdę to system operacyjny zbiera dane ze znacznie większej ich ilości, ale wszystkie powyżej wymienione mają kluczowe znaczenie przy rozpoznawaniu konfiguracji. Poniżej zamieszczamy ich skrótowy opis:
43—44 ($2B—2C) — określają początek pamięci RAM przeznaczonej dla użytkownika. Od adresu (zawartego w tych komórkach) będzie przechowywany Twój program.
45—46 ($2D—2E) — określają adres pierwszej komórki pamięci po zakończeniu Twojego programu (nie mylić z końcem pamięci!) oraz początek obszaru pamięci przeznaczonego dla zmiennych.
55—56 ($37—38) — zawierają najwyższy nieprzekraczalny adres pamięci, w której działa interpreter języka BASIC.
Możliwość regulacji obszaru pamięci, w której działa BASIC jest dla nas bardzo przydatna w wielu przypadkach. Wyobraźmy sobie bardzo długi program, zawierający np. wielką ilość danych np. dla sprite'ów. Wykorzystaliśmy już cały dodatkowy obszar pamięci od adresu 49152 do 53247 ($C000 — CFFF) i potrzebujemy jeszcze 300 bajtów, ale z gwarancją niezakłócania tego obszaru przez np. BASIC. Wystarczy wtedy tylko obniżyć górną granicę o rzeczone 300 bajtów.
Liczby zawarte w opisywanych komórkach zapisane są w standardowej formie — niższy bajt i wyższy bajt. Odczytać je można za pomocą funkcji PEEK (X). Jak jednak wylicza się z nich adres? Bardzo prosto. W tym celu należy pomnożyć wartość wyższego bajtu przez 256 i do otrzymanego wyniku dodać wartość niższego bajtu.
PRINT PEEK (46) 256 + PEEK (45)
2051
READY.
Komórki o adresach 43, 45 i 55 zawierają zawsze młodszy bajt zaś 44, 46 i 56 starszy. Dla wprawy możesz spróbować wpisać jakiś krótki program i sprawdzić do której komórki w pamięci on sięga. Wystarczy jeżeli po jego wpisaniu napiszesz:
PRINT PEEK (43) + PEEK (44) * 256: REM POCZATEK PRINT PEEK (45) + PEEK (46) * 256: REM KONIEC PROGRAMU + 1 PRINT PEEK (55) + PEEK (56) * 256: REM KONIEC PAMIECI
Jeżeli chcesz poeksperymentować to usuń teraz z programu którąś linię i wykonaj powyższą operację ponownie; zobaczysz wtedy jak obszar pamięci zajmowany przez Twój program zmniejsza się.
Czy to już wszystko? Oczywiście, że nie. Nie wolno nam przecież zapominać o zmiennych, których wartości komputer musi także gdzieś przechowywać. Wydzielonym do tego miejscem jest obszar pamięci zaczynający się bezpośrednio po końcu Twojego programu + 1. Innymi słowy, jeżeli obliczony z komórek adres wynosi np. 10167 oznacza to, że od tego adresu zaczyna się Twój obszar dla zmiennych, podczas gdy program kończy się w komórce 10166. Podczas wprowadzania poprawek (np. usuwanie czy wpisywanie linii programu) system operacyjny w ogóle się tym obszarem nie zajmuje; rozkaz RUN jest zawsze poprzedzony wykonaniem procedury CLR kasującej wartości wszystkich zadeklarowanych zmiennych.
Sprawa byłaby prosta, gdyby takie ułożenie obszaru pamięci dla zmiennych dotyczyło wszystkich ich rodzajów. Niestety (ku utrapieniu!) o ile zmienne numeryczne są przechowywane właśnie w ten sposób — czyli zaraz po końcu programu — o tyle zmienne łańcuchowe (np. OK$ = „BAJTEK”) przechowywane są w sposób zgoła odmienny. Wydzielony dla nich obszar zaczyna się zawsze od adresu określonego w komórkach 55 i 56 i zbiega w DÓŁ w miarę deklarowania następnych zmiennych tego typu: Na pewno podczas przegrywania programów na inną kasetę zdarzył Ci się kiedyś taki zabawny przypadek: napisałeś SAVE „nazwa” bądź ←S „nazwa” i... komputer nagle zasygnalizował Ci błąd braku pamięci!
?OUT OF MEMORY ERROR
READY.
Jeżeli byłeś uparty to już po paru próbach odkryłeś sposób na Twój krnąbrny program — wystarczyło go zapisać bez tytułu. Tym razem odpowiedź komputera brzmiała prawidłowo:
PRESS RECORD AND PLAY ON TAPE
Co się właściwie stało?
Otóż tytuł każdego programu jest traktowany jako specyficzna zmienna łańcuchowa, która jest przechowywana w obszarze pamięci przeznaczonym dla tego typu zmiennych. Błąd braku wolnej pamięci sygnalizowany był prawidłowo, gdyż widocznie przepisywany program nie pozostawił już miejsca w pamięci na wpisanie jego tytułu. Innymi słowy konfiguracja pamięci wyglądała następująco:
Czasami wystarczy tylko zredukowanie ilości znaków w tytule, czasami zaś program nie da się przepisać w żaden sposób. Warto także zaznaczyć, że wpisanie programu bez tytułu możliwe jest jedynie na taśmie, gdyż system operacyjny dysku w żaden sposób nie pozwoli na wpisanie na dyskietkę programu pozbawionego tytułu. Spróbujmy doświadczalnie zbadać zapis z tytułem i bez niego. W tym celu musimy się posłużyć małym oszustwem, gdyż wpisywanie tak długiego programu byłoby nonsensem; ponieważ już wiesz, które komórki decydują o końcu programu, możesz ich użyć do podstępnego okłamywania komputera:
POKE 43,1: POKE 44,8: REM USTAWIANIE POCZĄTKU PAMIĘCI POKE 44,255: POKE 46,169: REM ADRES KOŃCA PROGRAMU – 40959 CLR: REM NIEZBĘDNE DO USTAWIENIA POCZĄTKÓW OBSZARÓW DLA ZMIENNYCH
Teraz — po upewnieniu się, że kaseta w magnetofonie może być skasowana — spróbuj zapisać swój „program” na taśmie:
SAVE "TEST 1" (lub ←S "TEST 1") ?OUT OF MEMORY ERROR READY.
Widzisz? Nie ma już miejsca w pamięci, aby Twój „tytuł” zapisać. Spróbujmy więc go odrzucić:
SAVE (lub ←S) PRESS RECORD AND PLAY ON TAPE
Tym razem komputer nie sygnalizuje już błędu ...
Klaudiusz Dybowski



