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