new version
[Chiptunes-pms150c.git] / bsv.c
CommitLineData
5ebb16dc
TG
1#include <stdio.h>
2#include "fakeasm.h"
b3a565e1
TG
3typedef unsigned char u8;
4
268e276e 5u8 i0, i1, i2; //MEM
7e02078f 6u8 n; //MEM
5ebb16dc 7u8 sample; //MEM
d17a26fd 8u8 tmp_1; //MEM
268e276e 9u8 acc; //ACC
f3768c26 10
c1873bed
TG
11u8 notes[] = {
12 0x84, 0x9d, 0xb0, 0x69, 0x9d, 0x84, 0x69, 0x58,
13 0x75, 0x8c, 0xb0, 0x69, 0x8c, 0x75, 0x69, 0x58
14};
c320426f 15
88d59159 16u8 mod3hi, mod3lo; //MEM
6494a942 17//todo: can mod3hi be aliased to tmp_1?
837c7d6c 18void mod3(void) {
6494a942
TG
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)
837c7d6c 25
6494a942
TG
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)
bf20ae1c 34
6494a942
TG
35 AND (acc, 0x3) // acc = (mod3lo & 0x3)
36 SR (mod3lo)
37 SR (mod3lo) // (mod3lo >> 2)
38 ADD (acc, mod3lo)
39 MOV (mod3lo, acc)
5f0928cc 40
6494a942
TG
41 AND (acc, 0x3) // acc = (mod3lo & 0x3)
42 SR (mod3lo)
43 SR (mod3lo) // (mod3lo >> 2)
44 ADD (acc, mod3lo)
5f0928cc 45
e465ced0 46 if (acc > 2) { // TODO: acc in [0,1,2,3,4]
6494a942
TG
47 SUB (acc,3)
48 }
88d59159
TG
49}
50
b2ed0598
TG
51void g(void){
52 u8 notes_ix = acc & 0x7;
ac66812d
TG
53 if(3&i2)
54 notes_ix += 8;
fb819dd9 55 u8 result = ((i1<<8|i0)*notes[notes_ix])>>8; // keep hi byte
268e276e 56 acc = result;
c395d5c8 57}
f3768c26 58void main(void){
5ebb16dc
TG
59 CLEAR (i0)
60 CLEAR (i1)
61 CLEAR (i2)
f3768c26 62 for(;;) {
fc496164
TG
63 MOV (acc, i2)// "mov mem,mem"
64 MOV (n, acc)// does not exist
5ebb16dc
TG
65 SL (n)
66 SL (n)
67 MOV (acc, i1)
68 SWAP (acc)
69 AND (acc, 0xf)
70 SR (acc)
71 SR (acc)
72 OR (n, acc)
bd4f3b3e 73
b2ed0598
TG
74 MOV (acc, n)
75 CALL (g)
5ebb16dc
TG
76 SWAP (acc)
77 AND (acc, 0x1)
78 MOV (sample, acc)
bd4f3b3e 79
d17a26fd
TG
80 MOV (acc, i2)
81 SL (acc)
82 SL (acc)
83 SL (acc)
f5823e3f 84 MOV (tmp_1, acc) // fresh tmp_1:
d17a26fd
TG
85 MOV (acc, i1)
86 SWAP (acc)
87 AND (acc, 0xf)
88 SR (acc)
89 OR (acc, tmp_1) // tmp_1 done.
b2ed0598
TG
90 XOR (acc, n)
91 CALL (g)
5ebb16dc
TG
92 SR (acc)
93 AND (acc, i2)
94 SR (acc)
95 AND (acc, 3)
96 ADD (sample, acc)
bd4f3b3e 97
774dc938
TG
98 MOV (acc, i2)
99 MOV (mod3hi, acc)
100 SR (mod3hi)
101 SR (mod3hi)
102 SR (mod3hi)
103 SWAP (acc)
104 AND (acc, 0xf0)
105 SL (acc)
106 MOV (mod3lo, acc)
107 MOV (acc, i1)
108 SR (acc)
109 SR (acc)
110 SR (acc)
111 OR (mod3lo, acc)
abd85947 112 CALL (mod3)
b2ed0598
TG
113 ADD (acc, n)
114 CALL (g)
5ebb16dc
TG
115 SR (acc)
116 SR (acc)
c004ed39
TG
117 MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc
118 MOV (acc, i2)
119 // shift-divide by six
2ae98f0b 120 // note: i2 is max 0x78; so acc will <= 20. (breaks vor values >=128)
7e0dee10
TG
121 SR (acc)
122 ADD (acc, i2)
7e0dee10 123 SR (acc)
7e0dee10
TG
124 SR (acc)
125 ADD (acc, i2)
7e0dee10 126 SR (acc)
7e0dee10
TG
127 SR (acc)
128 ADD (acc, i2)
7e0dee10 129 SR (acc)
7e0dee10 130 SR (acc)
7e0dee10 131 SR (acc)
c004ed39
TG
132 // end divide by six
133 AND (acc, tmp_1) // acc restored from tmp_1
5ebb16dc
TG
134 AND (acc, 3)
135 ADD (sample, acc)
bd4f3b3e 136
8ed39eb1 137 MOV (acc, i2)
5ef6ccab
TG
138 MOV (mod3hi, acc)
139 SR (mod3hi)
140 SR (mod3hi)
8ed39eb1
TG
141 SWAP (acc)
142 AND (acc, 0xf0)
143 SL (acc)
144 SL (acc)
145 MOV (mod3lo, acc)
146 MOV (acc, i1)
147 SR (acc)
148 SR (acc)
149 OR (mod3lo, acc)
abd85947
TG
150 CALL (mod3)
151 SUB (acc, n)
152 SUB (acc, 8)
153 NEG (acc)
b2ed0598 154 CALL (g)
5ebb16dc 155 SR (acc)
c004ed39 156 MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc
7cbbb5ba 157 MOV (acc, i2)
c004ed39 158 // shift-divide by ten
b29570af 159 // note: i2 is max 0x78; so acc will <= 12.
1d9b2eb7
TG
160 INC (i2)
161 SR (acc)
162 ADD (acc, i2)
163 SR (acc)
164 SR (acc)
165 SR (acc)
166 ADD (acc, i2)
167 SR (acc)
168 ADD (acc, i2)
28556352 169 SWAP (acc)
1d9b2eb7 170 DEC (i2)
c004ed39
TG
171 // end divide by ten
172 AND (acc, tmp_1) // acc restored from tmp_1
5ebb16dc
TG
173 AND (acc, 3)
174 ADD (sample, acc)
bd4f3b3e 175
be69f3a9
TG
176 MOV (acc, sample)
177 SWAP (acc)
178 putchar(acc);
ac66812d 179
42c6050e
TG
180 INC (i0)
181 i1 += !i0; // ADDC i1
182 i2 += !i1 && !i0; // ADDC i2
e465ced0
TG
183
184 if(i2 == 0x78) break;
fef0e35b 185 }
c395d5c8 186}
Imprint / Impressum