ANTIC Display List
From Atariki
Wersja z dnia 01:53, 9 gru 2005 KMK (Dyskusja | wkład) (→Tryby bitowe) ← Previous diff |
Wersja z dnia 01:55, 9 gru 2005 KMK (Dyskusja | wkład) (→Tryby GTIA) Next diff → |
||
Linia 79: | Linia 79: | ||
System operacyjny oferuje ponadto trzy tryby graficzne "wielokolorowe" o rozdzielczości 80x192 piksele, tzw. tryby [[GTIA]]. Są to [[Graphics 9|GRAPHICS 9]], [[Graphics 9|GRAPHICS 10]] i [[Graphics 11|GRAPHICS 11]]. 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. | System operacyjny oferuje ponadto trzy tryby graficzne "wielokolorowe" o rozdzielczości 80x192 piksele, tzw. tryby [[GTIA]]. Są to [[Graphics 9|GRAPHICS 9]], [[Graphics 9|GRAPHICS 10]] i [[Graphics 11|GRAPHICS 11]]. 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 [[rejestry GTIA#GTIACTL|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. W komputerach, w których zamiast [[GTIA]] znajduje się układ [[CTIA]] te trzy trzyby nie są dostępne. | + | 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 [[rejestry GTIA#GTIACTL|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. W komputerach, w których zamiast [[GTIA]] znajduje się układ [[CTIA]] te trzy tryby nie są dostępne. |
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). | 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). |
Wersja z dnia 01:55, 9 gru 2005
Display List (DL) jest programem wyświetlania dla procesora graficznego ANTIC, stosowanego w Atari 8-bit.
Spis treści |
Położenie w pamięci
Display List jest wskazywana przez rejestr DLPTR $D402-$D403. Rejestr ten 50 razy na sekundę jest zapisywany zawartością rejestru-cienia DLPTRS ($0230-$0231) przez procedurę SYSVBL. Dlatego do poinformowania ANTIC-a o położeniu DL na ogół wystarcza wstawienie jej adresu do DLPTRS.
Ze względu na to, że licznik programu ANTIC-a jest co prawda szesnastobitowy, ale podczas wykonywania DL pobieranie rozkazów zmienia tylko dziesięć jego najmłodszych bitów, DL nie może przekroczyć granicy 1 kilobajta. Jeśli istnieje taka potrzeba, trzeba użyć rozkazu JMP lub JVB do ponownego załadowania całego licznika.
Struktura
DL jest ciągiem rozkazów ANTIC-a. Rozkazy są jednobajtowe (adresowanie implikowane) lub trzybajtowe (adresowanie absolutne).
Na początku DL występują rozkazy tworzenia pustych linii, które tworzą górny margines ekranu, czyli tzw. górną ramkę. Jeśli istnienie tej ramki jest niepożądane, te rozkazy można pominąć. Dalej musi iść rozkaz ładowania wskaźnika pamięci obrazu (LMS). Jest on jednocześnie rozkazem tworzenia linii trybu graficznego. LMS ma szesnastobitowy argument określający adres, pod którym ma się zaczynać pierwsza linia tworzonego obrazu.
Po LMS, jeśli pamięć obrazu ma tworzyć ciągły obszar, następują jednobajtowe rozkazy tworzenia linii trybu graficznego, po jednym na każdą linię. W przeciwnym wypadku, jeśli kolejne linie obrazu nie leżą w pamięci bezpośrednio jedna po drugiej, zamiast rozkazów tworzenia linii trybu trzeba stosować rozkazy LMS. Wynika z tego, że praktycznie maksymalny rozmiar pojedynczej DL to 720 bajtów: 239 rozkazów LMS tworzących tyleż linii trybu GRAPHICS 8 rozrzuconych po całej pamięci, plus rozkaz JVB na końcu. Normalnie DL dla ekranu w tym trybie ma 202 bajty.
DL musi się kończyć rozkazem JVB. Jego argumentem jest adres początku DL, która będzie wykonywana w następnej "ramce" TV. Może to być ta sama lista, ale może być też zupełnie inna, zależnie od potrzeb. Stworzywszy łańcuch DL dla kolejno załadowanych do pamięci obrazów, w którym to łańcuchu kolejne listy będą rozkazem JVB wskazywać na następne, a ostatnia na pierwszą, można stworzyć efekt poklatkowej animacji bez angażowania CPU.
Rozkazy DL
Jak wspomniano powyżej, Display List 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 poniż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.
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:
- bit 7, DLI
- bit 6, LMS
- bit 5, przesuw pionowy
- bit 4, przesuw poziomy
DLI włącza występowanie przerwania NMI DLI, LMS natomiast przekształca rozkaz w rozkaz ładowania wskaźnika pamięci ekranu, jak opisano powyżej.
LMS
Rozkazem ładowania wskaźnika pamięci ekranu (LMS - Load Memory Scan) 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 ANTIC-owi wskaźnika do niej.
JMP i JVB
$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 przekształca rozkaz JMP w JVB (Jump and wait for Vertical Blank). Różnica jest taka, że po wykonaniu skoku JVB ANTIC czeka z wykonywaniem dalszych rozkazów 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.
Puste linie TV
$x0 jest to kod rozkazu 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.
Tryby znakowe
Rozkazy tworzenia 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 (GRAPHICS 0).
- 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 ANTIC 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 wykorzystywany np. przez program SpeedScript), bo pozwala na wyświetlanie małych liter z "wyrazistymi" ogonkami. Ten tryb wyświetlania nie ma odpowiednika w numeracji trybów systemu operacyjnego.
- 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 (GRAPHICS 12) 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 (GRAPHICS 13).
- 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 (GRAPHICS 1).
- tryb $07: odmiana trybu $06 o dwukrotnie mniejszej rozdzielczości pionowej. Jest to tryb 2 systemu operacyjnego (GRAPHICS 2).
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 (GRAPHICS 3).
- 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 (GRAPHICS 4).
- tryb $0a: jest to odpowiednik trybu $09, lecz dostępne są 4 kolory z palety 128. Jest to tryb 5 systemu operacyjnego (GRAPHICS 5).
- 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 (GRAPHICS 6).
- 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 (GRAPHICS 14).
- tryb $0d: jest to odpowiednik trybu $0b w 4 kolorach, czyli tryb 7 systemu operacyjnego o rozdzielczości 160x96 w 4 kolorach (GRAPHICS 7).
- tryb $0e: jest to kolorowy odpowiednik trybu $0c, czyli tryb 15 systemu operacyjnego, 160x192 piksele w 4 kolorach (GRAPHICS 15).
- 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 (GRAPHICS 8).
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ść tudzież położenie pionowe z dokładnością do jednej linii skaningowej (piksela) za pomocą Display List.
Tryby GTIA
System operacyjny oferuje ponadto trzy tryby graficzne "wielokolorowe" o rozdzielczości 80x192 piksele, tzw. tryby GTIA. Są to GRAPHICS 9, GRAPHICS 10 i GRAPHICS 11. 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. W komputerach, w których zamiast GTIA znajduje się układ CTIA te trzy tryby nie są dostępne.
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).