From da57f76de336e0f846182901da1abbb83fdddbf5 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Sat, 15 Jul 2023 15:40:51 +0200 Subject: [PATCH] fix augassign --- .../assignment/AugmentableAssignmentAsmGen.kt | 11 ++++++---- compiler/res/prog8lib/prog8_lib.asm | 20 +++++++++++++++++++ compiler/test/TestAstChecks.kt | 2 +- docs/source/todo.rst | 1 - 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AugmentableAssignmentAsmGen.kt b/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AugmentableAssignmentAsmGen.kt index af413afbb..39697377c 100644 --- a/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AugmentableAssignmentAsmGen.kt +++ b/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AugmentableAssignmentAsmGen.kt @@ -190,9 +190,10 @@ internal class AugmentableAssignmentAsmGen(private val program: PtProgram, } } else -> { - TODO("use some other evaluation here; there's no evalstack anymore to transfer the address to read/write from") - // TODO: asmgen.assignExpressionTo(memory.address, AsmAssignTarget(TargetStorageKind.STACK, asmgen, DataType.UWORD, memory.definingISub(), target.position)) - asmgen.out(" jsr prog8_lib.read_byte_from_address_on_stack | sta P8ZP_SCRATCH_B1") + asmgen.assignExpressionTo(memory.address, AsmAssignTarget(TargetStorageKind.REGISTER, asmgen, DataType.UWORD, memory.definingISub(), target.position, register = RegisterOrPair.AY)) + asmgen.saveRegisterStack(CpuRegister.A, true) + asmgen.saveRegisterStack(CpuRegister.Y, false) + asmgen.out(" jsr prog8_lib.read_byte_from_address_in_AY | sta P8ZP_SCRATCH_B1") when(value.kind) { SourceStorageKind.LITERALNUMBER -> inplaceModification_byte_litval_to_variable("P8ZP_SCRATCH_B1", DataType.UBYTE, operator, value.number!!.number.toInt()) SourceStorageKind.VARIABLE -> inplaceModification_byte_variable_to_variable("P8ZP_SCRATCH_B1", DataType.UBYTE, operator, value.asmVarname) @@ -208,7 +209,9 @@ internal class AugmentableAssignmentAsmGen(private val program: PtProgram, } else -> throw AssemblyError("weird source type ${value.kind}") } - asmgen.out(" lda P8ZP_SCRATCH_B1 | jsr prog8_lib.write_byte_to_address_on_stack | inx") + asmgen.restoreRegisterStack(CpuRegister.Y, false) + asmgen.restoreRegisterStack(CpuRegister.A, false) + asmgen.out(" ldx P8ZP_SCRATCH_B1 | jsr prog8_lib.write_byte_X_to_address_in_AY") } } } diff --git a/compiler/res/prog8lib/prog8_lib.asm b/compiler/res/prog8lib/prog8_lib.asm index d5992d60f..d63a768df 100644 --- a/compiler/res/prog8lib/prog8_lib.asm +++ b/compiler/res/prog8lib/prog8_lib.asm @@ -4,6 +4,26 @@ orig_stackpointer .byte 0 ; stores the Stack pointer register at program start + +read_byte_from_address_in_AY .proc + sta P8ZP_SCRATCH_W2 + sty P8ZP_SCRATCH_W2+1 + ldy #0 + lda (P8ZP_SCRATCH_W2),y + rts + .pend + + +write_byte_X_to_address_in_AY .proc + sta P8ZP_SCRATCH_W2 + sty P8ZP_SCRATCH_W2+1 + ldy #0 + txa + sta (P8ZP_SCRATCH_W2),y + rts + .pend + + reg_less_uw .proc ; AY < P8ZP_SCRATCH_W2? cpy P8ZP_SCRATCH_W2+1 diff --git a/compiler/test/TestAstChecks.kt b/compiler/test/TestAstChecks.kt index e8aff3ea2..008bce992 100644 --- a/compiler/test/TestAstChecks.kt +++ b/compiler/test/TestAstChecks.kt @@ -11,7 +11,7 @@ import prog8tests.helpers.compileText class TestAstChecks: FunSpec({ - test("conditional expression w/float works even without tempvar to split it") { + test("conditional expression w/float works") { val text = """ %import floats main { diff --git a/docs/source/todo.rst b/docs/source/todo.rst index 4359bd243..5d7f95b95 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -2,7 +2,6 @@ TODO ==== - (branch): fix optimizeCmpSequence in AsmOptimizer -- (branch): fix inplaceModification TODO in AugmentableAssignmentAsmGen - (branch): fix up cx16/keyboardhandler.p8 X register shenanigans - IR: instructions that do type conversion (SZ etc, CONCAT, SGN) should put the result in a DIFFERENT register.