Tajemnice ATARI

PIERWSZE KROKI

PIKI POKI


    Pamięć komputera ATARI składa się z niewielkich "cegiełek", zwanych bajtami. Pojedynczy bajt ma taki akurat rozmiar, by zmieścić liczbę z zakresu 0..255 (lub jeden znak). To niewiele. Dwa bajty traktowane jako jedna liczba pozwalają na zapisanie wartości od 0 do 65535. To umożliwia już policzenie wszystkich bajtów dostępnych w komputerze (dla uproszczenia można na chwilę zapomnieć o dodatkowej pamięci w komputerach typu 130XE). Jest ich bowiem właśnie 65536. Pamiętajcie, że numeracja zaczyna się od 0. Bajty ułożone są po kolei i posługując się takim numerem (nazywanym przez wtajemniczonych adresem) można się zawsze odwołać do konkretnego bajtu.

   Używając w BASIC-u zmiennych uzyskuje się dostęp do pewnych obszarów pamięci specjalnie wydzielonych w tym celu, lecz nie sposób sięgnąć do dowolnego jej fragmentu. Dopiero funkcja

PEEK(adres) pozwala na obejrzenie każdego bąjtu. To umożliwia pełniejsze korzystanie z możliwości komputera. Dla przykładu: pod adresem 53279 zapisany jest stan klawiszy "konsoli" (czyli bloku klawiszy OPTION, SELECT, START). Normalnie znajduje się tam liczba 7, co oznacza, że żaden z tych klawiszy nie jest naciśnięty. Naciśnięcie któregoś z nich zmniejsza tę wartość. Przeprowadź test:

10 PRINT "Test konsoli..."
20 I=PEEK(53279)
30 IF I=7 THEN 20
40 PRINT "Stan klawiszy: ";I
RUN
   Przekonasz się bez trudu, że OPTION zmniejsza wspomnianą liczbę o 4, SELECT o 2, zaś START - o 1. W programie może to być wykorzystane do wykonania jakiejś akcji np. po naciśnięciu klawisza START. Rozkaz NEW służy do całkowitego wymazania z pamięci programu w BASIC-u.

10 PRINT "Naci$nij START"
20 IF PEEK(53279)<>6 THEN 20
30 NEW
RUN
   Innym ciekawym miejscem w naszym komputerze jest bajt nr 753, który wskazuje, czy któryś z klawiszy podstawowej klawiatury jest aktualnie naciśnięty. Liczba różna od 0 oznacza naciśnięty klawisz. Przeprowadź prostą próbę:

10 IF PEEK(753) THEN 30
20 SETCOLOR 4,0,0:GOTO 10
30 SETCOLOR 4,4,4:GOTO 10
RUN
   Naciskanie dowolnego klawisza powoduje niezwłoczną zmianę koloru obrzeża ekranu.

   Są takie miejsca w pamięci komputera, gdzie pewne wartości zapisywane są przy użyciu dwóch kolejnych bajtów. Taką liczbę nazywa się słowem lub adresem. Mówimy wtedy o młodszym (mniej znaczącym) i starszym (bardziej znaczącym) bajcie adresu (słowa). Młodszy bajt poprzedza przeważnie w pamięci swego starszego kolegę. Jednostki starszego bajtu są 256 razy więcej warte, niż jednostki młodszego. Aby więc poznać liczbę zakodowaną w obu bajtach słowa, trzeba dodać wartość młodszego bajtu do wartości starszego pomnożonej przez 256. Na przykład pod adresem 128 leży (jak się dowiadujemy z Mapy Pamięci) słowo LOMEM, które określa początek obszaru pamięci zajmowanego przez program w BASIC-u, a więc

NEW
10 PRINT "Program siedzi od ";
20 PRINT PEEK(128)+256*PEEK(129)
RUN
pozwoli poznać adres początkowy obszaru wykorzystywanego przez BASIC. Dla BASIC-a uruchomionego bez DOS-u (COS-u) jest to liczba 1792. Inna wartość, na ogół większa, świadczy o obecności jakiegoś systemu, który zajmuje część pamięci.

   Aby w pełni uczestniczyć w życiu prywatnym komputera, warto poznać jeszcze jeden rozkaz, odwrotny do funkcji PEEK:

POKE adres, wartość

   Umieszcza on pod wskazanym adresem podaną przez nas wartość liczbową z zakresu od 0 do 255 (jeden bajt). Od razu jednak pragnę ostrzec ambitnych eksperymentatorów, że nierozważne użycie tego rozkazu szybko się kończy zawieszeniem komputera. O ile bowiem w przypadku

LET X=l30
   BASIC rezerwuje miejsce w sobie wiadomym, odpowiednim do tego celu obszarze pamięci, to wykonanie
POKE 130,42
spowoduje na ogół katastrofę, ponieważ BASIC wykonuje rozkaz bez zastanowienia, czy po tym komputer będzie jeszcze żył. Dlatego przed rozpoczęciem zabawy dobrze jest zapamiętać na dysku (kasecie?) program. Jeżeli jakiś siedzi w komputerze, a do testów używać komórek dobrze znanych, opisanych w Mapie Pamięci. Dobrym przykładem jest

