Powrót do spisu treści

Rozdział 7

TWORZENIE OBRAZU

    Tworzeniem obrazu na monitorze zajmuje się w komputerach Atari specjalizowany układ scalony - ANTIC (AlphaNumeric Television Interface Controller). Jest to specjalnie zaprojektowany dla Atari mikroprocesor, który posiada własny zestaw rozkazów i własny program. Według tego programu ANTIC pobiera z pamięci komputera dane umieszczone tam przez jednostkę centralną (procesor 6502) i po odpowiedniej interpretacji przesyła je do monitora.

    Obraz telewizyjny generowany przez ANTIC jest jednak monochromatyczny. Kolory są dodawane przez inny układ specjalny - GTIA (Graphics Television Interface Adaptor), który także został zaprojektowany specjalnie dla Atari. Poza kolorem GTIA tworzy jeszcze ruchome obiekty ekranowe zwane popularnie duszkami, a według nomenklatury Atari - grafiką graczy i pocisków (P/MG - Player/Missile Graphics). Te funkcje GTIA są opisane w rozdziale 8.

    Spośród układów graficznych stosowanych w komputerach domowych ANTIC wyróżnia się dwoma cechami. Przede wszystkim może bezpośrednio korzystać z pamięci komputera poprzez tzw. DMA (Direct Memory Access). Odciąża więc w ten sposób procesor centralny, co pozwala znacznie przyspieszyć jego pracę. Ponadto ANTIC posiada kompletną 16-bitową szynę adresową, dzięki czemu ma dostęp do całych 64 KB pamięci. Umożliwia to umieszczenie danych dla obrazu oraz programu ANTIC-a w dowolnym miejscu pamięci.

    Przed przejściem do dalszego opisu trzeba wiedzieć, jak wygląda obraz telewizyjny tworzony przez ANTIC. Obraz ten jest wyświetlany na ekranie przez wiązkę elektronów poruszającą się poziomo od lewej do prawej krawędzi ekranu (patrząc od strony użytkownika) i tworzącą jedną linię ekranu. Wiązka jest wygaszana na czas przejścia do początku nowej linii - ten okres nazywamy synchronizacją poziomą. Po utworzeniu całego obrazu wiązka jest wygaszana na czas przejścia z prawego, dolnego rogu ekranu do lewego, górnego. Nazywa się to synchronizacją pionową. Cała operacja powtarza się co 1/50 sekundy, a więc 50 razy na sekundę.

    Pozioma wielkość linii ekranu jest mierzona w specjalnych jednostkach zwanych cyklami koloru. Jest to czas wykonywania przez procesor 6502 połowy cyklu maszynowego. Pełna linia ekranu ma 228 cykli koloru, co pozwala na przedstawienie 456 pojedynczych punktów, a pełny obraz zawiera 310 linii (w systemie PAL). Jednak tak utworzony obraz nie mieściłby się w całości na ekranie telewizora. Aby uniknąć utraty części informacji, obraz tworzony przez ANTIC ma nieco ograniczone wymiary.

    Maksymalna wielkość obrazu generowanego przez ANTIC może wynosić 216 linii, ponieważ na więcej nie wystarcza czasu. Utworzenie większej liczby linii spowoduje "zerwanie" synchronizacji czyli pionowe przesuwanie się obrazu. Aby górna krawędź obrazu nie wychodziła poza ekran, w górnej części ANTIC tworzy 24 linie puste. Pozostają więc 192 linie i taka właśnie jest maksymalna rozdzielczość pionowa obrazu. Można ją nieco zwiększyć przez zmniejszenie liczby pustych linii i zwiększenie liczby linii obrazu, lecz suma wszystkich linii nigdy nie może przekraczać 216.

    Także w poziomie nie jest wykorzystywana cała długość linii. W tym przypadku możliwe są jedynie trzy rozwiązania. Wyświetlana linia obrazu może posiadać 128, 160 lub 192 cykle koloru. Normalnie używany jest obraz o szerokości 160 cykli koloru, co daje 320 punktów ekranu. Zmiana szerokości linii jest dokonywana przez zmianę zawartości odpowiedniego rejestru ANTIC-a i programista nie może jej ustalić dowolnie.

    Pozostaje jeszcze wyjaśnienie różnicy między linią ekranu i linią obrazu oraz między punktem ekranu i pixelem (punktem obrazu). Wszystko to, co zostało napisane wyżej dotyczy linii i punktów ekranu, ponieważ stanowią one podstawowe elementy ekranu (niezależne od komputera). Natomiast najmniejszy element obrazu (PICture ELement = pixel), na którego wygląd może wpływać programista zależy od wybranego trybu graficznego. Ogólnie można powiedzieć, że linia obrazu składa się z jednej lub kilku linii ekranu, zaś pixel z jednego lub kilku punktów ekranu.

    ANTIC posiada kilkanaście rejestrów, które sterują jego pracą. Poprzez zmianę ich zawartości można wpływać na wygląd obrazu. Najważniejszym rejestrem jest DMACTL (DMA ConTroL - $D400) kontrolujący dostęp ANTIC-a do pamięci komputera. Bity 6 i 7 tego rejestru są niewykorzystane, a znaczenie pozostałych jest następujące:

    Bit 5 włącza (gdy jest ustawiony) bezpośredni dostęp ANTIC-a do pamięci w celu czytania programu. Skasowanie tego bitu uniemożliwia więc wyświetlanie obrazu pomimo tego, że znajduje się on w pamięci.

    Bity 2-4 są wykorzystywane do sterowania grafiką graczy i pocisków. Ich działanie jest szczegółowo opisane w rozdziale 8.

    Bity 0 i 1 regulują dostęp ANTIC-a do pamięci w celu odczytu danych obrazu. Gdy oba są równe zero, to ANTIC nie może odczytywać danych i nie wyświetla obrazu. Inne kombinacje ustalają szerokość wyświetlanego obrazu: 01 - obraz wąski (128 cykli koloru), 10 - obraz normalny (160 cykli koloru) i 11 - obraz szeroki (192 cykle koloru).

    Podczas wykonywania programu często zachodzi konieczność przeprowadzenia jakiejś operacji (np. zmiany koloru) między liniami ekranu, a nie w trakcie tworzenia linii. Pomocny jest w tym rejestr WSYNC (Wait for SYNChronization - $D40A). Wpisanie dowolnej wartości do tego rejestru powoduje zatrzymanie pracy CPU (6502) do zakończenia tworzenia na ekranie aktualnej linii.

    Także licznik linii ekranu VCOUNT (Vertical COUNT - $D40B) jest zwykle wykorzystywany podczas przerwań DLI. Zawiera on numer aktualnie tworzonej linii ekranu podzielony przez dwa. Podczas tworzenia obrazu VCOUNT zlicza więc od 0 do 155.

    Stosunkowo najrzadziej wykorzystywane są dwa następne rejestry - LPENH (Light PEN Horizontal - $D40C) i LPENV (LPEN Vertical). Wskazują one aktualną pozycję pióra świetlnego na ekranie. Rejestr LPENH zawiera numer cyklu koloru (od 0 do 227), a LPENV numer linii podzielony przez dwa (jak VCOUNT).

