new version
[Chiptunes.git] / foo.c
1 #include <stdio.h>
2 #include "fakeasm.h"
3 typedef unsigned char u8;
4
5 u8 data[] = {
6 0x84, 0x9d, 0xb0, 0x69, 0x9d, 0x84, 0x69, 0x58,
7 0x75, 0x8c, 0xb0, 0x69, 0x8c, 0x75, 0x69, 0x58
8 };
9 u8 i0;
10 u8 i1;
11 u8 i2;
12 u8 i3;
13 u8 x;
14 u8 t;
15 u8 o;
16 void g(void) {
17 // g(i, x, t, o) -> t
18 u8 tmp;
19 ANDI (t, 0x07)
20 MOV (tmp, i2)
21 ANDI (tmp, 3)
22 TST (tmp)
23 BREQ (skip)
24 SUBI (t, -8)
25 skip:
26 t = data[t];
27 t = (((i1&0x1f)<<8|i0)*t)>>8 >> o;
28 AND (t, x)
29 ANDI (t, 3)
30 RET
31 };
32
33 int main(void) {
34 u8 n;
35 u8 s;
36 u8 acc;
37 //TODO: clear all vars/registers
38 for (;;) {
39 MOV (n, i2)
40 LSL (n)
41 LSL (n)
42 #define tmp acc
43 MOV (tmp, i1)
44 SWAP (tmp)
45 ANDI (tmp, 0x0f)
46 LSR (tmp)
47 LSR (tmp)
48 OR (n, tmp)
49 #undef tmp
50 MOV (s, i3)
51 ROR (s)
52 ROR (s)
53 ANDI (s, 0x80)
54 #define tmp acc
55 MOV (tmp, i2)
56 LSR (tmp)
57 OR (s, tmp)
58 #undef tmp
59
60 //voice 1:
61 LDI (x, 1)
62 MOV (t, n)
63 LDI (o, 4)
64 RCALL g();
65 MOV (acc, t)
66
67 //voice 2:
68 MOV (x, s)
69 #define tmp o
70 MOV (tmp, i2)
71 LSL (tmp)
72 LSL (tmp)
73 LSL (tmp)
74 MOV (t, i1)
75 SWAP (t)
76 ANDI (t, 0xf)
77 LSR (t)
78 OR (t, tmp)
79 #undef tmp
80 EOR (t, n)
81 LDI (o, 2)
82 RCALL g();
83 ADD (acc, t)
84
85 //voice 3:
86 MOV (x, s)
87 INC (x)
88 #define tmp o
89 MOV (tmp, x)
90 ROR (tmp)
91 //nop
92 LSR (tmp)
93 ADD (tmp, x)
94 ROR (tmp)
95 //nop
96 LSR (tmp)
97 ADD (tmp, x)
98 ROR (tmp)
99 //nop
100 LSR (tmp)
101 ADD (tmp, x)
102 ROR (tmp)
103 //nop
104 LSR (tmp)
105 x = tmp;
106 #undef tmp
107 t = ((i3&0x01)<<13 | i2<<5 | i1>>3) % 3;
108 ADD (t, n)
109 LDI (o, 2)
110 RCALL g();
111 ADD (acc, t)
112
113 //voice 4:
114 MOV (x, s)
115 INC (x)
116 #define tmp o
117 unsigned short sum = 0; //XXX
118 sum += x;
119 sum >>= 1;
120 sum += x;
121 sum >>= 1;
122 //nop
123 sum >>= 1;
124 //nop
125 sum >>= 1;
126 sum += x;
127 sum >>= 1;
128 sum += x;
129 sum >>= 1;
130 //nop
131 sum >>= 1;
132 //nop
133 sum >>= 1;
134 x = sum;
135 #undef tmp
136 t = ((i3&0x01)<<14 | i2<<6 | i1>>2) % 3;
137 SUB (t, n)
138 NEG (t)
139 SUBI (t, -8)
140 LDI (o, 1)
141 RCALL g();
142 ADD (acc, t)
143
144 putchar(acc<<4);
145 #define tmp acc
146 LDI (tmp, 0)
147 SUBI (i0, -1)
148 ADC (i1, tmp, !i0)
149 ADC (i2, tmp, !i0&&!i1)
150 ADC (i3, tmp, !i0&&!i1&&!i2)
151 #undef tmp
152 }
153 }
Imprint / Impressum