Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu: mgr Jerzy Wałaszek

©2019 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

ROZDZIAŁ 5

Przerwania z listy wyświetlania

Podrozdziały
Przerwanie z listy wyświetlania (ang. display list interrupt, DLI) jest jedną z najmocniejszych cech komputera domowego Atari. Jest to również najmniej dostępna cecha systemu, która wymaga dobrego zrozumienia języka asemblera jak również każdej z pozostałych charakterystyk tego komputera. Same z siebie przerwania DLI nie dają żadnych dodatkowych możliwości, należy je zawsze stosować w połączeniu z innymi cechami systemu, takimi jak grafika graczy i pocisków, pośredniość zestawu znaków lub rejestrów kolorów. Za pomocą DLI można wykorzystać w pełni oferowane przez nie możliwości.

obrazek

Na początek:  podrozdziału   strony 

Jak działa przerwanie DLI?

Przerwania DLI wykorzystują sekwencyjną naturę wyświetlania obrazu w telewizorze. Obraz jest rysowany w odbiorniku telewizyjnym linia po linii od góry ekranu do spodu. To rysowanie zajmuje około 17.000 mikrosekund, co dla ludzkiego oka wydaje się natychmiastowe, lecz jest długim okresem w skali czasu, w której pracuje komputer. Ma on mnóstwo czasu na zmianę parametrów wyświetlanego obrazu. Oczywiście, musi on wprowadzać te zmiany za każdym razem, gdy obraz jest rysowany, tj. 60 razy na sekundę (u nas jest to 50 razy na sekundę). Również (co jest trudne) musi zmieniać określony parametr w dokładnie takim samym czasie przy każdym rysowaniu obrazu. Oznacza to, iż cykl zmiany parametrów ekranu musi być zsynchronizowany z cyklem rysowania ekranu. Jednym ze sposobów wykonania tego zadania mogłoby być zamknięcie mikroprocesora 6502 w ścisłej pętli czasowej, której obiegi są wykonywane dokładnie z częstotliwością 60 Hz. Utrudniłoby to niesamowicie wykonywanie jakichkolwiek obliczeń poza obliczeniami związanymi z wyświetlaniem obrazu. Stałoby się to również uciążliwym zadaniem. Dużo lepszym sposobem byłoby wygenerowanie przerwania pracy mikroprocesora 6502 tuż przed czasem, w którym należy wykonać zmiany parametrów obrazu. Mikroprocesor 6502 zareagowałby na to przerwanie, zmieniłby parametry obrazu i powróciłby do normalnej pracy. Użyte do tego celu przerwanie musi być precyzyjnie odmierzone w czasie, aby zdarzyć się dokładnie w tym samym momencie podczas procesu rysowania ekranu. To specjalnie odmierzone w czasie przerwanie udostępnia układ ANTIC; nazywa się ono przerwaniem z listy wyświetlania lub krótko przerwaniem DLI.

Proces odmierzania czasu i wykonywanie każdego przerwania może być zawiły; dlatego najpierw zrelacjonujemy ciąg zdarzeń w poprawnie działającym przerwaniu DLI. Proces ten rozpoczyna się, gdy układ ANTIC napotka instrukcję listy wyświetlania z ustawionym bitem przerwania (bit D7). ANTIC czeka do wyświetlenia ostatniej linii skanowania trybu, który aktualnie wyświetla. Następnie ANTIC sprawdza swój rejestr NMIEN, czy przerwania z listy wyświetlania zostały uaktywnione. Jeśli bit uaktywniający jest wyzerowany, ANTIC ignoruje przerwanie i kontynuuje wykonywanie swoich zwykłych działań. Jeśli bit uaktywniający jest ustawiony, ANTIC ustawia w stan niski linię NMI w mikroprocesorze 6502, po czym ANTIC wraca do swoich normalnych działań związanych z wyświetlaniem. Mikroprocesor 6502 wykonuje skok poprzez wektor NMI to procedury obsługi przerwania w systemie operacyjnym. Procedura ta najpierw określa powód tego przerwania. Jeśli przerwanie jest rzeczywiście przerwaniem DLI, to procedura wykonuje skok poprzez adresy $0200, $0201 (dolny i górny bajt) do procedury obsługi DLI. Procedura DLI zmienia jeden lub więcej rejestrów graficznych, które sterują wyświetlaniem. Następnie mikroprocesor 6502 wykonuje powrót do głównego programu poprzez instrukcję RTI (powrót z przerwania).

