for loop codegen

This commit is contained in:
Irmen de Jong 2020-08-18 13:49:08 +02:00
parent 8bf3406cf8
commit 353f1954a5
2 changed files with 50 additions and 39 deletions

View File

@ -37,7 +37,6 @@ internal class ForLoopsAsmGen(private val program: Program, private val asmgen:
} }
private fun translateForOverNonconstRange(stmt: ForLoop, iterableDt: DataType, range: RangeExpr) { private fun translateForOverNonconstRange(stmt: ForLoop, iterableDt: DataType, range: RangeExpr) {
// TODO get rid of all cmp stack,x by using modifying code
val loopLabel = asmgen.makeLabel("for_loop") val loopLabel = asmgen.makeLabel("for_loop")
val endLabel = asmgen.makeLabel("for_end") val endLabel = asmgen.makeLabel("for_end")
val modifiedLabel = asmgen.makeLabel("for_modified") val modifiedLabel = asmgen.makeLabel("for_modified")
@ -137,25 +136,31 @@ $modifiedLabel2 cmp #0 ; modified
if(stepsize==1) { if(stepsize==1) {
asmgen.out(""" asmgen.out("""
+ inc $varname + inc $varname
bne + bne $loopLabel
inc $varname+1 inc $varname+1
jmp $loopLabel
""") """)
} else { } else {
asmgen.out(""" asmgen.out("""
+ lda $varname + lda $varname
bne + bne +
dec $varname+1 dec $varname+1
+ dec $varname""") + dec $varname
jmp $loopLabel""")
} }
asmgen.out(""" asmgen.out(endLabel)
+ jmp $loopLabel asmgen.out(" inx")
$endLabel inx""")
} }
stepsize > 0 -> { stepsize > 0 -> {
// (u)words, step >= 2 // (u)words, step >= 2
asmgen.translateExpression(range.to) asmgen.translateExpression(range.to)
asmgen.out("""
lda $ESTACK_HI_PLUS1_HEX,x
sta $modifiedLabel+1
lda $ESTACK_LO_PLUS1_HEX,x
sta $modifiedLabel2+1
""")
val varname = asmgen.asmIdentifierName(stmt.loopVar) val varname = asmgen.asmIdentifierName(stmt.loopVar)
val assignLoopvar = Assignment(AssignTarget(stmt.loopVar, null, null, stmt.loopVar.position), range.from, range.position) val assignLoopvar = Assignment(AssignTarget(stmt.loopVar, null, null, stmt.loopVar.position), range.from, range.position)
assignLoopvar.linkParents(stmt) assignLoopvar.linkParents(stmt)
@ -172,12 +177,11 @@ $endLabel inx""")
lda $varname+1 lda $varname+1
adc #>$stepsize adc #>$stepsize
sta $varname+1 sta $varname+1
lda $ESTACK_HI_PLUS1_HEX,x TODO modifying code1 $modifiedLabel cmp #0 ; modified
cmp $varname+1 bcc $loopLabel
bcc $endLabel bne $endLabel
bne $loopLabel $modifiedLabel2 lda #0 ; modified
lda $varname cmp $varname
cmp $ESTACK_LO_PLUS1_HEX,x TODO modifying code1
bcc $endLabel bcc $endLabel
bcs $loopLabel bcs $loopLabel
$endLabel inx""") $endLabel inx""")
@ -190,9 +194,9 @@ $endLabel inx""")
lda $varname+1 lda $varname+1
adc #>$stepsize adc #>$stepsize
sta $varname+1 sta $varname+1
lda $ESTACK_LO_PLUS1_HEX,x TODO modifying code2 $modifiedLabel2 lda #0 ; modified
cmp $varname cmp $varname
lda $ESTACK_HI_PLUS1_HEX,x TODO modifying code2 $modifiedLabel lda #0 ; modified
sbc $varname+1 sbc $varname+1
bvc + bvc +
eor #$80 eor #$80
@ -204,6 +208,12 @@ $endLabel inx""")
// (u)words, step <= -2 // (u)words, step <= -2
asmgen.translateExpression(range.to) asmgen.translateExpression(range.to)
asmgen.out("""
lda $ESTACK_HI_PLUS1_HEX,x
sta $modifiedLabel+1
lda $ESTACK_LO_PLUS1_HEX,x
sta $modifiedLabel2+1
""")
val varname = asmgen.asmIdentifierName(stmt.loopVar) val varname = asmgen.asmIdentifierName(stmt.loopVar)
val assignLoopvar = Assignment(AssignTarget(stmt.loopVar, null, null, stmt.loopVar.position), range.from, range.position) val assignLoopvar = Assignment(AssignTarget(stmt.loopVar, null, null, stmt.loopVar.position), range.from, range.position)
assignLoopvar.linkParents(stmt) assignLoopvar.linkParents(stmt)
@ -220,11 +230,11 @@ $endLabel inx""")
lda $varname+1 lda $varname+1
sbc #>${stepsize.absoluteValue} sbc #>${stepsize.absoluteValue}
sta $varname+1 sta $varname+1
cmp $ESTACK_HI_PLUS1_HEX,x TODO modifying code3 $modifiedLabel cmp #0 ; modified
bcc $endLabel bcc $endLabel
bne $loopLabel bne $loopLabel
lda $varname lda $varname
cmp $ESTACK_LO_PLUS1_HEX,x TODO modifying code3 $modifiedLabel2 cmp #0 ; modified
bcs $loopLabel bcs $loopLabel
$endLabel inx""") $endLabel inx""")
} else { } else {
@ -238,9 +248,9 @@ $endLabel inx""")
sbc #>${stepsize.absoluteValue} sbc #>${stepsize.absoluteValue}
sta $varname+1 sta $varname+1
pla pla
cmp $ESTACK_LO_PLUS1_HEX,x TODO modifying code4 $modifiedLabel2 cmp #0 ; modified
lda $varname+1 lda $varname+1
sbc $ESTACK_HI_PLUS1_HEX,x TODO modifying code4 $modifiedLabel sbc #0 ; modified
bvc + bvc +
eor #$80 eor #$80
+ bpl $loopLabel + bpl $loopLabel

View File

@ -24,32 +24,33 @@ main {
; c64.CHROUT('\n') ; c64.CHROUT('\n')
ubyte bb ; ubyte bb
ubyte from = 10 ; ubyte from = 10
ubyte end = 20 ; ubyte end = 20
;
; for bb in from to end step 3 {
; c64scr.print_ub(bb)
; c64.CHROUT(',')
; }
; c64.CHROUT('\n')
; for bb in end to from step -3 {
; c64scr.print_ub(bb)
; c64.CHROUT(',')
; }
; c64.CHROUT('\n')
for bb in from to end step 3 { word ww
c64scr.print_ub(bb) word fromw = -10
c64.CHROUT(',') word endw = 21
}
c64.CHROUT('\n')
for bb in end to from step -3 {
c64scr.print_ub(bb)
c64.CHROUT(',')
}
c64.CHROUT('\n')
uword ww
uword fromw = 10
uword endw = 20
for ww in fromw to endw step 3 { for ww in fromw to endw step 3 {
c64scr.print_uw(ww) c64scr.print_w(ww)
c64.CHROUT(',') c64.CHROUT(',')
} }
c64.CHROUT('\n') c64.CHROUT('\n')
for ww in endw to fromw step -3 { for ww in endw to fromw step -3 {
c64scr.print_uw(ww) c64scr.print_w(ww)
c64.CHROUT(',') c64.CHROUT(',')
} }
c64.CHROUT('\n') c64.CHROUT('\n')