Tajemnice ATARI

MAPA PAMIĘCI



750-751, $02ee-$02ef CBAUDL/H
    W tych komórkach pamięci znajduje się informacja o prędkości transmisji danych do/z magnetofonu zapisana w naturalnym dla ATARI XL/XE formacie, czyli jako młodszy i starszy bajt liczby szesnastobitowej. System wpisuje tu wartość 1484 ($05cc), która reprezentuje standardową prędkość 600 bodów, czyli bitów na sekundę. Podczas wczytywania SIO dokonuje korekty prędkości transmisji, biorąc poprawkę na rozciągnięcie taśmy, czy też nierównomierność pracy silnika magnetofonu i wpisuje tutaj prawdziwe wartości. Podczas tej korekcji SIO korzysta z tego, że każdy rekord na taśmie poprzedzony jest nagłówkiem, zawierającym naprzemienny ciąg bitów 0 i 1.

    Posiadaczom XLF-a proponuję obejrzenie zawartości komórek CBAUDL/H bezpośrednio po włączeniu komputera i po wykonaniu np. odczytu dowolnego programu z kasety. Zauważycie, że o ile w przypadku prawidłowego odczytania pliku kasetowego wartości w CBAUDL/H niewiele różnią się od domyślnych (wpisywanych przez system), to przy błędnej transmisji różnica jest znacznie większa.

752, $02f0 CRSINH
    Znacznik widoczności kursora. Kursor jest widoczny, kiedy znajduje się tutaj zero. Dowolna inna liczba powoduje ukrycie go, a więc wpisując np. POKE 752, 1 możemy usunąć z ekranu kursor. Pojawi się ponownie, jeśli naciśniemy RESET, Break lub wykonamy np. komendę OPEN dla edytora, czy też ekranu.

    Kiedy chcemy użyć tej możliwości w programie, musimy pamiętać, że kursor znika dopiero po wykonaniu dowolnego ruchu. Proponuję wpisać maleńki programik:
10 POKE 752,1
20 GOTO 20
i uruchomić go. Mimo wpisania jedynki do CRSINH kursor pozostał widoczny. Uzupełnienie programu wierszem:
15 PRINT "RUCH KURSORA"
spowoduje jego zniknięcie. Jeśli chcemy schować kursor nie modyfikując zawartości ekranu, wystarczy zamienić ostatnio wpisany wiersz na taki:
15 PRINT CHR$(31);
   Spowoduje to przesunięcie kursora o jedną pozycję w prawo, a tym samym umożliwi systemowi operacyjnemu schowanie go.

753, $02fl KEYDEL
    Licznik opóźnienia klawiatury. Używany przez system operacyjny do sprawdzania, czy upłynął już odpowiednio długi czas od ostatniego naciśnięcia klawisza. Normalnie ta komórka zawiera zero, zaś w momencie naciśnięcia klawisza pojawia się tu wartość 3, która jest zmniejszana o jeden podczas każdego przerwania VBLANK. Zmniejszanie kończy się w chwili osiągnięcia zera. Klawisz naciśnięty, gdy KEYDEL zawiera liczbę różną od zera jest traktowany jak chwilowe zakłócenie pracy klawiatury.

    I znów posiadacze XLF-a mogą rzecz całą obejrzeć dość dokładnie. Normalnie trudno byłoby zauważyć, trwające 3/50 sekundy zmiany zawartości KEYDEL, ale wglądownica XLF-a pozwala wyraźnie zaobserwować cały proces.

754, $02f2 CH1
    Ta komórka pamięci zawiera kod poprzednio wciśniętego klawisza, przekazywany tutaj z CH (764, $02fc). Jeśli kod aktualnie wciśniętego klawisza jest taki sam, jak ten zawarty w CH1, oznacza to, że naciśnięty jest ciągle ten sam klawisz i jest akceptowany tylko wtedy, kiedy upłynął już odpowiedni czas od poprzedniego naciśnięcia.

