PISZEMY DEMOPrzerwanie Display List
Program Equ $8800
List_mem Equ %00000110
List_err Equ %00000101
Code_mem Equ %00010000
Code_dsk Equ %00100000
Dliv Equ $200
Dlptrs Equ $230
Colpf2 Equ $D018
Wsync Equ $D40A
Nmien Equ $D40E
Pom Equ $F0
Opt List_err+Code_mem
Org Program
Lda Dlptrs
Sta Pom
Lda Dlptrs+1
Sta Pom+1
Lda Dliv
Pha
Lda Dliv+l
Pha
Ldy #$10
Lda (Pom),y
Ora #$80
Sta (Pom),y
Lda
(do programu należy dołączyć procedurę klawisz z pierwszego artykułu).Na początku robimy kopię wektora Dlptrs na stronie zerowej (etykieta Pom) aby po odłożeniu wektora przerwania Dliv na stos ustawić siódmy bit w 16 rozkazie programu ANTIC'a przy pomocy adresowania pośredniego Y. Następnie ustawiamy wektor Dliv na adres naszej procedury przerwania (etykieta Przerw), po czym zezwalamy na wykonanie przerwania NMI (wartość $C0 wpisywana do Nmien). Wykonując procedurę klawisz, komputer oczekuje na naciśnięcie klawisza. W tym czasie możemy oglądać efekt działania procedury przerwania. W procedurze wykorzystywany jest akumulator, dlatego odkładamy go na stos. W trakcie działania przerwania wpisywana jest tylko wartość $06 do rejestrów Wsync i Colpf2. Co nieco o kolorach
Więcej szczegółów na temat kolorów podamy przy opisie funkcji i rejestrów GTIA. Do analizy procedury naszego przerwania wystarczy nam informacja, że rejestr Colpf2 w trybie ANTIC'a 2 określa kolor tła. Wróćmy do naszego przykładu. Jak już wspomnieliśmy w trakcie przerwania VBLK rejestr sprzętowy Colpf2 otrzymuje wartość cienia Colpf2S. Rozpoczyna się tworzenie obrazu. Wartość koloru kolejnych linii pobierana jest z rejestru sprzętowego. Po wykonaniu 16 rozkazu ANTIC'a, czyli po wyświetleniu 12 linii procedura przerwania Display List modyfikuje rejestr sprzętowy. Oznacza to, że reszta linii wyświetlana będzie w innym kolorze, po czym cały cykl wyświetlania obrazu zaczyna się od początku. Zauważmy, że 7 bit ustawiony jest w 16 rozkazie programu ANTIC"a tworzącym 11 linię. Oznacza to, że przerwanie wykonywane jest po wyświetleniu tej linii (na początku linii 12). Rola rejestru WsyncPrzerwanie Display List w przykładach Na koniec popatrzmy na dwa przykłady programów. Program pierwszy:
Program Equ $8800
List_mem Equ %00000110
List_err Equ %00000101
Code_mem Equ %00010000
Code_dsk Equ %00100000
Dliv Equ $200
Dlptrs Equ $230
Colpf2 Equ $D018
Wsync Equ $D40A
Nmien Equ $D40E
Pom Equ $F0
Opt List_err+Code_mem
Org Program
Lda Dlptrs
Sta Pom
Lda Dlptrs+1
Sta Pom+1
Lda Dliv
Pha
Lda Dliv+l
Pha
Ldy #$0A
Lda (Pom),y
Ora #$80
Sta (Pom),y
Lda
Program drugi:
Program Equ $8800
List_mem Equ %00000110
List_err Equ %00000101
Code_mem Equ %00010000
Code_dsk Equ %00100000
Dliv Equ $200
Dlptrs Equ $230
Colpf2 Equ $D018
Wsync Equ $D40A
Nmien Equ $D40E
Pom Equ $F0
Kolor Equ $F2
Opt List_err+Code_mem
Org Program
Lda #$2A
Sta Kolor
Lda Dlptrs
Sta Pom
Lda Dlptrs+1
Sta Pom+1
Lda Dliv
Pha
Lda Dliv+l
Pha
Ldy #$0A
Lda (Pom),y
Ora #$80
Sta (Pom),y
Ldy #$0C
Sta (Pom),y
Lda
Oba wykorzystują przerwanie Display List i oba realizują to samo mimo różnych algorytmów. Zadaniem obu programów jest zmiana koloru tła ekranu w dwóch jego miejscach. Zasadnicza różnica polega na tym, że program pierwszy wywołuje raz przerwanie Display List w trakcie wyświetlania natomiast program drugi robi to dwukrotnie. W programie pierwszym po wywołaniu procedury przerwania (etykieta Przerw) do akumulatora wpisywana jest wartość pierwszego koloru. Następnie w pętli wywoływanej 16 razy zawartość akumulatora zostaje wpisana do rejestru Colpf2 (modyfikacja koloru tła) i Wsync (znaczenie tej operacji opisaliśmy powyżej). Po 16 przebiegu pętli modyfikujemy na nowo oba te rejestry (wpisując wartość $2A). Efekt zmiany kolorów realizowany przez program pierwszy można zaprogramować o wiele prościej, wykorzystując dodatkową komórkę pamięci. Metoda ta została przedstawiona w programie drugim. Dodatkowa komórka (etykieta Kolor) zastosowana jest po to, aby przechowywać aktualną wartość wyświetlanego koloru. Przed uruchomieniem przerwania komórka ta otrzymuje wartość $2A. Dwukrotne wywołanie procedury przerwania Display List (etykieta Przerw) jest możliwe dzięki ustawieniu 7 bitu w dwóch rozkazach programu ANTIC'a. Przy pierwszym wywołaniu procedury, dzięki zastosowaniu instrukcji logicznej EOR "Kolor" otrzyma wartość $22, przepisywaną do rejestru Colpf2 (pierwsza modyfikacja koloru tła). Przy wywołaniu drugim "Kolor" otrzyma ponownie wartość $2A (druga modyfikacja koloru tła). UWAGA: Rozwiązanie drugie jest lepsze, gdyż stosowanie pętli wewnątrz procedury Display List opóźnia pracę programu wykonywanego bezpośrednio przez procesor.Kolejny odcinek cyklu poświęcimy ciekawszym przykładom wykorzystania przerwania Display List. Tomasz Bielak
Rafał Bielecki |