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