]> 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) >> 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, 12)
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, 10)
82 RCALL g();
83 ADD (acc, t)
84
85 //voice 3:
86 MOV (x, s)
87 INC (x)
88 #define tmp o
89 x = (x*0x55)>>8;
90 #undef tmp
91 t = ((i3&0x01)<<13 | i2<<5 | i1>>3) % 3;
92 ADD (t, n)
93 LDI (o, 10)
94 RCALL g();
95 ADD (acc, t)
96
97 //voice 4:
98 MOV (x, s)
99 INC (x)
100 #define tmp o
101 x = (x*0x33)>>8;
102 #undef tmp
103 t = n - (((i3&0x01)<<14 | i2<<6 | i1>>2) % 3);
104 SUBI (t, -8)
105 LDI (o, 9)
106 RCALL g();
107 ADD (acc, t)
108
109 putchar(acc<<4);
110 #define tmp acc
111 LDI (tmp, 0)
112 SUBI (i0, -1)
113 ADC (i1, tmp, !i0)
114 ADC (i2, tmp, !i0&&!i1)
115 ADC (i3, tmp, !i0&&!i1&&!i2)
116 #undef tmp
117 }
118}
Imprint / Impressum