7.1. Program ANTIC-a

    ANTIC tworzy obraz według programu zawartego w pamięci RAM komputera, oznaczonego skrótem DL (Display List). Adres tego programu jest wpisywany do wektora DLPTRS (Display List PoinTeR Shadow register), a następnie podczas przerwania synchronizacji pionowej VBLK (w tym czasie obraz nie jest generowany) przepisywany do DLPTR.

    Program ANTIC-a jest układany przez system operacyjny i zapisywany w pamięci podczas procedury otwarcia ekranu (SCOPN - zob. str. 49). Dla każdego trybu program ANTIC-a jest inny, ale jest tylko jeden. Użytkownik może ingerować w jego treść, aby mieszać między sobą różne tryby oraz dla uzyskania innych specjalnych efektów.

7.1.1. Rozkazy ANTIC-a

    Aby zmieniać program ANTIC-a trzeba przede wszystkim znać kody jego rozkazów i ich znaczenie. Wszystkie rozkazy, którymi dysponuje ANTIC, można podzielić na trzy zasadnicze grupy: rozkazy tworzenia pustych linii, rozkazy skoków i rozkazy tworzenia linii trybu. Rodzaj rozkazu jest rozpoznawany według czterech młodszych bitów. Cztery starsze bity służą do modyfikacji podstawowego rozkazu.

    We wszystkich rozkazach ustawienie najstarszego bitu powoduje wywołanie przez ANTIC (po wykonaniu rozkazu) przerwania niemaskowalnego. Przerwanie to nazywane jest przerwaniem programu ANTIC-a (DLI - Display List Interrupt). Nie należy przez to rozumieć, że przerywany jest program ANTIC-a, lecz, że wywołuje on przerwanie. Po otrzymaniu żądania przerwania DLI procesor wykonuje procedurę przerwania, której adres znajduje się w rejestrze DLIV (DLI Vector - $0200).

    Rozkazy tworzenia pustych linii mają cztery młodsze bity skasowane, są więc postaci $x0. Pozostałe bity (4-6, bo bit 7 sygnalizuje przerwanie DLI) zawierają liczbę tworzonych pustych linii zmniejszoną o jeden. Pełna lista rozkazów tworzących puste linie jest następująca:
                        bez DLI           z DLI
    1 pusta linia         $00              $80
    2 puste linie         $10              $90
    3 puste linie         $20              $A0
    4 puste linie         $30              $B0
    5 pustych linii       $40              $C0
    6 pustych linii       $50              $D0
    7 pustych linii       $60              $E0
    8 pustych linii       $70              $F0
    Rozkazy skoków mają najmłodszy bit równy jeden, są więc postaci $x1. Bity 4 i 5 są niewykorzystane, zaś bit 6 określa rodzaj skoku. Gdy bit 6 jest skasowany, to tworzona jest jedna pusta linia, a dwa następne bajty programu przepisywane są do licznika programu w kolejności LSB/MSB. Powoduje to wykonywanie dalszej części programu od wskazanego adresu, czyli po prostu skok bezwzględny (JMP). Rozkaz ten jest podobny do rozkazu JMP procesora 6502.

    Gdy bit 6 jest ustawiony, to ANTIC wykonuje te same czynności, lecz dalsza realizacja programu jest zatrzymywana, aż do synchronizacji pionowej. Jest to więc skok z oczekiwaniem na synchronizację VBLK (JVB) i musi on występować na końcu programu ANTIC-a (i tylko tam).

    Kody rozkazów skoku przedstawia poniższa tabela:
                            bez DLI           z DLI
        JMP                   $01              $81
        JVB                   $41              $C1
    Rozkazy tworzenia linii trybu zawierają w czterech młodszych bitach numer trybu (od $02 do $0F), który określa sposób interpretacji danych z pamięci obrazu. Chodzi tu oczywiście o numery trybów ANTIC-a, które są inne niż numery stosowane przez OS. Wszystkie numery trybów w tym rozdziale oznaczają tryby ANTIC-a, o ile nie zostało specjalnie zaznaczone, że chodzi o tryb OS. Pozostałe cztery bity oznaczają modyfikacje rozkazu. Znaczenie bitu 7 (DLI) zostało już opisane, teraz kolej na pozostałe modyfikacje.

    Bit 4 (HSC - Horizontal SCrolling) oznacza, gdy jest ustawiony, włączenie poziomego przesuwu tworzonej linii obrazu (dalsze informacje na ten temat znajdują się w rozdziale 7.4. - str. 180).

    Bit 5 (VSC - Vertical SCrolling) oznacza, gdy jest ustawiony, włączenie pionowego przesuwu tworzonej linii obrazu.

    Bit 6 (LMS - Load Memory Scan) powoduje, gdy jest ustawiony przepisanie dwóch następnych bajtów programu do licznika pamięci obrazu. Licznik obrazu wskazuje ANTIC-owi miejsce w pamięci, z którego ma on pobrać dane obrazu. Ta modyfikacja rozkazu jest bardzo ważna i wymaga szerszego omówienia. ANTIC po rozpoznaniu rozkazu tworzenia linii pobiera z pamięci obrazu odpowiednią liczbę bajtów (zależną od trybu) i po zinterpretowaniu wyświetla na ekranie. Pobieranie danych dla następnej linii rozpoczyna się od następnego bajtu po ostatnio odczytanym. Trzeba więc na początku programu odpowiednio ustawić adres tych danych i to z dwóch powodów. Po pierwsze dlatego, aby ANTIC wiedział skąd ma pobierać dane. Po drugie dlatego, że program ANTIC-a jest wykonywany w całości 50 razy na sekundę i po pobraniu danych dla jednego obrazu, dane dla następnego byłyby pobierane z innego miejsca pamięci.

    Licznik obrazu ma specyficzną konstrukcję, która wpływa na sposób jego działania. Posiada on szesnaście bitów ustalanych przez wpisanie adresu odczytanego z programu ANTIC-a. Podczas pobierania danych z pamięci zmieniane jest jednak tylko 12 młodszych bitów. Ogranicza to zakres działania licznika do bloku 4 KB. Jeżeli dane obrazu zajmują więcej niż 4 KB, to licznik musi być ponownie ustawiony. W przeciwnym razie po osiągnięciu końca bloku 4 KB następne dane będą pobierane z początku tego samego bloku. Trzeba przy tym uważać, aby dane żadnej linii obrazu nie przekraczały granicy bloku, gdyż nie można zmienić stanu licznika w środku tworzonej linii. Sytuacja taka występuje w trybach E i F. Normalnie rozkaz LMS występuje w programie ANTIC-a razem z rozkazem tworzenia pierwszej linii obrazu i razem z rozkazem tworzenia pierwszej linii okna tekstowego (jeśli ono jest).

    Poniższe tabele zawierają kody wszystkich rozkazów ANTIC-a tworzących linie trybu.
                      Bez przerwania DLI
                      
                -    HSC    -    HSC    -    HSC    -    HSC
   modyfikacje  -     -    VSC   VSC    -     -    VSC   VSC
                -     -     -     -    LMS   LMS   LMS   LMS
      tryb
        2      $02   $12   $22   $32   $42   $52   $62   $72
        3      $03   $13   $23   $33   $43   $53   $63   $73
        4      $04   $14   $24   $34   $44   $54   $64   $74
        5      $05   $15   $25   $35   $45   $55   $65   $75
        6      $06   $16   $26   $36   $46   $56   $66   $76
        7      $07   $17   $27   $37   $47   $57   $67   $77
        8      $08   $18   $28   $38   $48   $58   $68   $78
        9      $09   $19   $29   $39   $49   $59   $69   $79
        A      $0A   $1A   $2A   $3A   $4A   $5A   $6A   $7A
        B      $0B   $1B   $2B   $3B   $4B   $5B   $6B   $7B
        C      $0C   $1C   $2C   $3C   $4C   $5C   $6C   $7C
        D      $0D   $1D   $2D   $3D   $4D   $5D   $6D   $7D
        E      $0E   $1E   $2E   $3E   $4E   $5E   $6E   $7E
        F      $0F   $1F   $2F   $3F   $4F   $5F   $6F   $7F

                       Z przerwaniem DLI
                       
                -    HSC    -    HSC    -    HSC    -    HSC
   modyfikacje  -     -    VSC   VSC    -     -    VSC   VSC
                -     -     -     -    LMS   LMS   LMS   LMS
      tryb
        2      $82   $92   $A2   $B2   $C2   $D2   $E2   $F2
        3      $83   $93   $A3   $B3   $C3   $D3   $E3   $F3
        4      $84   $94   $A4   $B4   $C4   $D4   $E4   $F4
        5      $85   $95   $A5   $B5   $C5   $D5   $E5   $F5
        6      $86   $96   $A6   $B6   $C6   $D6   $E6   $F6
        7      $87   $97   $A7   $B7   $C7   $D7   $E7   $F7
        8      $88   $98   $A8   $B8   $C8   $D8   $E8   $F8
        9      $89   $99   $A9   $B9   $C9   $D9   $E9   $F9
        A      $8A   $9A   $AA   $BA   $CA   $DA   $EA   $FA
        B      $8B   $9B   $AB   $BB   $CB   $DB   $EB   $FB
        C      $8C   $9C   $AC   $BC   $CC   $DC   $EC   $FC
        D      $8D   $9D   $AD   $BD   $CD   $DD   $ED   $FD
        E      $8E   $9E   $AE   $BE   $CE   $DE   $EE   $FE
        F      $8F   $9F   $AF   $BF   $CF   $DF   $EF   $FF