Jest kilka niezbędnych kroków związanych z ustawieniem przerwania DLI. Pierwszy z nich polega na napisaniu samej procedury obsługi DLI. Procedura powinna umieścić na stosie maszynowym wszystkie rejestry mikroprocesora 6502, które będą zmienione, ponieważ procedura w systemie operacyjnym tego nie robi. (Procesor 6502 automatycznie umieszcza na stosie rejestr stanu.) Procedura powinna być krótka i szybka; powinna ona jedynie zmieniać rejestry związane z wyświetlaniem obrazu. Powinna się kończyć odtworzeniem każdego rejestru mikroprocesora 6502, który został zapamiętany wcześniej na stosie. Następnie musisz umieścić te procedurę DLI gdzieś w pamięci. Strona 6 jest na to idealnym miejscem. Ustaw wektor $0200, $0201tak, aby wskazywał na twoją procedurę. Określ pionowy punkt na ekranie, w którym chcesz, aby pojawiło się przerwanie DLI, następnie przejdź do odpowiadającej mu instrukcji listy wyświetlania i ustaw bit D7 w poprzedniej instrukcji. Na koniec uaktywnij przerwania DLI ustawiając bit D7 w rejestrze NMIEN pod adresem $D40E. Przerwania DLI zaczną działać natychmiast.

Na początek:  podrozdziału   strony 

Czasy w DLI

Jak z każdą procedurą obsługi przerwań, rozważenie czasów jej wykonania może być bardzo istotne. ANTIC nie przesyła tego przerwania do mikroprocesora 6502 natychmiast po napotkaniu instrukcji z przerwaniem; opóźnia to aż do ostatniej linii skanowania w linii trybu z przerwaniem. Istnieje pewna liczba opóźnień w przetwarzaniu, zanim DLI osiągnie twoją procedurę obsługi. Dlatego twoja procedura obsługi DLI zacznie się wykonywać, gdy strumień elektronów jest już drodze rysując na ekranie telewizora ostatnią linię skanowania linii trybu z przerwaniem. Na przykład, jeśli taka procedura DLI zmienia zawartość jakiegoś rejestru koloru, to stary kolor będzie rysowany w lewej połowie ekranu, a nowy kolor pojawi się dopiero w prawej połowie. Z powodu różnych nieprzewidywalnych opóźnień w odpowiedzi mikroprocesora 6502 na przerwanie, brzeg pomiędzy nimi nie będzie ostry, lecz będzie irytująco skakał w przód i w tył.

Istnieje pewne rozwiązanie tego problemu w postaci rejestru oczekiwania na synchronizację poziomą WSYNC. Gdy rejestr ten zostanie w jakikolwiek sposób zaadresowany, ANTIC umieszcza stan niski na linii RDY (informuje o gotowości pamięci) mikroprocesora 6502. W efekcie 6502 wstrzymuje pracę aż rejestr ten zostanie zresetowany przez synchronizację poziomą. Wynikiem tego jest zatrzymanie mikroprocesora 6502 aż do momentu, gdy strumień elektronów osiągnie prawą krawędź standardowego pola gry. Jeśli wstawisz instrukcję STA WSYNC tuż przed instrukcją, która umieszcza jakąś wartość w rejestrze koloru, to kolor w rejestrze zostanie zmieniony, gdy strumień znajduje się poza ekranem. Zmiana koloru odbędzie się o jedną linię skanowania niżej, lecz będzie czysta.

