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