7.1.2. Struktura programu ANTIC-a

    Program ANTIC-a musi spełniać kilka warunków, aby jego wykonanie dało na ekranie pożądany efekt. Przede wszystkim musi koniecznie zawierać rozkaz LMS na początku oraz rozkaz JVB na końcu. Aby górna krawędź obrazu nie wychodziła poza ekran, przed rozkazami tworzenia linii trybu powinny znaleźć się rozkazy tworzenia pustych linii (może ich być mniej niż 24). Typowy program ANTIC-a tworzony przez system operacyjny jest przedstawiony na następnej stronie.
         START    $70     -+
                  $70      ¦  3*8=24 puste linie
                  $70     -+
                  $4x     linia trybu + LMS
                  <SCRM   -+  adres pamięci obrazu
                  >SCRM   -+  w kolejności LSB/MSB
                  $0x     -+
                  $0x      ¦
                  ...      :  linie trybu
                  $0x      ¦
                  $0x     -+
                  $42     linia trybu 2 + LMS
                  <TXTM   -+  adres pamięci okna
                  >TXTM   -+  tekstowego (LSB/MSB)
                  $02     -+
                  $02      ¦  3 linie trybu 2
                  $02     -+
                  $41     JVB
                  <START  -+  adres początku
                  >START  -+  programu ANTIC-a
    Oczywiście fragment programu dotyczący okna tekstowego występuje tylko wtedy, gdy to okno istnieje. Najkrótsze programy ANTIC-a są ustalane dla trybów 5 (tryb 13 OS) i 7 (2) bez okna tekstowego, mają one po 20 bajtów. Tryby E (15) i F (8) bez okna mają najdłuższe programy - po 202 bajty. Jak widać, czym większa rozdzielczość, tym dłuższy program ANTIC-a.

7.1.3. Kolory

    Informacja o obrazie utworzona przez ANTIC przed wysłaniem do monitora jest jeszcze uzupełniana informacją o kolorze. Ta czynność jest wykonywana przez GTIA. Do realizacji tego zadania GTIA wykorzystuje dziewięć rejestrów, w których przechowywane są wartości kolorów. Znajdują się one w obszarze od $D012 do $D01A, a ich rejestry-cienie od $02C0 do $02C8.

    Wszystkie rejestry koloru mają jednakową strukturę. Cztery starsze bity zawierają numer barwy, a cztery młodsze stopień jasności. Ponieważ bit 0 nie jest odczytywany, to mamy do dyspozycji 16 barw w 8 jasnościach. Daje to razem 128 kolorów, a we wszystkich informacjach o Atari jest napisane, że można wybierać z palety 256 kolorów. Skąd ta różnica? Obie podane wyżej informacje są prawdziwe. Rzeczywiście do wyboru jest 128 kolorów. Natomiast szczególna interpretacja danych obrazu w trybie 9 (tryb systemu operacyjnego) pozwala na uzyskanie szesnastu zamiast ośmiu stopni jasności i teraz można wybierać z 256 kolorów. Tak więc we wszystkich trybach mamy dostępne 128 kolorów, a tylko w trybie 9 (OS) - 256. Nie jest to całkowicie prawdziwe, ale pozostawmy tą kwestię na później. Szczegóły są wyjaśnione przy opisie trybów GTIA.

    Teraz wypada przedstawić kolory, które odpowiadają różnym wartościom umieszczonym w rejestrach koloru. Ze stopniami jasności sprawa jest prosta: wartość najmniejsza ($00) oznacza kolor najciemniejszy, a największa ($0F) - najjaśniejszy. Znacznie trudniejsze jest przedstawienie barw. Przede wszystkim dlatego, że barwa zależy także od jasności, np. barwa $00 z jasnością $00 to kolor czarny, zaś z jasnością $0E - biały. Poza tym kolory w dużym stopniu zależą od konkretnego egzemplarza monitora, nie mówiąc już o systemie telewizyjnym (wszyskie źródła podają barwy w systemie NTSC, a nie PAL). Po przedstawieniu tych zastrzeżeń, czas na wykaz barw (x oznacza jasność).
            kod          kolor
            $0x       szary
            $1x       złoty
            $2x       pomarańczowy
            $3x       czerwony
            $4x       różowy
            $5x       purpurowy
            $6x       fioletowy
            $7x       niebieski zimny
            $8x       niebieski
            $9x       błękitny
            $Ax       turkusowy
            $Bx       niebiesko-zielony
            $Cx       zielony
            $Dx       żółto-zielony
            $Ex       pomarańczowo-zielony
            $Fx       żółty
    Na zakończenie jeszcze jedna ważna informacja. Podczas tworzenia obrazu kolor jest określany zawsze według rejestru sprzętowego. Ten z kolei jest zapisywany wartością z rejestru-cienia podczas każdego przerwania VBLK, czyli 50 razy na sekundę. Po zmianie koloru w rejestrze-cieniu kolor na ekranie zmieni się więc najpóźniej po 1/50 sekundy. Jeśli zmiana zostanie dokonana w rejestrze sprzętowym, to kolor zmieni się natychmiast, lecz nie da się tego zobaczyć. Najpóźniej bowiem po 1/50 sekundy kolor zostanie odtworzony według starej wartości z rejestru-cienia. Gdy jednak kolor w rejestrze sprzętowym będzie zmieniany podczas każdego tworzenia obrazu (np. przez procedurę przerwania DLI), to zmiana będzie trwała, ale tylko w tej części obrazu, która jest tworzona po przerwaniu. Podczas przerwania VBLK stara wartość zostanie odtworzona i część obrazu do ponownego wywołania procedury DLI będzie miała stary kolor. Jest to najczęstsze zastosowanie przerwań DLI.

