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