MARIA

From Atariki

Jump to: navigation, search

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

Spis treści

Numery katalogowe

  • MARIA-B NTSC: C024674
  • MARIA-C NTSC?: C025349
  • MARIA PAL: C025718

Charakterystyka

Specjalnie opracowany na potrzeby konsoli układ MARIA (oznaczenie GCC1702) jest taktowany wewnętrznym zegarem 7.16 MHz (!), nie zmieniającym swej częstotliwości w zależności od częstotliwości głównego procesora. Jest sercem konsoli i obsługuje całą grafikę oraz jej wyświetlanie włączając obsługę sygnałów VSYNC i VBLANK. Jego rejestry znajdują się w obszarze $0020-$003F oraz w cieniu strony zerowej (adresy $0100-$013F), z której korzysta pospołu z TIA.

Grafika

MARIA nie stosuje w swym działaniu koncepcji graczy, pocisków i pola gry, jak to ma miejsce w 2600 i 5200 oraz komputerach 400/800 i XL/XE. 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ć przezroczysty (wyłączony). Line RAM zawiera informację tylko o jednym rastrze; ma dwa bufory - gdy zawartość jednego jest przekazywana do wyświetlania, drugi przyjmuje dane kolejnego rastra. Oznacza to, że konstruowanie grafiki rastra trwa relatywnie długo, 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ęzyku 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 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. Jako takie istnieje dzięki procesowi zwanemu DMA (Direct Memory 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.

Rejestry

Adres

(Atari 7800)

Dostęp Nazwa Opis
$20 R/W BACKGRND BACKGRouND color
$21 R/W P0C1 Palette 0, Color 1
$22 R/W P0C2 Palette 0, Color 2
$23 R/W P0C3 Palette 0, Color 3
$24 STROBE WSYNC Wait for SYNC
$25 R/W P1C1 Palette 1, Color 1
$26 R/W P1C2 Palette 1, Color 2
$27 R/W P1C3 Palette 1, Color 3
$28 R MSTAT Maria STATus
$29 R/W P2C1 Palette 2, Color 1
$2A R/W P2C2 Palette 2, Color 2
$2B R/W P2C3 Palette 2, Color 3
$2C W DPPH DisPlay list list Point High
$2D R/W P3C1 Palette 3, Color 1
$2E R/W P3C2 Palette 3, Color 2
$2F R/W P3C3 Palette 3, Color 3
$30 W DPPL DisPlay list list Point Low
$31 R/W P4C1 Palette 4, Color 1
$32 R/W P4C2 Palette 4, Color 2
$33 R/W P4C3 Palette 4, Color 3
$34 W CHARBASE CHARacter BASE address
$35 R/W P5C1 Palette 5, Color 1
$36 R/W P5C2 Palette 5, Color 2
$37 R/W P5C3 Palette 5, Color 3
$38 R/W OFFSET dla przyszłych rozszerzeń (normalnie jest tu 0)
$39 R/W P6C1 Palette 6, Color 1
$3A R/W P6C2 Palette 6, Color 2
$3B R/W P6C3 Palette 6, Color 3
$3C W CTRL MARIA ConTRoL register
$3D R/W P7C1 Palette 7, Color 1
$3E R/W P7C2 Palette 7, Color 2
$3F R/W P7C3 Palette 7, Color 3

Źródło: Voy/SSG^Dial, "Atari 7800 ProSystem... rządzi!"

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 układu MARIA i ustawiany przez każdy wpis DLL.

W poprzednim wcieleniu rejestr OFFSET zajmował pewien adres pamięci. Adres ten jest teraz wolny, lecz powinno się 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

Zobacz też

Personal tools