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