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