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