ANTIC
Z Wikipedii
ANTIC - (z ang. Alpha-Numeric Television Interface Controller) - układ wizyjny montowany w ośmiobitowych komputerach domowych Atari, zaprojektowany w 1978 roku.
Antic jest jedynym chyba układem graficznym montowanym w komputerach ośmiobitowych, który zasługuje na miano mikroprocesora graficznego; dysponuje bowiem własnym, wykonywanym pięćdziesiąt razy na sekundę programem, który definiuje obraz wyświetlany przez komputer na monitorze. Na czas pobierania instrukcji tego programu, w celu zapobieżenia zakłóceniom obrazu, Antic wstrzymuje działanie centralnego procesora i przejmuje kontrolę nad magistralami systemu.
Szerokość generowanego obrazu określa "rejestr kontroli dostępu do pamięci" (DMACTL); może ona wynosić 0, 256, 320 lub 384 piksele trybu najwyższej rozdzielczości, czyli odpowiednio 0, 32, 40 lub 48 kolumn w trybie znakowym używanym przez systemowy edytor ekranowy.
Wysokość obrazu definiuje wspomniany wyżej program, zwany Display List. Wysokość ta może wahać się w zakresie od zera do 240 linii skaningowych (pikseli) trybu najwyższej rozdzielczości, czyli do 30 wierszy trybu znakowego używanego przez systemowy edytor ekranowy. Powyżej tej wartości następuje zerwanie synchronizacji pionowej.
Antic generuje zarówno tryby tekstowe, jak i graficzne. Tryby tekstowe wymagają zdefiniowania zestawu 64 lub 128 znaków w matrycy 8x8 pikseli, druga połowa zestawu (z całości 256 znaków) jest automatycznie generowana jako powtórzenie pierwszej z odwróceniem kolorów (czarne znaki na białym tle). Układ sprzętowo realizuje takie funkcje jak np. tłumienie znaków w inverse video (stają się niewidoczne), odwracanie kolorów (są wyświetlane jak znaki "normalne") oraz lustrzane odbicie wszystkich znaków w pionie.
Trzeba zaznaczyć, że Antic jest w stanie generować jedynie obraz monochromatyczny, za dodanie kolorów odpowiedzialny jest układ CTIA (w Atari 400/800) lub GTIA (w Atari 800XL i następnych).
[edytuj] Tryby znakowe
Dostępnych jest sześć trybów tekstowych:
- tryb $02: tryb monochromatyczny o szerokości 32, 40 lub 48 znaków, przy czym każdy znak ma wysokość ośmiu pikseli. Trybu tego używa system operacyjny jako trybu wyświetlania systemowej konsoli tekstowej o wielkości 40x24 znaki.
- tryb $03: odmiana trybu powyższego. Wszystko jest tak samo, z wyjątkiem tego, że znaki wyświetlane są w matrycy 8x10 pikseli. Układ sprzętowo dodaje dwie puste linie do wszystkich znaków, za wyjątkiem ostatniej ćwiartki zestawu znaków (w wewnętrznej organizacji Antic-a ostatnia ćwiartka generatora znaków to małe litery alfabetu angielskiego); w tym wypadku dwie pierwsze linie matrycy znaku wyświetlane są jako dwie ostatnie linie znaku. Tryb ten jest przydatny dla edytorów tekstu (i w istocie jest przez nie wykorzystywany), bo pozwala na wyświetlanie małych liter z "wyrazistymi" ogonkami.
- tryb $04: odpowiednik trybu $02, ale matryca znaków interpretowana jest graficznie tak, by każde dwa bity tworzyły jeden piksel. Piksel ten może być w jednym z czterech kolorów, przy czym jeśli oba bity piksela są zapalone, to wybór rejestru koloru dodatkowo zależy od tego, czy bit 7 znaku jest zapalony czy nie. Kolory wybierane są z palety 128 barw przez pięć rejestrów kolorów. Jest to tryb 12 systemu operacyjnego o wielkości 40x24 znaki w pięciu kolorach. Tryb ten jest bardzo często wykorzystywany w grach ze względu na stosunkowo dużą liczbę kolorów i niewielkie przy tym zapotrzebowanie na pamięć (ekran o rozdzielczości 160x192 piksele w 5 kolorach zajmuje tylko 960 bajtów, plus generator znaków).
- tryb $05: odmiana trybu $04 o dwukrotnie mniejszej rozdzielczości pionowej; w systemie operacyjnym jest to tryb 13 o wielkości 40x12 znaków w pięciu kolorach.
- tryb $06: jest to tryb znakowy, w którym znak ma rozmiary 8x8 pikseli, ale jeden piksel tego trybu ma wielkość dwóch pikseli trybu najwyższej rozdzielczości. W efekcie w jednej linii mieszczą się (w zależności od wybranej szerokości obrazu) 16, 20 lub 24 znaki. Każdy znak może być wyświetlony w jednym z czterech kolorów, które wybierają dwa najstarsze bity jego wartości. Kolory te są wybierane z palety 128 barw przez cztery rejestry kolorów. Dodatkowo do dyspozycji jest oddzielny kolor tła wybierany przez osobny rejestr koloru, również z palety 128. Jest to tryb 1 systemu operacyjnego.
- tryb $07: odmiana trybu $06 o dwukrotnie mniejszej rozdzielczości pionowej. Jest to tryb 2 systemu operacyjnego.
[edytuj] Tryby bitowe
Oprócz trybów znakowych dostępnych jest osiem trybów graficznych:
- tryb $08: jest to tryb graficzny, w którym jeden piksel ma rozmiary 8x8 pikseli trybu najwyższej rozdzielczości. Dostępne sa cztery kolory z palety 128. Jest to tryb 3 systemu operacyjnego, o rozdzielczości 40x24 piksele w 4 kolorach.
- tryb $09: jest to tryb graficzny, w którym piksel ma rozmiary 4x4 piksele trybu najwyższej rozdzielczości. Dostępne są dwa kolory z palety 128. Jest to tryb 4 systemu operacyjnego, o rozdzielczości 80x48 pikseli w 2 kolorach.
- tryb $0a: jest to odpowiednik trybu $09, lecz dostępne są 4 kolory z palety 128. Jest to tryb 5 systemu operacyjnego.
- tryb $0b: w tym trybie piksel ma rozmiar 2x2 piksele trybu najwyższej rozdzielczości. Dostępne są dwa kolory. Jest to tryb 6 systemu operacyjnego.
- tryb $0c: w tym trybie piksel ma szerokość dwóch pikseli trybu najwyższej rozdzielczości i wysokość jednej linii skaningowej. Jest to tryb 14 systemu operacyjnego, 160x192 piksele w dwóch kolorach z palety 128.
- tryb $0d: jest to odpowiednik trybu $0b w 4 kolorach, czyli tryb 7 systemu operacyjnego o rozdzielczości 160x96 w 4 kolorach.
- tryb $0e: jest to kolorowy odpowiednik trybu $0c, czyli tryb 15 systemu operacyjnego, 160x192 piksele w 4 kolorach.
- tryb $0f: jest to monochromatyczny tryb najwyższej rozdzielczości, tryb 8 systemu operacyjnego, 320x192 piksele w jednym z dwóch odcieni tego samego koloru z palety 128.
Podane tu rozmiary ekranu dla poszczególnych trybów, np. 40x24 czy 320x192 to standardowe rozdzielczości wybierane przez system operacyjny. Trzeba jednak pamiętać, że ekran można wedle potrzeb zwęzić do 32 kolumn (256 pikseli) lub poszerzyć do 48 kolumn (384 pikseli) oraz regulować jego wysokość z dokładnością do jednej linii skaningowej (piksela) za pomocą Display List.
System operacyjny oferuje ponadto trzy tryby graficzne "wielokolorowe" o rozdzielczości 80x192 piksele. Dostępnych jest 16 kolorów wybieranych wartością piksela (4 bity na piksel). Pierwszy z tych trybów daje dostęp do 16 odcieni w jednym kolorze (z palety 16), drugi do 16 kolorów w jednym odcieniu, trzeci do 9 kolorów wybranych dowolnie z palety 128 - układ GTIA dysponuje niestety tylko dziewięcioma rejestrami kolorów, dlatego ten ostatni tryb nie pozwala na wybór 16 barw.
Nie są to tryby układu Antic - z punktu widzenia tego układu wszystkie trzy to monochromatyczny tryb najwyższej rozdzielczości. Przekształcenie go w tryb wielokolorowy następuje przez ingerencję w rejestr kontroli układu GTIA (GTIACTL), co zmienia interpretację danych obrazu. Oczywiście w ten sam sposób można przekształcić dowolny inny tryb Antic-a.
Zmieszanie dwóch trybów wielokolorowych - tego z 16 stopniami szarości z tym z 16 kolorami - dzięki pewnej właściwości systemu telewizji PAL daje dostęp do trybu graficznego o rozdzielczości 80x96 pikseli w 256 kolorach (pełne osiem bitów na piksel).
[edytuj] Display List
Jak wspomniano powyżej, wygląd obrazu opisany jest za pomocą tzw. Display List, która jest w istocie programem odłożonym w pamięci komputera i wykonywanym przez mikroprocesor graficzny 50 razy na sekundę.
Rozkazy Display List dzielą się na następujące grupy:
- rozkazy tworzenia linii trybu graficznego
- rozkazy tworzenia linii pustych
- rozkazy ładowania wskaźnika pamięci ekranu
- rozkazy skoków
Czternaście rozkazów tworzenia linii trybu graficznego (lub znakowego) zostało pokrótce omówionych powyżej. Antic interpretuje rozkazy w trakcie tworzenia obrazu, rozkazy tworzenia linii trybu pobierane są sukcesywnie pomiędzy generowaniem poszczególnych linii obrazu. Sprawia to, że mieszanie ze sobą różnych trybów wyświetlania nie sprawia żadnych trudności, póki jedna linia pozioma obrazu zajmowana jest przez 1 tryb graficzny. Umieściwszy w Display List kolejno wszystkie rozkazy tworzenia linii trybu uzyskuje się je wszystkie na raz, wyświetlane jeden pod drugim, w kolejnych liniach poziomych obrazu.
Nietrudno zauważyć, że numer trybu graficznego zakodowany jest w dolnych czterech bitach rozkazu. Starsze cztery bity wybierają - niezależnie od siebie nawzajem oraz niezależnie dla każdej linii obrazu - dodatkowe atrybuty obrazu, to jest:
- przesuw poziomy
- przesuw pionowy
- LMS
- DLI
DLI włącza występowanie przerwania NMI, LMS natomiast przekształca rozkaz w rozkaz ładowania wskaźnika pamięci ekranu.
$00, a ściślej $x0 jest to rozkaz tworzenia pustych linii obrazu. Liczba tych linii określana jest przez trzy pierwsze bity starszej połówki bajtu: $00 tworzy jedną pustą linię skaningową, $10 dwie, $20 trzy, $30 cztery, $40 pięć, $50 sześć, $60 siedem a $70 osiem. Najstarszy bit wybiera DLI, tak samo jak przy rozkazach linii trybu.
$01 jest to rozkaz skoku JMP pod adres podany w następnych dwóch bajtach Display List. Rozkaz ten tworzy oprócz tego - przed skokiem - jedną pustą linię obrazu. Ustawienie bitu 7 powoduje jeszcze wygenerowanie przerwania DLI, natomiast ustawienie bitu 6 sprawia, że przed wykonaniem skoku Antic czeka na impuls synchronizacji pionowej. Rozkaz taki - skoku z oczekiwaniem na synchronizację pionową - powinien kończyć Display List i jednocześnie "uruchamiać" ją od początku.
Rozkazem ładowania wskaźnika pamięci ekranu może być każdy z rozkazów tworzenia linii trybu. Uzyskuje się to przez ustawienie bitu 6 kodu rozkazu oraz podanie adresu danych obrazu w dwóch następnych bajtach. W efekcie dane dane obrazu nie muszą być odłożone w pamięci sekwencyjnie - wystarczy, żeby sekwencję stanowiły bajty składające się na pojedynczą linię obrazu. W efekcie uzyskanie organizacji pamięci obrazu takiej jak w ZX Spectrum albo wyświetlenie całości lub części obrazka do góry nogami to tylko kwestia napisania odpowiedniej Display List i podania Anticowi wskaźnika do niej.
Przykład wykorzystania Display List:
Należy wpisać w Basicu (zgłasza się on napisem READY, po włączeniu komputera) poniższy program. Kolejne linie oddzielić wciskając enter (oznaczony return) , są one oznaczone numerami (10, 20 i tak dalej) Uruchomić wpisując RUN i naciskając enter (return). Poczekać na wypisanie wszystkich numerów. Następnie napisać PRINT USR(30720) i nacisnąć enter (return). Program wyświetla zieloną kropkę (pixel) w trybie graficznym 3 Basicu, oraz linie w trybie ) Basic-a. Sprawdzono na Atari 65XE. Początek kodu programu:
10 REM REDELERT 2006
20 FOR N=30720 TO 30829
30 READ D
34 ? N
35 POKE N,D
37 NEXT N
40 DATA 169,112,141,0,128,141,1,128
45 DATA 141,2,128,169,66,141,3,128
50 DATA 169,0,141,4,128,169,130
55 DATA 141,5,128,169,2,141,6,128
60 DATA 141,7,128,169,72,141,8,128
65 DATA 169,0,141,9,128,169,140
70 DATA 141,10,128,169,8,141,11,128
75 DATA 141,12,128,141,13,128,141,14
80 DATA 128,169,65,141,15,128,169,0
85 DATA 141,16,128,169,128,141,17,128
90 DATA 169,0,141,48,2,169,128,141
95 DATA 5,141,6,150,169,150,141,7,150
100 DATA 5,141,6,150,169,150,141,7,150
105 DATA 169,2,141,11,140,5,150
Koniec kodu PROGRAMU