ANTIC Display List
From Atariki
Wersja z dnia 19:39, 10 lut 2008 Xxl (Dyskusja | wkład) (6845 i pochodne) ← Previous diff |
Aktualna wersja Mono (Dyskusja | wkład) (link do "tryby wysokiej rozdzielczości") |
||
Linia 3: | Linia 3: | ||
==Położenie w pamięci== | ==Położenie w pamięci== | ||
- | Display List jest wskazywana przez [[rejestry ANTIC-a#DLPTR|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 (układ)|ANTIC-a]] o położeniu DL na ogół wystarcza wstawienie jej adresu do DLPTRS. | + | Display List jest wskazywana przez [[rejestry ANTIC-a#DLPTR|rejestr DLPTR $D402-$D403]]. Rejestr ten jest co [[Ramka|ramkę]] zapisywany zawartością rejestru-cienia DLPTRS ($0230-$0231) przez procedurę [[SYSVBL]]. Dlatego do poinformowania [[ANTIC (układ)|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. | + | Licznik programu ANTIC-a jest co prawda szesnastobitowy, ale podczas wykonywania DL pobieranie rozkazów zmienia tylko dziesięć jego najmłodszych bitów; w związku z tym po przekroczeniu granicy 1 KB pobieranie dalszych rozkazów DL jest kontynuowane od początku bloku 1 KB. Np. jeśli umieścimy początek DL pod adresem $43F0, to po pobraniu 16 bajtów DL, kolejne zostaną pobrane począwszy od $4000. |
+ | |||
+ | Aby ominąć tę niedogodność, można użyć rozkazu JMP do ponownego załadowania całego licznika. Wadą takiego rozwiązania jest wyświetlenie jednej pustej linii na ekranie (generuje ją rozkaz JMP). Można tego uniknąć przez programową zmianę wartości rejestru [[Rejestry ANTIC-a#DLPTR|DLPTR]] w linii, po której program ANTIC-a przekroczy granicę 1 kilobajta. | ||
==Struktura== | ==Struktura== | ||
- | DL jest ciągiem rozkazów ANTIC-a. Rozkazy są jednobajtowe (adresowanie implikowane) lub trzybajtowe (adresowanie absolutne). | + | DL jest ciągiem rozkazów [[ANTIC (układ)|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. | + | 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ąć. Następny musi być 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|GRAPHICS 8]] rozrzuconych po całej pamięci, plus rozkaz JVB na końcu. Normalnie DL dla ekranu w tym trybie ma 202 bajty. | 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|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]]. | + | DL musi się kończyć rozkazem JVB tylko w przypadku gdy wyświetlamy na ekranie mniej niż 240 linii. 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== | ==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: | + | Jak wspomniano powyżej, Display List jest w istocie programem odłożonym w pamięci komputera i wykonywanym przez mikroprocesor graficzny z częstotliwością ramki dla danego systemu (tj. [http://pl.wikipedia.org/wiki/PAL PAL] lub [http://pl.wikipedia.org/wiki/NTSC NTSC]). Rozkazy Display List dzielą się na następujące grupy: |
* rozkazy tworzenia linii trybu graficznego | * rozkazy tworzenia linii trybu graficznego | ||
Linia 39: | Linia 41: | ||
===LMS=== | ===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 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. Wynika z tego, że uzyskanie organizacji pamięci obrazu takiej jak w [http://en.wikipedia.org/wiki/Acorn_Electron Acorn Electron], [http://en.wikipedia.org/wiki/Amstrad_CPC Amstrad CPC], [http://en.wikipedia.org/wiki/BBC_Micro BBC Micro], [http://en.wikipedia.org/wiki/ZX_Spectrum 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 (układ)|ANTIC-owi]] wskaźnika do niej. | + | 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 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. Wynika z tego, że uzyskanie organizacji pamięci obrazu takiej jak w [http://en.wikipedia.org/wiki/Acorn_Electron Acorn Electron], [http://en.wikipedia.org/wiki/Amstrad_CPC Amstrad CPC], [http://en.wikipedia.org/wiki/Apple_II_series#Apple_II Apple II], [http://en.wikipedia.org/wiki/BBC_Micro BBC Micro], [http://en.wikipedia.org/wiki/Commodore_64 C64], [http://en.wikipedia.org/wiki/ZX_Spectrum 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 (układ)|ANTIC-owi]] wskaźnika do niej. |
- | Jedyna restrykcja, jaką [[ANTIC (układ)|ANTIC]] narzuca co do ulokowania danych obrazu jest taka, że dane dla pojedynczej linii trybu graficznego nie mogą przecinać granicy bloku 4k. Licznik adresujący pamięć obrazu ma co prawda 16 bitów, ale podczas normalnej pracy ANTIC zmienia tylko 12 najmłodszych bitów - dlatego po dojechaniu do końca bloku 4k zacznie pobierać nie to, co znajduje się dalej, ale to, co znajduje się na początku tego bloku (czyli, ów licznik, przepełni się). Jeśli pamięć obrazu ma przekraczać 4k, Display List musi być ułożona tak, żeby na granicy bloków czterokilobajtowych wypadał koniec jednej linii trybu, a następna zaczynała się już poza tą granicą. Do utworzenia tej drugiej linii musi zostać użyty rozkaz LMS, który przeładowuje całe 16 bitów wspomnianego licznika "przerzucając" tym samym ANTIC do następnego bloku 4k. | + | Jedyna restrykcja, jaką [[ANTIC (układ)|ANTIC]] narzuca co do ulokowania danych obrazu jest taka, że dane dla pojedynczej linii trybu graficznego nie mogą przecinać granicy bloku 4 KB. Licznik adresujący pamięć obrazu ma co prawda 16 bitów, ale podczas normalnej pracy [[ANTIC (układ)|ANTIC]] zmienia tylko 12 najmłodszych bitów - dlatego po dojechaniu do końca bloku 4 KB zacznie pobierać nie to, co znajduje się dalej, ale to, co znajduje się na początku tego bloku (czyli, ów licznik, przepełni się). Jeśli pamięć obrazu ma przekraczać 4 KB, Display List musi być ułożona tak, żeby na granicy bloków czterokilobajtowych wypadał koniec jednej linii trybu, a następna zaczynała się już poza tą granicą. Do utworzenia tej drugiej linii musi zostać użyty rozkaz LMS, który przeładowuje całe 16 bitów wspomnianego licznika "przerzucając" tym samym [[ANTIC (układ)|ANTIC]] do następnego bloku 4 KB. |
===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 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. | $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. | ||
+ | |||
+ | Znaczenie bitów 4 i 5 w przypadku rozkazów skoków jest nieokreślone. | ||
+ | |||
+ | ===Przesuw obrazu=== | ||
+ | |||
+ | Ustawienie bitu 4 i 5 rozkazu tworzenia linii trybu powoduje włączenie przesuwu ekranu, odpowiednio poziomego i pionowego. Mogą one występować równocześnie w jednej linii Display List, ale trzeba mieć na uwadze, że przy włączonym szerokim ekranie w liniach niektórych trybów mogą wystąpić zniekształcenia. | ||
+ | |||
+ | ====HSCRL==== | ||
+ | |||
+ | Włączenie poziomego przesuwu powoduje, że treść linii Display List będzie przesuwana w lewo o 16-n cykli koloru według zawartości bitów 0..3 rejestru [[Rejestry ANTIC-a#HSCROL|HSCROL]] tak, jak to zobrazowano poniżej: | ||
+ | |||
+ | Przykładowa treść 8 linii ekranowych bez przesunięcia | ||
+ | 1 1 2 2 3 | ||
+ | 0 7 8 5 6 3 4 1 - kolejna dana w linii | ||
+ | 0 ........ ........ ........ ........ | ||
+ | ...oo... .ooooo.. ..oooo.. .oooo... | ||
+ | ..oooo.. .oo..oo. .oo..oo. .oo.oo.. | ||
+ | .oo..oo. .ooooo.. .oo..... .oo..oo. | ||
+ | .oo..oo. .oo..oo. .oo..... .oo..oo. | ||
+ | .oooooo. .oo..oo. .oo..oo. .oo.oo.. | ||
+ | .oo..oo. .ooooo.. ..oooo.. .oooo... | ||
+ | 7 ........ ........ ........ ........ | ||
+ | linia ekranowa (skaningowa) | ||
+ | |||
+ | Przykładowa treść 8 linii ekranowych z przesunięciem o 1 cykl koloru | ||
+ | 1 1 2 2 2 | ||
+ | 0 7 8 5 6 3 4 9 - kolejna dana w linii | ||
+ | 0 ........ ........ ........ ......xx | ||
+ | .oo....o oooo.... oooo...o ooo...xx | ||
+ | oooo...o o..oo..o o..oo..o o.oo..xx | ||
+ | o..oo..o oooo...o o......o o..oo.xx | ||
+ | o..oo..o o..oo..o o......o o..oo.xx | ||
+ | ooooo..o o..oo..o o..oo..o o.oo..xx | ||
+ | o..oo..o oooo.... oooo...o ooo...xx | ||
+ | 7 ........ ........ ........ ......xx | ||
+ | linia ekranowa (skaningowa) | ||
+ | |||
+ | Po włączeniu przesuwu poziomego linia, niezależnie od ustawienia szerokości ekranu w [[Rejestry ANTIC-a#DMACTL|rejestrze DMACTL]], będzie miała logiczną szerokość, jak dla obrazu szerokiego, czyli: | ||
+ | |||
+ | * 48 bajtów dla trybów [[Graphics 0|0 OS]], [[ANTIC Display List#Tryby znakowe|3 ANTIC]], [[Graphics 7|7 OS]], [[Graphics 8|8 OS]], [[Graphics 9|9 OS]], [[Graphics 10|10 OS]], [[Graphics 11|11 OS]], [[Graphics 12|12 OS]], [[Graphics 13|13 OS]] i [[Graphics 15|15 OS]], | ||
+ | * 24 bajty dla [[Graphics 1|1 OS]], [[Graphics 2|2 OS]], [[Graphics 5|5 OS]], [[Graphics 6|6 OS]] i [[Graphics 14|14 OS]], | ||
+ | * 12 bajtów dla [[Graphics 3|3 OS]], [[Graphics 4|4 OS]]. | ||
+ | |||
+ | Ponieważ w różnych trybach jeden piksel na szerokość zajmuje różną ilość cykli koloru, tak więc przesunięcie treści ekranu o cykl koloru jest równoważne z przesunięciem o piksel wyłącznie w trybach [[Graphics 1|1 OS]] i [[Graphics 2|2 OS]], [[Graphics 6|6 OS]], [[Graphics 7|7 OS]], [[Graphics 12|12 OS]], [[Graphics 13|13 OS]], [[Graphics 14|14 OS]] i [[Graphics 15|15 OS]]. | ||
+ | |||
+ | Przykładowa treść 8 linii ekranowych w trybie średniej rozdzielczości z przesunięciem o 1 cykl koloru | ||
+ | 11 11 11 11 11 22 22 22 22 22 | ||
+ | 01 23 45 67 89 01 23 45 67 89 01 23 45 67 89 - kolejna dana w linii | ||
+ | 0 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. xx | ||
+ | .o o. .. .o oo oo .. .. oo oo .. .o oo o. .. xx | ||
+ | oo oo .. .o o. .o o. .o o. .o o. .o o. oo .. xx | ||
+ | o. .o o. .o oo oo .. .o o. .. .. .o o. .o o. xx | ||
+ | o. .o o. .o o. .o o. .o o. .. .. .o o. .o o. xx | ||
+ | oo oo o. .o o. .o o. .o o. .o o. .o o. oo .. xx | ||
+ | o. .o o. .o oo oo .. .. oo oo .. .o oo o. .. xx | ||
+ | 7 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. xx | ||
+ | : 1 1 1 1 1 | ||
+ | : 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 - piksel | ||
+ | linia ekranowa (skaningowa) | ||
+ | |||
+ | W trybach wysokiej rozdzielczości [[Graphics 0|0 OS]], [[ANTIC Display List#Tryby znakowe|3 ANTIC]] i [[Graphics 8|8 OS]], gdzie jeden piksel ma szerokość połowy cyklu koloru, przesunięcie o cykl koloru przesuwa treść obrazu o 2 piksele. | ||
+ | |||
+ | Przykładowa treść 8 linii ekranowych w trybie wysokiej rozdzielczości z przesunięciem o 1 cykl koloru | ||
+ | 1 1 2 2 2 | ||
+ | 0 7 8 5 6 3 4 9 - kolejna dana w linii | ||
+ | 0 ........ ........ ........ ......xx | ||
+ | .oo....o oooo.... oooo...o ooo...xx | ||
+ | oooo...o o..oo..o o..oo..o o.oo..xx | ||
+ | o..oo..o oooo...o o......o o..oo.xx | ||
+ | o..oo..o o..oo..o o......o o..oo.xx | ||
+ | ooooo..o o..oo..o o..oo..o o.oo..xx | ||
+ | o..oo..o oooo.... oooo...o ooo...xx | ||
+ | 7 ........ ........ ........ ......xx | ||
+ | : 111111 11112222 222222 | ||
+ | : 01234567 89012345 67890123 456789 - piksel | ||
+ | linia ekranowa (skaningowa) | ||
+ | |||
+ | W trybach niskiej rozdzielczości [[Graphics 3|3 OS]], [[Graphics 4|4 OS]] i [[Graphics 5|5 OS]], gdzie jeden piksel ma szerokość 2 lub 4 cykli koloru, przesunięcie o cykl koloru przesuwa treść obrazu o pół, lub ćwierć ([[Graphics 3|3 OS]]) piksela bez zmiany interpretacji wartości piksela, jak ma to miejsce w trybach [[GTIA|GTIA]]. | ||
+ | |||
+ | W trybach [[GTIA|GTIA]] ([[Graphics 9|9 OS]], [[Graphics 10|10 OS]] i [[Graphics 11|11 OS]]), gdzie piksel ma szerokość 2 cykli koloru dopiero przesunięcie o 2 cykle koloru prowadzi do przesunięcia ekranu o piksel. Ponieważ przesuwaniem treści obrazu zajmuje się [[ANTIC (układ)|ANTIC]], zanim jeszcze [[GTIA|GTIA]] nałoży nań informację o kolorach, więc przesuwanie treści o 1 cykl koloru skutkuje zmianą wartości pikseli na ekranie, jak poniżej: | ||
+ | |||
+ | Przykładowa treść 8 linii ekranowych trybu GTIA bez przesunięcia | ||
+ | 1 1 1 1 1 2 2 2 2 2 3 | ||
+ | 0 3 4 7 8 1 2 5 6 9 0 3 4 7 8 1 - kolejna dana w linii | ||
+ | 0 .... .... .... .... .... .... .... .... | ||
+ | ...o o... .ooo oo.. ..oo oo.. .ooo o... | ||
+ | ..oo oo.. .oo. .oo. .oo. .oo. .oo. oo.. | ||
+ | .oo. .oo. .ooo oo.. .oo. .... .oo. .oo. | ||
+ | .oo. .oo. .oo. .oo. .oo. .... .oo. .oo. | ||
+ | .ooo ooo. .oo. .oo. .oo. .oo. .oo. oo.. | ||
+ | .oo. .oo. .ooo oo.. ..oo oo.. .ooo o... | ||
+ | 7 .... .... .... .... .... .... .... .... | ||
+ | : 0 1 2 3 4 5 6 7 - piksel | ||
+ | linia ekranowa (skaningowa) | ||
+ | |||
+ | Przykładowa treść 8 linii ekranowych trybu GTIA z przesunięciem o 1 cykl koloru | ||
+ | 1 1 1 1 1 2 2 2 2 2 | ||
+ | 0 3 4 7 8 1 2 5 6 9 0 3 4 7 8 - kolejna dana w linii | ||
+ | 0 .... .... .... .... .... .... .... ..xx | ||
+ | .oo. ...o oooo .... oooo ...o ooo. ..xx | ||
+ | oooo ...o o..o o..o o..o o..o o.oo ..xx | ||
+ | o..o o..o oooo ...o o... ...o o..o o.xx | ||
+ | o..o o..o o..o o..o o... ...o o..o o.xx | ||
+ | oooo o..o o..o o..o o..o o..o o.oo ..xx | ||
+ | o..o o..o oooo .... oooo ...o ooo. ..xx | ||
+ | 7 .... .... .... .... .... .... .... ..xx | ||
+ | : 0 1 2 3 4 5 6 7 - piksel | ||
+ | linia ekranowa (skaningowa) | ||
+ | |||
+ | ====VSCRL==== | ||
+ | |||
+ | Uaktywnienie pionowego przesuwu ekranu w linii Display List skutkuje przesunięciem treści ekranu o n linii ekranowych (skaningowych) w górę zależnie od wartości znajdującej się w bitach 0..3 [[Rejestry ANTIC-a#VSCROL|rejestru VSCROL]]. | ||
+ | |||
+ | Dla potrzeb następnych wyjaśnień załóżmy, że Display List skonstruowana jest następująco: | ||
+ | |||
+ | dlist: | ||
+ | $70 : 8 pustych linii | ||
+ | $62 screen : LMS + VSCRL + tryb 2 | ||
+ | $02 : tryb 2 | ||
+ | $02 : tryb 2 | ||
+ | $41 dlist : JVB | ||
+ | |||
+ | Kiedy przesunięcie jest mniejsze niż liczba linii zajmowanych przez linię trybu Display List, wtedy linia trybu Display List następująca bezpośrednio po sekcji przesuwanej zostaje "ściśnięta" do jednej linii ekranowej i uczestniczy w wyświetlaniu przesuwanej treści. | ||
+ | |||
+ | Przykładowa treść 3 linii trybu wysokiej rozdzielczości Display List gdy VSCROL=4 | ||
+ | 1 1 2 2 3 | ||
+ | 0 7 8 5 6 3 4 1 - kolejna dana w linii | ||
+ | 0 .oo..oo. .oo..oo. .oo..... .oo..oo. | ||
+ | .oooooo. .oo..oo. .oo..oo. .oo.oo.. | ||
+ | .oo..oo. .ooooo.. ..oooo.. .oooo... | ||
+ | ........ ........ ........ ........ | ||
+ | ........ ........ ........ ........ - pierwsza linia Display List z VSCRL | ||
+ | ...oo... .ooooo.. ..oooo.. .oooo... | ||
+ | ..oooo.. .oo..oo. .oo..oo. .oo.oo.. | ||
+ | 7 .oo..oo. .ooooo.. .oo..... .oo..oo. | ||
+ | |||
+ | 8 .oo..oo. .oo..oo. .oo..... .oo..oo. - pierwsza linia Display List bez VSCRL ("ściśnięta" do jednej linii ekranowej) | ||
+ | |||
+ | 9 ........ ........ ........ ........ | ||
+ | ...oo... .ooooo.. ..oooo.. .oooo... | ||
+ | ..oooo.. .oo..oo. .oo..oo. .oo.oo.. | ||
+ | .oo..oo. .ooooo.. .oo..... .oo..oo. | ||
+ | .oo..oo. .oo..oo. .oo..... .oo..oo. - druga linia Display List bez VSCRL | ||
+ | .oooooo. .oo..oo. .oo..oo. .oo.oo.. | ||
+ | .oo..oo. .ooooo.. ..oooo.. .oooo... | ||
+ | 16 ........ ........ ........ ........ | ||
+ | linia ekranowa (skaningowa) | ||
+ | |||
+ | Jeśli bezpośrednio za przesuwaną sekcją znajdzie się pusta linia, to ona będzie wyświetlana przy przesuwaniu w ostatniej linii przesuwanej sekcji. | ||
+ | |||
+ | W przypadku gdy przesunięcie przekracza ilość linii trybu, pierwsza linia sekcji przesuwanej jest rozszerzana do 16 linii ekranowych i zawiera zduplikowaną zawartość linii Display List, natomiast pierwsza linia sekcji nieruchomej nie jest "ściskana", ale nadal uczestniczy w wyświetlaniu zawartości sekcji ruchomej. | ||
+ | |||
+ | Przykładowa treść 3 linii trybu wysokiej rozdzielczości Display List gdy VSCROL=12 | ||
+ | 1 1 2 2 3 | ||
+ | 0 7 8 5 6 3 4 1 - kolejna dana w linii | ||
+ | 0 .**..**. .**..**. .**..... .**..**. | ||
+ | .******. .**..**. .**..**. .**.**.. - zniekształcona treść dwóch pierwszych linii ekranowych (* - piksel, który powinien być wyświetlony, a nie jest) | ||
+ | .oo..oo. .ooooo.. ..oooo.. .oooo... | ||
+ | ........ ........ ........ ........ | ||
+ | ........ ........ ........ ........ - zduplikowana pierwsza linia Display List z VSCRL | ||
+ | ...oo... .ooooo.. ..oooo.. .oooo... | ||
+ | ..oooo.. .oo..oo. .oo..oo. .oo.oo.. | ||
+ | 7 .oo..oo. .ooooo.. .oo..... .oo..oo. | ||
+ | |||
+ | 8 .oo..oo. .oo..oo. .oo..... .oo..oo. | ||
+ | .oooooo. .oo..oo. .oo..oo. .oo.oo.. | ||
+ | .oo..oo. .ooooo.. ..oooo.. .oooo... | ||
+ | ........ ........ ........ ........ | ||
+ | ........ ........ ........ ........ - pierwsza linia Display List z VSCRL | ||
+ | .oooooo. .oooooo. ..ooooo. .oo..oo. | ||
+ | .oo..... .oo..... .oo..... .oo..oo. | ||
+ | 15 .ooooo.. .ooooo.. .oo..... .oooooo. | ||
+ | |||
+ | 16 .oo..... .oo..... .oo..oo. .oo..oo. | ||
+ | .oo..... .oo..... .oo..oo. .oo..oo. | ||
+ | .oooooo. .oo..... ..ooooo. .oo..oo. | ||
+ | ........ ........ ........ ........ | ||
+ | ........ ........ ........ ........ - pierwsza linia Display List bez VSCRL | ||
+ | .oooooo. .oooooo. ..ooooo. .oo..oo. | ||
+ | .oo..... .oo..... .oo..... .oo..oo. | ||
+ | 23 .ooooo.. .ooooo.. .oo..... .oooooo. | ||
+ | |||
+ | 24 ........ ........ ........ ........ | ||
+ | .oooooo. .oooooo. .oo..oo. .oo..... | ||
+ | ...oo... .....oo. .oo.oo.. .oo..... | ||
+ | ...oo... .....oo. .oooo... .oo..... | ||
+ | ...oo... .....oo. .oo.oo.. .oo..... - druga linia Display List bez VSCRL | ||
+ | ...oo... .oo..oo. .oo..oo. .oo..... | ||
+ | .oooooo. ..oooo.. .oo..oo. .oooooo. | ||
+ | 31 ........ ........ ........ ........ | ||
+ | linia ekranowa (skaningowa) | ||
+ | |||
+ | Testowanie wielkości przesunięcia odbywa się poprzez sprawdzenie czy odpowiednie bity są wyzerowane: | ||
+ | * w trybach [[Graphics 8|8 OS]], [[Graphics 9|9 OS]], [[Graphics 10|10 OS]], [[Graphics 11|11 OS]], [[Graphics 14|14 OS]] i [[Graphics 15|15 OS]] - bity 0..3, | ||
+ | * w trybach [[Graphics 6|6 OS]] i [[Graphics 7|7 OS]] - bity 1..3, | ||
+ | * w trybach [[Graphics 4|4 OS]] i [[Graphics 5|5 OS]] - bity 2..3, | ||
+ | * w trybach [[Graphics 0|0 OS]], [[ANTIC Display List#Tryby znakowe|3 ANTIC]], [[Graphics 1|1 OS]], [[Graphics 3|3 OS]] i [[Graphics 12|12 OS]] - bit 3, | ||
+ | * w trybach [[Graphics 2|2 OS]] i [[Graphics 13|13 OS]] nie jest sprawdzany żaden bit [[Rejestry ANTIC-a#VSCROL|rejestru VSCROL]] i dlatego w tych trybach nie występuje efekt duplikacji. | ||
===Puste linie TV=== | ===Puste linie TV=== | ||
Linia 56: | Linia 256: | ||
* 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|GRAPHICS 0]]). | * 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|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 (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 $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 (układ)|ANTIC]] sprzętowo dodaje dwie puste linie do wszystkich znaków (na dole dla znaków $00-$5F, na górze dla znaków $60-$7F - w ostatnim wypadku rysowanie znaku odbywa się od drugiej linii matrycy, zaś dwie pierwsze linie matrycy wyświetlane są jako dwie ostatnie linie znaku). Ostatnia ćwiartka zestawu znaków (znaki $60-$7F) to w wewnętrznej organizacji ANTIC-a małe litery alfabetu angielskiego, tak więc tryb ten jest przydatny dla edytorów tekstu (i w istocie jest wykorzystywany np. przez program [[SpeedScript]] czy [[EuroTekst]]), bo pozwala na wyświetlanie małych liter z "wyrazistymi" ogonkami. [[ANTIC 3|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|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 $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|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|GRAPHICS 13]]). | * 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|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|GRAPHICS 1]]). | + | * tryb $06: jest to tryb znakowy, w którym znak ma rozmiary 8x8 pikseli, ale jeden piksel tego trybu ma szerokość 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|GRAPHICS 1]]). |
* tryb $07: odmiana trybu $06 o dwukrotnie mniejszej rozdzielczości pionowej. Jest to tryb 2 systemu operacyjnego ([[Graphics 2|GRAPHICS 2]]). | * tryb $07: odmiana trybu $06 o dwukrotnie mniejszej rozdzielczości pionowej. Jest to tryb 2 systemu operacyjnego ([[Graphics 2|GRAPHICS 2]]). | ||
+ | |||
+ | Kształty znaków w trybach tekstowych definiowane są za pomocą [[Generator znaków|generatora znaków]]. | ||
+ | Na rysowanie znaków w trybach znakowych ma wpływ stan rejestru [[Rejestry ANTIC-a#CHRCTL|CHACTL ($D401)]] (cień [[Rejestry-cienie Atari OS#CHACT|CHACT ($2F3)]]). | ||
===Tryby bitowe=== | ===Tryby bitowe=== | ||
Linia 79: | Linia 282: | ||
==Tryby GTIA== | ==Tryby GTIA== | ||
- | 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 11|GRAPHICS 11]] i [[Graphics 10|GRAPHICS 10]]. 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 używanie 16 barw. |
- | Nie są to tryby układu [[ANTIC (układ)|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. | + | Nie są to tryby układu [[ANTIC (układ)|ANTIC]] - z punktu widzenia tego układu wszystkie trzy to monochromatyczny tryb najwyższej rozdzielczości (GRAPHICS 8). 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. |
- | 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). Trybu tego używa program [[Paint 256]]. | + | W komputerach, w których zamiast GTIA znajduje się układ [[CTIA]], te trzy tryby nie są dostępne. Natomiast w komputerach SECAM, z powodu ograniczeń sprzętowych układu [[FGTIA]] (zob.), tryb GRAPHICS 9 oferuje 8 odcieni, a GRAPHICS 11 - 15 kolorów. |
+ | |||
+ | W systemie PAL, dzięki pewnej jego właściwości, zmieszanie dwóch trybów wielokolorowych - tego z 16 stopniami szarości z tym z 16 kolorami - daje dostęp do trybu graficznego o rozdzielczości 80x96 pikseli w 256 kolorach (pełne osiem bitów na piksel). Trybu tego używa program [[Paint 256]] (ta sztuczka nie działa, jeśli używamy [[VBXE]] i wyjścia RGB). | ||
+ | |||
+ | Dodatkowo obraz w trybie GRAPHICS 10 jest przesunięty o pół piksela (1 [[cykl koloru]]) w prawo w stosunku do położenia pikseli w trybach 9 i 11. Pozwala to na podwojenie rozdzielczości poziomej obrazu powstałego ze zmieszania trybów 9 i 10 ([[HIP]], [[TIP]]). | ||
+ | |||
+ | == Przełączanie trybów w linii == | ||
+ | |||
+ | [[Grafika:Unity_our5oft.png|Unity Demo by Our 5oft|right]] | ||
+ | [[Grafika:Benhakker.png|Benhakker by Kaz|right]] | ||
+ | Poprzez ingerencję w zawartość rejestru [[Rejestry GTIA#GTIACTL|GTIACTL]] w trakcie rysowania linii skanningowej można przełączyć tryb GTIA, co umożliwia uzyskanie kilku pionowych pasów na ekranie wyświetlających grafikę w różnych trybach. | ||
+ | Jakkolwiek technikę tę można stosować uzyskując spodziewane rezultaty we wszystkich trybach ANTIC-a, to w przypadku [[Tryby wysokiej rozdzielczości|trybów wysokiej rozdzielczości]] efekt jest nieco inny od zamierzonego. | ||
+ | |||
+ | Kiedy podczas rysowania linii skanningowej zostanie włączony (bity 6 i 7 rejestru [[Rejestry GTIA#GTIACTL|GTIACTL]] n.p. o wartości %01), po czym w tej samej linii na powrót wyłączony (bity 6 i 7 [[Rejestry GTIA#GTIACTL|GTIACTL]] o wartości %00) tryb GTIA, wtedy zamiast oczekiwanego hires-u otrzymamy tryb 4-kolorowy przypominający [[Graphics 15]], ale w którym kolory dla poszczególnych pikseli brane są z następujących rejestrów: | ||
+ | * %00 [[Rejestry GTIA#COLPF0|COLPF0 ($D016)]] (cień [[Rejestry-cienie Atari OS#COLPF0S|COLPF0S ($02C4)]]), | ||
+ | * %01 [[Rejestry GTIA#COLPF1|COLPF1 ($D017)]] (cień [[Rejestry-cienie Atari OS#COLPF1S|COLPF1S ($02C5)]]), | ||
+ | * %10 [[Rejestry GTIA#COLPF2|COLPF2 ($D018)]] (cień [[Rejestry-cienie Atari OS#COLPF2S|COLPF2S ($02C6)]]). | ||
+ | * %11 [[Rejestry GTIA#COLPF3|COLPF3 ($D019)]] (cień [[Rejestry-cienie Atari OS#COLPF3S|COLPF3S ($02C7)]]). | ||
+ | a nie, jak w przypadku trybu $0E, z: | ||
+ | * %00 [[Rejestry GTIA#COLBAK|COLBAK ($D01A)]] (cień [[Rejestry-cienie Atari OS#COLBAKS|COLBAKS ($02C8)]]), | ||
+ | * %01 [[Rejestry GTIA#COLPF0|COLPF0 ($D016)]] (cień [[Rejestry-cienie Atari OS#COLPF0S|COLPF0S ($02C4)]]), | ||
+ | * %10 [[Rejestry GTIA#COLPF1|COLPF1 ($D017)]] (cień [[Rejestry-cienie Atari OS#COLPF1S|COLPF1S ($02C5)]]), | ||
+ | * %11 [[Rejestry GTIA#COLPF2|COLPF2 ($D018)]] (cień [[Rejestry-cienie Atari OS#COLPF2S|COLPF2S ($02C6)]]). | ||
+ | W ten sposób na ekranie można zobaczyć [[Tryby wysokiej rozdzielczości|tryb wysokiej rozdzielczości]] z lewej strony, [[Tryby GTIA|tryb GTIA]] (n.p. [[Graphics 9]]) pośrodku, a [[Tryby wielokolorowe ANTIC-a|tryb wielokolorowy]] z prawej. | ||
+ | |||
+ | Wraz z początkiem linii skanningowej wszystko wraca do normy, skutkiem czego w nowej linii rysowany jest z powrotem hires. | ||
+ | |||
+ | Przykład użycia trzech trybów w linii znajduje się w demie [https://a8.fandal.cz/detail.php?files_id=736 Unity] grupy [[Our 5oft]] czy grafice [https://a8.fandal.cz/detail.php?files_id=5798 Benhakker] autorstwa [[Kaz]]a. | ||
+ | |||
+ | Na bazie tej sztuczki [[Pavros]] opisał tryb E+ w którym kolor ramki jest niezależny od kolorów pikseli. | ||
==Ciekawostki== | ==Ciekawostki== | ||
+ | * Jedna z najbardziej zaawansowanych animacji opartych o Display List została stworzona w demku do gry [[Five to five]] przez [[Gizmo Magic]]. W liniach trybu $0e wykonana jest pseudotrójwymiarowa animacja dywanu, czyli coś na kształt [http://pl.wikipedia.org/wiki/Teksturowanie teksturowania] wykonywanego na falującej powierzchni. | ||
* Ciekawy przykład Display List zawiera gra [[Galaxian]] - większość ekranu jest tworzona za pomocą rozkazów pustych linii, a grafika widoczna w tych liniach jest w całości generowana przez [[Player/Missile Graphics|graczy i pociski]]. | * Ciekawy przykład Display List zawiera gra [[Galaxian]] - większość ekranu jest tworzona za pomocą rozkazów pustych linii, a grafika widoczna w tych liniach jest w całości generowana przez [[Player/Missile Graphics|graczy i pociski]]. | ||
+ | * Ciekawa sztuczka została wykorzystana w grze [[Knight Lore]], gdzie dane wyświetlane na ekranie oddalone o 1 bajt w rzeczywistości w pamięci oddalone są o 8 bajtów: Display List zbudowana została w taki sposób, że generator znaków pełni rolę pamięci ekranu, natomiast wskaźnik pamięci ekranu ustawiony jest na sekwencję $00-$7f. W efekcie pamięć ekranu zajmuje 128 bajtów. | ||
+ | |||
+ | ==Zobacz== | ||
+ | * [https://atarionline.pl/forum/comments.php?DiscussionID=582 Dyskusja na AtariOnline] o "trójtrybie" | ||
+ | * [https://atarionline.pl/1252166986 Artykuł] [[Pavros]]a o trybie E+ | ||
[[Kategoria:Atari 8-bit]] | [[Kategoria:Atari 8-bit]] | ||
[[Kategoria:Programowanie Atari 8-bit]] | [[Kategoria:Programowanie Atari 8-bit]] |
Aktualna wersja
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 jest co ramkę 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.
Licznik programu ANTIC-a jest co prawda szesnastobitowy, ale podczas wykonywania DL pobieranie rozkazów zmienia tylko dziesięć jego najmłodszych bitów; w związku z tym po przekroczeniu granicy 1 KB pobieranie dalszych rozkazów DL jest kontynuowane od początku bloku 1 KB. Np. jeśli umieścimy początek DL pod adresem $43F0, to po pobraniu 16 bajtów DL, kolejne zostaną pobrane począwszy od $4000.
Aby ominąć tę niedogodność, można użyć rozkazu JMP do ponownego załadowania całego licznika. Wadą takiego rozwiązania jest wyświetlenie jednej pustej linii na ekranie (generuje ją rozkaz JMP). Można tego uniknąć przez programową zmianę wartości rejestru DLPTR w linii, po której program ANTIC-a przekroczy granicę 1 kilobajta.
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ąć. Następny musi być 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 tylko w przypadku gdy wyświetlamy na ekranie mniej niż 240 linii. 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 z częstotliwością ramki dla danego systemu (tj. PAL lub NTSC). 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 trybu - dodatkowe atrybuty obrazu, to jest:
- bit 7, DLI
- bit 6, LMS
- bit 5, przesuw pionowy
- bit 4, przesuw poziomy
Ustawienie bitu DLI powoduje, że podczas tworzonej właśnie linii skaningowej zostanie wygenerowane przerwanie DLI, LMS natomiast przekształca rozkaz w rozkaz ładowania wskaźnika pamięci ekranu, jak opisano poniż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 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. Wynika z tego, że uzyskanie organizacji pamięci obrazu takiej jak w Acorn Electron, Amstrad CPC, Apple II, BBC Micro, C64, 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.
Jedyna restrykcja, jaką ANTIC narzuca co do ulokowania danych obrazu jest taka, że dane dla pojedynczej linii trybu graficznego nie mogą przecinać granicy bloku 4 KB. Licznik adresujący pamięć obrazu ma co prawda 16 bitów, ale podczas normalnej pracy ANTIC zmienia tylko 12 najmłodszych bitów - dlatego po dojechaniu do końca bloku 4 KB zacznie pobierać nie to, co znajduje się dalej, ale to, co znajduje się na początku tego bloku (czyli, ów licznik, przepełni się). Jeśli pamięć obrazu ma przekraczać 4 KB, Display List musi być ułożona tak, żeby na granicy bloków czterokilobajtowych wypadał koniec jednej linii trybu, a następna zaczynała się już poza tą granicą. Do utworzenia tej drugiej linii musi zostać użyty rozkaz LMS, który przeładowuje całe 16 bitów wspomnianego licznika "przerzucając" tym samym ANTIC do następnego bloku 4 KB.
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.
Znaczenie bitów 4 i 5 w przypadku rozkazów skoków jest nieokreślone.
Przesuw obrazu
Ustawienie bitu 4 i 5 rozkazu tworzenia linii trybu powoduje włączenie przesuwu ekranu, odpowiednio poziomego i pionowego. Mogą one występować równocześnie w jednej linii Display List, ale trzeba mieć na uwadze, że przy włączonym szerokim ekranie w liniach niektórych trybów mogą wystąpić zniekształcenia.
HSCRL
Włączenie poziomego przesuwu powoduje, że treść linii Display List będzie przesuwana w lewo o 16-n cykli koloru według zawartości bitów 0..3 rejestru HSCROL tak, jak to zobrazowano poniżej:
Przykładowa treść 8 linii ekranowych bez przesunięcia
1 1 2 2 3 0 7 8 5 6 3 4 1 - kolejna dana w linii 0 ........ ........ ........ ........ ...oo... .ooooo.. ..oooo.. .oooo... ..oooo.. .oo..oo. .oo..oo. .oo.oo.. .oo..oo. .ooooo.. .oo..... .oo..oo. .oo..oo. .oo..oo. .oo..... .oo..oo. .oooooo. .oo..oo. .oo..oo. .oo.oo.. .oo..oo. .ooooo.. ..oooo.. .oooo... 7 ........ ........ ........ ........ linia ekranowa (skaningowa)
Przykładowa treść 8 linii ekranowych z przesunięciem o 1 cykl koloru
1 1 2 2 2 0 7 8 5 6 3 4 9 - kolejna dana w linii 0 ........ ........ ........ ......xx .oo....o oooo.... oooo...o ooo...xx oooo...o o..oo..o o..oo..o o.oo..xx o..oo..o oooo...o o......o o..oo.xx o..oo..o o..oo..o o......o o..oo.xx ooooo..o o..oo..o o..oo..o o.oo..xx o..oo..o oooo.... oooo...o ooo...xx 7 ........ ........ ........ ......xx linia ekranowa (skaningowa)
Po włączeniu przesuwu poziomego linia, niezależnie od ustawienia szerokości ekranu w rejestrze DMACTL, będzie miała logiczną szerokość, jak dla obrazu szerokiego, czyli:
- 48 bajtów dla trybów 0 OS, 3 ANTIC, 7 OS, 8 OS, 9 OS, 10 OS, 11 OS, 12 OS, 13 OS i 15 OS,
- 24 bajty dla 1 OS, 2 OS, 5 OS, 6 OS i 14 OS,
- 12 bajtów dla 3 OS, 4 OS.
Ponieważ w różnych trybach jeden piksel na szerokość zajmuje różną ilość cykli koloru, tak więc przesunięcie treści ekranu o cykl koloru jest równoważne z przesunięciem o piksel wyłącznie w trybach 1 OS i 2 OS, 6 OS, 7 OS, 12 OS, 13 OS, 14 OS i 15 OS.
Przykładowa treść 8 linii ekranowych w trybie średniej rozdzielczości z przesunięciem o 1 cykl koloru
11 11 11 11 11 22 22 22 22 22 01 23 45 67 89 01 23 45 67 89 01 23 45 67 89 - kolejna dana w linii 0 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. xx .o o. .. .o oo oo .. .. oo oo .. .o oo o. .. xx oo oo .. .o o. .o o. .o o. .o o. .o o. oo .. xx o. .o o. .o oo oo .. .o o. .. .. .o o. .o o. xx o. .o o. .o o. .o o. .o o. .. .. .o o. .o o. xx oo oo o. .o o. .o o. .o o. .o o. .o o. oo .. xx o. .o o. .o oo oo .. .. oo oo .. .o oo o. .. xx 7 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. xx : 1 1 1 1 1 : 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 - piksel linia ekranowa (skaningowa)
W trybach wysokiej rozdzielczości 0 OS, 3 ANTIC i 8 OS, gdzie jeden piksel ma szerokość połowy cyklu koloru, przesunięcie o cykl koloru przesuwa treść obrazu o 2 piksele.
Przykładowa treść 8 linii ekranowych w trybie wysokiej rozdzielczości z przesunięciem o 1 cykl koloru
1 1 2 2 2 0 7 8 5 6 3 4 9 - kolejna dana w linii 0 ........ ........ ........ ......xx .oo....o oooo.... oooo...o ooo...xx oooo...o o..oo..o o..oo..o o.oo..xx o..oo..o oooo...o o......o o..oo.xx o..oo..o o..oo..o o......o o..oo.xx ooooo..o o..oo..o o..oo..o o.oo..xx o..oo..o oooo.... oooo...o ooo...xx 7 ........ ........ ........ ......xx : 111111 11112222 222222 : 01234567 89012345 67890123 456789 - piksel linia ekranowa (skaningowa)
W trybach niskiej rozdzielczości 3 OS, 4 OS i 5 OS, gdzie jeden piksel ma szerokość 2 lub 4 cykli koloru, przesunięcie o cykl koloru przesuwa treść obrazu o pół, lub ćwierć (3 OS) piksela bez zmiany interpretacji wartości piksela, jak ma to miejsce w trybach GTIA.
W trybach GTIA (9 OS, 10 OS i 11 OS), gdzie piksel ma szerokość 2 cykli koloru dopiero przesunięcie o 2 cykle koloru prowadzi do przesunięcia ekranu o piksel. Ponieważ przesuwaniem treści obrazu zajmuje się ANTIC, zanim jeszcze GTIA nałoży nań informację o kolorach, więc przesuwanie treści o 1 cykl koloru skutkuje zmianą wartości pikseli na ekranie, jak poniżej:
Przykładowa treść 8 linii ekranowych trybu GTIA bez przesunięcia
1 1 1 1 1 2 2 2 2 2 3 0 3 4 7 8 1 2 5 6 9 0 3 4 7 8 1 - kolejna dana w linii 0 .... .... .... .... .... .... .... .... ...o o... .ooo oo.. ..oo oo.. .ooo o... ..oo oo.. .oo. .oo. .oo. .oo. .oo. oo.. .oo. .oo. .ooo oo.. .oo. .... .oo. .oo. .oo. .oo. .oo. .oo. .oo. .... .oo. .oo. .ooo ooo. .oo. .oo. .oo. .oo. .oo. oo.. .oo. .oo. .ooo oo.. ..oo oo.. .ooo o... 7 .... .... .... .... .... .... .... .... : 0 1 2 3 4 5 6 7 - piksel linia ekranowa (skaningowa)
Przykładowa treść 8 linii ekranowych trybu GTIA z przesunięciem o 1 cykl koloru
1 1 1 1 1 2 2 2 2 2 0 3 4 7 8 1 2 5 6 9 0 3 4 7 8 - kolejna dana w linii 0 .... .... .... .... .... .... .... ..xx .oo. ...o oooo .... oooo ...o ooo. ..xx oooo ...o o..o o..o o..o o..o o.oo ..xx o..o o..o oooo ...o o... ...o o..o o.xx o..o o..o o..o o..o o... ...o o..o o.xx oooo o..o o..o o..o o..o o..o o.oo ..xx o..o o..o oooo .... oooo ...o ooo. ..xx 7 .... .... .... .... .... .... .... ..xx : 0 1 2 3 4 5 6 7 - piksel linia ekranowa (skaningowa)
VSCRL
Uaktywnienie pionowego przesuwu ekranu w linii Display List skutkuje przesunięciem treści ekranu o n linii ekranowych (skaningowych) w górę zależnie od wartości znajdującej się w bitach 0..3 rejestru VSCROL.
Dla potrzeb następnych wyjaśnień załóżmy, że Display List skonstruowana jest następująco:
dlist: $70 : 8 pustych linii $62 screen : LMS + VSCRL + tryb 2 $02 : tryb 2 $02 : tryb 2 $41 dlist : JVB
Kiedy przesunięcie jest mniejsze niż liczba linii zajmowanych przez linię trybu Display List, wtedy linia trybu Display List następująca bezpośrednio po sekcji przesuwanej zostaje "ściśnięta" do jednej linii ekranowej i uczestniczy w wyświetlaniu przesuwanej treści.
Przykładowa treść 3 linii trybu wysokiej rozdzielczości Display List gdy VSCROL=4
1 1 2 2 3 0 7 8 5 6 3 4 1 - kolejna dana w linii 0 .oo..oo. .oo..oo. .oo..... .oo..oo. .oooooo. .oo..oo. .oo..oo. .oo.oo.. .oo..oo. .ooooo.. ..oooo.. .oooo... ........ ........ ........ ........ ........ ........ ........ ........ - pierwsza linia Display List z VSCRL ...oo... .ooooo.. ..oooo.. .oooo... ..oooo.. .oo..oo. .oo..oo. .oo.oo.. 7 .oo..oo. .ooooo.. .oo..... .oo..oo. 8 .oo..oo. .oo..oo. .oo..... .oo..oo. - pierwsza linia Display List bez VSCRL ("ściśnięta" do jednej linii ekranowej) 9 ........ ........ ........ ........ ...oo... .ooooo.. ..oooo.. .oooo... ..oooo.. .oo..oo. .oo..oo. .oo.oo.. .oo..oo. .ooooo.. .oo..... .oo..oo. .oo..oo. .oo..oo. .oo..... .oo..oo. - druga linia Display List bez VSCRL .oooooo. .oo..oo. .oo..oo. .oo.oo.. .oo..oo. .ooooo.. ..oooo.. .oooo... 16 ........ ........ ........ ........ linia ekranowa (skaningowa)
Jeśli bezpośrednio za przesuwaną sekcją znajdzie się pusta linia, to ona będzie wyświetlana przy przesuwaniu w ostatniej linii przesuwanej sekcji.
W przypadku gdy przesunięcie przekracza ilość linii trybu, pierwsza linia sekcji przesuwanej jest rozszerzana do 16 linii ekranowych i zawiera zduplikowaną zawartość linii Display List, natomiast pierwsza linia sekcji nieruchomej nie jest "ściskana", ale nadal uczestniczy w wyświetlaniu zawartości sekcji ruchomej.
Przykładowa treść 3 linii trybu wysokiej rozdzielczości Display List gdy VSCROL=12
1 1 2 2 3 0 7 8 5 6 3 4 1 - kolejna dana w linii 0 .**..**. .**..**. .**..... .**..**. .******. .**..**. .**..**. .**.**.. - zniekształcona treść dwóch pierwszych linii ekranowych (* - piksel, który powinien być wyświetlony, a nie jest) .oo..oo. .ooooo.. ..oooo.. .oooo... ........ ........ ........ ........ ........ ........ ........ ........ - zduplikowana pierwsza linia Display List z VSCRL ...oo... .ooooo.. ..oooo.. .oooo... ..oooo.. .oo..oo. .oo..oo. .oo.oo.. 7 .oo..oo. .ooooo.. .oo..... .oo..oo. 8 .oo..oo. .oo..oo. .oo..... .oo..oo. .oooooo. .oo..oo. .oo..oo. .oo.oo.. .oo..oo. .ooooo.. ..oooo.. .oooo... ........ ........ ........ ........ ........ ........ ........ ........ - pierwsza linia Display List z VSCRL .oooooo. .oooooo. ..ooooo. .oo..oo. .oo..... .oo..... .oo..... .oo..oo. 15 .ooooo.. .ooooo.. .oo..... .oooooo. 16 .oo..... .oo..... .oo..oo. .oo..oo. .oo..... .oo..... .oo..oo. .oo..oo. .oooooo. .oo..... ..ooooo. .oo..oo. ........ ........ ........ ........ ........ ........ ........ ........ - pierwsza linia Display List bez VSCRL .oooooo. .oooooo. ..ooooo. .oo..oo. .oo..... .oo..... .oo..... .oo..oo. 23 .ooooo.. .ooooo.. .oo..... .oooooo. 24 ........ ........ ........ ........ .oooooo. .oooooo. .oo..oo. .oo..... ...oo... .....oo. .oo.oo.. .oo..... ...oo... .....oo. .oooo... .oo..... ...oo... .....oo. .oo.oo.. .oo..... - druga linia Display List bez VSCRL ...oo... .oo..oo. .oo..oo. .oo..... .oooooo. ..oooo.. .oo..oo. .oooooo. 31 ........ ........ ........ ........ linia ekranowa (skaningowa)
Testowanie wielkości przesunięcia odbywa się poprzez sprawdzenie czy odpowiednie bity są wyzerowane:
- w trybach 8 OS, 9 OS, 10 OS, 11 OS, 14 OS i 15 OS - bity 0..3,
- w trybach 6 OS i 7 OS - bity 1..3,
- w trybach 4 OS i 5 OS - bity 2..3,
- w trybach 0 OS, 3 ANTIC, 1 OS, 3 OS i 12 OS - bit 3,
- w trybach 2 OS i 13 OS nie jest sprawdzany żaden bit rejestru VSCROL i dlatego w tych trybach nie występuje efekt duplikacji.
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 (na dole dla znaków $00-$5F, na górze dla znaków $60-$7F - w ostatnim wypadku rysowanie znaku odbywa się od drugiej linii matrycy, zaś dwie pierwsze linie matrycy wyświetlane są jako dwie ostatnie linie znaku). Ostatnia ćwiartka zestawu znaków (znaki $60-$7F) to w wewnętrznej organizacji ANTIC-a małe litery alfabetu angielskiego, tak więc tryb ten jest przydatny dla edytorów tekstu (i w istocie jest wykorzystywany np. przez program SpeedScript czy EuroTekst), 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 szerokość 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).
Kształty znaków w trybach tekstowych definiowane są za pomocą generatora znaków. Na rysowanie znaków w trybach znakowych ma wpływ stan rejestru CHACTL ($D401) (cień CHACT ($2F3)).
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 11 i GRAPHICS 10. 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 używanie 16 barw.
Nie są to tryby układu ANTIC - z punktu widzenia tego układu wszystkie trzy to monochromatyczny tryb najwyższej rozdzielczości (GRAPHICS 8). 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. Natomiast w komputerach SECAM, z powodu ograniczeń sprzętowych układu FGTIA (zob.), tryb GRAPHICS 9 oferuje 8 odcieni, a GRAPHICS 11 - 15 kolorów.
W systemie PAL, dzięki pewnej jego właściwości, zmieszanie dwóch trybów wielokolorowych - tego z 16 stopniami szarości z tym z 16 kolorami - daje dostęp do trybu graficznego o rozdzielczości 80x96 pikseli w 256 kolorach (pełne osiem bitów na piksel). Trybu tego używa program Paint 256 (ta sztuczka nie działa, jeśli używamy VBXE i wyjścia RGB).
Dodatkowo obraz w trybie GRAPHICS 10 jest przesunięty o pół piksela (1 cykl koloru) w prawo w stosunku do położenia pikseli w trybach 9 i 11. Pozwala to na podwojenie rozdzielczości poziomej obrazu powstałego ze zmieszania trybów 9 i 10 (HIP, TIP).
Przełączanie trybów w linii
Poprzez ingerencję w zawartość rejestru GTIACTL w trakcie rysowania linii skanningowej można przełączyć tryb GTIA, co umożliwia uzyskanie kilku pionowych pasów na ekranie wyświetlających grafikę w różnych trybach. Jakkolwiek technikę tę można stosować uzyskując spodziewane rezultaty we wszystkich trybach ANTIC-a, to w przypadku trybów wysokiej rozdzielczości efekt jest nieco inny od zamierzonego.
Kiedy podczas rysowania linii skanningowej zostanie włączony (bity 6 i 7 rejestru GTIACTL n.p. o wartości %01), po czym w tej samej linii na powrót wyłączony (bity 6 i 7 GTIACTL o wartości %00) tryb GTIA, wtedy zamiast oczekiwanego hires-u otrzymamy tryb 4-kolorowy przypominający Graphics 15, ale w którym kolory dla poszczególnych pikseli brane są z następujących rejestrów:
- %00 COLPF0 ($D016) (cień COLPF0S ($02C4)),
- %01 COLPF1 ($D017) (cień COLPF1S ($02C5)),
- %10 COLPF2 ($D018) (cień COLPF2S ($02C6)).
- %11 COLPF3 ($D019) (cień COLPF3S ($02C7)).
a nie, jak w przypadku trybu $0E, z:
- %00 COLBAK ($D01A) (cień COLBAKS ($02C8)),
- %01 COLPF0 ($D016) (cień COLPF0S ($02C4)),
- %10 COLPF1 ($D017) (cień COLPF1S ($02C5)),
- %11 COLPF2 ($D018) (cień COLPF2S ($02C6)).
W ten sposób na ekranie można zobaczyć tryb wysokiej rozdzielczości z lewej strony, tryb GTIA (n.p. Graphics 9) pośrodku, a tryb wielokolorowy z prawej.
Wraz z początkiem linii skanningowej wszystko wraca do normy, skutkiem czego w nowej linii rysowany jest z powrotem hires.
Przykład użycia trzech trybów w linii znajduje się w demie Unity grupy Our 5oft czy grafice Benhakker autorstwa Kaza.
Na bazie tej sztuczki Pavros opisał tryb E+ w którym kolor ramki jest niezależny od kolorów pikseli.
Ciekawostki
- Jedna z najbardziej zaawansowanych animacji opartych o Display List została stworzona w demku do gry Five to five przez Gizmo Magic. W liniach trybu $0e wykonana jest pseudotrójwymiarowa animacja dywanu, czyli coś na kształt teksturowania wykonywanego na falującej powierzchni.
- Ciekawy przykład Display List zawiera gra Galaxian - większość ekranu jest tworzona za pomocą rozkazów pustych linii, a grafika widoczna w tych liniach jest w całości generowana przez graczy i pociski.
- Ciekawa sztuczka została wykorzystana w grze Knight Lore, gdzie dane wyświetlane na ekranie oddalone o 1 bajt w rzeczywistości w pamięci oddalone są o 8 bajtów: Display List zbudowana została w taki sposób, że generator znaków pełni rolę pamięci ekranu, natomiast wskaźnik pamięci ekranu ustawiony jest na sekwencję $00-$7f. W efekcie pamięć ekranu zajmuje 128 bajtów.
Zobacz
- Dyskusja na AtariOnline o "trójtrybie"
- Artykuł Pavrosa o trybie E+