X-Git-Url: https://git.gir.st/Chiptunes.git/blobdiff_plain/4283632d5467b364421cb91a4a7dd7d779ca17d2..362b33c918938aadd44c6516c15661c30952a584:/foo.c diff --git a/foo.c b/foo.c index 4f8d74c..fcb07cd 100644 --- a/foo.c +++ b/foo.c @@ -49,7 +49,8 @@ void mod3(void) { #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) @@ -66,9 +67,6 @@ 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 //TODO: CALL/RET is expensive; store PC in register and RJMP, then JRMP back }; @@ -100,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) @@ -122,26 +121,12 @@ 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 (x, s) - INC (x) - #define tmp o - MOV (tmp, x) - LSR (tmp) - LSR (tmp) - ADD (tmp, x) - ROR (tmp) - LSR (tmp) - ADD (tmp, x) - ROR (tmp) - LSR (tmp) - ADD (tmp, x) - ROR (tmp) - LSR (tmp) - MOV (x, tmp) - #undef tmp MOV (Ml, i2) SWAP (Ml) ANDI (Ml, 0xf0) @@ -168,26 +153,29 @@ int main(void) { ADD (t, n) LDI (o, 2) RCALL g(); - ADD (acc, t) - - //voice 4: + t >>= o; //NOTE: o == {1, 2, 4} + ANDI (t, 3) MOV (x, s) INC (x) #define tmp o - MOV (tmp, x) - LSR (tmp) - ADD (tmp, x) - ROR (tmp) + MOV (tmp, x) LSR (tmp) LSR (tmp) - ADD (tmp, x) + ADD (tmp, x) ROR (tmp) - ADD (tmp, x) + LSR (tmp) + ADD (tmp, x) ROR (tmp) LSR (tmp) + ADD (tmp, x) + ROR (tmp) LSR (tmp) MOV (x, tmp) #undef tmp + AND (t, x) + ADD (acc, t) + + //voice 4: MOV (Ml, i2) SWAP (Ml) ANDI (Ml, 0xf0) @@ -216,6 +204,26 @@ int main(void) { 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 + MOV (tmp, x) + LSR (tmp) + ADD (tmp, x) + ROR (tmp) + LSR (tmp) + LSR (tmp) + ADD (tmp, x) + ROR (tmp) + ADD (tmp, x) + ROR (tmp) + LSR (tmp) + LSR (tmp) + MOV (x, tmp) + #undef tmp + AND (t, x) ADD (acc, t) putchar(acc<<4); //TODO