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