7.2. Tryby bitowe

    W trybach bitowych dostępny jest każdy pixel obrazu. Poszczególne tryby różnią się między sobą liczbą dostępnych kolorów oraz rozdzielczością, czyli wielkością pixela. Od tych parametrów zależy też wielkość obszaru pamięci zajmowanego przez dane obrazu. Ponieważ pixele w niektórych trybach zajmują kilka linii ekranu (w pionie), to dla zaoszczędzenia czasu ANTIC umieszcza dane pobrane dla jednej linii w specjalnym rejestrze. Przy tworzeniu następnej linii ekranu należącej do tej samej linii obrazu dane są pobierane nie z pamięci, lecz z tego specjalnego rejestru. Pozostawia to więcej czasu jednostce centralnej (6502) na wykonywanie właściwego programu. Trzeba bowiem pamiętać, że ANTIC zatrzymuje pracę 6502 na czas pobierania danych z pamięci.

    ANTIC dysponuje ośmioma trybami bitowymi. Wszystkie tryby są dostępne dla systemu operacyjnego. Ponadto OS poprzez zmianę wartości w rejestrze GTIACTL może uzyskać trzy dodatkowe tryby bitowe. Poniżej opisane są wszystkie tryby bitowe. Podane wartości liczbowe odnoszą się, o ile nie określono inaczej, do normalnej szerokości obrazu, równej 160 cykli koloru.

Tryb 8

    W tym trybie pixel ma wysokość ośmiu linii ekranu i szerokość czterech cykli koloru. W jednej linii znajduje się więc 40 pixeli. Maksymalna liczba linii obrazu wynosi 192/8=24. ANTIC dysponuje przy tym czteroma kolorami. Do wyboru koloru pixela potrzebne są dwa bity. Razem dane całej linii zajmują 40*2=80 bitów, czyli 80/8=10 bajtów. Każda para bitów umieszczona w pamięci obrazu służy do wyboru koloru według schematu:
             para bitów 00 - rejestr COLBAK
             para bitów 01 - rejestr COLPF0
             para bitów 10 - rejestr COLPF1
             para bitów 11 - rejestr COLPF2
    Tryb ten odpowiada trybowi $03 systemu operacyjnego.

Tryb 9

    W tym trybie pixel ma wysokość czterech linii ekranu i szerokość dwóch cykli koloru. W jednej linii znajduje się więc 80 pixeli. Maksymalna liczba linii obrazu wynosi 192/4=48. ANTIC dysponuje przy tym dwoma kolorami. Do wyboru koloru pixela potrzebny jest jeden bit. Razem dane całej linii zajmują 80*1=80 bitów, czyli 80/8=10 bajtów. Każdy skasowany bit w pamięci obrazu powoduje wybór koloru z rejestru COLBAK, a każdy bit ustawiony z rejestru COLPF0. Tryb ten odpowiada trybowi $04 systemu operacyjnego.

Tryb A

    W tym trybie pixel ma wysokość czterech linii ekranu i szerokość dwóch cykli koloru. W jednej linii znajduje się więc 80 pixeli. Maksymalna liczba linii obrazu wynosi 192/4=48. ANTIC dysponuje przy tym czteroma kolorami. Do wyboru koloru pixela potrzebne są dwa bity. Razem dane całej linii zajmują 80*2=160 bitów, czyli 160/8=20 bajtów. Każda para bitów służy do wyboru koloru według schematu:
             para bitów 00 - rejestr COLBAK
             para bitów 01 - rejestr COLPF0
             para bitów 10 - rejestr COLPF1
             para bitów 11 - rejestr COLPF2
    Tryb ten odpowiada trybowi $05 systemu operacyjnego.

Tryb B

    W tym trybie pixel ma wysokość dwóch linii ekranu i szerokość jednego cyklu koloru. W jednej linii znajduje się więc 160 pixeli. Maksymalna liczba linii obrazu wynosi 192/2=96. ANTIC dysponuje przy tym dwoma kolorami. Do wyboru koloru pixela potrzebny jest jeden bit. Razem dane całej linii zajmują 160*1=160 bitów, czyli 160/8=20 bajtów. Każdy skasowany bit w pamięci obrazu powoduje wybór koloru z rejestru COLBAK, a każdy bit ustawiony z rejestru COLPF0. Tryb ten odpowiada trybowi $06 systemu operacyjnego.

Tryb C

    W tym trybie pixel ma wysokość jednej linii ekranu i szerokość jednego cyklu koloru. Pixel jest więc prostokątny. W jednej linii znajduje się 160 pixeli. Maksymalna liczba linii obrazu wynosi 192/1=192. ANTIC dysponuje przy tym dwoma kolorami. Do wyboru koloru pixela potrzebny jest jeden bit. Razem dane całej linii zajmują 160/1=160 bitów, czyli 160/8=20 bajtów. Każdy skasowany bit w pamięci obrazu powoduje wybór koloru z rejestru COLBAK, a każdy bit ustawiony z rejestru COLPF0. Tryb ten odpowiada trybowi $0E systemu operacyjnego.

Tryb D

    W tym trybie pixel ma wysokość dwóch linii ekranu i szerokość jednego cyklu koloru. W jednej linii znajduje się więc 160 pixeli. Maksymalna liczba linii obrazu wynosi 192/2=96. ANTIC dysponuje przy tym dwoma kolorami. Do wyboru koloru pixela potrzebne są dwa bity. Razem dane całej linii zajmują 160*2=320 bitów, czyli 320/8=40 bajtów. Każda para bitów służy do wyboru koloru według schematu:
             para bitów 00 - rejestr COLBAK
             para bitów 01 - rejestr COLPF0
             para bitów 10 - rejestr COLPF1
             para bitów 11 - rejestr COLPF2
    Tryb ten odpowiada trybowi $07 systemu operacyjnego.

Tryb E

    W tym trybie pixel ma wysokość jednej linii ekranu i szerokość jednego cyklu koloru. Pixel jest więc prostokątny. W jednej linii znajduje się 160 pixeli. Maksymalna liczba linii obrazu wynosi 192/1=192. ANTIC dysponuje przy tym czterema kolorami. Do wyboru koloru pixela potrzebne są dwa bity. Razem dane całej linii zajmują 160*2=320 bitów, czyli 320/8=40 bajtów. Pełna pamięć obrazu w tym trybie (192 linie) przekracza granicę 4 KB. Każda para bitów wybiera kolor według schematu:
             para bitów 00 - rejestr COLBAK
             para bitów 01 - rejestr COLPF0
             para bitów 10 - rejestr COLPF1
             para bitów 11 - rejestr COLPF2
    Tryb ten odpowiada trybowi $0F systemu operacyjnego.