Właściwym użyciem DLI jest zatem ustawienie bitu DLI w linii trybu przez linią trybu, w której chcesz wykonać to działanie. Procedura obsługi DLI powinna najpierw zapisać na stosie używane rejestry mikroprocesora 6502, następnie powinna załadować te rejestry wartościami graficznymi, które mają być użyte, po czym powinna wykonać instrukcję STA WSYNC i umieścić nowe wartości w odpowiednich rejestrach ANTIC'a lub CTIA. Na koniec powinna odtworzyć rejestry 6502 i powrócić z przerwania. Takie postępowanie gwarantuje zmianę zawartości rejestrów graficznych na początku pożądanej linii, podczas gdy strumień elektronów jest poza ekranem.

Na początek:  podrozdziału   strony 

Przykład DLI

Poniżej przedstawiono prosty program, który demonstruje DLI:

10 DLIST=PEEK(560)+256*PEEK(561):REM   Znajdź listę wyświetlania
20 POKE DLIST+15,130:REM               Wstaw do niej instrukcję z przerwaniem DLI
30 FOR I=0 TO 19:REM                   Pętla wstawiająca do pamięci procedurę obsługi DLI
40 READ A:POKE 1536+I,A:NEXT I
50 DATA 72,138,72,169,80,162,88
60 DATA 141,10,212,141,23,208
70 DATA 142,24,208,104,170,104,64
80 POKE 512,0:POKE 513,6:REM           Wstaw wektor przerwania
90 POKE 54286,192:REM                  Włącz obsługę DLI

Użyta w programie procedura obsługi DLI w języku maszynowym ma następującą postać:

PHA           Zachowaj akumulator na stosie
TXA
PHA           Zachowaj rejestr X
LDA #$50      Ciemny kolor dla znaków
LDX #$58      Różowy
STX WSYNC     Czekaj 
STA COLPF1    Zapisz kolor
STX COLPF2    Zapisz kolor
PLA
TAX
PLA           Odtwórz rejestry ze stosu
RTI           Zrobione

Efekt tego programu wygląda następująco:

obrazek

Jest to bardzo prosta procedura DLI. Zmienia ona kolor tła z niebieskiego na różowe. Zmienia również kolor znaków tak, aby były ciemne na różowym kolorze tła. Możesz się zastanawiać, dlaczego górna połówka ekranu pozostaje niebieska, pomimo że procedura DLI ciągle wpisuje kolor różowy do rejestru koloru tła. Dzieje się tak dlatego, iż systemowe przerwanie przy wygaszaniu w pionie (ang. OS vertical blank interrupt routine) odtwarza kolor niebieski w trakcie wygaszania pionowego. Kolor niebieski pochodzi od kopii systemowej tego rejestru w RAM. Każdy sprzętowy rejestr koloru posiada swoją kopię w pamięci RAM. Możesz już znać te kopie rejestrów w komórkach pamięci o adresach od 708 do 712. W większości zastosowań możesz zmieniać kolory przez wstawianie wartości do kopii rejestrów w RAM. Jeśli wstawisz je bezpośrednio do rejestrów sprzętowych, to proces systemowy w tle wymaże je po 1/60 sekundy. Jednak w przerwaniach DLI musisz wstawiać wartości nowych kolorów bezpośrednio do rejestrów sprzętowych. Nie możesz uzyć przerwań DLI do ustawienia koloru pierwszej linii wyświetlanej na ekranie; tym zajmuje się dla ciebie system operacyjny. Używaj przerwań DLI do zmiany kolorów linii poniżej pierwszej linii.

Na początek:  podrozdziału   strony 

Tryb przyciągania uwagi

