PISZEMY DEMOPrzerwanie Display ListProgram 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 LdaProgram 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 LdaOba 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 |