| Start | Super Packer | Atari Graphics Studio / AGS | Graph2Font / G2F | Mads | MadPascal |   http://madteam.atari8.info  
SKŁAD GRUPY
PRODUKCJE
scena
gry
użytki
vbxe
SPRZĘT
Sio2SD / Pajero
Sio2SD / Rocky
Stereo / Pajero
GTIA / Psychol
ANTIC + VBXE test
ARTYKUŁY
DEMO EFFECTS
LINKI
   

Voy/SSG^Dial
MARIA - czyżby następca ANTIC-a ?

Sercem Atari 7800 jest układ graficzny o nazwie MARIA. Obsługuje on całą grafikę i wyświetlanie obrazu, korzystając między innymi z sygnałów VSYNC i VBLANK.

GRAFIKA

MARIA nie stosuje w swym działaniu koncepcji graczy, pocisków i pola gry, jak to ma miejsce w 2600 i 5200. Rozwiązaniem stosowanym przez nią jest technika zbliżona do obecnej w nieco starszych automatach. Każdy wyświetlany raster jest jak gdyby bitmapą; mapa ta przechowywana jest w jednym z obszarów układu MARIA, zwanym RAM liniową (Line RAM). Zatem nim coś zostanie wyświetlone, trafia najpierw do owego obszaru i dopiero później jest odczytywane i przekazywane na ekran.

Załóżmy, że zajmiemy się teraz pojedynczym rastrem i zechcemy skomponować przy jego użyciu obraz na ekranie. Przenosimy jego dane do Line RAM, wskazując jakie dane powinny zostać umieszczone na konkretnej pozycji poziomej. Grafika jako taka ma być przekazywana w małych kawałkach nachodzących na siebie. Kolejność fragmentów rastra określa priorytet obiektu umieszczonego na samej górze.

Gdy dane grafiki zostaną przekazane do Line RAM, określić trzeba, jakie jej fragmenty będą odnosić do którejś z ośmiu (8) palet. Każdy piksel może przyjąć jeden z trzech (3) kolorów danej palety lub być przezroczystym (wyłączonym). Line RAM zawiera informację tylko o jednym rastrze; posiada dwa bufory - gdy zawartość jednego jest przekazywana do wyświetlania, drugi przyjmuje dane kolejnego rastra. Oznacza to, że konstruowanie grafiki rastra jest nieco długie (relatywnie ;), a sama grafika widoczna na ekranie jest przechowywana w Line RAM raster po rastrze.

Jedynym ograniczeniem co do liczby i rozmiaru obiektów wyświetlanych przez strumień elektronów w jednostce czasu (chodzi tu o pojęcie "scan line", co w j.angielskim oznacza wykreślenie przez w/w strumień na ekranie jednej linii) jest ilość czasu, jaki zajmie załadowanie każdego do Line RAM, przy założeniu, że każde ze wczytań ;) odbędzie się podczas rysowania jednej linii.

WYŚWIETLANIE

Istnieją w sumie 262 rastry na ramkę (1/60 sekundy -> w systemie NTSC). "Widzialny" ekran (podczas którego MARIA próbuje coś wyświetlić) zaczyna się na 16 rastrze i kończy się na 258. Obszar widzialny na wszystkich telewizorach zaczyna się na 41 rastrze i kończy się na 232, 192 linie później. Rastry wyświetlane poza tym obszarem nie będą widziane na większości odbiorników TV.

Wyświetlanie jest automatycznie podejmowane przez układ MARIA i realizowane jest w dwóch etapach: konstruowanie Line RAM i wyświetlanie grafiki. Konstruowanie Line RAM jest automatycznie inicjowane każdym rastrem przez MARIĘ i jako proces kierowane jest przez wcześniej określoną listę instrukcji zwaną Display List [firma Atari lubi używać sprawdzonych pomysłów :) - przyp. Voy]. Jako takie istnieje dzięki procesowi zwanemu DMA (Direct Memo- ry Access - - bezpośredni dostęp do pamięci). Oznacza to, że działanie 6502 zawieszane jest na czas, gdy MARIA bada, czy w pamięci RAM i ROM znajduje się Display List i informacja o grafice. DMA wystąpi podczas każdej "widzialnej" rysowanej przez strumień elektronów linii i potrwa nie dłużej, niż potrzeba czasu na jej narysowanie. Skonstruowana Line RAM wyświetlana jest na każdej następującej po sobie linii i MARIA odczyta każdą Display Listę jedną linię przed aktualnie wyświetlaną. Cała Line RAM czyszczona jest linia po linii, a kolor BACKGRND będzie wyświetlany w przypadku braku zapisania danych.

Display List

