]>
Commit | Line | Data |
---|---|---|
1 | #include <stdio.h> | |
2 | #include "fakeasm.h" | |
3 | typedef unsigned char u8; | |
4 | ||
5 | u8 notes[16]; //MEM | |
6 | u8 i0, i1, i2; //MEM | |
7 | u8 n; //MEM | |
8 | u8 sample; //MEM | |
9 | u8 tmp_1; //MEM | |
10 | u8 acc; //ACC | |
11 | ||
12 | u8 mod3hi, mod3lo; //MEM | |
13 | //todo: can mod3hi be aliased to tmp_1? | |
14 | void mod3(void) { | |
15 | MOV (acc,mod3hi) | |
16 | ADD (mod3lo,acc) // mod3lo = hi+lo | |
17 | CLEAR (acc) | |
18 | ADDC0 (acc) // mod3hi, 1bit | |
19 | SWAP (acc) | |
20 | MOV (mod3hi, acc) | |
21 | ||
22 | MOV (acc, mod3lo) | |
23 | SWAP (acc) | |
24 | AND (acc, 0xf) // (mod3lo>>4) | |
25 | XCH (mod3lo) // acc=mod3lo, mod3lo=mod3lo>>4 | |
26 | AND (acc, 0xF) // acc=mod3lo&0xf, mod3lo=mod3lo>>4 | |
27 | ADD (acc, mod3lo) // (mod3lo & 0xF) | |
28 | ADD (acc, mod3hi) | |
29 | MOV (mod3lo, acc) | |
30 | ||
31 | AND (acc, 0x3) // acc = (mod3lo & 0x3) | |
32 | SR (mod3lo) | |
33 | SR (mod3lo) // (mod3lo >> 2) | |
34 | ADD (acc, mod3lo) | |
35 | MOV (mod3lo, acc) | |
36 | ||
37 | AND (acc, 0x3) // acc = (mod3lo & 0x3) | |
38 | SR (mod3lo) | |
39 | SR (mod3lo) // (mod3lo >> 2) | |
40 | ADD (acc, mod3lo) | |
41 | ||
42 | SUB (acc,3) | |
43 | if (flag_c){ // T0SN FLAG.C (0x00.1) -- skip if carry clear | |
44 | ADD (acc,3) | |
45 | } | |
46 | } | |
47 | ||
48 | void g(void){ | |
49 | u8 notes_ix = acc & 0x7; | |
50 | if(3&i2) | |
51 | notes_ix += 8; | |
52 | u8 result = ((i1<<8|i0)*notes[notes_ix])>>8; // keep hi byte | |
53 | acc = result; | |
54 | } | |
55 | void main(void){ | |
56 | CLEAR (i0) | |
57 | CLEAR (i1) | |
58 | CLEAR (i2) | |
59 | ||
60 | //rom is not mmapped; must load into ram first | |
61 | MOV (acc, 0x84) | |
62 | MOV (notes[0x0], acc) | |
63 | MOV (notes[0x5], acc) | |
64 | MOV (acc, 0x9d) | |
65 | MOV (notes[0x1], acc) | |
66 | MOV (notes[0x4], acc) | |
67 | MOV (acc, 0xb0) | |
68 | MOV (notes[0x2], acc) | |
69 | MOV (notes[0xA], acc) | |
70 | MOV (acc, 0x69) | |
71 | MOV (notes[0x3], acc) | |
72 | MOV (notes[0x6], acc) | |
73 | MOV (notes[0xB], acc) | |
74 | MOV (notes[0xE], acc) | |
75 | MOV (acc, 0x58) | |
76 | MOV (notes[0x7], acc) | |
77 | MOV (notes[0xF], acc) | |
78 | MOV (acc, 0x75) | |
79 | MOV (notes[0x8], acc) | |
80 | MOV (notes[0xD], acc) | |
81 | MOV (acc, 0x8c) | |
82 | MOV (notes[0x9], acc) | |
83 | MOV (notes[0xC], acc) | |
84 | ||
85 | for(;;) { | |
86 | MOV (acc, i2)// "mov mem,mem" | |
87 | MOV (n, acc)// does not exist | |
88 | SL (n) | |
89 | SL (n) | |
90 | MOV (acc, i1) | |
91 | SWAP (acc) | |
92 | AND (acc, 0xf) | |
93 | SR (acc) | |
94 | SR (acc) | |
95 | OR (n, acc) | |
96 | ||
97 | MOV (acc, n) | |
98 | CALL (g) | |
99 | SWAP (acc) | |
100 | AND (acc, 0x1) | |
101 | MOV (sample, acc) | |
102 | ||
103 | MOV (acc, i2) | |
104 | SL (acc) | |
105 | SL (acc) | |
106 | SL (acc) | |
107 | MOV (tmp_1, acc) // fresh tmp_1: | |
108 | MOV (acc, i1) | |
109 | SWAP (acc) | |
110 | AND (acc, 0xf) | |
111 | SR (acc) | |
112 | OR (acc, tmp_1) // tmp_1 done. | |
113 | XOR (acc, n) | |
114 | CALL (g) | |
115 | SR (acc) | |
116 | AND (acc, i2) | |
117 | SR (acc) | |
118 | AND (acc, 3) | |
119 | ADD (sample, acc) | |
120 | ||
121 | MOV (acc, i2) | |
122 | MOV (mod3hi, acc) | |
123 | SR (mod3hi) | |
124 | SR (mod3hi) | |
125 | SR (mod3hi) | |
126 | SWAP (acc) | |
127 | AND (acc, 0xf0) | |
128 | SL (acc) | |
129 | MOV (mod3lo, acc) | |
130 | MOV (acc, i1) | |
131 | SR (acc) | |
132 | SR (acc) | |
133 | SR (acc) | |
134 | OR (mod3lo, acc) | |
135 | CALL (mod3) | |
136 | ADD (acc, n) | |
137 | CALL (g) | |
138 | SR (acc) | |
139 | SR (acc) | |
140 | MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc | |
141 | MOV (acc, i2) | |
142 | // shift-divide by six | |
143 | // note: i2 is max 0x78; so acc will <= 20. (breaks vor values >=128) | |
144 | SR (acc) | |
145 | ADD (acc, i2) | |
146 | SR (acc) | |
147 | SR (acc) | |
148 | ADD (acc, i2) | |
149 | SR (acc) | |
150 | SR (acc) | |
151 | ADD (acc, i2) | |
152 | SR (acc) | |
153 | SR (acc) | |
154 | SR (acc) | |
155 | // end divide by six | |
156 | AND (acc, tmp_1) // acc restored from tmp_1 | |
157 | AND (acc, 3) | |
158 | ADD (sample, acc) | |
159 | ||
160 | MOV (acc, i2) | |
161 | MOV (mod3hi, acc) | |
162 | SR (mod3hi) | |
163 | SR (mod3hi) | |
164 | SWAP (acc) | |
165 | AND (acc, 0xf0) | |
166 | SL (acc) | |
167 | SL (acc) | |
168 | MOV (mod3lo, acc) | |
169 | MOV (acc, i1) | |
170 | SR (acc) | |
171 | SR (acc) | |
172 | OR (mod3lo, acc) | |
173 | CALL (mod3) | |
174 | SUB (acc, n) | |
175 | SUB (acc, 8) | |
176 | NEG (acc) | |
177 | CALL (g) | |
178 | SR (acc) | |
179 | MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc | |
180 | MOV (acc, i2) | |
181 | // shift-divide by ten | |
182 | // note: i2 is max 0x78; so acc will <= 12. | |
183 | INC (i2) | |
184 | SR (acc) | |
185 | ADD (acc, i2) | |
186 | SR (acc) | |
187 | SR (acc) | |
188 | SR (acc) | |
189 | ADD (acc, i2) | |
190 | SR (acc) | |
191 | ADD (acc, i2) | |
192 | SWAP (acc) | |
193 | DEC (i2) | |
194 | // end divide by ten | |
195 | AND (acc, tmp_1) // acc restored from tmp_1 | |
196 | AND (acc, 3) | |
197 | ADD (sample, acc) | |
198 | ||
199 | MOV (acc, sample) | |
200 | SWAP (acc) | |
201 | putchar(acc); | |
202 | ||
203 | INC (i0) | |
204 | i1 += !i0; // ADDC i1 | |
205 | i2 += !i1 && !i0; // ADDC i2 | |
206 | ||
207 | if(i2 == 0x78) break; | |
208 | } | |
209 | } |