Wpisując wartości kolorów bezpośrednio do rejestrów sprzętowych, tworzysz nowy problem: anulujesz automatyczny tryb przyciągania uwagi (ang. attract mode). Jest to funkcja obsługiwana przez system operacyjny. Po upływie dziewięciu minut bez naciśnięcia klawisza kolory na ekranie zaczynają przyjmować losowe wartości przy obniżonej jasności. Zapewnia to, iż komputer pozostawiony samemu sobie na kilka godzin nie wypali obrazu na ekranie telewizora. Łatwo jest wbudować tryb przyciągania uwagi do przerwania z listy wyświetlania. Do procedury DLL wystarczy wstawić tylko dwie dodatkowe linijki kodu w asemblerze:

  Stare              Nowe

LDA NEWCOL        LDA NEWCOL
STA WSYNC         EOR COLRSH
STA COLPF2        AND DRKMSK
                  STA WSYNC
                  STA COLPF2

DRKMSK i COLRSH są komórkami strony zerowej ($4E i $4F) ustawianymi i aktualizowanymi przez system operacyjny w trakcie przerwania przy wygaszaniu pionowym (ang. vertical blank interrupt, VBI). Gdy tryb przyciągania uwagi jest nieaktywny, COLRSH przyjmuje wartość 00, a DRKMSK przyjmuje $FF. Gdy tryb przyciągania uwagi jest aktywny, COLRSH zmienia w sposób przypadkowy wartość co 4 sekundy, a DRKMSK zawiera wartość $F6. W ten sposób COLRSH zmienia kolor, a DRKMSK usuwa z niego najstarszy bit jasności.

Na początek:  podrozdziału   strony 

Szczegółowy chronometraż

Zastosowanie trybu przyciągania uwagi w DLI zaostrza już i tak trudny problem: skrócenie czasu wykonania podczas DLI. Opis chronometrażu DLI pozwoli dokładniej unaocznić ten problem. Wykonanie DLI rozbite jest na trzy fazy:

Jedna pozioma linia skanowania zajmuje 114 taktów procesora w czasie rzeczywistym. DLI dociera do 6502 w takcie ósmym. 6502 odpowiada na to przerwanie po upływie od 8 do 14 taktów. Procedura w systemie operacyjnym wykonująca skok do procedury obsługi DLI zajmuje 11 taktów maszynowych. W tym czasie od 1 do 3 taktów zostanie skradzione na odświeżanie pamięci poprzez DMA. W ten sposób procedura obsługi DLI rozpocznie swoje działania nie wcześniej niż po upływie od 28 do 36 taktów zegarowych. Przy planowaniu musimy uwzględnić najgorszy scenariusz i programować tak, jakby procedura DLI rozpoczynała się od taktu 36. Co więcej, instrukcja STA WSYNC musi zostać osiągnięta do taktu o numerze 100; To zmniejsza czas dostępny w fazie pierwszej o 14 taktów. Na koniec, bezpośredni dostęp do pamięci (ang. direct memory access, DMA) przez ANTIC ukradnie mikroprocesorowi 6502 kilka z pozostałych taktów zegarowych. Dziewięć taktów zostanie straconych na odświeżanie pamięci. To pozostawia jako absolutne maksimum 55 taktów dostępnych w fazie pierwszej. To maksimum jest osiągalne tylko z liniami trybu zawierającymi puste linie.  Instrukcje dla trybów znakowych i bitmapowych w efekcie spowodują utratę jednego taktu na każdy bajt wyświetlanych danych. Najgorszy przypadek powstaje z trybami BASIC'a 0, 7 i 8, które wymagają po 40 bajtów na linię. W tych trybach pozostaje jedynie 15 taktów maszynowych dostępnych dla fazy pierwszej. W ten sposób procedura fazy pierwszej będzie miała dostępne od 15 do 55 taktów maszynowych na swoje wykonanie.

