MARIA Display List
From Atariki
Wersja z dnia 15:28, 19 lis 2007
Display List układu MARIA 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ść wynosić 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). 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 OFFSET-u 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 układowi MARIA, 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.