Further optimizations in common/conio.

This commit is contained in:
IrgendwerA8
2018-05-22 15:59:05 +02:00
parent d7da827be8
commit ba2c6d9008
5 changed files with 81 additions and 88 deletions

View File

@@ -6,11 +6,11 @@
;
.export _ltoa, _ultoa
.import popax
.import popax, popptr1, negeax
.import __hextab, __longminstr
.importzp sreg, ptr1, ptr2, ptr3, tmp1
.macpack cpu
.code
@@ -19,17 +19,15 @@
;
dopop: sta tmp1 ; will loose high byte
jsr popax ; get s
sta ptr1
stx ptr1+1
sta sreg ; save for return
stx sreg+1
jsr popax ; get low word of value
jsr popax ; get s to ptr2
sta ptr2
stx ptr2+1
jsr popax ; get high word of value
sta ptr3
sta ptr3 ; save for return
stx ptr3+1
jsr popptr1 ; get low word of value to ptr1
jsr popax ; get high word of value to sreg
sta sreg
stx sreg+1
rts
;
@@ -41,20 +39,20 @@ _ltoa: jsr dopop ; pop the arguments
; We must handle $80000000 in a special way, since it is the only negative
; number that has no positive 32-bit counterpart
ldx ptr3+1 ; get high byte
ldx sreg+1 ; get high byte
ldy tmp1 ; get radix
cpy #10
bne ultoa
lda ptr3
ora ptr2+1
ora ptr2
lda sreg
ora ptr1+1
ora ptr1
bne L2
cpx #$80
bne L2
ldy #11
L1: lda __longminstr,y ; copy -2147483648
sta (ptr1),y
sta (ptr2),y
dey
bpl L1
jmp L10
@@ -65,29 +63,25 @@ L1: lda __longminstr,y ; copy -2147483648
L2: txa ; get high byte
bpl ultoa
lda #'-'
ldy #0
sta (ptr1),y ; store sign
inc ptr1
bne L3
inc ptr1+1
L3: lda ptr2 ; negate val
eor #$FF
clc
adc #$01
sta ptr2
lda ptr2+1
eor #$FF
adc #$00
sta ptr2+1
lda ptr3
eor #$FF
adc #$00
sta ptr3
lda ptr3+1
eor #$FF
adc #$00
sta ptr3+1
.if (.cpu .bitand CPU_ISET_65SC02)
sta (ptr2)
.else
ldy #0
sta (ptr2),y ; store sign
.endif
inc ptr2
bne L3
inc ptr2+1
L3: lda ptr1 ; negate val
ldx ptr1+1
jsr negeax
sta ptr1
stx ptr1+1
jmp ultoa
;
@@ -105,15 +99,15 @@ ultoa: lda #$00
L5: ldy #32 ; 32 bit
lda #0 ; remainder
L6: asl ptr2
rol ptr2+1
rol ptr3
rol ptr3+1
L6: asl ptr1
rol ptr1+1
rol sreg
rol sreg+1
rol a
cmp tmp1
bcc L7
sbc tmp1
inc ptr2
inc ptr1
L7: dey
bne L6
@@ -121,25 +115,25 @@ L7: dey
lda __hextab,y ; get hex character
pha ; save char value on stack
lda ptr2
ora ptr2+1
ora ptr3
ora ptr3+1
lda ptr1
ora ptr1+1
ora sreg
ora sreg+1
bne L5
; Get the characters from the stack into the string
ldy #0
L9: pla
sta (ptr1),y
sta (ptr2),y
beq L10 ; jump if sentinel
iny
bne L9 ; jump always
; Done! Return the target string
L10: lda sreg
ldx sreg+1
L10: lda ptr3
ldx ptr3+1
rts