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 FileProcedura 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 FileNa 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 |