Tajemnice ATARI

Piszemy DEMO


    W 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

   Prześledźmy następujący 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
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

   Podobnie jak rejestr HSCROL umożliwia delikatny przesuw jednego znaku w poziomie, tak rejestr VSCROL ($D405) odpowiada za delikatny przesuw w plonie. Aby płynny przesuw w pionie był możliwy, należy ustawić piąty bit (VSC - Vertical Scrolling) w rozkazie programu ANTIC'a. Popatrzmy na następny 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
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




Powrót na start | Powrót do spisu treści | Powrót na stronę główną

Pixel 2001