]> git.gir.st - Chiptunes-pms150c.git/blob - bsv.c
6a472f0763e4bdaa39e1987dd42cebb5e38f3972
[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 void g(void){
17 u8 notes_ix = acc & 0x7;
18 if(3&i2)
19 notes_ix += 8;
20 u8 result = ((i1<<8|i0)*notes[notes_ix])>>8; // keep hi byte
21 acc = result;
22 }
23 void main(void){
24 CLEAR (i0)
25 CLEAR (i1)
26 CLEAR (i2)
27 for(;;) {
28 /*n = i2<<2 | i1>>6;*/
29 MOV (n, i2)
30 SL (n)
31 SL (n)
32 MOV (acc, i1)
33 SWAP (acc)
34 AND (acc, 0xf)
35 SR (acc)
36 SR (acc)
37 OR (n, acc)
38
39 MOV (acc, n)
40 CALL (g)
41 SWAP (acc)
42 AND (acc, 0x1)
43 MOV (sample, acc)
44
45 MOV (acc, i2)
46 SL (acc)
47 SL (acc)
48 SL (acc)
49 MOV (tmp_1, acc) // fresh tmp_1:
50 MOV (acc, i1)
51 SWAP (acc)
52 AND (acc, 0xf)
53 SR (acc)
54 OR (acc, tmp_1) // tmp_1 done.
55 XOR (acc, n)
56 CALL (g)
57 SR (acc)
58 AND (acc, i2)
59 SR (acc)
60 AND (acc, 3)
61 ADD (sample, acc)
62
63 { u8 tmp2 = (i2<<5|i1>>3)%3;//TODO
64 MOV (acc, tmp2)
65 ADD (acc, n)
66 CALL (g)
67 } //tmp2
68 SR (acc)
69 SR (acc)
70 { u8 tmp1 = i2/6;
71 AND (acc, tmp1)
72 } //tmp1
73 AND (acc, 3)
74 ADD (sample, acc)
75
76 MOV (acc, n)
77 { u8 tmp3 = (i2<<6|i1>>2)%3;
78 SUB (acc, tmp3)
79 } // tmp3
80 ADD (acc, 8)
81 CALL (g)
82 SR (acc)
83 { u8 tmp1 = i2/10;
84 AND (acc, tmp1)
85 } //tmp1
86 AND (acc, 3)
87 ADD (sample, acc)
88
89 MOV (acc, sample)
90 SWAP (acc)
91 putchar(acc);
92
93 INC (i0)
94 i1 += !i0; // ADDC i1
95 i2 += !i1 && !i0; // ADDC i2
96 }
97 }
Imprint / Impressum