mirror of
https://github.com/irmen/prog8.git
synced 2025-04-07 01:38:09 +00:00
more forloop codegen
This commit is contained in:
parent
3976cc26a2
commit
4487499663
@ -37,8 +37,11 @@ internal class ForLoopsAsmGen(private val program: Program, private val asmgen:
|
||||
}
|
||||
|
||||
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 endLabel = asmgen.makeLabel("for_end")
|
||||
val modifiedLabel = asmgen.makeLabel("for_modified")
|
||||
val modifiedLabel2 = asmgen.makeLabel("for_modifiedb")
|
||||
asmgen.loopEndLabels.push(endLabel)
|
||||
val stepsize=range.step.constValue(program)!!.number.toInt()
|
||||
when(iterableDt) {
|
||||
@ -54,13 +57,15 @@ internal class ForLoopsAsmGen(private val program: Program, private val asmgen:
|
||||
asmgen.translateExpression(range.from)
|
||||
asmgen.out("""
|
||||
inx
|
||||
lda ${ESTACK_LO_HEX},x
|
||||
lda $ESTACK_LO_HEX,x
|
||||
sta $varname
|
||||
lda $ESTACK_LO_PLUS1_HEX,x
|
||||
sta $modifiedLabel+1
|
||||
$loopLabel""")
|
||||
asmgen.translate(stmt.body)
|
||||
asmgen.out("""
|
||||
lda $varname
|
||||
cmp $ESTACK_LO_PLUS1_HEX,x TODO modifying code
|
||||
$modifiedLabel cmp #0 ; modified
|
||||
beq $endLabel
|
||||
$incdec $varname
|
||||
jmp $loopLabel
|
||||
@ -76,8 +81,10 @@ $endLabel inx""")
|
||||
asmgen.translateExpression(range.from)
|
||||
asmgen.out("""
|
||||
inx
|
||||
lda ${ESTACK_LO_HEX},x
|
||||
lda $ESTACK_LO_HEX,x
|
||||
sta $varname
|
||||
lda $ESTACK_LO_PLUS1_HEX,x
|
||||
sta $modifiedLabel+1
|
||||
$loopLabel""")
|
||||
asmgen.translate(stmt.body)
|
||||
asmgen.out("""
|
||||
@ -87,7 +94,7 @@ $loopLabel""")
|
||||
clc
|
||||
adc #$stepsize
|
||||
sta $varname
|
||||
cmp $ESTACK_LO_PLUS1_HEX,x TODO modifying code
|
||||
$modifiedLabel cmp #0 ; modified
|
||||
bcc $loopLabel
|
||||
beq $loopLabel""")
|
||||
} else {
|
||||
@ -95,7 +102,7 @@ $loopLabel""")
|
||||
sec
|
||||
sbc #${stepsize.absoluteValue}
|
||||
sta $varname
|
||||
cmp $ESTACK_LO_PLUS1_HEX,x TODO modifying code
|
||||
$modifiedLabel cmp #0 ; modified
|
||||
bcs $loopLabel""")
|
||||
}
|
||||
asmgen.out("""
|
||||
@ -113,14 +120,19 @@ $endLabel inx""")
|
||||
val assignLoopvar = Assignment(AssignTarget(stmt.loopVar, null, null, stmt.loopVar.position), range.from, range.position)
|
||||
assignLoopvar.linkParents(stmt)
|
||||
asmgen.translate(assignLoopvar)
|
||||
asmgen.out(loopLabel)
|
||||
asmgen.out("""
|
||||
lda $ESTACK_HI_PLUS1_HEX,x
|
||||
sta $modifiedLabel+1
|
||||
lda $ESTACK_LO_PLUS1_HEX,x
|
||||
sta $modifiedLabel2+1
|
||||
$loopLabel""")
|
||||
asmgen.translate(stmt.body)
|
||||
asmgen.out("""
|
||||
lda $varname+1
|
||||
cmp $ESTACK_HI_PLUS1_HEX,x TODO modifying code
|
||||
$modifiedLabel cmp #0 ; modified
|
||||
bne +
|
||||
lda $varname
|
||||
cmp $ESTACK_LO_PLUS1_HEX,x TODO modifying code
|
||||
$modifiedLabel2 cmp #0 ; modified
|
||||
beq $endLabel""")
|
||||
if(stepsize==1) {
|
||||
asmgen.out("""
|
||||
@ -160,12 +172,12 @@ $endLabel inx""")
|
||||
lda $varname+1
|
||||
adc #>$stepsize
|
||||
sta $varname+1
|
||||
lda $ESTACK_HI_PLUS1_HEX,x TODO modifying code
|
||||
lda $ESTACK_HI_PLUS1_HEX,x TODO modifying code1
|
||||
cmp $varname+1
|
||||
bcc $endLabel
|
||||
bne $loopLabel
|
||||
lda $varname
|
||||
cmp $ESTACK_LO_PLUS1_HEX,x TODO modifying code
|
||||
cmp $ESTACK_LO_PLUS1_HEX,x TODO modifying code1
|
||||
bcc $endLabel
|
||||
bcs $loopLabel
|
||||
$endLabel inx""")
|
||||
@ -178,9 +190,9 @@ $endLabel inx""")
|
||||
lda $varname+1
|
||||
adc #>$stepsize
|
||||
sta $varname+1
|
||||
lda $ESTACK_LO_PLUS1_HEX,x TODO modifying code
|
||||
lda $ESTACK_LO_PLUS1_HEX,x TODO modifying code2
|
||||
cmp $varname
|
||||
lda $ESTACK_HI_PLUS1_HEX,x TODO modifying code
|
||||
lda $ESTACK_HI_PLUS1_HEX,x TODO modifying code2
|
||||
sbc $varname+1
|
||||
bvc +
|
||||
eor #$80
|
||||
@ -208,11 +220,11 @@ $endLabel inx""")
|
||||
lda $varname+1
|
||||
sbc #>${stepsize.absoluteValue}
|
||||
sta $varname+1
|
||||
cmp $ESTACK_HI_PLUS1_HEX,x TODO modifying code
|
||||
cmp $ESTACK_HI_PLUS1_HEX,x TODO modifying code3
|
||||
bcc $endLabel
|
||||
bne $loopLabel
|
||||
lda $varname
|
||||
cmp $ESTACK_LO_PLUS1_HEX,x TODO modifying code
|
||||
cmp $ESTACK_LO_PLUS1_HEX,x TODO modifying code3
|
||||
bcs $loopLabel
|
||||
$endLabel inx""")
|
||||
} else {
|
||||
@ -226,9 +238,9 @@ $endLabel inx""")
|
||||
sbc #>${stepsize.absoluteValue}
|
||||
sta $varname+1
|
||||
pla
|
||||
cmp $ESTACK_LO_PLUS1_HEX,x TODO modifying code
|
||||
cmp $ESTACK_LO_PLUS1_HEX,x TODO modifying code4
|
||||
lda $varname+1
|
||||
sbc $ESTACK_HI_PLUS1_HEX,x TODO modifying code
|
||||
sbc $ESTACK_HI_PLUS1_HEX,x TODO modifying code4
|
||||
bvc +
|
||||
eor #$80
|
||||
+ bpl $loopLabel
|
||||
@ -244,6 +256,7 @@ $endLabel inx""")
|
||||
}
|
||||
|
||||
private fun translateForOverIterableVar(stmt: ForLoop, iterableDt: DataType, ident: IdentifierReference) {
|
||||
// TODO optimize this more
|
||||
val loopLabel = asmgen.makeLabel("for_loop")
|
||||
val endLabel = asmgen.makeLabel("for_end")
|
||||
asmgen.loopEndLabels.push(endLabel)
|
||||
|
102
examples/test.p8
102
examples/test.p8
@ -6,82 +6,52 @@
|
||||
main {
|
||||
|
||||
sub start() {
|
||||
byte counterb
|
||||
word counterw
|
||||
; byte[] data = [11,22,33,44,55,66]
|
||||
; word[] dataw = [1111,2222,3333,4444,5555,6666]
|
||||
;
|
||||
; byte d
|
||||
; word w
|
||||
;
|
||||
; for d in data {
|
||||
; c64scr.print_b(d)
|
||||
; c64.CHROUT(',')
|
||||
; }
|
||||
; c64.CHROUT('\n')
|
||||
; for w in dataw {
|
||||
; c64scr.print_w(w)
|
||||
; c64.CHROUT(',')
|
||||
; }
|
||||
; c64.CHROUT('\n')
|
||||
|
||||
for counterb in -10 to 11 {
|
||||
c64scr.print_b(counterb)
|
||||
|
||||
ubyte bb
|
||||
ubyte from = 10
|
||||
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 counterb in 11 to -10 step -1 {
|
||||
c64scr.print_b(counterb)
|
||||
uword ww
|
||||
uword fromw = 10
|
||||
uword endw = 20
|
||||
|
||||
for ww in fromw to endw step 3 {
|
||||
c64scr.print_uw(ww)
|
||||
c64.CHROUT(',')
|
||||
}
|
||||
c64.CHROUT('\n')
|
||||
|
||||
for counterb in -10 to 11 step 2 {
|
||||
c64scr.print_b(counterb)
|
||||
for ww in endw to fromw step -3 {
|
||||
c64scr.print_uw(ww)
|
||||
c64.CHROUT(',')
|
||||
}
|
||||
c64.CHROUT('\n')
|
||||
|
||||
for counterb in 11 to -10 step -2 {
|
||||
c64scr.print_b(counterb)
|
||||
c64.CHROUT(',')
|
||||
}
|
||||
c64.CHROUT('\n')
|
||||
|
||||
for counterb in -10 to 11 step 3 {
|
||||
c64scr.print_b(counterb)
|
||||
c64.CHROUT(',')
|
||||
}
|
||||
c64.CHROUT('\n')
|
||||
|
||||
for counterb in 11 to -10 step -3 {
|
||||
c64scr.print_b(counterb)
|
||||
c64.CHROUT(',')
|
||||
}
|
||||
c64.CHROUT('\n')
|
||||
c64.CHROUT('\n')
|
||||
c64.CHROUT('\n')
|
||||
|
||||
for counterw in -10 to 11 {
|
||||
c64scr.print_w(counterw)
|
||||
c64.CHROUT(',')
|
||||
}
|
||||
c64.CHROUT('\n')
|
||||
|
||||
for counterw in 11 to -10 step -1 {
|
||||
c64scr.print_w(counterw)
|
||||
c64.CHROUT(',')
|
||||
}
|
||||
c64.CHROUT('\n')
|
||||
|
||||
for counterw in -10 to 11 step 2 {
|
||||
c64scr.print_w(counterw)
|
||||
c64.CHROUT(',')
|
||||
}
|
||||
c64.CHROUT('\n')
|
||||
|
||||
for counterw in 11 to -10 step -2 {
|
||||
c64scr.print_w(counterw)
|
||||
c64.CHROUT(',')
|
||||
}
|
||||
c64.CHROUT('\n')
|
||||
|
||||
for counterw in -10 to 11 step 3 {
|
||||
c64scr.print_w(counterw)
|
||||
c64.CHROUT(',')
|
||||
}
|
||||
c64.CHROUT('\n')
|
||||
|
||||
for counterw in 11 to -10 step -3 {
|
||||
c64scr.print_w(counterw)
|
||||
c64.CHROUT(',')
|
||||
}
|
||||
c64.CHROUT('\n')
|
||||
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user