From 4cae2c56ec730827f854b17cb6334deed0c1cf93 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Thu, 25 Mar 2021 22:02:45 +0100 Subject: [PATCH] implemented last remaining codegen for word-byte division and remainders. --- compiler/res/version.txt | 2 +- .../assignment/AugmentableAssignmentAsmGen.kt | 45 +++++++++++++++---- examples/test.p8 | 36 +-------------- 3 files changed, 38 insertions(+), 45 deletions(-) diff --git a/compiler/res/version.txt b/compiler/res/version.txt index 1ebcdd77a..c596943a9 100644 --- a/compiler/res/version.txt +++ b/compiler/res/version.txt @@ -1 +1 @@ -6.4-SNAPSHOT +6.4 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 12e752f97..347c7966b 100644 --- a/compiler/src/prog8/compiler/target/cpu6502/codegen/assignment/AugmentableAssignmentAsmGen.kt +++ b/compiler/src/prog8/compiler/target/cpu6502/codegen/assignment/AugmentableAssignmentAsmGen.kt @@ -1051,20 +1051,47 @@ internal class AugmentableAssignmentAsmGen(private val program: Program, } "/" -> { if(dt==DataType.UWORD) { - TODO("uwordvar / bytevar") + asmgen.out(""" + lda $name + ldy $name+1 + sta P8ZP_SCRATCH_W1 + sty P8ZP_SCRATCH_W1+1 + lda $otherName + ldy #0 + jsr math.divmod_uw_asm + sta $name + sty $name+1 + """) } else { - TODO("wordvar / bytevar") + asmgen.out(""" + lda $name + ldy $name+1 + sta P8ZP_SCRATCH_W1 + sty P8ZP_SCRATCH_W1+1 + lda $otherName + ldy #0 + jsr math.divmod_w_asm + sta $name + sty $name+1 + """) } } "%" -> { if(valueDt!=DataType.UBYTE || dt!=DataType.UWORD) - throw AssemblyError("% expects unsigned operands") - if(dt==DataType.UWORD) { - TODO("uwordvar % ubytevar") - } else { - TODO("wordvar % ubytevar") - } - } + throw AssemblyError("remainder of signed integers is not properly defined/implemented, use unsigned instead") + asmgen.out(""" + lda $name + ldy $name+1 + sta P8ZP_SCRATCH_W1 + sty P8ZP_SCRATCH_W1+1 + lda $otherName + ldy #0 + jsr math.divmod_uw_asm + lda P8ZP_SCRATCH_W2 + sta $name + lda P8ZP_SCRATCH_W2+1 + sta $name+1 + """) } "<<" -> { asmgen.out(""" ldy $otherName diff --git a/examples/test.p8 b/examples/test.p8 index 7b4051b0e..89c29f404 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -5,41 +5,7 @@ main { sub start() { - word wvar - word wvar2 - uword uwvar - uword uwvar2 - byte bvar - byte bvar2 - ubyte ubvar - - uwvar result - - uwvar = 49999 - uwvar2 = 1234 - result = uwvar / uwvar2 - txt.print_uw(result) - result = uwvar % uwvar2 - txt.print_uw(result) - - ; uwvar %= uwvar2 - - -; wvar /= bvar -; uwvar /= bvar -; uwvar %= ubvar - - - -; ubyte[] array = [1,2,3,4] -; ubyte ix -; -; ubyte a = array[1] + array[ix] -; a = array[ix] + array[ix] -; a = array[ix+1] + array[ix] -; uword multiple=0 -; a = array[lsb(multiple)] + array[ix] - + txt.print("hello") ; str filename = "titlescreen.bin" ; ubyte success = cx16.vload(filename, 8, 0, $0000)