]> 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 void mod3(void) {
18 MOV(acc,mod3hi)
19 ADD(mod3lo,acc) // mod3lo = hi+lo
20 CLEAR(acc)
21 ADDC0(acc) // mod3hi, 1bit
22 SWAP(acc)
23 MOV(mod3hi, acc)
24
25 MOV(acc, mod3lo)
26 SWAP(acc)
27 AND(acc, 0xf) // (mod3lo>>4)
28 XCH(mod3lo) // acc=mod3lo, mod3lo=mod3lo>>4
29 AND(acc, 0xF) // acc=mod3lo&0xf, mod3lo=mod3lo>>4
30 ADD(acc, mod3lo) // (mod3lo & 0xF)
31 ADD(acc, mod3hi)
32 MOV(mod3lo, acc)
33
34 AND(acc, 0x3) // acc = (mod3lo & 0x3)
35 SR(mod3lo)
36 SR(mod3lo) // (mod3lo >> 2)
37 ADD(acc, mod3lo)
38 MOV(mod3lo, acc)
39
40 AND(acc, 0x3) // acc = (mod3lo & 0x3)
41 SR(mod3lo)
42 SR(mod3lo) // (mod3lo >> 2)
43 ADD(acc, mod3lo)
44
45 if (acc > 2) acc = acc - 3;
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 for(;;) {
60 MOV (acc, i2)// "mov mem,mem"
61 MOV (n, acc)// does not exist
62 SL (n)
63 SL (n)
64 MOV (acc, i1)
65 SWAP (acc)
66 AND (acc, 0xf)
67 SR (acc)
68 SR (acc)
69 OR (n, acc)
70
71 MOV (acc, n)
72 CALL (g)
73 SWAP (acc)
74 AND (acc, 0x1)
75 MOV (sample, acc)
76
77 MOV (acc, i2)
78 SL (acc)
79 SL (acc)
80 SL (acc)
81 MOV (tmp_1, acc) // fresh tmp_1:
82 MOV (acc, i1)
83 SWAP (acc)
84 AND (acc, 0xf)
85 SR (acc)
86 OR (acc, tmp_1) // tmp_1 done.
87 XOR (acc, n)
88 CALL (g)
89 SR (acc)
90 AND (acc, i2)
91 SR (acc)
92 AND (acc, 3)
93 ADD (sample, acc)
94
95 mod3hi = i2>>3;
96 mod3lo = i2<<5|i1>>3;
97 CALL (mod3)
98 ADD (acc, n)
99 CALL (g)
100 SR (acc)
101 SR (acc)
102 MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc
103 MOV (acc, i2)
104 // shift-divide by six
105 // note: i2 is max 0x78; so acc will <= 20. (breaks vor values >=128)
106 SR (acc)
107 ADD (acc, i2)
108 SR (acc)
109 SR (acc)
110 ADD (acc, i2)
111 SR (acc)
112 SR (acc)
113 ADD (acc, i2)
114 SR (acc)
115 SR (acc)
116 SR (acc)
117 // end divide by six
118 AND (acc, tmp_1) // acc restored from tmp_1
119 AND (acc, 3)
120 ADD (sample, acc)
121
122 mod3hi = i2>>2;
123 mod3lo = i2<<6|i1>>2;
124 CALL (mod3)
125 SUB (acc, n)
126 SUB (acc, 8)
127 NEG (acc)
128 CALL (g)
129 SR (acc)
130 MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc
131 MOV (acc, i2)
132 // shift-divide by ten
133 // note: i2 is max 0x78; so acc will <= 12.
134 INC (i2)
135 SR (acc)
136 ADD (acc, i2)
137 SR (acc)
138 SR (acc)
139 SR (acc)
140 ADD (acc, i2)
141 SR (acc)
142 ADD (acc, i2)
143 SWAP (acc)
144 DEC (i2)
145 // end divide by ten
146 AND (acc, tmp_1) // acc restored from tmp_1
147 AND (acc, 3)
148 ADD (sample, acc)
149
150 MOV (acc, sample)
151 SWAP (acc)
152 putchar(acc);
153
154 INC (i0)
155 i1 += !i0; // ADDC i1
156 i2 += !i1 && !i0; // ADDC i2
157 }
158 }
Imprint / Impressum