1
0
mirror of https://github.com/cc65/cc65.git synced 2024-09-29 02:55:20 +00:00

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

View File

@ -6,40 +6,39 @@
; ;
.export _strcspn .export _strcspn
.import popax, _strlen .import popptr1, _strlen
.importzp ptr1, ptr2, tmp1, tmp2 .importzp ptr1, ptr2, tmp1, tmp2
_strcspn: _strcspn:
jsr _strlen ; get length in a/x and transfer s2 to ptr1 jsr _strlen ; get length in a/x and transfer s2 to ptr2
; Note: It does not make sense to ; Note: It does not make sense to
; have more than 255 test chars, so ; have more than 255 test chars, so
; we don't support a high byte here! (ptr1+1 is ; we don't support a high byte here! (ptr2+1 is
; also unchanged in strlen then (important!)) ; also unchanged in strlen then (important!))
; -> the original implementation also ; -> the original implementation also
; ignored this case ; ignored this case
sta tmp1 ; tmp1 = strlen of test chars sta tmp1 ; tmp1 = strlen of test chars
jsr popax ; get and save s1 jsr popptr1 ; get and save s1 to ptr1
sta ptr2 ; to ptr2
stx ptr2+1
ldx #0 ; low counter byte ldx #0 ; low counter byte
stx tmp2 ; high counter byte stx tmp2 ; high counter byte
loadChar: loadChar:
ldy #0 ldy #0
lda (ptr2),y ; get next char from s1 lda (ptr1),y ; get next char from s1
beq leave ; handly byte of s1 beq leave ; handly byte of s1
advance: advance:
inc ptr2 ; advance string position to test inc ptr1 ; advance string position to test
bne check bne check
inc ptr2+1 inc ptr1+1
dey ; correct next iny (faster/shorter than bne...) dey ; correct next iny (faster/shorter than bne...)
checkNext: checkNext:
iny iny
check: cpy tmp1 ; compare with length of test character string check: cpy tmp1 ; compare with length of test character string
beq endOfTestChars beq endOfTestChars
cmp (ptr1),y ; found matching char? cmp (ptr2),y ; found matching char?
bne checkNext bne checkNext
leave: txa ; restore position of finding leave: txa ; restore position of finding

View File

@ -2,26 +2,26 @@
; Ullrich von Bassewitz, 31.05.1998 ; Ullrich von Bassewitz, 31.05.1998
; ;
; Note: strspn & strcspn call internally this function and rely on ; Note: strspn & strcspn call internally this function and rely on
; the usage of only ptr1 here! Keep in mind when appling changes ; the usage of only ptr2 here! Keep in mind when appling changes
; and check the other implementations too! ; and check the other implementations too!
; ;
; int strlen (const char* s); ; int strlen (const char* s);
; ;
.export _strlen .export _strlen
.importzp ptr1 .importzp ptr2
_strlen: _strlen:
sta ptr1 ; Save s sta ptr2 ; Save s
stx ptr1+1 stx ptr2+1
ldx #0 ; YX used as counter ldx #0 ; YX used as counter
ldy #0 ldy #0
L1: lda (ptr1),y L1: lda (ptr2),y
beq L9 beq L9
iny iny
bne L1 bne L1
inc ptr1+1 inc ptr2+1
inx inx
bne L1 bne L1

View File

@ -6,40 +6,39 @@
; ;
.export _strspn .export _strspn
.import popax, _strlen .import popptr1, _strlen
.importzp ptr1, ptr2, tmp1, tmp2 .importzp ptr1, ptr2, tmp1, tmp2
_strspn: _strspn:
jsr _strlen ; get length in a/x and transfer s2 to ptr1 jsr _strlen ; get length in a/x and transfer s2 to ptr2
; Note: It does not make sense to ; Note: It does not make sense to
; have more than 255 test chars, so ; have more than 255 test chars, so
; we don't support a high byte here! (ptr1+1 is ; we don't support a high byte here! (ptr2+1 is
; also unchanged in strlen then (important!)) ; also unchanged in strlen then (important!))
; -> the original implementation also ; -> the original implementation also
; ignored this case ; ignored this case
sta tmp1 ; tmp1 = strlen of test chars sta tmp1 ; tmp1 = strlen of test chars
jsr popax ; get and save s1 jsr popptr1 ; get and save s1 to ptr1
sta ptr2 ; to ptr2
stx ptr2+1
ldx #0 ; low counter byte ldx #0 ; low counter byte
stx tmp2 ; high counter byte stx tmp2 ; high counter byte
loadChar: loadChar:
ldy #0 ldy #0
lda (ptr2),y ; get next char from s1 lda (ptr1),y ; get next char from s1
beq leave ; handly byte of s1 beq leave ; handly byte of s1
advance: advance:
inc ptr2 ; advance string position to test inc ptr1 ; advance string position to test
bne check bne check
inc ptr2+1 inc ptr1+1
dey ; correct next iny (faster/shorter than bne...) dey ; correct next iny (faster/shorter than bne...)
checkNext: checkNext:
iny iny
check: cpy tmp1 ; compare with length of test character string check: cpy tmp1 ; compare with length of test character string
beq leave beq leave
cmp (ptr1),y ; found matching char? cmp (ptr2),y ; found matching char?
bne checkNext bne checkNext
foundTestChar: foundTestChar:

View File

@ -6,29 +6,30 @@
.export _screensize .export _screensize
.import popsreg .import popptr1
.import screensize .import screensize
.importzp ptr1, sreg .importzp ptr1, ptr2
.macpack cpu
.proc _screensize .proc _screensize
sta ptr1 ; Store the y pointer sta ptr2 ; Store the y pointer
stx ptr1+1 stx ptr2+1
jsr popsreg ; Get the x pointer into sreg jsr popptr1 ; Get the x pointer into ptr1
jsr screensize ; Get screensize into X/Y jsr screensize ; Get screensize into X/Y
tya ; Get Y size into A tya ; Get Y size into A
.IFP02 .if (.cpu .bitand ::CPU_ISET_65SC02)
ldy #0 sta (ptr2)
sta (ptr1),y
txa txa
sta (sreg),y
.ELSE
sta (ptr1) sta (ptr1)
.else
ldy #0
sta (ptr2),y
txa txa
sta (sreg) sta (ptr1),y
.ENDIF .endif
rts rts
.endproc .endproc