;
; Ullrich von Bassewitz, 31.05.1998
+; Christian Krueger, 2013-Aug-04, minor optimization
;
; const char* strchr (const char* s, int c);
;
.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
+ sta tmp1 ; Save c
+ jsr popax ; get s
+ tay ; low byte of pointer to y
+ stx ptr1+1
+ lda #0
+ sta ptr1 ; ptr access page wise
+
+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
+ 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
+EOS:
+ lda tmp1 ; Get the char we're searching for
+ bne NotFound ; Jump if not searching for terminator
-; Found. Calculate pointer to c.
+; Found. Set pointer to c.
-Found: ldx ptr1+1 ; Load high byte of pointer
- tya ; Low byte offset
- clc
- adc ptr1
- bcc Found1
- inx
-Found1: rts
+Found:
+ ldx ptr1+1 ; Load high byte of pointer
+ tya ; low byte is in y
+ rts
; Not found, return NULL
NotFound:
- lda #0
+ lda #0
tax
rts
-