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