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 = ((i3<<24|i2<<16|i1<<8|i0)*t) >> 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 tmp >>= 6;
45 n = (n | tmp);
46 #undef tmp
47 s = (i3<<7 | i2>>1);
48
49 //voice 1:
50 LDI (x, 1)
51 MOV (t, n)
52 LDI (o, 12)
53 RCALL g();
54 MOV (acc, t)
55
56 //voice 2:
57 MOV (x, s)
58 #define tmp o
59 MOV (tmp, i2)
60 LSL (tmp)
61 LSL (tmp)
62 LSL (tmp)
63 MOV (t, i1)
64 SWAP (t)
65 ANDI (t, 0xf)
66 LSR (t)
67 OR (t, tmp)
68 #undef tmp
69 EOR (t, n)
70 LDI (o, 10)
71 RCALL g();
72 ADD (acc, t)
73
74 //voice 3:
75 x = s / 3;
76 t = n + ((i3<<13 | i2<<5 | i1>>3) % 3);
77 LDI (o, 10)
78 RCALL g();
79 ADD (acc, t)
80
81 //voice 4:
82 x = s / 5;
83 t = 8 + n - ((i3<<14 | i2<<6 | i1>>2) % 3);
84 LDI (o, 9)
85 RCALL g();
86 ADD (acc, t)
87
88 putchar(acc<<4);
89 #define tmp acc
90 LDI (tmp, 0)
91 SUBI (i0, -1)
92 ADC (i1, tmp, !i0)
93 ADC (i2, tmp, !i0&&!i1)
94 ADC (i3, tmp, !i0&&!i1&&!i2)
95 #undef tmp
96 }
97 }
Imprint / Impressum