DMA dotyczy głównie odczytu Display Listy. DL to lista instrukcji wskazujących, gdzie odnaleźć dane grafiki, w jakie miejsce na ekranie należy je przenieść i inne szczegółowe dane pomocne w konstruowanie wyświetlanej linii. Display List tworzy wiele tzw. "nagłówków". Większość z nich stanowi ciąg złożony z czterech bajtów (wyjątki zostaną omówione później). Jeśli drugi bajt równy jest zeru, wskazuje koniec Display Listy, a DMA zostaje zatrzymany, pozwalając tym samym 6502 na kontynuowanie pracy. Format nagłówka jest następujący:

    ________________________________
    |   |   |   |   |   |   |   |   |
    | A7| A6| A5| A4| A3| A2| A1| A0|
    |___|___|___|___|___|___|___|___|
    |   |   |   |   |   |   |   |   |
    | P2| P1| P0| W4| W3| W2| W1| W0|
    |___|___|___|___|___|___|___|___|
    |   |   |   |   |   |   |   |   |
    |A15|A14|A13|A12|A11|A10| A9| A8|
    |___|___|___|___|___|___|___|___|
    |   |   |   |   |   |   |   |   |
    | H7| H6| H5| H4| H3| H2| H1| H0|
    |___|___|___|___|___|___|___|___|


                  lub

     _______________________________
    |                               |
    |    N I Ż S Z Y   A D R E S    |
    |___|___|___|___|___|___|___|___|
    |               |               |
    |  P A L E T A  |   SZEROKOŚĆ   |
    |___|___|___|___|___|___|___|___|
    |                               |
    |    W Y Ż S Z Y   A D R E S    |
    |___|___|___|___|___|___|___|___|
    |                               |
    | P O Z Y C J A  P O Z I O M A  |
    |___|___|___|___|___|___|___|___|

  gdzie:

 ADRES  (A15-A0) - adres danych grafiki

 PALETA (P2-P0)  - dotyczy numeru
                   palety kolorów 0-7

 SZEROKOŚĆ (W4-W0) - uzupełnienie szerokości. Zawiera liczbę bajtów
                     danych grafiki do pobrania: wartości 1 do 31

 POZYCJA
 POZIOMA (H7-H0) - pozycja X na ekranie, gdzie będzie umieszczana lewa
                   krawędź grafiki.
                     0-159 => Widzialna
                   160-255 => Niewidzialna. Zawijanie ekranu występuje
                              na granicy 255/0.

Każdy nagłówek dotyczy jednego elementu graficznego, który posiadać może dowolną szerokość. Jeśli na linii powinno się pojawić dziesięć obiektów, Display List dla tej jednej linii rysowanej przez strumień elektronów powinno mieć długość dziesięciu (10) nagłówków, poprzedzonych przez dwa (2) bajty, z których pierwszy jest ignorowany, a drugi winien wynosić 0, by zakończyć DMA.

Display List może przekroczyć tylko jedną granicę łączącą dwie strony pamięci, więc jej maksymalna długość wy- nosić może maksymalnie 512 bajtów. Dodatkowo Display Listy muszą być w pamięci RAM, a to z powodu wymaganego czasu dostępu.

Lista Display List

MARIA ma dostęp do konkretnej Display Listy poprzez wcześniejsze odczytanie tzw. Display List List :) (czyli Lista Display List; umówmy się, że będziemy używać skrótu DLL, oki ^.^?) Lista ta jest serią 3-bajtowych wpisów. Każdy z tych wpisów wskazuje na daną Display Listę; w każdym z nich jest wartość zwana OFFSET, wskazująca na liczbę rastrów, których powinna używać dana Display List. OFFSET zmniejszana jest na końcu każdego rastra aż do osiągnięcia wartości ujemnej, informującej, że teraz powinny być odczytywane i używane wpisy następnej DLL. Za każdym razem, gdy pobierane są dane graficzne, wartość OFFSET dodawana jest do starszego bajtu adresu (w tabelce powyżej określonego jako starszy adres), określającego aktualny adres, pod jakim można znaleźć interesujące nas dane. Umożliwia to jednej Display Liście na określenie wiele rastrów grafiki. Bez OFFSETu by "dobrać się" ;) do danych grafiki, trzeba by było dla każdego rastra tworzyć oddzielną Display List, a DLL dla każdej Display Listy. Nie tyle, że zużywałoby to masę pamięci, ale również i czasu, który zabrałaby każda manipulacja tymi Display Listami podczas przemieszczania obiektów. Przez to, że wartość OFFSET dodawana jest do STARSZEGO bajtu adresu, każdy z rastrów grafiki dla danego obiektu musi być oddzielony przez $100 (256) bajtów lub jedną stronę.

