]> git.gir.st - Chiptunes.git/blame_incremental - foo.c
new version
[Chiptunes.git] / foo.c
... / ...
CommitLineData
1#include <stdio.h>
2#include "fakeasm.h"
3typedef unsigned char u8;
4
5u8 data[] = {
6 0x84, 0x9d, 0xb0, 0x69, 0x9d, 0x84, 0x69, 0x58,
7 0x75, 0x8c, 0xb0, 0x69, 0x8c, 0x75, 0x69, 0x58
8};
9u8 i0;
10u8 i1;
11u8 i2;
12u8 i3;
13u8 x;
14u8 t;
15u8 o;
16void 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
33int 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