POKE 756,204
   Pod adresem 756 siedzi starszy bajt (młodszy jest zawsze zerem) adresu generatora znaków. Generator znaków jest 1024-bajtowym zestawem danych, które decydują o wyglądzie znaków wyświetlanych na ekranie. Pamięć stała w naszym komputerze zawiera dwa takie zestawy. Jeden z nich (podstawowy) mieści się pod adresem 57344, drugi zaś (zwany międzynarodowym) - pod 52224. Widniejący powyżej rozkaz uaktywnia właśnie ten drugi generator. Różni się on od podstawowego w zakresie znaków semigraficznych (uzyskiwanych przez naciśnięcie klawisza literowego wespół z klawiszem CONTROL). Zwykle, gdy naciskamy CONTROL i R, to pojawia się na ekranie pozioma kreska, a przy CONTROL i S - krzyżyk (itd.). Generator międzynarodowy ma tutaj odmienne znaki: symbole liter specyficznych dla różnych nacji. Niestety, próżno by tu szukać polskich liter z "ogonkami". A szkoda.

   Co zrobić, żeby przywrócić "klasyczny" wygląd znaków? I jaki związek ma liczba 204 z 52224? Jak pamiętamy, adresy zapisuje się przy wykorzystaniu dwóch bajtów, gdzie starszy ma wagę 256, co oznacza, że każda jednostka starszego bajtu jest równa 256 jednostkom młodszego. Aby więc obliczyć starszy bajt adresu 52224, piszemy

PRINT 52224/256
   Stąd bierze się właśnie owa tajemnicza liczba 204. Podobnie można ustalić, co wpisać do komórki 756 dla przywrócenia znakom normalnego wyglądu:

POKE 756,57344/256
   Korzystamy tu z faktu, że wszędzie, gdzie BASIC wymaga liczby, można wpisać wyrażenie arytmetyczne. Nie musisz więc nawet znać wartości, którą umieszczasz w pamięci, wystarczy, że ją prawidłowo obliczysz.

   Inną komórką, polecaną do eksperymentowania jest bajt nr 755, który decyduje o sposobie wyświetlania znaków. Na wstępie sprawdź, co tam zwykle siedzi:

PRINT PEEK(755)
   Liczba 2 nakazuje wyświetlać tekst w standardowy sposób. Spróbuj

POKE 755,1
   Teraz komputer NIE wyświetla tekstu, który dotąd był przedstawiany w inwersji (takie napisy uzyskuje się po jednokrotnym naciśnięciu klawisza LOGO, opisanego dwubarwnym kwadratem, w prawym dolnym rogu klawiatury). Skutkiem tego znikł także kursor! Napisz spokojnie

POKE 755,2
aby przywrócić normalny tryb wyświetlania. Ciekawy efekt powoduje wpisanie tu liczby 6. Idea poniższego programu została zaczerpnięta z filmu Alfreda Hitchcocka pt. "Ptaki".

10 GRAPHICS 0:POKE 752,1
20 POSITION RND(0)*38,RND(0)*23
30 IF RND(0)>0.9 THEN PRINT "^";
40 POKE 755,8-PEEK(755)
50 GOTO 20^1
   Komórka o adresie 752 odpowiada za wyświetlanie kursora: wartość różna od zera oznacza niewidoczny kursor. Przeanalizuj samodzielnie metodę, która sprawia, że pod adres 755 wstawiane są na przemian liczby 2 i 6. Wyrażenie 20^1 (20 do potęgi 1) oznacza tyle samo co 20, ale z uwagi na niesłychaną prędkość potęgowania wprowadza prostym sposobem niezbędne opóźnienie. Spróbuj, jeżeli chcesz, pominąć to ^1 porównaj efekt.

   Nieco bardziej skomplikowane jest umieszczanie danych w słowach, trzeba bowiem rozdzielić dużą liczbę na dwa sąsiednie bajty. Tę liczbę dobrze jest mieć schowaną w jakiejś zmiennej, np.:

10 GRAPHICS 0
20 LIST
30 X=PEEK(39972)+256*PEEK(39973)
   W tym miejscu zmienna X będzie zawierać adres pamięci obrazu (pobrany bezpośrednio z programu ANTIC-u). Rozkaz GRAPHICS służy dla bezpieczeństwa, by wymusić standardowe ustawienie ekranu, zaś LIST wyświetla nieco tekstu, by efekt programu był lepiej widoczny. Teraz dla zabawy zwiększ tę liczbę:

40 X=X+1
i wstaw ją z powrotem na miejsce (zmienne L i H będą przechowywać odpowiednio młodszy i starszy bajt słowa):

50 H=INT(X/256)
   Funkcja INT() zwraca część całkowitą wartości wyrażenia, które stoi wewnątrz nawiasów. Jest to poszukiwany starszy bajt adresu.

60 L=X-256*H
   Reszta pozostała z dzielenia, to właśnie wartość młodszego bajtu. Pozostaje tylko wstawić:

70 POKE 39972,L:POKE 39973,H
i ewentualnie powtórzyć całą zabawę:

80 GOTO 40
   Gotowy program wykonaj rozkazem RUN. Obraz odpłynie w nieznane. Aby przerwać eksperyment, trzeba nacisnąć BREAK, a potem "w ciemno", bo na ogół nie widać właściwego ekranu, napisać:

GRAPHICS 0


Janusz B. Wiśniewski

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

Pixel 2001