From 98d2c64d5d6ad7deefaebbf48d959420a0a7143c Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Fri, 3 Nov 2023 00:39:43 +0100 Subject: [PATCH] fix assembly error for uword[3] @zp @split word_addrs --- .../prog8/codegen/cpu6502/ProgramAndVarsGen.kt | 10 +++++++++- compiler/test/codegeneration/TestArrayThings.kt | 15 +++++++++++++++ docs/source/todo.rst | 1 - 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/codeGenCpu6502/src/prog8/codegen/cpu6502/ProgramAndVarsGen.kt b/codeGenCpu6502/src/prog8/codegen/cpu6502/ProgramAndVarsGen.kt index ba73f7b2a..c1c323cf1 100644 --- a/codeGenCpu6502/src/prog8/codegen/cpu6502/ProgramAndVarsGen.kt +++ b/codeGenCpu6502/src/prog8/codegen/cpu6502/ProgramAndVarsGen.kt @@ -497,7 +497,15 @@ internal class ProgramAndVarsGen( for ((scopedName, zpvar) in zpVariables) { if (scopedName.startsWith("cx16.r")) continue // The 16 virtual registers of the cx16 are not actual variables in zp, they're memory mapped - asmgen.out("${scopedName.substringAfterLast('.')} \t= ${zpvar.address} \t; zp ${zpvar.dt}") + val variable = symboltable.flat.getValue(scopedName) as StStaticVariable + if(variable.dt in SplitWordArrayTypes) { + val lsbAddr = zpvar.address + val msbAddr = zpvar.address + (zpvar.size/2).toUInt() + asmgen.out("${scopedName.substringAfterLast('.')}_lsb \t= $lsbAddr \t; zp ${zpvar.dt} (lsbs)") + asmgen.out("${scopedName.substringAfterLast('.')}_msb \t= $msbAddr \t; zp ${zpvar.dt} (msbs)") + } else { + asmgen.out("${scopedName.substringAfterLast('.')} \t= ${zpvar.address} \t; zp ${zpvar.dt}") + } } } diff --git a/compiler/test/codegeneration/TestArrayThings.kt b/compiler/test/codegeneration/TestArrayThings.kt index b2bc2f6ba..14922d2a9 100644 --- a/compiler/test/codegeneration/TestArrayThings.kt +++ b/compiler/test/codegeneration/TestArrayThings.kt @@ -8,6 +8,7 @@ import prog8.code.target.C64Target import prog8.code.target.VMTarget import prog8tests.helpers.ErrorReporterForTests import prog8tests.helpers.compileText +import kotlin.io.path.readText class TestArrayThings: FunSpec({ test("assign prefix var to array should compile fine and is not split into inplace array modification") { @@ -160,5 +161,19 @@ main { compileText(VMTarget(), false, text, writeAssembly = true) shouldNotBe null compileText(C64Target(), false, text, writeAssembly = true) shouldNotBe null } + + test("split array in zeropage is okay") { + val text = """ +main { + sub start() { + uword[3] @zp @split @shared thearray + } +}""" + val result = compileText(C64Target(), false, text, writeAssembly = true)!! + val assemblyFile = result.compilationOptions.outputDir.resolve(result.compilerAst.name + ".asm") + val assembly = assemblyFile.readText() + assembly shouldContain "thearray_lsb" + assembly shouldContain "thearray_msb" + } }) diff --git a/docs/source/todo.rst b/docs/source/todo.rst index 872e02633..07c4a4255 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -1,7 +1,6 @@ TODO ==== -- fix assembly error for uword[3] @zp @split word_addrs (not defined symbol 'p8_word_addrs_lsb') - fix fill() to not access pixels outside of the screen (use virtual testmongfx first?) - change fill() to use unsigned types for optimization, and re-check previous problem.