per-line scrolling test
[mdlife] / src / z80 / main.asm
1         include "sndregs.inc"
2
3         section .vect
4         jr main         ; RST 0
5         dc 6,0
6         dc 6*8, 0       ; RST [1, 7]
7         jp vblank_isr
8
9 TESTDATA_LEN equ 43
10 IPC     equ $1ffc
11
12         section .text
13 main:   di
14         halt    ; XXX
15         im 1
16         ld sp, $1ff0
17         call init
18         ; iy is left with YMADDR
19         ld (iy), YM_OPER
20         ld (iy+1), $f0  ; key on
21         ei
22 mainloop:
23         ;halt           ; wait for interrupt
24         ld a, (frame)
25         ld b, a         ; b: cur frame
26         ld a, (prev)    ; a: prev frame
27         xor b
28         bit 7, a
29         ld a, b
30         ld (prev), a
31         jr z, mainloop
32
33         bit 7, a        ; 0: play, 1: stop
34         jr z, .keyon
35         ld (iy), YM_OPER
36         ld (iy+1), 0    ; key off
37         jr mainloop
38 .keyon: ld (iy), YM_OPER
39         ld (iy+1), $f0  ; key on
40         jr mainloop
41
42 init:
43         ld ix, testdata
44         ld iy, YMADDR
45         ld b, TESTDATA_LEN
46 .loop:  call ymwait
47         ld a, (ix)
48         ld (iy), a      ; select reg
49         inc ix
50         call ymwait
51         ld a, (ix)
52         ld (iy+1), a    ; write reg
53         inc ix
54         djnz .loop
55         ret
56
57 ymwait:
58         ld a, (YMADDR)
59         bit 7, a
60         jr nz, ymwait
61         ret
62
63 vblank_isr:
64         ex af, af'
65         exx
66
67         ld hl, frame
68         inc (hl)
69         ld a, (hl)
70         ld (IPC+1), a
71
72         exx
73         ex af, af'
74         ei
75         ret
76
77
78 frame:  db 0
79 prev:   db 0
80
81
82 testdata:
83         db YM_LFO, 0
84         db YM_MODE, 0
85         db YM_OPER, 0
86         db YM_OPER, 1
87         db YM_OPER, 2
88         db YM_OPER, 3
89         db YM_OPER, 4
90         db YM_OPER, 5
91         db YM_OPER, 6
92         db YM_DACEN, 0
93         db YM_DT1MUL_OP1, $71
94         db YM_DT1MUL_OP2, $0d
95         db YM_DT1MUL_OP3, $33
96         db YM_DT1MUL_OP4, $01
97         db YM_TL_OP1, $23
98         db YM_TL_OP2, $2d
99         db YM_TL_OP3, $26
100         db YM_TL_OP4, 0
101         db YM_RSAR_OP1, $5f
102         db YM_RSAR_OP2, $99
103         db YM_RSAR_OP3, $5f
104         db YM_RSAR_OP4, $94
105         db YM_AMD1R_OP1, 5
106         db YM_AMD1R_OP2, 5
107         db YM_AMD1R_OP3, 5
108         db YM_AMD1R_OP3, 7
109         db YM_D2R_OP1, 2
110         db YM_D2R_OP2, 2
111         db YM_D2R_OP3, 2
112         db YM_D2R_OP4, 2
113         db YM_D1LRR_OP1, $11
114         db YM_D1LRR_OP2, $11
115         db YM_D1LRR_OP3, $11
116         db YM_D1LRR_OP4, $a6
117         db YM_SSGEG_OP1, 0
118         db YM_SSGEG_OP2, 0
119         db YM_SSGEG_OP3, 0
120         db YM_SSGEG_OP4, 0
121         db YM_FEEDBALG, $32
122         db YM_LRAMSFMS, $c0
123         db YM_OPER, 0
124         db YM_BLOCKFREQ, $22
125         db YM_FREQ, $69
126
127 ; vi:ft=z80: