get rid of some empty lines in the generated asm

This commit is contained in:
Irmen de Jong 2025-01-05 19:28:39 +01:00
parent 3b5cda85ff
commit f0e8ff0326
8 changed files with 60 additions and 157 deletions

View File

@ -100,7 +100,7 @@ class DataType private constructor(val base: BaseDataType, val sub: BaseDataType
if(actualElementDt.isNumericOrBool && actualElementDt != BaseDataType.LONG)
DataType(BaseDataType.ARRAY, actualElementDt)
else
throw NoSuchElementException("invalid element dt "+elementDt)
throw NoSuchElementException("invalid element dt $elementDt")
}
}
}

View File

@ -961,8 +961,7 @@ $repeatLabel""")
bne +
cpy #>${value.toHex()}
beq $choiceLabel
+
""")
+""")
}
}
}
@ -1109,8 +1108,7 @@ $repeatLabel""")
cmp #$80
bcc +
dey
+
""")
+""")
else -> throw AssemblyError("need byte type")
}
}
@ -1124,8 +1122,7 @@ $repeatLabel""")
cmp #$80
bcc +
dex
+
""")
+""")
else -> throw AssemblyError("need byte type")
}
}

View File

@ -1491,8 +1491,7 @@ internal class AssignmentAsmGen(
assignExpressionToRegister(left, RegisterOrPair.AY, dt.isSigned)
val castedSymname = asmgen.asmVariableName(castedValue)
if (expr.operator == "+")
asmgen.out(
"""
asmgen.out("""
clc
adc $castedSymname
bcc +
@ -1500,8 +1499,7 @@ internal class AssignmentAsmGen(
+"""
)
else
asmgen.out(
"""
asmgen.out("""
sec
sbc $castedSymname
bcs +
@ -2677,8 +2675,7 @@ $endLabel""")
lda #<$sourceName
ldy #>$sourceName
sta ${target.asmVarname}
sty ${target.asmVarname}+1
""")
sty ${target.asmVarname}+1""")
}
target.datatype.isString || target.datatype.isUnsignedByteArray || target.datatype.isByteArray -> {
asmgen.out("""
@ -2798,13 +2795,11 @@ $endLabel""")
RegisterOrPair.AY -> asmgen.out(" ldy $sourceName+1 | lda $sourceName")
RegisterOrPair.XY -> asmgen.out(" ldy $sourceName+1 | ldx $sourceName")
in Cx16VirtualRegisters -> {
asmgen.out(
"""
asmgen.out("""
lda $sourceName
sta cx16.${target.register.toString().lowercase()}
lda $sourceName+1
sta cx16.${target.register.toString().lowercase()}+1
""")
sta cx16.${target.register.toString().lowercase()}+1""")
}
else -> throw AssemblyError("can't load word in a single 8-bit register")
}
@ -2825,8 +2820,7 @@ $endLabel""")
asmgen.out("""
ldx #<${target.asmVarname}
ldy #>${target.asmVarname}
jsr floats.MOVMF
""")
jsr floats.MOVMF""")
}
TargetStorageKind.ARRAY -> {
asmgen.assignExpressionToRegister(target.array!!.index, RegisterOrPair.A, false)
@ -2924,8 +2918,7 @@ $endLabel""")
TargetStorageKind.VARIABLE -> {
asmgen.out("""
lda $sourceName
sta ${target.asmVarname}
""")
sta ${target.asmVarname}""")
}
TargetStorageKind.MEMORY -> {
asmgen.out(" lda $sourceName")
@ -2951,13 +2944,11 @@ $endLabel""")
RegisterOrPair.XY -> asmgen.out(" ldy #0 | ldx $sourceName")
RegisterOrPair.FAC1, RegisterOrPair.FAC2 -> throw AssemblyError("expected typecasted byte to float")
in Cx16VirtualRegisters -> {
asmgen.out(
"""
asmgen.out("""
lda $sourceName
sta cx16.${target.register.toString().lowercase()}
lda #0
sta cx16.${target.register.toString().lowercase()}+1
""")
sta cx16.${target.register.toString().lowercase()}+1""")
}
else -> throw AssemblyError("weird register")
}
@ -2975,8 +2966,7 @@ $endLabel""")
ora #$7f
bmi +
lda #0
+ sta ${wordtarget.asmVarname}+1
""")
+ sta ${wordtarget.asmVarname}+1""")
}
TargetStorageKind.ARRAY -> {
if(wordtarget.array!!.splitWords) {
@ -3759,8 +3749,7 @@ $endLabel""")
stz ${target.asmVarname}+1
stz ${target.asmVarname}+2
stz ${target.asmVarname}+3
stz ${target.asmVarname}+4
""")
stz ${target.asmVarname}+4""")
else
asmgen.out("""
lda #0
@ -3768,8 +3757,7 @@ $endLabel""")
sta ${target.asmVarname}+1
sta ${target.asmVarname}+2
sta ${target.asmVarname}+3
sta ${target.asmVarname}+4
""")
sta ${target.asmVarname}+4""")
}
TargetStorageKind.ARRAY -> {
asmgen.assignExpressionToRegister(target.array!!.index, RegisterOrPair.A, false)
@ -3815,8 +3803,7 @@ $endLabel""")
sty P8ZP_SCRATCH_W2
ldy #>${target.asmVarname}
sty P8ZP_SCRATCH_W2+1
jsr floats.set_array_float
""")
jsr floats.set_array_float""")
}
TargetStorageKind.MEMORY -> throw AssemblyError("can't assign float to memory byte")
TargetStorageKind.REGISTER -> {
@ -3837,8 +3824,7 @@ $endLabel""")
TargetStorageKind.VARIABLE -> {
asmgen.out("""
lda ${address.toHex()}
sta ${target.asmVarname}
""")
sta ${target.asmVarname}""")
}
TargetStorageKind.MEMORY -> {
asmgen.out(" lda ${address.toHex()}")
@ -3857,13 +3843,11 @@ $endLabel""")
RegisterOrPair.XY -> asmgen.out(" ldy #0 | ldy ${address.toHex()}")
RegisterOrPair.FAC1, RegisterOrPair.FAC2 -> throw AssemblyError("expected typecasted byte to float")
in Cx16VirtualRegisters -> {
asmgen.out(
"""
asmgen.out("""
lda ${address.toHex()}
sta cx16.${target.register.toString().lowercase()}
lda #0
sta cx16.${target.register.toString().lowercase()}+1
""")
sta cx16.${target.register.toString().lowercase()}+1""")
}
else -> throw AssemblyError("weird register")
}
@ -3893,12 +3877,10 @@ $endLabel""")
RegisterOrPair.XY -> asmgen.out(" tax | ldy #0")
RegisterOrPair.FAC1, RegisterOrPair.FAC2 -> throw AssemblyError("expected typecasted byte to float")
in Cx16VirtualRegisters -> {
asmgen.out(
"""
asmgen.out("""
sta cx16.${target.register.toString().lowercase()}
lda #0
sta cx16.${target.register.toString().lowercase()}+1
""")
sta cx16.${target.register.toString().lowercase()}+1""")
}
else -> throw AssemblyError("weird register")
}
@ -4232,8 +4214,7 @@ $endLabel""")
asmgen.out("""
lda ${target.asmVarname}+1
eor #$80
sta ${target.asmVarname}+1
""")
sta ${target.asmVarname}+1""")
}
TargetStorageKind.ARRAY -> assignPrefixedExpressionToArrayElt(makePrefixedExprFromArrayExprAssign("-", assign), scope)
else -> throw AssemblyError("weird target for in-place float negation")

View File

@ -741,8 +741,7 @@ internal class AugmentableAssignmentAsmGen(private val program: PtProgram,
txa
ora $variable+1
tax
tya
""")
tya""")
return true
}
"&" -> {
@ -752,8 +751,7 @@ internal class AugmentableAssignmentAsmGen(private val program: PtProgram,
txa
and $variable+1
tax
tya
""")
tya""")
return true
}
"^" -> {
@ -763,8 +761,7 @@ internal class AugmentableAssignmentAsmGen(private val program: PtProgram,
txa
eor $variable+1
tax
tya
""")
tya""")
return true
}
else -> return false
@ -856,8 +853,7 @@ internal class AugmentableAssignmentAsmGen(private val program: PtProgram,
txa
ora #>$number
tax
tya
""")
tya""")
return true
}
"&" -> {
@ -867,8 +863,7 @@ internal class AugmentableAssignmentAsmGen(private val program: PtProgram,
txa
and #>$number
tax
tya
""")
tya""")
return true
}
"^" -> {
@ -878,8 +873,7 @@ internal class AugmentableAssignmentAsmGen(private val program: PtProgram,
txa
eor #>$number
tax
tya
""")
tya""")
return true
}
else -> return false
@ -1856,8 +1850,7 @@ $shortcutLabel:""")
ldy #>$value
jsr prog8_math.divmod_w_asm
sta $lsb
sty $msb
""")
sty $msb""")
}
else {
asmgen.out("""
@ -1869,8 +1862,7 @@ $shortcutLabel:""")
ldy #>$value
jsr prog8_math.divmod_uw_asm
sta $lsb
sty $msb
""")
sty $msb""")
}
}
}
@ -1890,8 +1882,7 @@ $shortcutLabel:""")
lda P8ZP_SCRATCH_W2
ldy P8ZP_SCRATCH_W2+1
sta $lsb
sty $msb
""")
sty $msb""")
}
"<<" -> {
when {
@ -1927,8 +1918,7 @@ $shortcutLabel:""")
- asl $lsb
rol $msb
dey
bne -
""")
bne -""")
else -> repeat(value) { asmgen.out(" asl $lsb | rol $msb") }
}
}
@ -2352,8 +2342,7 @@ $shortcutLabel:""")
ldy #0
jsr prog8_math.divmod_uw_asm
sta $name
sty $name+1
""")
sty $name+1""")
} else {
asmgen.out("""
lda $name
@ -2364,8 +2353,7 @@ $shortcutLabel:""")
ldy #0
jsr prog8_math.divmod_w_asm
sta $name
sty $name+1
""")
sty $name+1""")
}
}
"%" -> {
@ -2382,8 +2370,7 @@ $shortcutLabel:""")
lda P8ZP_SCRATCH_W2
sta $name
lda P8ZP_SCRATCH_W2+1
sta $name+1
""")
sta $name+1""")
}
"<<" -> {
asmgen.out("""
@ -2532,8 +2519,7 @@ $shortcutLabel:""")
lda P8ZP_SCRATCH_W2
sta $name
lda P8ZP_SCRATCH_W2+1
sta $name+1
""")
sta $name+1""")
}
"<<", ">>" -> {
throw AssemblyError("shift by a word variable not supported, max is a byte")
@ -2682,8 +2668,7 @@ $shortcutLabel:""")
stx cx16.r0+1
jsr verafx.muls
sta $name
sty $name+1
""")
sty $name+1""")
else
asmgen.out("""
sta prog8_math.multiply_words.multiplier
@ -2692,8 +2677,7 @@ $shortcutLabel:""")
ldy $name+1
jsr prog8_math.multiply_words
sta $name
sty $name+1
""")
sty $name+1""")
}
fun divideVarByWordInAY() {
@ -2725,8 +2709,7 @@ $shortcutLabel:""")
lda P8ZP_SCRATCH_W2
ldy P8ZP_SCRATCH_W2+1
sta $name
sty $name+1
""")
sty $name+1""")
}
val valueDt = value.type
when {
@ -3003,29 +2986,25 @@ $shortcutLabel:""")
asmgen.out("""
lda #<$name
ldy #>$name
jsr floats.FADD
""")
jsr floats.FADD""")
}
"-" -> {
asmgen.out("""
lda #<$name
ldy #>$name
jsr floats.FSUB
""")
jsr floats.FSUB""")
}
"*" -> {
asmgen.out("""
lda #<$name
ldy #>$name
jsr floats.FMULT
""")
jsr floats.FMULT""")
}
"/" -> {
asmgen.out("""
lda #<$name
ldy #>$name
jsr floats.FDIV
""")
jsr floats.FDIV""")
}
// pretty uncommon, who's going to assign a comparison boolean expression to a float var:
"==" -> TODO("float-value-to-var comparison ==")
@ -3037,8 +3016,7 @@ $shortcutLabel:""")
asmgen.out("""
ldx #<$name
ldy #>$name
jsr floats.MOVMF
""")
jsr floats.MOVMF""")
}
private fun inplacemodificationFloatWithVariable(name: String, operator: String, otherName: String) {
@ -3050,8 +3028,7 @@ $shortcutLabel:""")
jsr floats.MOVFM
lda #<$otherName
ldy #>$otherName
jsr floats.FADD
""")
jsr floats.FADD""")
}
"-" -> {
asmgen.out("""
@ -3060,8 +3037,7 @@ $shortcutLabel:""")
jsr floats.MOVFM
lda #<$name
ldy #>$name
jsr floats.FSUB
""")
jsr floats.FSUB""")
}
"*" -> {
asmgen.out("""
@ -3070,8 +3046,7 @@ $shortcutLabel:""")
jsr floats.MOVFM
lda #<$otherName
ldy #>$otherName
jsr floats.FMULT
""")
jsr floats.FMULT""")
}
"/" -> {
asmgen.out("""
@ -3080,8 +3055,7 @@ $shortcutLabel:""")
jsr floats.MOVFM
lda #<$name
ldy #>$name
jsr floats.FDIV
""")
jsr floats.FDIV""")
}
// pretty uncommon, who's going to assign a comparison boolean expression to a float var:
"==" -> {
@ -3151,8 +3125,7 @@ $shortcutLabel:""")
asmgen.out("""
ldx #<$name
ldy #>$name
jsr floats.MOVMF
""")
jsr floats.MOVMF""")
}
private fun inplacemodificationFloatWithLiteralval(name: String, operator: String, value: Double) {
@ -3170,16 +3143,14 @@ $shortcutLabel:""")
lda #<$name
ldy #>$name
jsr floats.MOVFM
jsr floats.FADDH
""")
jsr floats.FADDH""")
else -> asmgen.out("""
lda #<$name
ldy #>$name
jsr floats.MOVFM
lda #<$constValueName
ldy #>$constValueName
jsr floats.FADD
""")
jsr floats.FADD""")
}
}
"-" -> {
@ -3195,8 +3166,7 @@ $shortcutLabel:""")
jsr floats.MOVFM
lda #<$name
ldy #>$name
jsr floats.FSUB
""")
jsr floats.FSUB""")
}
"*" -> {
// assume that code optimization is already done on the AST level for special cases such as 0, 1, 2...
@ -3205,8 +3175,7 @@ $shortcutLabel:""")
lda #<$name
ldy #>$name
jsr floats.MOVFM
jsr floats.MUL10
""")
jsr floats.MUL10""")
} else {
asmgen.out("""
lda #<$name
@ -3214,8 +3183,7 @@ $shortcutLabel:""")
jsr floats.MOVFM
lda #<$constValueName
ldy #>$constValueName
jsr floats.FMULT
""")
jsr floats.FMULT""")
}
}
"/" -> {
@ -3227,8 +3195,7 @@ $shortcutLabel:""")
jsr floats.MOVFM
lda #<$name
ldy #>$name
jsr floats.FDIV
""")
jsr floats.FDIV""")
}
"==" -> {
asmgen.out("""
@ -3297,7 +3264,6 @@ $shortcutLabel:""")
asmgen.out("""
ldx #<$name
ldy #>$name
jsr floats.MOVMF
""")
jsr floats.MOVMF""")
}
}

View File

@ -10,10 +10,6 @@ TODO
Future Things and Ideas
^^^^^^^^^^^^^^^^^^^^^^^
- allow when stringvar. Usecase: if sv=="aa" else if sv=="bb" else if sv=="cc" -> needs much code, when(stringvar) would avoid reloading both strings for every case (rockrunner bdcff.p8)
- this generates empty lines in the resulting asm, why?:
cx16.r0L = cx16.r1L
cx16.r0L += cx16.r2L
- Kotlin: can we use inline value classes in certain spots?
- Improve the SublimeText syntax file for prog8, you can also install this for 'bat': https://github.com/sharkdp/bat?tab=readme-ov-file#adding-new-syntaxes--language-definitions
- Compiling Libraries: improve ability to create library files in prog8; for instance there's still stuff injected into the start of the start() routine AND there is separate setup logic going on before calling it.

View File

@ -1,20 +1,10 @@
%import textio
%option no_sysinit
%zeropage basicsafe
main {
ubyte[4] attrs
ubyte[4] object
sub start() {
cx16.r0 = mkword(attrs[cx16.r2L], object[cx16.r2L])
cx16.r1 = mkword(attrs[cx16.r2L], 22)
cx16.r2 = mkword(22,attrs[cx16.r2L])
explode(1, attrs[2]+2)
explode(attrs[2]+2, 1)
}
sub explode(ubyte a1, ubyte a2) -> uword {
return mkword(attrs[cx16.r2L], object[cx16.r2L])
cx16.r0L = cx16.r1L
cx16.r1=9999
cx16.r2=9999
}
}

