Serwis Edukacyjny
Nauczycieli
w I-LO w Tarnowie

Do strony głównej I LO w Tarnowie

Materiały dla uczniów liceum

Zoptymalizowane dla
  
1280 x 1024

  Wyjście       Spis treści       Poprzedni       Następny  

©2019 mgr Jerzy Wałaszek
I LO w Tarnowie

https://images.fineartamerica.com/images/artworkimages/mediumlarge/1/atari-logo-marjan-mencin.jpg

Autor artykułu: mgr Jerzy Wałaszek

 

Rozdział 5

Przerwania z listy wyświetlania

Spis treści Zawartość
Jak działa przerwanie DLI?
Czasy w DLI
Przykład DLI
x

 

 

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.

 

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.

 

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.

 

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:

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.

 

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.