MAPA PAMIĘCI
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.
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 20i 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.
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.
Bity od 3 do 7 nie wpływają na wygląd tychże 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.
Dodatkowo, ta komórka pamięci używana jest do przechowywania koloru linii podczas operacji graficznych, np. rysowania i wypełniania obszaru.
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 rtsW 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
|