add support for pointer sizes >2 to configurable targets

This commit is contained in:
Irmen de Jong committed 2026-08-13 22:23:47 +02:00
1 parent f011d3f100
commit d702ace09f
10 files changed
+93 -6

No files matched your search

@@ -38,8 +38,13 @@ class ConfigFileTarget(
val virtualregistersStart: UInt,
val zpFullsafe: List<UIntRange>,
val zpKernalsafe: List<UIntRange>,
val zpBasicsafe: List<UIntRange>
): ICompilationTarget, IStringEncoding by Encoder(true), IMemSizer by NormalMemSizer(8) {
val zpBasicsafe: List<UIntRange>,
val pointerSize: Int = 2
): ICompilationTarget, IStringEncoding by Encoder(true), IMemSizer by NormalMemSizer(8, pointerSize) {
init {
require(pointerSize == 2 || pointerSize == 4) { "unsupported pointer size: $pointerSize" }
}
companion object {
@@ -66,6 +71,12 @@ class ConfigFileTarget(
return value.toUInt()
}
private fun parsePointerSize(props: Properties): Int {
val pointerSize = parseInt(props.getProperty("pointer_size", "2")).toInt()
require(pointerSize == 2 || pointerSize == 4) { "unsupported pointer size: $pointerSize" }
return pointerSize
}
private fun parseAddressRanges(key: String, props: Properties): List<UIntRange> {
val rangesStr = props.getString(key)
if(rangesStr.isBlank())
@@ -111,6 +122,7 @@ class ConfigFileTarget(
(customLauncherStr+"\n").lines().map { it.trimEnd() }
else emptyList()
val assemblerOptionsStr = props.getProperty("assembler_options", "").trim()
val pointerSize = parsePointerSize(props)
val outputTypeString = props.getProperty("output_type", "PRG")
val defaultOutputType = OutputType.valueOf(outputTypeString.uppercase())
val launcherString = props.getProperty("launcher", "BASIC")
@@ -146,6 +158,7 @@ class ConfigFileTarget(
zpFullsafe,
zpKernalsafe,
zpBasicsafe,
pointerSize,
)
}
}
@@ -154,8 +167,8 @@ class ConfigFileTarget(
override val FLOAT_MAX_POSITIVE = 9.999999999e97
override val FLOAT_MAX_NEGATIVE = -9.999999999e97
override val FLOAT_MEM_SIZE = 8u
override val POINTER_MEM_SIZE = 2u // TODO should support other pointer size as well
override val ARRAY_SIZE_LIMIT = 256u // TODO should support other size as well
override val POINTER_MEM_SIZE = pointerSize.toUInt()
override val ARRAY_SIZE_LIMIT = 256u
override lateinit var zeropage: Zeropage
override fun getFloatAsmBytes(num: Number) = TODO("floats")
@@ -0,0 +1,66 @@
package prog8tests.codecore
import io.kotest.core.spec.style.FunSpec
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.matchers.shouldBe
import prog8.code.core.BaseDataType
import prog8.code.target.ConfigFileTarget
import java.nio.file.Files
import kotlin.io.path.writeText
class TestConfigFileTarget: FunSpec({
fun loadTarget(extraProperties: String = ""): ConfigFileTarget {
val directory = Files.createTempDirectory("prog8-config-target")
val library = Files.createDirectories(directory.resolve("library"))
val config = directory.resolve("target.properties")
config.writeText(
"""
cpu = 65C02
encoding = iso
load_address = 2048
memtop = 65535
bss_highram_start = 0
bss_highram_end = 0
bss_goldenram_start = 0
bss_goldenram_end = 0
zp_scratch_b1 = 240
zp_scratch_reg = 241
zp_scratch_w1 = 242
zp_scratch_w2 = 244
zp_scratch_ptr = 246
virtual_registers = 2
zp_fullsafe = 34-239
zp_kernalsafe = 34-239
zp_basicsafe = 34-239
io_regions =
""".trimIndent() + "\nlibrary = $library\n$extraProperties"
)
return try {
ConfigFileTarget.fromConfigFile(config)
} finally {
directory.toFile().deleteRecursively()
}
}
test("legacy config defaults to 2-byte pointers and 256 element arrays") {
val target = loadTarget()
target.POINTER_MEM_SIZE shouldBe 2u
target.memorySize(BaseDataType.POINTER) shouldBe 2
target.ARRAY_SIZE_LIMIT shouldBe 256u
}
test("config supports 4-byte pointers") {
val target = loadTarget("pointer_size = 4")
target.POINTER_MEM_SIZE shouldBe 4u
target.memorySize(BaseDataType.POINTER) shouldBe 4
target.ARRAY_SIZE_LIMIT shouldBe 256u
}
test("config rejects unsupported pointer sizes") {
shouldThrow<IllegalArgumentException> {
loadTarget("pointer_size = 3")
}
}
})