755, $02f3 CHACT
    Liczba zawarta w tej komórce określa sposób wyświetlania znaków o kodach większych od 127, czyli tych, które mają ustawiony siódmy bit. Zazwyczaj takie znaki wyświetlane są w inwersie - oznacza to, że mają zamienione kolory punktów i tła. Warto zauważyć, że kursor ekranowy zazwyczaj przyjmuje postać znaku o kodzie większym od 127, a więc i jego dotyczy ten fragment. Podczas manipulowania zawartością CHACT warto pamiętać o znaczeniu bitów tego bajtu. Prezentowana poniżej tabelka pokazuje wpływ ustawienia odpowiednich bitów na sposób wyświetlania znaków o kodach większych od 127.

działanie bit 2 bit 1 bit 0
zamiana na spacje x x 1
wyświetlanie w negatywie x 1 x
odwracanie 1 x x

    Bity od 3 do 7 nie wpływają na wygląd tychże znaków.

756, $02f4 CHBAS
    Ta komórka pamięci zawiera starszy bajt adresu generatora znaków. Jest ona cleniem komórki o adresie 54281 ($d409). System operacyjny wpisuje do CHBAS wartość 224, czyli $e0, ponieważ właśnie od adresu $e000 zaczyna się normalnie używany zestaw znaków.

    O ile w trybie graficznym 0 można na ekranie uzyskać wszystkie znaki ATASCII, to np. w trybie l i 2 nie jest to możliwe - mamy do wyboru wielkie litery i cyfry, lub też małe litery i znaki graficzne. Te ostatnie jednak dopiero po wykonaniu POKE 756,226, ponieważ w GR.l i GR.2 używana jest tylko połowa zestawu i zmiana jej następuje dopiero po wspomnianej instrukcji POKE.

    Zestaw znaków ma długość 1024 bajtów, ponieważ każdy ze znaków opisany jest ośmioma bajtami, a znaków w zestawie jest 128 (pozostałe, tzn. te o kodach > 127 są wyświetlane przez ANTIC w zależności od zawartości CHACT). Na pojedynczy znak składa się - jak już wspomniałem - osiem bajtów, których poszczególne bity definiują kształt znaku, np. tak:
      dta b(%00000000)
      dta b(%00011000)
      dta b(%00111100)
      dta b(%01100110)
      dta b(%01100110)
      dta b(%01111110)
      dta b(%01100110)
      dta b(%00000000)
    To co widzicie powyżej, jest definicją kształtu litery "A". Zapisałem ją w konwencji asemblera, ponieważ wtedy lepiej widać, co jest bitem, a co bajtem.

    W bardzo łatwy sposób można zmusić ATARI, aby wyświetlało teksty przy pomocy zaprojektowanego przez nas zestawu znaków. Po zdefiniowaniu wszystkich znaków trzeba umieścić nowy zestaw w pamięci komputera w taki sposób, aby rozpoczynał się on na granicy 1K (np. $8000, $8400 itp.) lub - w niektórych trybach graficznych - na granicy 512B, a następnie poinformować ANTIC o jego położeniu instrukcją POKE 756, < starszy_bajt_adresu >. Od tej pory na ekranie widać całkiem nowe kształty znaków. Oczywiście wciśnięcie RESET spowoduje przywrócenie standardowych wartości.

757-761, $02f5-$02f9 ...
    Nieużywane komórki pamięci.

762, $02fa CHAR
    W tej komórce pamięci znajduje się kod wewnętrzny ostatnio wypisanego lub odczytanego znaku. Rejestr ten nie znajduje praktycznego zastosowania, ponieważ najczęściej można z niego odczytać 128 (kursor widoczny) lub 0 (kursor niewidoczny).