Grupy rastrów określone przez jeden wpis DLL określamy jako 'strefę' (w oryginale "zone"). I znów: liczba rastrów w strefie wynosi OFFSET+1. Większe strefy oznaczają, że dla DLL, wszelakich Display List i map znaków (w oryginale "Character Maps") po- trzebne jest mniej pamięci RAM (patrz TRYBY DMA). Lecz rozważając sposób używania stref zrozumiesz, jak osiągnąć płynny pionowy ruch: każdy z wpisów na górze i dole musi być wypełniony zerami. Dla przykładu: jeśli najwyższy raster obiektu ma się pojawić na ostatniej linii szesnastej (16) wy- ższej strefy, musi mieć ponad sobą 15 linii wypełnionych zerami. Jeśli obiekt ten ma 8 pikseli (2 bajty) i jego najwyższa linia danych umiesz- czona jest od adresu $CF04, potrzebować będziesz dwóch bajtów o wartości 0 w adresach $D004, $D104, $D304 ... i $DE04 (pamiętaj, że zmniejsza się OFFSET). Jako że dzięki temu dodawać możesz wiele stron zer, możesz określić sposób interpretowania przez MARIĘ określonych danych będących zerami, nawet jeśli ich tam nie ma. Nazywane jest to "dziurawym DMA" (w oryg. "Holey DMA"), gdyż DMA będzie widzieć "dziury" w danych, nawet jeśli naprawdę ich tam jest brak. Może być włączane i wyłączane strefa po strefie poprzez wpis DLL. Dziurawe DMA ^_^ występuje przy strefach 8- lub 16-rastrowych, ale dać może ten sam efekt dla innych rozmiarów stref. Można zasugerować MARII, by interpretowała nieparzyste 4kB bloki jako zera (dla 16 wyższych stref) lub nieparzyste 2kB bloki jako zera dla 8 wyższych stref. Działać to będzie jedynie dla adresów wyższych niż $8000. Oznacza to, bloki te zawierać mogą ważny kod, tablice i dane graficzne używane w strefie, gdzie dziurawego DMA nie ma.

Jeden z bitów wpisu DLL mówi MARII, by wytworzyła przerwanie DLI (Display List Interrupt) dla danej strefy. Przerwanie wystąpi poprzedzając DMA na ostatniej linii POPRZEDNIEJ strefy. Przerwanie to jest niemaskowalne i powoduje, że procesor przechodzi do adresu podawanego przez wektor NMI ($FFFA-$FFFB). Przerwanie w żaden sposób nie oddziałuje na DMA, więc działanie procesora wciąż będzie zawieszane na początku następnego rastra.

Format 3-bajtowego wpisu DLL jest następujący:

	
     _______________________________
    |   |   |   |   |               |
    |DLI|H16| H8| 0 |  O F F S E T  |
    |___|___|___|___|___|___|___|___|
    |                               |
    |  S T A R S Z Y  B A J T  D L  |
    |___|___|___|___|___|___|___|___|
    |                               |
    |  M Ł O D S Z Y  B A J T  D L  |
    |___|___|___|___|___|___|___|___|

  gdzie:

 DLI - Znacznik przerwania DLI:
         0 => brak DLI
         1 => przerwanie po DMA na
              ostatniej linii poprzed-
              nieh strefy

 H16 - 16 wyższych stref, gdzie dziu-
       rawe DMA może być włączone:
       0 => nie włączone
       1 => włączone; DMA interpretuje
            nieparzyste 4kB bloki jako
           zera (A12 wysokie => dane=0)

 H8  - 8 wyższych stref, gdzie dziu-
       rawe DMA może być włączone:
       0 => nie włączone
       1 => włączone; DMA interpretuje
            nieparzyste 2kB bloki jako
           zera (A11 wysokie => dane=0)

 OFFSET - początkowa wartość OFFSET,
          tylko 4 bity

 ADRES DL - adres Display Listy dla tej
            strefy

DLL może przekroczyć tylko jedną granicę łączącą dwie strony pamięci, więc jej maksymalna długość wynosić może maksymalnie 512 bajtów. Dodatkowo DLL muszą być w pamięci RAM, a to z powodu wymaganego czasu dostępu.

Tryby DMA

