Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2025 mgr Jerzy Wałaszek
|
ROZDZIAŁ 5Przerwania z listy wyświetlania |
|
Podrozdziały |
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, $0201, tak abywskazywał 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.
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.
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:
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 użyć 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.
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.
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.
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.
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ą.
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.
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.
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.
Rys.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.
SPACE INVADERS (Znak handlowy Taito America Corporation) ***MNÓSTWO*** |
SCRAM™ (Symulacja reaktora atomowego) ***MAŁO*** |
MISSILE COMMAND™ ***NIECO*** |
STAR RAIDERS™ ***MAŁO*** |
GRAPH IT™ ***BRAK*** |
ASTEROIDS™ ***BRAK*** |
Rys.5-1. Przykłady pionowej architektury ekranowej
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2025 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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.