]> git.gir.st - Chiptunes-pms150c.git/blob - bsv.c
c7533ef71e2c9922bb29513b3e75c5e30cb65b8a
[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 }
46
47 void g(void){
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)
55 /*T0SN FLAG.Z (0x00.0)*/ if(3&i2) {// skip if !(3&i0)
56 SET1 (notes_ix, 3) } // ix += 8 <=> ix |= 8
57 IDXM (acc, notes+notes_ix)
58 u8 result = ((i1<<8|i0)*acc)>>8; // keep hi byte
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++) {
65 SR (t)
66 /*T1SN FLAG.C (0x00.1)*/ if (!flag_c) // skip if carry set
67 goto skip;
68 MOV (acc, i0)
69 ADD (a1, acc)
70 MOV (acc, i1)
71 ADDC (a2, acc)
72 skip: SR (a2)
73 SRC (a1)
74 }
75 acc = a1;
76 }
77 void main(void){
78 CLEAR (i0)
79 CLEAR (i1)
80 CLEAR (i2)
81
82 //rom is not mmapped; must load into ram first
83 MOV (acc, 0x84)
84 MOV (notes[0x0], acc)
85 MOV (notes[0x5], acc)
86 MOV (acc, 0x9d)
87 MOV (notes[0x1], acc)
88 MOV (notes[0x4], acc)
89 MOV (acc, 0xb0)
90 MOV (notes[0x2], acc)
91 MOV (notes[0xA], acc)
92 MOV (acc, 0x69)
93 MOV (notes[0x3], acc)
94 MOV (notes[0x6], acc)
95 MOV (notes[0xB], acc)
96 MOV (notes[0xE], acc)
97 MOV (acc, 0x58)
98 MOV (notes[0x7], acc)
99 MOV (notes[0xF], acc)
100 MOV (acc, 0x75)
101 MOV (notes[0x8], acc)
102 MOV (notes[0xD], acc)
103 MOV (acc, 0x8c)
104 MOV (notes[0x9], acc)
105 MOV (notes[0xC], acc)
106
107 for(;;) {
108 MOV (acc, i2)// "mov mem,mem"
109 MOV (n, acc)// does not exist
110 SL (n)
111 SL (n)
112 MOV (acc, i1)
113 SWAP (acc)
114 AND (acc, 0xf)
115 SR (acc)
116 SR (acc)
117 OR (n, acc)
118
119 MOV (acc, n)
120 CALL (g)
121 SWAP (acc)
122 AND (acc, 0x1)
123 MOV (sample, acc)
124
125 MOV (acc, i2)
126 SL (acc)
127 SL (acc)
128 SL (acc)
129 MOV (tmp_1, acc) // fresh tmp_1:
130 MOV (acc, i1)
131 SWAP (acc)
132 AND (acc, 0xf)
133 SR (acc)
134 OR (acc, tmp_1) // tmp_1 done.
135 XOR (acc, n)
136 CALL (g)
137 SR (acc)
138 AND (acc, i2)
139 SR (acc)
140 AND (acc, 3)
141 ADD (sample, acc)
142
143 MOV (acc, i2)
144 MOV (mod3hi, acc)
145 SR (mod3hi)
146 SR (mod3hi)
147 SR (mod3hi)
148 SWAP (acc)
149 AND (acc, 0xf0)
150 SL (acc)
151 MOV (mod3lo, acc)
152 MOV (acc, i1)
153 SR (acc)
154 SR (acc)
155 SR (acc)
156 OR (mod3lo, acc)
157 CALL (mod3)
158 ADD (acc, n)
159 CALL (g)
160 SR (acc)
161 SR (acc)
162 MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc
163 MOV (acc, i2)
164 // shift-divide by six
165 // note: i2 is max 0x78; so acc will <= 20. (breaks vor values >=128)
166 SR (acc)
167 ADD (acc, i2)
168 SR (acc)
169 SR (acc)
170 ADD (acc, i2)
171 SR (acc)
172 SR (acc)
173 ADD (acc, i2)
174 SR (acc)
175 SR (acc)
176 SR (acc)
177 // end divide by six
178 AND (acc, tmp_1) // acc restored from tmp_1
179 AND (acc, 3)
180 ADD (sample, acc)
181
182 MOV (acc, i2)
183 MOV (mod3hi, acc)
184 SR (mod3hi)
185 SR (mod3hi)
186 SWAP (acc)
187 AND (acc, 0xf0)
188 SL (acc)
189 SL (acc)
190 MOV (mod3lo, acc)
191 MOV (acc, i1)
192 SR (acc)
193 SR (acc)
194 OR (mod3lo, acc)
195 CALL (mod3)
196 SUB (acc, n)
197 SUB (acc, 8)
198 NEG (acc)
199 CALL (g)
200 SR (acc)
201 MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc
202 MOV (acc, i2)
203 // shift-divide by ten
204 // note: i2 is max 0x78; so acc will <= 12.
205 INC (i2)
206 SR (acc)
207 ADD (acc, i2)
208 SR (acc)
209 SR (acc)
210 SR (acc)
211 ADD (acc, i2)
212 SR (acc)
213 ADD (acc, i2)
214 SWAP (acc)
215 DEC (i2)
216 // end divide by ten
217 AND (acc, tmp_1) // acc restored from tmp_1
218 AND (acc, 3)
219 ADD (sample, acc)
220
221 MOV (acc, sample)
222 SWAP (acc)
223 putchar(acc);
224
225 INC (i0)
226 /*ADDC i1*/ i1 += !i0;
227 /*ADDC i2*/ i2 += !i1 && !i0;
228
229 if(i2 == 0x78) break;
230 }
231 }
Imprint / Impressum