Do określania danych graficznych służą dwa tryby. Pierwszy, zwany trybem bezpośrednim, został już wyjaśniony, gdzie nagłówek (w Display Liście) wskazuje bezpośrednio na dane grafiki. Drugi z trybów zwany jest trybem pośrednim lub znakowym i różni się nieco od porzednika tym, że nagłówek wskazuje tu na mapę znaków. Tryb pośredni zostaje wybrany przez każdy z nagłówków, który tego wymaga, poprzez poszerzony (5 bajtów) nagłówek. Format tego nagłówka jest następujący:

     _______________________________
    |   |   |   |   |   |   |   |   |
    | A7| A6| A5| A4| A3| A2| A1| A0|
    |___|___|___|___|___|___|___|___|
    |   |   |   |   |   |   |   |   |
    | WM|  1|IND| 0 | 0 | 0 | 0 | 0 |
    |___|___|___|___|___|___|___|___|
    |   |   |   |   |   |   |   |   |
    |A15|A14|A13|A12|A11|A10| A9| A8|
    |___|___|___|___|___|___|___|___|
    |   |   |   |   |   |   |   |   |
    | P2| P1| P0| W4| W3| W2| W1| W0|
    |___|___|___|___|___|___|___|___|
    |   |   |   |   |   |   |   |   |
    | H7| H6| H5| H4| H3| H2| H1| H0|
    |___|___|___|___|___|___|___|___|


                  lub

     _______________________________
    |                               |
    |    M Ł O D S Z Y  B A J T     |
    |___|___|___|___|___|___|___|___|
    |                               |
    |      B A J T  T R Y B U       |
    |___|___|___|___|___|___|___|___|
    |                               |
    |    S T A R S Z Y  B A J T     |
    |___|___|___|___|___|___|___|___|
    |               |               |
    |  P A L E T A  |   SZEROKOŚĆ   |
    |___|___|___|___|___|___|___|___|
    |                               |
    | P O Z Y C J A  P O Z I O M A  |
    |___|___|___|___|___|___|___|___|

  gdzie:

 MŁODSZY, STARSZY BAJT - adres danych
   (A15-A0)              graficznych

 BAJT TRYBU - bit trybu zapisu.
              0 => 160x2 lub 320x1
              1 => 160x4 lub 320x2

 IND        - 0 => tryb bezpośredni
            - 1 => tryb pośredni

 PALETA (P2-P0) - dotyczy numeru palety
                  kolorów 0-7

 SZEROKOŚĆ (W4-W0) - uzupełnienie szerokości. Zawiera liczbę bajtów
                     danych grafiki do pobrania: wartości 1 do 32

 POZYCJA
 POZIOMA (H7-H0) - pozycja X na ekranie, gdzie będzie umieszczana lewa
                   krawędź grafiki.
                     0-159 => Widzialna
                   160-255 => Niewidzialna. Zawijanie ekranu występuje
                              na granicy 255/0.

Należy wspomnieć o jednej ważnej rzeczy, wynikłej z poszerzenia nagłówka. Z powodu tego, że koniec DMA wskazywany jest przez obecność zera w drugim bajcie nagłówka i w 5-bajtowym nagłówku bajt szerokości nie jest drugi, lecz czwarty, szerokość wynosząca 0 w tak poszerzonym nagłówku jest poprawna i będzie interpretowana jako 32.

Gdy wybrany jest tryb pośredni, trwa tak długo, jak odnoszący się do niego nagłówek jest przetwarzany. MARIA powróci do trybu bezpośredniego przed odczytem następnego nagłówka.

W trybie pośrednim szerokość wskazuje, ile należy stworzyć odniesień do mapy znaków, gdzie każdy wpis do mapy znaków wskazuje na jeden bajt danych graficznych (mapa znaków może wskazywać na dwa (2) kolejne bajty grafiki; patrz CTRL w punkcie REJESTRY). Idea kryjąca się za trybem znakowym (pośrednim) pozwala określić wielką ilość grafiki za pomocą jednego tylko nagłówka. Grafika zaczyna się na pozycji poziomej określonej przez nagłówek i każdy znak (grafika odnosząca się do jednego z wpisów mapy znaków) jest wstawiana na prawo od poprzedniego. Jeden znak może być zmieniony bez oddziaływania na inne poprzez zmianę wpisu mapy znaków odnoszącego się do tego znaku. W bardzo dobry sposób wykorzystano to w grze "Ms. Pacman" dla teł takich jak labirynt i kropki.

Mapa znaków złożona jest z W wpisów, gdzie W jest określoną szerokością (od ang. "width") i każdy wpis jest jednobajtowy. Każdy z tych wpisów jest młodszym bajtem adresu znaku, natomiast starszy bajt adresu określony jest przez rejestr bazy znaków (Character Base, patrz również CHARBASE w punkcie REJESTRY). Oznacza to, że każdy znak na linii wykreślanej przez elektrony musi mieć taki sam starszy bajt adresu ("siedzi" w tej samej 256-bajtowej stronie).

Tryby graficzne

Normalnym trybem graficznym jest tryb 160, gdzie ekran podzielony jest poziomo na 160 pikseli. Zwykle grafika tworzona jest w trybie 160x2, gdzie są dwa bity koloru opisujące każdy piksel i te dwa bity odnoszą się do jednej z ośmiu palet. Jeden może też opisywać grafikę w trybie 160x4, gdzie są cztery bity koloru na piksel. W trybie tym każdy bajt danych graficznych określa tylko dwa (2) piksele grafiki. Jeśli preferowana jest wyższa rozdzielczość, to dobrym rozwiązaniem jest tryb 320x1, gdzie ekran dzielony jest poziomo na 320 pikseli i każdy piksel posiada jeden bit koloru. Dostępny jest również tryb 320x2, posiadający największą ilość kolorów - w nim na każdy piksel przypada dwa bity koloru.

