]> 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 = (((i1&0x1f)<<8|i0)*t)>>8 >> 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 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 MOV (s, i3)
51 ROR (s)
52 ROR (s)
53 ANDI (s, 0x80)
54 #define tmp acc
55 MOV (tmp, i2)
56 LSR (tmp)
57 OR (s, tmp)
58 #undef tmp
59
60 //voice 1:
61 LDI (x, 1)
62 MOV (t, n)
63 LDI (o, 4)
64 RCALL g();
65 MOV (acc, t)
66
67 //voice 2:
68 MOV (x, s)
69 #define tmp o
70 MOV (tmp, i2)
71 LSL (tmp)
72 LSL (tmp)
73 LSL (tmp)
74 MOV (t, i1)
75 SWAP (t)
76 ANDI (t, 0xf)
77 LSR (t)
78 OR (t, tmp)
79 #undef tmp
80 EOR (t, n)
81 LDI (o, 2)
82 RCALL g();
83 ADD (acc, t)
84
85 //voice 3:
86 MOV (x, s)
87 INC (x)
88 #define tmp o
89 unsigned short sum = 0;
90 for(int loop = 0; loop < 4; loop ++) {
91 sum >>= 1;
92 sum += x;
93 sum >>= 1;
94 //nop
95 }
96 sum >>= 1;
97 x = sum;
98
99 #undef tmp
100 t = ((i3&0x01)<<13 | i2<<5 | i1>>3) % 3;
101 ADD (t, n)
102 LDI (o, 2)
103 RCALL g();
104 ADD (acc, t)
105
106 //voice 4:
107 MOV (x, s)
108 INC (x)
109 #define tmp o
110 x = (x*0x33)>>8;
111 #undef tmp
112 t = ((i3&0x01)<<14 | i2<<6 | i1>>2) % 3;
113 SUB (t, n)
114 NEG (t)
115 SUBI (t, -8)
116 LDI (o, 1)
117 RCALL g();
118 ADD (acc, t)
119
120 putchar(acc<<4);
121 #define tmp acc
122 LDI (tmp, 0)
123 SUBI (i0, -1)
124 ADC (i1, tmp, !i0)
125 ADC (i2, tmp, !i0&&!i1)
126 ADC (i3, tmp, !i0&&!i1&&!i2)
127 #undef tmp
128 }
129}
Imprint / Impressum