new version
[Chiptunes-pms150c.git] / bsv.c
CommitLineData
5ebb16dc
TG
1#include <stdio.h>
2#include "fakeasm.h"
b3a565e1
TG
3typedef unsigned char u8;
4
19c9f57b 5u8 notes[16]; //MEM
268e276e 6u8 i0, i1, i2; //MEM
7e02078f 7u8 n; //MEM
5ebb16dc 8u8 sample; //MEM
d17a26fd 9u8 tmp_1; //MEM
268e276e 10u8 acc; //ACC
f3768c26 11
88d59159 12u8 mod3hi, mod3lo; //MEM
6494a942 13//todo: can mod3hi be aliased to tmp_1?
837c7d6c 14void mod3(void) {
6494a942
TG
15 MOV (acc,mod3hi)
16 ADD (mod3lo,acc) // mod3lo = hi+lo
17 CLEAR (acc)
18 ADDC0 (acc) // mod3hi, 1bit
19 SWAP (acc)
20 MOV (mod3hi, acc)
837c7d6c 21
6494a942
TG
22 MOV (acc, mod3lo)
23 SWAP (acc)
24 AND (acc, 0xf) // (mod3lo>>4)
25 XCH (mod3lo) // acc=mod3lo, mod3lo=mod3lo>>4
26 AND (acc, 0xF) // acc=mod3lo&0xf, mod3lo=mod3lo>>4
27 ADD (acc, mod3lo) // (mod3lo & 0xF)
28 ADD (acc, mod3hi)
29 MOV (mod3lo, acc)
bf20ae1c 30
6494a942
TG
31 AND (acc, 0x3) // acc = (mod3lo & 0x3)
32 SR (mod3lo)
33 SR (mod3lo) // (mod3lo >> 2)
34 ADD (acc, mod3lo)
35 MOV (mod3lo, acc)
5f0928cc 36
6494a942
TG
37 AND (acc, 0x3) // acc = (mod3lo & 0x3)
38 SR (mod3lo)
39 SR (mod3lo) // (mod3lo >> 2)
40 ADD (acc, mod3lo)
5f0928cc 41
6494a942 42 SUB (acc,3)
23a7a348
TG
43 /*T0SN FLAG.C (0x00.1)*/ if (flag_c){ // skip if carry clear
44 ADD (acc,3) }
88d59159
TG
45}
46
b2ed0598 47void g(void){
f2326bfb
TG
48 // notes_ix_hi = always 0
49 u8 notes_ix;//lo
50 AND (acc, 0x7)
51 MOV (notes_ix, acc)
52 // test i2 & 3:
53 MOV (acc, i2)
54 AND (acc, 3)
23a7a348 55 /*T0SN FLAG.Z (0x00.0)*/ if(3&i2) {// skip if !(3&i0)
10b43527
TG
56 SET1 (notes_ix, 3) } // ix += 8 <=> ix |= 8
57 IDXM (acc, notes+notes_ix)
f2326bfb 58 u8 result = ((i1<<8|i0)*acc)>>8; // keep hi byte
14ba6899
TG
59 //^TODO! https://git.gir.st/Chiptunes.git/blob/d397f89:/foo.c#l83
60 //final: https://git.gir.st/Chiptunes.git/blob/f8e0502:/foo.S#l113
61 u8 a2 = 0; // can probably be overloaded onto mul3lo/hi
62 u8 a1 = 0; // -"-
63 u8 t = acc; // note input (as returned by idxm)
64 for (u8 loop = 0; loop < 8; loop++) {
57b67606
TG
65 SR (t)
66 if (flag_c) {
14ba6899
TG
67 /*(2) ADDC a2, i1*/ a2 += i1 + ((a1+i0)>>8);
68 /*(1) ADD a1, i0*/ a1 += i0;
69 }
c8910ae3
TG
70 SR (a2)
71 SRC (a1)
14ba6899
TG
72 }
73 acc = a1;
c395d5c8 74}
f3768c26 75void main(void){
5ebb16dc
TG
76 CLEAR (i0)
77 CLEAR (i1)
78 CLEAR (i2)
19c9f57b
TG
79
80 //rom is not mmapped; must load into ram first
81 MOV (acc, 0x84)
82 MOV (notes[0x0], acc)
83 MOV (notes[0x5], acc)
84 MOV (acc, 0x9d)
85 MOV (notes[0x1], acc)
86 MOV (notes[0x4], acc)
87 MOV (acc, 0xb0)
88 MOV (notes[0x2], acc)
89 MOV (notes[0xA], acc)
90 MOV (acc, 0x69)
91 MOV (notes[0x3], acc)
92 MOV (notes[0x6], acc)
93 MOV (notes[0xB], acc)
94 MOV (notes[0xE], acc)
95 MOV (acc, 0x58)
96 MOV (notes[0x7], acc)
97 MOV (notes[0xF], acc)
98 MOV (acc, 0x75)
99 MOV (notes[0x8], acc)
100 MOV (notes[0xD], acc)
101 MOV (acc, 0x8c)
102 MOV (notes[0x9], acc)
103 MOV (notes[0xC], acc)
104
f3768c26 105 for(;;) {
fc496164
TG
106 MOV (acc, i2)// "mov mem,mem"
107 MOV (n, acc)// does not exist
5ebb16dc
TG
108 SL (n)
109 SL (n)
110 MOV (acc, i1)
111 SWAP (acc)
112 AND (acc, 0xf)
113 SR (acc)
114 SR (acc)
115 OR (n, acc)
bd4f3b3e 116
b2ed0598
TG
117 MOV (acc, n)
118 CALL (g)
5ebb16dc
TG
119 SWAP (acc)
120 AND (acc, 0x1)
121 MOV (sample, acc)
bd4f3b3e 122
d17a26fd
TG
123 MOV (acc, i2)
124 SL (acc)
125 SL (acc)
126 SL (acc)
f5823e3f 127 MOV (tmp_1, acc) // fresh tmp_1:
d17a26fd
TG
128 MOV (acc, i1)
129 SWAP (acc)
130 AND (acc, 0xf)
131 SR (acc)
132 OR (acc, tmp_1) // tmp_1 done.
b2ed0598
TG
133 XOR (acc, n)
134 CALL (g)
5ebb16dc
TG
135 SR (acc)
136 AND (acc, i2)
137 SR (acc)
138 AND (acc, 3)
139 ADD (sample, acc)
bd4f3b3e 140
774dc938
TG
141 MOV (acc, i2)
142 MOV (mod3hi, acc)
143 SR (mod3hi)
144 SR (mod3hi)
145 SR (mod3hi)
146 SWAP (acc)
147 AND (acc, 0xf0)
148 SL (acc)
149 MOV (mod3lo, acc)
150 MOV (acc, i1)
151 SR (acc)
152 SR (acc)
153 SR (acc)
154 OR (mod3lo, acc)
abd85947 155 CALL (mod3)
b2ed0598
TG
156 ADD (acc, n)
157 CALL (g)
5ebb16dc
TG
158 SR (acc)
159 SR (acc)
c004ed39
TG
160 MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc
161 MOV (acc, i2)
162 // shift-divide by six
2ae98f0b 163 // note: i2 is max 0x78; so acc will <= 20. (breaks vor values >=128)
7e0dee10
TG
164 SR (acc)
165 ADD (acc, i2)
7e0dee10 166 SR (acc)
7e0dee10
TG
167 SR (acc)
168 ADD (acc, i2)
7e0dee10 169 SR (acc)
7e0dee10
TG
170 SR (acc)
171 ADD (acc, i2)
7e0dee10 172 SR (acc)
7e0dee10 173 SR (acc)
7e0dee10 174 SR (acc)
c004ed39
TG
175 // end divide by six
176 AND (acc, tmp_1) // acc restored from tmp_1
5ebb16dc
TG
177 AND (acc, 3)
178 ADD (sample, acc)
bd4f3b3e 179
8ed39eb1 180 MOV (acc, i2)
5ef6ccab
TG
181 MOV (mod3hi, acc)
182 SR (mod3hi)
183 SR (mod3hi)
8ed39eb1
TG
184 SWAP (acc)
185 AND (acc, 0xf0)
186 SL (acc)
187 SL (acc)
188 MOV (mod3lo, acc)
189 MOV (acc, i1)
190 SR (acc)
191 SR (acc)
192 OR (mod3lo, acc)
abd85947
TG
193 CALL (mod3)
194 SUB (acc, n)
195 SUB (acc, 8)
196 NEG (acc)
b2ed0598 197 CALL (g)
5ebb16dc 198 SR (acc)
c004ed39 199 MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc
7cbbb5ba 200 MOV (acc, i2)
c004ed39 201 // shift-divide by ten
b29570af 202 // note: i2 is max 0x78; so acc will <= 12.
1d9b2eb7
TG
203 INC (i2)
204 SR (acc)
205 ADD (acc, i2)
206 SR (acc)
207 SR (acc)
208 SR (acc)
209 ADD (acc, i2)
210 SR (acc)
211 ADD (acc, i2)
28556352 212 SWAP (acc)
1d9b2eb7 213 DEC (i2)
c004ed39
TG
214 // end divide by ten
215 AND (acc, tmp_1) // acc restored from tmp_1
5ebb16dc
TG
216 AND (acc, 3)
217 ADD (sample, acc)
bd4f3b3e 218
be69f3a9
TG
219 MOV (acc, sample)
220 SWAP (acc)
221 putchar(acc);
ac66812d 222
42c6050e 223 INC (i0)
23a7a348
TG
224 /*ADDC i1*/ i1 += !i0;
225 /*ADDC i2*/ i2 += !i1 && !i0;
e465ced0
TG
226
227 if(i2 == 0x78) break;
fef0e35b 228 }
c395d5c8 229}
Imprint / Impressum