cx16 reserved zp vars (virtual registers)

This commit is contained in:
Irmen de Jong 2022-01-15 13:49:49 +01:00
parent fba98d03a5
commit a798fe72d3
5 changed files with 24 additions and 17 deletions

View File

@ -68,21 +68,6 @@ class CX16MachineDefinition: IMachineDefinition {
override fun isIOAddress(address: UInt): Boolean = address==0u || address==1u || address in 0x9f00u..0x9fffu
// TODO integrate this in the internal list of allocated zp variables:
// override fun getPreallocatedZeropageVars(): Map<String, Pair<UInt, DataType>> {
// val vars = mutableMapOf<String, Pair<UInt, DataType>>()
// for(reg in 0..15) {
// vars["cx16.r${reg}"] = (2+reg*2).toUInt() to DataType.UWORD // cx16.r0 .. cx16.r15
// vars["cx16.r${reg}s"] = (2+reg*2).toUInt() to DataType.WORD // cx16.r0s .. cx16.r15s
// vars["cx16.r${reg}L"] = (2+reg*2).toUInt() to DataType.UBYTE // cx16.r0L .. cx16.r15L
// vars["cx16.r${reg}H"] = (3+reg*2).toUInt() to DataType.UBYTE // cx16.r0H .. cx16.r15H
// vars["cx16.r${reg}sL"] = (2+reg*2).toUInt() to DataType.BYTE // cx16.r0sL .. cx16.r15sL
// vars["cx16.r${reg}sH"] = (3+reg*2).toUInt() to DataType.BYTE // cx16.r0sH .. cx16.r15sH
// }
// return vars
// }
override fun initializeZeropage(compilerOptions: CompilationOptions) {
zeropage = CX16Zeropage(compilerOptions)
}

View File

@ -1,5 +1,6 @@
package prog8.codegen.target.cx16
import prog8.ast.base.DataType
import prog8.compilerinterface.CompilationOptions
import prog8.compilerinterface.InternalCompilerException
import prog8.compilerinterface.Zeropage
@ -37,5 +38,15 @@ class CX16Zeropage(options: CompilationOptions) : Zeropage(options) {
}
removeReservedFromFreePool()
for(reg in 0..15) {
allocatedVariables["cx16.r${reg}"] = ((2+reg*2).toUInt() to 2) to DataType.UWORD // cx16.r0 .. cx16.r15
allocatedVariables["cx16.r${reg}s"] = ((2+reg*2).toUInt() to 2) to DataType.WORD // cx16.r0s .. cx16.r15s
allocatedVariables["cx16.r${reg}L"] = ((2+reg*2).toUInt() to 1) to DataType.UBYTE // cx16.r0L .. cx16.r15L
allocatedVariables["cx16.r${reg}H"] = ((3+reg*2).toUInt() to 1) to DataType.UBYTE // cx16.r0H .. cx16.r15H
allocatedVariables["cx16.r${reg}sL"] = ((2+reg*2).toUInt() to 1) to DataType.BYTE // cx16.r0sL .. cx16.r15sL
allocatedVariables["cx16.r${reg}sH"] = ((3+reg*2).toUInt() to 1) to DataType.BYTE // cx16.r0sH .. cx16.r15sH
}
}
}

View File

@ -11,6 +11,7 @@ import io.kotest.matchers.collections.shouldBeIn
import io.kotest.matchers.collections.shouldNotBeIn
import io.kotest.matchers.comparables.shouldBeGreaterThan
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import prog8.ast.base.DataType
import prog8.ast.expressions.Expression
import prog8.ast.statements.RegisterOrStatusflag
@ -287,4 +288,15 @@ class TestCx16Zeropage: FunSpec({
0x02u shouldNotBeIn zp1.free
0x21u shouldNotBeIn zp1.free
}
test("preallocated zp vars") {
val zp1 = CX16Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.FULL, emptyList(), false, false, Cx16Target))
zp1.allocatedZeropageVariable("test") shouldBe null
zp1.allocatedZeropageVariable("cx16.r0") shouldNotBe null
zp1.allocatedZeropageVariable("cx16.r15") shouldNotBe null
zp1.allocatedZeropageVariable("cx16.r0L") shouldNotBe null
zp1.allocatedZeropageVariable("cx16.r15L") shouldNotBe null
zp1.allocatedZeropageVariable("cx16.r0sH") shouldNotBe null
zp1.allocatedZeropageVariable("cx16.r15sH") shouldNotBe null
}
})

View File

@ -104,5 +104,5 @@ abstract class Zeropage(protected val options: CompilationOptions) {
fun allocatedZeropageVariable(scopedname: String): Pair<Pair<UInt, Int>, DataType>? = allocatedVariables[scopedname]
private val allocatedVariables = mutableMapOf<String, Pair<Pair<UInt, Int>, DataType>>()
protected val allocatedVariables = mutableMapOf<String, Pair<Pair<UInt, Int>, DataType>>()
}

View File

@ -4,7 +4,6 @@ TODO
For next compiler release (7.7)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- fix array and string initialization in zeropage
- fix cx16 zeropage preallocated vars (virtual regs)
- fix ForloopAsmGen zp allocation handling
- check all examples if they still run correctly (c64 + cx16)
- document check: arrays and strings can also be placed in zeropage (but almost never should, due to size!)