new version
[Chiptunes.git] / foo.c
diff --git a/foo.c b/foo.c
index fd649da14f425c5e21256514c7bf4919686dd89e..fcb07cdaec9f6a310494b512f9880b749e08480e 100644 (file)
--- 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,8 +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}
-       ANDI    (t, 3)
        RET //TODO: CALL/RET is expensive; store PC in register and RJMP, then JRMP back
 };
 
@@ -102,6 +101,8 @@ int main(void) {
                MOV     (t, n)
                LDI     (o, 4)
                RCALL   g();
+       t >>= o; //NOTE: o == {1, 2, 4}
+       ANDI    (t, 3)
                ANDI    (t, 1)
                MOV     (acc, t)
 
@@ -120,6 +121,8 @@ 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)
 
@@ -150,6 +153,8 @@ int main(void) {
                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
@@ -171,23 +176,6 @@ int main(void) {
                ADD     (acc, t)
 
                //voice 4:
-               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
                MOV     (Ml, i2)
                SWAP    (Ml)
                ANDI    (Ml, 0xf0)
@@ -216,6 +204,25 @@ 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)
 
Imprint / Impressum