ANTIC Display List

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 15:33, 8 gru 2005
KMK (Dyskusja | wkład)
(Struktura - poprawka stylistyczna)
← Previous diff
Wersja z dnia 15:36, 8 gru 2005
KMK (Dyskusja | wkład)
(JMP i JVB - chyba jaśniej)
Next diff →
Linia 45: Linia 45:
===JMP i JVB=== ===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 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.+$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=== ===Puste linie TV===

Wersja z dnia 15:36, 8 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, 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 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 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.

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

$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.

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.
  • 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 zapotrzbowanie 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.

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 1 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ść tudzież położenie pionowe 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, 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.

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).

Personal tools