Tryb F

    W tym trybie pixel ma wysokość jednej linii ekranu i szerokość pół cyklu koloru. W jednej linii znajduje się więc 320 pixeli. Maksymalna liczba linii obrazu wynosi 192/1=192. Ponieważ nie można dokonać zmiany koloru w obrębie jednego cyklu koloru, to pixele mogą się różnić tylko jasnością. Do wyboru jasności pixela potrzebny jest jeden bit. Razem dane całej linii zajmują 320*1=320 bitów, czyli 320/8=40 bajtów. Pełna pamięć obrazu w tym trybie (192 linie) przekracza granicę 4 KB. Każdy skasowany bit w pamięci obrazu powoduje wybór koloru z rejestru COLPF2, a każdy bit ustawiony wybiera jasność z rejestru COLPF1, a kolor z COLPF2. Tryb ten odpowiada trybowi $08 systemu operacyjnego.

    Trzy dodatkowe tryby bitowe można uzyskać przez zmianę dwóch najstarszych (6 i 7) bitów rejestru GTIACTL (GTIA ConTroL). Normalnie mają one wartość 00 i obraz jest tworzony przez ANTIC tak, jak to opisano przy poszczególnych trybach bitowych i znakowych. System operacyjny dla uzyskania dodatkowych trybów wybiera tryb ANTIC-a F ($08 OS) i zmienia bity w GTIACTL. Pomimo, iż OS nie przewiduje zmiany sposobu pracy GTIA w innych trybach ANTIC-a, to jest to możliwe i pozwala niekiedy na uzyskanie ciekawych efektów graficznych (także w trybach znakowych).

    Ponieważ ANTIC w dodatkowych trybach OS pracuje w trybie F, to możliwe jest uzyskanie na ekranie 192 linii po 320 punktów ekranu w każdej. Dane każdej linii składają się więc z 40 bajtów. Sposób interpretacji tych danych jest jednak inny i zależy od stanu bitów 6 i 7 w GTIACTL. Zawsze jednak GTIA interpretuje każde cztery bity (pół bajtu) danych pamięci obrazu jako dane dla jednego pixela. Można więc uzyskać w jednej linii 80 pixeli, z których każdy ma wysokość jednej linii ekranu i szerokość dwóch cykli koloru.

Tryb $09 (OS)

    Tryb ten uzyskiwany jest przy wartości najstarszych bitów GTIACTL równej 01. Wartość bitów każdego pixela jest interpretowana jako stopień jasności. Kolor jest przy tym pobierany z rejestru COLBAK. Pozwala to na uzyskanie 16 stopni jasności jednego koloru.

Tryb $0A (OS)

    Tryb ten uzyskiwany jest przy wartości najstarszych bitów GTIACTL równej 10. Wartość bitów każdego pixela jest interpretowana jako numer rejestru koloru. Ponieważ GTIA posiada dziewięć rejestrów, to można uzyskać 9 różnych barw o różnych jasnościach.

Tryb $0B (OS)

    Tryb ten uzyskiwany jest przy wartości najstarszych bitów GTIACTL równej 11. Wartość bitów każdego pixela jest interpretowana jako numer barwy. Jasność jest przy tym pobierana z rejestru COLBAK. Pozwala to na uzyskanie 16 różnych barw o jednakowym stopniu jasności.

    Zbiorcze zestawienie trybów bitowych zawiera poniższa tabela. Liczba linii i rozmiar pamięci podane są w niej dwukrotnie - pierwsza wartość dotyczy obrazu z oknem tekstowym, a druga bez. Rozmiar pamięci określa liczbę bajtów zajmowaną przez pamięć obrazu i program ANTIC-a.
   tryb   tryb liczba  liczba  liczba     bajty    rozmiar
  ANTIC-a  OS  linii   pixeli  kolorów   w linii   pamięci

     8    $03   20/24    40       4        10      434/432
     9    $04   40/48    80       2        10      694/696
     A    $05   40/48    80       4        20     1174/1176
     B    $06   80/96   160       2        20     2174/2184
     C    $0E  160/192  160       2        20     4270/4296
     D    $07   80/96   160       4        40     4190/4200
     E    $0F  160/192  160       4        40     8112/8138
     F    $08  160/192  320      1,5       40     8112/8138
     F    $09   -/192    80    1(16 j.)    40       -/8138
     F    $0A   -/192    80       9        40       -/8138
     F    $0B   -/192    80    16(1 j.)    40       -/8138

7.3. Tryby znakowe

    W trybach znakowych obraz jest tworzony w sposób odmienny niż w trybach bitowych. W trybach bitowych dane z pamięci obrazu są bezpośrednio wyświetlane na monitorze. W trybach znakowych bajty danych są interpretowane jako numery znaków w zestawie. ANTIC pobiera więc z pamięci obrazu numer znaku i według tego numeru wybiera z zestawu znak do wyświetlenia. Dane linii są przy tym umieszczane w specjalnym rejestrze, podobnie jak w trybach bitowych.

    Adres zestawu znaków (a właściwie jego starszy bajt) jest umieszczony w rejestrze CHBASE (CHaracter BASE - $D409). Każdy znak zajmuje w tym zestawie 8 bajtów. Przy tworzeniu linii ekranu obliczany jest adres konkretnego bajtu pamięci, który należy umieścić na ekranie. Odbywa się to według wzoru:
    CHBASE*$0100 + numer_znaku*$08 + numer_linii_ekranu
    Dla zaoszczędzenia czasu CPU numer znaku jest pobierany z rejestru ANTIC-a, do którego zostały przepisane dane linii. Numer znaku nie jest wykorzystywany w całości do wyboru znaku. Jego bity 6 i 7 lub tylko 7 służą do wyboru koloru znaku. Tak więc w trybach używających sześciu bitów można przedstawić 64 znaki, a w gdy używane jest siedem bitów, to zestaw zawiera 128 znaków. Ponieważ z rejestru CHBASE odczytuje się także tylko część bitów (1-7 lub 2-7), to zestaw znaków powinien rozpoczynać się odpowiednio od granicy 512 bajtów lub 1 KB. Sposób tworzenia adresu bajtu danych dla różnych trybów jest przedstawiony na rysunkach 12 i 13, które znajdują się na następnej stronie.

    Ponadto w trybach 2 i 3 wyglądem znaków na ekranie steruje rejestr CHRCTL (CHaRacter ConTroL - $D401). Bity 3-7 tego rejestru są niewykorzystane, a pozostałe mają następujące znaczenie:

    Bit 0 działa tylko na znaki, które mają ustawiony bit 7.

Gdy jest równy jeden, znaki te nie są wyświetlane na ekranie. Przez okresowe przełączanie tego bitu można więc uzyskać miganie znaku.

    Bit 1 także działa tylko na znaki, które mają ustawiony bit 7. Gdy jest równy jeden, znaki te mają zamienione kolory punktów i tła. Powoduje to wyświetlenie znaku w negatywie.

    Bit 2 odwraca kolejność pobierania danych znaku z pamięci. Gdy na początku wyświetlania linii obrazu jest ustawiony, to wszystkie znaki w tej linii są odwrócone "do góry nogami".
        CHBASE          numer znaku     licznik linii ekranu
  +-+-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+    +-+-+-+-+-+-+-+-+
  |7|6|5|4|3|2|1|0|  |7|6|5|4|3|2|1|0|    |7|6|5|4|3|2|1|0|
  +-+-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+    +-+-+-+-+-+-+-+-+
  |             |    |   |           |              |     |
  +------+------+    +-+-+-----+-----+              +--+--+
         |             |       |                       |
         |             v       |                       |
         |       wybór koloru  |                       |
         |                     |                       |
         +-----------+         +--+        +-----------+
                     |            |        |
                     v            v        v
              +------+------+-----+-----+--+--+
              |             |           |     |
              +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
              |F|E|D|C|B|A|9|8|7|6|5|4|3|2|1|0|
              +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
             adres danych linii znaku w zestawie

      Rys.12. Tworzenie adresu znaku z wykorzystaniem 6 bitów

      
        CHBASE          numer znaku     licznik linii ekranu
  +-+-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+    +-+-+-+-+-+-+-+-+
  |7|6|5|4|3|2|1|0|  |7|6|5|4|3|2|1|0|    |7|6|5|4|3|2|1|0|
  +-+-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+    +-+-+-+-+-+-+-+-+
  |           |      | |             |              |     |
  +-----+-----+      +++------+------+              +--+--+
        |             |       |                        |
        |             v       |                        |
        |       wybór koloru  |                        |
        |                     |                        |
        +-----------+         +--+         +-----------+
                    |            |         |
                    v            v         v
              +-----+-----+------+------+--+--+
              |           |             |     |
              +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
              |F|E|D|C|B|A|9|8|7|6|5|4|3|2|1|0|
              +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
             adres danych linii znaku w zestawie

      Rys.13. Tworzenie adresu znaku z wykorzystaniem 7 bitów
    ANTIC dysponuje sześcioma trybami znakowymi. Tryb 3 jest niedostępny dla systemu operacyjnego. Pozostałe tryby mają swoje odpowiedniki w trybach OS. Poniżej opisane są wszystkie tryby znakowe. Podane wartości liczbowe odnoszą się, o ile nie określono inaczej, do normalnej szerokości obrazu, równej 160 cykli koloru.