Faza druga, krytyczna czasowo, rozpościera się na 27 taktów zegarowych czasu rzeczywistego. Tak samo jak w fazie pierwszej niektóre z tych taktów zostanie odebrane przez proces odświeżania pamięci.  Grafika graczy-pocisków zabierze pięć taktów, jeśli jest używana. Instrukcja wyświetlania zabierze jeden takt, jeśli jest w niej użyta opcja LMS (ładowanie danych z pamięci), to zostaną skradzione dodatkowe dwa takty na pobranie adresu. Na koniec jeden lub dwa takty mogą zostać stracone na odświeżanie pamięci lub pobieranie danych do wyświetlenia. W ten sposób w fazie drugiej dostępne jest od 17 do 26 taktów maszynowych.

Problem chronometrażu DLI staje się teraz oczywisty. Załadowanie, uwzględnienie trybu przyciągania uwagi i zapis pojedynczego koloru skonsumuje 14 taktów. Zapamiętanie na stosie rejestrów A, X i Y , a następnie załadowanie do nich 3 kolorów z trybem przyciągania uwagi zabierze 47 taktów, czyli większość o ile nie wszystkie dostępne w fazie pierwszej. Oczywiście, programista używający DLI do intensywnych zmian graficznych włoży wiele wysiłku w dogranie czasowe procedur DLI. Na szczęście początkujący programista nie musi się zajmować czasochłonnymi obliczeniami . Jeśli wymagana jest zmiana tylko jednego koloru lub prosta operacja graficzna, to liczenie taktów i optymalizacje prędkości wykonania nie są konieczne. Te rozważania są ważne tylko w sytuacjach wymagających wysokiej wydajności.

Nie ma prostych opcji dla programisty, który potrzebuje zmienić więcej niż trzy rejestry koloru w pojedynczej procedurze DLI. Być może udałoby się załadować, dodać tryb przyciągania uwagi i zapisać czwarty kolor na początku fazy trzeciej, jeśli ten kolor nie jest wyświetlany przy lewej krawędzi ekranu.

Podobnie, kolor nie wyświetlany przy prawej krawędzi ekranu mógłby być zmieniany  podczas fazy pierwszej. Innym podejściem jest rozbicie jednej zbyt aktywnej procedury DLL na dwie mniej ambitne procedury DLL, z których każda wykonuje połowę pracy tej pierwszej. Druga procedura DLL mogłaby być wykonywana przez wstawienie instrukcji z pojedynczą pustą linią (z ustawionym bitem DLL) do listy wyświetlania tuż pod główną linią trybu z przerwaniem. To zajmie nieco obszaru ekranu.

Innym częściowym rozwiązaniem jest wykonywanie obowiązków związanych z trybem przyciągania podczas okresów wygaszania pionowego. Aby to wykonać, w pamięci RAM należy przechowywać dwie tablice kolorów. Pierwsza tablica zawiera wartości kolorów, które mają wyświetlać procedury DLI. Druga tablica zawiera ich odpowiedniki dla trybu przyciągania uwagi Podczas wygaszania pionowego procedura użytkownika dla przerwania VBI pobiera kolor z pierwszej tablicy, dodaje do niego tryb przyciągania uwagi i umieszcza go w drugiej tablicy. Procedura DLI pobiera następnie wartości bezpośrednio z drugiej tabeli bez zajmowania się już trybem przyciągania uwagi.

Na początek:  podrozdziału   strony 

Wiele procedur DLI

Często jest pożądane posiadanie pewnej liczby DLI występujących w kilku pionowych pozycjach na ekranie. Jest to ważny sposób dodawania koloru do obrazu. Niestety, jest tylko jeden wektor DLI, jeśli ma zostać zaimplementowane kilka DLI, to skierowanie wektora na właściwą procedurę obsługi musi zostać wykonane samodzielnie przez procedury DLI. Istnieje kilka rozwiązań. Jeśli procedura DLI wykonuje ten sam proces z różnymi wartościami, to może on być sterowany tablicą. Po każdym przejściu przez procedurę DLI zwiększany jest licznik, który pełni funkcję indeksu w tablicy wartości. Przykładowa procedura DLI wykonująca to zadanie jest następująca:

        PHA                  Zachowaj rejestry na stosie
        TXA
        PHA
        INC COUNTR
        LDX COUNTR
        LDA COLTAB,X         Użyj strony 2 na tablicę kolorów
        STA WSYNC            Czekaj
        STA COLBAK
        CPX #$4F             Ostatnia linia?
        BNE ENDDLI           Nie, wyjdź
        LDA #$00             Tak, zresetuj licznik
        STA COUNTR