Wybór określonego trybu jest wynikiem dwóch oddzielnych operacji: określenia TRYBU ZAPISU i określenia TRYBU ODCZYTU. TRYB ZAPISU określany jest przez bit trybu zapisu (ang. WM bit) poszerzonego 5-bajtowego nagłówka, co zresztą wyjaśniono powyżej. TRYB ODCZYTU określany jest przez rejestr CTRL. Obie z tych specyfikacji będą odnosić efekt aż do czasu ich zmiany. TRYB ZAPISU nie jest inicjalizowany przez MARIĘ przy włączaniu zasilania i musi być inicjalizowany przez kartridż w ogóle przed rozpoczęciem wyświetlania. Powodem określania TRYBU ZAPISU przez poszerzony nagłówek jest umożliwienie programiście zmiany ze 160x2 na 160x4 (lub z 320x2 do 320x1 i vice-versa) podczas DMA dla każdej oddzielnej linii rysowanej przez strumień elektronów. Patrz również CTRL w punkcie REJESTRY.

REJESTRY

Adresy rejestrów MARII kontrolujących wyświetlanie zostały omówione w po- przednim numerze "Seriousa" w artykule pod nazwą "Mapa pamięci Atari 7800".

Palety

Rejestry palet używane są do określenia kolorów dla grafiki. W sumie jest ich osiem (8), każda zawiera trzy kolory. Kolory jako takie występują w następującej formie:

    _______________________________
   |   |   |   |   |   |   |   |   |
   | C3| C2| C1| C0| L3| L2| L1| L0|
   |___|___|___|___|___|___|___|___|
 gdzie C3-C0 to  kolor,  a  L3-L0  jego
 jasność - w sumie 256 różnych odcieni.

Rejestry palet mają następujące nazwy: P0C1, P0C2, P0C3, P1C1, P1C2, P1C3, P2C1, P2C2, P2C3, aż do P7C1, P7C2, P7C3. Piksel, którego dwa bity koloru wynoszą "10" i który dotyczy palety nr 3, będzie wypełniany kolorem bazującym na wartości P3C2. Kolor zerowy każdej z palet jest przeźroczysty. Dodatkowo istnieje rejestr zwany BACKGRND, używany do określania koloru tła. Wszystkie palety i BACKGRND są typu ODCZYT/ZAPIS, lecz muszą być one odczytywane przy użyciu adresowania abolutnego indeksowego 6502.

OFFSET

Rejestr OFFSET jest 4-bitową wartością dodawaną automatycznie do starszego bajtu adresu przy każdym pobraniu danych graficznych, zarówno w trybie bezpośrednim, jak i pośrednim. Rejestr ten jest wewnętrznym rejestrem MARII i ustawiany przez każdy wpis DLL.

W poprzednim wcieleniu ^.^ rejestr OFFSET zajmował pewien adres pamięci. Adres ten jest teraz wolny, lecz powinieneś tu WPISYWAĆ ZERO PRZY WŁĄCZANIU ZASILANIA, BY UMOŻLIWIĆ PRZYSZŁE ROZSZERZENIA.

CHARBASE

Rejestr CHARBASE służy określaniu starszego bajtu adresu dla każdego pobierania danych graficznych w trybie znakowym (pośrednim). Jak pamiętasz, mapa znaków (wskazująca na nagłówek w Display Liście) określa młodszy bajt adresu danych graficznych. Każdy z tych młodszych bajtów złożony jest z sumy CHARBASE i OFFSET, by móc poprzez pełny 16-bitowy adres pokazać, gdzie można znaleźć dane graficzne. Rejestr CHARBASE jest TYLKO DO ZAPISU.

DPPH

DPPH oznacza Display list Pointer Pointer High (starszy bajt wskaźnika Display Listy) i zawiera starszy bajt adresu DLL. Rejestr ten jest TYLKO DO ZAPISU. DLL może przekroczyć tylko jedną granicę łączącą dwie strony pamięci, w którym to wypadku DPPH jest wewnętrznie zwiększany, następnie resetowany na końcu widzialnego ekranu; w ten sposób staje się poprawny dla następnej ramki. Rejestr ten (oraz DPPL) powinien być zapisywany przed włączeniem DMA. Gdy DMA jest już włączone, DPPH i DPPL mogą być zapisywane w każdym czasie, jako że odczytywane są one tylko na początku ekranu.

DPPL

Rejestr też używany jest do określania młodszego bajtu adresu DLL. Jest TYLKO DO ZAPISU.

MSTAT

MSTAT jest rejestrem przeznaczonym TYLKO DO ODCZYTU, komunikującym się ze statusem wygaszania pionowego poprzez bit 7 (MSB). Gdy bit ten zostaje ustawiony, VBLANK jest włączane. Gdy VBLANK zostanie wyłączone, DMA rozpocznie się zgodnie z wytycznymi twojej Display Listy. Tranzycja ta występuje przy szesnastym (16) rastrze ramki.

