Tajemnice ATARI

MAPA PAMIĘCI


    Z przerwaniem VBLANK, które opisałem w poprzednim odcinku tego cyklu, ściśle związany jest mechanizm tzw. liczników programowych, zaimplementowany w systemie operacyjnym ATARI XL/XE. Działanie tego mechanizmu daje użytkownikowi do dyspozycji pięć dodatkowych źródeł przerwań, które mogą być aktywowane w określonych odstępach czasu. Co więcej, mamy tu do czynienia z przerwaniami niemaskowalnymi, jako uruchamianymi przez przerwanie wygaszania pionowego, samo będące przerwaniem NMI.

   W celu wykorzystania tego udogodnienia należy przypomnieć sobie informacje, dotyczące komórek CDTMV1-CDTMV5, zajmujących lokacje od 536 do 545, czyli od $0218 do $0221. Tworzą one pięć dwubajtowych słów, których zapisanie wartościami różnymi od zera sygnalizuje systemowi chęć skorzystania z liczników, do których je przypisano. Od tej pory podczas każdego przerwania wygaszania pionowego wpisane liczby będą zmniejszane o jeden, dopóki nie osiągną zera. Po doliczeniu do zera system podejmie odpowiednie działania, zależne od tego, którego licznika użyto. Ponieważ są one różne dla różnych liczników, omówię je za chwilę dla każdego przypadku z osobna.

$0226, $0227 00550, 00551 CDTMA1

   Słowo to zawiera adres skoku do procedury, wywoływanej zawsze wtedy, gdy licznik programowy, związany z komórką CDTMV1 osiągnie zero. Można w tym miejscu umieścić adres własnej procedury obsługi tej sytuacji, ale jest to działalność o tyle bezużyteczna, że pierwszy licznik jest używany przez system operacyjny podczas operacji wejścia/wyjścia, stąd też zapisany adres (jak też wartość w CDTMV1) może zostać zmieniony, o Ile zajdzie taka potrzeba. Jeżeli pomimo to używamy tego licznika, należy pamiętać o zakończeniu własnej procedury rozkazem RTS, ponieważ jest ona wywoływana przez skok do podprogramu, czyli JSR. W najnowszej wersji systemu operacyjnego słowo to, po restarcie systemu, wskazuje adres 60433 ($ec11).

$0228, $0229 00552, 00553 CDTMA2

   W tym miejscu znajduje się adres procedury obsługi licznika programowego nr 2, uruchamianego przez zapisanie wartością różną od zera komórki CDTMV2. Używanie tego licznika jest zupełnie bezpieczne, gdyż został on przeznaczony do wykorzystania przez użytkownika i system nigdy nie ingeruje w zawartość słowa CDTMA2 (i, oczywiście, CDTMV2). Mimo to, należy także pamiętać o pułapce, zastawionej na programistów, nie czytających dokładnie opisu ATARI OS. Przerwanie, pochodzące od licznika nr 2 jest częścią drugiej fazy przerwania VBLANK, a w związku z tym jego obsługa uzależniona jest od tego, co w danej chwili dzieje się wewnątrz komputera. Jeżeli akurat odbywają się jakieś operacje czasowo krytyczne, przerwanie to nie będzie obsłużone. Warto o tym pamiętać, aby nie być zdumionym, kiedy okaże się, że nie wszystko działa tak, jak powinno.

   Procedura obsługi tego przerwania powinna zakończyć się rozkazem RTS. Oprócz tego, jeśli reakcja na przerwanie ma nastąpić więcej niż jeden raz, warto w naszym podprogramle zadbać o ponowne zapisanie wartości licznika CDTMV2, bowiem w przeciwnym wypadku system nie wystartuje odliczania.

   Podczas restartu systemu słowo CDTMA2 inicjowane jest wartością zero. Przy zmianie tej wartości trzeba pamiętać o pewnej zasadzie. Ważne jest aby adres własnej procedury ustawić przed zapisaniem czegokolwiek do komórki CDTMV2. W przeciwnym wypadku możemy napotkać przerwanie, które skoczy pod zły (nie do końca ustawiony) adres.

$022a 00554 CDTMF3

   Komórka pamięci o tym adresie zawiera nie adres, ale jednobajtową flagę licznika programowego nr 3. Podczas odliczania, system zapisuje do niej wartość 255, a po wyzerowaniu CDTMV3 kasuje ten bajt, zapisując tu zero. Licznik nr 3 używany jest przez system podczas odczytywania i zapisu nagłówków plików taśmowych, stąd możliwości jego zastosowania przez użytkownika są utrudnione.

$022b 00555 SRTIMR

   Tę komórkę pamięci system wykorzystuje podczas obsługi przerwania klawiatury, przepisując do niej wartość z komórki o adresie 729 ($02d9), lub 730 ($02da). Gdy klawisz jest przetrzymywany dłużej, następuje jego powtarzanie. Użytkownik nie może ingerować w te operacje poprzez SRTIMR, lecz jedynie przez wzmiankowane komórki 729 i 730, odpowiedzialne za zwłokę bezpośrednio po naciśnięciu klawisza oraz za tempo powtórzeń.

$022c 00556 CDTMF4

   Flaga licznika nr 4, o znaczeniu analogicznym do znaczenia CDTMF3, ale nie wykorzystywana przez system operacyjny komputera. Podobnie jak CDTMF3 i CDTMF5 ustawianie tej flagi zależne jest od tego, czy komputer wykonuje operacje czasowo krytyczne. Zauważ, że badanie tych flag ma sens dopiero po tym, jak system rozpocznie odliczanie, czyli po zakończeniu najbliższego przerwania VBLANK.

     opt %010101