ENDDLI  PLA                  Odtwórz rejestry ze stosu
        TAX
        PLA  
        RTI

Program w BASIC'u do wywołania tej procedury to:

10 GRAPHICS 7
20 DLIST=PEEK(560)+256*PEEK(561):REM   Znajdź listę wyświetlania
30 FOR J=6 TO 84:REM                   Włącz w każdej linii trybu przerwanie DLI
40 POKE DLIST+J,141:REM                Tryb 7 BASIC'a z ustawionym bitem DLI
50 NEXT J
60 FOR J=0 TO 30
70 READ A:POKE 1536+J,A:NEXT J:REM     Wpisz do pamięci procedurę obsługi DLI
80 DATA 72,138,72,238,32,6,175,32,6
90 DATA 189,0,240,141,10,212,141,26,208
100 DATA 224,79,208,5,169,0
110 DATA 141,32,6,104,170,104,64
120 POKE 512,0:POKE 513,6:REM          Ustaw wektor na procedurę obsługi DLI
130 POKE 54286,192:REM                 Włącz DLI

Ten program umieści na ekranie 80 różnych kolorów.

obrazek

Są inne sposoby implementowania wielokrotnych DLI. Jednym z nich jest użycie licznika wywołań DLI jako testu do skoku do właściwej procedury obsługi DLI. To spowalnia reakcję wszystkich DLI, szczególnie tych na końcu ciągu testów. Lepszym rozwiązaniem jest nakazanie każdej procedurze obsługi DLI wpisanie adresu następnej procedury do wektora DLI pod adresem $200, $201 (512 i 513). Powinno to być wykonywane podczas fazy trzeciej. Jest to najbardziej ogólne rozwiązanie problemu wielokrotnych DLI. Dodatkową zaletą jest to, iż zmiana tego wektora jest wykonywana poza krytyczną czasowo sekcją DLI, a nie wcześniej.

Procedura obsługi kliknięć klawiatury zakłóca działanie DLI. Zawsze, gdy zostanie naciśniety i zatwierdzony klawisz, wbudowany głośnik klika. Chronometraż tego kliknięcia jest uzyskiwany przez kilka instrukcji STA WSYNC. Może to zaburzyć odmierzanie czasu w procedurze DLI i spowodować skok kolorów na ekranie o jedną linię skanowania w dół przez ułamek sekundy. Nie ma łatwego rozwiązania tego problemu. Jedno z możliwych rozwiązań wiąże się z rejestrem VCOUNT, który jest rejestrem tylko do odczytu w  ANTIC i który zawiera numer linii skanowania wyświetlanej przez. Procedura DLI mogłaby sprawdzać zawartość tego rejestru, aby unikać zmian koloru. Innym rozwiązaniem jest wyłączenie procedury systemowej obsługującej klawiaturę i udostępnienie własnej. Jednakże byłoby to zadanie bardzo niewdzięczne. Ostatecznym rozwiązaniem jest zablokowanie przyjmowania danych z klawiatury. Jeśli naciśnięcie klawisza nie zostanie zatwierdzone, skoki kolorów na ekranie nie wystąpią.

Na początek:  podrozdziału   strony 

Pętle czasowe

