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 poziomy
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
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 file
Program 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 file
Procedury 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 pionowy
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
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 file
Korzystamy 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 file
Program 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 |