]> git.gir.st - Chiptunes-pms150c.git/blob - bsv.c
21a9414427158418fcbe48bd4f6b2e3a33353fc1
[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 if (acc > 2) { // TODO: acc in [0,1,2,3,4]
47 SUB (acc,3)
48 }
49 }
50
51 void g(void){
52 u8 notes_ix = acc & 0x7;
53 if(3&i2)
54 notes_ix += 8;
55 u8 result = ((i1<<8|i0)*notes[notes_ix])>>8; // keep hi byte
56 acc = result;
57 }
58 void main(void){
59 CLEAR (i0)
60 CLEAR (i1)
61 CLEAR (i2)
62 for(;;) {
63 MOV (acc, i2)// "mov mem,mem"
64 MOV (n, acc)// does not exist
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)
73
74 MOV (acc, n)
75 CALL (g)
76 SWAP (acc)
77 AND (acc, 0x1)
78 MOV (sample, acc)
79
80 MOV (acc, i2)
81 SL (acc)
82 SL (acc)
83 SL (acc)
84 MOV (tmp_1, acc) // fresh tmp_1:
85 MOV (acc, i1)
86 SWAP (acc)
87 AND (acc, 0xf)
88 SR (acc)
89 OR (acc, tmp_1) // tmp_1 done.
90 XOR (acc, n)
91 CALL (g)
92 SR (acc)
93 AND (acc, i2)
94 SR (acc)
95 AND (acc, 3)
96 ADD (sample, acc)
97
98 mod3hi = i2>>3;
99 mod3lo = i2<<5|i1>>3;
100 CALL (mod3)
101 ADD (acc, n)
102 CALL (g)
103 SR (acc)
104 SR (acc)
105 MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc
106 MOV (acc, i2)
107 // shift-divide by six
108 // note: i2 is max 0x78; so acc will <= 20. (breaks vor values >=128)
109 SR (acc)
110 ADD (acc, i2)
111 SR (acc)
112 SR (acc)
113 ADD (acc, i2)
114 SR (acc)
115 SR (acc)
116 ADD (acc, i2)
117 SR (acc)
118 SR (acc)
119 SR (acc)
120 // end divide by six
121 AND (acc, tmp_1) // acc restored from tmp_1
122 AND (acc, 3)
123 ADD (sample, acc)
124
125 mod3hi = i2>>2;
126 mod3lo = i2<<6|i1>>2;
127 CALL (mod3)
128 SUB (acc, n)
129 SUB (acc, 8)
130 NEG (acc)
131 CALL (g)
132 SR (acc)
133 MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc
134 MOV (acc, i2)
135 // shift-divide by ten
136 // note: i2 is max 0x78; so acc will <= 12.
137 INC (i2)
138 SR (acc)
139 ADD (acc, i2)
140 SR (acc)
141 SR (acc)
142 SR (acc)
143 ADD (acc, i2)
144 SR (acc)
145 ADD (acc, i2)
146 SWAP (acc)
147 DEC (i2)
148 // end divide by ten
149 AND (acc, tmp_1) // acc restored from tmp_1
150 AND (acc, 3)
151 ADD (sample, acc)
152
153 MOV (acc, sample)
154 SWAP (acc)
155 putchar(acc);
156
157 INC (i0)
158 i1 += !i0; // ADDC i1
159 i2 += !i1 && !i0; // ADDC i2
160
161 if(i2 == 0x78) break;
162 }
163 }
Imprint / Impressum