Tajemnice ATARI

MAPA PAMIĘCI

    W komputerach typu ATARI XL/XE zastosowano specjalizowany układ scalony, przeznaczony do sterowania wyświetlaniem obrazu. Układ ten, o nazwie ANTIC jest specjalnie zaprojektowanym mikroprocesorem, pracującym równolegle z główną jednostką sterującą. W trakcie działania, ANTIC korzysta z mechanizmu DMA, czyli bezpośredniego dostępu do pamięci, przerywając pracę CPU zawsze wtedy, gdy potrzebuje danych do odczytu. Jego polem działania jest cała dostępna pamięć, co znakomicie ułatwia pracę programisty, który nie musi martwić się umieszczaniem danych do wyświetlania w jakimś szczególnym obszarze.

    Nie wdając się w szczegóły techniczne, należy zaznaczyć jedynie, że ANTIC nie jest jedynym układem wyświetlania w małym ATARI. Podczas pracy spełnia on jedynie funkcję zarządzającą, przesyłając polecenia, dotyczące tworzenia obrazu do układu GTIA. GTIA dodaje jeszcze informacje o kolorze oraz o tzw. duszkach i dopiero wtedy na ekranie może pojawić się obraz.

   Jak każdy porządny procesor, także i ANTIC ma własny zestaw rozkazów, przy pomocy których możliwe jest napisanie programu wyświetlania obrazu. Taki program nazywa się z angielska Display List (w wolnym tłumaczeniu "lista wyświetlania"). Kiedy restartujemy nasz komputer, system operacyjny tworzy podstawowy program wyświetlania, umożliwiając nam kontakt wizualny z maszyną. Kiedy napiszemy w BASIC-u np. GR.8, dajemy komputerowi (czytaj - ANTIC-owi) znać, że pragniemy zmienić sposób prezentacji danych z pamięci; zgodnie z życzeniem będziemy teraz mieć do czynienia nie z trybem tekstowym, jak zaraz po włączeniu, lecz z trybem graficznym. Oczywiście, taką reakcję zapewnia praca interpretera BASIC-u i systemu operacyjnego, który tworzy odpowiedni program dla procesora graficznego.

   Wszyscy wiemy, jakie efekty można uzyskać, stosując BASIC-owe instrukcje graficzne i często okazuje się, że ten język programowania nie daje nam zbyt dużych możliwości. Zdarza się, że przestaje nam wystarczać to, co możemy zobaczyć, a marzy się nam np. wyświetlenie obrazu, na którym zmieszano kilka trybów graficznych. I w tym miejscu warto omówić dokładniej program ANTIC-u!

   Program dla tego mikroprocesora stanowi "przepis" na wygląd ekranu. Przy pomocy pewnych rozkazów, które zaraz opiszę, należy taki przepis utworzyć, umieścić go w pamięci, a następnie poinformować wykonawcę zadania, czyli ANTIC o położeniu programu wyświetlania w pamięci. Podczas pisania programu dla procesora graficznego trzeba pamiętać o kilku rzeczach, które z punktu widzenia sprzętu są bardzo ważne.

   Po pierwsze: licznik rozkazów ANTIC-u jest tylko 10-bitowy. W praktyce oznacza to że próba napisania programu wyświetlania, którego długość jest większa od 1 kilobajta, jest z góry skazana na niepowodzenie. Oczywiście mam tu na myśli jedynie takie programy wyświetlania, które nie zawierają rozkazów skoków, poprzez skok bowiem możemy zmienić licznik rozkazów tak, aby przekroczyć granicę jednego kllobajta. Z doświadczenia mogę powiedzieć, że raczej nie spotyka się programów ANTIC-u, dłuższych niż 1024 bajty.

   Po drugie: licznik pamięci obrazu jest jedynie 12-bitowy, co, jak łatwo się domyślić, ogranicza naszą działalność do 4-kllobajtowego bloku pamięci, i tu jednak przychodzi nam z pomocą rozkaz ustawiania licznika pamięci obrazu, dzięki któremu można czerpać dane kolejno z kilku bloków.

   Żeby powyższe rozważania nie pozostały jedynie teorią, powrócę do nich później, kiedy już zapoznamy się z rozkazami procesora graficznego. Mamy do dyspozycji trzy grupy rozkazów:

  • rozkazy tworzące puste linie;
  • rozkazy skoków;
  • rozkazy tworzące linie obrazu.

    Rozkazy tworzące puste linie.

       Podczas wykonywania tych rozkazów ANTIC nie pobiera z pamięci żadnych danych. Zamiast tego wyświetlane są na ekranie linie w kolorze tła. Ich liczba zależy od postaci rozkazów, które zbudowane są następująco:
    bity 0-3 muszą mieć wartość 0,
    bity 4-6 - liczba pustych linii, zmniejszona o jeden,
    bit 7 - żądanie przerwania (nieobowiązkowe). Ustawienie siódmego bitu w dowolnym rozkazie powoduje przerwanie programu ANTIC-u i wykonanie procedury, której adres wskazuje wektor VDSLST (patrz 512, czyli 80200). Oto kilka przykładów rozkazów tworzących puste linie (% oznacza liczbę dwójkową):

    %00100000 - wyświetlenie trzech pustych linii
    %01000000 - wyświetlenie pięciu pustych linii

    Rozkazy skoków.

       Rozkazy te powodują załadowanie licznika rozkazów ANTIC-u adresem, zawartym w następnym słowie pamięci (młodszy, starszy bajt adresu). Wykonanie rozkazu skoku powoduje umieszczenie na ekranie pustej linii, stąd lepiej umieszczać je w programie tak, aby nie wywoływały one brzydkich efektów wizualnych. Budowa rozkazu skoku jest następująca:

    bity 0-5 muszą mieć wartość %000001,
    bit 6 równy zero powoduje wykonanie skoku natychmiastowego, równy jeden - zmusza ANTIC do oczekiwania na przerwanie synchronizacji pionowe) przed wykonaniem następnego po skoku rozkazu,
    bit 7 - żądanie przerwania.

       Przykłady rozkazów skoków:

    %00000001 adres1 - ładowanie licznika rozkazów wartością adres1 i natychmiastowe wykonanie znajdującego się tam rozkazu;
    %01000001 adres2 - ładowanie licznika rozkazów wartością adres2 i oczekiwanie na przerwanie synchronizacji pionowej.

    Rozkazy tworzące linie obrazu.

       Ta, najliczniejsza, grupa rozkazów powoduje wyświetlenie bloku obrazu w jednym z kilkunastu trybów pracy ANTIC-u. Budowa tego typu rozkazów jest następująca:

    bity 0-3 numer trybu wyświetlania,
    bit 4 równy jeden powoduje włączenie poziomego przewijania obrazu,
    bit 5 równy jeden powoduje włączenie pionowego przewijania obrazu,
    bit 6 równy jeden powoduje załadowanie licznika pamięci obrazu adresem, zawartym w następnym słowie pamięci i wyświetlenie danych z nowego miejsca,
    bit 7 żądanie przerwania.

       W zależności od wybranego trybu wyświetlania dane mogą być prezentowane jako wiersze tekstu lub linie grafiki o różnej rozdzielczości poziomej i pionowej oraz liczbie kolorów. Oto zestawienie trybów wyświetlania:

    Tryby tekstowe.

       Tryb 2. Odpowiada trybowi 0 BASIC-u. Wiersz danych to 40 znaków, z których każdy składa się z 8 linii po 8 pikseli (punktów). Każdy z pikseli ma szerokość pół cyklu koloru. Wyświetlany tekst jest dwukolorowy.

       Tryb 3. Nie ma odpowiednika w BASIC-u. Wiersz danych to 40 znaków, z których każdy składa się z 10 linii po 8 pikseli. Wyświetlany tekst jest dwukolorowy.

       Tryb 4. Nie ma odpowiednika w BASIC-u. Wiersz danych to 40 znaków, z których każdy składa się z 8 linii po 4 piksele. Wyświetlany tekst jest pięciokolorowy.

       Tryb 5. Jak wyżej, lecz każdy znak ma 16 linii wysokości, ponieważ każdy piksel jest dwukrotnie rozciągnięty w pionie. Wyświetlany tekst jest pięciokolorowy.

       Tryb 6. Odpowiada trybowi 1 BASIC-u. Wiersz danych to 20 znaków, z których każdy składa się z 8 linii po 8 pikseli o podwójnej szerokości. Wyświetlany tekst jest czterokolorowy.

       Tryb 7. Odpowiada trybowi 2 BASIC-u. Wiersz danych to 20 znaków, z których każdy składa się z 8 linii po 8 pikseli, lecz piksele mają podwójną wysokość i szerokość. Wyświetlany tekst jest czterokolorowy.

       Wypada jeszcze dodać, że teksty do wyświetlania powinny być kodowane nie jako znaki ATASCII, lecz tzw. Internal, co łatwo osiągnąć w asemblerze, stosując definicje typu:
    tekst  dta d'To jest tekst' 
    
    (przykład w konwencji Quick Assemblera).

    Tryby graficzne.

       Tryb 8. Odpowiada trybowi 3 BASIC-u. 40 pikseli w linii. Każdy piksel ma wysokość 8 linii obrazu i szerokość 4 cykli koloru. Tryb czterokolorowy.

       Tryb 9. Odpowiada trybowi 4 BASIC-u. 80 pikseli w linii. Każdy piksel ma wysokość 4 linii obrazu i szerokość 2 cykli koloru. Tryb dwukolorowy.

       Tryb 10. Odpowiada trybowi 5 BASIC-u. 80 pikseli w linii. Każdy piksel ma wysokość 4 linii obrazu i szerokość 2 cykli koloru. Tryb czterokolorowy.

       Tryb 11. Odpowiada trybowi 6 BASIC-u. 160 pikseli w linii. Każdy piksel ma wysokość 2 linii obrazu i szerokość 1 cyklu koloru. Tryb dwukolorowy.

       Tryb 12. Nie ma odpowiednika w BASIC-u. 160 pikseli w linii. Każdy piksel ma wysokość 1 linii obrazu i szerokość 1 cyklu koloru. Tryb dwukolorowy.

       Tryb 13. Odpowiada trybowi 7 BASIC-u. 160 piksell w linii. Każdy piksel ma wysokość 2 linii obrazu i szerokość 1 cyklu koloru. Tryb czterokolorowy.

       Tryb 14. Nie ma odpowiednika w BASIC-u. 160 pikseli w linii. Każdy piksel ma wysokość 1 linii obrazu i szerokość 1 cyklu koloru. Tryb czterokolorowy.

       Tryb 15. Odpowiada trybowi 8 BASIC-u. 320 pikseli w linii. Każdy piksel ma wysokość 1 linii obrazu i szerokość pół cyklu koloru. Tryb dwukolorowy.

       Napisałem już wcześniej, że licznik pamięci obrazu jest 12-bitowy. Niedogodność tę odczuwa się podczas używania jednego z dwu ostatnich trybów graficznych. Kiedy tworzymy obraz z dużą liczbą linii o wysokiej rozdzielczości, pamięć obrazu jest większa niż 4 kilobajty. W takim wypadku należy pamiętać o ponownym załadowaniu licznika pamięci obrazu w środku programu ANTIC-u. Najlepiej zaplanować wyświetlanie tak, aby obie części obrazu były umieszczone na granicy czterokilobajtowego bloku pamięci. Nie zapomnijmy o ustawieniu szóstego bitu rozkazu wyświetlania linii obrazu i o podaniu adresu danych w następnym słowie programu!

       Poziome i pionowe przewijanie obrazu jest nieco zbyt skomplikowane, aby dało się w tym miejscu opisać szczegółowo, stąd odsyłam zainteresowanych do odpowiedniej literatury.

    bity 0-3 numer trybu wyświetlania,
    bit 4 równy jeden powoduje włączenie poziomego przewijania obrazu,
    bit 5 równy jeden powoduje włączenie pionowego przewijania obrazu,
    bit 6 równy jeden powoduje załadowanie licznika pamięci obrazu adresem, zawartym w następnym słowie pamięci i wyświetlenie danych z nowego miejsca,
    bit 7 żądanie przerwania.

       Oto kilka przykładów rozkazów tworzących linie obrazu:

    %00000010 wyświetlenie wiersza tekstu w trybie 2 ANTIC-u,
    %01000010 adresl załadowanie licznika pamięci obrazu wartością adres1 i wyświetlenie znajdujących się tam danych jako wiersza tekstu w trybie 2 ANTIC-u,
    % %0000111l wyświetlenie wiersza grafiki w trybie 15 ANTIC-u.

    $0230,$0231 00560,00561 SDLSTL
       To słowo pamięci zawiera adres programu wyświetlania, skonstruowanego w oparciu o podane wyżej zasady i umieszczonego na granicy jednokilobajtowego bloku pamięci. Inicjowane przez system podczas restartu komputera. Przy zmianie adresu programu ANTIC-u warto pamiętać o odtworzeniu starej wartości na zakończenie programu.

    Jarosław Syrylak



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

    Pixel 2001