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