X-Git-Url: https://git.gir.st/Chiptunes.git/blobdiff_plain/e98ab46f85ad76db6098ef81bd7621e94d0b749c..362b33c918938aadd44c6516c15661c30952a584:/foo.c diff --git a/foo.c b/foo.c index 0ecd0b0..fcb07cd 100644 --- a/foo.c +++ b/foo.c @@ -16,21 +16,41 @@ u8 t; u8 o; u8 _; #define Mh o //mod3 vars -#define Ml _ // -"- -#define Mr t // -"- -u8 mod3(u8 hi, u8 lo) { //avail: t, o _ +#define Ml t // -"- //http://homepage.divms.uiowa.edu/~jones/bcd/mod.shtml - unsigned short a = ((hi) + (lo)) &0x1ff; - hi = a>>8; //1 bit - lo = a; - lo = (hi<<4|lo>>4) + (lo & 0xF); - lo = (lo >> 2) + (lo & 0x3); - lo = (lo >> 2) + (lo & 0x3); - if (lo > 2) lo = lo - 3; - return lo; +void mod3(void) { + // mod3(Mh.Ml) -> t + #define tmp _ + ADD (Ml, Mh) + CLR (Mh) + ADC (Mh, zero, carry) //Mh only holds the carry bit + MOV (tmp, Ml) + SWAP (tmp) + ANDI (tmp, 0x0f) + SWAP (Mh) + OR (tmp, Mh) + ANDI (Ml, 0x0f) + ADD (Ml, tmp) + MOV (tmp, Ml) + LSR (tmp) + LSR (tmp) + ANDI (Ml, 0x03) + ADD (Ml, tmp) + MOV (tmp, Ml) + LSR (tmp) + LSR (tmp) + ANDI (Ml, 0x03) + ADD (Ml, tmp) + CPI (Ml, 3) + BRPL (skip) + SUBI (Ml, 3) + skip:; + RET + #undef tmp } void g(void) { - // g(i, x, t, o) -> t + // g(i, t) -> t + // tempvars: `x` and `_` #define tmp _ ANDI (t, 0x07) MOV (tmp, i2) @@ -47,10 +67,7 @@ void g(void) { ADC X_hi, zero LD t, X */ t = (((i1&0x1f)<<8|i0)*t)>>8; //TODO - t >>= o; //NOTE: o == {1, 2, 4} - AND (t, x) - ANDI (t, 3) - RET + RET //TODO: CALL/RET is expensive; store PC in register and RJMP, then JRMP back }; int main(void) { @@ -81,14 +98,15 @@ int main(void) { #undef tmp //voice 1: - LDI (x, 1) MOV (t, n) LDI (o, 4) RCALL g(); + t >>= o; //NOTE: o == {1, 2, 4} + ANDI (t, 3) + ANDI (t, 1) MOV (acc, t) //voice 2: - MOV (x, s) #define tmp o MOV (tmp, i2) LSL (tmp) @@ -103,9 +121,40 @@ int main(void) { EOR (t, n) LDI (o, 2) RCALL g(); + t >>= o; //NOTE: o == {1, 2, 4} + ANDI (t, 3) + AND (t, s) ADD (acc, t) //voice 3: + MOV (Ml, i2) + SWAP (Ml) + ANDI (Ml, 0xf0) + LSL (Ml) + #define tmp Mh + MOV (tmp, i1) + LSR (tmp) + LSR (tmp) + LSR (tmp) + OR (Ml, tmp) + #undef tmp + MOV (Mh, i3) + SWAP (Mh) + ANDI (Mh, 0xf0) + LSL (Mh) + #define tmp _ + MOV (tmp, i2) + LSR (tmp) + LSR (tmp) + LSR (tmp) + OR (Mh, tmp) + #undef tmp + RCALL mod3(); + ADD (t, n) + LDI (o, 2) + RCALL g(); + t >>= o; //NOTE: o == {1, 2, 4} + ANDI (t, 3) MOV (x, s) INC (x) #define tmp o @@ -123,15 +172,40 @@ int main(void) { LSR (tmp) MOV (x, tmp) #undef tmp - Ml = i2<<5 | i1>>3; - Mh = i3<<5 | i2>>3; - t = mod3(Mh,Ml); //TODO - ADD (t, n) - LDI (o, 2) - RCALL g(); + AND (t, x) ADD (acc, t) //voice 4: + MOV (Ml, i2) + SWAP (Ml) + ANDI (Ml, 0xf0) + LSL (Ml) + LSL (Ml) + #define tmp Mh + MOV (tmp, i1) + LSR (tmp) + LSR (tmp) + OR (Ml, tmp) + #undef tmp + MOV (Mh, i3) + SWAP (Mh) + ANDI (Mh, 0xf0) + LSL (Mh) + LSL (Mh) + #define tmp _ + MOV (tmp, i2) + LSR (tmp) + LSR (tmp) + OR (Mh, tmp) + #undef tmp + RCALL mod3(); + SUB (t, n) + NEG (t) + SUBI (t, -8) + LDI (o, 1) + RCALL g(); + t >>= o; //NOTE: o == {1, 2, 4} + ANDI (t, 3) MOV (x, s) INC (x) #define tmp o @@ -149,14 +223,7 @@ int main(void) { LSR (tmp) MOV (x, tmp) #undef tmp - Ml = i2<<6 | i1>>2; - Mh = i3<<6 | i2>>2; - t = mod3(Mh,Ml); //TODO - SUB (t, n) - NEG (t) - SUBI (t, -8) - LDI (o, 1) - RCALL g(); + AND (t, x) ADD (acc, t) putchar(acc<<4); //TODO