fixed estack corruption caused by c64 print_f

This commit is contained in:
Irmen de Jong 2020-09-29 21:08:45 +02:00
parent e986973b5e
commit 8d67056f84
3 changed files with 78 additions and 46 deletions

View File

@ -356,17 +356,17 @@ mul_f .proc
neg_f .proc neg_f .proc
; -- toggle the sign bit on the stack ; -- toggle the sign bit on the stack
lda P8ESTACK_LO+3,x lda P8ESTACK_HI+3,x
eor #$80 eor #$80
sta P8ESTACK_LO+3,x sta P8ESTACK_HI+3,x
rts rts
.pend .pend
abs_f .proc abs_f .proc
; -- strip the sign bit on the stack ; -- strip the sign bit on the stack
lda P8ESTACK_LO+3,x lda P8ESTACK_HI+3,x
and #$7f and #$7f
sta P8ESTACK_LO+3,x sta P8ESTACK_HI+3,x
rts rts
.pend .pend

View File

@ -207,8 +207,8 @@ sub print_f (float value) {
jsr c64.CHROUT jsr c64.CHROUT
iny iny
bne - bne -
ldx floats_store_reg + ldx floats_store_reg
+ rts rts
}} }}
} }

View File

@ -13,62 +13,94 @@ main {
; uword[] colors = [ c1, c2, c3] ; TODO should contain pointers to (the first element) of each struct ; uword[] colors = [ c1, c2, c3] ; TODO should contain pointers to (the first element) of each struct
str[] names = ["aap", "noot", "mies", "vuur"] ; str[] names = ["aap", "noot", "mies", "vuur"]
uword[] names3 = ["aap", "noot", "mies", "vuur"] ; uword[] names3 = ["aap", "noot", "mies", "vuur"]
ubyte[] values = [11,22,33,44] ; ubyte[] values = [11,22,33,44]
uword[] arrays = [names, names3, values] ; uword[] arrays = [names, names3, values]
asmsub testX() {
%asm {{
stx _saveX
lda #13
jsr txt.chrout
lda _saveX
jsr txt.print_ub
lda #13
jsr txt.chrout
ldx _saveX
rts
_saveX .byte 0
}}
}
sub start() { sub start() {
byte bb = 100 ; byte bb = 100
word ww = 30000 ; word ww = 30000
float ff1 = 12345 float ff1 = 12345
float ff2 = -99999 float ff2 = -99999
;ff = 1+((-ff) *3) ; TODO fix invalid splitting (can't split because it references ff itself) ;ff = 1+((-ff) *3) ; TODO fix invalid splitting (can't split because it references ff itself)
;ff = 1+((-ff2) *3) ; TODO splitting should be okay here ;ff = 1+((-ff2) *3) ; TODO splitting should be okay here
testX()
floats.print_f(ff1) ; TODO if we remove this, the following calcuation is wrong floats.print_f(ff1) ; TODO if we remove this, the following calcuation is wrong
testX()
txt.chrout('\n') txt.chrout('\n')
testX()
ff1 = -ff2 * 3 ff1 = -ff2 * 3
testX()
floats.print_f(ff1)
testX()
txt.chrout('\n')
testX()
ff1 = -ff1 * 3
testX()
floats.print_f(ff1)
testX()
txt.chrout('\n')
ff1 = abs(ff2)
floats.print_f(ff1) floats.print_f(ff1)
txt.chrout('\n') txt.chrout('\n')
testX()
return return
struct Color { ; struct Color {
ubyte red ; ubyte red
ubyte green ; ubyte green
ubyte blue ; ubyte blue
} ; }
;
;Color c1 = [11,22,33] ; TODO fix struct initializer crash ; ;Color c1 = [11,22,33] ; TODO fix struct initializer crash
Color c1 ; Color c1
Color c2 ; Color c2
Color c3 ; Color c3
;Color c2 = [11,22,33] ; ;Color c2 = [11,22,33]
;Color c3 = [11,22,33] ; ;Color c3 = [11,22,33]
;uword[] colors = [ c1, c2, c3] ; TODO should contain pointers to (the first element) of each struct ; ;uword[] colors = [ c1, c2, c3] ; TODO should contain pointers to (the first element) of each struct
;
c1 = c2 ; c1 = c2
;c1 = [11,22,33] ; TODO rewrite into individual struct member assignments ; ;c1 = [11,22,33] ; TODO rewrite into individual struct member assignments
;
;
uword s ; uword s
for s in names { ; for s in names {
txt.print(s) ; txt.print(s)
txt.chrout('\n') ; txt.chrout('\n')
} ; }
txt.chrout('\n') ; txt.chrout('\n')
;
txt.print(names[2]) ; txt.print(names[2])
txt.chrout('\n') ; txt.chrout('\n')
txt.print(names[3]) ; txt.print(names[3])
txt.chrout('\n') ; txt.chrout('\n')
;
repeat { ; repeat {
txt.print(names3[rnd()&3]) ; txt.print(names3[rnd()&3])
txt.chrout(' ') ; txt.chrout(' ')
} ; }
} }
} }