mirror of
https://github.com/irmen/prog8.git
synced 2025-02-07 09:30:54 +00:00
tweak '<' code
This commit is contained in:
parent
b976360248
commit
130cee1e70
@ -528,6 +528,7 @@ internal class AsmGen(private val program: Program,
|
||||
private val saveRegisterLabels = Stack<String>();
|
||||
|
||||
internal fun saveRegister(register: CpuRegister) {
|
||||
// TODO use only one saveX label+byte storage per subroutine
|
||||
when(register) {
|
||||
CpuRegister.A -> out(" pha")
|
||||
CpuRegister.X -> {
|
||||
@ -546,6 +547,7 @@ $save .byte 0
|
||||
if (CompilationTarget.instance.machine.cpu == CpuType.CPU65c02) out(" phy")
|
||||
else {
|
||||
val save = makeLabel("saveY")
|
||||
saveRegisterLabels.push(save)
|
||||
out("""
|
||||
sty $save
|
||||
jmp +
|
||||
|
@ -149,6 +149,8 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
|
||||
lda $name
|
||||
cmp #${rightConstVal.number}
|
||||
bcs $jumpIfFalseLabel""")
|
||||
else
|
||||
asmgen.out(" jmp $jumpIfFalseLabel")
|
||||
return
|
||||
}
|
||||
else if (left is DirectMemoryRead) {
|
||||
@ -156,6 +158,8 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
|
||||
translateDirectMemReadExpression(left, false)
|
||||
asmgen.out(" cmp #${rightConstVal.number} | bcs $jumpIfFalseLabel")
|
||||
}
|
||||
else
|
||||
asmgen.out(" jmp $jumpIfFalseLabel")
|
||||
return
|
||||
}
|
||||
}
|
||||
@ -182,9 +186,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
|
||||
sbc #${rightConstVal.number}
|
||||
bvc +
|
||||
eor #$80
|
||||
+ bmi +
|
||||
bpl $jumpIfFalseLabel
|
||||
+""")
|
||||
+ bpl $jumpIfFalseLabel""")
|
||||
else
|
||||
asmgen.out(" lda $name | bpl $jumpIfFalseLabel")
|
||||
return
|
||||
@ -197,9 +199,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
|
||||
sbc #${rightConstVal.number}
|
||||
bvc +
|
||||
eor #$80
|
||||
+ bmi +
|
||||
bpl $jumpIfFalseLabel
|
||||
+""")
|
||||
+ bpl $jumpIfFalseLabel""")
|
||||
}
|
||||
else
|
||||
asmgen.out(" bpl $jumpIfFalseLabel")
|
||||
@ -230,9 +230,10 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
|
||||
bne $jumpIfFalseLabel
|
||||
lda $name
|
||||
cmp #<${rightConstVal.number}
|
||||
bcc +
|
||||
bcs $jumpIfFalseLabel
|
||||
+""")
|
||||
else
|
||||
asmgen.out(" jmp $jumpIfFalseLabel")
|
||||
return
|
||||
}
|
||||
}
|
||||
@ -260,9 +261,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
|
||||
sbc #>${rightConstVal.number}
|
||||
bvc +
|
||||
eor #$80
|
||||
+ bmi +
|
||||
bpl $jumpIfFalseLabel
|
||||
+""")
|
||||
+ bpl $jumpIfFalseLabel""")
|
||||
else
|
||||
asmgen.out(" lda $name+1 | bpl $jumpIfFalseLabel")
|
||||
return
|
||||
@ -277,6 +276,7 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
|
||||
|
||||
private fun translateUbyteLessOrEqual(left: Expression, right: Expression, leftConstVal: NumericLiteralValue?, rightConstVal: NumericLiteralValue?, jumpIfFalseLabel: String) {
|
||||
// TODO compare with optimized asm
|
||||
TODO()
|
||||
asmgen.translateExpression(left)
|
||||
asmgen.translateExpression(right)
|
||||
asmgen.out(" jsr prog8_lib.lesseq_ub | inx | lda P8ESTACK_LO,x | beq $jumpIfFalseLabel")
|
||||
@ -304,7 +304,32 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
|
||||
}
|
||||
|
||||
private fun translateUbyteGreater(left: Expression, right: Expression, leftConstVal: NumericLiteralValue?, rightConstVal: NumericLiteralValue?, jumpIfFalseLabel: String) {
|
||||
// TODO compare with optimized asm
|
||||
if(rightConstVal!=null) {
|
||||
if(leftConstVal!=null) {
|
||||
if(rightConstVal<=leftConstVal)
|
||||
asmgen.out(" jmp $jumpIfFalseLabel")
|
||||
return
|
||||
} else {
|
||||
if (left is IdentifierReference) {
|
||||
val name = asmgen.asmVariableName(left)
|
||||
if(rightConstVal.number.toInt()!=0)
|
||||
asmgen.out("""
|
||||
lda $name
|
||||
cmp #${rightConstVal.number}
|
||||
bcc $jumpIfFalseLabel
|
||||
beq $jumpIfFalseLabel""")
|
||||
return
|
||||
}
|
||||
else if (left is DirectMemoryRead) {
|
||||
if(rightConstVal.number.toInt()!=0) {
|
||||
translateDirectMemReadExpression(left, false)
|
||||
asmgen.out(" cmp #${rightConstVal.number} | bcc $jumpIfFalseLabel | beq $jumpIfFalseLabel")
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
asmgen.translateExpression(left)
|
||||
asmgen.translateExpression(right)
|
||||
asmgen.out(" jsr prog8_lib.greater_ub | inx | lda P8ESTACK_LO,x | beq $jumpIfFalseLabel")
|
||||
|
460
examples/test.p8
460
examples/test.p8
@ -7,218 +7,262 @@
|
||||
|
||||
main {
|
||||
|
||||
|
||||
sub keypress(ubyte key) {
|
||||
txt.print("keypress:")
|
||||
txt.print_ub(key)
|
||||
txt.chrout('=')
|
||||
when key {
|
||||
157, ',' -> txt.chrout('a')
|
||||
29, '/' -> txt.chrout('b')
|
||||
17, '.' -> txt.chrout('c')
|
||||
145, ' ' -> txt.chrout('d')
|
||||
}
|
||||
txt.chrout('\n')
|
||||
}
|
||||
|
||||
sub start() {
|
||||
|
||||
repeat {
|
||||
ubyte key=c64.GETIN()
|
||||
if key
|
||||
keypress(key)
|
||||
byte bb= -22
|
||||
ubyte ubb = 22
|
||||
word ww= -2222
|
||||
uword uww = 2222
|
||||
float ff = -2.2
|
||||
|
||||
repeat(25)
|
||||
txt.chrout('\n')
|
||||
|
||||
if bb < -1 {
|
||||
txt.print("ok 1\n")
|
||||
} else {
|
||||
txt.print("fail 1\n")
|
||||
}
|
||||
|
||||
; byte bb= -22
|
||||
; ubyte ubb = 22
|
||||
; word ww= -2222
|
||||
; uword uww = 2222
|
||||
; float ff = -1.2345
|
||||
;
|
||||
; repeat(25)
|
||||
; txt.chrout('\n')
|
||||
;
|
||||
; if bb < -1 {
|
||||
; txt.print("1 ok\n")
|
||||
; } else {
|
||||
; txt.print("1 fail\n")
|
||||
; }
|
||||
;
|
||||
; if bb < -99 {
|
||||
; txt.print("2 fail\n")
|
||||
; } else {
|
||||
; txt.print("2 ok\n")
|
||||
; }
|
||||
;
|
||||
; if bb<0 {
|
||||
; txt.print("2b ok\n")
|
||||
; } else {
|
||||
; txt.print("2b fail\n")
|
||||
; }
|
||||
;
|
||||
; if ww < -1 {
|
||||
; txt.print("3 ok\n")
|
||||
; } else {
|
||||
; txt.print("3 fail\n")
|
||||
; }
|
||||
;
|
||||
; if ww < -9999 {
|
||||
; txt.print("4 fail\n")
|
||||
; } else {
|
||||
; txt.print("4 ok\n")
|
||||
; }
|
||||
;
|
||||
; if ww < 0 {
|
||||
; txt.print("4b ok\n")
|
||||
; } else {
|
||||
; txt.print("4b fail\n")
|
||||
; }
|
||||
;
|
||||
; if ff < -1.0 {
|
||||
; txt.print("4c ok\n")
|
||||
; } else {
|
||||
; txt.print("4c fail\n")
|
||||
; }
|
||||
;
|
||||
; if ff < -9999.9 {
|
||||
; txt.print("4d fail\n")
|
||||
; } else {
|
||||
; txt.print("4d ok\n")
|
||||
; }
|
||||
;
|
||||
; if ff < 0.0 {
|
||||
; txt.print("4e ok\n")
|
||||
; } else {
|
||||
; txt.print("4e fail\n")
|
||||
; }
|
||||
;
|
||||
; if ubb < 100 {
|
||||
; txt.print("4f ok\n")
|
||||
; } else {
|
||||
; txt.print("4f fail\n")
|
||||
; }
|
||||
;
|
||||
; if ubb < 2 {
|
||||
; txt.print("4g fail\n")
|
||||
; } else {
|
||||
; txt.print("4g ok\n")
|
||||
; }
|
||||
;
|
||||
; if ubb<0 {
|
||||
; txt.print("4h fail\n")
|
||||
; } else {
|
||||
; txt.print("4h ok\n")
|
||||
; }
|
||||
;
|
||||
; if uww < 10000 {
|
||||
; txt.print("4i ok\n")
|
||||
; } else {
|
||||
; txt.print("4i fail\n")
|
||||
; }
|
||||
;
|
||||
; if uww < 2 {
|
||||
; txt.print("4j fail\n")
|
||||
; } else {
|
||||
; txt.print("4j ok\n")
|
||||
; }
|
||||
;
|
||||
; if uww < 0 {
|
||||
; txt.print("4k fail\n")
|
||||
; } else {
|
||||
; txt.print("4k ok\n")
|
||||
; }
|
||||
;
|
||||
;
|
||||
;
|
||||
; if bb > -99 {
|
||||
; txt.print("5 ok\n")
|
||||
; } else {
|
||||
; txt.print("5 fail\n")
|
||||
; }
|
||||
;
|
||||
; if bb > -1 {
|
||||
; txt.print("6 fail\n")
|
||||
; } else {
|
||||
; txt.print("6 ok\n")
|
||||
; }
|
||||
;
|
||||
; if bb > 0 {
|
||||
; txt.print("6b fail\n")
|
||||
; } else {
|
||||
; txt.print("6b ok\n")
|
||||
; }
|
||||
;
|
||||
; if ww > -9999 {
|
||||
; txt.print("7 ok\n")
|
||||
; } else {
|
||||
; txt.print("7 fail\n")
|
||||
; }
|
||||
;
|
||||
; if ww > -1 {
|
||||
; txt.print("8 fail\n")
|
||||
; } else {
|
||||
; txt.print("8 ok\n")
|
||||
; }
|
||||
;
|
||||
; if ww>0 {
|
||||
; txt.print("8b fail\n")
|
||||
; } else {
|
||||
; txt.print("8b ok\n")
|
||||
; }
|
||||
;
|
||||
; if ff > -1.0 {
|
||||
; txt.print("8c fail\n")
|
||||
; } else {
|
||||
; txt.print("8c ok\n")
|
||||
; }
|
||||
;
|
||||
; if ff > -9999.9 {
|
||||
; txt.print("8d ok\n")
|
||||
; } else {
|
||||
; txt.print("8d fail\n")
|
||||
; }
|
||||
;
|
||||
; if ff > 0.0 {
|
||||
; txt.print("8e fail\n")
|
||||
; } else {
|
||||
; txt.print("8e ok\n")
|
||||
; }
|
||||
;
|
||||
; if ubb > 5 {
|
||||
; txt.print("8f ok\n")
|
||||
; } else {
|
||||
; txt.print("8f fail\n")
|
||||
; }
|
||||
;
|
||||
; if ubb > 250 {
|
||||
; txt.print("8g fail\n")
|
||||
; } else {
|
||||
; txt.print("8g ok\n")
|
||||
; }
|
||||
;
|
||||
; if ubb > 0 {
|
||||
; txt.print("8h ok\n")
|
||||
; } else {
|
||||
; txt.print("8h fail\n")
|
||||
; }
|
||||
;
|
||||
; if uww > 5 {
|
||||
; txt.print("8i ok\n")
|
||||
; } else {
|
||||
; txt.print("8i fail\n")
|
||||
; }
|
||||
;
|
||||
; if uww > 9999 {
|
||||
; txt.print("8j fail\n")
|
||||
; } else {
|
||||
; txt.print("8j ok\n")
|
||||
; }
|
||||
;
|
||||
; if uww>0 {
|
||||
; txt.print("8b ok\n")
|
||||
; } else {
|
||||
; txt.print("8b fail\n")
|
||||
; }
|
||||
if bb < -99 {
|
||||
txt.print("fail 2\n")
|
||||
} else {
|
||||
txt.print("ok 2\n")
|
||||
}
|
||||
|
||||
if bb < -22 {
|
||||
txt.print("fail 2a\n")
|
||||
} else {
|
||||
txt.print("ok 2a\n")
|
||||
}
|
||||
|
||||
if bb<0 {
|
||||
txt.print("ok 2b\n")
|
||||
} else {
|
||||
txt.print("fail 2b\n")
|
||||
}
|
||||
|
||||
if ww < -1 {
|
||||
txt.print("ok 3\n")
|
||||
} else {
|
||||
txt.print("fail 3\n")
|
||||
}
|
||||
|
||||
if ww < -9999 {
|
||||
txt.print("fail 4\n")
|
||||
} else {
|
||||
txt.print("ok 4\n")
|
||||
}
|
||||
|
||||
if ww < -2222 {
|
||||
txt.print("fail 4a\n")
|
||||
} else {
|
||||
txt.print("ok 4a\n")
|
||||
}
|
||||
|
||||
if ww < 0 {
|
||||
txt.print("ok 4b\n")
|
||||
} else {
|
||||
txt.print("fail 4b\n")
|
||||
}
|
||||
|
||||
if ff < -1.0 {
|
||||
txt.print("ok 4c\n")
|
||||
} else {
|
||||
txt.print("fail 4c\n")
|
||||
}
|
||||
|
||||
if ff < -9999.9 {
|
||||
txt.print("fail 4d\n")
|
||||
} else {
|
||||
txt.print("ok 4d\n")
|
||||
}
|
||||
|
||||
if ff < 0.0 {
|
||||
txt.print("ok 4e\n")
|
||||
} else {
|
||||
txt.print("fail 4e\n")
|
||||
}
|
||||
|
||||
if ff < -2.2 {
|
||||
txt.print("fail 4e2\n")
|
||||
} else {
|
||||
txt.print("ok 4e2\n")
|
||||
}
|
||||
|
||||
if ubb < 100 {
|
||||
txt.print("ok 4f\n")
|
||||
} else {
|
||||
txt.print("fail 4f\n")
|
||||
}
|
||||
|
||||
if ubb < 2 {
|
||||
txt.print("fail 4g\n")
|
||||
} else {
|
||||
txt.print("ok 4g\n")
|
||||
}
|
||||
|
||||
if ubb<0 {
|
||||
txt.print("fail 4h\n")
|
||||
} else {
|
||||
txt.print("ok 4h\n")
|
||||
}
|
||||
|
||||
if ubb<22 {
|
||||
txt.print("fail 4h2\n")
|
||||
} else {
|
||||
txt.print("ok 4h2\n")
|
||||
}
|
||||
|
||||
if uww < 10000 {
|
||||
txt.print("ok 4i\n")
|
||||
} else {
|
||||
txt.print("fail 4i\n")
|
||||
}
|
||||
|
||||
if uww < 2 {
|
||||
txt.print("fail 4j\n")
|
||||
} else {
|
||||
txt.print("ok 4j\n")
|
||||
}
|
||||
|
||||
if uww < 0 {
|
||||
txt.print("fail 4k\n")
|
||||
} else {
|
||||
txt.print("ok 4k\n")
|
||||
}
|
||||
|
||||
if uww < 2222 {
|
||||
txt.print("fail 4l\n")
|
||||
} else {
|
||||
txt.print("ok 4l\n")
|
||||
}
|
||||
|
||||
|
||||
|
||||
txt.chrout('\n')
|
||||
|
||||
|
||||
|
||||
if bb > -99 {
|
||||
txt.print("ok 5\n")
|
||||
} else {
|
||||
txt.print("fail 5\n")
|
||||
}
|
||||
|
||||
if bb > -1 {
|
||||
txt.print("fail 6\n")
|
||||
} else {
|
||||
txt.print("ok 6\n")
|
||||
}
|
||||
|
||||
if bb > 0 {
|
||||
txt.print("fail 6b\n")
|
||||
} else {
|
||||
txt.print("ok 6b\n")
|
||||
}
|
||||
|
||||
if bb > 22 {
|
||||
txt.print("fail 6c\n")
|
||||
} else {
|
||||
txt.print("ok 6c\n")
|
||||
}
|
||||
|
||||
if ww > -9999 {
|
||||
txt.print("ok 7\n")
|
||||
} else {
|
||||
txt.print("fail 7\n")
|
||||
}
|
||||
|
||||
if ww > -1 {
|
||||
txt.print("fail 8\n")
|
||||
} else {
|
||||
txt.print("ok 8\n")
|
||||
}
|
||||
|
||||
if ww>0 {
|
||||
txt.print("fail 8b\n")
|
||||
} else {
|
||||
txt.print("ok 8b\n")
|
||||
}
|
||||
|
||||
if ww>-2222 {
|
||||
txt.print("fail 8b2\n")
|
||||
} else {
|
||||
txt.print("ok 8b2\n")
|
||||
}
|
||||
|
||||
if ff > -1.0 {
|
||||
txt.print("fail 8c\n")
|
||||
} else {
|
||||
txt.print("ok 8c\n")
|
||||
}
|
||||
|
||||
if ff > -9999.9 {
|
||||
txt.print("ok 8d\n")
|
||||
} else {
|
||||
txt.print("fail 8d\n")
|
||||
}
|
||||
|
||||
if ff > 0.0 {
|
||||
txt.print("fail 8e\n")
|
||||
} else {
|
||||
txt.print("ok 8e\n")
|
||||
}
|
||||
|
||||
if ff > -2.2 {
|
||||
txt.print("fail 8e2\n")
|
||||
} else {
|
||||
txt.print("ok 8e2\n")
|
||||
}
|
||||
|
||||
if ubb > 5 {
|
||||
txt.print("ok 8f\n")
|
||||
} else {
|
||||
txt.print("fail 8f\n")
|
||||
}
|
||||
|
||||
if ubb > 250 {
|
||||
txt.print("fail 8g\n")
|
||||
} else {
|
||||
txt.print("ok 8g\n")
|
||||
}
|
||||
|
||||
if ubb > 0 {
|
||||
txt.print("ok 8h\n")
|
||||
} else {
|
||||
txt.print("fail 8h\n")
|
||||
}
|
||||
|
||||
if ubb > 22 {
|
||||
txt.print("fail 8h2\n")
|
||||
} else {
|
||||
txt.print("ok 8h2\n")
|
||||
}
|
||||
|
||||
if uww > 5 {
|
||||
txt.print("ok 8i\n")
|
||||
} else {
|
||||
txt.print("fail 8i\n")
|
||||
}
|
||||
|
||||
if uww > 9999 {
|
||||
txt.print("fail 8j\n")
|
||||
} else {
|
||||
txt.print("ok 8j\n")
|
||||
}
|
||||
|
||||
if uww>0 {
|
||||
txt.print("ok 8b\n")
|
||||
} else {
|
||||
txt.print("fail 8b\n")
|
||||
}
|
||||
|
||||
if uww>2222 {
|
||||
txt.print("fail 8b\n")
|
||||
} else {
|
||||
txt.print("ok 8b\n")
|
||||
}
|
||||
|
||||
; @($c000) *= 99 ; TODO implement
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user