]>
git.gir.st - Chiptunes-pms150c.git/blob - bsv.c
3 typedef unsigned char u8
;
12 u8 mod3hi
, mod3lo
; //MEM
13 //todo: can mod3hi be aliased to tmp_1?
16 ADD (mod3lo
,acc
) // mod3lo = hi+lo
18 ADDC0 (acc
) // mod3hi, 1bit
24 AND (acc
, 0xf) // (mod3lo>>4)
25 XCH (mod3lo
) // acc=mod3lo, mod3lo=mod3lo>>4
26 AND (acc
, 0xF) // acc=mod3lo&0xf, mod3lo=mod3lo>>4
27 ADD (acc
, mod3lo
) // (mod3lo & 0xF)
31 AND (acc
, 0x3) // acc = (mod3lo & 0x3)
33 SR (mod3lo
) // (mod3lo >> 2)
37 AND (acc
, 0x3) // acc = (mod3lo & 0x3)
39 SR (mod3lo
) // (mod3lo >> 2)
43 /*T0SN FLAG.C (0x00.1)*/ if (flag_c
){ // skip if carry clear
48 // notes_ix_hi = always 0
55 /*T0SN FLAG.Z (0x00.0)*/ if(3&i2
) {// skip if !(3&i0)
56 SET1 (notes_ix
, 3) } // ix += 8 <=> ix |= 8
57 IDXM (acc
, notes
+notes_ix
)
58 u8 result
= ((i1
<<8|i0
)*acc
)>>8; // keep hi byte
59 //^TODO! https://git.gir.st/Chiptunes.git/blob/d397f89:/foo.c#l83
60 //final: https://git.gir.st/Chiptunes.git/blob/f8e0502:/foo.S#l113
61 u8 a2
= 0; // can probably be overloaded onto mul3lo/hi
63 u8 t
= acc
; // note input (as returned by idxm)
64 for (u8 loop
= 0; loop
< 8; loop
++) {
66 /*(2) ADDC a2, i1*/ a2
+= i1
+ ((a1
+i0
)>>8);
67 /*(1) ADD a1, i0*/ a1
+= i0
;
69 /*(3) LSR t*/ t
>>= 1;
70 /*(2) ROR a1*/ a1
>>= 1;a1
|= a2
<<7;
71 /*(1) LSR a2*/ a2
>>= 1;
80 //rom is not mmapped; must load into ram first
100 MOV (notes
[0xD], acc
)
102 MOV (notes
[0x9], acc
)
103 MOV (notes
[0xC], acc
)
106 MOV (acc
, i2
)// "mov mem,mem"
107 MOV (n
, acc
)// does not exist
127 MOV (tmp_1
, acc
) // fresh tmp_1:
132 OR (acc
, tmp_1
) // tmp_1 done.
160 MOV (tmp_1
, acc
) // acc saved in tmp_1; fresh acc
162 // shift-divide by six
163 // note: i2 is max 0x78; so acc will <= 20. (breaks vor values >=128)
176 AND (acc
, tmp_1
) // acc restored from tmp_1
199 MOV (tmp_1
, acc
) // acc saved in tmp_1; fresh acc
201 // shift-divide by ten
202 // note: i2 is max 0x78; so acc will <= 12.
215 AND (acc
, tmp_1
) // acc restored from tmp_1
224 /*ADDC i1*/ i1
+= !i0
;
225 /*ADDC i2*/ i2
+= !i1
&& !i0
;
227 if(i2
== 0x78) break;