CTRL

Rejestr CTRL jest rejestrem TYLKO DO ZAPISU używanym do kontroli wielu trybów MARII. Poprzez rejestr ten kontrolować można, czy kolor tła poszerzy krawędź ekranu TV (poziomo) poza obszar, na którym może być umiejscawiana grafika, czy też kolor tła zatrzymuje się na poziomych krańcach grafiki i granica ta widoczna jako czarny obszar. Ten obszar graniczny jest obszarem, który widoczny jest niezależnie od różnych odbiorników telewizyjnych.

CTRL określa również, czy znaki (w trybie znakowym) mają szerokość jednego lub dwóch bajtów. To znaczy, czy z adresu wskazywanego przez wpis mapy znaków i CHARBASE powinien być pobrany jeden czy dwa bajty. Przewagą znaków dwubajtowych jest to, że określają taką samą liczbę pikseli, jaką może określić dwa razy więcej wpisów mapy znaków. Wadą natomiast jest ingerencja w ekran podczas zmiany jednego znaku.

Rejestr ten kontroluje również tworzenie sygnału rozdzielania koloru (w oryginale "color burst signal"). Brak sygnału oznacza wyświetlanie grafiki co prawda czarno-białej, lecz bardziej przejrzystej, niż w przypadku użycia odcieni szarości (wartości od $00 do $0F).

Kolejny bit CTRL włącza tryb "Kangaro- o", usuwający przezroczystość, co oznacza, że każdy piksel o kolorze "0" raczej będzie kolorem tła, aniżeli przezroczystym. Nazwa pochodzi od gry automatowej "Kangaroo" firmy Atari.

Poprzez rejestr CTRL może być również włączane i wyłączane DMA. Po włączeniu zasilania DMA jest wyłączone i powinno być włączane przez kartridż. Dokonywane powinno być to dopiero po zachowaniu zawartości DPPL i DPPH (dlatego więc DMA nie próbuje odczytywać DLL z nieokreślonej pozycji). DMA powinno być włączane PODCZAS VBLANK i nigdy w czasie tworzenia ekranu (rastry 16-258). Jeśli DMA jest wyłączone, ekran będzie kontynuował wyświetlanie koloru tła.

I w końcu, CTRL określa, gdzie wybrana jest część TRYBU ODCZYTU trybu graficznego (pamiętaj, że część TRYBU ZAPISU określana jest poprzez poszerzony nagłówek). TRYB ZAPISU kontroluje sposób zapisu danych do Line RAM, a TRYB ODCZYTU sposób interpretacji Line RAM i przenoszenia na ekran. Ponieważ TRYB ODCZYTU wpływa na rozpoczęcie wyświetlania pojedynczej linii, ewentualne zmiany TRYBU ODCZYTU powinny mieć miejsce na początku linii, na którą wpływa.

TRYB ZAPISU pozwala na wybór pomiędzy trybami: a) 160x2 lub 320x1, oraz b) 160x4 lub 320x2. TRYB ODCZYTU pozwala na wybór: a)320A lub 320C, b) 320B lub 320D i c) 160A(x2) lub 160B(x4). Poniższa tabela zawiera więcej informacji:

       TRYB     WM     RM1     RM0

       160A     0       0       0
       160B     1       0       0
       320A     0       1       1
       320B     1       1       0
       320C     1       1       1
       320D     0       1       0

 gdzie:

  - WM - tryb zapisu
  - RM1,RM0 - tryb odczytu 1 i 0.

Tryb 320A to prawdziwy tryb 320x1. Piksele, które są "włączone" odnoszą się do koloru drugiego (2) określonej palety. Piksele, które są "wyłączone", są przezroczyste (lub przybierają kolor tła, jeśli włączony jest tryb "Kangaroo"). W trybie 320B, będącym trybem wyświetlania 320x2, odczytywany jest tylko bardziej znaczący bit palety. Oznacza to, że używane są obie palety: zerowa (0) i czwarta (4). Jeśli tryb "Kangaroo" jest wyłączony, przezroczystość dla trybów będzie działać nieco odmiennie. Weź pod uwagę, że para pikseli 320 stanowi jeden 160, więc jeśli wyłączone są oba piksele z pary, nie będą przezroczyste, lecz przyjmą zamiast tego kolor tła. Jeśli oba piksele są wyłączone, będą przezroczyste. Z włączonym trybem "Kangaroo" działają tak, jak powinny działać w tym trybie. Innym czynnikiem dotyczącym trybów 320 jest to, że pozycjonowanie poziome wciąż działa tak jak w trybie 160. Oznacza to, że w trybach 320 obiekty mogą być pozycjonowane tylko co 2 piksele.

