Piszemy DEMOTo już ostatnia część naszego cyklu. Dzisiaj tylko procedura PART3.ASM, która jest trzecią częścią demonstracji oraz procedurę RUN.ASM, uruchamiającą całość. PART3.ASM tworzy własną Display List i przesuwa dużyw mrugający, płynący napis.
Program Equ $A300
List_mem Equ %00000110
List_err Equ %00000101
Code_mem Equ %00010000
Code_dsk Equ $00100000
Cdtma2 Equ $0228
Cdtmv2 Equ $021A
Chbas Equ $02F4
Colpf0s Equ %02C4
Colpf2s Equ $02C6
Dlptrs Equ $0230
HScrol Equ $D404
Nmien Equ $D40E
Bit Equ $86
Ekran Equ $9000
HScr Equ $85
Pomoc Equ $80
Pomoc2 Equ $84
Tekst Equ $82
Text Equ $7200
Zestaw Equ $8C00
Znak Equ $9A92
Opt List_err+Code_dsk
Org Procedure
Ldx <Dlist
Ldy >Dlist
Stx Dlptrs
Sty Dlptrs+$01
Ldx <Text
Ldy >Text
Lda #$0D
Stx Tekst
Sty Tekst+$01
Sta HScr
Lda #$07
Sta Bit
Jsr Znaki
Ldx #$90
Ldy #$9F
Stx Colpf0s
Sty Colpf2s
Lda #$00
Sta Pomoc
Lda <Przerw
Ldy >Przerw
Lda #$01
Stx Cdtma2
Sty Cdtma2+$01
Sta Cdtmv2
Lda #$C0
Sta Nmien
Rts
Przerw Lda HScr
Eor #$02
Sta HScr
Sta HScrol
Cmp #$0D
Bne L1
Jmp Koniec
L1 Ldy #$07
Ldx #$00
L2 Inc PoczE,x
Inx
Inx
Inx
Inx
Dey
Bpl L2
Lda PoczE
Cmp #$03
Beq L3
Jmp Koniec
L3 Ldy #$07
Ldx #$00
L4 Dec PoczE,x
Dec PoczE,x
Dec PoczE,x
Inx
Inx
Inx
Inx
Dey
Bpl L4
Ldx <Ekran
Ldy >Ekran
Stx Pomoc
Sty Pomoc+$01
Ldx #$07
L5 Ldy #$03
L6 Lda (Pomoc),y
Dey
Dey
Dey
Sta (Pomoc),y
Iny
Iny
Iny
Iny
Cpy #$34
Bne L6
Clc
Adc #$34
Sta Pomoc
Bcc L7
Inc Pomoc+$01
L7 Dex
Bpl L5
Ldx <Ekran+$30
Ldy >Ekran
Stx Pomoc
Sty Pomoc+$01
Ldx #$00
L8 Txa
Pha
Asl Tab,x
Txa
Ldx #$00
Ldy #$00
Bcc L9
Lsr @
Ldx #$04
Ldy #$03
Bcc L9
Ldx #$06
Ldy #$05
L9 Tya
Ldy #400
Sta (Pomoc),y
Iny
Txa
Sta (Pomoc),y
Clc
Lda Pomoc
Adc #$34
Sta Pomoc
Bcc L10
Inc Pomoc+$01
L10 Pla
Tax
Inx
Cpx #$08
Bne L8
Inc Bit
Lda Bit
And #$07
Sta Bit
Bne Koniec
Ldy #$00
Lda (Tekst),y
Jsr Inc_txt
Jsr Znak
Ldy #$07
L11 Lda (Pomoc),y
Sta Tab,y
Dey
Bpl L11
Koniec Lda Pomoc2
Bne L12
Inc Colpf0s
Dec Colpf2s
Lda Colpf2s
And #$0F
Bne L13
Inc Pomoc2
L12 Dec Colpf0s
Inc Colpf2s
Lda Colpf0s
And #$0F
Bne L13
Dec Pomoc2
L13 Lda #$01
Sta Cdtmv2
Rts
Inc_txt Inc Tekst
Bne L15
Inc Tekst+$01
Pha
Lda Tekst+$01
Cmp >Text+$02
Bne L14
Lda >Text
Sta Tekst+$01
L14 Pla
L15 Rts
Znaki Ldx #$lF
Lda Tab_zn,x
Sta Zestaw+$18,x
Dex
Bpl L16
Lda >Zestaw
Sta Chbas
Rts
Dlist Dta B($70),B($70)
Dta B($70),B($55)
PoczE Dta A(Ekran)
Dta B($70),B($55),A(Ekran+52)
Dta B($70),B($55),A(Ekran+104)
Dta B($70),B($55),A(Ekran+156)
Dta B($70),B($55),A(Ekran+208)
Dta B($70),B($55),A(Ekran+260)
Dta B($70),B($55),A(Ekran+312)
Dta B($70),B($55),A(Ekran+364)
Dta B($41),A(Dlist)
Tab_zn Dta B($AA),B($BF)
Dta B($BF),B($BF),B($BF)
Dta B($BF),B($BF),B($AA)
Dta B($AA),B($FE)
Dta B($FE),B($FE),B($FE)
Dta B($FE),B($FE),B($AA)
Dta B($AA),B($95)
Dta B($95),B($95),B($95)
Dta B($95),B($95),B($AA)
Dta B($AA),B($56)
Dta B($56),B($56),B($56)
Dta B($56),B($56),B($AA)
Tab Dta B($00)
End of File
Procedura korzysta w tekstu z pierwszej części demonstracji (etykieta Text), następnie definiuje cztery znaki (podprocedura Znaki), ustawia wstępnie rejestry kolorów oraz inicjuje przerwanie Timer'a 2, na którym wykonywana jest procedura Przerw.Procedura Przerw przesuwa płynący napis. Rozwiązanie programowe jest podobne. Jak w procedurze BSCROLL.ASM: na początku modyfikujemy tylko rejestr Hscrol (etykieta Przerw). Następnym krokiem jest zwiększanie adresów kolejnych linii ekranu w Display List (pętla L2). Jeśli przesunęliśmy już ekran o określoną ilość znaków, to konieczne jest przywrócenie początkowych wartości adresom linii ekranu w Display List (pętla L4), przepisanie pamięci ekranu (pętla L5) i utworzenie następnych elementów kolejnej dużej litery napisu (pętla L8). Jeśli przesunięty zostanie cały znak, to pobierany jest znak następny, zwiększany wskaźnik tekstu (procedura Inc_txt) oraz pobierany wygląd znaku z zestawu znaków (pęlta L11). Dodatkowo fragment procedury, rozpoczynający się od etykiety Koniec modyfikuje rejestry kolorów. Procedura RUN.ASM uruchamia całą demonstrację:
Procedure Equ $0600
List_mem Equ %00000110
List_err Equ %00000101
Code_mem Equ %00010000
Code_dsk Equ %00100000
Atract Equ $004D
Dliv Equ $0200
Dmactls Equ $022F
Nmien Equ $D40E
Rtclok Equ $0012
Skctl Equ $D20F
Skstat Equ $D20F
Vvblk Equ $0222
Bary Equ $A17D
BScroll Equ $9DE6
Dli Equ $9800
Dli2 Equ $A000
Dliv_1 Equ $9897
HScroll Equ $9DA5
Music Equ $7400
Part3 Equ $A300
Play_2 Equ $9FD5
Players Equ $9B5B
Polskie Equ $9AD0
Ruch Equ $9E98
Skoczek Equ $A10C
VScroll Equ $9D49
Wskaznik Equ $9F95
Znaczek Equ $9E82
Opt List_err+Code_dsk
Org Procedure
Ldx Wblk
Ldy Vvblk+$01
Stx Koniec+$01
Sty Koniec+$02
Lda Dliv
Pha
Lda Dliv+$01
Pha
Jsr Polskie
Jsr Dli
Jsr Dliv_l
Jsr Players
Jsr Ruch
Jsr BScroll
Jsr Vscroll
Jsr HScroll
Lda #$03
Sta Skctl
Ldx <Muzyka
Ldy >Muzyka
Lda #$C0
Stx Vvblk
Sty Vvblk+$01
Sta Nmien
L1 Lda Rtclok+$02
L2 Cmp Rtclok+$02
Beq L2
Lda Licznik
Eor #$01
Sta Licznik
Sta Atract
Beq L3
Jsr Players+$03
Jsr Znaczek
L3 Jsr VScroll+$03
Jsr HScroll+$03
Jsr BScroll+$03
Jsr Ruch+$03
Jsr Wskaznik
Lda Skstat
And #$08
Bne L1
Lda #$00
Sta Dmactls
L4 Lda Skstat
And #$08
Beq L4
Lda #$00
Stx Nmien
Sei
Pla
Sta Dliv+$01
Pla
Sta Dliv
Ldx <Przerw
Ldy >Przerw
Stx Vvblk
Sty Vvblk+$01
Cli
Lda #$FF
Sta Nmien
Jsr Play_2
Jsr Skoczek
Jsr Dli2
Jsr Bary
Ldx #$00
Stx Nmien
Sei
Ldx <Part3p
Ldy >Part3p
Stx Vvblk
Sty Vvblk+$01
Cli
Lda #$FF
Sta Nmien
Jsr Part3
L5 Jmp L5
Przerw Jsr Skoczek+$03
Part3p Jsr Wskaznik
Muzyka Jsr Music+$01
Koniec Jmp Koniec
Licznik Dta B($00)
Org $02E0
Dta A($0600)
End of File
Na początku procedura przepisuje adres oryginalnej procedury przerwania Vblk na koniec procedury użytkownika. Następnie na stosie zapamiętywany jest oryginalny adres procedury przerwania Display List i kolejno wywoływane są procedury potrzebne do uruchomienia pierwszej części demonstracji. Następnie wektor przerwania Vblk ustawiany jest na procedurę odgrywającą muzykę. W pętli L1 wywoływane są kolejno procedury pierwszej części demonstracji aż do naciśnięcia klawisza Shift. Na czas "trzymania" klawisza Shift wyłączony jest ekran i pętla L4 oczekuje na zwolnienie tego klawisza. Przed uruchomieniem drugiej części przywracany jest oryginalny wektor przerwania Display List i modyfikowany wektor Vvblk. Następnie wywoływane są procedury drugiej części demonstracji. Po opuszczeniu drugiej części modyfikowany jest jeszcze raz wektor Vvblk i wywoływana dzisiaj zamieszczona procedura PART3.ASM. Jak widać z pętli L5, z demonstracji nie ma wyjścia.Na zakończenie, tradycyjnie, program w Basic'u, który połączy wszystkie potrzebne zbiory: 10 REM 20 REM PROGRAM LACZACY ZBIORY 30 REM 40 COM NAZWA$(14) 50 OPEN #1,8,0,"D:DEMO.COM" 60 FOR L=0 TO 40:READ D 70 POKE 1636+L,D:NEXT L 80 FOR L=0 TO 21:READ NAZWA$: ? NAZWA$ 90 OPEN #2,4,0,NAZWA$ 100 D=USR(1536,32,7,14000) 110 X=USR(1536,16,11,D) 120 CLOSE #2:NEXT L:CLOSE #1;END 897 REM 898 REM PROGRAM MASZYNOWY 899 REM 900 DATA 104,104,104,170,104,104,157 910 DATA 66,3,104,157,73,3,104,157 920 DATA 72,3,169,0,157,68,3,169,100 930 DATA 157,69,3,32,86,228,189,72,3 940 DATA 133,212,189,73,3,133,213,96 997 REM 998 REM NAZWY ZBIOROW 999 REM 1000 DATA D:CZYSC.OBJ 1010 DATA D:DLI.OBJ 1020 DATA D:DLIV.OBJ 1030 DATA D:ZNAK.OBJ 1040 DATA D:DEFZNAK.OBJ 1050 DATA D:POLSKIE.OBJ 1060 DATA D:PLAYER.OBJ 1070 DATA D:VSCROLL.OBJ 1080 DATA D:HSCROLL.OBJ 1090 DATA D:BSCROLL.OBJ 1100 DATA D:ZNACZEK.OBJ 1110 DATA D:RUCH.OBJ 1120 DATA D:WSKAZNIK.OBJ 1130 DATA D:PLAYER2.OBJ 1140 DATA D:DLI2.0BJ 1150 DATA D:SKOCZEK.OBJ 1160 DATA D:BARY.OBJ 1170 DATA D:PART3.0BJ 1180 DATA D:TEKSTY.DAT 1190 DATA D:MUZYKA.OBJ 1200 DATA D:OBRAZEK.DAT 1210 DATA D:RUN.OBJI tym sposobem dobrnęliśmy do końca naszego cyklu. Do zobaczenia Tomasz Bielak
Rafał Bielecki |