cc65/libsrc/common/strchr.s

53 lines
1.2 KiB
ArmAsm

;
; Ullrich von Bassewitz, 31.05.1998
; Christian Krueger, 2013-Aug-04, minor optimization
;
; const char* strchr (const char* s, int c);
;
.export _strchr
.import popax
.importzp ptr1, tmp1
.macpack cpu
_strchr:
sta tmp1 ; Save c
jsr popax ; get s
tay ; low byte of pointer to y
stx ptr1+1
.if (.cpu .bitand ::CPU_ISET_65SC02)
stz ptr1
.else
lda #0
sta ptr1 ; access from page start, y contains low byte
.endif
Loop: lda (ptr1),y ; Get next char
beq EOS ; Jump on end of string
cmp tmp1 ; Found?
beq Found ; Jump if yes
iny
bne Loop
inc ptr1+1
bne Loop ; Branch always
; End of string. Check if we're searching for the terminating zero
EOS:
lda tmp1 ; Get the char we're searching for
bne NotFound ; Jump if not searching for terminator
; Found. Set pointer to c.
Found:
ldx ptr1+1 ; Load high byte of pointer
tya ; low byte is in y
rts
; Not found, return NULL
NotFound:
lda #0
tax
rts