You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
906 B
ArmAsm
49 lines
906 B
ArmAsm
12 years ago
|
;
|
||
|
; 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
|
||
|
|