tweak '<' code

This commit is contained in:
Irmen de Jong 2020-09-26 12:24:15 +02:00
parent b976360248
commit 130cee1e70
3 changed files with 290 additions and 219 deletions

View File

@ -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 +

View File

@ -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")

View File

@ -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