Tajemnice ATARI

Piszemy DEMO


    To 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.OBJ
    I tym sposobem dobrnęliśmy do końca naszego cyklu. Do zobaczenia


Tomasz Bielak
Rafał Bielecki




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

Pixel 2002