Tryb 2

    W tym trybie znak składa się z ośmiu linii po osiem pixeli, z których każdy ma szerokość pół cyklu koloru. W jednej linii znajduje się więc 40 znaków (czyli 40 bajtów). Maksymalna liczba linii obrazu wynosi 192/8=24. Ponieważ nie można dokonać zmiany koloru w obrębie jednego cyklu koloru, to pixele mogą się różnić tylko jasnością. Każdy bit znaku określa jasność punktu ekranu. Bit skasowany powoduje wybór koloru punktu z rejestru COLPF2, a bit ustawiony wybiera jasność z rejestru COLPF1, a kolor z COLPF2. Do określenia adresu znaku wykorzystywane jest siedem bitów, więc zestaw zawiera 128 znaków. Najstarszy bit (7) steruje wyglądem znaku poprzez rejestr CHRCTL. Tryb ten odpowiada trybowi $00 systemu operacyjnego i jest używany przez edytor.

Tryb 3

    W tym trybie znak składa się z dziesięciu linii po osiem pixeli, z których każdy ma szerokość pół cyklu koloru. W jednej linii znajduje się więc 40 znaków (czyli 40 bajtów). Kolory są wybierane analogicznie, jak w trybie 2 i bit 7 także steruje wyglądem znaku poprzez rejestr CHRCTL. W trybie 3 szczególny jest sposób tworzenia znaków. Ponieważ dane znaku składają się z ośmiu bajtów, to normalnie dwie ostatnie linie ekranu są puste. Inaczej jest przy tworzeniu znaków z ostatniej ćwiartki zestawu (o kodach $60-$7F). ANTIC pozostawia w tym przypadku puste dwie pierwsze linie, zaś dwa pierwsze bajty danych znaku umieszcza w dwóch ostatnich liniach (zob. rys. 14). Takie tworzenie znaków wymaga zaprojektowania odrębnego zestawu znaków, w którym będą przedefiniowane znaki zawarte w ostatniej ćwiartce. Dzięki temu tryb ten jest szczególnie przydatny do tworzenia tekstu (wykorzystuje go np. "SpeedScript"). Nie ma on jednak odpowiednika w systemie operacyjnym.
   znaki o kodach $00-$5F         znaki o kodach $60-$7F
   +--------+     +--------+      +--------+     +--------+
   |        |     |        |      |    XX  |--+  |        |
   | XX  XX |     | XX  XX |      | XXXX   |-+|  |        |
   | XX  XX |     | XX  XX |      |        | ||  |        |
   |  XXXX  |---->|  XXXX  |      | XX  XX | ||  | XX  XX |
   |   XX   |     |   XX   |      | XX  XX | ||  | XX  XX |
   |   XX   |     |   XX   |      | XX  XX | ||  | XX  XX |
   |   XX   |     |   XX   |      |  XXXXX | ||  |  XXXXX |
   |        |     |        |      |     XX | ||  |     XX |
   +--------+   ->|        |      +--------+ |+->|    XX  |
        2 linie ->|        |                 +-->| XXXX   |
                  +--------+                     +--------+

         Rys.14. Tworzenie znaków w trybie 3 ANTIC-a

Tryb 4

    W tym trybie znak składa się z ośmiu linii po cztery pixele, z których każdy ma szerokość jednego cyklu koloru. W jednej linii znajduje się więc 40 znaków (40 bajtów). Maksymalna liczba linii obrazu wynosi 192/8=24. Do określenia adresu znaku wykorzystywane jest siedem bitów, więc zestaw zawiera 128 znaków. ANTIC dysponuje przy tym pięcioma kolorami. Kolor pixela jest wybierany przez dwa bity danych znaku oraz bit 7 numeru znaku. Każda para bitów służy do wyboru koloru według schematu:
             para bitów 00 - rejestr CLOBAK
             para bitów 01 - rejestr COLPF0
             para bitów 10 - rejestr COLPF1
             para bitów 11 - rejestr COLPF2 (gdy bit 7 = 0)
             para bitów 11 - rejestr COLPF3 (gdy bit 7 = 1)
    Tryb ten odpowiada trybowi $0C systemu operacyjnego. Ponieważ w polu o szerokości czterech pixeli trudno jest zdefiniować literę, to tryb 4 jest wykorzystywany głównie do tworzenia wielokolorowej grafiki (np. w grach), która zajmuje przy tym stosunkowo niewielki obszar pamięci.

Tryb 5

    W tym trybie znak składa się z szesnastu linii po cztery pixele, w których każdy ma szerokość jednego cyklu koloru i zajmuje dwie linie ekranu (znak jest dwukrotnie wyższy niż w trybie 4). W jednej linii znajduje się więc 40 znaków (40 bajtów). Maksymalna liczba linii obrazu wynosi 192/16=12. Do określenia adresu znaku wykorzystywane jest siedem bitów, więc zestaw zawiera 128 znaków. ANTIC dysponuje przy tym pięcioma kolorami. Kolor pixela jest wybierany przez dwa bity danych znaku oraz bit 7 numeru znaku. Każda para bitów służy do wyboru koloru według schematu:
             para bitów 00 - rejestr CLOBAK
             para bitów 01 - rejestr COLPF0
             para bitów 10 - rejestr COLPF1
             para bitów 11 - rejestr COLPF2 (gdy bit 7 = 0)
             para bitów 11 - rejestr COLPF3 (gdy bit 7 = 1)
    Tryb ten odpowiada trybowi $0D systemu operacyjnego.

Tryb 6

    W tym trybie znak składa się z ośmiu linii po osiem pixeli, z których każdy ma szerokość jednego cyklu koloru. W jednej linii znajduje się więc 20 znaków (20 bajtów). Maksymalna liczba linii obrazu wynosi 192/8=24. Do określenia adresu znaku wykorzystywane jest sześć bitów, więc zestaw zawiera 64 znaki. ANTIC dysponuje przy tym pięcioma kolorami. Kolor tła jest zawsze ustalany przez rejestr COLBAK. Kolor wszystkich pixeli znaku jest wybierany przez dwa najstarsze bity numeru znaku. Ta para bitów służy do wyboru koloru według schematu:
             para bitów 00 - rejestr COLPF0
             para bitów 01 - rejestr COLPF1
             para bitów 10 - rejestr COLPF2
             para bitów 11 - rejestr COLPF3
    Tryb ten odpowiada trybowi $01 systemu operacyjnego.

