From 367a2a4cee50cb812266b11eac22cc01cff702e1 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Tue, 12 Oct 2021 22:21:38 +0200 Subject: [PATCH] cleaner return type --- .../compiler/target/cpu6502/codegen/AsmGen.kt | 15 +-- .../assignment/AugmentableAssignmentAsmGen.kt | 108 ++++++------------ 2 files changed, 41 insertions(+), 82 deletions(-) diff --git a/compiler/src/prog8/compiler/target/cpu6502/codegen/AsmGen.kt b/compiler/src/prog8/compiler/target/cpu6502/codegen/AsmGen.kt index 2442d717a..bc476483e 100644 --- a/compiler/src/prog8/compiler/target/cpu6502/codegen/AsmGen.kt +++ b/compiler/src/prog8/compiler/target/cpu6502/codegen/AsmGen.kt @@ -555,13 +555,14 @@ internal class AsmGen(private val program: Program, internal fun asmVariableName(name: Iterable) = fixNameSymbols(name.joinToString(".")) - internal fun loadByteFromPointerIntoA(pointervar: IdentifierReference): Pair { - // returns if the pointer is already on the ZP itself or not (in the latter case SCRATCH_W1 is used as intermediary) + internal fun loadByteFromPointerIntoA(pointervar: IdentifierReference): String { + // returns the source name of the zero page pointervar if it's already in the ZP, + // otherwise returns "P8ZP_SCRATCH_W1" which is the intermediary when (val target = pointervar.targetStatement(program)) { is Label -> { val sourceName = asmSymbolName(pointervar) out(" lda $sourceName") - return Pair(true, sourceName) + return sourceName } is VarDecl -> { val sourceName = asmVariableName(pointervar) @@ -570,7 +571,7 @@ internal class AsmGen(private val program: Program, return if (isZpVar(scopedName)) { // pointervar is already in the zero page, no need to copy out(" lda ($sourceName)") - Pair(true, sourceName) + sourceName } else { out(""" lda $sourceName @@ -578,13 +579,13 @@ internal class AsmGen(private val program: Program, sta P8ZP_SCRATCH_W1 sty P8ZP_SCRATCH_W1+1 lda (P8ZP_SCRATCH_W1)""") - Pair(false, sourceName) + "P8ZP_SCRATCH_W1" } } else { return if (isZpVar(scopedName)) { // pointervar is already in the zero page, no need to copy out(" ldy #0 | lda ($sourceName),y") - Pair(true, sourceName) + sourceName } else { out(""" lda $sourceName @@ -593,7 +594,7 @@ internal class AsmGen(private val program: Program, sty P8ZP_SCRATCH_W1+1 ldy #0 lda (P8ZP_SCRATCH_W1),y""") - Pair(false, sourceName) + "P8ZP_SCRATCH_W1" } } } diff --git a/compiler/src/prog8/compiler/target/cpu6502/codegen/assignment/AugmentableAssignmentAsmGen.kt b/compiler/src/prog8/compiler/target/cpu6502/codegen/assignment/AugmentableAssignmentAsmGen.kt index 5a991066d..c940ab5b6 100644 --- a/compiler/src/prog8/compiler/target/cpu6502/codegen/assignment/AugmentableAssignmentAsmGen.kt +++ b/compiler/src/prog8/compiler/target/cpu6502/codegen/assignment/AugmentableAssignmentAsmGen.kt @@ -293,7 +293,6 @@ internal class AugmentableAssignmentAsmGen(private val program: Program, private fun inplaceModification_byte_value_to_pointer(pointervar: IdentifierReference, operator: String, value: Expression) { asmgen.assignExpressionToVariable(value, "P8ZP_SCRATCH_B1", DataType.UBYTE, null) - val (ptrOnZp, sourceName) = asmgen.loadByteFromPointerIntoA(pointervar) when (operator) { // note: ** (power) operator requires floats. "+" -> asmgen.out(" clc | adc P8ZP_SCRATCH_B1") @@ -324,15 +323,13 @@ internal class AugmentableAssignmentAsmGen(private val program: Program, "^", "xor" -> asmgen.out(" eor P8ZP_SCRATCH_B1") else -> throw AssemblyError("invalid operator for in-place modification $operator") } - if(ptrOnZp) - asmgen.out(" sta ($sourceName),y") - else - asmgen.out(" sta (P8ZP_SCRATCH_W1),y") + val sourceName = asmgen.loadByteFromPointerIntoA(pointervar) + asmgen.out(" sta ($sourceName),y") } private fun inplaceModification_byte_variable_to_pointer(pointervar: IdentifierReference, operator: String, value: IdentifierReference) { val otherName = asmgen.asmVariableName(value) - val (ptrOnZp, sourceName) = asmgen.loadByteFromPointerIntoA(pointervar) + val sourceName = asmgen.loadByteFromPointerIntoA(pointervar) when (operator) { // note: ** (power) operator requires floats. @@ -364,105 +361,72 @@ internal class AugmentableAssignmentAsmGen(private val program: Program, "^", "xor" -> asmgen.out(" eor $otherName") else -> throw AssemblyError("invalid operator for in-place modification $operator") } - if(ptrOnZp) - asmgen.out(" sta ($sourceName),y") - else - asmgen.out(" sta (P8ZP_SCRATCH_W1),y") + asmgen.out(" sta ($sourceName),y") } private fun inplaceModification_byte_litval_to_pointer(pointervar: IdentifierReference, operator: String, value: Int) { when (operator) { // note: ** (power) operator requires floats. "+" -> { - val (ptrOnZp, sourceName) = asmgen.loadByteFromPointerIntoA(pointervar) - asmgen.out(" clc | adc #$value") - if(ptrOnZp) - asmgen.out(" sta ($sourceName),y") - else - asmgen.out(" sta (P8ZP_SCRATCH_W1),y") + val sourceName = asmgen.loadByteFromPointerIntoA(pointervar) + asmgen.out(" clc | adc #$value") + asmgen.out(" sta ($sourceName),y") } "-" -> { - val (ptrOnZp, sourceName) = asmgen.loadByteFromPointerIntoA(pointervar) - asmgen.out(" sec | sbc #$value") - if(ptrOnZp) - asmgen.out(" sta ($sourceName),y") - else - asmgen.out(" sta (P8ZP_SCRATCH_W1),y") + val sourceName = asmgen.loadByteFromPointerIntoA(pointervar) + asmgen.out(" sec | sbc #$value") + asmgen.out(" sta ($sourceName),y") } "*" -> { - val (ptrOnZp, sourceName) = asmgen.loadByteFromPointerIntoA(pointervar) + val sourceName = asmgen.loadByteFromPointerIntoA(pointervar) if(value in asmgen.optimizedByteMultiplications) asmgen.out(" jsr math.mul_byte_${value}") else asmgen.out(" ldy #$value | jsr math.multiply_bytes | ldy #0") - if(ptrOnZp) - asmgen.out(" sta ($sourceName),y") - else - asmgen.out(" sta (P8ZP_SCRATCH_W1),y") + asmgen.out(" sta ($sourceName),y") } "/" -> { - val (ptrOnZp, sourceName) = asmgen.loadByteFromPointerIntoA(pointervar) + val sourceName = asmgen.loadByteFromPointerIntoA(pointervar) if(value==0) throw AssemblyError("division by zero") asmgen.out(" ldy #$value | jsr math.divmod_ub_asm | tya | ldy #0") - if(ptrOnZp) - asmgen.out(" sta ($sourceName),y") - else - asmgen.out(" sta (P8ZP_SCRATCH_W1),y") + asmgen.out(" sta ($sourceName),y") } "%" -> { - val (ptrOnZp, sourceName) = asmgen.loadByteFromPointerIntoA(pointervar) + val sourceName = asmgen.loadByteFromPointerIntoA(pointervar) if(value==0) throw AssemblyError("division by zero") asmgen.out(" ldy #$value | jsr math.divmod_ub_asm | ldy #0") - if(ptrOnZp) - asmgen.out(" sta ($sourceName),y") - else - asmgen.out(" sta (P8ZP_SCRATCH_W1),y") + asmgen.out(" sta ($sourceName),y") } "<<" -> { if (value > 0) { - val (ptrOnZp, sourceName) = asmgen.loadByteFromPointerIntoA(pointervar) + val sourceName = asmgen.loadByteFromPointerIntoA(pointervar) repeat(value) { asmgen.out(" asl a") } - if(ptrOnZp) - asmgen.out(" sta ($sourceName),y") - else - asmgen.out(" sta (P8ZP_SCRATCH_W1),y") + asmgen.out(" sta ($sourceName),y") } } ">>" -> { if (value > 0) { - val (ptrOnZp, sourceName) = asmgen.loadByteFromPointerIntoA(pointervar) + val sourceName = asmgen.loadByteFromPointerIntoA(pointervar) repeat(value) { asmgen.out(" lsr a") } - if(ptrOnZp) - asmgen.out(" sta ($sourceName),y") - else - asmgen.out(" sta (P8ZP_SCRATCH_W1),y") + asmgen.out(" sta ($sourceName),y") } } "&", "and" -> { - val (ptrOnZp, sourceName) = asmgen.loadByteFromPointerIntoA(pointervar) - asmgen.out(" and #$value") - if(ptrOnZp) - asmgen.out(" sta ($sourceName),y") - else - asmgen.out(" sta (P8ZP_SCRATCH_W1),y") + val sourceName = asmgen.loadByteFromPointerIntoA(pointervar) + asmgen.out(" and #$value") + asmgen.out(" sta ($sourceName),y") } "|", "or" -> { - val (ptrOnZp, sourceName) = asmgen.loadByteFromPointerIntoA(pointervar) - asmgen.out(" ora #$value") - if(ptrOnZp) - asmgen.out(" sta ($sourceName),y") - else - asmgen.out(" sta (P8ZP_SCRATCH_W1),y") + val sourceName = asmgen.loadByteFromPointerIntoA(pointervar) + asmgen.out(" ora #$value") + asmgen.out(" sta ($sourceName),y") } "^", "xor" -> { - val (ptrOnZp, sourceName) = asmgen.loadByteFromPointerIntoA(pointervar) - asmgen.out(" eor #$value") - if(ptrOnZp) - asmgen.out(" sta ($sourceName),y") - else - asmgen.out(" sta (P8ZP_SCRATCH_W1),y") + val sourceName = asmgen.loadByteFromPointerIntoA(pointervar) + asmgen.out(" eor #$value") + asmgen.out(" sta ($sourceName),y") } else -> throw AssemblyError("invalid operator for in-place modification $operator") } @@ -1766,15 +1730,12 @@ internal class AugmentableAssignmentAsmGen(private val program: Program, sta $addr""") } is IdentifierReference -> { - val (ptrOnZp, sourceName) = asmgen.loadByteFromPointerIntoA(mem.addressExpression as IdentifierReference) + val sourceName = asmgen.loadByteFromPointerIntoA(mem.addressExpression as IdentifierReference) asmgen.out(""" beq + lda #1 + eor #1""") - if(ptrOnZp) - asmgen.out(" sta ($sourceName),y") - else - asmgen.out(" sta (P8ZP_SCRATCH_W1),y") + asmgen.out(" sta ($sourceName),y") } else -> { asmgen.assignExpressionToVariable(mem.addressExpression, "P8ZP_SCRATCH_W2", DataType.UWORD, target.scope) @@ -1837,12 +1798,9 @@ internal class AugmentableAssignmentAsmGen(private val program: Program, sta $addr""") } is IdentifierReference -> { - val (ptrOnZp, sourceName) = asmgen.loadByteFromPointerIntoA(memory.addressExpression as IdentifierReference) + val sourceName = asmgen.loadByteFromPointerIntoA(memory.addressExpression as IdentifierReference) asmgen.out(" eor #255") - if(ptrOnZp) - asmgen.out(" sta ($sourceName),y") - else - asmgen.out(" sta (P8ZP_SCRATCH_W1),y") + asmgen.out(" sta ($sourceName),y") } else -> { asmgen.assignExpressionToVariable(memory.addressExpression, "P8ZP_SCRATCH_W2", DataType.UWORD, target.scope)