diff --git a/codeGenCpu6502/src/prog8/codegen/cpu6502/BuiltinFunctionsAsmGen.kt b/codeGenCpu6502/src/prog8/codegen/cpu6502/BuiltinFunctionsAsmGen.kt index 70abf2110..288244743 100644 --- a/codeGenCpu6502/src/prog8/codegen/cpu6502/BuiltinFunctionsAsmGen.kt +++ b/codeGenCpu6502/src/prog8/codegen/cpu6502/BuiltinFunctionsAsmGen.kt @@ -96,8 +96,15 @@ internal class BuiltinFunctionsAsmGen(private val program: PtProgram, } private fun funcDivmodW(fcall: PtBuiltinFunctionCall) { - assignAsmGen.assignExpressionToVariable(fcall.args[0], "P8ZP_SCRATCH_W1", DataType.UWORD) - assignAsmGen.assignExpressionToRegister(fcall.args[1], RegisterOrPair.AY, false) + if(fcall.args[1].isSimple()) { + asmgen.assignExpressionToVariable(fcall.args[0], "P8ZP_SCRATCH_W1", DataType.UWORD) + asmgen.assignExpressionToRegister(fcall.args[1], RegisterOrPair.AY, false) + } else { + asmgen.pushCpuStack(DataType.UWORD, fcall.args[1]) + asmgen.assignExpressionToVariable(fcall.args[0], "P8ZP_SCRATCH_W1", DataType.UWORD) + asmgen.restoreRegisterStack(CpuRegister.Y, false) + asmgen.restoreRegisterStack(CpuRegister.A, false) + } // math.divmod_uw_asm: -- divide two unsigned words (16 bit each) into 16 bit results // input: P8ZP_SCRATCH_W1 in ZP: 16 bit number, A/Y: 16 bit divisor // output: P8ZP_SCRATCH_W2 in ZP: 16 bit remainder, A/Y: 16 bit division result @@ -114,8 +121,15 @@ internal class BuiltinFunctionsAsmGen(private val program: PtProgram, } private fun funcStringCompare(fcall: PtBuiltinFunctionCall, resultToStack: Boolean) { - assignAsmGen.assignExpressionToVariable(fcall.args[1], "P8ZP_SCRATCH_W2", DataType.UWORD) - assignAsmGen.assignExpressionToRegister(fcall.args[0], RegisterOrPair.AY, false) + if(fcall.args[0].isSimple()) { + assignAsmGen.assignExpressionToVariable(fcall.args[1], "P8ZP_SCRATCH_W2", DataType.UWORD) + assignAsmGen.assignExpressionToRegister(fcall.args[0], RegisterOrPair.AY, false) + } else { + asmgen.pushCpuStack(DataType.UWORD, fcall.args[0]) + asmgen.assignExpressionToVariable(fcall.args[1], "P8ZP_SCRATCH_W1", DataType.UWORD) + asmgen.restoreRegisterStack(CpuRegister.Y, false) + asmgen.restoreRegisterStack(CpuRegister.A, false) + } asmgen.out(" jsr prog8_lib.strcmp_mem") if(resultToStack) asmgen.out(" sta P8ESTACK_LO,x | dex") @@ -753,8 +767,15 @@ internal class BuiltinFunctionsAsmGen(private val program: PtProgram, } // fall through method: - asmgen.assignExpressionToVariable(fcall.args[0], "P8ZP_SCRATCH_W1", DataType.UWORD) - asmgen.assignExpressionToRegister(fcall.args[1], RegisterOrPair.AY) + if(fcall.args[1].isSimple()) { + asmgen.assignExpressionToVariable(fcall.args[0], "P8ZP_SCRATCH_W1", DataType.UWORD) + asmgen.assignExpressionToRegister(fcall.args[1], RegisterOrPair.AY) + } else { + asmgen.pushCpuStack(DataType.UWORD, fcall.args[1]) + asmgen.assignExpressionToVariable(fcall.args[0], "P8ZP_SCRATCH_W1", DataType.UWORD) + asmgen.restoreRegisterStack(CpuRegister.Y, false) + asmgen.restoreRegisterStack(CpuRegister.A, false) + } asmgen.out(" jsr prog8_lib.func_pokew") } diff --git a/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt b/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt index aee9dc96a..4bb82bf91 100644 --- a/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt +++ b/codeGenCpu6502/src/prog8/codegen/cpu6502/assignment/AssignmentAsmGen.kt @@ -1283,9 +1283,7 @@ internal class AssignmentAsmGen(private val program: PtProgram, assignExpressionToVariable(expr.left, "P8ZP_SCRATCH_W1", expr.left.type) assignExpressionToRegister(expr.right, RegisterOrPair.AY, expr.right.type in SignedDatatypes) } else { - assignExpressionToRegister(expr.right, RegisterOrPair.AY, expr.right.type in SignedDatatypes) - asmgen.saveRegisterStack(CpuRegister.A, false) - asmgen.saveRegisterStack(CpuRegister.Y, false) + asmgen.pushCpuStack(DataType.UWORD, expr.right) assignExpressionToVariable(expr.left, "P8ZP_SCRATCH_W1", expr.left.type) asmgen.restoreRegisterStack(CpuRegister.Y, false) asmgen.restoreRegisterStack(CpuRegister.A, false) @@ -1297,9 +1295,7 @@ internal class AssignmentAsmGen(private val program: PtProgram, assignExpressionToVariable(expr.right, "P8ZP_SCRATCH_W1", expr.left.type) assignExpressionToRegister(expr.left, RegisterOrPair.AY, expr.left.type in SignedDatatypes) } else { - assignExpressionToRegister(expr.left, RegisterOrPair.AY, expr.left.type in SignedDatatypes) - asmgen.saveRegisterStack(CpuRegister.A, false) - asmgen.saveRegisterStack(CpuRegister.Y, false) + asmgen.pushCpuStack(DataType.UWORD, expr.left) assignExpressionToVariable(expr.right, "P8ZP_SCRATCH_W1", expr.left.type) asmgen.restoreRegisterStack(CpuRegister.Y, false) asmgen.restoreRegisterStack(CpuRegister.A, false) diff --git a/examples/test.p8 b/examples/test.p8 index 27085f830..fdee3a0c9 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -4,25 +4,18 @@ main { sub start() { - ubyte x8 - ubyte x4 - ubyte x3 - ubyte result = x3 % x8 - txt.print_ub(result) - txt.nl() - result = x3/x8 - txt.print_ub(result) - txt.nl() - uword y8 - uword y4 - uword y3 - uword wresult = y3 % y8 - txt.print_uw(wresult) - txt.nl() - wresult = y3 / y8 - txt.print_uw(wresult) - txt.nl() + uword table = memory("table", 100, 0) + + ubyte pos + for pos in 0 to 7 { + pokew(table + 64 + pos*2, ($000a-pos)*200) ; TODO FIX WRONG CODE + } + + for pos in 0 to 7 { + txt.print_uw(peekw(table+64+pos*2)) + txt.nl() + } } }