From 1d299c56e0706f126fd8dd813810f7c06a362107 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Thu, 10 Dec 2020 22:18:49 +0100 Subject: [PATCH] fix float '**' (pow) on cx16 --- compiler/res/prog8lib/cx16/floats.p8 | 1 + .../assignment/AugmentableAssignmentAsmGen.kt | 57 +++++++++++++------ 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/compiler/res/prog8lib/cx16/floats.p8 b/compiler/res/prog8lib/cx16/floats.p8 index 88bfc2b96..60867ad1d 100644 --- a/compiler/res/prog8lib/cx16/floats.p8 +++ b/compiler/res/prog8lib/cx16/floats.p8 @@ -64,6 +64,7 @@ romsub $fe7e = FINLOG(byte value @A) clobbers (A, X, Y) ; fac1 += sign romsub $fe81 = FOUT() clobbers(X) -> uword @ AY ; fac1 -> string, address returned in AY romsub $fe8a = SQR() clobbers(A,X,Y) ; fac1 = SQRT(fac1) romsub $fe8d = FPWRT() clobbers(A,X,Y) ; fac1 = fac2 ** fac1 +; note: there is no FPWR() on the Cx16 romsub $fe93 = NEGOP() clobbers(A) ; switch the sign of fac1 romsub $fe96 = EXP() clobbers(A,X,Y) ; fac1 = EXP(fac1) (e ** fac1) romsub $fe9f = RND2(byte value @A) clobbers(A,X,Y) ; fac1 = RND(A) float random number generator diff --git a/compiler/src/prog8/compiler/target/c64/codegen/assignment/AugmentableAssignmentAsmGen.kt b/compiler/src/prog8/compiler/target/c64/codegen/assignment/AugmentableAssignmentAsmGen.kt index 25d926776..33eae85de 100644 --- a/compiler/src/prog8/compiler/target/c64/codegen/assignment/AugmentableAssignmentAsmGen.kt +++ b/compiler/src/prog8/compiler/target/c64/codegen/assignment/AugmentableAssignmentAsmGen.kt @@ -7,6 +7,7 @@ import prog8.ast.statements.Subroutine import prog8.compiler.AssemblyError import prog8.compiler.target.CompilationTarget import prog8.compiler.target.CpuType +import prog8.compiler.target.Cx16Target import prog8.compiler.target.c64.codegen.AsmGen import prog8.compiler.target.c64.codegen.ExpressionsAsmGen import prog8.compiler.toHex @@ -1474,14 +1475,26 @@ internal class AugmentableAssignmentAsmGen(private val program: Program, asmgen.saveRegister(CpuRegister.X, false, scope) when (operator) { "**" -> { - asmgen.out(""" - lda #<$name - ldy #>$name - jsr floats.CONUPK - lda #<$otherName - ldy #>$otherName - jsr floats.FPWR - """) + if(CompilationTarget.instance is Cx16Target) { + // cx16 doesn't have FPWR() only FPWRT() + asmgen.out(""" + lda #<$name + ldy #>$name + jsr floats.CONUPK + lda #<$otherName + ldy #>$otherName + jsr floats.MOVFM + jsr floats.FPWRT + """) + } else + asmgen.out(""" + lda #<$name + ldy #>$name + jsr floats.CONUPK + lda #<$otherName + ldy #>$otherName + jsr floats.FPWR + """) } "+" -> { asmgen.out(""" @@ -1540,14 +1553,26 @@ internal class AugmentableAssignmentAsmGen(private val program: Program, asmgen.saveRegister(CpuRegister.X, false, scope) when (operator) { "**" -> { - asmgen.out(""" - lda #<$name - ldy #>$name - jsr floats.CONUPK - lda #<$constValueName - ldy #>$constValueName - jsr floats.FPWR - """) + if(CompilationTarget.instance is Cx16Target) { + // cx16 doesn't have FPWR() only FPWRT() + asmgen.out(""" + lda #<$name + ldy #>$name + jsr floats.CONUPK + lda #<$constValueName + ldy #>$constValueName + jsr floats.MOVFM + jsr floats.FPWRT + """) + } else + asmgen.out(""" + lda #<$name + ldy #>$name + jsr floats.CONUPK + lda #<$constValueName + ldy #>$constValueName + jsr floats.FPWR + """) } "+" -> { if (value == 0.0)