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