new version
[Chiptunes.git] / foo.c
CommitLineData
61fab018 1#include <stdio.h>
da32ed67 2#include "fakeasm.h"
61fab018 3typedef unsigned char u8;
da32ed67 4
24abdcbb
TG
5u8 data[] = {
6 0x84, 0x9d, 0xb0, 0x69, 0x9d, 0x84, 0x69, 0x58,
7 0x75, 0x8c, 0xb0, 0x69, 0x8c, 0x75, 0x69, 0x58
8};
61592bdd
TG
9u8 zero; //r16
10u8 acc; //r17
11u8 i0; //r18
12u8 i1; //r19
13u8 i2; //r20
14u8 i3; //r21
15u8 n; //r22
16u8 s; //r23
17u8 _; //r24
18 //r25
19u8 t;/*==Ml*/ //r26 (Xlo)
20u8 x;/*==Mh*/ //r27 (Xhi)
21 //r28
22 //r29
23/*fakestack_l*/ //r30 (Zlo)
24/*fakestack_h*/ //r31 (Zhi)
37bf20ea 25#define Mh x //mod3 vars
dbf91c38 26#define Ml t // -"-
e98ab46f 27//http://homepage.divms.uiowa.edu/~jones/bcd/mod.shtml
8d8c00e4
TG
28void mod3(void) {
29 // mod3(Mh.Ml) -> t
30 #define tmp _
5b1c6cc5
TG
31 ADD (Ml, Mh)
32 CLR (Mh)
3d517d8a
TG
33 ADC (Mh, zero, carry) //Mh only holds the carry bit
34 MOV (tmp, Ml)
35 SWAP (tmp)
36 ANDI (tmp, 0x0f)
37 SWAP (Mh)
38 OR (tmp, Mh)
0e3d0279 39 ANDI (Ml, 0x0f)
2a69999d 40 ADD (Ml, tmp)
0fc1d6d3
TG
41 MOV (tmp, Ml)
42 LSR (tmp)
43 LSR (tmp)
6c72d3c1 44 ANDI (Ml, 0x03)
2a69999d
TG
45 ADD (Ml, tmp)
46 MOV (tmp, Ml)
47 LSR (tmp)
48 LSR (tmp)
49 ANDI (Ml, 0x03)
50 ADD (Ml, tmp)
c3639d5b
TG
51 CPI (Ml, 3)
52 BRPL (skip)
197a5418 53 SUBI (Ml, 3)
c3639d5b 54 skip:;
4283632d 55 RET
8d8c00e4 56 #undef tmp
e98ab46f 57}
965274e2 58void g(void) {
362b33c9 59 // g(i, t) -> t
eafeaf93 60 // tempvars: `x` and `_`
49137fbf 61 #define tmp _
0f219114 62 ANDI (t, 0x07)
32632e61 63 MOV (tmp, i2)
63363195 64 ANDI (tmp, 3)
09cf3949 65 TST (tmp)
49137fbf 66 #undef tmp
09cf3949
TG
67 BREQ (skip)
68 SUBI (t, -8)
69 skip:
c616f0c2 70 t = data[t];
8ee3310e 71 /*MOV X_hi==x, data_hi
49137fbf
TG
72 MOV X_lo==t, data_lo
73 ADD X_lo, t
49137fbf
TG
74 ADC X_hi, zero
75 LD t, X */
d46aea64 76 t &= 0xfd; //hint
e5715654 77 t = (((i1&0x1f)<<8|i0)*t)>>8; //TODO
d46aea64 78 t &= 0x1e; //hint
d5b74a12 79 RET //TODO: replace CALL/RET with IJMP?
61fab018
TG
80};
81
82int main(void) {
23e66ca4
TG
83 CLR (zero)
84 CLR (i0)
85 CLR (i1)
86 CLR (i2)
87 CLR (i3)
5dd8b8ff 88 for (;;) {
7874ed03
TG
89 MOV (n, i2)
90 LSL (n)
91 LSL (n)
8ee3310e 92 #define tmp _
bc7680e3 93 MOV (tmp, i1)
5d4207f9
TG
94 SWAP (tmp)
95 ANDI (tmp, 0x0f)
3eef1ade
TG
96 LSR (tmp)
97 LSR (tmp)
128ff01a 98 OR (n, tmp)
bc7680e3 99 #undef tmp
df192822 100 MOV (s, i3)
2bbe001f 101 LSR (s)
27b03017
TG
102 ROR (s)
103 ANDI (s, 0x80)
8ee3310e 104 #define tmp _
a582bbc3
TG
105 MOV (tmp, i2)
106 LSR (tmp)
e389879f 107 OR (s, tmp)
df192822 108 #undef tmp
3b86ca43
TG
109
110 //voice 1:
3b86ca43 111 MOV (t, n)
965274e2 112 RCALL g();
c09a6ed8 113 SWAP (t)
46a8d83c 114 MOV (acc, t)
3b86ca43
TG
115
116 //voice 2:
37bf20ea 117 #define tmp _
94c4920f
TG
118 MOV (tmp, i2)
119 LSL (tmp)
120 LSL (tmp)
121 LSL (tmp)
122 MOV (t, i1)
4b0b7dc5
TG
123 SWAP (t)
124 ANDI (t, 0xf)
125 LSR (t)
94c4920f 126 OR (t, tmp)
1b023e92 127 #undef tmp
23872091 128 EOR (t, n)
965274e2 129 RCALL g();
7716b427
TG
130 LSR (t)
131 LSR (t)
132 ANDI (t, 3)
f28def6a 133 AND (t, s)
46a8d83c 134 ADD (acc, t)
3b86ca43
TG
135
136 //voice 3:
500692e4
TG
137 MOV (Ml, i2)
138 SWAP (Ml)
139 ANDI (Ml, 0xf0)
140 LSL (Ml)
8ee3310e 141 #define tmp _
500692e4
TG
142 MOV (tmp, i1)
143 LSR (tmp)
144 LSR (tmp)
145 LSR (tmp)
146 OR (Ml, tmp)
147 #undef tmp
d39a46f5
TG
148 MOV (Mh, i3)
149 SWAP (Mh)
150 ANDI (Mh, 0xf0)
151 LSL (Mh)
152 #define tmp _
153 MOV (tmp, i2)
154 LSR (tmp)
155 LSR (tmp)
156 LSR (tmp)
157 OR (Mh, tmp)
158 #undef tmp
dbf91c38 159 RCALL mod3();
18570947 160 ADD (t, n)
965274e2 161 RCALL g();
c6c6cbe5
TG
162 LSR (t)
163 LSR (t)
164 ANDI (t, 3)
f28def6a
TG
165 MOV (x, s)
166 INC (x)
37bf20ea 167 #define tmp _
f28def6a
TG
168 MOV (tmp, x)
169 LSR (tmp)
170 LSR (tmp)
171 ADD (tmp, x)
172 ROR (tmp)
173 LSR (tmp)
174 ADD (tmp, x)
175 ROR (tmp)
176 LSR (tmp)
177 ADD (tmp, x)
178 ROR (tmp)
179 LSR (tmp)
180 MOV (x, tmp)
181 #undef tmp
5d9a2389 182 AND (t, x)
46a8d83c 183 ADD (acc, t)
3b86ca43
TG
184
185 //voice 4:
649bb224
TG
186 MOV (Ml, i2)
187 SWAP (Ml)
188 ANDI (Ml, 0xf0)
189 LSL (Ml)
190 LSL (Ml)
8ee3310e 191 #define tmp _
649bb224
TG
192 MOV (tmp, i1)
193 LSR (tmp)
194 LSR (tmp)
195 OR (Ml, tmp)
196 #undef tmp
18426c43
TG
197 MOV (Mh, i3)
198 SWAP (Mh)
199 ANDI (Mh, 0xf0)
200 LSL (Mh)
201 LSL (Mh)
202 #define tmp _
203 MOV (tmp, i2)
204 LSR (tmp)
205 LSR (tmp)
206 OR (Mh, tmp)
207 #undef tmp
dbf91c38 208 RCALL mod3();
e4f7baf0
TG
209 SUB (t, n)
210 NEG (t)
902cfdea 211 SUBI (t, -8)
965274e2 212 RCALL g();
c6c6cbe5
TG
213 LSR (t)
214 ANDI (t, 3)
d8af0686
TG
215 MOV (x, s)
216 INC (x)
37bf20ea 217 #define tmp _
d8af0686
TG
218 MOV (tmp, x)
219 LSR (tmp)
220 ADD (tmp, x)
221 ROR (tmp)
222 LSR (tmp)
223 LSR (tmp)
224 ADD (tmp, x)
225 ROR (tmp)
226 ADD (tmp, x)
227 ROR (tmp)
228 LSR (tmp)
229 LSR (tmp)
230 MOV (x, tmp)
231 #undef tmp
5d9a2389 232 AND (t, x)
46a8d83c 233 ADD (acc, t)
bfce2f8c 234
95fa231f 235 putchar(acc<<4); //TODO
89f35588 236 SUBI (i0, -1)
95fa231f
TG
237 ADC (i1, zero, !i0)
238 ADC (i2, zero, !i0&&!i1)
239 ADC (i3, zero, !i0&&!i1&&!i2)
fe9a76e4 240 }
61fab018 241}
Imprint / Impressum