mirror of
https://github.com/cc65/cc65.git
synced 2025-01-14 00:32:08 +00:00
Added a speed optimization. Makes the code somewhat larger, but is a huge
improvement speedwise. git-svn-id: svn://svn.cc65.org/cc65/trunk@567 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
a6682eaeec
commit
adabe02bbd
@ -6,12 +6,11 @@
|
||||
|
||||
.export __printf
|
||||
|
||||
.import popax, pushax, pusheax, push1, axlong, axulong
|
||||
.import popax, pushax, pusheax, decsp6, push1, axlong, axulong
|
||||
.import __ctype
|
||||
.import _ltoa, _ultoa
|
||||
.import _strlower, _strlen
|
||||
.import jmpvec
|
||||
.importzp sp, ptr1, tmp1, regbank, sreg
|
||||
.importzp sp, ptr1, ptr2, tmp1, regbank, sreg
|
||||
|
||||
.macpack generic
|
||||
|
||||
@ -27,7 +26,8 @@ OutData = regbank+4 ; Function parameters
|
||||
; Other zero page cells
|
||||
|
||||
Base = ptr1
|
||||
|
||||
FSave = ptr1
|
||||
FCount = ptr2
|
||||
|
||||
.code
|
||||
|
||||
@ -60,6 +60,7 @@ Output1:
|
||||
ldx #>CharArg
|
||||
jsr pushax
|
||||
jsr push1
|
||||
CallOutFunc:
|
||||
jmp (OutFunc) ; fout (OutData, &CharArg, 1)
|
||||
|
||||
; ----------------------------------------------------------------------------
|
||||
@ -282,9 +283,70 @@ Save: lda regbank,y
|
||||
; Start parsing the format string
|
||||
|
||||
MainLoop:
|
||||
jsr GetFormatChar ; Get one char, zero in Y
|
||||
lda Format ; Remember current format pointer
|
||||
sta FSave
|
||||
lda Format+1
|
||||
sta FSave+1
|
||||
|
||||
ldy #0 ; Index
|
||||
@L1: lda (Format),y ; Get next char
|
||||
beq @L2 ; Jump on end of string
|
||||
cmp #'%' ; Format spec?
|
||||
beq @L2
|
||||
iny ; Bump pointer
|
||||
bne @L1
|
||||
inc Format+1 ; Bump high byte of pointer
|
||||
bne @L1 ; Branch always
|
||||
|
||||
; Found a '%' character or end of string. Update the Format pointer so it is
|
||||
; current (points to this character).
|
||||
|
||||
@L2: tya ; Low byte of offset
|
||||
add Format
|
||||
sta Format
|
||||
bcc @L3
|
||||
inc Format+1
|
||||
|
||||
; Calculate, how many characters must be output. Beware: This number may
|
||||
; be zero. A still contains the low byte of the pointer.
|
||||
|
||||
@L3: sub FSave
|
||||
sta FCount
|
||||
lda Format+1
|
||||
sbc FSave+1
|
||||
sta FCount+1
|
||||
ora FCount ; Is the result zero?
|
||||
beq @L4 ; Jump if yes
|
||||
|
||||
; Output the characters that we have until now. To make the call to out
|
||||
; faster, build the stack frame by hand (don't use pushax)
|
||||
|
||||
jsr decsp6 ; 3 args
|
||||
ldy #5
|
||||
lda OutData+1
|
||||
sta (sp),y
|
||||
dey
|
||||
lda OutData
|
||||
sta (sp),y
|
||||
dey
|
||||
lda FSave+1
|
||||
sta (sp),y
|
||||
dey
|
||||
lda FSave
|
||||
sta (sp),y
|
||||
dey
|
||||
lda FCount+1
|
||||
sta (sp),y
|
||||
dey
|
||||
lda FCount
|
||||
sta (sp),y
|
||||
jsr CallOutFunc ; Call the output function
|
||||
|
||||
; We're back from out(), or we didn't call it. Check for end of string.
|
||||
|
||||
@L4: jsr GetFormatChar ; Get one char, zero in Y
|
||||
tax ; End of format string reached?
|
||||
bne NotDone ; Continue of end not reached
|
||||
bne NotDone ; End not reached
|
||||
|
||||
; End of format string reached. Restore the zeropage registers and return.
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user