mirror of
https://github.com/irmen/prog8.git
synced 2024-12-27 05:29:38 +00:00
asm for when statements added
This commit is contained in:
parent
025be8cb7c
commit
4661cba974
@ -955,6 +955,9 @@ internal class AstChecker(private val program: Program,
|
|||||||
tally.filter { it.value>1 }.forEach {
|
tally.filter { it.value>1 }.forEach {
|
||||||
checkResult.add(SyntaxError("choice value occurs multiple times", it.key.position))
|
checkResult.add(SyntaxError("choice value occurs multiple times", it.key.position))
|
||||||
}
|
}
|
||||||
|
if(whenStatement.choices.isEmpty())
|
||||||
|
checkResult.add(SyntaxError("empty when statement", whenStatement.position))
|
||||||
|
|
||||||
super.visit(whenStatement)
|
super.visit(whenStatement)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,27 +329,6 @@ internal class StatementReorderer(private val program: Program): IAstModifyingVi
|
|||||||
return super.visit(typecast)
|
return super.visit(typecast)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visit(whenStatement: WhenStatement): Statement {
|
|
||||||
// make sure all choices are just for one single value
|
|
||||||
val choices = whenStatement.choices.toList()
|
|
||||||
for(choice in choices) {
|
|
||||||
val choiceValues = choice.values
|
|
||||||
if(choiceValues==null || choiceValues.size==1)
|
|
||||||
continue
|
|
||||||
for(v in choiceValues) {
|
|
||||||
val newchoice=WhenChoice(listOf(v), choice.statements, choice.position)
|
|
||||||
newchoice.parent = choice.parent
|
|
||||||
whenStatement.choices.add(newchoice)
|
|
||||||
}
|
|
||||||
whenStatement.choices.remove(choice)
|
|
||||||
}
|
|
||||||
|
|
||||||
// sort the choices in low-to-high value order (nulls last)
|
|
||||||
whenStatement.choices
|
|
||||||
.sortWith(compareBy<WhenChoice, Int?>(nullsLast(), {it.values?.single()?.constValue(program)?.number?.toInt()}))
|
|
||||||
return super.visit(whenStatement)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visit(memread: DirectMemoryRead): Expression {
|
override fun visit(memread: DirectMemoryRead): Expression {
|
||||||
// make sure the memory address is an uword
|
// make sure the memory address is an uword
|
||||||
val dt = memread.addressExpression.inferType(program)
|
val dt = memread.addressExpression.inferType(program)
|
||||||
|
@ -837,7 +837,44 @@ internal class AsmGen2(val program: Program,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun translate(stmt: WhenStatement) {
|
private fun translate(stmt: WhenStatement) {
|
||||||
TODO("when $stmt")
|
translateExpression(stmt.condition)
|
||||||
|
val endLabel = makeLabel("choice_end")
|
||||||
|
val choiceBlocks = mutableListOf<Pair<String, AnonymousScope>>()
|
||||||
|
val conditionDt = stmt.condition.inferType(program)!!
|
||||||
|
if(conditionDt in ByteDatatypes)
|
||||||
|
out(" inx | lda $ESTACK_LO_HEX,x")
|
||||||
|
else
|
||||||
|
out(" inx | lda $ESTACK_LO_HEX,x | ldy $ESTACK_HI_HEX,x")
|
||||||
|
for(choice in stmt.choices) {
|
||||||
|
val choiceLabel = makeLabel("choice")
|
||||||
|
if(choice.values==null) {
|
||||||
|
// the else choice
|
||||||
|
translate(choice.statements)
|
||||||
|
out(" jmp $endLabel")
|
||||||
|
} else {
|
||||||
|
choiceBlocks.add(Pair(choiceLabel, choice.statements))
|
||||||
|
for (cv in choice.values!!) {
|
||||||
|
val value = (cv as NumericLiteralValue).number.toInt()
|
||||||
|
if(conditionDt in ByteDatatypes) {
|
||||||
|
out(" cmp #${value.toHex()} | beq $choiceLabel")
|
||||||
|
} else {
|
||||||
|
out("""
|
||||||
|
cmp #<${value.toHex()}
|
||||||
|
bne +
|
||||||
|
cpy #>${value.toHex()}
|
||||||
|
beq $choiceLabel
|
||||||
|
+
|
||||||
|
""")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(choiceBlock in choiceBlocks) {
|
||||||
|
out(choiceBlock.first)
|
||||||
|
translate(choiceBlock.second)
|
||||||
|
out(" jmp $endLabel")
|
||||||
|
}
|
||||||
|
out(endLabel)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun translate(stmt: Label) {
|
private fun translate(stmt: Label) {
|
||||||
|
@ -59,6 +59,7 @@
|
|||||||
9999 -> c64scr.print("ninetynine99")
|
9999 -> c64scr.print("ninetynine99")
|
||||||
else -> c64scr.print("don't know")
|
else -> c64scr.print("don't know")
|
||||||
}
|
}
|
||||||
|
|
||||||
c64.CHROUT('\n')
|
c64.CHROUT('\n')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user