Tryb 7

    W tym trybie znak składa się z szesnastu linii po osiem pixeli, z których każdy ma szerokość jednego cyklu koloru i zajmuje dwie linie ekranu. W jednej linii znajduje się więc 20 znaków (20 bajtów). Maksymalna liczba linii obrazu wynosi 192/16=12. Do określenia adresu znaku wykorzystywane jest sześć bitów, więc zestaw zawiera 64 znaki. ANTIC dysponuje przy tym pięcioma kolorami. Kolor tła jest zawsze ustalany przez rejestr COLBAK. Kolor wszystkich pixeli znaku jest wybierany przez dwa najstarsze bity numeru znaku. Ta para bitów służy do wyboru koloru według schematu:
             para bitów 00 - rejestr COLPF0
             para bitów 01 - rejestr COLPF1
             para bitów 10 - rejestr COLPF2
             para bitów 11 - rejestr COLPF3
    Tryb ten odpowiada trybowi $02 systemu operacyjnego.

    Warto na koniec wskazać różnice pomiędzy poszczególnymi trybami znakowymi. Tryby 6 i 7 mają znaki o szerokości dwukrotnie większej, a tryby 5 i 7 o wysokości dwukrotnie większej niż pozostałe. W trybach 4-7 dostępne jest 5 kolorów, lecz w różny sposób. W trybach 4 i 5 kolor określają bity znaku, a w trybach 6 i 7 bity numeru znaku. W pierwszym przypadku można więc uzyskać znak wielokolorowy, zaś w drugim cały znak musi mieć jednakowy kolor.

    Zbiorcze zestawienie trybów znakowych zawiera poniższa tabela. Liczba linii i rozmiar pamięci podane są w niej dwukrotnie - pierwsza wartość dotyczy obrazu z oknem tekstowym, a druga bez. Rozmiar pamięci określa liczbę bajtów zajmowaną przez pamięć obrazu i program ANITC-a.
   tryb   tryb liczba  liczba  liczba     bajty    rozmiar
  ANTIC-a  OS  linii   znaków  kolorów   w linii   pamięci

     2    $00   -/24     40      1,5       40       -/992
     3     -    -/20     40      1,5       40       -/828
     4    $0C   20/24    40       5        40     1154/1152
     5    $0D   10/12    40       5        40      664/660
     6    $01   20/24    20       5        20      674/672
     7    $02   10/12    20       5        20      424/420

7.4. Przesuwanie obrazu

    Często informacja, która powinna być wyświetlona na ekranie, po prostu się na nim nie mieści. Konieczne jest więc przemieszczenie tej informacji. Większość komputerów wymaga przepisania całej zawartości pamięci obrazu na nowe miejsce. Ponieważ w Atari adres pamięci obrazu jest zmienny, to wystarczy tylko zmienić ten adres w rozkazie LMS i już cała zawartość ekranu jest przesunięta.

    Wykonanie takiego przesunięcia w pionie jest wyjątkowo proste. Dane obrazu muszą obejmować więcej wierszy, a adres LMS wskazuje początek odpowiedniego wiersza (rys. 15). Przesuw obrazu uzyskuje się przez zmianę adresu LMS, czyli przez zmianę tylko dwóch bajtów. Da to zadawalający efekt nawet w tak wolnym języku, jak Atari Basic.
                      ..................
                      ..................
                     +------------------+
                     |..................|
                     |..................|
                     |..................|
                     |..................|
                     |..................|
                     |..................|
                     +------------------+
                      ..................
                      ..................

        Rys.15. Pamięć obrazu przy przesuwaniu pionowym
    Gdy ten sposób zostanie zastosowany do przesuwania obrazu w poziomie, to uzyskany efekt będzie niezbyt interesujący. Po zmniejszeniu adresu w rozkazie LMS wszystkie znaki z prawej krawędzi obrazu znajdą się na lewej, a przy zwiększeniu odwrotnie.

    Aby tego uniknąć należy rozkaz LMS umieścić w każdej linii obrazu, a dane obrazu muszą zawierać więcej informacji dla każdej linii (rys. 16). Oczywiście szybka zmiana kilkunastu lub kilkudziesięciu adresów wymaga już użycia języka maszynowego. Ponadto musi to zostać wykonane w czasie, gdy obraz nie jest tworzony, a więc podczas przerwania VBLK. Mimo to i tak jest to dużo prostsze i szybsze niż przepisywanie całej zawartości pamięci obrazu.
                     +------------------+
                .....|..................|.....
                .....|..................|.....
                .....|..................|.....
                .....|..................|.....
                .....|..................|.....
                .....|..................|.....
                     +------------------+

        Rys.16. Pamięć obrazu przy przesuwaniu poziomym
    Opisana wyżej metoda ma jedną zasadniczą wadę. Obraz nie może być przesuwany poziomo po jednym punkcie ekranu, a pionowo można to uzyskać tylko w trybach, w których linia obrazu składa się z jednej linii ekranu. Przesuwanie ekranu odbywa się więc skokowo, co nie wygląda zbyt ciekawie.

    Konstrukcja ANTIC-a umożliwia jednak również przesuwanie obrazu po jednym punkcie lub po jednej linii ekranu. Taki przesuw zwany jest przesuwem delikatnym. Uzyskanie tego efektu jest możliwe dzięki rejestrom ANTIC-a HSCROL (Horizontal SCROLling - $D404) i VSCROL (Vertical SCROLling - $D405).

    Rejestry te wpływają tylko na linie obrazu, w których ustawiony jest odpowiednio bit 4 (HSC) lub bit 5 (VSC). Ponadto linia nie może być jednocześnie przesuwana poziomo i pionowo.

7.4.1. Przesuw pionowy

    Zanim przystąpimy do opisu delikatnego przesuwu obrazu w pionie, musimy poznać jeszcze jeden wewnętrzny licznik ANTIC-a. Licznik ten nazywa się DCTR (Delta CounTeR) i zlicza linie ekranu w każdej linii obrazu. Ponieważ zliczanie rozpoczyna się od zera, to najwyższy stan DCTR jest o jeden mniejszy od liczby linii ekranu w linii obrazu dla danego trybu.

    ANTIC przesuwa w górę te linie obrazu, które mają ustawiony bit 5, o liczbę zawartą w rejestrze VSCROL. Jest to wykonywane w następujący sposób. Po napotkaniu pierwszej linii obrazu, która ma ustawiony bit 5, licznik DCTR rozpoczyna zliczanie od wartości umieszczonej w VSCROL zamiast od zera. Powoduje to wyświetlenie tylko dolnej części tej linii. Następne linie z ustawionym bitem 5 są tworzone normalnie, a więc DCTR liczy od zera do wartości maksymalnej dla danego trybu. Dopiero po napotkaniu pierwszej linii ze skasowanym bitem 5 zmienia się sposób liczenia. DCTR zlicza teraz linie ekranu od zera do wartości zawartej w VSCROL, dzięki czemu na ekranie pojawia się tylko górna część tej linii.
           DCTR        DCTR        DCTR        DCTR        DCTR
    +--------+  +--------+  +--------+  +--------+  +--------+
    |        |0 |  XXXX  |2 | XX  XX |4 | XX  XX |6 |        |0
    |   XX   |1 | XX  XX |3 | XXXXXX |5 |        |7 | XXXXX  |1
    |  XXXX  |2 | XX  XX |4 | XX  XX |6 |        |0 | XX  XX |2
    | XX  XX |3 | XXXXXX |5 |        |7 | XXXXX  |1 | XXXXX  |3
    | XX  XX |4 | XX  XX |6 |        |0 | XX  XX |2 | XX  XX |4
    | XXXXXX |5 |        |7 | XXXXX  |1 | XXXXX  |3 | XX  XX |5
    | XX  XX |6 |        |0 | XX  XX |2 | XX  XX |4 | XXXXX  |6
    |        |7 | XXXXX  |1 | XXXXX  |3 | XX  XX |5 |        |7
    +--------+  +--------+  +--------+  +--------+  +--------+
