Piszemy DEMOW poprzednim artykule pisaliśmy o rozkazach ANTIC'a. Wiemy już, że w pojedynczym rozkazie bity 0-3 określają najczęściej tryb graficzny wyświetlanej linii, natomiast ustawiony bit 6 ładuje licznik pamięci obrazu. Tak więc została nam do omówienia rola bitów 4, 5 i 7. Przesuw poziomyProcedure Equ $8800 List_mem Equ %00000110 List_err Equ %00000101 Code_mem Equ %00010000 Code_dsk Equ %00100000 Rtclok Equ $12 Pomocnik Equ $F0 Dlptrs Equ $230 Kbcodes Equ $2FC Poczatek Equ $00 Koniec Equ $23 Opt List_err+Code_mem Org Procedure Jsr Dlist L1 Inc Adress Lda Adress Cmp #$23 Bne L2 Lda #$00 Sta Adress L2 Ldx #$05 Jsr Wait Ldy Kbcodes Iny Beg L1 Jsr Exit Rts Dlist Ldx Dlptrs Ldy Dlptrs+$0l Stx Pomocnik Sty Pomocnik+$01 Ldx <Antic Ldy >Antic Stx Dlptrs Sty Dlptrs+$01 Rts Exit Ldx Pomocnik Ldy Pomocnik+$01 Stx Dlptrs Sty Dlptrs+$01 Rts Wait Lda #$00 Sta Rtclok+$02 Txa W1 Cmp Rtclok+$02 Bne W1 Rts Antic Dta B($70) Dta B($70) Dta B($70) Dta B($40+$06) Adress Dta A(Text) Dta B($41) Dta A(Antic) 0rg $600 Text Equ * Dta D'....................' Dta D'TAJEMNICE ATARI' Dta D'....................' End of fileProgram wyświetla jedną linię trybu $06 ANTIC'a z przesuwającym się tekstem. Na samym początku program zapamiętuje wektor DLPTRS i ustawia go na nasz program ANTIC'a (etykieta Antic) tworzy to procedura Dlist. Następnie w pętli programu zwiększany jest młodszy bajt adresu tekstu co powoduje, że tekst się przesuwa. Gdy młodszy bajt osiągnie wartość $23, oznacza to, że tekst się skończył i trzeba go przesuwać od nowa. W tym celu młodszy bajt jest zerowany. Dzięki temu, że tekst umieszczony jest od początku szóstej strony pamięci, łatwiej wyznaczyć jest adres początku i końca tekstu. Ponieważ nasz program byłby wykonywany za szybko, to w każdym obiegu pętli wywoływana jest procedura Wait, realizująca opóźnienie przy wykorzystaniu zegara systemowego RTCLOK. Długość opóźnienia uzależniona jest od zawartości rejestru X procesora. Pętla wykonywana jest dopóki nie zostanie naciśnięty klawisz - nie zmieni się wartość rejestru KBCODES. Gdy to nastąpi, wywoływana jest procedura Exit, przywracająca wektor DLPTRS. Powyższa metoda nie daje możliwości "delikatnego" przesuwu tekstu (tekst przesuwany jest o jeden znak). W obrębie jednego znaku przesuw płynny realizowany jest przy pomocy ustawionego bitu czwartego (HSC - Horizontal Scrolling) w rozkazie ANTIC'a oraz rejestru HSCROL ($D404). Spójrzmy na poniższy program: Procedure Equ $8800 List_mem Equ %00000110 List_err Equ %00000101 Code_mem Equ %00010000 Code_dsk Equ %00100000 Rtclok Equ $12 Pomocnik Equ $F0 Licznik Equ $F2 Dlptrs Equ $230 Kbcodes Equ $2FC Hscrol Equ $D404 Poczatek Equ $00 Koniec Equ $23 Opt List_err+Code_mem Org Procedure Jsr Dlist Lda #$07 Sta Licznik L1 Dec Licznik Lda Licznik Bpl L3 Inc Adress Lda Adress Cmp #Koniec Bne L2 Lda Poczatek Sta Adress L2 Lda #$07 Sta Licznik L3 Sta Hscrol Ldx #$01 Jsr Wait Ldy Kbcodes Iny Beq L1 Jsr Exit Rts Antic Dta B($70) Dta B($70) Dta B($70) Dta B($40+$06+$10) Adress Dta A(Text) Dta B($41) Dta A(Antic) Org $600 Text Equ * Dta D'....................' Dta D'TAJEMNICE ATARI' Dta D'....................' End of fileProcedury DList, Wait oraz Exit pozostały takie same. Nie będziemy ich omawiać. W programie ANTIC'a zmienił się tylko jeden rozkaz. Do LMS dodaliśmy $10, czyli ustawiliśmy czwarty bit. Ustawienie tego bitu nie wystarcza, aby tekst przesuwał się płynnie. Kolejne wartości od $00 do $07 wpisywane do rejestru HSCROL powodują przesuw w obrębie jednego znaku. Przy płynnym przesuwie ze strony prawej na lewą konieczne jest wpisywanie wartości od $07 do $00. Aby tekst przesuwał się w całości należy połączyć przesuw zgrubny (co jeden znak) z przesuwem delikatnym. Rejestru HSCROL nie można bezpośrednio zwiększać lub zmniejszać, ponieważ jest on modyfikowany przez system operacyjny (nie jest to prawda; w istocie HSCROLL jest rejestrem sprzętowym, działającym tylko w trybie zapisu, bez możliwości odczytania zawartości - przyp. red.). W tym celu należy użyć pomocniczego rejestru (LICZNIKA). Na samym początku nasz licznik przyjmuje wartość $07, przepisywaną do HSCROL'a i w kolejnych obiegach pętli zmniejszany jest o jeden. Jeśli licznik osiągnie zero, to następuje przesuw zgrubny (opisany przy poprzednim programie) i wszystko powtarza się od początku. Przerwanie programu następuje po naciśnięciu klawisza. Przesuw pionowyProcedure Equ $8800 List_mem Equ %00000110 List_err Equ %00000101 Code_mem Equ %00010000 Code_dsk Equ %00100000 Rtclok Equ $12 Pomocnik Equ $F0 Licznik Equ $F2 Dlptrs Equ $230 Vscrol Equ $D405 Opt List_err+Code_mem Org Procedure Jsr Dlist Lda #$0F Sta Licznik L1 Dec Licznik Lda Licznik Beq L2 Sta Vscrol Ldx #$02 Jsr Wait Beq L1 L2 Ldx #$50 Jsr Wait L3 Inc Licznik Lda Licznik And #$0F Beq L4 Sta Vscrol Ldx #$02 Jsr Wait Beq L3 L4 Jsr Wait Rts Antic Dta B($70),B($70) Dta B($70),B($70) Dta B($40+$07+$20) Adress Dta A(Text) Dta B($41) Dta A(Antic) Text Equ * Dta D'..TAJEMNICE ATARI..' End of fileKorzystamy ze znanych nam z poprzednich programów procedur: Dlist, Wait i Exit. Modyfikujemy program ANTIC'a tak, aby wyświetlał on jedną linię w trybie $07 z ustawionym bitem piątym (do rozkazu dodaliśmy $20). Linia w trybie $07 jest dwa razy większa niż w trybie $06 i $02, dlatego VSCROL będzie przyjmował wartości od $00 do $0F. Jeżeli program ANTIC'a posiada dwie następujące po sobie linie A i B, np. trybu $07 i w linii A bit piąty nie jest ustawiony, natomiast w linii B jest ustawiony, to tekst umieszczony w linii B, przesuwany delikatnie przy pomocy rejestru VSCROL (wartości od $00 do $OF) będzie się "chował" pod linię A. Ilustruje to powyższy program, z tym, że linią A jest linia pusta. Główna część programu składa się z dwóch pętli. W pierwszej z nich zmniejszany jest rejestr VSCROL przy pomocy rejestru pomocniczego (LICZNIKA), co daje efekt wysuwającego się tekstu. Jeśli licznik osiągnie wartość zero, oznacza to, że tekst wysunął się do końca. Po dłuższej przerwie licznik (a tym samym VSCROL) jest zwiększany w następnej pętli do wartości $0F i tekst się chowa. Oto kolejny przykład programu : Procedure Equ $8800 List_mem Equ %00000110 List_err Equ %00000101 Code_mem Equ %00010000 Code_dsk Equ %00100000 Rtclok Equ $12 Pomocnik Equ $F0 Licznik Equ $600 Ile Equ $601 Dlptrs Equ $230 Vscrol Equ $D405 Llength Equ $28 Opt List_err+Code_mem Org Procedure Jsr Dlist Ldx #$15 Stx Ile L1 Lda #$07 Sta Licznik Sta Vscrol L2 Ldx #$01 Jsr Wait Dec Licznik Lda Licznik Sta Vscrol Bpl L2 Sec Lda Adress Sbc <Llength Sta Adress Lda Adress+$0l Sbc >Llength Sta Adress+$01 Dec Ile Lda Ile Bpl L1 Jsr Exit Ldx <Text Ldy >Text Stx Adress Sty Adress+$01 Rts Antic Dta B($70),B($70) Dta B($70) Dta B($40+$02+$20) Adress Dta A(Text) Dta B($22,B($22) Dta B($22,B($22) Dta B($22,B($22) Dta B($22,B($22) Dta B($22,B($22) Dta B($22,B($22) Dta B($22,B($22) Dta B($22,B($22) Dta B($22,B($22) Dta B($22,B($22) Dta B($02) Dta B($41) Dta A(Antic) Org $A400 Text Equ * Dta D'............' Dta D'TAJEMNICE ATARI' Dta D'............' End of fileProgram tworzy 22 linie obrazu w trybie $02 ANTIC, w których będzie przesuwany tekst od linii pierwszej do ostatniej. Jeżeli program ANTIC'a posiada dwie, następujące po sobie linie A i B, np. trybu $02 i w obu liniach ustawiony jest bit piąty, to tekst umieszczony w linii B, przesuwany delikatnie poprzez zmianę wartości rejestru VSCROL od $00 do $07 będzie przesuwał się z linii B do A. W dalszym ciągu używamy procedur Dlist, Wait i Exit. Dodatkowy rejestr ILE zawiera liczbę linii do przesunięcia. Na początku programu otrzymuje on wartość $15. Przy każdy obiegu pętli zmniejszany jest o jeden. Następnie licznik i VSCROL otrzymują wartość $07. Zmniejszanie wartości licznika (i VSCROL'a) w kolejnej pętli powoduje przesunięcie się tekstu w dół. Gdy wartość licznika, a zarazem VSCROL'a osiągnie zero - konieczne jest przesunięcie zgrubne tekstu. W tym celu musimy zmniejszyć adres, skąd ANTIC pobiera dane do wyświetlania, o długość linii, czyli w tym przypadku $28. Cała operacja powtarza się od nowa, aż rejestr ILE osiągnie wartość $FF. Przed zakończeniem wykonywania programu przywracana jest początkowa wartość wektora wskazującego na tekst. UWAGA: Przy przesuwie pionowym ostatnia linia wyświetlana na ekranie nie może mleć ustawionego piątego bitu (patrz program powyżej). To wszystko w tym artykule, za miesiąc zajmiemy się bitem siódmym, czyli przerwaniem Display List. Tomasz Bielak
Rafał Bielecki |