mirror of
https://github.com/cc65/cc65.git
synced 2024-08-19 02:29:33 +00:00
Don't know what the standard says about it, but the feature seems reasonable and other compilers handle it this way. git-svn-id: svn://svn.cc65.org/cc65/trunk@42 b7a2c559-68d2-44c3-8de9-860c34a00d81
49 lines
906 B
ArmAsm
49 lines
906 B
ArmAsm
;
|
|
; Ullrich von Bassewitz, 31.05.1998
|
|
;
|
|
; const char* strchr (const char* s, int c);
|
|
;
|
|
|
|
.export _strchr
|
|
.import popax
|
|
.importzp ptr1, tmp1
|
|
|
|
_strchr:
|
|
sta tmp1 ; Save c
|
|
jsr popax ; get s
|
|
sta ptr1
|
|
stx ptr1+1
|
|
ldy #0
|
|
|
|
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. Calculate pointer to c.
|
|
|
|
Found: ldx ptr1+1 ; Load high byte of pointer
|
|
tya ; Low byte offset
|
|
clc
|
|
adc ptr1
|
|
bcc Found1
|
|
inx
|
|
Found1: rts
|
|
|
|
; Not found, return NULL
|
|
|
|
NotFound:
|
|
lda #0
|
|
tax
|
|
rts
|
|
|