PIERWSZE KROKIPIKI 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
BASIC rezerwuje miejsce w sobie
wiadomym, odpowiednim do tego celu obszarze pamięci, to wykonanie
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
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
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:
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:
Liczba 2 nakazuje wyświetlać tekst
w standardowy sposób. Spróbuj
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
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ę:
i wstaw ją z powrotem na miejsce
(zmienne L i H będą przechowywać
odpowiednio młodszy i starszy bajt
słowa):
Funkcja INT() zwraca część całkowitą wartości wyrażenia, które
stoi wewnątrz nawiasów. Jest to
poszukiwany starszy bajt adresu.
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ę:
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ć:
Janusz B. Wiśniewski
|