From 202fd67943b666be2a16072f7c44c15161c37fe0 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Sat, 26 Sep 2020 21:59:10 +0200 Subject: [PATCH] Added missing fragments and synthesis for NES kickballs.c. See https://forums.nesdev.com/viewtopic.php?f=2&t=20187&start=15 --- .../cache/fragment-cache-csg65ce02.asm | 2 +- .../cache/fragment-cache-mega45gs02.asm | 2 +- .../fragment/cache/fragment-cache-mos6502.asm | 2 +- .../cache/fragment-cache-mos6502x.asm | 119 +++++++++++++++++- .../cache/fragment-cache-wdc65c02.asm | 2 +- ..._vbuxx=pwuc1_derefidx_vbuyy_plus_vbuc2.asm | 7 ++ ..._vbuyy=pwuc1_derefidx_vbuxx_plus_vbuc2.asm | 7 ++ ..._vbuyy=pwuc1_derefidx_vbuyy_bxor_vwuc2.asm | 6 + ...refidx_vbuyy_plus_pwuc2_derefidx_vbuxx.asm | 7 ++ ...refidx_vbuyy_plus_pwuc2_derefidx_vbuyy.asm | 7 ++ .../vwum1=_deref_pwuc1_ror_8.asm | 4 + .../vwum1=pwuc1_derefidx_vbuyy_ror_8.asm | 4 + .../vwum1_ge_vbum2_then_la1.asm | 6 + .../vwum1_ge_vbuxx_then_la1.asm | 7 ++ .../vwum1_ge_vbuyy_then_la1.asm | 7 ++ .../vwum1_lt_vbum2_then_la1.asm | 6 + .../vwum1_lt_vbuxx_then_la1.asm | 7 ++ .../vwum1_lt_vbuyy_then_la1.asm | 7 ++ .../AsmFragmentTemplateSynthesisRule.java | 24 ++++ .../dk/camelot64/kickc/test/TestPrograms.java | 10 ++ 20 files changed, 238 insertions(+), 5 deletions(-) create mode 100644 src/main/fragment/mos6502-common/pwuc1_derefidx_vbuxx=pwuc1_derefidx_vbuyy_plus_vbuc2.asm create mode 100644 src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuxx_plus_vbuc2.asm create mode 100644 src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuyy_bxor_vwuc2.asm create mode 100644 src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuyy_plus_pwuc2_derefidx_vbuxx.asm create mode 100644 src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuyy_plus_pwuc2_derefidx_vbuyy.asm create mode 100644 src/main/fragment/mos6502-common/vwum1=_deref_pwuc1_ror_8.asm create mode 100644 src/main/fragment/mos6502-common/vwum1=pwuc1_derefidx_vbuyy_ror_8.asm create mode 100644 src/main/fragment/mos6502-common/vwum1_ge_vbum2_then_la1.asm create mode 100644 src/main/fragment/mos6502-common/vwum1_ge_vbuxx_then_la1.asm create mode 100644 src/main/fragment/mos6502-common/vwum1_ge_vbuyy_then_la1.asm create mode 100644 src/main/fragment/mos6502-common/vwum1_lt_vbum2_then_la1.asm create mode 100644 src/main/fragment/mos6502-common/vwum1_lt_vbuxx_then_la1.asm create mode 100644 src/main/fragment/mos6502-common/vwum1_lt_vbuyy_then_la1.asm diff --git a/src/main/fragment/cache/fragment-cache-csg65ce02.asm b/src/main/fragment/cache/fragment-cache-csg65ce02.asm index 88ab8352b..ef0288794 100644 --- a/src/main/fragment/cache/fragment-cache-csg65ce02.asm +++ b/src/main/fragment/cache/fragment-cache-csg65ce02.asm @@ -1,4 +1,4 @@ -//KICKC FRAGMENT CACHE 17f3bfb106 17f3bfc988 +//KICKC FRAGMENT CACHE 148111253e 1481113e09 //FRAGMENT vbuz1=vbuc1 lda #{c1} sta {z1} diff --git a/src/main/fragment/cache/fragment-cache-mega45gs02.asm b/src/main/fragment/cache/fragment-cache-mega45gs02.asm index f3781c344..99d339bd6 100644 --- a/src/main/fragment/cache/fragment-cache-mega45gs02.asm +++ b/src/main/fragment/cache/fragment-cache-mega45gs02.asm @@ -1,4 +1,4 @@ -//KICKC FRAGMENT CACHE 17f3bfb106 17f3bfc988 +//KICKC FRAGMENT CACHE 148111253e 1481113e09 //FRAGMENT _deref_pbuc1=vbuc2 lda #{c2} sta {c1} diff --git a/src/main/fragment/cache/fragment-cache-mos6502.asm b/src/main/fragment/cache/fragment-cache-mos6502.asm index 3927740fb..1ef85ffb4 100644 --- a/src/main/fragment/cache/fragment-cache-mos6502.asm +++ b/src/main/fragment/cache/fragment-cache-mos6502.asm @@ -1,4 +1,4 @@ -//KICKC FRAGMENT CACHE 17f3bfb106 17f3bfc988 +//KICKC FRAGMENT CACHE 148111253e 1481113e09 //FRAGMENT vbuz1=vbuc1 lda #{c1} sta {z1} diff --git a/src/main/fragment/cache/fragment-cache-mos6502x.asm b/src/main/fragment/cache/fragment-cache-mos6502x.asm index a0b0ce1cb..19574bf02 100644 --- a/src/main/fragment/cache/fragment-cache-mos6502x.asm +++ b/src/main/fragment/cache/fragment-cache-mos6502x.asm @@ -1,4 +1,4 @@ -//KICKC FRAGMENT CACHE 17f3bfb106 17f3bfc988 +//KICKC FRAGMENT CACHE 148111253e 1481113e09 //FRAGMENT vbuz1=vbuc1 lda #{c1} sta {z1} @@ -17491,6 +17491,123 @@ lda {z1} cmp #<{c1} bcc {la1} !: +//FRAGMENT vwsz1=pwsc1_derefidx_vbuz2_minus_pwsc2_derefidx_vbuz2 +ldy {z2} +sec +lda {c1},y +sbc {c2},y +sta {z1} +lda {c1}+1,y +sbc {c2}+1,y +sta {z1}+1 +//FRAGMENT vwsz1=_sword_pbuc1_derefidx_vbuz2 +ldy {z2} +lda {c1},y +sta {z1} +lda #0 +sta {z1}+1 +//FRAGMENT vwuz1=pwuc1_derefidx_vbuz2_rol_4 +ldy {z2} +lda {c1},y +asl +sta {z1} +lda {c1}+1,y +rol +sta {z1}+1 +asl {z1} +rol {z1}+1 +asl {z1} +rol {z1}+1 +asl {z1} +rol {z1}+1 +//FRAGMENT pbsc1_derefidx_vbuz1=vbsc2 +lda #{c2} +ldy {z1} +sta {c1},y +//FRAGMENT vwsz1=pwsc1_derefidx_vbuaa_minus_pwsc2_derefidx_vbuaa +tay +sec +lda {c1},y +sbc {c2},y +sta {z1} +lda {c1}+1,y +sbc {c2}+1,y +sta {z1}+1 +//FRAGMENT vwsz1=pwsc1_derefidx_vbuxx_minus_pwsc2_derefidx_vbuxx +sec +lda {c1},x +sbc {c2},x +sta {z1} +lda {c1}+1,x +sbc {c2}+1,x +sta {z1}+1 +//FRAGMENT vwsz1=pwsc1_derefidx_vbuyy_minus_pwsc2_derefidx_vbuyy +sec +lda {c1},y +sbc {c2},y +sta {z1} +lda {c1}+1,y +sbc {c2}+1,y +sta {z1}+1 +//FRAGMENT vwsz1=_sword_pbuc1_derefidx_vbuxx +lda {c1},x +sta {z1} +lda #0 +sta {z1}+1 +//FRAGMENT vwsz1=_sword_pbuc1_derefidx_vbuyy +lda {c1},y +sta {z1} +lda #0 +sta {z1}+1 +//FRAGMENT vwuz1=pwuc1_derefidx_vbuaa_rol_4 +tay +lda {c1},y +asl +sta {z1} +lda {c1}+1,y +rol +sta {z1}+1 +asl {z1} +rol {z1}+1 +asl {z1} +rol {z1}+1 +asl {z1} +rol {z1}+1 +//FRAGMENT vwuz1=pwuc1_derefidx_vbuxx_rol_4 +lda {c1},x +asl +sta {z1} +lda {c1}+1,x +rol +sta {z1}+1 +asl {z1} +rol {z1}+1 +asl {z1} +rol {z1}+1 +asl {z1} +rol {z1}+1 +//FRAGMENT vwuz1=pwuc1_derefidx_vbuyy_rol_4 +lda {c1},y +asl +sta {z1} +lda {c1}+1,y +rol +sta {z1}+1 +asl {z1} +rol {z1}+1 +asl {z1} +rol {z1}+1 +asl {z1} +rol {z1}+1 +//FRAGMENT pbsc1_derefidx_vbuxx=vbsc2 +lda #{c2} +sta {c1},x +//FRAGMENT pbsc1_derefidx_vbuyy=vbsc2 +lda #{c2} +sta {c1},y +//FRAGMENT pbsc1_derefidx_vbuz1=vbsaa +ldy {z1} +sta {c1},y //FRAGMENT _deref_pwuc1=_deref_pwuc1_plus_vwuc2 lda #<{c2} clc diff --git a/src/main/fragment/cache/fragment-cache-wdc65c02.asm b/src/main/fragment/cache/fragment-cache-wdc65c02.asm index 0e5f273e8..88edf0ade 100644 --- a/src/main/fragment/cache/fragment-cache-wdc65c02.asm +++ b/src/main/fragment/cache/fragment-cache-wdc65c02.asm @@ -1,4 +1,4 @@ -//KICKC FRAGMENT CACHE 17f3bfb106 17f3bfc988 +//KICKC FRAGMENT CACHE 148111253e 1481113e09 //FRAGMENT vbuz1=_deref_pbuc1 lda {c1} sta {z1} diff --git a/src/main/fragment/mos6502-common/pwuc1_derefidx_vbuxx=pwuc1_derefidx_vbuyy_plus_vbuc2.asm b/src/main/fragment/mos6502-common/pwuc1_derefidx_vbuxx=pwuc1_derefidx_vbuyy_plus_vbuc2.asm new file mode 100644 index 000000000..3406cbe57 --- /dev/null +++ b/src/main/fragment/mos6502-common/pwuc1_derefidx_vbuxx=pwuc1_derefidx_vbuyy_plus_vbuc2.asm @@ -0,0 +1,7 @@ +clc +lda {c1},y +adc #{c2} +sta {c1},x +lda {c1}+1,y +lda #0 +sta {c1}+1,x \ No newline at end of file diff --git a/src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuxx_plus_vbuc2.asm b/src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuxx_plus_vbuc2.asm new file mode 100644 index 000000000..c420c1d41 --- /dev/null +++ b/src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuxx_plus_vbuc2.asm @@ -0,0 +1,7 @@ +clc +lda {c1},x +adc #{c2} +sta {c1},y +lda {c1}+1,x +lda #0 +sta {c1}+1,y \ No newline at end of file diff --git a/src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuyy_bxor_vwuc2.asm b/src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuyy_bxor_vwuc2.asm new file mode 100644 index 000000000..ababc12d1 --- /dev/null +++ b/src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuyy_bxor_vwuc2.asm @@ -0,0 +1,6 @@ +lda {c1},y +eor #<{c2} +sta {c1},y +lda {c1}+1,y +eor #>{c2} +sta {c1}+1,y diff --git a/src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuyy_plus_pwuc2_derefidx_vbuxx.asm b/src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuyy_plus_pwuc2_derefidx_vbuxx.asm new file mode 100644 index 000000000..bb03b53b4 --- /dev/null +++ b/src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuyy_plus_pwuc2_derefidx_vbuxx.asm @@ -0,0 +1,7 @@ +clc +lda {c1},y +adc {c2},x +sta {c1},y +lda {c1}+1,y +lda {c2}+1,x +sta {c1}+1,y \ No newline at end of file diff --git a/src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuyy_plus_pwuc2_derefidx_vbuyy.asm b/src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuyy_plus_pwuc2_derefidx_vbuyy.asm new file mode 100644 index 000000000..55df15b9f --- /dev/null +++ b/src/main/fragment/mos6502-common/pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuyy_plus_pwuc2_derefidx_vbuyy.asm @@ -0,0 +1,7 @@ +clc +lda {c1},y +adc {c2},y +sta {c1},y +lda {c1}+1,y +lda {c2}+1,y +sta {c1}+1,y \ No newline at end of file diff --git a/src/main/fragment/mos6502-common/vwum1=_deref_pwuc1_ror_8.asm b/src/main/fragment/mos6502-common/vwum1=_deref_pwuc1_ror_8.asm new file mode 100644 index 000000000..840590ddd --- /dev/null +++ b/src/main/fragment/mos6502-common/vwum1=_deref_pwuc1_ror_8.asm @@ -0,0 +1,4 @@ +lda #0 +sta {m1}+1 +lda {c1}+1 +sta {m1} \ No newline at end of file diff --git a/src/main/fragment/mos6502-common/vwum1=pwuc1_derefidx_vbuyy_ror_8.asm b/src/main/fragment/mos6502-common/vwum1=pwuc1_derefidx_vbuyy_ror_8.asm new file mode 100644 index 000000000..0581662a2 --- /dev/null +++ b/src/main/fragment/mos6502-common/vwum1=pwuc1_derefidx_vbuyy_ror_8.asm @@ -0,0 +1,4 @@ +lda #0 +sta {m1}+1 +lda {c1}+1,y +sta {m1} \ No newline at end of file diff --git a/src/main/fragment/mos6502-common/vwum1_ge_vbum2_then_la1.asm b/src/main/fragment/mos6502-common/vwum1_ge_vbum2_then_la1.asm new file mode 100644 index 000000000..a92ec41f0 --- /dev/null +++ b/src/main/fragment/mos6502-common/vwum1_ge_vbum2_then_la1.asm @@ -0,0 +1,6 @@ +lda {m1}+1 +bne {la1} +lda {m1} +cmp {m2} +bcs {la1} +!: \ No newline at end of file diff --git a/src/main/fragment/mos6502-common/vwum1_ge_vbuxx_then_la1.asm b/src/main/fragment/mos6502-common/vwum1_ge_vbuxx_then_la1.asm new file mode 100644 index 000000000..81b276385 --- /dev/null +++ b/src/main/fragment/mos6502-common/vwum1_ge_vbuxx_then_la1.asm @@ -0,0 +1,7 @@ +lda {m1}+1 +bne {la1} +stx $ff +lda {m1} +cmp $ff +bcs {la1} +!: \ No newline at end of file diff --git a/src/main/fragment/mos6502-common/vwum1_ge_vbuyy_then_la1.asm b/src/main/fragment/mos6502-common/vwum1_ge_vbuyy_then_la1.asm new file mode 100644 index 000000000..0ba7df7dd --- /dev/null +++ b/src/main/fragment/mos6502-common/vwum1_ge_vbuyy_then_la1.asm @@ -0,0 +1,7 @@ +lda {m1}+1 +bne {la1} +sty $ff +lda {m1} +cmp $ff +bcs {la1} +!: \ No newline at end of file diff --git a/src/main/fragment/mos6502-common/vwum1_lt_vbum2_then_la1.asm b/src/main/fragment/mos6502-common/vwum1_lt_vbum2_then_la1.asm new file mode 100644 index 000000000..ba00d75fb --- /dev/null +++ b/src/main/fragment/mos6502-common/vwum1_lt_vbum2_then_la1.asm @@ -0,0 +1,6 @@ +lda {m1}+1 +bne !+ +lda {m1} +cmp {m2} +bcc {la1} +!: diff --git a/src/main/fragment/mos6502-common/vwum1_lt_vbuxx_then_la1.asm b/src/main/fragment/mos6502-common/vwum1_lt_vbuxx_then_la1.asm new file mode 100644 index 000000000..363bed344 --- /dev/null +++ b/src/main/fragment/mos6502-common/vwum1_lt_vbuxx_then_la1.asm @@ -0,0 +1,7 @@ +lda {m1}+1 +bne !+ +stx $ff +lda {m1} +cmp $ff +bcc {la1} +!: diff --git a/src/main/fragment/mos6502-common/vwum1_lt_vbuyy_then_la1.asm b/src/main/fragment/mos6502-common/vwum1_lt_vbuyy_then_la1.asm new file mode 100644 index 000000000..8c1950567 --- /dev/null +++ b/src/main/fragment/mos6502-common/vwum1_lt_vbuyy_then_la1.asm @@ -0,0 +1,7 @@ +lda {m1}+1 +bne !+ +sty $ff +lda {m1} +cmp $ff +bcc {la1} +!: diff --git a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java index d32a07d80..7bedb2650 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java +++ b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentTemplateSynthesisRule.java @@ -514,6 +514,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m1(.*)", lvalZM1+"|"+rvalAa+"|"+ twoZM1, "lda {m1}", "$1aa$2", null, mapZM1)); // Replace two M1s with AA synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m1(.*vb.)m1(.*)", lvalZM1+"|"+rvalAa+"|"+ threeZM1, "lda {m1}", "$1aa$2aa$3", null, mapZM1)); + // Replace three M1s with AA + synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m1(.*vb.)m1(.*vb.)m1(.*)", lvalZM1+"|"+rvalAa+"|"+ fourZM1, "lda {m1}", "$1aa$2aa$3aa$4", null, mapZM1)); // Replace first (not second) M1 with AA synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m1(.*)m1(.*)", lvalZM1+"|"+rvalAa, "lda {m1}", "$1aa$2m1$3", null, null)); // Replace second (not first) M1 with AA @@ -529,6 +531,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m2(.*)", lvalZM2+"|"+rvalAa+"|"+twoZM2, "lda {m2}", "$1aa$2", null, mapZM2)); // Replace two M2s with AA synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m2(.*vb.)m2(.*)", lvalZM2+"|"+rvalAa+"|"+threeZM2, "lda {m2}", "$1aa$2aa$3", null, mapZM2)); + // Replace three M2s with AA + synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m2(.*vb.)m2(.*vb.)m2(.*)", lvalZM2+"|"+rvalAa+"|"+fourZM2, "lda {m2}", "$1aa$2aa$3aa$4", null, mapZM2)); // Replace first (of 2) M2 with AA synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m2(.*)m2(.*)", lvalZM2+"|"+rvalAa, "lda {m2}", "$1aa$2m2$3", null, null)); // Replace second (of 2) M2 with AA @@ -538,6 +542,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m3(.*)", lvalZM3+"|"+rvalAa+"|"+twoZM3, "lda {m3}", "$1aa$2", null, mapZM3)); // Replace two M3s with AA synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m3(.*vb.)m3(.*)", lvalZM3+"|"+rvalAa+"|"+threeZM3, "lda {m3}", "$1aa$2aa$3", null, mapZM3)); + // Replace three M3s with AA + synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m3(.*vb.)m3(.*vb.)m3(.*)", lvalZM3+"|"+rvalAa+"|"+fourZM3, "lda {m3}", "$1aa$2aa$3aa$4", null, mapZM3)); // Replace first (of 2) M3 with AA synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m3(.*)m3(.*)", lvalZM3+"|"+rvalAa, "lda {m3}", "$1aa$2m3$3", null, null)); // Replace second (of 2) M3 with AA @@ -547,6 +553,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m4(.*)", lvalZM4+"|"+rvalAa+"|"+twoZM4, "lda {m4}", "$1aa$2", null, mapZM4)); // Replace two M4s with AA synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m4(.*vb.)m4(.*)", lvalZM4+"|"+rvalAa+"|"+threeZM4, "lda {m4}", "$1aa$2aa$3", null, mapZM4)); + // Replace three M4s with AA + synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m4(.*vb.)m4(.*vb.)m4(.*)", lvalZM4+"|"+rvalAa+"|"+fourZM4, "lda {m4}", "$1aa$2aa$3aa$4", null, mapZM4)); // Replace first (of 2) M4 with AA synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m4(.*)m4(.*)", lvalZM4+"|"+rvalAa, "lda {m4}", "$1aa$2m4$3", null, null)); // Replace second (of 2) M4 with AA @@ -556,6 +564,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m1(.*)", lvalZM1+"|"+rvalYy+"|"+ twoZM1, "ldy {m1}", "$1yy$2", null, mapZM1)); // Replace two M1s with YY synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m1(.*vb.)m1(.*)", lvalZM1+"|"+rvalYy+"|"+ threeZM1, "ldy {m1}", "$1yy$2yy$3", null, mapZM1)); + // Replace three M1s with YY + synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m1(.*vb.)m1(.*vb.)m1(.*)", lvalZM1+"|"+rvalYy+"|"+ fourZM1, "ldy {m1}", "$1yy$2yy$3yy$4", null, mapZM1)); // Replace first (not second) M1 with YY synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m1(.*)m1(.*)", lvalZM1+"|"+rvalYy, "ldy {m1}", "$1yy$2m1$3", null, null)); // Replace second (not first) M1 with YY @@ -571,6 +581,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m2(.*)", lvalZM2+"|"+rvalYy+"|"+twoZM2, "ldy {m2}", "$1yy$2", null, mapZM2)); // Replace two M2s with YY synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m2(.*vb.)m2(.*)", lvalZM2+"|"+rvalYy+"|"+threeZM2, "ldy {m2}", "$1yy$2yy$3", null, mapZM2)); + // Replace three M2s with YY + synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m2(.*vb.)m2(.*vb.)m2(.*)", lvalZM2+"|"+rvalYy+"|"+fourZM2, "ldy {m2}", "$1yy$2yy$3yy$4", null, mapZM2)); // Replace first (of 2) M2 with YY synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m2(.*)m2(.*)", lvalZM2+"|"+rvalYy, "ldy {m2}", "$1yy$2m2$3", null, null)); // Replace second (of 2) M2 with YY @@ -580,6 +592,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m3(.*)", lvalZM3+"|"+rvalYy+"|"+twoZM3, "ldy {m3}", "$1yy$2", null, mapZM3)); // Replace two M3s with YY synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m3(.*vb.)m3(.*)", lvalZM3+"|"+rvalYy+"|"+threeZM3, "ldy {m3}", "$1yy$2yy$3", null, mapZM3)); + // Replace three M3s with YY + synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m3(.*vb.)m3(.*vb.)m3(.*)", lvalZM3+"|"+rvalYy+"|"+fourZM3, "ldy {m3}", "$1yy$2yy$3yy$4", null, mapZM3)); // Replace first (of 2) M3 with YY synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m3(.*)m3(.*)", lvalZM3+"|"+rvalYy, "ldy {m3}", "$1yy$2m3$3", null, null)); // Replace second (of 2) M3 with YY @@ -589,6 +603,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m4(.*)", lvalZM4+"|"+rvalYy+"|"+twoZM4, "ldy {m4}", "$1yy$2", null, mapZM4)); // Replace two M4s with YY synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m4(.*vb.)m4(.*)", lvalZM4+"|"+rvalYy+"|"+threeZM4, "ldy {m4}", "$1yy$2yy$3", null, mapZM4)); + // Replace three M4s with YY + synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m4(.*vb.)m4(.*vb.)m4(.*)", lvalZM4+"|"+rvalYy+"|"+fourZM4, "ldy {m4}", "$1yy$2yy$3yy$4", null, mapZM4)); // Replace first (of 2) M4 with YY synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m4(.*)m4(.*)", lvalZM4+"|"+rvalYy, "ldy {m4}", "$1yy$2m4$3", null, null)); // Replace second (of 2) M4 with YY @@ -598,6 +614,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m1(.*)", lvalZM1+"|"+rvalXx+"|"+ twoZM1, "ldx {m1}", "$1xx$2", null, mapZM1)); // Replace two M1s with XX synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m1(.*vb.)m1(.*)", lvalZM1+"|"+rvalXx+"|"+ threeZM1, "ldx {m1}", "$1xx$2xx$3", null, mapZM1)); + // Replace three M1s with XX + synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m1(.*vb.)m1(.*vb.)m1(.*)", lvalZM1+"|"+rvalXx+"|"+ fourZM1, "ldx {m1}", "$1xx$2xx$3xx$4", null, mapZM1)); // Replace first (not second) M1 with XX synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m1(.*)m1(.*)", lvalZM1+"|"+rvalXx, "ldx {m1}", "$1xx$2m1$3", null, null)); // Replace second (not first) M1 with XX @@ -613,6 +631,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m2(.*)", lvalZM2+"|"+rvalXx+"|"+twoZM2, "ldx {m2}", "$1xx$2", null, mapZM2)); // Replace two M2s with XX synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m2(.*vb.)m2(.*)", lvalZM2+"|"+rvalXx+"|"+threeZM2, "ldx {m2}", "$1xx$2xx$3", null, mapZM2)); + // Replace three M2s with XX + synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m2(.*vb.)m2(.*vb.)m2(.*)", lvalZM2+"|"+rvalXx+"|"+fourZM2, "ldx {m2}", "$1xx$2xx$3xx$4", null, mapZM2)); // Replace first (of 2) M2 with XX synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m2(.*)m2(.*)", lvalZM2+"|"+rvalXx, "ldx {m2}", "$1xx$2m2$3", null, null)); // Replace second (of 2) M2 with XX @@ -622,6 +642,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m3(.*)", lvalZM3+"|"+rvalXx+"|"+twoZM3, "ldx {m3}", "$1xx$2", null, mapZM3)); // Replace two M3s with XX synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m3(.*vb.)m3(.*)", lvalZM3+"|"+rvalXx+"|"+threeZM3, "ldx {m3}", "$1xx$2xx$3", null, mapZM3)); + // Replace three M3s with XX + synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m3(.*vb.)m3(.*vb.)m3(.*)", lvalZM3+"|"+rvalXx+"|"+fourZM3, "ldx {m3}", "$1xx$2xx$3xx$4", null, mapZM3)); // Replace first (of 2) M3 with XX synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m3(.*)m3(.*)", lvalZM3+"|"+rvalXx, "ldx {m3}", "$1xx$2m3$3", null, null)); // Replace second (of 2) M3 with XX @@ -631,6 +653,8 @@ class AsmFragmentTemplateSynthesisRule { synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m4(.*)", lvalZM4+"|"+rvalXx+"|"+twoZM4, "ldx {m4}", "$1xx$2", null, mapZM4)); // Replace two M4s with XX synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m4(.*vb.)m4(.*)", lvalZM4+"|"+rvalXx+"|"+threeZM4, "ldx {m4}", "$1xx$2xx$3", null, mapZM4)); + // Replace three M4s with XX + synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m4(.*vb.)m4(.*vb.)m4(.*)", lvalZM4+"|"+rvalXx+"|"+fourZM4, "ldx {m4}", "$1xx$2xx$3xx$4", null, mapZM4)); // Replace first (of 2) M4 with XX synths.add(new AsmFragmentTemplateSynthesisRule("(.*vb.)m4(.*)m4(.*)", lvalZM4+"|"+rvalXx, "ldx {m4}", "$1xx$2m4$3", null, null)); // Replace second (of 2) M4 with XX diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java index 21c7cffad..ab8d11c2f 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java @@ -222,6 +222,11 @@ public class TestPrograms { compileAndCompare("minus-precedence-problem.c"); } + //@Test + //public void testNesBalls() throws IOException, URISyntaxException { + // compileAndCompare("complex/nes-balls/kickballs.c"); + //} + @Test public void testNesDxycp() throws IOException, URISyntaxException { compileAndCompare("examples/nes-dxycp/nes-dxycp.c"); @@ -237,6 +242,11 @@ public class TestPrograms { compileAndCompare("examples/nes-demo/nes-demo.c"); } + //@Test + //public void testMega65Wator() throws IOException, URISyntaxException { + // compileAndCompare("complex/m65wator/main.c"); + //} + @Test public void testMega65BankedMusic() throws IOException, URISyntaxException { compileAndCompare("examples/mega65/banked-music.c");