View File

@ -1,8 +1,6 @@
package prog8.intermediate
import prog8.code.*
import prog8.code.ast.PtConstant
import prog8.code.ast.PtVariable
import prog8.code.core.*
import prog8.code.target.VMTarget
import prog8.code.target.getCompilationTargetByName
@ -11,7 +9,6 @@ import java.nio.file.Path
import javax.xml.stream.XMLEventReader
import javax.xml.stream.XMLInputFactory
import javax.xml.stream.XMLStreamException
import javax.xml.stream.events.XMLEvent
import kotlin.io.path.Path
import kotlin.io.path.inputStream

View File

@ -1995,8 +1995,6 @@ class VirtualMachine(irProgram: IRProgram) {
}
IRDataType.WORD -> {
val memvalue = memory.getUW(address).toInt()
val x1 = (memvalue shl operand)
val x2 = x1.toUShort()
memory.setUW(address, (memvalue shl operand).toUShort())
}
IRDataType.FLOAT -> throw IllegalArgumentException("invalid float type for this instruction $i")
@ -2390,28 +2388,6 @@ class VirtualMachine(irProgram: IRProgram) {
}
}
private fun getSetOnConditionOperands(ins: IRInstruction): Pair<Int, Int> {
return when(ins.type) {
IRDataType.BYTE -> Pair(registers.getSB(ins.reg2!!).toInt(), registers.getSB(ins.reg3!!).toInt())
IRDataType.WORD -> Pair(registers.getSW(ins.reg2!!).toInt(), registers.getSW(ins.reg3!!).toInt())
IRDataType.FLOAT -> {
throw IllegalArgumentException("can't use float here")
}
null -> throw IllegalArgumentException("need type for branch instruction")
}
}
private fun getSetOnConditionOperandsU(ins: IRInstruction): Pair<UInt, UInt> {
return when(ins.type) {
IRDataType.BYTE -> Pair(registers.getUB(ins.reg2!!).toUInt(), registers.getUB(ins.reg3!!).toUInt())
IRDataType.WORD -> Pair(registers.getUW(ins.reg2!!).toUInt(), registers.getUW(ins.reg3!!).toUInt())
IRDataType.FLOAT -> {
throw IllegalArgumentException("can't use float here")
}
null -> throw IllegalArgumentException("need type for branch instruction")
}
}
private var window: GraphicsWindow? = null
fun gfx_enable(mode: UByte) {