Tryby wyświetlania 320C i 320D poszczególnie są nieco podobne do 320B i 320A. Są takie, jakie byś otrzymał, gdybyś zmienił TRYB ZAPISU bez zmieniania TRYBU ODCZYTU (tak jak zmiany trybów podczas rysowania linii ekranu). Jeśli jesteś w trybie 320A i chcesz na linii umieścić znak z większą liczbą kolorów, poprzez zmianę trybów otrzynasz tryb 320C. Podobnie, poprzez zmianę z 320B "w locie" otrzymasz tryb 320D. Sposób, w jaki w trybach 320C i 320D interpretowane są dane, będzie wyjaśniony później.

W trybie 160x4 też odczytywany jest tylko bardziej znaczący bit palety (zauważ, że trybach 160x4 i 320B w ten sam sposób działa TRYB ZAPISU). Z powodu większej liczby bitów koloru, niż jest w stanie obsłużyć każda dana paleta, w trybie 160x4 palety są kombinowane, więc możesz wybrać pomiędzy kombinacjami 0-3 i 4-7. Wynikiem tego w trybie 160x4 dostępnych jest dwanaście (12) kolorów, gdzie kolor pierwszy (1) to P0C1 lub P4C1, drugi (2) to P0C2 lub P4C2, piąty (5) to P1C1 lub P5C1, szósty (6) to P1C2 lub P5C2 itd., a kolory 0, 4, 8 i 12 są przezroczyste. Rejestr CTRL zorganizowany jest w sposób następujący:

    _______________________________
   |   |   |   |   |   |   |   |   |
   | CK|DM1|DM0| CW| BC| KM|RM1|RM0|
   |___|___|___|___|___|___|___|___|

  gdzie:

 CK - wyłączanie kolorów (Color Kill)
      0 => normalny kolor
      1 => brak rozdzielania koloru

 DM1, DM2 - kontrola DMA
            0 => Test A (NIE UŻYWAJ)
            1 => Test B (NIE UŻYWAJ)
            2 => normalne DMA
            3 => brak DMA

 CW - szerokość znaku (Character Width)
      0 => znaki 2-bajtowe
      1 => znaki 1-bajtowe

 BC - kontrola ramki (Border Control)
      0 => ramka o kolorze tła
      1 => czarna ramka

 KM - przełącznik trybu "Kangaroo"
      0 => przezroczystość
      1 => tryb "Kangaroo": bez prze-
           zroczystości

 RM1, RM0 - Tryb Odczytu
            0 => 160x2 lub 160x4
            1 => nie używany
            2 => 320B lub 320D
            3 => 320A lub 320C

(UWAGA: TEST A (DM=0) i TEST B (DM=1) NIE POWINNY być używane! Zostały wprowadzone na etapie projektowania i testów i mogą spowodować nieodwracalne szkody, jak i również USZKODZIĆ MARIĘ!)

W większości powyższych trybów kodowanie danych graficznych jest proste. W trybie 160x2 każda para bitów zorganizowana jest tak, że kolor skrajnego lewego piksela określany jest przez bardziej znaczącą parę bitów, a skrajny prawy piksel przez mniej znaczącą parę bitów.

 160x2

     76      54      32      10    bity
     ___     ___     ___     ___
    |   |   |   |   |   |   |   |
    |___|   |___|   |___|   |___|
      |       |       |       |
      |       |       |       |
      | p  i  | k  s  | e l e |
      |       |       |       |
      |       |       |       |
     / \     / \     / \     / \
    _______________________________
   |   |   |   |   |   |   |   |   |
   |___|___|___|___|___|___|___|___|

              b  a  j  t
          g  r  a  f  i  k  i

W trybie 160x4 dane odczytywane są w następujący sposób: kolor lewego piksela określany jest przez bity 3, 2, 7, 6 (gdzie 3 to MSB, 6 to LSB). Prawy piksel określany jest przez bity 1, 0, 5, 4 (gdzie 1 to MSB, 4 to LSB).

 160x4


      3276       bity         1054
      ___                     ___
     |   |      piksele      |   |
     |___|                   |___|
       |                       |
       +---------------+       |
       |               |       |
       |       +---------------+
       |       |       |       |
      / \     / \     / \     / \
    _______________________________
   |   |   |   |   |   |   |   |   |
   |___|___|___|___|___|___|___|___|

              b  a  j  t
          g  r  a  f  i  k  i