Przerwania DLI zostały opracowane, aby zastąpić bardziej prymitywną technikę pętli czasowych. Pętla czasowa jest pętlą w programie dla mikroprocesora 6502, który została dokładnie wyliczona tak, aby jej obiegi były zsynchronizowane z cyklem wyświetlania obrazu w odbiorniku telewizyjnym. Przez monitorowanie rejestru VCOUNT i odwoływanie się do tablicy zmian ekranowych skatalogowanych jako funkcja wartości VCOUNT mikroprocesor 6502 może w dowolny sposób sterować wszystkimi wartościami graficznymi na całym ekranie. Za tą moc płaci się wysoką cenę: mikroprocesor 6502 nie jest dostępny do obliczeń podczas wyświetlania obrazu na ekranie, co wynosi około 75 procent ogólnego czasu. Co więcej, żadne z obliczeń nie może pochłaniać więcej niż około 4000 taktów maszynowych, które są dostępne podczas okresów wygaszania pionowego i wyświetlania poza fizycznymi granicami obrazu. Ograniczenie to oznacza, iż takie pętle czasowe mogą być używane tylko w programach nie wymagających wielu obliczeń, jak np. niektóre gry zręcznościowe i proste gry akcji. Na przykład, program BASKETBALL dla komputerów ATARI 400/800 wykorzystuje pętlę czasową, program ten potrzebuje niewiele obliczeń, za to dużo koloru. Wielokolorowi gracze w tej grze nie mogliby zostać wykonani przy pomocy przerwań z listy wyświetlania, ponieważ DLI są przypisane do pozycji pionowych na polu gry, a nie do pozycji gracza.

obrazek

Możliwe jest rozszerzenie idei pętli czasowych bezpośrednio na pojedynczą linię skanowania i zmieniać rejestry graficzne w locie. W ten sposób pojedynczy rejestr koloru może generować kilka kolorów w pojedynczej linii skanowania. Pozioma pozycja zmiany koloru jest określona przez ilość czasu, jaki upłynął zanim nastąpi zmiana. I tak poprzez dokładne zliczanie cykli maszynowych programista może otrzymać więcej grafiki na ekranie, Niestety, jest to bardzo trudne do osiągnięcia w praktyce. Przy bezpośrednim dostępie do pamięci przez ANTIC zakłócającym ciągłą pracę mikroprocesora 6502 trudno jest określić dokładnie, ile upłynęło w rzeczywistości taktów maszynowych; proste zliczanie taktów 6502 nie wystarcza. Jeśli zostanie wyłączone DMA ANTIC'a, to 6502 otrzyma pełną kontrolę nad obrazem, lecz wtedy musi wykonywać wszystko to, co normalnie wykonuje ANTIC. Z tych powodów poziome pętle czasowe są rzadko warte włożonego w nie wysiłku. Jednakże, jeśli dwa obrazki do wyświetlenia w różnych kolorach są szeroko rozdzielone, powiedzmy przez 20 taktów koloru lub więcej, to to rozdzielenie powinno pokryć niepewności w odmierzaniu czasu i umożliwić zastosowanie tej techniki.

Na początek:  podrozdziału   strony 

Zastosowania przerwań z listy wyświetlania

Niesamowite zalety pośredniości grafiki oraz wszystkich tych modyfikowalnych rejestrów sprzętowych stają się teraz oczywiste. Przy pomocy przerwań z listy wyświetlania każdy z tych rejestrów może być zmieniany w locie. Na ekranie możesz umieścić mnóstwo kolorów, grafiki i efektów specjalnych. Najbardziej oczywistym zastosowaniem przerwań DLI jest umieszczanie więcej koloru na ekranie. Każdy z rejestrów kolorów może zostać zmieniony tyle razy, ile masz przerwań DLI. Odnosi się to zarówno do rejestrów koloru pola gry oraz do rejestrów koloru graczy. I tak masz do dziewięciu rejestrów koloru, z których każdy może wyświetlać do 128 różnych kolorów. Czy ci to wystarczy? Oczywiście normalny program nie będzie korzystał z nich wszystkich. Zbyt wiele przerwań DLI zacznie zwalniać cały program. Czasem układ ekranu nie może pomieścić dużej liczby przerwań DLI. W praktyce łatwo osiągnąć tuzin kolorów, dwa tuziny wymagają dokładnego planowania, a większa liczba wymaga jakiejś wymyślnej sytuacji.

