From c3639d5b8a3f9e357d35eb9b720e7dfc83c6f6f2 Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 17:51:54 +0100 Subject: [PATCH 01/16] new version --- fakeasm.h | 3 +++ foo.c | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/fakeasm.h b/fakeasm.h index cfb4598..cffa6d8 100644 --- a/fakeasm.h +++ b/fakeasm.h @@ -29,3 +29,6 @@ int asmtmp = 0; #define ROL(x) asmtmp = x>>7; x <<= 1; x |= carry; carry = asmtmp; #define ROR(x) asmtmp = x&0x1; x >>= 1; x |= carry<<7; carry = asmtmp; #define NEG(x) x *= -1; +int sr_neg = 0; +#define CPI(x,n) sr_neg = (x-n < 0); //WARN: not a complete CPI mockup +#define BRPL(l) if (sr_neg) goto l; diff --git a/foo.c b/foo.c index f227598..1265e77 100644 --- a/foo.c +++ b/foo.c @@ -41,7 +41,10 @@ void mod3(void) { LSR (tmp) ANDI (Ml, 0x03) ADD (Ml, tmp) - if (Ml > 2) Ml = Ml - 3; //TODO + CPI (Ml, 3) + BRPL (skip) + Ml = Ml - 3; //TODO + skip:; #undef tmp } void g(void) { -- 2.39.3 From 197a54187cbb749e40f746c65082b556a341f40b Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 18:16:17 +0100 Subject: [PATCH 02/16] new version --- foo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/foo.c b/foo.c index 1265e77..b123d05 100644 --- a/foo.c +++ b/foo.c @@ -43,7 +43,7 @@ void mod3(void) { ADD (Ml, tmp) CPI (Ml, 3) BRPL (skip) - Ml = Ml - 3; //TODO + SUBI (Ml, 3) skip:; #undef tmp } -- 2.39.3 From 500692e4d62ecaf69850b0e54ed8390f8ab6cbbe Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 18:38:27 +0100 Subject: [PATCH 03/16] new version --- foo.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/foo.c b/foo.c index b123d05..8aac4a8 100644 --- a/foo.c +++ b/foo.c @@ -141,7 +141,17 @@ int main(void) { LSR (tmp) MOV (x, tmp) #undef tmp - Ml = i2<<5 | i1>>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 Mh = i3<<5 | i2>>3; RCALL mod3(); ADD (t, n) -- 2.39.3 From 649bb224b69d87452d2dd9021988bc3499cbbeb1 Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 18:45:42 +0100 Subject: [PATCH 04/16] new version --- foo.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/foo.c b/foo.c index 8aac4a8..11e8da1 100644 --- a/foo.c +++ b/foo.c @@ -177,7 +177,17 @@ int main(void) { LSR (tmp) MOV (x, tmp) #undef tmp - Ml = i2<<6 | i1>>2; + 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 Mh = i3<<6 | i2>>2; RCALL mod3(); SUB (t, n) -- 2.39.3 From d39a46f5707cd1773ca6c4cc3301c66349a795d5 Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 18:47:54 +0100 Subject: [PATCH 05/16] new version --- foo.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/foo.c b/foo.c index 11e8da1..fbe306c 100644 --- a/foo.c +++ b/foo.c @@ -152,7 +152,17 @@ int main(void) { LSR (tmp) OR (Ml, tmp) #undef tmp - Mh = i3<<5 | i2>>3; + 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) -- 2.39.3 From 18426c43cff5307e2d474d03e11e1d329d51a235 Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 18:50:14 +0100 Subject: [PATCH 06/16] new version --- foo.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/foo.c b/foo.c index fbe306c..a9b356b 100644 --- a/foo.c +++ b/foo.c @@ -198,7 +198,17 @@ int main(void) { LSR (tmp) OR (Ml, tmp) #undef tmp - Mh = i3<<6 | i2>>2; + 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) -- 2.39.3 From 4283632d5467b364421cb91a4a7dd7d779ca17d2 Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 18:54:46 +0100 Subject: [PATCH 07/16] new version --- foo.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/foo.c b/foo.c index a9b356b..4f8d74c 100644 --- a/foo.c +++ b/foo.c @@ -45,6 +45,7 @@ void mod3(void) { BRPL (skip) SUBI (Ml, 3) skip:; + RET #undef tmp } void g(void) { @@ -68,7 +69,7 @@ void g(void) { 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) { -- 2.39.3 From 5d9a2389fcf604fb8689b90b654af4d5fc7ff9df Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 19:07:54 +0100 Subject: [PATCH 08/16] new version move `x` out of g(), so we can use it as tempvar in g() --- foo.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/foo.c b/foo.c index 4f8d74c..8d512b4 100644 --- a/foo.c +++ b/foo.c @@ -67,7 +67,6 @@ void g(void) { 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 }; @@ -104,6 +103,7 @@ int main(void) { MOV (t, n) LDI (o, 4) RCALL g(); + AND (t, x) MOV (acc, t) //voice 2: @@ -122,6 +122,7 @@ int main(void) { EOR (t, n) LDI (o, 2) RCALL g(); + AND (t, x) ADD (acc, t) //voice 3: @@ -168,6 +169,7 @@ int main(void) { ADD (t, n) LDI (o, 2) RCALL g(); + AND (t, x) ADD (acc, t) //voice 4: @@ -216,6 +218,7 @@ int main(void) { SUBI (t, -8) LDI (o, 1) RCALL g(); + AND (t, x) ADD (acc, t) putchar(acc<<4); //TODO -- 2.39.3 From f28def6a6947c3921c91561e5ac5f8aae0993845 Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 19:09:22 +0100 Subject: [PATCH 09/16] new version --- foo.c | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/foo.c b/foo.c index 8d512b4..fd649da 100644 --- a/foo.c +++ b/foo.c @@ -99,15 +99,13 @@ int main(void) { #undef tmp //voice 1: - LDI (x, 1) MOV (t, n) LDI (o, 4) RCALL g(); - AND (t, x) + ANDI (t, 1) MOV (acc, t) //voice 2: - MOV (x, s) #define tmp o MOV (tmp, i2) LSL (tmp) @@ -122,27 +120,10 @@ int main(void) { EOR (t, n) LDI (o, 2) RCALL g(); - AND (t, x) + 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) @@ -169,6 +150,23 @@ int main(void) { ADD (t, n) LDI (o, 2) RCALL g(); + 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 AND (t, x) ADD (acc, t) -- 2.39.3 From d8af0686b71700b06eabbe106cb6b17f1da4af4b Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 19:10:14 +0100 Subject: [PATCH 10/16] new version --- foo.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/foo.c b/foo.c index fd649da..0ae3ed1 100644 --- a/foo.c +++ b/foo.c @@ -171,23 +171,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 +199,23 @@ int main(void) { SUBI (t, -8) LDI (o, 1) RCALL g(); + 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) -- 2.39.3 From eafeaf932ed8ae4c7970758b11ca87a00eee0b16 Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 19:10:39 +0100 Subject: [PATCH 11/16] new version --- foo.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/foo.c b/foo.c index 0ae3ed1..21b19fb 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, o) -> t + // tempvars: `x` and `_` #define tmp _ ANDI (t, 0x07) MOV (tmp, i2) -- 2.39.3 From 362b33c918938aadd44c6516c15661c30952a584 Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 19:14:59 +0100 Subject: [PATCH 12/16] new version move `o` out of g() to get rid of variable shift --- foo.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/foo.c b/foo.c index 21b19fb..fcb07cd 100644 --- a/foo.c +++ b/foo.c @@ -49,7 +49,7 @@ void mod3(void) { #undef tmp } void g(void) { - // g(i, t, o) -> t + // g(i, t) -> t // tempvars: `x` and `_` #define tmp _ ANDI (t, 0x07) @@ -67,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 }; @@ -103,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) @@ -121,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) @@ -151,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 @@ -200,6 +204,8 @@ 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 -- 2.39.3 From c09a6ed8e5f8c4e69d72e004f6c029525ffbdada Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 19:16:31 +0100 Subject: [PATCH 13/16] new version --- foo.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/foo.c b/foo.c index fcb07cd..473484a 100644 --- a/foo.c +++ b/foo.c @@ -99,10 +99,10 @@ int main(void) { //voice 1: MOV (t, n) - LDI (o, 4) RCALL g(); - t >>= o; //NOTE: o == {1, 2, 4} - ANDI (t, 3) + LDI (o, 4) + SWAP (t) + ANDI (t, 0x0f) ANDI (t, 1) MOV (acc, t) -- 2.39.3 From 7716b4275b01a407ee7d510456415e55f636ae71 Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 19:17:47 +0100 Subject: [PATCH 14/16] new version --- foo.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/foo.c b/foo.c index 473484a..822917f 100644 --- a/foo.c +++ b/foo.c @@ -100,7 +100,6 @@ int main(void) { //voice 1: MOV (t, n) RCALL g(); - LDI (o, 4) SWAP (t) ANDI (t, 0x0f) ANDI (t, 1) @@ -119,10 +118,10 @@ int main(void) { OR (t, tmp) #undef tmp EOR (t, n) - LDI (o, 2) RCALL g(); - t >>= o; //NOTE: o == {1, 2, 4} - ANDI (t, 3) + LSR (t) + LSR (t) + ANDI (t, 3) AND (t, s) ADD (acc, t) -- 2.39.3 From c6c6cbe5d7db6cfb8b3a1681ab93c880b0da76a0 Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 19:18:33 +0100 Subject: [PATCH 15/16] new version --- foo.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/foo.c b/foo.c index 822917f..7161542 100644 --- a/foo.c +++ b/foo.c @@ -150,10 +150,10 @@ int main(void) { #undef tmp RCALL mod3(); ADD (t, n) - LDI (o, 2) RCALL g(); - t >>= o; //NOTE: o == {1, 2, 4} - ANDI (t, 3) + LSR (t) + LSR (t) + ANDI (t, 3) MOV (x, s) INC (x) #define tmp o @@ -201,10 +201,9 @@ int main(void) { SUB (t, n) NEG (t) SUBI (t, -8) - LDI (o, 1) RCALL g(); - t >>= o; //NOTE: o == {1, 2, 4} - ANDI (t, 3) + LSR (t) + ANDI (t, 3) MOV (x, s) INC (x) #define tmp o -- 2.39.3 From 37bf20ea4e87d5bece6445fee9211090feca1b56 Mon Sep 17 00:00:00 2001 From: Tobias Girstmair Date: Tue, 13 Nov 2018 19:20:11 +0100 Subject: [PATCH 16/16] new version --- foo.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/foo.c b/foo.c index 7161542..be8d765 100644 --- a/foo.c +++ b/foo.c @@ -15,7 +15,7 @@ u8 x; u8 t; u8 o; u8 _; -#define Mh o //mod3 vars +#define Mh x //mod3 vars #define Ml t // -"- //http://homepage.divms.uiowa.edu/~jones/bcd/mod.shtml void mod3(void) { @@ -106,7 +106,7 @@ int main(void) { MOV (acc, t) //voice 2: - #define tmp o + #define tmp _ MOV (tmp, i2) LSL (tmp) LSL (tmp) @@ -156,7 +156,7 @@ int main(void) { ANDI (t, 3) MOV (x, s) INC (x) - #define tmp o + #define tmp _ MOV (tmp, x) LSR (tmp) LSR (tmp) @@ -206,7 +206,7 @@ int main(void) { ANDI (t, 3) MOV (x, s) INC (x) - #define tmp o + #define tmp _ MOV (tmp, x) LSR (tmp) ADD (tmp, x) -- 2.39.3