mirror of
https://github.com/irmen/prog8.git
synced 2024-12-22 18:30:01 +00:00
fix forloop 6502 codegen in case of descending word values
This commit is contained in:
parent
6b6427492d
commit
795f80b4ec
@ -552,16 +552,16 @@ class IRCodeGen(
|
||||
|
||||
addInstr(result, IRInstruction(Opcode.STOREM, loopvarDtIr, reg1=fromTr.resultReg, labelSymbol=loopvarSymbol), null)
|
||||
result += labelFirstChunk(translateNode(forLoop.statements), loopLabel)
|
||||
addInstr(result, IRInstruction(Opcode.LOADM, loopvarDtIr, reg1 = fromTr.resultReg, labelSymbol = loopvarSymbol), null)
|
||||
if(step==1 || step==-1) {
|
||||
// if endvalue == index, stop loop, else iterate
|
||||
// if endvalue == loopvar, stop loop, else iterate
|
||||
addInstr(result, IRInstruction(Opcode.LOADM, loopvarDtIr, reg1 = fromTr.resultReg, labelSymbol = loopvarSymbol), null)
|
||||
addInstr(result, IRInstruction(Opcode.BEQR, loopvarDtIr, reg1=toTr.resultReg, reg2=fromTr.resultReg, labelSymbol = labelAfterFor), null)
|
||||
result += addConstMem(loopvarDtIr, null, loopvarSymbol, step)
|
||||
addInstr(result, IRInstruction(Opcode.JUMP, labelSymbol = loopLabel), null)
|
||||
} else {
|
||||
// ind/dec index, then:
|
||||
// ascending: if endvalue >= index, iterate
|
||||
// descending: if index >= endvalue, iterate
|
||||
// ascending: if endvalue >= loopvar, iterate
|
||||
// descending: if loopvar >= endvalue, iterate
|
||||
result += addConstMem(loopvarDtIr, null, loopvarSymbol, step)
|
||||
addInstr(result, IRInstruction(Opcode.LOADM, loopvarDtIr, reg1=fromTr.resultReg, labelSymbol = loopvarSymbol), null)
|
||||
if(step > 0)
|
||||
|
@ -1,11 +1,7 @@
|
||||
TODO
|
||||
====
|
||||
|
||||
- investigate if the hiscores issue on the forum is a compiler bug or not.
|
||||
|
||||
- IR: instructions that do type conversion (SZ etc, CONCAT, SGN) should put the result in a DIFFERENT register.
|
||||
- IR: optimize forloop codegen to use a reg as loop variable instead of a memory variable, just store it in the mem var before entering the loop body
|
||||
check repeat loop as well it shouldn't be using a tempvar just a register to count.
|
||||
|
||||
...
|
||||
|
||||
|
@ -1,56 +1,32 @@
|
||||
%import string
|
||||
%import textio
|
||||
%import conv
|
||||
|
||||
%zeropage basicsafe
|
||||
|
||||
; (127 instructions in 15 chunks, 47 registers)
|
||||
; 679 steps
|
||||
|
||||
|
||||
main {
|
||||
|
||||
str[10] names = ["1??","2??","3??","4??","5??","6??","7??","8??","9??","a??"]
|
||||
str[10] scores = ["9000","8000","7000","6000","5000","4000","3000","2000","1000","50"]
|
||||
str p_str = "winner"
|
||||
uword top_score
|
||||
|
||||
sub start() {
|
||||
print_hiscores()
|
||||
ubyte r = check_score(7500)
|
||||
print_hiscores()
|
||||
}
|
||||
uword i
|
||||
uword n
|
||||
|
||||
sub check_score(uword score) -> ubyte {
|
||||
ubyte n
|
||||
ubyte i
|
||||
str tmp = "?????"
|
||||
repeat 10 {
|
||||
txt.chrout('.')
|
||||
}
|
||||
txt.nl()
|
||||
|
||||
n=10
|
||||
for i in 0 to n step 3 {
|
||||
txt.print_uw(i)
|
||||
txt.nl()
|
||||
}
|
||||
txt.nl()
|
||||
|
||||
if score < top_score {
|
||||
return(10) }
|
||||
else {
|
||||
for n in 0 to 9 {
|
||||
if score > conv.str2uword(scores[n]) {
|
||||
for i in 8 to n step -1 {
|
||||
names[i+1] = names[i]
|
||||
scores[i+1] = scores[i]
|
||||
}
|
||||
;string.copy(p_str,names[n])
|
||||
;conv.str_uw0(score)
|
||||
;string.copy(conv.string_out,scores[n])
|
||||
return(n)
|
||||
}
|
||||
}
|
||||
}
|
||||
n=0
|
||||
for i in 10 downto n step -3 {
|
||||
txt.print_uw(i)
|
||||
txt.nl()
|
||||
}
|
||||
}
|
||||
|
||||
sub print_hiscores() {
|
||||
ubyte n
|
||||
for n in 0 to 9 {
|
||||
txt.print_ub(n)
|
||||
txt.spc()
|
||||
txt.print(names[n])
|
||||
txt.spc()
|
||||
txt.print(scores[n])
|
||||
txt.nl()
|
||||
}
|
||||
txt.nl()
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user