mirror of
https://github.com/irmen/prog8.git
synced 2024-10-19 07:23:56 +00:00
for loop codegen
This commit is contained in:
parent
8bf3406cf8
commit
353f1954a5
@ -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
|
||||||
|
@ -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')
|
||||||
|
Loading…
Reference in New Issue
Block a user