763, $02fb ATACHR
    Tutaj znajduje się kod ATASCII ostatnio wypisanego lub odczytanego znaku. System używa tej komórki podczas konwersji znaku ATASCII na kody wewnętrzne przy operacjach z użyciem CIO.

    Dodatkowo, ta komórka pamięci używana jest do przechowywania koloru linii podczas operacji graficznych, np. rysowania i wypełniania obszaru.

764, $02fc CH
    W tym miejscu znaleźć można kod klawiaturowy ostatnio naciśniętego klawisza, przy czym obowiązuje pewna umowa: liczba 255 oznacza, że nie naciśnięto żadnego klawisza i jednocześnie pozwala procedurom systemu operacyjnego na kolejny odczyt klawiatury. Systemowe procedury obsługi klawiatury, a dokładnie urządzenia "K:" pobierają dane właśnie z CH, wpisują tu 255, informując o odebraniu kolejnego klawisza, a następnie przepisują pobraną stąd wartość do CH1. Jedynym wyjątkiem jest sytuacja, kiedy użytkownik naciśnie klawisze CONTROL i "1" - w takim wypadku kod tej kombinacji nie jest wpisywany do CH, lecz system operacyjny czeka na następne naciśnięcie wspomnianej kombinacji klawiszy, zawieszając wyświetlanie. Wspomnę o tym jeszcze przy okazji omawiania komórki 767 ($02ff).

    Także zastosowany w komputerach ATARI XL/XE mechanizm powtarzania klawiszy wpisuje tutaj kod przetrzymywanego klawisza tak, że program, który odczytuje komórkę 764 traktuje przetrzymywanie klawisza, jak ciąg kolejno po sobie następujących, szybkich jego naciśnięć.

    Kod klawiatury nie ma, niestety, nic wspólnego z ATASCII i większość programistów samodzielnie tłumaczy kody klawiatury na ATASCII, korzystając z tablicy, zawartej w ROM. W starych wersjach systemu operacyjnego tablica ta nie miała swojego wektora, więc korzystanie z niej było nieco ryzykowne, obecnie wskazuje na nią słowo zawarte pod adresem 121-122 ($79-$7a). W tablicy kodów umieszczono kolejno:

• znaki ATASCII odpowiadające kodom klawiszy (jest ich 64),
• znaki ATASCII odpowiadające kodom klawiszy wciśniętych wraz z SHIFT,
• znaki ATASCII odpowiadające kodom klawiszy wciśniętych wraz z CONTROL.

    Oto przykład procedury oczekiwania na klawisz, napisanej w języku asemblera, która może przydać się w wielu programach:
ktab equ $79
ch   equ $02fc

getk lda ch         odczytaj ch
     cmp #255       czy jest znak?
     beq getk       nie: czekaj
     ldy #255       daj znać, że klawisz
     sty ch         został odebrany
     tay            kod klawisza jako indeks
     lda (ktab),y   do tablicy w ROM-ie
     rts
    W akumulatorze znajduje się kod ATASCII, który odpowiada wciśniętemu klawiszowi, pobrany za pomocą tablicy, o której wspominałem wyżej. Wielokrotnie zdarza się, że dla pisanego programu nie ma znaczenia to, czy podczas naciskania klawisza był trzymany SHIFT lub CONTROL. W tym wypadku wystarczy przed rozkazem TAY wpisać AND #%00111111 (ignoruj SHIFT i CONTROL).

    Wiele programów asemblerowych, które nadsyłacie do TA, ma dość dziwny zwyczaj, związany z odczytem klawiatury - przed odczytaniem klawisza wpisują do CH liczbę 255! Takie zachowanie jest wręcz naganne, ponieważ w ten sposób zamazuje się dotychczasową zawartość tej komórki, która przecież mogła być interesująca. Tego typu działalność powoduje, że wszelkie programy, buforujące klawiaturę działają źle i powodują nasze zdenerwowanie. A to przecież nie ich wina. Już kilku autorom wytknęliśmy ten błąd i mam nadzieję, że będzie on się pojawiał coraz rzadziej.

Jarosław Syrylak



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

Pixel 2002