VSCROL  0           2           4           6           0
linia   0           0           0           0           1

         Rys.17. Delikatny przesuw obrazu w pionie
    Przy pomocy rejestru VSCROL można przesuwać obraz tylko w obrębie jednej linii. Aby zwiększyć zakres przesuwania obrazu trzeba połączyć przesuwanie delikatne ze zgrubnym (na rys. 17 jest to zasygnalizowane przez numer linii).

    Oczywiście zarówno zmiana stanu rejestru VSCROL, jak i zmiana adresu pamięci obrazu musi być wykonana podczas przerwania VBLK. Odpowiedni fragment procedury, która wykonuje tą operację, jest przedstawiony poniżej (wartości oznaczone $xxxx zależą od położenia w pamięci procedury, prorgamu ANTIC-a i danych obrazu). Zostały przy tym poczynione następujące założenia:

    1. Obraz jest przesuwany tylko w pionie, a jego pamięć jest zorganizowana w sposób pokazany na rys. 15.

    2. Przesuwanie obrazu odbywa się tylko w górę, a po osiągnięciu końca pamięci obrazu (oznaczonego przez FINISH) przesuwanie się kończy.

    3. Etykieta MSC oznacza miejsce programu ANTIC-a, w którym znajduje się adres pamięci obrazu.

    4. Obraz jest tworzony w takim trybie ANTIC-a, w którym znak ma wysokość ośmiu linii ekranu i szerokość 8 punktów ekranu (tryby 2 lub 4).

    5. We wszystkich rozkazach tworzenia linii trybu, oprócz ostatniego bit 5 jest ustawiony.
            0100 ;Vertical Fine Scrolling
            0110 ;
            0120 JEXITVB = $E462
            0130 VSCROL = $D405
            0140 FINISH = $xxxx
            0150 MSC   = $xxxx
            0160 ;
            0170     *=  $xxxx
            0180 ;
            0190     LDA MSC+1
            0200     CMP # >FINISH
            0210     BCC CONT
            0220     LDA MSC
            0230     CMP # <FINISH
            0240     BCS EXIT
            0250 CONT INC VSCROL
            0260     LDA VSCROL
            0270     CMP #$08
            0280     BNE EXIT
            0290     LDA #$00
            0300     STA VSCROL
            0310     CLC
            0320     LDA MSC
            0330     ADC #$28
            0340     STA MSC
            0350     BCC EXIT
            0360     INC MSC+1
            0370 EXIT JMP JEXITVB
    Powyższa procedura ma niewielkie zastosowanie praktyczne, gdyż po jej uruchomieniu obraz szybko przesunie się w górę i tak już pozostanie. Aby nadać jej znaczenie praktyczne trzeba napisać drugą procedurę, która będzie przesuwać obraz do góry (zob. niżej) oraz uzależnić wykonanie jednej z tych procedur od jakiegoś parametru. Może to być położenie joysticka lub naciśnięcie klawisza.

    Dla przesuwania obrazu w dół trzeba jeszcze przyjąć dodatkowe założenie, że dane obrazu rozpoczynają się od adresu START i po jego osiągnięciu przesuwanie zostanie przerwane.
            0100 ;Vertical Fine Scrolling 2
            0110 ;
            0120 JEXITVB = $E462
            0130 VSCROL = $D405
            0140 START = $xxxx
            0150 MSC   = $xxxx
            0160 ;
            0170     *=  $xxxx
            0180 ;
            0190     LDA # >START
            0200     CMP MSC+1
            0210     BCC CONT
            0220     LDA # <START
            0230     CMP MSC
            0240     BCS EXIT
            0250 CONT DEC VSCROL
            0260     LDA VSCROL
            0270     BPL EXIT
            0280     LDA #$08
            0290     STA VSCROL
            0300     SEC
            0310     LDA MSC
            0320     SBC #$28
            0330     STA MSC
            0340     BCS EXIT
            0350     DEC MSC+1
            0360 EXIT JMP JEXITVB

7.4.2. Przesuw poziomy

    Ten sam problem występuje przy przesuwaniu poziomym, gdyż każdy bajt danych tworzy kilka pixeli lub cały znak. Przesunięcie o cały bajt przesuwa więc obraz o kilka cykli koloru. Rolę licznika dla przesuwu poziomego pełni w ANTIC-u rejestr HSCROL - identycznie jak VSCROL dla przesuwu pionowego. Między tymi rejestrami jest jednak pewna różnica. O ile VSCROL pozwala przesunąć obraz o jedną linię, to HSCROL przesuwa o jeden cykl koloru, a nie o jeden punkt. Przesunięcie bowiem obrazu o jeden punkt (a więc jeden bit w danych) spowodowałoby zmianę kolorów obrazu, gdyż kolory są zwykle ustalane przez pary bitów.

    Rejestr VSCROL ma również ograniczenie podobne do tego, jakie wprowadza licznik DCTR. ANTIC uwzględnia jedynie cztery młodsze bity HSCROL, co pozwala przesunąć obraz jedynie o 15 cykli koloru. Większe przesunięcie można uzyskać przez połączenie delikatnego i zgrubnego przesuwu.

    Tworzenie obrazu przesuniętego jest analogiczne, jak przy przesuwie pionowym. Po napotkaniu rozkazu tworzenia linii obrazu, który ma ustawiony bit 4, ANTIC opuszcza liczbę cykli koloru odpowiadającą zawartości HSCROL, a brakujące cykle koloru dodaje na końcu linii. Te brakujące cykle należą już do następnego znaku, więc przy przesuwie poziomym dane linii obrazu muszą być dłuższe conajmniej o jeden bajt. Ponadto pamięć obrazu musi być zorganizowana w sposób pokazany na rys. 16. Dlatego każdy rozkaz tworzenia linii musi mieć ustawiony bit 6 (LMS) w celu ponownego ustawienia licznika pamięci obrazu.

    Procedury obsługujące przesuw poziomy są zbliżone do procedur przesuwu pionowego, więc zamieszczona zostanie tylko jedna i już bez komentarza (założenia pozostają bez zmian).
            0100 ;Horizontal Fine Scrolling
            0110 ;
            0120 JEXITVB = $E462
            0130 HSCROL = $D404
            0140 FINISH = $xxxx
            0150 MSC   = $xxxx
            0160 ;
            0170     *=  $xxxx
            0180 ;
            0190     LDA MSC+1
            0200     CMP # >FINISH
            0210     BCC CONT
            0220     LDA MSC
            0230     CMP # <FINISH
            0240     BCS EXIT
            0250 CONT INC HSCROL
            0260     LDA HSCROL
            0270     CMP #$04
            0280     BNE EXIT
            0290     LDA #$00
            0300     STA HSCROL
            0310     LDX #$46
            0320 LOOP INC MSC,X
            0330     BNE NEXT
            0340     INC MSC+1,X
            0350 NEXT DEX
            0360     DEX
            0370     DEX
            0380     BPL LOOP
            0390 EXIT JMP JEXITVB
Zientara Wojciech: Mapa pamięci Atari XL/XE. Procedury wejścia-wyjścia, SOETO, Warszawa, 1988.