clck equ $14
ctv4 equ $02le
ctf4 equ $022c
putl equ $c642

     org 1536
main lda #255
     sta ctv4
     lda #0
     sta ctv4+l
     lda clck
wclk cmp clck     czekaj na rozpoczęcie
     beq wclk     odliczania
wait lda ctf4
     bne wait
     ldx <text
     ldy >text
     jmp putl

text dta c'Time out!',b(155)

     end


$022d 00557 INTEMP

   Jest to tymczasowy rejestr, używany przez procedurę ustawiania adresu przerwania synchronizacji pionowej, czyli SETVBV.

$022e 00558 CDTMF5

   Patrz opis CDTMF4.

   Jednym z ciekawych układów elektronicznych, jakie można znaleźć wewnątrz komputera ATARI XL/XE jest procesor graficzny ANTIC. Jest to układ scalony, którego zadaniem jest obrazowanie danych z pewnego obszaru pamięci komputera. To, co widzimy na ekranie monitora, kiedy siadamy przed komputerem jest efektem pracy ANTIC-u. Sedno działania procesora graficznego tkwi w tzw. bezpośrednim dostępie do pamięci, zwanym krótko DMA (z ang. Direct Memory Access). Po prostu, ANTIC pobiera dane do wyświetlenia z pamięci bez pośrednictwa głównego procesora, "podkradając" mu jednak nieco czasu, czyli zwalniając jego tempo pracy. Jak napisałem powyżej, ANTIC jest prawdziwym procesorem z własnym dwunastobitowym licznikiem rozkazów i zestawem instrukcji. Wykonuje on program, którego adres zapisany jest w słowie SDLSTL, zajmującym komórki pamięci o adresach 560 i 561, czyli $0230 i $0231.

   W wyniku działalności ANTIC-u widzimy obraz, którego podstawowym składnikiem jest tzw. pole gry (ang. playfield). Dodatkowo, może on wyświetlać niezależne obiekty graficzne, które łatwo animować, tzw. graczy (ang. players) i pociski (ang. missiles).

$022f 00559 SDMCTL

   Ta komórka pamięci steruje bezpośrednim dostępem do pamięci procesora graficznego. Jest ona cieniem sprzętowego rejestru DMACTL (54272, czyli $d400) i jej zawartość traktowana jest bitowo. Znaczenie bitów SDMCTL jest następujące:

bit 0, 1 rodzaj pola gry
bit 2 DMA dla pocisków
bit 3 DMA dla graczy
bit 4 rozdzielczość pionowa gracza
bit 5 DMA dla obrazu.

   Dwa najmłodsze bity definiują rodzaj wyświetlanego pola gry tworząc kombinacje:

0 0 pole gry nie jest wyświetlane
0 1 wąskie pole gry (32 znaki w trybie 0)
1 0 normalne pole gry (40 znaków w trybie 0)
1 1 szerokie pole gry (48 znaków w trybie 0)

   Podane wyżej ilości znaków dość dobrze określają szerokości odpowiednich pól gry, chociaż ten sposób określania rozmiaru ekranu nie jest w pełni zgodny z terminologią, zalecaną przez firmę ATARI. Gwoli ścisłości warto więc zaznaczyć, że powinno się w tym wypadku mówić o tzw. cyklach koloru (ang. color clocks), których liczba dla odpowiednich pól gry przedstawia się następująco:

wąskie pole gry 128 cykli koloru
normalne pole gry 160 cykli koloru
szerokie pole gry 192 cykle koloru.

   Nie wszystkie telewizory i monitory pozwolą nam zobaczyć cały obraz, kiedy zażądamy wyświetlenia szerokiego pola gry, ale taka możliwość jest przydatna choćby wtedy, gdy irytują nas ramki z lewej i prawej strony wyświetlanego obrazu.

Bity nr 2 i 3 uruchamiają (po wpisaniu do nich 1), lub blokują (po wpisaniu 0), odpowiednio DMA dla pocisków i dla graczy. Oznacza to w praktyce, że albo widać graczy i pociski, albo ich nie widać. Oczywiście można włączyć np. tylko DMA dla graczy lub pocisków, są one niezależne.

Bit nr 4 definiuje sposób wyświetlania gracza. Więcej szczegółów na ten temat zamieszczę przy okazji opisu tej techniki.

Bit nr 5 włącza (po zapisaniu 1), lub wyłącza (po zapisaniu 0) bezpośredni dostęp ANTIC-a do pamięci, a co za tym idzie wyświetlanie obrazu. Jeśli czasem zdarza się, że program wykonuje dużą ilość np. obliczeń, których wyniki nie są dynamicznie prezentowane na ekranie, to warto na ten czas wyłączyć DMA dla procesora graficznego. Przestanie on wtedy pracować równolegle z 6502, co zwiększy szybkość tęgo ostatniego o ok. 30 procent. Aby wyłączyć DMA dla ANTIC-a, trzeba najpierw odczytać zawartość komórki SDMCTL i zapamiętać ją, później zaś wpisać do niej zero. Po zakończeniu operacji, które chcemy przyspieszyć, należy zapisać na powrót zapamiętaną wartość do tego rejestru. Często warto także zgasić ekran podczas ładowania do pamięci obrazków, nie widać wtedy, jak są one rysowane, za to można obserwować końcowy efekt. Po restarcie systemu do komórki SDMCTL zapisywana jest wartość 34, czyli bitowo %100010, co oznacza włączenie bezpośredniego dostępu ANTIC-a do pamięci i ustawienie standardowego pola gry.



Jarosław Syrylak



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

Pixel 2001