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