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