From c07907e7bdeb9835f064727ee08f257a0ae67e2c Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Thu, 2 Jul 2020 21:21:40 +0200 Subject: [PATCH] fixed missing shifts codegen --- .../src/prog8/ast/processing/AstChecker.kt | 2 +- .../target/c64/codegen/AssignmentAsmGen.kt | 165 ++++++++---------- .../target/c64/codegen/ExpressionsAsmGen.kt | 51 +++--- examples/arithmetic/bitshift.p8 | 4 - examples/structs.p8 | 4 +- examples/tehtriz.p8 | 4 +- examples/test.p8 | 43 +++-- 7 files changed, 120 insertions(+), 153 deletions(-) diff --git a/compiler/src/prog8/ast/processing/AstChecker.kt b/compiler/src/prog8/ast/processing/AstChecker.kt index 3a86fd0fd..8f1e9a008 100644 --- a/compiler/src/prog8/ast/processing/AstChecker.kt +++ b/compiler/src/prog8/ast/processing/AstChecker.kt @@ -732,7 +732,7 @@ internal class AstChecker(private val program: Program, } "**" -> { if(leftDt in IntegerDatatypes) - errors.err("power operator requires floating point", expr.position) + errors.err("power operator requires floating point operands", expr.position) } "and", "or", "xor" -> { // only integer numeric operands accepted, and if literal constants, only boolean values accepted (0 or 1) diff --git a/compiler/src/prog8/compiler/target/c64/codegen/AssignmentAsmGen.kt b/compiler/src/prog8/compiler/target/c64/codegen/AssignmentAsmGen.kt index c45a1e964..630c9fb01 100644 --- a/compiler/src/prog8/compiler/target/c64/codegen/AssignmentAsmGen.kt +++ b/compiler/src/prog8/compiler/target/c64/codegen/AssignmentAsmGen.kt @@ -91,7 +91,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors else -> throw AssemblyError("assignment to array: invalid array dt $arrayDt") } } else { - TODO() + TODO("aug assignment to element in array/string") } return true } @@ -155,16 +155,16 @@ internal class AssignmentAsmGen(private val program: Program, private val errors sta $targetName+1,y """) } - DataType.ARRAY_F -> return false // TODO optimize? + DataType.ARRAY_F -> return false // TODO optimize instead of fallback? else -> throw AssemblyError("assignment to array: invalid array dt $arrayDt") } return true } is AddressOf -> { - TODO("$assign") + TODO("assign address into array $assign") } is DirectMemoryRead -> { - TODO("$assign") + TODO("assign memory read into array $assign") } is ArrayIndexedExpression -> { if(assign.aug_op != "setvalue") @@ -294,13 +294,12 @@ internal class AssignmentAsmGen(private val program: Program, private val errors "setvalue" -> asmgen.out(" lda #$hexValue | sta $hexAddr") "+=" -> asmgen.out(" lda $hexAddr | clc | adc #$hexValue | sta $hexAddr") "-=" -> asmgen.out(" lda $hexAddr | sec | sbc #$hexValue | sta $hexAddr") - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("membyte /= const $hexValue") + "*=" -> TODO("membyte *= const $hexValue") "&=" -> asmgen.out(" lda $hexAddr | and #$hexValue | sta $hexAddr") "|=" -> asmgen.out(" lda $hexAddr | ora #$hexValue | sta $hexAddr") "^=" -> asmgen.out(" lda $hexAddr | eor #$hexValue | sta $hexAddr") - "%=" -> TODO("%=") + "%=" -> TODO("membyte %= const $hexValue") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -333,9 +332,8 @@ internal class AssignmentAsmGen(private val program: Program, private val errors Register.Y -> asmgen.out(" sty ${C64Zeropage.SCRATCH_B1} | lda $hexAddr | sec | sbc ${C64Zeropage.SCRATCH_B1} | sta $hexAddr") } } - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("membyte /= register") + "*=" -> TODO("membyte *= register") "&=" -> { when ((assign.value as RegisterExpr).register) { Register.A -> asmgen.out(" and $hexAddr | sta $hexAddr") @@ -357,7 +355,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors Register.Y -> asmgen.out(" tya | eor $hexAddr | sta $hexAddr") } } - "%=" -> TODO("%=") + "%=" -> TODO("membyte %= register") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -366,7 +364,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors } is IdentifierReference -> { val sourceName = asmgen.asmIdentifierName(assign.value as IdentifierReference) - TODO("$assign") + TODO("membyte = variable $assign") } is DirectMemoryRead -> { val memory = (assign.value as DirectMemoryRead).addressExpression.constValue(program)!!.number.toHex() @@ -374,7 +372,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors return true } is ArrayIndexedExpression -> { - TODO("$assign") + TODO("membyte = array value $assign") } is AddressOf -> throw AssemblyError("can't assign address to byte") else -> { @@ -387,7 +385,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors } private fun inplaceAssignToNonConstMemoryByte(assign: Assignment): Boolean { - // target address is not constant, so evaluate it on the stack + // target address is not constant, so evaluate it from the stack asmgen.translateExpression(assign.target.memoryAddress!!.addressExpression) asmgen.out(""" inx @@ -405,13 +403,12 @@ internal class AssignmentAsmGen(private val program: Program, private val errors "setvalue" -> asmgen.out(" lda #$hexValue | sta (${C64Zeropage.SCRATCH_W1}),y") "+=" -> asmgen.out(" lda (${C64Zeropage.SCRATCH_W1}),y | clc | adc #$hexValue | sta (${C64Zeropage.SCRATCH_W1}),y") "-=" -> asmgen.out(" lda (${C64Zeropage.SCRATCH_W1}),y | sec | sbc #$hexValue | sta (${C64Zeropage.SCRATCH_W1}),y") - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("membyte /= const $hexValue") + "*=" -> TODO("membyte *= const $hexValue") "&=" -> asmgen.out(" lda (${C64Zeropage.SCRATCH_W1}),y | and #$hexValue | sta (${C64Zeropage.SCRATCH_W1}),y") "|=" -> asmgen.out(" lda (${C64Zeropage.SCRATCH_W1}),y | ora #$hexValue | sta (${C64Zeropage.SCRATCH_W1}),y") "^=" -> asmgen.out(" lda (${C64Zeropage.SCRATCH_W1}),y | eor #$hexValue | sta (${C64Zeropage.SCRATCH_W1}),y") - "%=" -> TODO("%=") + "%=" -> TODO("membyte %= const $hexValue") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -445,9 +442,8 @@ internal class AssignmentAsmGen(private val program: Program, private val errors Register.Y -> asmgen.out(" tya | ldy #0 | sta ${C64Zeropage.SCRATCH_B1} | lda (${C64Zeropage.SCRATCH_W1}),y | sec | sbc ${C64Zeropage.SCRATCH_B1} | sta (${C64Zeropage.SCRATCH_W1}),y") } } - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("membyte /= register") + "*=" -> TODO("membyte *= register") "&=" -> { when ((assign.value as RegisterExpr).register) { Register.A -> asmgen.out(" ldy #0 | and (${C64Zeropage.SCRATCH_W1}),y| sta (${C64Zeropage.SCRATCH_W1}),y") @@ -469,7 +465,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors Register.Y -> asmgen.out(" tya | ldy #0 | eor (${C64Zeropage.SCRATCH_W1}),y | sta (${C64Zeropage.SCRATCH_W1}),y") } } - "%=" -> TODO("%=") + "%=" -> TODO("membyte %= register") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -478,13 +474,10 @@ internal class AssignmentAsmGen(private val program: Program, private val errors } is IdentifierReference -> { val sourceName = asmgen.asmIdentifierName(assign.value as IdentifierReference) - TODO("$assign") - } - is AddressOf -> { - TODO("$assign") + TODO("membyte = variable $assign") } is DirectMemoryRead -> { - TODO("$assign") + TODO("membyte = memread $assign") } is ArrayIndexedExpression -> { if (assign.aug_op == "setvalue") { @@ -511,6 +504,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors } return true } + is AddressOf -> throw AssemblyError("can't assign memory address to memory byte") else -> { fallbackAssignment(assign) return true @@ -534,13 +528,12 @@ internal class AssignmentAsmGen(private val program: Program, private val errors "setvalue" -> asmgen.out(" lda #$hexValue | sta $targetName") "+=" -> asmgen.out(" lda $targetName | clc | adc #$hexValue | sta $targetName") "-=" -> asmgen.out(" lda $targetName | sec | sbc #$hexValue | sta $targetName") - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("variable /= const $hexValue") + "*=" -> TODO("variable *= const $hexValue") "&=" -> asmgen.out(" lda $targetName | and #$hexValue | sta $targetName") "|=" -> asmgen.out(" lda $targetName | ora #$hexValue | sta $targetName") "^=" -> asmgen.out(" lda $targetName | eor #$hexValue | sta $targetName") - "%=" -> TODO("%=") + "%=" -> TODO("variable %= const $hexValue") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -560,7 +553,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors Register.Y -> asmgen.out(" sty $targetName") } } - else -> TODO("$assign") + else -> TODO("aug.assign variable = register $assign") } return true } @@ -570,13 +563,12 @@ internal class AssignmentAsmGen(private val program: Program, private val errors "setvalue" -> asmgen.out(" lda $sourceName | sta $targetName") "+=" -> asmgen.out(" lda $targetName | clc | adc $sourceName | sta $targetName") "-=" -> asmgen.out(" lda $targetName | sec | sbc $sourceName | sta $targetName") - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("variable /= variable") + "*=" -> TODO("variable *= variable") "&=" -> asmgen.out(" lda $targetName | and $sourceName | sta $targetName") "|=" -> asmgen.out(" lda $targetName | ora $sourceName | sta $targetName") "^=" -> asmgen.out(" lda $targetName | eor $sourceName | sta $targetName") - "%=" -> TODO("%=") + "%=" -> TODO("variable %= variable") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -584,7 +576,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors return true } is DirectMemoryRead -> { - TODO("$assign") + TODO("variable = memory read $assign") } is ArrayIndexedExpression -> { if (assign.aug_op == "setvalue") { @@ -647,7 +639,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors sta $targetName+1 """) } - else -> TODO("$assign") + else -> TODO("variable aug.assign ${assign.aug_op} const $hexNumber") } return true } @@ -692,7 +684,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors return true } else -> { - TODO("$assign") + TODO("variable aug.assign variable") } } return true @@ -789,7 +781,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors """) return true } - else -> TODO("$assign") + else -> TODO("float const value aug.assign $assign") } return true } @@ -802,7 +794,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors "setvalue" -> assignFromFloatVariable(assign.target, assign.value as IdentifierReference) "+=" -> return false // TODO optimized float += variable "-=" -> return false // TODO optimized float -= variable - else -> TODO("$assign") + else -> TODO("float non-const value aug.assign $assign") } return true } @@ -838,7 +830,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors sta $targetName+4 """) } - else -> TODO("$assign") + else -> TODO("float $assign") } return true } @@ -878,13 +870,12 @@ internal class AssignmentAsmGen(private val program: Program, private val errors "setvalue" -> asmgen.out(" lda #$hexValue") "+=" -> asmgen.out(" clc | adc #$hexValue") "-=" -> asmgen.out(" sec | sbc #$hexValue") - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("A /= const $hexValue") + "*=" -> TODO("A *= const $hexValue") "&=" -> asmgen.out(" and #$hexValue") "|=" -> asmgen.out(" ora #$hexValue") "^=" -> asmgen.out(" eor #$hexValue") - "%=" -> TODO("%=") + "%=" -> TODO("A %= const $hexValue") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -895,13 +886,12 @@ internal class AssignmentAsmGen(private val program: Program, private val errors "setvalue" -> asmgen.out(" ldx #$hexValue") "+=" -> asmgen.out(" txa | clc | adc #$hexValue | tax") "-=" -> asmgen.out(" txa | sec | sbc #$hexValue | tax") - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("X /= const $hexValue") + "*=" -> TODO("X *= const $hexValue") "&=" -> asmgen.out(" txa | and #$hexValue | tax") "|=" -> asmgen.out(" txa | ora #$hexValue | tax") "^=" -> asmgen.out(" txa | eor #$hexValue | tax") - "%=" -> TODO("%=") + "%=" -> TODO("X %= const $hexValue") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -912,13 +902,12 @@ internal class AssignmentAsmGen(private val program: Program, private val errors "setvalue" -> asmgen.out(" ldy #$hexValue") "+=" -> asmgen.out(" tya | clc | adc #$hexValue | tay") "-=" -> asmgen.out(" tya | sec | sbc #$hexValue | tay") - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("Y /= const $hexValue") + "*=" -> TODO("Y *= const $hexValue") "&=" -> asmgen.out(" tya | and #$hexValue | tay") "|=" -> asmgen.out(" tya | ora #$hexValue | tay") "^=" -> asmgen.out(" tya | eor #$hexValue | tay") - "%=" -> TODO("%=") + "%=" -> TODO("Y %= const $hexValue") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -938,13 +927,12 @@ internal class AssignmentAsmGen(private val program: Program, private val errors "setvalue" -> asmgen.out(" lda $sourceName") "+=" -> asmgen.out(" clc | adc $sourceName") "-=" -> asmgen.out(" sec | sbc $sourceName") - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("A /= variable") + "*=" -> TODO("A *= variable") "&=" -> asmgen.out(" and $sourceName") "|=" -> asmgen.out(" ora $sourceName") "^=" -> asmgen.out(" eor $sourceName") - "%=" -> TODO("%=") + "%=" -> TODO("A %= variable") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -955,13 +943,12 @@ internal class AssignmentAsmGen(private val program: Program, private val errors "setvalue" -> asmgen.out(" ldx $sourceName") "+=" -> asmgen.out(" txa | clc | adc $sourceName | tax") "-=" -> asmgen.out(" txa | sec | sbc $sourceName | tax") - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("X /= variable") + "*=" -> TODO("X *= variable") "&=" -> asmgen.out(" txa | and $sourceName | tax") "|=" -> asmgen.out(" txa | ora $sourceName | tax") "^=" -> asmgen.out(" txa | eor $sourceName | tax") - "%=" -> TODO("%=") + "%=" -> TODO("X %= variable") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -972,13 +959,12 @@ internal class AssignmentAsmGen(private val program: Program, private val errors "setvalue" -> asmgen.out(" ldy $sourceName") "+=" -> asmgen.out(" tya | clc | adc $sourceName | tay") "-=" -> asmgen.out(" tya | sec | sbc $sourceName | tay") - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("Y /= variable") + "*=" -> TODO("Y *= variable") "&=" -> asmgen.out(" tya | and $sourceName | tay") "|=" -> asmgen.out(" tya | ora $sourceName | tay") "^=" -> asmgen.out(" tya | eor $sourceName | tay") - "%=" -> TODO("%=") + "%=" -> TODO("Y %= variable") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -993,8 +979,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors when ((assign.value as RegisterExpr).register) { Register.A -> { when (assign.target.register!!) { - Register.A -> { - } + Register.A -> {} Register.X -> asmgen.out(" tax") Register.Y -> asmgen.out(" tay") } @@ -1002,8 +987,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors Register.X -> { when (assign.target.register!!) { Register.A -> asmgen.out(" txa") - Register.X -> { - } + Register.X -> {} Register.Y -> asmgen.out(" txa | tay") } } @@ -1011,8 +995,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors when (assign.target.register!!) { Register.A -> asmgen.out(" tya") Register.X -> asmgen.out(" tya | tax") - Register.Y -> { - } + Register.Y -> {} } } } @@ -1067,9 +1050,8 @@ internal class AssignmentAsmGen(private val program: Program, private val errors } } } - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("register /= register") + "*=" -> TODO("register *= register") "&=" -> { when ((assign.value as RegisterExpr).register) { Register.A -> { @@ -1095,9 +1077,9 @@ internal class AssignmentAsmGen(private val program: Program, private val errors } } } - "|=" -> TODO() - "^=" -> TODO() - "%=" -> TODO("%=") + "|=" -> TODO("register |= register") + "^=" -> TODO("register ^= register") + "%=" -> TODO("register %= register") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -1114,13 +1096,12 @@ internal class AssignmentAsmGen(private val program: Program, private val errors "setvalue" -> asmgen.out(" lda $hexAddr") "+=" -> asmgen.out(" clc | adc $hexAddr") "-=" -> asmgen.out(" sec | sbc $hexAddr") - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("A /= memory $hexAddr") + "*=" -> TODO("A *= memory $hexAddr") "&=" -> asmgen.out(" and $hexAddr") "|=" -> asmgen.out(" ora $hexAddr") "^=" -> asmgen.out(" eor $hexAddr") - "%=" -> TODO("%=") + "%=" -> TODO("A %= memory $hexAddr") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -1131,13 +1112,12 @@ internal class AssignmentAsmGen(private val program: Program, private val errors "setvalue" -> asmgen.out(" ldx $hexAddr") "+=" -> asmgen.out(" txa | clc | adc $hexAddr | tax") "-=" -> asmgen.out(" txa | sec | sbc $hexAddr | tax") - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("X /= memory $hexAddr") + "*=" -> TODO("X *= memory $hexAddr") "&=" -> asmgen.out(" txa | and $hexAddr | tax") "|=" -> asmgen.out(" txa | ora $hexAddr | tax") "^=" -> asmgen.out(" txa | eor $hexAddr | tax") - "%=" -> TODO("%=") + "%=" -> TODO("X %= memory $hexAddr") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -1148,13 +1128,12 @@ internal class AssignmentAsmGen(private val program: Program, private val errors "setvalue" -> asmgen.out(" ldy $hexAddr") "+=" -> asmgen.out(" tya | clc | adc $hexAddr | tay") "-=" -> asmgen.out(" tya | sec | sbc $hexAddr | tay") - "/=" -> TODO("/=") - "*=" -> TODO("*=") - "**=" -> TODO("**=") + "/=" -> TODO("Y /= memory $hexAddr") + "*=" -> TODO("Y *= memory $hexAddr") "&=" -> asmgen.out(" tya | and $hexAddr | tay") "|=" -> asmgen.out(" tya | ora $hexAddr | tay") "^=" -> asmgen.out(" tya | eor $hexAddr | tay") - "%=" -> TODO("%=") + "%=" -> TODO("Y %= memory $hexAddr") "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") @@ -1164,9 +1143,6 @@ internal class AssignmentAsmGen(private val program: Program, private val errors return true } } - is AddressOf -> { - TODO("$assign") - } is ArrayIndexedExpression -> { if (assign.aug_op == "setvalue") { val arrayExpr = assign.value as ArrayIndexedExpression @@ -1192,6 +1168,7 @@ internal class AssignmentAsmGen(private val program: Program, private val errors } return true } + is AddressOf -> throw AssemblyError("can't load a memory address into a register") else -> { fallbackAssignment(assign) return true diff --git a/compiler/src/prog8/compiler/target/c64/codegen/ExpressionsAsmGen.kt b/compiler/src/prog8/compiler/target/c64/codegen/ExpressionsAsmGen.kt index 3b302aa63..944c20e11 100644 --- a/compiler/src/prog8/compiler/target/c64/codegen/ExpressionsAsmGen.kt +++ b/compiler/src/prog8/compiler/target/c64/codegen/ExpressionsAsmGen.kt @@ -240,28 +240,26 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge } } DataType.UWORD -> { - if (amount<=2) repeat(amount) { asmgen.out(" lsr $ESTACK_HI_PLUS1_HEX,x | ror $ESTACK_LO_PLUS1_HEX,x") } - else { - var left = amount - while(left>=7) { - asmgen.out(" jsr math.shift_right_uw_7") - left -= 7 - } - if(left>0) - asmgen.out(" jsr math.shift_right_uw_$left") + var left = amount + while(left>=7) { + asmgen.out(" jsr math.shift_right_uw_7") + left -= 7 } + if (left in 0..2) + repeat(left) { asmgen.out(" lsr $ESTACK_HI_PLUS1_HEX,x | ror $ESTACK_LO_PLUS1_HEX,x") } + else + asmgen.out(" jsr math.shift_right_uw_$left") } DataType.WORD -> { - if (amount<=2) repeat(amount) { asmgen.out(" lda $ESTACK_HI_PLUS1_HEX,x | asl a | ror $ESTACK_HI_PLUS1_HEX,x | ror $ESTACK_LO_PLUS1_HEX,x") } - else { - var left=amount - while(left>=7) { - asmgen.out(" jsr math.shift_right_w_7") - left -= 7 - } - if(left>0) - asmgen.out(" jsr math.shift_right_w_$left") + var left = amount + while(left>=7) { + asmgen.out(" jsr math.shift_right_w_7") + left -= 7 } + if (left in 0..2) + repeat(left) { asmgen.out(" lda $ESTACK_HI_PLUS1_HEX,x | asl a | ror $ESTACK_HI_PLUS1_HEX,x | ror $ESTACK_LO_PLUS1_HEX,x") } + else + asmgen.out(" jsr math.shift_right_w_$left") } else -> throw AssemblyError("weird type") } @@ -281,16 +279,15 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge } } else { - if (amount<=2) repeat(amount) { asmgen.out(" asl $ESTACK_LO_PLUS1_HEX,x | rol $ESTACK_HI_PLUS1_HEX,x") } - else { - var left=amount - while(left>=7) { - asmgen.out(" jsr math.shift_left_w_7") - left -= 7 - } - if(left > 0) - asmgen.out(" jsr math.shift_left_w_$left") + var left=amount + while(left>=7) { + asmgen.out(" jsr math.shift_left_w_7") + left -= 7 } + if (left in 0..2) + repeat(left) { asmgen.out(" asl $ESTACK_LO_PLUS1_HEX,x | rol $ESTACK_HI_PLUS1_HEX,x") } + else + asmgen.out(" jsr math.shift_left_w_$left") } return } diff --git a/examples/arithmetic/bitshift.p8 b/examples/arithmetic/bitshift.p8 index b0c39edb7..37bed8e24 100644 --- a/examples/arithmetic/bitshift.p8 +++ b/examples/arithmetic/bitshift.p8 @@ -1,10 +1,6 @@ %import c64utils -;%import c64flt -;%option enable_floats %zeropage dontuse -; TODO fix compiler errors when compiling without optimizations - main { diff --git a/examples/structs.p8 b/examples/structs.p8 index 7b55fdbbb..aa85a04eb 100644 --- a/examples/structs.p8 +++ b/examples/structs.p8 @@ -1,7 +1,7 @@ %import c64utils %zeropage basicsafe -; TODO fix compiler errors when compiling without optimizations +; TODO fix compiler errors when compiling ( /= ) main { @@ -20,7 +20,7 @@ main { other = purple - other.red /= 2 + other.red /= 3 other.green = 10 + other.green / 2 other.blue = 99 diff --git a/examples/tehtriz.p8 b/examples/tehtriz.p8 index 2e100c34a..fab634674 100644 --- a/examples/tehtriz.p8 +++ b/examples/tehtriz.p8 @@ -9,8 +9,8 @@ -; TODO fix crash when piece reaches bottom. -; TODO fix wrong behavior when compiled without optimizations. +; TODO fix crash when piece reaches bottom. (codegen issue). +; TODO fix wrong behavior when compiled without optimizations (codegen issue). main { diff --git a/examples/test.p8 b/examples/test.p8 index 2e1fb5831..c2dbf2a6c 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -2,34 +2,31 @@ %import c64utils %import c64flt %zeropage basicsafe - +%option enable_floats main { - sub ss(ubyte qq) { - Y=qq - } - - sub tiny() { - Y++ - } - - sub tiny2() { - for A in 10 to 20 { - ubyte xx = A - } - } - sub start() { - uword zomg=2 - A=lsb(zomg) - ss(100) - ss(101) - tiny() - tiny() - tiny2() - tiny2() + ubyte xx = 10 + float ff = 4 + float ff2 = 4 + +; xx /= 2 +; +; xx /= 3 +; +; xx *= 2 +; xx *= 3 + + ;ff **= 2.0 + ;ff **= 3.0 + + ff = ff2 ** 2.0 + ff = ff2 ** 3.0 + +; xx = xx % 5 +; xx %= 5 } }