]> git.gir.st - Chiptunes-pms150c.git/blob - bsv.c
5fb6e83832b05a10c61f94a382b26f7a4a32e1b6
[Chiptunes-pms150c.git] / bsv.c
1 #include <stdio.h>
2 #include "fakeasm.h"
3 typedef unsigned char u8;
4
5 u8 notes[16]; //MEM
6 u8 i0, i1, i2; //MEM
7 u8 n; //MEM
8 u8 sample; //MEM
9 u8 tmp_1; //MEM
10 u8 acc; //ACC
11
12 u8 mod3hi, mod3lo; //MEM
13 //todo: can mod3hi be aliased to tmp_1?
14 void mod3(void) {
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)
21
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)
30
31 AND (acc, 0x3) // acc = (mod3lo & 0x3)
32 SR (mod3lo)
33 SR (mod3lo) // (mod3lo >> 2)
34 ADD (acc, mod3lo)
35 MOV (mod3lo, acc)
36
37 AND (acc, 0x3) // acc = (mod3lo & 0x3)
38 SR (mod3lo)
39 SR (mod3lo) // (mod3lo >> 2)
40 ADD (acc, mod3lo)
41
42 SUB (acc,3)
43 /*T0SN FLAG.C (0x00.1)*/ if (flag_c){ // skip if carry clear
44 ADD (acc,3) }
45 RET
46 }
47
48 void g(void){
49 // notes_ix_hi = always 0
50 u8 notes_ix;//lo
51 AND (acc, 0x7)
52 MOV (notes_ix, acc)
53 // test i2 & 3:
54 MOV (acc, i2)
55 AND (acc, 3)
56 /*T0SN FLAG.Z (0x00.0)*/ if(3&i2) {// skip if !(3&i0)
57 SET1 (notes_ix, 3) } // ix += 8 <=> ix |= 8
58 IDXM (acc, notes+notes_ix)
59
60 #define mul2 mod3hi
61 #define mul1 mod3lo
62 #define t tmp_1
63 MOV (t, acc)
64 CLEAR (mul2)
65 CLEAR (mul1)
66 //1/8:
67 SR (t)
68 /*T1SN FLAG.C*/ if(!flag_c) {
69 goto skip1; }
70 MOV (acc, i0)
71 ADD (mul1, acc)
72 MOV (acc, i1)
73 ADDC (mul2, acc)
74 skip1: SR (mul2)
75 SRC (mul1)
76 //2/8:
77 SR (t)
78 skip2: SR (mul2)
79 SRC (mul1)
80 //3/8:
81 SR (t)
82 /*T1SN FLAG.C*/ if(!flag_c) {
83 goto skip3; }
84 MOV (acc, i0)
85 ADD (mul1, acc)
86 MOV (acc, i1)
87 ADDC (mul2, acc)
88 skip3: SR (mul2)
89 SRC (mul1)
90 //4/8:
91 SR (t)
92 /*T1SN FLAG.C*/ if(!flag_c) {
93 goto skip4; }
94 MOV (acc, i0)
95 ADD (mul1, acc)
96 MOV (acc, i1)
97 ADDC (mul2, acc)
98 skip4: SR (mul2)
99 SRC (mul1)
100 //5/8:
101 SR (t)
102 /*T1SN FLAG.C*/ if(!flag_c) {
103 goto skip5; }
104 MOV (acc, i0)
105 ADD (mul1, acc)
106 MOV (acc, i1)
107 ADDC (mul2, acc)
108 skip5: SR (mul2)
109 SRC (mul1)
110 //6/8:
111 SR (t)
112 /*T1SN FLAG.C*/ if(!flag_c) {
113 goto skip6; }
114 MOV (acc, i0)
115 ADD (mul1, acc)
116 skip6:
117 SRC (mul1)
118 //7/8:
119 SR (t)
120 /*T1SN FLAG.C*/ if(!flag_c) {
121 goto skip7; }
122 MOV (acc, i0)
123 ADD (mul1, acc)
124 skip7:
125 SRC (mul1)
126 //8/8:
127 SR (t)
128 /*T1SN FLAG.C*/ if(!flag_c) {
129 goto skip8; }
130 MOV (acc, i0)
131 ADD (mul1, acc)
132 skip8:
133 SRC (mul1)
134
135 MOV (acc, mul1)
136 RET
137 }
138 void main(void){
139 CLEAR (i0)
140 CLEAR (i1)
141 CLEAR (i2)
142
143 //rom is not mmapped; must load into ram first
144 MOV (acc, 0x84)
145 MOV (notes[0x0], acc)
146 MOV (notes[0x5], acc)
147 MOV (acc, 0x9d)
148 MOV (notes[0x1], acc)
149 MOV (notes[0x4], acc)
150 MOV (acc, 0xb0)
151 MOV (notes[0x2], acc)
152 MOV (notes[0xA], acc)
153 MOV (acc, 0x69)
154 MOV (notes[0x3], acc)
155 MOV (notes[0x6], acc)
156 MOV (notes[0xB], acc)
157 MOV (notes[0xE], acc)
158 MOV (acc, 0x58)
159 MOV (notes[0x7], acc)
160 MOV (notes[0xF], acc)
161 MOV (acc, 0x75)
162 MOV (notes[0x8], acc)
163 MOV (notes[0xD], acc)
164 MOV (acc, 0x8c)
165 MOV (notes[0x9], acc)
166 MOV (notes[0xC], acc)
167
168 for(;;) {
169 MOV (acc, i2)// "mov mem,mem"
170 MOV (n, acc)// does not exist
171 SL (n)
172 SL (n)
173 MOV (acc, i1)
174 SWAP (acc)
175 AND (acc, 0xf)
176 SR (acc)
177 SR (acc)
178 OR (n, acc)
179
180 MOV (acc, n)
181 CALL (g)
182 SWAP (acc)
183 AND (acc, 0x1)
184 MOV (sample, acc)
185
186 MOV (acc, i2)
187 SL (acc)
188 SL (acc)
189 SL (acc)
190 MOV (tmp_1, acc) // fresh tmp_1:
191 MOV (acc, i1)
192 SWAP (acc)
193 AND (acc, 0xf)
194 SR (acc)
195 OR (acc, tmp_1) // tmp_1 done.
196 XOR (acc, n)
197 CALL (g)
198 SR (acc)
199 AND (acc, i2)
200 SR (acc)
201 AND (acc, 3)
202 ADD (sample, acc)
203
204 MOV (acc, i2)
205 MOV (mod3hi, acc)
206 SR (mod3hi)
207 SR (mod3hi)
208 SR (mod3hi)
209 SWAP (acc)
210 AND (acc, 0xf0)
211 SL (acc)
212 MOV (mod3lo, acc)
213 MOV (acc, i1)
214 SR (acc)
215 SR (acc)
216 SR (acc)
217 OR (mod3lo, acc)
218 CALL (mod3)
219 ADD (acc, n)
220 CALL (g)
221 SR (acc)
222 SR (acc)
223 MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc
224 MOV (acc, i2)
225 // shift-divide by six
226 // note: i2 is max 0x78; so acc will <= 20. (breaks vor values >=128)
227 SR (acc)
228 ADD (acc, i2)
229 SR (acc)
230 SR (acc)
231 ADD (acc, i2)
232 SR (acc)
233 SR (acc)
234 ADD (acc, i2)
235 SR (acc)
236 SR (acc)
237 SR (acc)
238 // end divide by six
239 AND (acc, tmp_1) // acc restored from tmp_1
240 AND (acc, 3)
241 ADD (sample, acc)
242
243 MOV (acc, i2)
244 MOV (mod3hi, acc)
245 SR (mod3hi)
246 SR (mod3hi)
247 SWAP (acc)
248 AND (acc, 0xf0)
249 SL (acc)
250 SL (acc)
251 MOV (mod3lo, acc)
252 MOV (acc, i1)
253 SR (acc)
254 SR (acc)
255 OR (mod3lo, acc)
256 CALL (mod3)
257 SUB (acc, n)
258 SUB (acc, 8)
259 NEG (acc)
260 CALL (g)
261 SR (acc)
262 MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc
263 MOV (acc, i2)
264 // shift-divide by ten
265 // note: i2 is max 0x78; so acc will <= 12.
266 INC (i2)
267 SR (acc)
268 ADD (acc, i2)
269 SR (acc)
270 SR (acc)
271 SR (acc)
272 ADD (acc, i2)
273 SR (acc)
274 ADD (acc, i2)
275 SWAP (acc)
276 DEC (i2)
277 // end divide by ten
278 AND (acc, tmp_1) // acc restored from tmp_1
279 AND (acc, 3)
280 ADD (sample, acc)
281
282 MOV (acc, sample)
283 SWAP (acc)
284 putchar(acc);
285
286 INC (i0)
287 /*ADDC i1*/ i1 += !i0;
288 /*ADDC i2*/ i2 += !i1 && !i0;
289
290 if(i2 == 0x78) break;
291 }
292 }
Imprint / Impressum