adding @alignword/page on individual variables

This commit is contained in:
Irmen de Jong
2024-10-26 00:30:14 +02:00
parent 97b8cb748d
commit 1cd754f05d
33 changed files with 433 additions and 119 deletions
+6
View File
@@ -2,6 +2,7 @@ package prog8.code
import prog8.code.ast.PtNode
import prog8.code.ast.PtProgram
import prog8.code.ast.PtVariable
import prog8.code.core.*
@@ -182,6 +183,7 @@ class StStaticVariable(name: String,
val initializationArrayValue: StArray?,
val length: Int?, // for arrays: the number of elements, for strings: number of characters *including* the terminating 0-byte
val zpwish: ZeropageWish, // used in the variable allocator
val align: PtVariable.Alignment,
astNode: PtNode) : StNode(name, StNodeType.STATICVAR, astNode) {
var initializationNumericValue: Double? = null
@@ -216,6 +218,10 @@ class StStaticVariable(name: String,
require(dt == DataType.STR)
require(length == initializationStringValue.first.length+1)
}
if(align!=PtVariable.Alignment.NONE) {
require(dt == DataType.STR || dt in ArrayDatatypes)
require(zpwish != ZeropageWish.REQUIRE_ZEROPAGE && zpwish != ZeropageWish.PREFER_ZEROPAGE)
}
}
}
+1 -2
View File
@@ -3,7 +3,6 @@ package prog8.code
import prog8.code.ast.*
import prog8.code.core.*
import prog8.code.target.VMTarget
import kotlin.collections.ArrayDeque
class SymbolTableMaker(private val program: PtProgram, private val options: CompilationOptions) {
@@ -98,7 +97,7 @@ class SymbolTableMaker(private val program: PtProgram, private val options: Comp
// if(node.type in SplitWordArrayTypes) {
// ... split array also add _lsb and _msb to symboltable?
// }
val stVar = StStaticVariable(node.name, node.type, initialString, initialArray, numElements, node.zeropage, node)
val stVar = StStaticVariable(node.name, node.type, initialString, initialArray, numElements, node.zeropage, node.align, node)
if(initialNumeric!=null)
stVar.setOnetimeInitNumeric(initialNumeric)
stVar
+7 -2
View File
@@ -126,13 +126,18 @@ fun printAst(root: PtNode, skipLibraries: Boolean, output: (text: String) -> Uni
}
is PtVariable -> {
val split = if(node.type in SplitWordArrayTypes) "@split" else ""
val align = when(node.align) {
PtVariable.Alignment.NONE -> ""
PtVariable.Alignment.WORD -> "@alignword"
PtVariable.Alignment.PAGE -> "@alignpage"
}
val str = if(node.arraySize!=null) {
val eltType = ArrayToElementTypes.getValue(node.type)
"${eltType.name.lowercase()}[${node.arraySize}] $split ${node.name}"
"${eltType.name.lowercase()}[${node.arraySize}] $split $align ${node.name}"
}
else if(node.type in ArrayDatatypes) {
val eltType = ArrayToElementTypes.getValue(node.type)
"${eltType.name.lowercase()}[] $split ${node.name}"
"${eltType.name.lowercase()}[] $split $align ${node.name}"
}
else
"${node.type.name.lowercase()} ${node.name}"
+15 -1
View File
@@ -149,10 +149,24 @@ sealed interface IPtVariable {
}
class PtVariable(name: String, override val type: DataType, val zeropage: ZeropageWish, val value: PtExpression?, val arraySize: UInt?, position: Position) : PtNamedNode(name, position), IPtVariable {
class PtVariable(
name: String,
override val type: DataType,
val zeropage: ZeropageWish,
val align: Alignment,
val value: PtExpression?,
val arraySize: UInt?,
position: Position
) : PtNamedNode(name, position), IPtVariable {
init {
value?.let {it.parent=this}
}
enum class Alignment {
NONE,
WORD,
PAGE
}
}