From 66a1222fdbf1c98545cfcdbcea490b9e85f8ea20 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Sun, 8 Aug 2021 17:45:56 +0200 Subject: [PATCH] Added support for indirect calls to advanced expressions through a new fragment type. Closes #708 --- .../cache/fragment-cache-csg65ce02.asm | 2 +- .../cache/fragment-cache-mega45gs02.asm | 1677 +++++------------ .../fragment/cache/fragment-cache-mos6502.asm | 2 +- .../cache/fragment-cache-mos6502x.asm | 1057 +---------- .../cache/fragment-cache-rom6502x.asm | 2 +- .../cache/fragment-cache-wdc65c02.asm | 80 +- .../mos6502-common/call__deref_pprc1.asm | 1 + .../call__deref_(qprz1_derefidx_vbuyy).asm | 7 + .../AsmFragmentInstanceSpecBuilder.java | 18 + .../kickc/passes/Pass4CodeGeneration.java | 34 +- .../kickc/test/TestProgramsFast.java | 5 + src/test/kc/function-pointer-return-2.c | 4 +- src/test/kc/function-pointer-return-3.c | 40 + src/test/ref/examples/c64/music/music.log | 12 +- src/test/ref/examples/c64/music/music_irq.log | 12 +- src/test/ref/examples/mega65/banked-music.log | 68 +- src/test/ref/examples/mega65/raster65.log | 26 +- src/test/ref/function-pointer-return-2.asm | 4 +- src/test/ref/function-pointer-return-2.log | 8 +- src/test/ref/function-pointer-return-3.asm | 94 + src/test/ref/function-pointer-return-3.cfg | 46 + src/test/ref/function-pointer-return-3.log | 646 +++++++ src/test/ref/function-pointer-return-3.sym | 30 + 23 files changed, 1460 insertions(+), 2415 deletions(-) create mode 100644 src/main/fragment/mos6502-common/call__deref_pprc1.asm create mode 100644 src/main/fragment/mos6502-selfmod/call__deref_(qprz1_derefidx_vbuyy).asm create mode 100644 src/test/kc/function-pointer-return-3.c create mode 100644 src/test/ref/function-pointer-return-3.asm create mode 100644 src/test/ref/function-pointer-return-3.cfg create mode 100644 src/test/ref/function-pointer-return-3.log create mode 100644 src/test/ref/function-pointer-return-3.sym diff --git a/src/main/fragment/cache/fragment-cache-csg65ce02.asm b/src/main/fragment/cache/fragment-cache-csg65ce02.asm index 81fac09dc..ce9569244 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 8d6655dbd 8d6657e44 +//KICKC FRAGMENT CACHE 84ae04234 84ae062c1 //FRAGMENT vbuzz=vbuc1 ldz #{c1} //FRAGMENT vbuzz_lt_vbuc1_then_la1 diff --git a/src/main/fragment/cache/fragment-cache-mega45gs02.asm b/src/main/fragment/cache/fragment-cache-mega45gs02.asm index 1a9982168..f46ddb6ef 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 8d6655dbd 8d6657e44 +//KICKC FRAGMENT CACHE 84ae04234 84ae062c1 //FRAGMENT _deref_pbuc1=vbuc2 lda #{c2} sta {c1} @@ -36,1135 +36,16 @@ sta ({z1}),y //FRAGMENT vbuz1=vbuc1 lda #{c1} sta {z1} -//FRAGMENT isr_hardware_all_entry -pha @clob_a -phx @clob_x -phy @clob_y -phz @clob_z -//FRAGMENT vbuz1=_inc_vbuz1 -inc {z1} -//FRAGMENT vbuz1=vbuz2 -lda {z2} +//FRAGMENT vbuz1=_deref_pbuc1_plus_1 +lda {c1} +inc sta {z1} -//FRAGMENT vbuz1_neq_vbuc1_then_la1 -lda #{c1} -cmp {z1} -bne {la1} //FRAGMENT vbuz1_lt_vbuc1_then_la1 lda {z1} cmp #{c1} bcc {la1} -//FRAGMENT vbuz1=vbuz2_rol_4 +//FRAGMENT vbuz1=vbuz2 lda {z2} -asl -asl -asl -asl -sta {z1} -//FRAGMENT vbuz1=_dec_vbuz1 -dec {z1} -//FRAGMENT vbuz1=_deref_pbuz2 -ldy #0 -lda ({z2}),y -sta {z1} -//FRAGMENT vbuz1_neq_0_then_la1 -lda {z1} -bne {la1} -//FRAGMENT vbuz1=vbuz2_band_vbuc1 -lda #{c1} -and {z2} -sta {z1} -//FRAGMENT _deref_pbuc1=vbuz1 -lda {z1} -sta {c1} -//FRAGMENT isr_hardware_all_exit -plz @clob_z -ply @clob_y -plx @clob_x -pla @clob_a -rti -//FRAGMENT pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz1 -ldy {z1} -lda {c2},y -sta {c1},y -//FRAGMENT vbuz1=pbuc1_derefidx_vbuz2_band_vbuc2 -lda #{c2} -ldy {z2} -and {c1},y -sta {z1} -//FRAGMENT pbuc1_derefidx_vbuz1=vbuz2 -lda {z2} -ldy {z1} -sta {c1},y -//FRAGMENT vbuz1=pbuc1_derefidx_vbuz2_ror_1 -ldy {z2} -lda {c1},y -lsr -sta {z1} -//FRAGMENT vbuz1=pbuc1_derefidx_vbuz2 -ldy {z2} -lda {c1},y -sta {z1} -//FRAGMENT vbuz1=vbuz1_plus_vbuc1 -lda #{c1} -clc -adc {z1} -sta {z1} -//FRAGMENT pbuc1_derefidx_vbuz1=vbuc2 -lda #{c2} -ldy {z1} -sta {c1},y -//FRAGMENT vbuz1=pbuc1_derefidx_vbuz2_ror_2 -ldy {z2} -lda {c1},y -lsr -lsr -sta {z1} -//FRAGMENT vbuz1=vbuz2_ror_1 -lda {z2} -lsr -sta {z1} -//FRAGMENT pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2 -ldy {z2} -lda {c2},y -ldy {z1} -sta {c1},y -//FRAGMENT vbuz1_eq_vbuc1_then_la1 -lda #{c1} -cmp {z1} -beq {la1} -//FRAGMENT vbuz1=vbuz2_plus_1 -lda {z2} -inc -sta {z1} -//FRAGMENT vbuz1=_deref_pbuc1 -lda {c1} -sta {z1} -//FRAGMENT vbuz1_eq__deref_pbuc1_then_la1 -lda {c1} -cmp {z1} -beq {la1} -//FRAGMENT _deref_pbuc1=pbuc2_derefidx_vbuz1 -ldy {z1} -lda {c2},y -sta {c1} -//FRAGMENT _deref_pbuc1=_deref_pbuc1_band_vbuc2 -lda #{c2} -and {c1} -sta {c1} -//FRAGMENT _deref_qprc1=pprc2 -lda #<{c2} -sta {c1} -lda #>{c2} -sta {c1}+1 -//FRAGMENT pbuz1_neq_pbuc1_then_la1 -lda {z1}+1 -cmp #>{c1} -bne {la1} -lda {z1} -cmp #<{c1} -bne {la1} -//FRAGMENT vbuaa=vbuz1 -lda {z1} -//FRAGMENT vbuxx=vbuz1 -ldx {z1} -//FRAGMENT vbuaa_neq_vbuc1_then_la1 -cmp #{c1} -bne {la1} -//FRAGMENT vbuaa_lt_vbuc1_then_la1 -cmp #{c1} -bcc {la1} -//FRAGMENT vbuaa=vbuz1_rol_4 -lda {z1} -asl -asl -asl -asl -//FRAGMENT vbuxx=vbuz1_rol_4 -lda {z1} -asl -asl -asl -asl -tax -//FRAGMENT vbuyy=vbuz1_rol_4 -lda {z1} -asl -asl -asl -asl -tay -//FRAGMENT vbuzz=vbuz1_rol_4 -lda {z1} -asl -asl -asl -asl -taz -//FRAGMENT vbuaa=_deref_pbuz1 -ldy #0 -lda ({z1}),y -//FRAGMENT vbuxx=_deref_pbuz1 -ldy #0 -lda ({z1}),y -tax -//FRAGMENT vbuyy=_deref_pbuz1 -ldy #0 -lda ({z1}),y -tay -//FRAGMENT vbuzz=_deref_pbuz1 -ldy #0 -lda ({z1}),y -taz -//FRAGMENT vbuaa_neq_0_then_la1 -cmp #0 -bne {la1} -//FRAGMENT vbuz1=vbuaa_band_vbuc1 -and #{c1} -sta {z1} -//FRAGMENT vbuz1=vbuxx_band_vbuc1 -txa -and #{c1} -sta {z1} -//FRAGMENT vbuz1=vbuyy_band_vbuc1 -tya -and #{c1} -sta {z1} -//FRAGMENT vbuz1=vbuzz_band_vbuc1 -tza -and #{c1} -sta {z1} -//FRAGMENT vbuaa=vbuz1_band_vbuc1 -lda #{c1} -and {z1} -//FRAGMENT vbuaa=vbuaa_band_vbuc1 -and #{c1} -//FRAGMENT vbuaa=vbuxx_band_vbuc1 -txa -and #{c1} -//FRAGMENT vbuaa=vbuyy_band_vbuc1 -tya -and #{c1} -//FRAGMENT vbuaa=vbuzz_band_vbuc1 -tza -and #{c1} -//FRAGMENT vbuxx=vbuz1_band_vbuc1 -lda #{c1} -and {z1} -tax -//FRAGMENT vbuxx=vbuaa_band_vbuc1 -and #{c1} -tax -//FRAGMENT vbuxx=vbuxx_band_vbuc1 -txa -and #{c1} -tax -//FRAGMENT vbuxx=vbuyy_band_vbuc1 -tya -and #{c1} -tax -//FRAGMENT vbuxx=vbuzz_band_vbuc1 -tza -and #{c1} -tax -//FRAGMENT vbuyy=vbuz1_band_vbuc1 -lda #{c1} -and {z1} -tay -//FRAGMENT vbuyy=vbuaa_band_vbuc1 -and #{c1} -tay -//FRAGMENT vbuyy=vbuxx_band_vbuc1 -txa -and #{c1} -tay -//FRAGMENT vbuyy=vbuyy_band_vbuc1 -tya -and #{c1} -tay -//FRAGMENT vbuyy=vbuzz_band_vbuc1 -tza -and #{c1} -tay -//FRAGMENT vbuzz=vbuz1_band_vbuc1 -lda #{c1} -and {z1} -taz -//FRAGMENT vbuzz=vbuaa_band_vbuc1 -and #{c1} -taz -//FRAGMENT vbuzz=vbuxx_band_vbuc1 -txa -and #{c1} -taz -//FRAGMENT vbuzz=vbuyy_band_vbuc1 -tya -and #{c1} -taz -//FRAGMENT vbuzz=vbuzz_band_vbuc1 -tza -and #{c1} -taz -//FRAGMENT _deref_pbuc1=vbuaa -sta {c1} -//FRAGMENT pbuc1_derefidx_vbuaa=pbuc2_derefidx_vbuaa -tay -lda {c2},y -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx -lda {c2},x -sta {c1},x -//FRAGMENT pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuyy -lda {c2},y -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuzz=pbuc2_derefidx_vbuzz -tza -tay -lda {c2},y -sta {c1},y -//FRAGMENT vbuaa=pbuc1_derefidx_vbuz1_band_vbuc2 -lda #{c2} -ldy {z1} -and {c1},y -//FRAGMENT vbuxx=pbuc1_derefidx_vbuz1_band_vbuc2 -lda #{c2} -ldx {z1} -and {c1},x -tax -//FRAGMENT vbuyy=pbuc1_derefidx_vbuz1_band_vbuc2 -lda #{c2} -ldy {z1} -and {c1},y -tay -//FRAGMENT vbuzz=pbuc1_derefidx_vbuz1_band_vbuc2 -lda #{c2} -ldy {z1} -and {c1},y -taz -//FRAGMENT vbuz1=pbuc1_derefidx_vbuaa_band_vbuc2 -tay -lda #{c2} -and {c1},y -sta {z1} -//FRAGMENT vbuaa=pbuc1_derefidx_vbuaa_band_vbuc2 -tay -lda #{c2} -and {c1},y -//FRAGMENT vbuxx=pbuc1_derefidx_vbuaa_band_vbuc2 -tax -lda #{c2} -and {c1},x -tax -//FRAGMENT vbuyy=pbuc1_derefidx_vbuaa_band_vbuc2 -tay -lda #{c2} -and {c1},y -tay -//FRAGMENT vbuzz=pbuc1_derefidx_vbuaa_band_vbuc2 -tay -lda #{c2} -and {c1},y -taz -//FRAGMENT vbuz1=pbuc1_derefidx_vbuxx_band_vbuc2 -lda #{c2} -and {c1},x -sta {z1} -//FRAGMENT vbuaa=pbuc1_derefidx_vbuxx_band_vbuc2 -lda #{c2} -and {c1},x -//FRAGMENT vbuxx=pbuc1_derefidx_vbuxx_band_vbuc2 -lda #{c2} -and {c1},x -tax -//FRAGMENT vbuyy=pbuc1_derefidx_vbuxx_band_vbuc2 -lda #{c2} -and {c1},x -tay -//FRAGMENT vbuzz=pbuc1_derefidx_vbuxx_band_vbuc2 -lda #{c2} -and {c1},x -taz -//FRAGMENT vbuz1=pbuc1_derefidx_vbuyy_band_vbuc2 -lda #{c2} -and {c1},y -sta {z1} -//FRAGMENT vbuaa=pbuc1_derefidx_vbuyy_band_vbuc2 -lda #{c2} -and {c1},y -//FRAGMENT vbuxx=pbuc1_derefidx_vbuyy_band_vbuc2 -lda #{c2} -and {c1},y -tax -//FRAGMENT vbuyy=pbuc1_derefidx_vbuyy_band_vbuc2 -lda #{c2} -and {c1},y -tay -//FRAGMENT vbuzz=pbuc1_derefidx_vbuyy_band_vbuc2 -lda #{c2} -and {c1},y -taz -//FRAGMENT vbuz1=pbuc1_derefidx_vbuzz_band_vbuc2 -tza -tay -lda #{c2} -and {c1},y -sta {z1} -//FRAGMENT vbuaa=pbuc1_derefidx_vbuzz_band_vbuc2 -tza -tay -lda #{c2} -and {c1},y -//FRAGMENT vbuxx=pbuc1_derefidx_vbuzz_band_vbuc2 -tza -tax -lda #{c2} -and {c1},x -tax -//FRAGMENT vbuyy=pbuc1_derefidx_vbuzz_band_vbuc2 -tza -tay -lda #{c2} -and {c1},y -tay -//FRAGMENT vbuzz=pbuc1_derefidx_vbuzz_band_vbuc2 -tza -tay -lda #{c2} -and {c1},y -taz -//FRAGMENT pbuc1_derefidx_vbuxx=vbuz1 -lda {z1} -sta {c1},x -//FRAGMENT pbuc1_derefidx_vbuyy=vbuz1 -lda {z1} -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuzz=vbuz1 -tza -tay -lda {z1} -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuz1=vbuaa -ldy {z1} -sta {c1},y -//FRAGMENT vbuaa=pbuc1_derefidx_vbuz1_ror_1 -ldy {z1} -lda {c1},y -lsr -//FRAGMENT vbuxx=pbuc1_derefidx_vbuz1_ror_1 -ldx {z1} -lda {c1},x -lsr -tax -//FRAGMENT vbuyy=pbuc1_derefidx_vbuz1_ror_1 -ldy {z1} -lda {c1},y -lsr -tay -//FRAGMENT vbuzz=pbuc1_derefidx_vbuz1_ror_1 -ldy {z1} -lda {c1},y -lsr -taz -//FRAGMENT vbuz1=pbuc1_derefidx_vbuaa_ror_1 -tay -lda {c1},y -lsr -sta {z1} -//FRAGMENT vbuaa=pbuc1_derefidx_vbuaa_ror_1 -tay -lda {c1},y -lsr -//FRAGMENT vbuxx=pbuc1_derefidx_vbuaa_ror_1 -tax -lda {c1},x -lsr -tax -//FRAGMENT vbuyy=pbuc1_derefidx_vbuaa_ror_1 -tay -lda {c1},y -lsr -tay -//FRAGMENT vbuzz=pbuc1_derefidx_vbuaa_ror_1 -tay -lda {c1},y -lsr -taz -//FRAGMENT vbuz1=pbuc1_derefidx_vbuxx_ror_1 -lda {c1},x -lsr -sta {z1} -//FRAGMENT vbuaa=pbuc1_derefidx_vbuxx_ror_1 -lda {c1},x -lsr -//FRAGMENT vbuxx=pbuc1_derefidx_vbuxx_ror_1 -lda {c1},x -lsr -tax -//FRAGMENT vbuyy=pbuc1_derefidx_vbuxx_ror_1 -lda {c1},x -lsr -tay -//FRAGMENT vbuzz=pbuc1_derefidx_vbuxx_ror_1 -lda {c1},x -lsr -taz -//FRAGMENT vbuz1=pbuc1_derefidx_vbuyy_ror_1 -lda {c1},y -lsr -sta {z1} -//FRAGMENT vbuaa=pbuc1_derefidx_vbuyy_ror_1 -lda {c1},y -lsr -//FRAGMENT vbuxx=pbuc1_derefidx_vbuyy_ror_1 -lda {c1},y -lsr -tax -//FRAGMENT vbuyy=pbuc1_derefidx_vbuyy_ror_1 -lda {c1},y -lsr -tay -//FRAGMENT vbuzz=pbuc1_derefidx_vbuyy_ror_1 -lda {c1},y -lsr -taz -//FRAGMENT vbuz1=pbuc1_derefidx_vbuzz_ror_1 -tza -tay -lda {c1},y -lsr -sta {z1} -//FRAGMENT vbuaa=pbuc1_derefidx_vbuzz_ror_1 -tza -tay -lda {c1},y -lsr -//FRAGMENT vbuxx=pbuc1_derefidx_vbuzz_ror_1 -tza -tax -lda {c1},x -lsr -tax -//FRAGMENT vbuyy=pbuc1_derefidx_vbuzz_ror_1 -tza -tay -lda {c1},y -lsr -tay -//FRAGMENT vbuzz=pbuc1_derefidx_vbuzz_ror_1 -tza -tay -lda {c1},y -lsr -taz -//FRAGMENT pbuc1_derefidx_vbuz1=vbuxx -ldy {z1} -txa -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuz1=vbuyy -tya -ldy {z1} -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuz1=vbuzz -ldy {z1} -tza -sta {c1},y -//FRAGMENT vbuaa=pbuc1_derefidx_vbuz1 -ldy {z1} -lda {c1},y -//FRAGMENT vbuxx=pbuc1_derefidx_vbuz1 -ldy {z1} -ldx {c1},y -//FRAGMENT vbuyy=pbuc1_derefidx_vbuz1 -ldx {z1} -ldy {c1},x -//FRAGMENT vbuzz=pbuc1_derefidx_vbuz1 -ldx {z1} -ldz {c1},x -//FRAGMENT vbuz1=vbuaa_rol_4 -asl -asl -asl -asl -sta {z1} -//FRAGMENT vbuaa=vbuaa_rol_4 -asl -asl -asl -asl -//FRAGMENT vbuxx=vbuaa_rol_4 -asl -asl -asl -asl -tax -//FRAGMENT vbuyy=vbuaa_rol_4 -asl -asl -asl -asl -tay -//FRAGMENT vbuzz=vbuaa_rol_4 -asl -asl -asl -asl -taz -//FRAGMENT vbuz1=vbuxx_rol_4 -txa -asl -asl -asl -asl -sta {z1} -//FRAGMENT vbuaa=vbuxx_rol_4 -txa -asl -asl -asl -asl -//FRAGMENT vbuxx=vbuxx_rol_4 -txa -asl -asl -asl -asl -tax -//FRAGMENT vbuyy=vbuxx_rol_4 -txa -asl -asl -asl -asl -tay -//FRAGMENT vbuzz=vbuxx_rol_4 -txa -asl -asl -asl -asl -taz -//FRAGMENT vbuz1=vbuyy_rol_4 -tya -asl -asl -asl -asl -sta {z1} -//FRAGMENT vbuaa=vbuyy_rol_4 -tya -asl -asl -asl -asl -//FRAGMENT vbuxx=vbuyy_rol_4 -tya -asl -asl -asl -asl -tax -//FRAGMENT vbuyy=vbuyy_rol_4 -tya -asl -asl -asl -asl -tay -//FRAGMENT vbuzz=vbuyy_rol_4 -tya -asl -asl -asl -asl -taz -//FRAGMENT vbuz1=vbuzz_rol_4 -tza -asl -asl -asl -asl -sta {z1} -//FRAGMENT vbuaa=vbuzz_rol_4 -tza -asl -asl -asl -asl -//FRAGMENT vbuxx=vbuzz_rol_4 -tza -asl -asl -asl -asl -tax -//FRAGMENT vbuyy=vbuzz_rol_4 -tza -asl -asl -asl -asl -tay -//FRAGMENT vbuzz=vbuzz_rol_4 -tza -asl -asl -asl -asl -taz -//FRAGMENT vbuxx=vbuxx_plus_vbuc1 -txa -clc -adc #{c1} -tax -//FRAGMENT vbuyy=vbuyy_plus_vbuc1 -tya -clc -adc #{c1} -tay -//FRAGMENT vbuzz=vbuzz_plus_vbuc1 -tza -clc -adc #{c1} -taz -//FRAGMENT pbuc1_derefidx_vbuaa=vbuc2 -tay -lda #{c2} -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuxx=vbuc2 -lda #{c2} -sta {c1},x -//FRAGMENT pbuc1_derefidx_vbuyy=vbuc2 -lda #{c2} -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuzz=vbuc2 -tza -tay -lda #{c2} -sta {c1},y -//FRAGMENT vbuaa=pbuc1_derefidx_vbuz1_ror_2 -ldy {z1} -lda {c1},y -lsr -lsr -//FRAGMENT vbuxx=pbuc1_derefidx_vbuz1_ror_2 -ldx {z1} -lda {c1},x -lsr -lsr -tax -//FRAGMENT vbuyy=pbuc1_derefidx_vbuz1_ror_2 -ldy {z1} -lda {c1},y -lsr -lsr -tay -//FRAGMENT vbuzz=pbuc1_derefidx_vbuz1_ror_2 -ldy {z1} -lda {c1},y -lsr -lsr -taz -//FRAGMENT vbuz1=pbuc1_derefidx_vbuaa_ror_2 -tay -lda {c1},y -lsr -lsr -sta {z1} -//FRAGMENT vbuaa=pbuc1_derefidx_vbuaa_ror_2 -tay -lda {c1},y -lsr -lsr -//FRAGMENT vbuxx=pbuc1_derefidx_vbuaa_ror_2 -tax -lda {c1},x -lsr -lsr -tax -//FRAGMENT vbuyy=pbuc1_derefidx_vbuaa_ror_2 -tay -lda {c1},y -lsr -lsr -tay -//FRAGMENT vbuzz=pbuc1_derefidx_vbuaa_ror_2 -tay -lda {c1},y -lsr -lsr -taz -//FRAGMENT vbuz1=pbuc1_derefidx_vbuxx_ror_2 -lda {c1},x -lsr -lsr -sta {z1} -//FRAGMENT vbuaa=pbuc1_derefidx_vbuxx_ror_2 -lda {c1},x -lsr -lsr -//FRAGMENT vbuxx=pbuc1_derefidx_vbuxx_ror_2 -lda {c1},x -lsr -lsr -tax -//FRAGMENT vbuyy=pbuc1_derefidx_vbuxx_ror_2 -lda {c1},x -lsr -lsr -tay -//FRAGMENT vbuzz=pbuc1_derefidx_vbuxx_ror_2 -lda {c1},x -lsr -lsr -taz -//FRAGMENT vbuz1=pbuc1_derefidx_vbuyy_ror_2 -lda {c1},y -lsr -lsr -sta {z1} -//FRAGMENT vbuaa=pbuc1_derefidx_vbuyy_ror_2 -lda {c1},y -lsr -lsr -//FRAGMENT vbuxx=pbuc1_derefidx_vbuyy_ror_2 -lda {c1},y -lsr -lsr -tax -//FRAGMENT vbuyy=pbuc1_derefidx_vbuyy_ror_2 -lda {c1},y -lsr -lsr -tay -//FRAGMENT vbuzz=pbuc1_derefidx_vbuyy_ror_2 -lda {c1},y -lsr -lsr -taz -//FRAGMENT vbuz1=pbuc1_derefidx_vbuzz_ror_2 -tza -tay -lda {c1},y -lsr -lsr -sta {z1} -//FRAGMENT vbuaa=pbuc1_derefidx_vbuzz_ror_2 -tza -tay -lda {c1},y -lsr -lsr -//FRAGMENT vbuxx=pbuc1_derefidx_vbuzz_ror_2 -tza -tax -lda {c1},x -lsr -lsr -tax -//FRAGMENT vbuyy=pbuc1_derefidx_vbuzz_ror_2 -tza -tay -lda {c1},y -lsr -lsr -tay -//FRAGMENT vbuzz=pbuc1_derefidx_vbuzz_ror_2 -tza -tay -lda {c1},y -lsr -lsr -taz -//FRAGMENT vbuz1=vbuaa_ror_1 -lsr -sta {z1} -//FRAGMENT vbuz1=vbuxx_ror_1 -txa -lsr -sta {z1} -//FRAGMENT vbuz1=vbuyy_ror_1 -tya -lsr -sta {z1} -//FRAGMENT vbuz1=vbuzz_ror_1 -tza -lsr -sta {z1} -//FRAGMENT vbuaa=vbuz1_ror_1 -lda {z1} -lsr -//FRAGMENT vbuaa=vbuaa_ror_1 -lsr -//FRAGMENT vbuaa=vbuxx_ror_1 -txa -lsr -//FRAGMENT vbuaa=vbuyy_ror_1 -tya -lsr -//FRAGMENT vbuaa=vbuzz_ror_1 -tza -lsr -//FRAGMENT vbuxx=vbuz1_ror_1 -lda {z1} -lsr -tax -//FRAGMENT vbuxx=vbuaa_ror_1 -lsr -tax -//FRAGMENT vbuxx=vbuxx_ror_1 -txa -lsr -tax -//FRAGMENT vbuxx=vbuyy_ror_1 -tya -lsr -tax -//FRAGMENT vbuxx=vbuzz_ror_1 -tza -lsr -tax -//FRAGMENT vbuyy=vbuz1_ror_1 -lda {z1} -lsr -tay -//FRAGMENT vbuyy=vbuaa_ror_1 -lsr -tay -//FRAGMENT vbuyy=vbuxx_ror_1 -txa -lsr -tay -//FRAGMENT vbuyy=vbuyy_ror_1 -tya -lsr -tay -//FRAGMENT vbuyy=vbuzz_ror_1 -tza -lsr -tay -//FRAGMENT vbuzz=vbuz1_ror_1 -lda {z1} -lsr -taz -//FRAGMENT vbuzz=vbuaa_ror_1 -lsr -taz -//FRAGMENT vbuzz=vbuxx_ror_1 -txa -lsr -taz -//FRAGMENT vbuzz=vbuyy_ror_1 -tya -lsr -taz -//FRAGMENT vbuzz=vbuzz_ror_1 -tza -lsr -taz -//FRAGMENT pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuz1 -ldy {z1} -lda {c2},y -sta {c1},x -//FRAGMENT pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuz1 -ldx {z1} -lda {c2},x -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuzz=pbuc2_derefidx_vbuz1 -ldx {z1} -tza -tay -lda {c2},x -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuxx -lda {c2},x -ldy {z1} -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuxx -lda {c2},x -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuzz=pbuc2_derefidx_vbuxx -tza -tay -lda {c2},x -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuyy -lda {c2},y -ldy {z1} -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuyy -lda {c2},y -sta {c1},x -//FRAGMENT pbuc1_derefidx_vbuzz=pbuc2_derefidx_vbuyy -tza -tax -lda {c2},y -sta {c1},x -//FRAGMENT pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuzz -tza -tay -lda {c2},y -ldy {z1} -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuzz -tza -tay -lda {c2},y -sta {c1},x -//FRAGMENT pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuzz -tza -tax -lda {c2},x -sta {c1},y -//FRAGMENT vbuaa_eq_vbuc1_then_la1 -cmp #{c1} -beq {la1} -//FRAGMENT vbuaa=vbuz1_plus_1 -lda {z1} -inc -//FRAGMENT vbuxx=vbuz1_plus_1 -ldx {z1} -inx -//FRAGMENT vbuaa=_deref_pbuc1 -lda {c1} -//FRAGMENT vbuxx=_deref_pbuc1 -ldx {c1} -//FRAGMENT vbuaa_eq__deref_pbuc1_then_la1 -cmp {c1} -beq {la1} -//FRAGMENT _deref_pbuc1=pbuc2_derefidx_vbuxx -lda {c2},x -sta {c1} -//FRAGMENT _deref_pbuc1=pbuc2_derefidx_vbuyy -lda {c2},y -sta {c1} -//FRAGMENT _deref_pbuc1=pbuc2_derefidx_vbuzz -tza -tay -lda {c2},y -sta {c1} -//FRAGMENT vbuxx_neq_0_then_la1 -cpx #0 -bne {la1} -//FRAGMENT vbuxx_neq_vbuc1_then_la1 -cpx #{c1} -bne {la1} -//FRAGMENT vbuxx_lt_vbuc1_then_la1 -cpx #{c1} -bcc {la1} -//FRAGMENT vbuxx_eq_vbuc1_then_la1 -cpx #{c1} -beq {la1} -//FRAGMENT vbuxx=vbuc1 -ldx #{c1} -//FRAGMENT vbuxx=_inc_vbuxx -inx -//FRAGMENT vbuyy=vbuc1 -ldy #{c1} -//FRAGMENT vbuyy_lt_vbuc1_then_la1 -cpy #{c1} -bcc {la1} -//FRAGMENT vbuyy=_inc_vbuyy -iny -//FRAGMENT vbuzz=vbuc1 -ldz #{c1} -//FRAGMENT vbuzz_lt_vbuc1_then_la1 -cpz #{c1} -bcc {la1} -//FRAGMENT vbuzz=_inc_vbuzz -inz -//FRAGMENT vbuyy_neq_0_then_la1 -cpy #0 -bne {la1} -//FRAGMENT vbuzz_neq_0_then_la1 -cpz #0 -bne {la1} -//FRAGMENT vbuaa=_dec_vbuaa -sec -sbc #1 -//FRAGMENT vbuaa=_inc_vbuaa -inc -//FRAGMENT vbuxx=_dec_vbuxx -dex -//FRAGMENT vbuyy=_dec_vbuyy -dey -//FRAGMENT vbuzz=_dec_vbuzz -dez -//FRAGMENT pbuc1_derefidx_vbuxx=vbuzz -tza -sta {c1},x -//FRAGMENT pbuc1_derefidx_vbuyy=vbuzz -tza -sta {c1},y -//FRAGMENT vbuaa=vbuc1 -lda #{c1} -//FRAGMENT vbuxx_eq__deref_pbuc1_then_la1 -cpx {c1} -beq {la1} -//FRAGMENT vbuyy=_deref_pbuc1 -ldy {c1} -//FRAGMENT vbuyy_eq__deref_pbuc1_then_la1 -tya -cmp {c1} -beq {la1} -//FRAGMENT vbuzz=_deref_pbuc1 -ldz {c1} -//FRAGMENT vbuzz_eq__deref_pbuc1_then_la1 -cpz {c1} -beq {la1} -//FRAGMENT vbuyy=vbuz1 -ldy {z1} -//FRAGMENT vbuzz=vbuz1 -ldz {z1} -//FRAGMENT vbuyy_neq_vbuc1_then_la1 -cpy #{c1} -bne {la1} -//FRAGMENT vbuzz_neq_vbuc1_then_la1 -cpz #{c1} -bne {la1} -//FRAGMENT vbuz1=pbuc1_derefidx_vbuyy -lda {c1},y -sta {z1} -//FRAGMENT vbuyy_eq_vbuc1_then_la1 -cpy #{c1} -beq {la1} -//FRAGMENT vbuz1=pbuc1_derefidx_vbuzz -tza -tay -lda {c1},y -sta {z1} -//FRAGMENT vbuzz_eq_vbuc1_then_la1 -cpz #{c1} -beq {la1} -//FRAGMENT pbuc1_derefidx_vbuxx=vbuaa -sta {c1},x -//FRAGMENT pbuc1_derefidx_vbuxx=vbuyy -tya -sta {c1},x -//FRAGMENT vbuyy=vbuz1_plus_1 -ldy {z1} -iny -//FRAGMENT _deref_pbuc1=vbuyy -sty {c1} -//FRAGMENT vbuaa=pbuc1_derefidx_vbuzz -tza -tay -lda {c1},y -//FRAGMENT vbuyy=pbuc1_derefidx_vbuzz -tza -tax -ldy {c1},x -//FRAGMENT vbuaa=vbuaa_plus_1 -inc -//FRAGMENT vbuaa=vbuyy_plus_1 -tya -inc -//FRAGMENT _deref_pbuc1=vbuxx -stx {c1} -//FRAGMENT _deref_pbuc1=vbuzz -stz {c1} -//FRAGMENT vbuz1=_deref_pbuc1_plus_1 -lda {c1} -inc sta {z1} //FRAGMENT vwuz1=_word_vbuz2 lda {z2} @@ -1214,9 +95,17 @@ lda {z2} sta {z1} lda {z2}+1 sta {z1}+1 +//FRAGMENT vbuz1=_deref_pbuz2 +ldy #0 +lda ({z2}),y +sta {z1} //FRAGMENT 0_neq_vbuz1_then_la1 lda {z1} bne {la1} +//FRAGMENT vbuz1_eq_vbuc1_then_la1 +lda #{c1} +cmp {z1} +beq {la1} //FRAGMENT pbuz1_derefidx_vbuz2=vbuz3 lda {z3} ldz {z2} @@ -1225,6 +114,12 @@ sta ({z1}),z lda #{c1} ldz {z2} sta ({z1}),z +//FRAGMENT vbuz1=_inc_vbuz1 +inc {z1} +//FRAGMENT vbuz1_neq_vbuc1_then_la1 +lda #{c1} +cmp {z1} +bne {la1} //FRAGMENT pbuz1=pbuz1_plus_vbuc1 lda #{c1} clc @@ -1246,6 +141,8 @@ sta {z1} lda {z1}+1 sbc #0 sta {z1}+1 +//FRAGMENT vbuz1=_dec_vbuz1 +dec {z1} //FRAGMENT pbuz1=pbuz2_plus_vwuc1 lda {z2} clc @@ -1284,6 +181,13 @@ inc //FRAGMENT vbuxx=_deref_pbuc1_plus_1 ldx {c1} inx +//FRAGMENT vbuaa_lt_vbuc1_then_la1 +cmp #{c1} +bcc {la1} +//FRAGMENT vbuaa=vbuz1 +lda {z1} +//FRAGMENT vbuxx=vbuz1 +ldx {z1} //FRAGMENT vbuz1=vbuxx stx {z1} //FRAGMENT vwuz1=_word_vbuxx @@ -1301,11 +205,29 @@ tza sta {z1} lda #0 sta {z1}+1 +//FRAGMENT vbuaa=_deref_pbuz1 +ldy #0 +lda ({z1}),y +//FRAGMENT vbuxx=_deref_pbuz1 +ldy #0 +lda ({z1}),y +tax +//FRAGMENT vbuyy=_deref_pbuz1 +ldy #0 +lda ({z1}),y +tay +//FRAGMENT vbuzz=_deref_pbuz1 +ldy #0 +lda ({z1}),y +taz //FRAGMENT 0_neq_vbuaa_then_la1 cmp #0 bne {la1} //FRAGMENT vbuz1=vbuaa sta {z1} +//FRAGMENT vbuaa_eq_vbuc1_then_la1 +cmp #{c1} +beq {la1} //FRAGMENT pbuz1_derefidx_vbuz2=vbuaa ldz {z2} sta ({z1}),z @@ -1333,6 +255,26 @@ sta ({z1}),y tza ldy #0 sta ({z1}),y +//FRAGMENT vbuxx_lt_vbuc1_then_la1 +cpx #{c1} +bcc {la1} +//FRAGMENT vbuxx=vbuc1 +ldx #{c1} +//FRAGMENT vbuzz=vbuc1 +ldz #{c1} +//FRAGMENT vbuxx_eq_vbuc1_then_la1 +cpx #{c1} +beq {la1} +//FRAGMENT vbuyy=vbuz1 +ldy {z1} +//FRAGMENT vbuyy_eq_vbuc1_then_la1 +cpy #{c1} +beq {la1} +//FRAGMENT vbuzz=vbuz1 +ldz {z1} +//FRAGMENT vbuzz_eq_vbuc1_then_la1 +cpz #{c1} +beq {la1} //FRAGMENT 0_neq_vbuxx_then_la1 cpx #0 bne {la1} @@ -1348,10 +290,20 @@ cpz #0 bne {la1} //FRAGMENT vbuaa=vbuzz tza +//FRAGMENT vbuyy_lt_vbuc1_then_la1 +cpy #{c1} +bcc {la1} +//FRAGMENT vbuyy=vbuc1 +ldy #{c1} //FRAGMENT vbuz1=vbuyy sty {z1} +//FRAGMENT vbuzz_lt_vbuc1_then_la1 +cpz #{c1} +bcc {la1} //FRAGMENT vbuz1=vbuzz stz {z1} +//FRAGMENT vbuaa=vbuc1 +lda #{c1} //FRAGMENT vbuxx=vbuaa tax //FRAGMENT vbuyy=_deref_pbuc1_plus_1 @@ -1388,6 +340,10 @@ asw {z1} asw {z1} asw {z1} asw {z1} +//FRAGMENT _deref_pbuc1=_deref_pbuc1_band_vbuc2 +lda #{c2} +and {c1} +sta {c1} //FRAGMENT vwuz1=vwuc1 lda #<{c1} sta {z1} @@ -1437,6 +393,9 @@ sta {z1} bcc !+ inc {z1}+1 !: +//FRAGMENT vbuz1=_deref_pbuc1 +lda {c1} +sta {z1} //FRAGMENT _deref_pwuc1=vwuz1 lda {z1} sta {c1} @@ -1452,6 +411,9 @@ lda {z1} sta {c1} lda {z1}+1 sta {c1}+1 +//FRAGMENT _deref_pbuc1=vbuz1 +lda {z1} +sta {c1} //FRAGMENT _deref_pwuc1=vwuc2 lda #<{c2} sta {c1} @@ -1598,6 +560,10 @@ sta ({z1}),y iny lda {z2}+1 sta ({z1}),y +//FRAGMENT vbuaa=_deref_pbuc1 +lda {c1} +//FRAGMENT vbuxx=_deref_pbuc1 +ldx {c1} //FRAGMENT _deref_qbuc1=_ptr_vbuxx txa sta {c1} @@ -1613,110 +579,27 @@ tza sta {c1} lda #0 sta {c1}+1 -//FRAGMENT _deref_pbuc1=_inc__deref_pbuc1 -inc {c1} +//FRAGMENT _deref_pbuc1=vbuxx +stx {c1} +//FRAGMENT vbuxx=_inc_vbuxx +inx +//FRAGMENT vbuyy=_inc_vbuyy +iny +//FRAGMENT vbuzz=_inc_vbuzz +inz +//FRAGMENT vbuyy=_deref_pbuc1 +ldy {c1} +//FRAGMENT _deref_pbuc1=vbuyy +sty {c1} +//FRAGMENT vbuzz=_deref_pbuc1 +ldz {c1} +//FRAGMENT _deref_pbuc1=vbuzz +stz {c1} //FRAGMENT vwuz1=vbuc1 lda #<{c1} sta {z1} lda #>{c1} sta {z1}+1 -//FRAGMENT _deref_pbuc1_eq_vbuz1_then_la1 -lda {c1} -cmp {z1} -beq {la1} -//FRAGMENT _deref_pbuc1=_dec__deref_pbuc1 -dec {c1} -//FRAGMENT pbuc1_derefidx_vbuz1=_inc_pbuc1_derefidx_vbuz1 -ldx {z1} -inc {c1},x -//FRAGMENT vbuz1=_byte0_vwuz2 -lda {z2} -sta {z1} -//FRAGMENT vbuz1=_byte1_vwuz2 -lda {z2}+1 -sta {z1} -//FRAGMENT vbuz1=vbuz2_bor_vbuz3 -lda {z2} -ora {z3} -sta {z1} -//FRAGMENT _deref_pbuc1_eq_vbuaa_then_la1 -cmp {c1} -beq {la1} -//FRAGMENT pbuc1_derefidx_vbuaa=_inc_pbuc1_derefidx_vbuaa -tax -inc {c1},x -//FRAGMENT pbuc1_derefidx_vbuxx=_inc_pbuc1_derefidx_vbuxx -inc {c1},x -//FRAGMENT vbuaa=_byte1_vwuz1 -lda {z1}+1 -//FRAGMENT vbuxx=_byte1_vwuz1 -ldx {z1}+1 -//FRAGMENT vbuz1=vbuxx_bor_vbuz2 -txa -ora {z2} -sta {z1} -//FRAGMENT vbuz1=vbuyy_bor_vbuz2 -tya -ora {z2} -sta {z1} -//FRAGMENT vbuz1=vbuzz_bor_vbuz2 -tza -ora {z2} -sta {z1} -//FRAGMENT vbuz1=vbuz2_bor_vbuaa -ora {z2} -sta {z1} -//FRAGMENT vbuz1=vbuxx_bor_vbuaa -stx $ff -ora $ff -sta {z1} -//FRAGMENT vbuz1=vbuyy_bor_vbuaa -sty $ff -ora $ff -sta {z1} -//FRAGMENT vbuz1=vbuzz_bor_vbuaa -tay -tza -sty $ff -ora $ff -sta {z1} -//FRAGMENT vbuz1=vbuz2_bor_vbuxx -txa -ora {z2} -sta {z1} -//FRAGMENT vbuz1=vbuxx_bor_vbuxx -stx {z1} -//FRAGMENT vbuyy=_byte1_vwuz1 -ldy {z1}+1 -//FRAGMENT vbuzz=_byte1_vwuz1 -lda {z1}+1 -taz -//FRAGMENT vbuz1=vbuz2_bor_vbuyy -tya -ora {z2} -sta {z1} -//FRAGMENT vbuz1=vbuz2_bor_vbuzz -tza -ora {z2} -sta {z1} -//FRAGMENT pbuc1_derefidx_vbuyy=_inc_pbuc1_derefidx_vbuyy -lda {c1},y -inc -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuzz=_inc_pbuc1_derefidx_vbuzz -tza -tax -inc {c1},x -//FRAGMENT _deref_pbuc1_eq_vbuxx_then_la1 -cpx {c1} -beq {la1} -//FRAGMENT _deref_pbuc1_eq_vbuyy_then_la1 -tya -cmp {c1} -beq {la1} -//FRAGMENT _deref_pbuc1_eq_vbuzz_then_la1 -cpz {c1} -beq {la1} //FRAGMENT vduz1=vduc1 lda #<{c1} sta {z1} @@ -1738,6 +621,14 @@ lda #{c1} clc adc {z2} sta {z1} +//FRAGMENT pbuc1_derefidx_vbuz1=vbuz2 +lda {z2} +ldy {z1} +sta {c1},y +//FRAGMENT pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz1 +ldy {z1} +lda {c2},y +sta {c1},y //FRAGMENT vwuz1=vwuc1_minus_vbuz2 sec lda #<{c1} @@ -1770,6 +661,27 @@ lda {z2} sta {z1} lda {z2}+1 sta {z1}+1 +//FRAGMENT vbuz1=_byte0_vwuz2 +lda {z2} +sta {z1} +//FRAGMENT vbuz1=vbuz2_rol_4 +lda {z2} +asl +asl +asl +asl +sta {z1} +//FRAGMENT vbuz1=_byte1_vwuz2 +lda {z2}+1 +sta {z1} +//FRAGMENT vbuz1=vbuz2_band_vbuc1 +lda #{c1} +and {z2} +sta {z1} +//FRAGMENT vbuz1=vbuz2_bor_vbuz3 +lda {z2} +ora {z3} +sta {z1} //FRAGMENT vduz1=vduz2_ror_4 lda {z2}+3 lsr @@ -1914,6 +826,35 @@ tza clc adc #{c1} taz +//FRAGMENT pbuc1_derefidx_vbuxx=vbuz1 +lda {z1} +sta {c1},x +//FRAGMENT pbuc1_derefidx_vbuyy=vbuz1 +lda {z1} +sta {c1},y +//FRAGMENT pbuc1_derefidx_vbuzz=vbuz1 +tza +tay +lda {z1} +sta {c1},y +//FRAGMENT pbuc1_derefidx_vbuz1=vbuaa +ldy {z1} +sta {c1},y +//FRAGMENT pbuc1_derefidx_vbuaa=pbuc2_derefidx_vbuaa +tay +lda {c2},y +sta {c1},y +//FRAGMENT pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx +lda {c2},x +sta {c1},x +//FRAGMENT pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuyy +lda {c2},y +sta {c1},y +//FRAGMENT pbuc1_derefidx_vbuzz=pbuc2_derefidx_vbuzz +tza +tay +lda {c2},y +sta {c1},y //FRAGMENT vwuz1=vwuc1_minus_vbuaa tax stx $ff @@ -2357,15 +1298,284 @@ dey bne !- !e: taz +//FRAGMENT vbuaa=vbuz1_rol_4 +lda {z1} +asl +asl +asl +asl +//FRAGMENT vbuxx=vbuz1_rol_4 +lda {z1} +asl +asl +asl +asl +tax +//FRAGMENT vbuyy=vbuz1_rol_4 +lda {z1} +asl +asl +asl +asl +tay +//FRAGMENT vbuzz=vbuz1_rol_4 +lda {z1} +asl +asl +asl +asl +taz +//FRAGMENT vbuz1=vbuxx_rol_4 +txa +asl +asl +asl +asl +sta {z1} +//FRAGMENT vbuaa=vbuxx_rol_4 +txa +asl +asl +asl +asl +//FRAGMENT vbuxx=vbuxx_rol_4 +txa +asl +asl +asl +asl +tax +//FRAGMENT vbuyy=vbuxx_rol_4 +txa +asl +asl +asl +asl +tay +//FRAGMENT vbuzz=vbuxx_rol_4 +txa +asl +asl +asl +asl +taz +//FRAGMENT vbuz1=vbuyy_rol_4 +tya +asl +asl +asl +asl +sta {z1} +//FRAGMENT vbuaa=vbuyy_rol_4 +tya +asl +asl +asl +asl +//FRAGMENT vbuxx=vbuyy_rol_4 +tya +asl +asl +asl +asl +tax +//FRAGMENT vbuyy=vbuyy_rol_4 +tya +asl +asl +asl +asl +tay +//FRAGMENT vbuzz=vbuyy_rol_4 +tya +asl +asl +asl +asl +taz +//FRAGMENT vbuz1=vbuzz_rol_4 +tza +asl +asl +asl +asl +sta {z1} +//FRAGMENT vbuaa=vbuzz_rol_4 +tza +asl +asl +asl +asl +//FRAGMENT vbuxx=vbuzz_rol_4 +tza +asl +asl +asl +asl +tax +//FRAGMENT vbuyy=vbuzz_rol_4 +tza +asl +asl +asl +asl +tay +//FRAGMENT vbuzz=vbuzz_rol_4 +tza +asl +asl +asl +asl +taz +//FRAGMENT vbuaa=_byte1_vwuz1 +lda {z1}+1 +//FRAGMENT vbuxx=_byte1_vwuz1 +ldx {z1}+1 +//FRAGMENT vbuz1=vbuaa_band_vbuc1 +and #{c1} +sta {z1} +//FRAGMENT vbuz1=vbuxx_band_vbuc1 +txa +and #{c1} +sta {z1} +//FRAGMENT vbuz1=vbuyy_band_vbuc1 +tya +and #{c1} +sta {z1} +//FRAGMENT vbuz1=vbuzz_band_vbuc1 +tza +and #{c1} +sta {z1} +//FRAGMENT vbuaa=vbuz1_band_vbuc1 +lda #{c1} +and {z1} +//FRAGMENT vbuaa=vbuaa_band_vbuc1 +and #{c1} +//FRAGMENT vbuaa=vbuxx_band_vbuc1 +txa +and #{c1} +//FRAGMENT vbuaa=vbuyy_band_vbuc1 +tya +and #{c1} +//FRAGMENT vbuaa=vbuzz_band_vbuc1 +tza +and #{c1} +//FRAGMENT vbuxx=vbuz1_band_vbuc1 +lda #{c1} +and {z1} +tax +//FRAGMENT vbuxx=vbuaa_band_vbuc1 +and #{c1} +tax +//FRAGMENT vbuxx=vbuxx_band_vbuc1 +txa +and #{c1} +tax +//FRAGMENT vbuxx=vbuyy_band_vbuc1 +tya +and #{c1} +tax +//FRAGMENT vbuxx=vbuzz_band_vbuc1 +tza +and #{c1} +tax +//FRAGMENT vbuyy=vbuz1_band_vbuc1 +lda #{c1} +and {z1} +tay +//FRAGMENT vbuyy=vbuaa_band_vbuc1 +and #{c1} +tay +//FRAGMENT vbuyy=vbuxx_band_vbuc1 +txa +and #{c1} +tay +//FRAGMENT vbuyy=vbuyy_band_vbuc1 +tya +and #{c1} +tay +//FRAGMENT vbuyy=vbuzz_band_vbuc1 +tza +and #{c1} +tay +//FRAGMENT vbuzz=vbuz1_band_vbuc1 +lda #{c1} +and {z1} +taz +//FRAGMENT vbuzz=vbuaa_band_vbuc1 +and #{c1} +taz +//FRAGMENT vbuzz=vbuxx_band_vbuc1 +txa +and #{c1} +taz +//FRAGMENT vbuzz=vbuyy_band_vbuc1 +tya +and #{c1} +taz +//FRAGMENT vbuzz=vbuzz_band_vbuc1 +tza +and #{c1} +taz +//FRAGMENT vbuz1=vbuxx_bor_vbuz2 +txa +ora {z2} +sta {z1} +//FRAGMENT vbuz1=vbuyy_bor_vbuz2 +tya +ora {z2} +sta {z1} +//FRAGMENT vbuz1=vbuzz_bor_vbuz2 +tza +ora {z2} +sta {z1} +//FRAGMENT vbuz1=vbuz2_bor_vbuaa +ora {z2} +sta {z1} +//FRAGMENT vbuz1=vbuxx_bor_vbuaa +stx $ff +ora $ff +sta {z1} +//FRAGMENT vbuz1=vbuyy_bor_vbuaa +sty $ff +ora $ff +sta {z1} +//FRAGMENT vbuz1=vbuzz_bor_vbuaa +tay +tza +sty $ff +ora $ff +sta {z1} +//FRAGMENT vbuz1=vbuz2_bor_vbuxx +txa +ora {z2} +sta {z1} +//FRAGMENT vbuz1=vbuxx_bor_vbuxx +stx {z1} //FRAGMENT vbuaa=_byte1_vduz1 lda {z1}+1 //FRAGMENT vbuxx=_byte1_vduz1 ldx {z1}+1 +//FRAGMENT vbuz1=vbuz2_bor_vbuyy +tya +ora {z2} +sta {z1} +//FRAGMENT vbuz1=vbuz2_bor_vbuzz +tza +ora {z2} +sta {z1} +//FRAGMENT vbuyy=_byte1_vwuz1 +ldy {z1}+1 +//FRAGMENT vbuzz=_byte1_vwuz1 +lda {z1}+1 +taz //FRAGMENT vbuyy=_byte1_vduz1 ldy {z1}+1 //FRAGMENT vbuzz=_byte1_vduz1 lda {z1}+1 taz +//FRAGMENT pbuc1_derefidx_vbuxx=vbuaa +sta {c1},x //FRAGMENT pbuc1_derefidx_vbuyy=vbuaa sta {c1},y //FRAGMENT pbuc1_derefidx_vbuzz=vbuaa @@ -2374,6 +1584,10 @@ tza tay txa sta {c1},y +//FRAGMENT pbuc1_derefidx_vbuz1=vbuxx +ldy {z1} +txa +sta {c1},y //FRAGMENT pbuc1_derefidx_vbuyy=vbuxx txa sta {c1},y @@ -2382,11 +1596,28 @@ tza tay txa sta {c1},y +//FRAGMENT pbuc1_derefidx_vbuz1=vbuyy +tya +ldy {z1} +sta {c1},y +//FRAGMENT pbuc1_derefidx_vbuxx=vbuyy +tya +sta {c1},x //FRAGMENT pbuc1_derefidx_vbuzz=vbuyy tza tax tya sta {c1},x +//FRAGMENT pbuc1_derefidx_vbuz1=vbuzz +ldy {z1} +tza +sta {c1},y +//FRAGMENT pbuc1_derefidx_vbuxx=vbuzz +tza +sta {c1},x +//FRAGMENT pbuc1_derefidx_vbuyy=vbuzz +tza +sta {c1},y //FRAGMENT vbuyy=vbuaa tay //FRAGMENT vbuzz=vbuaa diff --git a/src/main/fragment/cache/fragment-cache-mos6502.asm b/src/main/fragment/cache/fragment-cache-mos6502.asm index 75e546d7f..e1cc26dc0 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 8d6655dbd 8d6657e44 +//KICKC FRAGMENT CACHE 84ae04234 84ae062c1 //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 95db19821..f75e5f41b 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 8d6655dbd 8d6657e44 +//KICKC FRAGMENT CACHE 84ae04234 84ae062c1 //FRAGMENT vbuz1=vbuc1 lda #{c1} sta {z1} @@ -5919,8 +5919,6 @@ tax //FRAGMENT vbuyy=_byte_vduz1 lda {z1} tay -//FRAGMENT _deref_pbuc1=_dec__deref_pbuc1 -dec {c1} //FRAGMENT pbuz1_derefidx_vbuaa=vbuaa tay sta ({z1}),y @@ -6406,6 +6404,8 @@ sta {c1}+1 //FRAGMENT _deref_pbsc1=vbsc2 lda #{c2} sta {c1} +//FRAGMENT _deref_pbuc1=_dec__deref_pbuc1 +dec {c1} //FRAGMENT vbuz1=_dec_vbuz2 ldy {z2} dey @@ -13312,6 +13312,10 @@ sta ({z1}),y //FRAGMENT _deref_pbuc1=_byte_pprz1 lda {z1} sta {c1} +//FRAGMENT _stackidxbyte_vbuc1=vbuc2 +lda #{c2} +tsx +sta STACK_BASE+{c1},x //FRAGMENT vbuz1=vbuz2_band_pbuz3_derefidx_vbuc1 lda {z2} ldy #{c1} @@ -15789,36 +15793,6 @@ lda #<{c2} sta {c1} lda #>{c2} sta {c1}+1 -//FRAGMENT vbsaa=vbsc1 -lda #{c1} -//FRAGMENT vbsaa=_inc_vbsaa -clc -adc #1 -//FRAGMENT 0_neq_vbsyy_then_la1 -cpy #0 -bne {la1} -//FRAGMENT vbum1=vbum1_plus_vbuc1 -lax {m1} -axs #-[{c1}] -stx {m1} -//FRAGMENT pbuc1_derefidx_vbum1=pbuc2_derefidx_vbum2 -ldy {m2} -lda {c2},y -ldy {m1} -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuz1=pbuc1_derefidx_vbuz1_bor_vbuc2 -lda #{c2} -ldy {z1} -ora {c1},y -sta {c1},y -//FRAGMENT pbuc1_derefidx_vbuxx=pbuc1_derefidx_vbuxx_bor_vbuc2 -lda #{c2} -ora {c1},x -sta {c1},x -//FRAGMENT pbuc1_derefidx_vbuyy=pbuc1_derefidx_vbuyy_bor_vbuc2 -lda #{c2} -ora {c1},y -sta {c1},y //FRAGMENT vbsz1=vwsz2 lda {z2} sta {z1} @@ -16348,1000 +16322,33 @@ beq {la1} //FRAGMENT vbsyy_lt_0_then_la1 cpy #0 bmi {la1} -//FRAGMENT _stackidxbyte_vbuc1=vbuc2 -lda #{c2} -tsx -sta STACK_BASE+{c1},x -//FRAGMENT vwuz1=vwuz1_setbyte1_vbuz2 -lda {z2} -sta {z1}+1 -//FRAGMENT vwuz1=vwuz2_rol_vbuz3 -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -ldy {z3} -beq !e+ -!: -asl {z1} -rol {z1}+1 -dey -bne !- -!e: -//FRAGMENT vwuz1=vwuz1_setbyte1_vbuaa -sta {z1}+1 -//FRAGMENT vwuz1=vwuz2_rol_vbuxx -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -cpx #0 -beq !e+ -!: -asl {z1} -rol {z1}+1 -dex -bne !- -!e: -//FRAGMENT vwuz1=vwuz2_rol_vbuyy -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -cpy #0 -beq !e+ -!: -asl {z1} -rol {z1}+1 -dey -bne !- -!e: -//FRAGMENT vwuz1=vwuz1_setbyte1_vbuxx -stx {z1}+1 -//FRAGMENT vwuz1=vwuz1_setbyte1_vbuyy -sty {z1}+1 -//FRAGMENT vbsyy_ge_0_then_la1 -cpy #0 -bpl {la1} -//FRAGMENT vbuz1=vbuc1_plus__byte1_vwsz2 +//FRAGMENT vbsaa=vbsc1 lda #{c1} +//FRAGMENT vbsaa=_inc_vbsaa clc -adc {z2}+1 -sta {z1} -//FRAGMENT vwuz1=vwuz1_rol_vbuz2 -ldy {z2} -beq !e+ -!: -asl {z1} -rol {z1}+1 -dey -bne !- -!e: -//FRAGMENT pwsz1=pwsc1_plus_vwsz2 -lda #<{c1} -clc -adc {z2} -sta {z1} -lda #>{c1} -adc {z2}+1 -sta {z1}+1 -//FRAGMENT vdsz1=vdsz2 -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -lda {z2}+2 -sta {z1}+2 -lda {z2}+3 -sta {z1}+3 -//FRAGMENT vwsz1=_sword_vdsz2 -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -//FRAGMENT vduz1=vduz1_setword1_vwuz2 -lda {z2} -sta {z1}+2 -lda {z2}+1 -sta {z1}+3 -//FRAGMENT pwsz1=pwsc1_plus_vwsz1 -lda #<{c1} -clc -adc {z1} -sta {z1} -lda #>{c1} -adc {z1}+1 -sta {z1}+1 -//FRAGMENT vwsz1=_deref_pwsz1 -ldy #0 -lda ({z1}),y -pha -iny -lda ({z1}),y -sta {z1}+1 -pla -sta {z1} -//FRAGMENT vbuz1_ge_pbuc1_derefidx_vbuz2_then_la1 -lda {z1} -ldy {z2} -cmp {c1},y -bcs {la1} -//FRAGMENT vbuz1_ge_vbuz1_then_la1 -lda {z1} -cmp {z1} -bcs {la1} -//FRAGMENT vbuz1_le_pbuc1_derefidx_vbuz2_then_la1 -ldy {z2} -lda {c1},y -cmp {z1} -bcs {la1} -//FRAGMENT vbuz1_le_vbuz1_then_la1 -lda {z1} -cmp {z1} -bcs {la1} -//FRAGMENT vbuz1_gt_pbuc1_derefidx_vbuz2_then_la1 -ldy {z2} -lda {c1},y -cmp {z1} -bcc {la1} -//FRAGMENT vbuz1_gt_vbuz1_then_la1 -lda {z1} -cmp {z1} -bcc {la1} -//FRAGMENT vbuz1_lt_pbuc1_derefidx_vbuz2_then_la1 -lda {z1} -ldy {z2} -cmp {c1},y -bcc {la1} -//FRAGMENT vbuz1_lt_vbuz1_then_la1 -lda {z1} -cmp {z1} -bcc {la1} -//FRAGMENT vbuz1_neq_pbuc1_derefidx_vbuz2_then_la1 -lda {z1} -ldy {z2} -cmp {c1},y +adc #1 +//FRAGMENT 0_neq_vbsyy_then_la1 +cpy #0 bne {la1} -//FRAGMENT vbuz1_neq_vbuz1_then_la1 -lda {z1} -cmp {z1} -bne {la1} -//FRAGMENT vbuz1_ge_pbuc1_derefidx_vbuxx_then_la1 -txa -tay -lda {z1} -cmp {c1},y -bcs {la1} -//FRAGMENT vbuz1_ge_pbuc1_derefidx_vbuyy_then_la1 -lda {z1} -cmp {c1},y -bcs {la1} -//FRAGMENT vbuxx_ge_pbuc1_derefidx_vbuz1_then_la1 -ldy {z1} -txa -cmp {c1},y -bcs {la1} -//FRAGMENT vbuxx_ge_pbuc1_derefidx_vbuxx_then_la1 -txa -tay -cmp {c1},y -bcs {la1} -//FRAGMENT vbuxx_ge_pbuc1_derefidx_vbuyy_then_la1 -txa -cmp {c1},y -bcs {la1} -//FRAGMENT vbuyy_ge_pbuc1_derefidx_vbuz1_then_la1 -tya -ldy {z1} -cmp {c1},y -bcs {la1} -//FRAGMENT vbuyy_ge_pbuc1_derefidx_vbuxx_then_la1 -lda {c1},x -sta $ff -cpy $ff -bcs {la1} -//FRAGMENT vbuyy_ge_pbuc1_derefidx_vbuyy_then_la1 -tya -cmp {c1},y -bcs {la1} -//FRAGMENT vbuxx_ge_vbuxx_then_la1 -txa -stx $ff -cmp $ff -bcs {la1} -//FRAGMENT vbuyy_ge_vbuyy_then_la1 -tya -sta $ff -cpy $ff -bcs {la1} -//FRAGMENT vbuz1_le_pbuc1_derefidx_vbuxx_then_la1 -lda {c1},x -cmp {z1} -bcs {la1} -//FRAGMENT vbuz1_le_pbuc1_derefidx_vbuyy_then_la1 -lda {c1},y -cmp {z1} -bcs {la1} -//FRAGMENT vbuxx_le_pbuc1_derefidx_vbuz1_then_la1 -ldy {z1} -txa -cmp {c1},y -bcc {la1} -beq {la1} -//FRAGMENT vbuxx_le_pbuc1_derefidx_vbuxx_then_la1 -lda {c1},x -stx $ff -cmp $ff -bcs {la1} -//FRAGMENT vbuxx_le_pbuc1_derefidx_vbuyy_then_la1 -txa -cmp {c1},y -bcc {la1} -beq {la1} -//FRAGMENT vbuyy_le_pbuc1_derefidx_vbuz1_then_la1 -tya -ldy {z1} -cmp {c1},y -bcc {la1} -beq {la1} -//FRAGMENT vbuyy_le_pbuc1_derefidx_vbuxx_then_la1 -lda {c1},x -sty $ff -cmp $ff -bcs {la1} -//FRAGMENT vbuyy_le_pbuc1_derefidx_vbuyy_then_la1 -tya -cmp {c1},y -bcc {la1} -beq {la1} -//FRAGMENT vbuxx_le_vbuxx_then_la1 -txa -stx $ff -cmp $ff -bcs {la1} -//FRAGMENT vbuyy_le_vbuyy_then_la1 -tya -sta $ff -cpy $ff -bcs {la1} -//FRAGMENT vbuz1_gt_pbuc1_derefidx_vbuxx_then_la1 -lda {c1},x -cmp {z1} -bcc {la1} -//FRAGMENT vbuz1_gt_pbuc1_derefidx_vbuyy_then_la1 -lda {c1},y -cmp {z1} -bcc {la1} -//FRAGMENT vbuxx_gt_pbuc1_derefidx_vbuz1_then_la1 -ldy {z1} -txa -cmp {c1},y -beq !+ -bcs {la1} -!: -//FRAGMENT vbuxx_gt_pbuc1_derefidx_vbuxx_then_la1 -lda {c1},x -stx $ff -cmp $ff -bcc {la1} -//FRAGMENT vbuxx_gt_pbuc1_derefidx_vbuyy_then_la1 -txa -cmp {c1},y -beq !+ -bcs {la1} -!: -//FRAGMENT vbuyy_gt_pbuc1_derefidx_vbuz1_then_la1 -tya -ldy {z1} -cmp {c1},y -beq !+ -bcs {la1} -!: -//FRAGMENT vbuyy_gt_pbuc1_derefidx_vbuxx_then_la1 -lda {c1},x -tax -sty $ff -cpx $ff -bcc {la1} -//FRAGMENT vbuyy_gt_pbuc1_derefidx_vbuyy_then_la1 -tya -cmp {c1},y -beq !+ -bcs {la1} -!: -//FRAGMENT vbuxx_gt_vbuxx_then_la1 -txa -sta $ff -cpx $ff -bcc {la1} -//FRAGMENT vbuyy_gt_vbuyy_then_la1 -tya -sta $ff -cpy $ff -bcc {la1} -//FRAGMENT vbuz1_lt_pbuc1_derefidx_vbuxx_then_la1 -lda {c1},x -cmp {z1} -beq !+ -bcs {la1} -!: -//FRAGMENT vbuz1_lt_pbuc1_derefidx_vbuyy_then_la1 -lda {z1} -cmp {c1},y -bcc {la1} -//FRAGMENT vbuxx_lt_pbuc1_derefidx_vbuz1_then_la1 -ldy {z1} -txa -cmp {c1},y -bcc {la1} -//FRAGMENT vbuxx_lt_pbuc1_derefidx_vbuxx_then_la1 -txa -tay -cmp {c1},y -bcc {la1} -//FRAGMENT vbuxx_lt_pbuc1_derefidx_vbuyy_then_la1 -txa -cmp {c1},y -bcc {la1} -//FRAGMENT vbuyy_lt_pbuc1_derefidx_vbuz1_then_la1 -tya -ldy {z1} -cmp {c1},y -bcc {la1} -//FRAGMENT vbuyy_lt_pbuc1_derefidx_vbuxx_then_la1 -lda {c1},x -sta $ff -cpy $ff -bcc {la1} -//FRAGMENT vbuyy_lt_pbuc1_derefidx_vbuyy_then_la1 -tya -cmp {c1},y -bcc {la1} -//FRAGMENT vbuxx_lt_vbuxx_then_la1 -txa -sta $ff -cpx $ff -bcc {la1} -//FRAGMENT vbuyy_lt_vbuyy_then_la1 -tya -sta $ff -cpy $ff -bcc {la1} -//FRAGMENT vbuz1_neq_pbuc1_derefidx_vbuxx_then_la1 -lda {c1},x -cmp {z1} -bne {la1} -//FRAGMENT vbuz1_neq_pbuc1_derefidx_vbuyy_then_la1 -lda {c1},y -cmp {z1} -bne {la1} -//FRAGMENT vbuxx_neq_pbuc1_derefidx_vbuz1_then_la1 -ldy {z1} -txa -cmp {c1},y -bne {la1} -//FRAGMENT vbuxx_neq_pbuc1_derefidx_vbuxx_then_la1 -txa -tay -cmp {c1},y -bne {la1} -//FRAGMENT vbuxx_neq_pbuc1_derefidx_vbuyy_then_la1 -txa -cmp {c1},y -bne {la1} -//FRAGMENT vbuyy_neq_pbuc1_derefidx_vbuz1_then_la1 -tya -ldy {z1} -cmp {c1},y -bne {la1} -//FRAGMENT vbuyy_neq_pbuc1_derefidx_vbuxx_then_la1 -lda {c1},x -tax -stx $ff -cpy $ff -bne {la1} -//FRAGMENT vbuyy_neq_pbuc1_derefidx_vbuyy_then_la1 -tya -cmp {c1},y -bne {la1} -//FRAGMENT vbuxx_neq_vbuxx_then_la1 -txa -tay -stx $ff -cpy $ff -bne {la1} -//FRAGMENT vbuyy_neq_vbuyy_then_la1 -tya -tax -stx $ff -cpy $ff -bne {la1} -//FRAGMENT vwuz1=_word__deref_pbuc1 -lda {c1} -sta {z1} -lda #0 -sta {z1}+1 -//FRAGMENT pbuc1_derefidx_vbuz1=_byte_vwuz2 -ldy {z1} -lda {z2} +//FRAGMENT vbum1=vbum1_plus_vbuc1 +lax {m1} +axs #-[{c1}] +stx {m1} +//FRAGMENT pbuc1_derefidx_vbum1=pbuc2_derefidx_vbum2 +ldy {m2} +lda {c2},y +ldy {m1} sta {c1},y -//FRAGMENT vwuz1_ge_vwuc1_then_la1 -lda {z1}+1 -cmp #>{c1} -bcc !+ -bne {la1} -lda {z1} -cmp #<{c1} -bcs {la1} -!: -//FRAGMENT vwuz1_ge_vbuc1_then_la1 -lda {z1}+1 -bne {la1} -lda {z1} -cmp #{c1} -bcs {la1} -!: -//FRAGMENT pbuc1_derefidx_vbuxx=_byte_vwuz1 -lda {z1} +//FRAGMENT pbuc1_derefidx_vbuz1=pbuc1_derefidx_vbuz1_bor_vbuc2 +lda #{c2} +ldy {z1} +ora {c1},y +sta {c1},y +//FRAGMENT pbuc1_derefidx_vbuxx=pbuc1_derefidx_vbuxx_bor_vbuc2 +lda #{c2} +ora {c1},x sta {c1},x -//FRAGMENT vbsz1=pbsc1_derefidx_vbuz2_minus_pbsc2_derefidx_vbuz2 -ldy {z2} -lda {c1},y -sec -sbc {c2},y -sta {z1} -//FRAGMENT pbsz1=pbsc1 -lda #<{c1} -sta {z1} -lda #>{c1} -sta {z1}+1 -//FRAGMENT _deref_pbsz1=vbsz2 -lda {z2} -ldy #0 -sta ({z1}),y -//FRAGMENT pbsz1=_inc_pbsz1 -inc {z1} -bne !+ -inc {z1}+1 -!: -//FRAGMENT vbsaa=pbsc1_derefidx_vbuz1_minus_pbsc2_derefidx_vbuz1 -ldy {z1} -lda {c1},y -sec -sbc {c2},y -//FRAGMENT vbsxx=pbsc1_derefidx_vbuz1_minus_pbsc2_derefidx_vbuz1 -ldx {z1} -lda {c1},x -sec -sbc {c2},x -tax -//FRAGMENT vbsyy=pbsc1_derefidx_vbuz1_minus_pbsc2_derefidx_vbuz1 -ldy {z1} -lda {c1},y -sec -sbc {c2},y -tay -//FRAGMENT vbsz1=pbsc1_derefidx_vbuaa_minus_pbsc2_derefidx_vbuaa -tay -lda {c1},y -sec -sbc {c2},y -sta {z1} -//FRAGMENT vbsaa=pbsc1_derefidx_vbuaa_minus_pbsc2_derefidx_vbuaa -tay -lda {c1},y -sec -sbc {c2},y -//FRAGMENT vbsxx=pbsc1_derefidx_vbuaa_minus_pbsc2_derefidx_vbuaa -tax -lda {c1},x -sec -sbc {c2},x -tax -//FRAGMENT vbsyy=pbsc1_derefidx_vbuaa_minus_pbsc2_derefidx_vbuaa -tay -lda {c1},y -sec -sbc {c2},y -tay -//FRAGMENT vbsz1=pbsc1_derefidx_vbuxx_minus_pbsc2_derefidx_vbuxx -lda {c1},x -sec -sbc {c2},x -sta {z1} -//FRAGMENT vbsaa=pbsc1_derefidx_vbuxx_minus_pbsc2_derefidx_vbuxx -lda {c1},x -sec -sbc {c2},x -//FRAGMENT vbsxx=pbsc1_derefidx_vbuxx_minus_pbsc2_derefidx_vbuxx -lda {c1},x -sec -sbc {c2},x -tax -//FRAGMENT vbsyy=pbsc1_derefidx_vbuxx_minus_pbsc2_derefidx_vbuxx -lda {c1},x -sec -sbc {c2},x -tay -//FRAGMENT vbsz1=pbsc1_derefidx_vbuyy_minus_pbsc2_derefidx_vbuyy -lda {c1},y -sec -sbc {c2},y -sta {z1} -//FRAGMENT vbsaa=pbsc1_derefidx_vbuyy_minus_pbsc2_derefidx_vbuyy -lda {c1},y -sec -sbc {c2},y -//FRAGMENT vbsxx=pbsc1_derefidx_vbuyy_minus_pbsc2_derefidx_vbuyy -lda {c1},y -sec -sbc {c2},y -tax -//FRAGMENT vbsyy=pbsc1_derefidx_vbuyy_minus_pbsc2_derefidx_vbuyy -lda {c1},y -sec -sbc {c2},y -tay -//FRAGMENT _deref_pbsz1=vbsaa -ldy #0 -sta ({z1}),y -//FRAGMENT _deref_pbsz1=vbsxx -txa -ldy #0 -sta ({z1}),y -//FRAGMENT _deref_pbsz1=vbsyy -tya -ldy #0 -sta ({z1}),y -//FRAGMENT pwsz1=pwsc1_plus_vwuz2 -lda {z2} -clc -adc #<{c1} -sta {z1} -lda {z2}+1 -adc #>{c1} -sta {z1}+1 -//FRAGMENT vbsz1=vbsz2_minus_vbsz3 -lda {z2} -sec -sbc {z3} -sta {z1} -//FRAGMENT vbsz1=vbsxx_minus_vbsz2 -txa -sec -sbc {z2} -sta {z1} -//FRAGMENT vbsaa=vbsz1_minus_vbsz2 -lda {z1} -sec -sbc {z2} -//FRAGMENT vbsaa=vbsxx_minus_vbsz1 -txa -sec -sbc {z1} -//FRAGMENT vbsxx=vbsz1_minus_vbsz2 -lda {z1} -sec -sbc {z2} -tax -//FRAGMENT vbsyy=vbsz1_minus_vbsz2 -lda {z1} -sec -sbc {z2} -tay -//FRAGMENT vbsyy=vbsxx_minus_vbsz1 -txa -sec -sbc {z1} -tay -//FRAGMENT vbsz1=vbsz2_minus_vbsaa -eor #$ff -sec -adc {z2} -sta {z1} -//FRAGMENT vbsz1=vbsxx_minus_vbsaa -sta $ff -txa -sec -sbc $ff -sta {z1} -//FRAGMENT vbsaa=vbsz1_minus_vbsaa -eor #$ff -sec -adc {z1} -//FRAGMENT vbsaa=vbsxx_minus_vbsaa -sta $ff -txa -sec -sbc $ff -//FRAGMENT vbsxx=vbsz1_minus_vbsaa -eor #$ff -sec -adc {z1} -tax -//FRAGMENT vbsxx=vbsxx_minus_vbsaa -sta $ff -txa -sec -sbc $ff -tax -//FRAGMENT vbsyy=vbsz1_minus_vbsaa -eor #$ff -sec -adc {z1} -tay -//FRAGMENT vbsyy=vbsxx_minus_vbsaa -sta $ff -txa -sec -sbc $ff -tay -//FRAGMENT vbsz1=vbsz2_minus_vbsxx -txa -eor #$ff -sec -adc {z2} -sta {z1} -//FRAGMENT vbsz1=vbsxx_minus_vbsxx -lda #0 -sta {z1} -//FRAGMENT vbsaa=vbsz1_minus_vbsxx -txa -eor #$ff -sec -adc {z1} -//FRAGMENT vbsaa=vbsxx_minus_vbsxx -lda #0 -//FRAGMENT vbsxx=vbsz1_minus_vbsxx -txa -eor #$ff -sec -adc {z1} -tax -//FRAGMENT vbsyy=vbsz1_minus_vbsxx -txa -eor #$ff -sec -adc {z1} -tay -//FRAGMENT vbsyy=vbsxx_minus_vbsxx -lda #0 -tay -//FRAGMENT vbsz1=vbsz2_minus_vbsyy -tya -eor #$ff -sec -adc {z2} -sta {z1} -//FRAGMENT vbsz1=vbsxx_minus_vbsyy -txa -sty $ff -sec -sbc $ff -sta {z1} -//FRAGMENT vbsaa=vbsz1_minus_vbsyy -tya -eor #$ff -sec -adc {z1} -//FRAGMENT vbsaa=vbsxx_minus_vbsyy -txa -sty $ff -sec -sbc $ff -//FRAGMENT vbsxx=vbsz1_minus_vbsyy -tya -eor #$ff -sec -adc {z1} -tax -//FRAGMENT vbsyy=vbsz1_minus_vbsyy -tya -eor #$ff -sec -adc {z1} -tay -//FRAGMENT vbsyy=vbsxx_minus_vbsyy -txa -sty $ff -sec -sbc $ff -tay -//FRAGMENT pwsz1=pwsc1_plus_vwuz1 -lda {z1} -clc -adc #<{c1} -sta {z1} -lda {z1}+1 -adc #>{c1} -sta {z1}+1 -//FRAGMENT pbuz1=pbuz2_minus_vwuz3 -lda {z2} -sec -sbc {z3} -sta {z1} -lda {z2}+1 -sbc {z3}+1 -sta {z1}+1 -//FRAGMENT vwuz1=_deref_pbuz2_word__deref_pbuz3 -ldy #0 -lda ({z3}),y -sta {z1} -lda ({z2}),y -sta {z1}+1 -//FRAGMENT pwuz1=pwuz2 -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -//FRAGMENT vwuz1=pwuz2_derefidx_vbuz3 -ldy {z3} -lda ({z2}),y -sta {z1} -iny -lda ({z2}),y -sta {z1}+1 -//FRAGMENT vwuz1=pwuz2_minus_pwuz3 -lda {z2} -sec -sbc {z3} -sta {z1} -lda {z2}+1 -sbc {z3}+1 -sta {z1}+1 -//FRAGMENT _deref_pwuz1_le_vwuz2_then_la1 -ldy #1 -lda ({z1}),y -cmp {z2}+1 -bne !+ -dey -lda ({z1}),y -cmp {z2} -beq {la1} -!: -bcc {la1} -//FRAGMENT pwuz1=pwuz1_minus_vbuc1 -sec -lda {z1} -sbc #{c1} -sta {z1} -lda {z1}+1 -sbc #0 -sta {z1}+1 -//FRAGMENT pwuz1=pwuz2_plus_vbuz3 -lda {z3} -clc -adc {z2} -sta {z1} -lda #0 -adc {z2}+1 -sta {z1}+1 -//FRAGMENT vwsz1=vwsz2_minus__deref_pwsz3 -sec -lda {z2} -ldy #0 -sbc ({z3}),y -sta {z1} -lda {z2}+1 -iny -sbc ({z3}),y -sta {z1}+1 -//FRAGMENT vwsz1_le_0_then_la1 -lda {z1}+1 -bmi {la1} -bne !+ -lda {z1} -beq {la1} -!: -//FRAGMENT pwuz1=pwuz2_plus_vbuc1 -lda #{c1} -clc -adc {z2} -sta {z1} -lda #0 -adc {z2}+1 -sta {z1}+1 -//FRAGMENT vwuz1=pwuz2_derefidx_vbuaa -tay -lda ({z2}),y -sta {z1} -iny -lda ({z2}),y -sta {z1}+1 -//FRAGMENT vwuz1=pwuz2_derefidx_vbuxx -txa -tay -lda ({z2}),y -sta {z1} -iny -lda ({z2}),y -sta {z1}+1 -//FRAGMENT vwuz1=pwuz2_derefidx_vbuyy -lda ({z2}),y -sta {z1} -iny -lda ({z2}),y -sta {z1}+1 -//FRAGMENT pwuz1=pwuz2_plus_vbuaa -clc -adc {z2} -sta {z1} -lda #0 -adc {z2}+1 -sta {z1}+1 -//FRAGMENT pwuz1=pwuz2_plus_vbuxx -txa -clc -adc {z2} -sta {z1} -lda #0 -adc {z2}+1 -sta {z1}+1 -//FRAGMENT pwuz1=pwuz2_plus_vbuyy -tya -clc -adc {z2} -sta {z1} -lda #0 -adc {z2}+1 -sta {z1}+1 -//FRAGMENT pbuz1=pbuz2_minus_vwuz1 -lda {z2} -sec -sbc {z1} -sta {z1} -lda {z2}+1 -sbc {z1}+1 -sta {z1}+1 -//FRAGMENT vwuz1=pwuz1_minus_pwuz2 -lda {z1} -sec -sbc {z2} -sta {z1} -lda {z1}+1 -sbc {z2}+1 -sta {z1}+1 -//FRAGMENT vbsaa=pbsc1_derefidx_vbuxx -lda {c1},x -//FRAGMENT vbsaa=pbsc1_derefidx_vbuyy -lda {c1},y -//FRAGMENT vwsz1=_deref_pwsz2_minus__deref_pwsz3 -ldy #0 -lda ({z2}),y -sec -sbc ({z3}),y -sta {z1} -iny -lda ({z2}),y -sbc ({z3}),y -sta {z1}+1 -//FRAGMENT vwsz1=vwsz1_minus_vwsc1 -lda {z1} -sec -sbc #<{c1} -sta {z1} -lda {z1}+1 -sbc #>{c1} -sta {z1}+1 -//FRAGMENT vwuz1=vwuz2_plus__deref_pwuz3 -ldy #0 -clc -lda {z2} -adc ({z3}),y -sta {z1} -iny -lda {z2}+1 -adc ({z3}),y -sta {z1}+1 -//FRAGMENT pvoz1=_deref_qvoc1 -lda {c1} -sta {z1} -lda {c1}+1 -sta {z1}+1 -//FRAGMENT vbuz1=pbuc1_derefidx_(_deref_pbuc2) -ldy {c2} -lda {c1},y -sta {z1} -//FRAGMENT _deref_pwuc1=_inc__deref_pwuc1 -inc {c1} -bne !+ -inc {c1}+1 -!: -//FRAGMENT _deref_pwuc1_eq_vbuc2_then_la1 -lda {c1}+1 -bne !+ -lda {c1} -cmp #{c2} -beq {la1} -!: -//FRAGMENT _deref_(_deref_qbuc1)=_deref_pbuc2 -lda {c2} -ldy {c1} -sty $fe -ldy {c1}+1 -sty $ff -ldy #0 -sta ($fe),y -//FRAGMENT _deref_(_deref_qbuc1)=_deref_(_deref_qbuc1)_bxor_vbuc2 -ldy {c1} -sty $fe -ldy {c1}+1 -sty $ff -ldy #0 -lda ($fe),y -eor #{c2} -sta ($fe),y -//FRAGMENT pbuz1=_deref_qbuc1_plus_vwuz2 -clc -lda {z2} -adc {c1} -sta {z1} -lda {z2}+1 -adc {c1}+1 -sta {z1}+1 -//FRAGMENT pbuz1=pbuz2_plus__deref_pwuc1 -lda {c1} -clc -adc {z2} -sta {z1} -lda {c1}+1 -adc {z2}+1 -sta {z1}+1 -//FRAGMENT vbuaa=pbuc1_derefidx_(_deref_pbuc2) -ldy {c2} -lda {c1},y -//FRAGMENT vbuxx=pbuc1_derefidx_(_deref_pbuc2) -ldy {c2} -ldx {c1},y -//FRAGMENT vbuyy=pbuc1_derefidx_(_deref_pbuc2) -ldx {c2} -ldy {c1},x -//FRAGMENT vwuz1=_deref_pwuz1 -ldy #0 -lda ({z1}),y -pha -iny -lda ({z1}),y -sta {z1}+1 -pla -sta {z1} -//FRAGMENT vwuz1=_deref_pwuz1_plus__deref_pwuz2 -ldy #0 -clc -lda ({z1}),y -adc ({z2}),y -pha -iny -lda ({z1}),y -adc ({z2}),y -sta {z1}+1 -pla -sta {z1} -//FRAGMENT vwuz1=vwuz2_plus__deref_pwuz1 -ldy #0 -clc -lda ({z1}),y -adc {z2} -pha -iny -lda ({z1}),y -adc {z2}+1 -sta {z1}+1 -pla -sta {z1} -//FRAGMENT pbuz1=_deref_qbuc1_plus_vwuz1 -clc -lda {z1} -adc {c1} -sta {z1} -lda {z1}+1 -adc {c1}+1 -sta {z1}+1 -//FRAGMENT pbuz1=pbuz1_plus__deref_pwuc1 -clc -lda {z1} -adc {c1} -sta {z1} -lda {z1}+1 -adc {c1}+1 -sta {z1}+1 +//FRAGMENT pbuc1_derefidx_vbuyy=pbuc1_derefidx_vbuyy_bor_vbuc2 +lda #{c2} +ora {c1},y +sta {c1},y diff --git a/src/main/fragment/cache/fragment-cache-rom6502x.asm b/src/main/fragment/cache/fragment-cache-rom6502x.asm index 5aa122768..1737b3c38 100644 --- a/src/main/fragment/cache/fragment-cache-rom6502x.asm +++ b/src/main/fragment/cache/fragment-cache-rom6502x.asm @@ -1,4 +1,4 @@ -//KICKC FRAGMENT CACHE 8d6655dbd 8d6657e44 +//KICKC FRAGMENT CACHE 84ae04234 84ae062c1 //FRAGMENT _deref_pbuc1=_inc__deref_pbuc1 inc {c1} //FRAGMENT isr_hardware_all_entry diff --git a/src/main/fragment/cache/fragment-cache-wdc65c02.asm b/src/main/fragment/cache/fragment-cache-wdc65c02.asm index b364909c1..e4532b420 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 8d6655dbd 8d6657e44 +//KICKC FRAGMENT CACHE 84ae04234 84ae062c1 //FRAGMENT vbuz1=_deref_pbuc1 lda {c1} sta {z1} @@ -244,81 +244,3 @@ inc //FRAGMENT vbuyy_neq_vbuc1_then_la1 cpy #{c1} bne {la1} -//FRAGMENT 0_neq_pbuc1_derefidx_vbuz1_then_la1 -ldy {z1} -lda {c1},y -cmp #0 -bne {la1} -//FRAGMENT pbuz1=pbuz2 -lda {z2} -sta {z1} -lda {z2}+1 -sta {z1}+1 -//FRAGMENT vbuz1=pbuc1_derefidx_vbuz2 -ldy {z2} -lda {c1},y -sta {z1} -//FRAGMENT pbuz1=_inc_pbuz2 -clc -lda {z2} -adc #1 -sta {z1} -lda {z2}+1 -adc #0 -sta {z1}+1 -//FRAGMENT _deref_pbuc1=_deref_pbuz1 -ldy #0 -lda ({z1}),y -sta {c1} -//FRAGMENT vbuz1=_byte0_pbuz2 -lda {z2} -sta {z1} -//FRAGMENT vbuz1=_byte1_pbuz2 -lda {z2}+1 -sta {z1} -//FRAGMENT 0_neq_pbuc1_derefidx_vbuaa_then_la1 -tay -lda {c1},y -cmp #0 -bne {la1} -//FRAGMENT 0_neq_pbuc1_derefidx_vbuxx_then_la1 -lda {c1},x -cmp #0 -bne {la1} -//FRAGMENT 0_neq_pbuc1_derefidx_vbuyy_then_la1 -lda {c1},y -cmp #0 -bne {la1} -//FRAGMENT vbuz1=pbuc1_derefidx_vbuxx -lda {c1},x -sta {z1} -//FRAGMENT vbuz1=pbuc1_derefidx_vbuyy -lda {c1},y -sta {z1} -//FRAGMENT vbuaa=pbuc1_derefidx_vbuz1 -ldy {z1} -lda {c1},y -//FRAGMENT vbuaa=pbuc1_derefidx_vbuxx -lda {c1},x -//FRAGMENT vbuaa=pbuc1_derefidx_vbuyy -lda {c1},y -//FRAGMENT vbuxx=pbuc1_derefidx_vbuz1 -ldy {z1} -ldx {c1},y -//FRAGMENT vbuaa=_byte0_pbuz1 -lda {z1} -//FRAGMENT vbuxx=_byte0_pbuz1 -ldx {z1} -//FRAGMENT vbuaa=_byte1_pbuz1 -lda {z1}+1 -//FRAGMENT vbuxx=_byte1_pbuz1 -ldx {z1}+1 -//FRAGMENT vbuyy=_byte0_pbuz1 -ldy {z1} -//FRAGMENT vbuyy=_byte1_pbuz1 -ldy {z1}+1 -//FRAGMENT vbuyy=pbuc1_derefidx_vbuz1 -ldx {z1} -ldy {c1},x -//FRAGMENT vbuxx=pbuc1_derefidx_vbuyy -ldx {c1},y diff --git a/src/main/fragment/mos6502-common/call__deref_pprc1.asm b/src/main/fragment/mos6502-common/call__deref_pprc1.asm new file mode 100644 index 000000000..0fd13c7be --- /dev/null +++ b/src/main/fragment/mos6502-common/call__deref_pprc1.asm @@ -0,0 +1 @@ +jsr {c1} \ No newline at end of file diff --git a/src/main/fragment/mos6502-selfmod/call__deref_(qprz1_derefidx_vbuyy).asm b/src/main/fragment/mos6502-selfmod/call__deref_(qprz1_derefidx_vbuyy).asm new file mode 100644 index 000000000..3f4824c99 --- /dev/null +++ b/src/main/fragment/mos6502-selfmod/call__deref_(qprz1_derefidx_vbuyy).asm @@ -0,0 +1,7 @@ +lda ({z1}),y +sta !+ +1 +iny +lda ({z1}),y +sta !+ +2 +!: +jsr $0000 \ No newline at end of file diff --git a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentInstanceSpecBuilder.java b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentInstanceSpecBuilder.java index c0c66243c..f8f626ba5 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentInstanceSpecBuilder.java +++ b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentInstanceSpecBuilder.java @@ -58,6 +58,24 @@ public class AsmFragmentInstanceSpecBuilder { return new AsmFragmentInstanceSpecBuilder(program, bindings, fragmentInstanceSpec); } + /** + * Create a fragment instance spec factory for an indirect call + * @return the fragment instance spec factory + */ + public static AsmFragmentInstanceSpecBuilder call(StatementCallExecute call, Program program) { + return new AsmFragmentInstanceSpecBuilder(call, program); + } + + private AsmFragmentInstanceSpecBuilder(StatementCallExecute call, Program program) { + this.program = program; + this.bindings = new LinkedHashMap<>(); + ScopeRef codeScope = program.getStatementInfos().getBlock(call).getScope(); + StringBuilder signature = new StringBuilder(); + signature.append("call_"); + signature.append(bind(call.getProcedureRVal())); + this.asmFragmentInstanceSpec = new AsmFragmentInstanceSpec(program, signature.toString(), bindings, codeScope); + } + /** * Create a fragment instance spec factory for an interrupt routine entry * diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java index 898b9fddb..3591b0fb2 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java @@ -17,7 +17,6 @@ import dk.camelot64.kickc.model.values.*; import dk.camelot64.kickc.passes.calcs.PassNCalcVariableReferenceInfos; import dk.camelot64.kickc.passes.utils.SizeOfConstants; -import java.io.File; import java.util.*; /** @@ -658,17 +657,17 @@ public class Pass4CodeGeneration { ConstantValue memberValue = structValue.getValue(memberRef); Variable memberVariable = getScope().getVar(memberRef); addChunkData(dataChunk, memberValue, memberVariable.getType(), memberVariable.getArraySpec(), scopeRef); - size += SymbolTypeStruct.getMemberSizeBytes(memberVariable.getType(), memberVariable.getArraySize(), getScope()); + size += SymbolTypeStruct.getMemberSizeBytes(memberVariable.getType(), memberVariable.getArraySize(), getScope()); } // Add padding if this is a union and the first member does not use all bytes final int declaredSize = structValue.getStructType().getSizeBytes(); - if(sizehandler(task->param); +} + +struct Task tasks[] = { + { 0, &set_border }, + { 0, &set_bg }, + { 1, &set_border }, + { 2, &set_bg } +}; + + +void main() { + for(;;) { + for(char i=0; i < sizeof(tasks)/sizeof(struct Task); i++) { + run(tasks+i); + } + } +} \ No newline at end of file diff --git a/src/test/ref/examples/c64/music/music.log b/src/test/ref/examples/c64/music/music.log index 414cd612b..137684283 100644 --- a/src/test/ref/examples/c64/music/music.log +++ b/src/test/ref/examples/c64/music/music.log @@ -1,5 +1,5 @@ Inlined call vicSelectGfxBank::$0 = call toDd00(vicSelectGfxBank::gfx) -Inlined call call __init +Inlined call call __init Calling convention STACK_CALL adding prepare/execute/finalize for call *musicInit Calling convention STACK_CALL adding prepare/execute/finalize for call *musicPlay @@ -31,7 +31,7 @@ __start: scope:[__start] from __start::__init1: scope:[__start] from __start to:__start::@1 __start::@1: scope:[__start] from __start::__init1 - call main + call main to:__start::@2 __start::@2: scope:[__start] from __start::@1 to:__start::@return @@ -158,7 +158,7 @@ ASSEMBLER BEFORE OPTIMIZATION // main // Play the music main: { - // [1] callexecute *musicInit + // [1] callexecute *musicInit -- call__deref_pprc1 // Initialize the music jsr musicInit jmp __b1 @@ -174,7 +174,7 @@ main: { __b2: // [3] *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = ++ *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) -- _deref_pbuc1=_inc__deref_pbuc1 inc VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR - // [4] callexecute *musicPlay + // [4] callexecute *musicPlay -- call__deref_pprc1 // Play the music jsr musicPlay jmp __b3 @@ -249,7 +249,7 @@ Score: 1066 // Play the music main: { // (*musicInit)() - // [1] callexecute *musicInit + // [1] callexecute *musicInit -- call__deref_pprc1 // Initialize the music jsr musicInit // Wait for the RASTER @@ -265,7 +265,7 @@ main: { // [3] *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = ++ *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) -- _deref_pbuc1=_inc__deref_pbuc1 inc VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR // (*musicPlay)() - // [4] callexecute *musicPlay + // [4] callexecute *musicPlay -- call__deref_pprc1 // Play the music jsr musicPlay // main::@3 diff --git a/src/test/ref/examples/c64/music/music_irq.log b/src/test/ref/examples/c64/music/music_irq.log index c7d3ee11c..bec201918 100644 --- a/src/test/ref/examples/c64/music/music_irq.log +++ b/src/test/ref/examples/c64/music/music_irq.log @@ -1,6 +1,6 @@ Resolved forward reference irq_play to __interrupt(rom_sys_c64) void irq_play() Inlined call vicSelectGfxBank::$0 = call toDd00(vicSelectGfxBank::gfx) -Inlined call call __init +Inlined call call __init Calling convention STACK_CALL adding prepare/execute/finalize for call *musicInit Calling convention STACK_CALL adding prepare/execute/finalize for call *musicPlay @@ -42,7 +42,7 @@ __start: scope:[__start] from __start::__init1: scope:[__start] from __start to:__start::@1 __start::@1: scope:[__start] from __start::__init1 - call main + call main to:__start::@2 __start::@2: scope:[__start] from __start::@1 to:__start::@return @@ -220,7 +220,7 @@ irq_play: { // interrupt(isr_rom_sys_c64_entry) -- isr_rom_sys_c64_entry // [0] *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = ++ *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) -- _deref_pbuc1=_inc__deref_pbuc1 inc VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR - // [1] callexecute *musicPlay + // [1] callexecute *musicPlay -- call__deref_pprc1 // Play SID jsr musicPlay jmp __b1 @@ -244,7 +244,7 @@ irq_play: { main: { // asm { sei } sei - // [6] callexecute *musicInit + // [6] callexecute *musicInit -- call__deref_pprc1 jsr musicInit jmp __b1 // main::@1 @@ -378,7 +378,7 @@ irq_play: { // [0] *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = ++ *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) -- _deref_pbuc1=_inc__deref_pbuc1 inc VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR // (*musicPlay)() - // [1] callexecute *musicPlay + // [1] callexecute *musicPlay -- call__deref_pprc1 // Play SID jsr musicPlay // irq_play::@1 @@ -403,7 +403,7 @@ main: { // asm { sei } sei // (*musicInit)() - // [6] callexecute *musicInit + // [6] callexecute *musicInit -- call__deref_pprc1 jsr musicInit // main::@1 // CIA1->INTERRUPT = CIA_INTERRUPT_CLEAR diff --git a/src/test/ref/examples/mega65/banked-music.log b/src/test/ref/examples/mega65/banked-music.log index 44ed579b0..b6160a529 100644 --- a/src/test/ref/examples/mega65/banked-music.log +++ b/src/test/ref/examples/mega65/banked-music.log @@ -52,7 +52,7 @@ Setting inferred volatile on symbol affected by address-of: memoryRemap256M::xVa Setting inferred volatile on symbol affected by address-of: memoryRemap256M::yVal in asm { ldalMb ldx#$0f ldyuMb ldz#$0f map ldaaVal ldxxVal ldyyVal ldzzVal map eom } Setting inferred volatile on symbol affected by address-of: memoryRemap256M::zVal in asm { ldalMb ldx#$0f ldyuMb ldz#$0f map ldaaVal ldxxVal ldyyVal ldzzVal map eom } Inlined call vicSelectGfxBank::$0 = call toDd00(vicSelectGfxBank::gfx) -Inlined call call __init +Inlined call call __init Eliminating unused variable with no statement memoryRemap::$0 Eliminating unused variable with no statement memoryRemap::$4 Eliminating unused variable with no statement memoryRemap::$5 @@ -98,7 +98,7 @@ memoryRemapBlock: scope:[memoryRemapBlock] from irq main::@6 memoryRemap::remapBlocks#0 = memoryRemapBlock::blockBits#0 memoryRemap::lowerPageOffset#0 = memoryRemapBlock::pageOffset#0 memoryRemap::upperPageOffset#0 = memoryRemapBlock::pageOffset#0 - call memoryRemap + call memoryRemap to:memoryRemapBlock::@1 memoryRemapBlock::@1: scope:[memoryRemapBlock] from memoryRemapBlock to:memoryRemapBlock::@return @@ -136,7 +136,7 @@ main: scope:[main] from __start::@1 memoryRemap::remapBlocks#1 = 0 memoryRemap::lowerPageOffset#1 = 0 memoryRemap::upperPageOffset#1 = 0 - call memoryRemap + call memoryRemap to:main::@5 main::@5: scope:[main] from main *((byte*)VICIII+OFFSET_STRUCT_MOS4569_VICIII_KEY) = $47 @@ -152,12 +152,12 @@ main::@5: scope:[main] from main memcpy_dma4::src_bank#0 = 0 memcpy_dma4::src#0 = (void*)upperCodeData memcpy_dma4::num#0 = main::$1 - call memcpy_dma4 + call memcpy_dma4 to:main::@6 main::@6: scope:[main] from main::@5 memoryRemapBlock::blockPage#0 = $40 memoryRemapBlock::memoryPage#0 = $100 - call memoryRemapBlock + call memoryRemapBlock to:main::@7 main::@7: scope:[main] from main::@6 asm { lda#0 } @@ -167,7 +167,7 @@ main::@1: scope:[main] from main::@7 memoryRemap::remapBlocks#2 = 0 memoryRemap::lowerPageOffset#2 = 0 memoryRemap::upperPageOffset#2 = 0 - call memoryRemap + call memoryRemap to:main::@8 main::@8: scope:[main] from main::@1 *((byte*)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR @@ -206,7 +206,7 @@ irq: scope:[irq] from *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = ++ *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) memoryRemapBlock::blockPage#1 = $40 memoryRemapBlock::memoryPage#1 = $100 - call memoryRemapBlock + call memoryRemapBlock to:irq::@4 irq::@4: scope:[irq] from irq callexecute *musicPlay @@ -215,7 +215,7 @@ irq::@1: scope:[irq] from irq::@4 memoryRemap::remapBlocks#3 = 0 memoryRemap::lowerPageOffset#3 = 0 memoryRemap::upperPageOffset#3 = 0 - call memoryRemap + call memoryRemap to:irq::@5 irq::@5: scope:[irq] from irq::@1 irq::raster#0 = *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) @@ -238,7 +238,7 @@ __start: scope:[__start] from __start::__init1: scope:[__start] from __start to:__start::@1 __start::@1: scope:[__start] from __start::__init1 - call main + call main to:__start::@2 __start::@2: scope:[__start] from __start::@1 to:__start::@return @@ -666,7 +666,7 @@ __interrupt(hardware_clobber) void irq() irq: scope:[irq] from [0] *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS) = IRQ_RASTER [1] *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = ++ *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) - [2] call memoryRemapBlock + [2] call memoryRemapBlock to:irq::@4 irq::@4: scope:[irq] from irq [3] phi() @@ -674,7 +674,7 @@ irq::@4: scope:[irq] from irq to:irq::@1 irq::@1: scope:[irq] from irq::@4 [5] phi() - [6] call memoryRemap + [6] call memoryRemap to:irq::@5 irq::@5: scope:[irq] from irq::@1 [7] irq::raster#0 = *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_RASTER) @@ -692,7 +692,7 @@ irq::@return: scope:[irq] from irq::@3 void main() main: scope:[main] from asm { sei } - [12] call memoryRemap + [12] call memoryRemap to:main::@5 main::@5: scope:[main] from main [13] *((byte*)VICIII+OFFSET_STRUCT_MOS4569_VICIII_KEY) = $47 @@ -702,11 +702,11 @@ main::@5: scope:[main] from main [17] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [18] *PROCPORT = PROCPORT_RAM_IO [19] *((byte*)VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_LO) = 1 - [20] call memcpy_dma4 + [20] call memcpy_dma4 to:main::@6 main::@6: scope:[main] from main::@5 [21] phi() - [22] call memoryRemapBlock + [22] call memoryRemapBlock to:main::@7 main::@7: scope:[main] from main::@6 asm { lda#0 } @@ -714,7 +714,7 @@ main::@7: scope:[main] from main::@6 to:main::@1 main::@1: scope:[main] from main::@7 [25] phi() - [26] call memoryRemap + [26] call memoryRemap to:main::@8 main::@8: scope:[main] from main::@1 [27] *((byte*)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR @@ -741,7 +741,7 @@ main::@4: scope:[main] from main::@3 void memoryRemapBlock(byte memoryRemapBlock::blockPage , word memoryRemapBlock::memoryPage) memoryRemapBlock: scope:[memoryRemapBlock] from irq main::@6 [40] phi() - [41] call memoryRemap + [41] call memoryRemap to:memoryRemapBlock::@return memoryRemapBlock::@return: scope:[memoryRemapBlock] from memoryRemapBlock [42] return @@ -1137,7 +1137,7 @@ irq: { sta VICII+OFFSET_STRUCT_MOS6569_VICII_IRQ_STATUS // [1] *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = ++ *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) -- _deref_pbuc1=_inc__deref_pbuc1 inc VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR - // [2] call memoryRemapBlock + // [2] call memoryRemapBlock // Remap memory to put music at $4000 // [40] phi from irq to memoryRemapBlock [phi:irq->memoryRemapBlock] memoryRemapBlock_from_irq: @@ -1147,7 +1147,7 @@ irq: { jmp __b4 // irq::@4 __b4: - // [4] callexecute *musicPlay + // [4] callexecute *musicPlay -- call__deref_pprc1 // Play remapped SID jsr musicPlay // [5] phi from irq::@4 to irq::@1 [phi:irq::@4->irq::@1] @@ -1155,7 +1155,7 @@ irq: { jmp __b1 // irq::@1 __b1: - // [6] call memoryRemap + // [6] call memoryRemap // Reset memory mapping // [43] phi from irq::@1 to memoryRemap [phi:irq::@1->memoryRemap] memoryRemap_from___b1: @@ -1205,7 +1205,7 @@ main: { // asm { sei } // Stop IRQ's sei - // [12] call memoryRemap + // [12] call memoryRemap // Map memory to BANK 0 : 0x00XXXX - giving access to I/O // [43] phi from main to memoryRemap [phi:main->memoryRemap] memoryRemap_from_main: @@ -1252,7 +1252,7 @@ main: { // open sideborder lda #1 sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_LO - // [20] call memcpy_dma4 + // [20] call memcpy_dma4 // Transfer banked code/data to upper memory ($10000) jsr memcpy_dma4 // [21] phi from main::@5 to main::@6 [phi:main::@5->main::@6] @@ -1260,7 +1260,7 @@ main: { jmp __b6 // main::@6 __b6: - // [22] call memoryRemapBlock + // [22] call memoryRemapBlock // Remap [$4000-$5fff] to point to [$10000-$11fff] // [40] phi from main::@6 to memoryRemapBlock [phi:main::@6->memoryRemapBlock] memoryRemapBlock_from___b6: @@ -1271,14 +1271,14 @@ main: { // asm { lda#0 } // Initialize SID lda #0 - // [24] callexecute *musicInit + // [24] callexecute *musicInit -- call__deref_pprc1 jsr musicInit // [25] phi from main::@7 to main::@1 [phi:main::@7->main::@1] __b1_from___b7: jmp __b1 // main::@1 __b1: - // [26] call memoryRemap + // [26] call memoryRemap // Reset memory mapping // [43] phi from main::@1 to memoryRemap [phi:main::@1->memoryRemap] memoryRemap_from___b1: @@ -1374,7 +1374,7 @@ memoryRemapBlock: { // Which block is being remapped? (0-7) .const block = $40>>5 .const blockBits = 1<memoryRemap] memoryRemap_from_memoryRemapBlock: // [43] phi memoryRemap::upperPageOffset#4 = memoryRemapBlock::pageOffset#0 [phi:memoryRemapBlock->memoryRemap#0] -- vwuz1=vwuc1 @@ -1839,20 +1839,20 @@ irq: { // [1] *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = ++ *((byte*)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) -- _deref_pbuc1=_inc__deref_pbuc1 inc VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR // memoryRemapBlock(0x40, 0x100) - // [2] call memoryRemapBlock + // [2] call memoryRemapBlock // Remap memory to put music at $4000 // [40] phi from irq to memoryRemapBlock [phi:irq->memoryRemapBlock] jsr memoryRemapBlock // [3] phi from irq to irq::@4 [phi:irq->irq::@4] // irq::@4 // (*musicPlay)() - // [4] callexecute *musicPlay + // [4] callexecute *musicPlay -- call__deref_pprc1 // Play remapped SID jsr musicPlay // [5] phi from irq::@4 to irq::@1 [phi:irq::@4->irq::@1] // irq::@1 // memoryRemap(0,0,0) - // [6] call memoryRemap + // [6] call memoryRemap // Reset memory mapping // [43] phi from irq::@1 to memoryRemap [phi:irq::@1->memoryRemap] // [43] phi memoryRemap::upperPageOffset#4 = 0 [phi:irq::@1->memoryRemap#0] -- vwuz1=vbuc1 @@ -1897,7 +1897,7 @@ main: { // Stop IRQ's sei // memoryRemap(0,0,0) - // [12] call memoryRemap + // [12] call memoryRemap // Map memory to BANK 0 : 0x00XXXX - giving access to I/O // [43] phi from main to memoryRemap [phi:main->memoryRemap] // [43] phi memoryRemap::upperPageOffset#4 = 0 [phi:main->memoryRemap#0] -- vwuz1=vbuc1 @@ -1946,13 +1946,13 @@ main: { lda #1 sta VICIV+OFFSET_STRUCT_MEGA65_VICIV_SIDBDRWD_LO // memcpy_dma4(1, (void*)0x0000, 0, upperCodeData, MUSIC_END-MUSIC) - // [20] call memcpy_dma4 + // [20] call memcpy_dma4 // Transfer banked code/data to upper memory ($10000) jsr memcpy_dma4 // [21] phi from main::@5 to main::@6 [phi:main::@5->main::@6] // main::@6 // memoryRemapBlock(0x40, 0x100) - // [22] call memoryRemapBlock + // [22] call memoryRemapBlock // Remap [$4000-$5fff] to point to [$10000-$11fff] // [40] phi from main::@6 to memoryRemapBlock [phi:main::@6->memoryRemapBlock] jsr memoryRemapBlock @@ -1962,12 +1962,12 @@ main: { // Initialize SID lda #0 // (*musicInit)() - // [24] callexecute *musicInit + // [24] callexecute *musicInit -- call__deref_pprc1 jsr musicInit // [25] phi from main::@7 to main::@1 [phi:main::@7->main::@1] // main::@1 // memoryRemap(0,0,0) - // [26] call memoryRemap + // [26] call memoryRemap // Reset memory mapping // [43] phi from main::@1 to memoryRemap [phi:main::@1->memoryRemap] // [43] phi memoryRemap::upperPageOffset#4 = 0 [phi:main::@1->memoryRemap#0] -- vwuz1=vbuc1 @@ -2062,7 +2062,7 @@ memoryRemapBlock: { .const block = $40>>5 .const blockBits = 1<memoryRemap] // [43] phi memoryRemap::upperPageOffset#4 = memoryRemapBlock::pageOffset#0 [phi:memoryRemapBlock->memoryRemap#0] -- vwuz1=vwuc1 lda #main::@1] __b1_from_main: jmp __b1 // main::@1 __b1: - // [118] call memset + // [118] call memset // Clear screen // [144] phi from main::@1 to memset [phi:main::@1->memset] memset_from___b1: @@ -3396,7 +3396,7 @@ __start: { sta.z greet_idx // [6] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1] // __start::@1 - // [7] call main + // [7] call main jsr main // __start::@return // [8] return @@ -3449,7 +3449,7 @@ irq: { // [16] phi from irq::@2 to irq::@4 [phi:irq::@2->irq::@4] // irq::@4 // (*songPlay)() - // [17] callexecute *songPlay + // [17] callexecute *songPlay -- call__deref_pprc1 // play music jsr songPlay // irq::@1 @@ -3946,12 +3946,12 @@ main: { // Initialize music lda #0 // (*songInit)() - // [116] callexecute *songInit + // [116] callexecute *songInit -- call__deref_pprc1 jsr songInit // [117] phi from main to main::@1 [phi:main->main::@1] // main::@1 // memset(SCREEN, ' ', 40*25) - // [118] call memset + // [118] call memset // Clear screen // [144] phi from main::@1 to memset [phi:main::@1->memset] jsr memset diff --git a/src/test/ref/function-pointer-return-2.asm b/src/test/ref/function-pointer-return-2.asm index 9839be346..b6816ed79 100644 --- a/src/test/ref/function-pointer-return-2.asm +++ b/src/test/ref/function-pointer-return-2.asm @@ -1,5 +1,5 @@ -// Calling a function pointer with parameters -// Reference the function without & +// Calling a function pointer with return value +// Reference the function without &, Call it without * // Commodore 64 PRG executable file .file [name="function-pointer-return-2.prg", type="prg", segments="Program"] .segmentdef Program [segments="Basic, Code, Data"] diff --git a/src/test/ref/function-pointer-return-2.log b/src/test/ref/function-pointer-return-2.log index e35dcb7f9..52b6e622d 100644 --- a/src/test/ref/function-pointer-return-2.log +++ b/src/test/ref/function-pointer-return-2.log @@ -238,8 +238,8 @@ Uplifting [] best 194 combination ASSEMBLER BEFORE OPTIMIZATION // File Comments -// Calling a function pointer with parameters -// Reference the function without & +// Calling a function pointer with return value +// Reference the function without &, Call it without * // Upstart // Commodore 64 PRG executable file .file [name="function-pointer-return-2.prg", type="prg", segments="Program"] @@ -391,8 +391,8 @@ FINAL ASSEMBLER Score: 95 // File Comments -// Calling a function pointer with parameters -// Reference the function without & +// Calling a function pointer with return value +// Reference the function without &, Call it without * // Upstart // Commodore 64 PRG executable file .file [name="function-pointer-return-2.prg", type="prg", segments="Program"] diff --git a/src/test/ref/function-pointer-return-3.asm b/src/test/ref/function-pointer-return-3.asm new file mode 100644 index 000000000..e394863ad --- /dev/null +++ b/src/test/ref/function-pointer-return-3.asm @@ -0,0 +1,94 @@ +// Calling a function pointer with return value +// Calling a function pointer inside a struct without * + // Commodore 64 PRG executable file +.file [name="function-pointer-return-3.prg", type="prg", segments="Program"] +.segmentdef Program [segments="Basic, Code, Data"] +.segmentdef Basic [start=$0801] +.segmentdef Code [start=$80d] +.segmentdef Data [startAfter="Code"] +.segment Basic +:BasicUpstart(main) + .const SIZEOF_STRUCT_TASK = 3 + .const OFFSET_STRUCT_TASK_HANDLER = 1 + .const STACK_BASE = $103 + .label BORDER = $d020 + .label BACKGROUND = $d021 +.segment Code +main: { + .label i = 2 + __b3: + lda #0 + sta.z i + __b1: + // for(char i=0; i < sizeof(tasks)/sizeof(struct Task); i++) + lda.z i + cmp #4*SIZEOF_STRUCT_TASK/SIZEOF_STRUCT_TASK + bcc __b2 + jmp __b3 + __b2: + // tasks+i + lda.z i + asl + clc + adc.z i + tax + // run(tasks+i) + txa + clc + adc #tasks + adc #0 + sta.z run.task+1 + jsr run + // for(char i=0; i < sizeof(tasks)/sizeof(struct Task); i++) + inc.z i + jmp __b1 +} +// set_bg(byte register(A) col) +set_bg: { + .const OFFSET_STACK_COL = 0 + tsx + lda STACK_BASE+OFFSET_STACK_COL,x + // *BACKGROUND = col + sta BACKGROUND + // } + rts +} +// set_border(byte register(A) col) +set_border: { + .const OFFSET_STACK_COL = 0 + tsx + lda STACK_BASE+OFFSET_STACK_COL,x + // *BORDER = col + sta BORDER + // } + rts +} +// run(struct Task* zp(3) task) +run: { + .label task = 3 + // task->handler(task->param) + lda tasks,x + pha + ldy #OFFSET_STRUCT_TASK_HANDLER + lda (task),y + sta !+ +1 + iny + lda (task),y + sta !+ +2 + !: + jsr 0 + pla + // } + rts +} +.segment Data + tasks: .byte 0 + .word set_border + .byte 0 + .word set_bg + .byte 1 + .word set_border + .byte 2 + .word set_bg diff --git a/src/test/ref/function-pointer-return-3.cfg b/src/test/ref/function-pointer-return-3.cfg new file mode 100644 index 000000000..fa52bdda5 --- /dev/null +++ b/src/test/ref/function-pointer-return-3.cfg @@ -0,0 +1,46 @@ + +void main() +main: scope:[main] from + [0] phi() + to:main::@1 +main::@1: scope:[main] from main main::@1 main::@3 + [1] main::i#2 = phi( main/0, main::@3/main::i#1, main::@1/0 ) + [2] if(main::i#2<4*SIZEOF_STRUCT_TASK/SIZEOF_STRUCT_TASK) goto main::@2 + to:main::@1 +main::@2: scope:[main] from main::@1 + [3] main::$6 = main::i#2 << 1 + [4] main::$5 = main::$6 + main::i#2 + [5] run::task#0 = tasks + main::$5 + [6] call run + to:main::@3 +main::@3: scope:[main] from main::@2 + [7] main::i#1 = ++ main::i#2 + to:main::@1 + +__stackcall void set_bg(byte set_bg::col) +set_bg: scope:[set_bg] from + [8] set_bg::col#0 = stackidx(byte,set_bg::OFFSET_STACK_COL) + [9] *BACKGROUND = set_bg::col#0 + to:set_bg::@return +set_bg::@return: scope:[set_bg] from set_bg + [10] return + to:@return + +__stackcall void set_border(byte set_border::col) +set_border: scope:[set_border] from + [11] set_border::col#0 = stackidx(byte,set_border::OFFSET_STACK_COL) + [12] *BORDER = set_border::col#0 + to:set_border::@return +set_border::@return: scope:[set_border] from set_border + [13] return + to:@return + +void run(struct Task* run::task) +run: scope:[run] from main::@2 + [14] stackpush(byte) = ((byte*)tasks)[main::$5] + [15] callexecute *(((void(byte)**)run::task#0)[OFFSET_STRUCT_TASK_HANDLER]) + sideeffect stackpullbytes(1) + to:run::@return +run::@return: scope:[run] from run + [17] return + to:@return diff --git a/src/test/ref/function-pointer-return-3.log b/src/test/ref/function-pointer-return-3.log new file mode 100644 index 000000000..6f5c2fb98 --- /dev/null +++ b/src/test/ref/function-pointer-return-3.log @@ -0,0 +1,646 @@ +Setting inferred __stackcall on procedure affected by address-of __stackcall void set_border(byte set_border::col) caused by statement void set_border(byte set_border::col) +Setting inferred __stackcall on procedure affected by address-of __stackcall void set_bg(byte set_bg::col) caused by statement void set_bg(byte set_bg::col) +Setting inferred __stackcall on procedure affected by address-of __stackcall void set_border(byte set_border::col) caused by statement __stackcall void set_border(byte set_border::col) +Setting inferred __stackcall on procedure affected by address-of __stackcall void set_bg(byte set_bg::col) caused by statement __stackcall void set_bg(byte set_bg::col) +Adding parameter assignment in __stackcall procedure set_border::col = param(set_border::col) +Adding parameter assignment in __stackcall procedure set_bg::col = param(set_bg::col) +Calling convention STACK_CALL adding prepare/execute/finalize for call *(*run::$1) *run::$2 +Calling convention STACK_CALL replacing param(set_border::col) with stackidx(byte,set_border::OFFSET_STACK_COL) +Calling convention STACK_CALL replacing param(set_bg::col) with stackidx(byte,set_bg::OFFSET_STACK_COL) +Calling convention STACK_CALL adding stack push stackpush(byte) = *run::$2 + +CONTROL FLOW GRAPH SSA + +__stackcall void set_border(byte set_border::col) +set_border: scope:[set_border] from + set_border::col#0 = stackidx(byte,set_border::OFFSET_STACK_COL) + *BORDER = set_border::col#0 + to:set_border::@return +set_border::@return: scope:[set_border] from set_border + return + to:@return + +__stackcall void set_bg(byte set_bg::col) +set_bg: scope:[set_bg] from + set_bg::col#0 = stackidx(byte,set_bg::OFFSET_STACK_COL) + *BACKGROUND = set_bg::col#0 + to:set_bg::@return +set_bg::@return: scope:[set_bg] from set_bg + return + to:@return + +void run(struct Task* run::task) +run: scope:[run] from main::@3 + run::task#1 = phi( main::@3/run::task#0 ) + run::$3 = (void(byte)**)run::task#1 + run::$1 = run::$3 + OFFSET_STRUCT_TASK_HANDLER + run::$4 = (byte*)run::task#1 + run::$2 = run::$4 + OFFSET_STRUCT_TASK_PARAM + stackpush(byte) = *run::$2 + callexecute *(*run::$1) + sideeffect stackpullbytes(1) + to:run::@return +run::@return: scope:[run] from run + return + to:@return + +void main() +main: scope:[main] from __start + to:main::@1 +main::@1: scope:[main] from main main::@2 + main::i#0 = 0 + to:main::@2 +main::@2: scope:[main] from main::@1 main::@4 + main::i#2 = phi( main::@1/main::i#0, main::@4/main::i#1 ) + main::$0 = sizeof tasks + main::$1 = main::$0 / SIZEOF_STRUCT_TASK + main::$2 = main::i#2 < main::$1 + if(main::$2) goto main::@3 + to:main::@1 +main::@3: scope:[main] from main::@2 + main::i#3 = phi( main::@2/main::i#2 ) + main::$5 = main::i#3 * SIZEOF_STRUCT_TASK + main::$3 = tasks + main::$5 + run::task#0 = main::$3 + call run + to:main::@4 +main::@4: scope:[main] from main::@3 + main::i#4 = phi( main::@3/main::i#3 ) + main::i#1 = ++ main::i#4 + to:main::@2 +main::@return: scope:[main] from + return + to:@return + +void __start() +__start: scope:[__start] from + call main + to:__start::@1 +__start::@1: scope:[__start] from __start + to:__start::@return +__start::@return: scope:[__start] from __start::@1 + return + to:@return + +SYMBOL TABLE SSA +constant byte* const BACKGROUND = (byte*)$d021 +constant byte* const BORDER = (byte*)$d020 +constant byte OFFSET_STRUCT_TASK_HANDLER = 1 +constant byte OFFSET_STRUCT_TASK_PARAM = 0 +constant byte SIZEOF_STRUCT_TASK = 3 +constant word STACK_BASE = $103 +void __start() +void main() +word~ main::$0 +word~ main::$1 +bool~ main::$2 +struct Task*~ main::$3 +byte~ main::$5 +byte main::i +byte main::i#0 +byte main::i#1 +byte main::i#2 +byte main::i#3 +byte main::i#4 +void run(struct Task* run::task) +void(byte)**~ run::$1 +byte*~ run::$2 +void(byte)**~ run::$3 +byte*~ run::$4 +struct Task* run::task +struct Task* run::task#0 +struct Task* run::task#1 +__stackcall void set_bg(byte set_bg::col) +constant byte set_bg::OFFSET_STACK_COL = 0 +byte set_bg::col +byte set_bg::col#0 +__stackcall void set_border(byte set_border::col) +constant byte set_border::OFFSET_STACK_COL = 0 +byte set_border::col +byte set_border::col#0 +constant struct Task* tasks[] = { { param: 0, handler: &set_border }, { param: 0, handler: &set_bg }, { param: 1, handler: &set_border }, { param: 2, handler: &set_bg } } + +Simplifying constant pointer cast (byte*) 53280 +Simplifying constant pointer cast (byte*) 53281 +Successful SSA optimization PassNCastSimplification +Alias main::i#2 = main::i#3 main::i#4 +Alias run::task#0 = main::$3 +Successful SSA optimization Pass2AliasElimination +Identical Phi Values run::task#1 run::task#0 +Successful SSA optimization Pass2IdenticalPhiElimination +Simple Condition main::$2 [20] if(main::i#2main::@1] + __b1_from_main: + __b1_from___b1: + // [1] phi main::i#2 = 0 [phi:main/main::@1->main::@1#0] -- vbuz1=vbuc1 + lda #0 + sta.z i + jmp __b1 + // main::@1 + __b1: + // [2] if(main::i#2<4*SIZEOF_STRUCT_TASK/SIZEOF_STRUCT_TASK) goto main::@2 -- vbuz1_lt_vbuc1_then_la1 + lda.z i + cmp #4*SIZEOF_STRUCT_TASK/SIZEOF_STRUCT_TASK + bcc __b2 + jmp __b1_from___b1 + // main::@2 + __b2: + // [3] main::$6 = main::i#2 << 1 -- vbuaa=vbuz1_rol_1 + lda.z i + asl + // [4] main::$5 = main::$6 + main::i#2 -- vbuxx=vbuaa_plus_vbuz1 + clc + adc.z i + tax + // [5] run::task#0 = tasks + main::$5 -- pssz1=pssc1_plus_vbuxx + txa + clc + adc #tasks + adc #0 + sta.z run.task+1 + // [6] call run + jsr run + jmp __b3 + // main::@3 + __b3: + // [7] main::i#1 = ++ main::i#2 -- vbuz1=_inc_vbuz1 + inc.z i + // [1] phi from main::@3 to main::@1 [phi:main::@3->main::@1] + __b1_from___b3: + // [1] phi main::i#2 = main::i#1 [phi:main::@3->main::@1#0] -- register_copy + jmp __b1 +} + // set_bg +// set_bg(byte register(A) col) +set_bg: { + .const OFFSET_STACK_COL = 0 + // [8] set_bg::col#0 = stackidx(byte,set_bg::OFFSET_STACK_COL) -- vbuaa=_stackidxbyte_vbuc1 + tsx + lda STACK_BASE+OFFSET_STACK_COL,x + // [9] *BACKGROUND = set_bg::col#0 -- _deref_pbuc1=vbuaa + sta BACKGROUND + jmp __breturn + // set_bg::@return + __breturn: + // [10] return + rts +} + // set_border +// set_border(byte register(A) col) +set_border: { + .const OFFSET_STACK_COL = 0 + // [11] set_border::col#0 = stackidx(byte,set_border::OFFSET_STACK_COL) -- vbuaa=_stackidxbyte_vbuc1 + tsx + lda STACK_BASE+OFFSET_STACK_COL,x + // [12] *BORDER = set_border::col#0 -- _deref_pbuc1=vbuaa + sta BORDER + jmp __breturn + // set_border::@return + __breturn: + // [13] return + rts +} + // run +// run(struct Task* zp(3) task) +run: { + .label task = 3 + // [14] stackpush(byte) = ((byte*)tasks)[main::$5] -- _stackpushbyte_=pbuc1_derefidx_vbuxx + lda tasks,x + pha + // [15] callexecute *(((void(byte)**)run::task#0)[OFFSET_STRUCT_TASK_HANDLER]) -- call__deref_(qprz1_derefidx_vbuc1) + ldy #OFFSET_STRUCT_TASK_HANDLER + lda (task),y + sta !+ +1 + iny + lda (task),y + sta !+ +2 + !: + jsr 0 + // sideeffect stackpullbytes(1) -- _stackpullbyte_1 + pla + jmp __breturn + // run::@return + __breturn: + // [17] return + rts +} + // File Data +.segment Data + tasks: .byte 0 + .word set_border + .byte 0 + .word set_bg + .byte 1 + .word set_border + .byte 2 + .word set_bg + +ASSEMBLER OPTIMIZATIONS +Removing instruction jmp __b1 +Removing instruction jmp __b3 +Removing instruction jmp __breturn +Removing instruction jmp __breturn +Removing instruction jmp __breturn +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction __b1_from_main: +Succesful ASM optimization Pass5RedundantLabelElimination +Removing instruction __b3: +Removing instruction __b1_from___b3: +Removing instruction __breturn: +Removing instruction __breturn: +Removing instruction __breturn: +Succesful ASM optimization Pass5UnusedLabelElimination +Relabelling long label __b1_from___b1 to __b3 +Succesful ASM optimization Pass5RelabelLongLabels + +FINAL SYMBOL TABLE +constant byte* const BACKGROUND = (byte*) 53281 +constant byte* const BORDER = (byte*) 53280 +constant byte OFFSET_STRUCT_TASK_HANDLER = 1 +constant byte SIZEOF_STRUCT_TASK = 3 +constant word STACK_BASE = $103 +void main() +byte~ main::$5 reg byte x 61.5 +byte~ main::$6 reg byte a 22.0 +byte main::i +byte main::i#1 i zp[1]:2 22.0 +byte main::i#2 i zp[1]:2 24.16666666666666 +void run(struct Task* run::task) +struct Task* run::task +struct Task* run::task#0 task zp[2]:3 110.0 +__stackcall void set_bg(byte set_bg::col) +constant byte set_bg::OFFSET_STACK_COL = 0 +byte set_bg::col +byte set_bg::col#0 reg byte a 4.0 +__stackcall void set_border(byte set_border::col) +constant byte set_border::OFFSET_STACK_COL = 0 +byte set_border::col +byte set_border::col#0 reg byte a 4.0 +constant struct Task* tasks[] = { { param: 0, handler: &set_border }, { param: 0, handler: &set_bg }, { param: 1, handler: &set_border }, { param: 2, handler: &set_bg } } + +zp[1]:2 [ main::i#2 main::i#1 ] +reg byte a [ main::$6 ] +reg byte x [ main::$5 ] +zp[2]:3 [ run::task#0 ] +reg byte a [ set_bg::col#0 ] +reg byte a [ set_border::col#0 ] + + +FINAL ASSEMBLER +Score: 2318 + + // File Comments +// Calling a function pointer with return value +// Calling a function pointer inside a struct without * + // Upstart + // Commodore 64 PRG executable file +.file [name="function-pointer-return-3.prg", type="prg", segments="Program"] +.segmentdef Program [segments="Basic, Code, Data"] +.segmentdef Basic [start=$0801] +.segmentdef Code [start=$80d] +.segmentdef Data [startAfter="Code"] +.segment Basic +:BasicUpstart(main) + // Global Constants & labels + .const SIZEOF_STRUCT_TASK = 3 + .const OFFSET_STRUCT_TASK_HANDLER = 1 + .const STACK_BASE = $103 + .label BORDER = $d020 + .label BACKGROUND = $d021 +.segment Code + // main +main: { + .label i = 2 + // [1] phi from main main::@1 to main::@1 [phi:main/main::@1->main::@1] + __b3: + // [1] phi main::i#2 = 0 [phi:main/main::@1->main::@1#0] -- vbuz1=vbuc1 + lda #0 + sta.z i + // main::@1 + __b1: + // for(char i=0; i < sizeof(tasks)/sizeof(struct Task); i++) + // [2] if(main::i#2<4*SIZEOF_STRUCT_TASK/SIZEOF_STRUCT_TASK) goto main::@2 -- vbuz1_lt_vbuc1_then_la1 + lda.z i + cmp #4*SIZEOF_STRUCT_TASK/SIZEOF_STRUCT_TASK + bcc __b2 + jmp __b3 + // main::@2 + __b2: + // tasks+i + // [3] main::$6 = main::i#2 << 1 -- vbuaa=vbuz1_rol_1 + lda.z i + asl + // [4] main::$5 = main::$6 + main::i#2 -- vbuxx=vbuaa_plus_vbuz1 + clc + adc.z i + tax + // run(tasks+i) + // [5] run::task#0 = tasks + main::$5 -- pssz1=pssc1_plus_vbuxx + txa + clc + adc #tasks + adc #0 + sta.z run.task+1 + // [6] call run + jsr run + // main::@3 + // for(char i=0; i < sizeof(tasks)/sizeof(struct Task); i++) + // [7] main::i#1 = ++ main::i#2 -- vbuz1=_inc_vbuz1 + inc.z i + // [1] phi from main::@3 to main::@1 [phi:main::@3->main::@1] + // [1] phi main::i#2 = main::i#1 [phi:main::@3->main::@1#0] -- register_copy + jmp __b1 +} + // set_bg +// set_bg(byte register(A) col) +set_bg: { + .const OFFSET_STACK_COL = 0 + // [8] set_bg::col#0 = stackidx(byte,set_bg::OFFSET_STACK_COL) -- vbuaa=_stackidxbyte_vbuc1 + tsx + lda STACK_BASE+OFFSET_STACK_COL,x + // *BACKGROUND = col + // [9] *BACKGROUND = set_bg::col#0 -- _deref_pbuc1=vbuaa + sta BACKGROUND + // set_bg::@return + // } + // [10] return + rts +} + // set_border +// set_border(byte register(A) col) +set_border: { + .const OFFSET_STACK_COL = 0 + // [11] set_border::col#0 = stackidx(byte,set_border::OFFSET_STACK_COL) -- vbuaa=_stackidxbyte_vbuc1 + tsx + lda STACK_BASE+OFFSET_STACK_COL,x + // *BORDER = col + // [12] *BORDER = set_border::col#0 -- _deref_pbuc1=vbuaa + sta BORDER + // set_border::@return + // } + // [13] return + rts +} + // run +// run(struct Task* zp(3) task) +run: { + .label task = 3 + // task->handler(task->param) + // [14] stackpush(byte) = ((byte*)tasks)[main::$5] -- _stackpushbyte_=pbuc1_derefidx_vbuxx + lda tasks,x + pha + // [15] callexecute *(((void(byte)**)run::task#0)[OFFSET_STRUCT_TASK_HANDLER]) -- call__deref_(qprz1_derefidx_vbuc1) + ldy #OFFSET_STRUCT_TASK_HANDLER + lda (task),y + sta !+ +1 + iny + lda (task),y + sta !+ +2 + !: + jsr 0 + // sideeffect stackpullbytes(1) -- _stackpullbyte_1 + pla + // run::@return + // } + // [17] return + rts +} + // File Data +.segment Data + tasks: .byte 0 + .word set_border + .byte 0 + .word set_bg + .byte 1 + .word set_border + .byte 2 + .word set_bg + diff --git a/src/test/ref/function-pointer-return-3.sym b/src/test/ref/function-pointer-return-3.sym new file mode 100644 index 000000000..b89229b84 --- /dev/null +++ b/src/test/ref/function-pointer-return-3.sym @@ -0,0 +1,30 @@ +constant byte* const BACKGROUND = (byte*) 53281 +constant byte* const BORDER = (byte*) 53280 +constant byte OFFSET_STRUCT_TASK_HANDLER = 1 +constant byte SIZEOF_STRUCT_TASK = 3 +constant word STACK_BASE = $103 +void main() +byte~ main::$5 reg byte x 61.5 +byte~ main::$6 reg byte a 22.0 +byte main::i +byte main::i#1 i zp[1]:2 22.0 +byte main::i#2 i zp[1]:2 24.16666666666666 +void run(struct Task* run::task) +struct Task* run::task +struct Task* run::task#0 task zp[2]:3 110.0 +__stackcall void set_bg(byte set_bg::col) +constant byte set_bg::OFFSET_STACK_COL = 0 +byte set_bg::col +byte set_bg::col#0 reg byte a 4.0 +__stackcall void set_border(byte set_border::col) +constant byte set_border::OFFSET_STACK_COL = 0 +byte set_border::col +byte set_border::col#0 reg byte a 4.0 +constant struct Task* tasks[] = { { param: 0, handler: &set_border }, { param: 0, handler: &set_bg }, { param: 1, handler: &set_border }, { param: 2, handler: &set_bg } } + +zp[1]:2 [ main::i#2 main::i#1 ] +reg byte a [ main::$6 ] +reg byte x [ main::$5 ] +zp[2]:3 [ run::task#0 ] +reg byte a [ set_bg::col#0 ] +reg byte a [ set_border::col#0 ]