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
;
|
|
; 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
|
|
|