Tryb 320A to mapowanie bezpośrednie takie jak w 160x2, poza tym, że każdy z bitów określa kolor jednego piksela.

 320A(x1)

                  bity

     7   6   5   4   3   2   1   0

                piksele
    _______________________________
   |   |   |   |   |   |   |   |   |
   |___|___|___|___|___|___|___|___|
     |   |   |   |   |   |   |   |
     |   |   |   |   |   |   |   |
     |   |   |   |   |   |   |   |
     |   |   |   |   |   |   |   |
    _______________________________
   |   |   |   |   |   |   |   |   |
   |___|___|___|___|___|___|___|___|

              b  a  j  t
          g  r  a  f  i  k  i

   Tryb 320B działa następująco:

 320B(x2)
                 bity

    73        62      51        40

                piksele
    ___       ___     ___       ___
   |   |     |   |   |   |     |   |
   |___|     |___|   |___|     |___|
     |\       / \     / \       /|
     | \     /   \   /   \     / |
     |  \   /     \ /     \   /  |
     |   \ /       \       \ /   |
     |    /       / \       \    |
     |   | \     /   \     / |   |
     |   |  \   /     \   /  |   |
     |   |   \ /       \ /   |   |
     |   |    /         \    |   |
     |   |   | \       / |   |   |
     |   |   |  \     /  |   |   |
     |   |   |   \   /   |   |   |
     |   |   |    \ /    |   |   |
     |   |   |     /     |   |   |
     |   |   |    / \    |   |   |
    _______________________________
   |   |   |   |   |   |   |   |   |
   |___|___|___|___|___|___|___|___|

              b  a  j  t
          g  r  a  f  i  k  i

Tryb 320C oferuje więcej kolorów niż 320A, lecz nie może być po prostu nazywany 320x2. W tym trybie niektóre z danych graficznych odnoszą się do trochę niestandardowych palet. Jeśli piksel jest ustawiony, przybiera kolor drugi (2) i - jeśli jest skasowany - jest przezroczysty lub ma kolor tła (tak jak w 320A i 320B). Paleta ustalana jest przez kombinowanie bardziej znaczącej palety. Paleta dla skrajnego lewego piksela jest określana przez P2, D3 i D2 (gdzie P oznacza bit palety, a D bit danych graficznych), a grafika określana jest przez D7. Piksel zaraz po prawej używa tej samej palety, określanej przez P2, D1 i D0 i dla danych używa D5. Skrajny prawy piksel używa tej samej palety, lecz D4 dla danych. Mapowanie dla trybu 320C jest następujące:

 320C

     bity
     palety    [P2][D3][D2]
               \__________/
                    |      [P2][D1][D0]
 D7  D6  D5  D4     |      \__________/
 bity koloru        |             /
                    |            /
   piksele          |           /
  _   _   _   _     |          /
 | | | | | | | |    |         /
 |_| |_| |_| |_|    |        /
  |   |   |   |     |       |
  |   |   |   |     |       |
  |   |   |   |    / \     / \
  _____________________________
 |  |   |   |   |   |   |   |  |
 |__|___|___|___|___|___|___|__|
            b  a  j  t
        g  r  a  f  i  k  i

(tu mała uwaga: bity palety, tzn. ich rozpiska, miały być obok siebie, ale niestety, trza ;) było upchać schemat na 38 kolumnach :-( - przyp. Voy)

Tryb 320D jest również nieco skomplikowany. Każdy piksel odnosi się do tej samej palety, lecz bity palety oddziałują na kolor pikseli. Tylko bit palety - użyty w jej definicji - jest bitem bardziej znaczącym (tak samo jak w 320B), więc MARIA będzie odwoływać się tylko do palet zero (0) i cztery (4). Na jeden piksel przypada więcej, niż jeden bit, zatem wybór koloru jest większy. Bity danych graficznych wykorzystane są następująco: każdy z nich jest bardziej znaczącym bitem dwubitowej pary; mniej znaczący bit tej pary jest albo P0 albo P1 (gdzie P to bit palety). Jeśli dana paleta to 0 lub 4 (gdzie P1 i P0 to zero), to jest to normalny tryb 320x1, tak jak 320A. Lecz jeśli dana paleta to 5, będzie użyta paleta 4 i pewne piksele przyjmą albo kolor 1 albo 3, a inne 0 lub 2. Jako przykład więcej konkretów:

 320D        bity palety

    P2  P2  P2  P2  P2  P2  P2  P2

             bity koloru
    DP  DP  DP  DP  DP  DP  DP  DP
    71  60  51  40  31  20  11  00

               piksele
    _______________________________
   |   |   |   |   |   |   |   |   |
   |___|___|___|___|___|___|___|___|
     |   |   |   |   |   |   |   |
     |   |   |   |   |   |   |   |
     |   |   |   |   |   |   |   |
     |   |   |   |   |   |   |   |
    _______________________________
   |   |   |   |   |   |   |   |   |
   |___|___|___|___|___|___|___|___|
              b  a  j  t
          g  r  a  f  i  k  i

To wszystko! Jeśli spodobała się Wam seria o Atari 7800 ProSystem i chcielibyście się dowiedzieć czegoś więcej, to nie krępujcie się i piszcie. Odpowiem na każdy list i na każdego maila...

Voy/SSG^Dial

 

madteam.atari8.info © MadTeam, hosted: www.atari8.info