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