diff --git a/compiler/src/prog8/compiler/astprocessing/AstChecker.kt b/compiler/src/prog8/compiler/astprocessing/AstChecker.kt index 7f872fdff..8a8bb470b 100644 --- a/compiler/src/prog8/compiler/astprocessing/AstChecker.kt +++ b/compiler/src/prog8/compiler/astprocessing/AstChecker.kt @@ -2093,7 +2093,9 @@ internal class AstChecker(private val program: Program, } override fun visit(memread: DirectMemoryRead) { - if(!allowedMemoryAccessAddressExpression(memread.addressExpression, program)) + if(memread.addressExpression.inferType(program).isLong) + errors.err("long address not yet supported", memread.addressExpression.position) + else if(!allowedMemoryAccessAddressExpression(memread.addressExpression, program)) errors.err("invalid address type for memory access, expected ^^ubyte or just uword", memread.position) val pointervar = memread.addressExpression as? IdentifierReference @@ -2126,7 +2128,9 @@ internal class AstChecker(private val program: Program, } override fun visit(memwrite: DirectMemoryWrite) { - if(!allowedMemoryAccessAddressExpression(memwrite.addressExpression, program)) + if(memwrite.addressExpression.inferType(program).isLong) + errors.err("long address not yet supported", memwrite.addressExpression.position) + else if(!allowedMemoryAccessAddressExpression(memwrite.addressExpression, program)) errors.err("invalid address type for memory access, expected ^^ubyte or just uword", memwrite.position) val pointervar = memwrite.addressExpression as? IdentifierReference diff --git a/compiler/src/prog8/compiler/astprocessing/TypecastsAdder.kt b/compiler/src/prog8/compiler/astprocessing/TypecastsAdder.kt index aabbc9d64..8e861ca71 100644 --- a/compiler/src/prog8/compiler/astprocessing/TypecastsAdder.kt +++ b/compiler/src/prog8/compiler/astprocessing/TypecastsAdder.kt @@ -339,8 +339,13 @@ class TypecastsAdder(val program: Program, val options: CompilationOptions, val } override fun after(memread: DirectMemoryRead, parent: Node): Iterable { - // make sure the memory address is an uword or a pointer (to whatever type), otherwise cast + // make sure the memory address is an uword or long or a pointer (to whatever type), otherwise cast val dt = memread.addressExpression.inferType(program).getOr(DataType.UWORD) + if(dt.isLong) { + val constAddr = memread.addressExpression.constValue(program)?.number + if(constAddr==null || constAddr>=65536) + return noModifications + } if(dt.isUndefined || dt.isUnsignedWord || dt.isPointer) return noModifications @@ -354,8 +359,13 @@ class TypecastsAdder(val program: Program, val options: CompilationOptions, val } override fun after(memwrite: DirectMemoryWrite, parent: Node): Iterable { - // make sure the memory address is an uword or a pointer (to whatever type), otherwise cast + // make sure the memory address is an uword or long or a pointer (to whatever type), otherwise cast val dt = memwrite.addressExpression.inferType(program).getOr(DataType.UWORD) + if(dt.isLong) { + val constAddr = memwrite.addressExpression.constValue(program)?.number + if(constAddr==null || constAddr>=65536) + return noModifications + } if(dt.isUndefined || dt.isUnsignedWord || dt.isPointer) return noModifications diff --git a/compiler/test/TestMemory.kt b/compiler/test/TestMemory.kt index 5a3125bd0..f2592fead 100644 --- a/compiler/test/TestMemory.kt +++ b/compiler/test/TestMemory.kt @@ -16,10 +16,7 @@ import prog8.ast.expressions.PrefixExpression import prog8.ast.statements.* import prog8.code.core.* import prog8.code.source.SourceCode -import prog8.code.target.C128Target -import prog8.code.target.C64Target -import prog8.code.target.PETTarget -import prog8.code.target.VMTarget +import prog8.code.target.* import prog8tests.helpers.* @@ -438,4 +435,24 @@ main { errors.errors[0] shouldContain "8:9: cannot assign to an array or string that is located in ROM" errors.errors[1] shouldContain "9:9: cannot assign to an array or string that is located in ROM" } + + test("long addresses not yet supported in memread and memwrite") { + val src = """ +main { + sub start() { + const long bufferll = 888888 + long @shared addrlv = 777777 + + cx16.r0L = bufferll[2] + cx16.r1L = @(999999) + cx16.r2L = @(addrlv) + } +}""" + val errors = ErrorReporterForTests() + compileText(Cx16Target(), true, src, outputDir, errors = errors, writeAssembly = false) shouldBe null + errors.errors.size shouldBe 3 + errors.errors[0] shouldContain "long address not yet supported" + errors.errors[1] shouldContain "long address not yet supported" + errors.errors[2] shouldContain "long address not yet supported" + } })