Przerwania z listy wyświetlania mogą dać więcej niż tylko kolor, można je również zastosować do poszerzenia możliwości grafiki graczy i pocisków. Pozycja pozioma gracza może być zmieniana przez DLI. W ten sposób może być częściowo przemieszczony w niższych obszarach ekranu. Pojedynczy gracz może posiadać kilka wcieleń na ekranie. Jeśli wyobrazisz sobie gracza jako pionową kolumnę z narysowanymi na niej obrazkami, to DLI staje się nożycami, za pomocą których możesz porozcinać tę kolumnę i zmienić pozycję jej kawałków na ekranie. Oczywiście żadne dwa fragmenty gracza nie mogą znaleźć się na tej samej linii poziomej, zatem dwa wcielenia gracza nie mogą być na tej samej wysokości w pionie. Jeśli twój ekran nie potrzebuje obiektów graficznych, które są w tej samej linii poziomej, to pojedynczy gracz może załatwić całą sprawę.

Innym sposobem użycia DLI z graczami jest zmiana ich szerokości lub priorytetu. To byłoby najczęściej stosowane razem z trikiem maskowania priorytetowego, który opisaliśmy w rozdziale 4.

Ostatnim zastosowaniem DLI jest zmiana zestawu znaków w drodze ku spodowi ekranu. Pozwala to programowi używać grafiki znakowej w dużym oknie i zwykłego tekstu w oknie tekstowym. Możliwe są wielokrotne zmiany zestawu znaków; program mógłby używać jednego zestawu znaków graficznych u góry ekranu, innego w środku i zwykłego zestawu znaków na spodzie.

Na tym samym ekranie można by pokazywać różne kroje czcionek. Bit odbicia w pionie może być zmieniany za pomocą procedury DLI, pozwalając na wyświetlanie jednego tekstu normalnie, a innego ze znakami do góry nogami.

Właściwe korzystanie z DLI wymaga precyzyjnego projektu układu obrazu na ekranie. Projektant musi zwrócić dużą uwagę na pionową architekturę ekranu. System telewizji ze skanowaniem rastrowym nie jest symetryczny dwu-wymiarowo; posiada dużo więcej struktury pionowej niż poziomej. Dzieje się tak dlatego, ponieważ tempo rysowania ekranu w poziomie jest 262 razy szybsze od tempa rysowania obrazu w pionie. System wyświetlania komputera domowego ATARI został specjalnie zaprojektowany dla telewizji ze skanowaniem rastrowym. Ekran komputera ATARI nie jest płaskim, pustym kawałkiem papieru, na którym rysujesz; jest stosem cienkich pasków, z których każdy może przyjąć różne parametry. Programista upierający się przy projektowaniu izotropowego ekranu marnuje wiele możliwości. Osiągniesz optymalne wyniki, gdy zorganizujesz informację do wyświetlenia jako mocną strukturę pionową. Pozwoli to w pełni wykorzystać moc DLI.

Rysunek 5-1 pokazuje kilka obrazów ekranowych z różnych programów oraz daje oszacowanie stopnia użytej w każdym z nich struktury pionowej.

obrazek
SPACE INVADERS
(Znak handlowy Taito America Corporation)
***MNÓSTWO***
obrazek
SCRAM
(Symulacja reaktora atomowego)
***MAŁO***
obrazek
MISSILE COMMAND
***NIECO***
obrazek
STAR RAIDERS
***MAŁO***
obrazek
GRAPH IT
***BRAK***
obrazek
ASTEROIDS
***BRAK***

Rys.5-1 Przykłady pionowej architektury ekranowej

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2019 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.