]> git.sur5r.net Git - cc65/blobdiff - libsrc/common/strchr.s
Optimization of two string functions (size & speed).
[cc65] / libsrc / common / strchr.s
index 308381b06e1954fa6612076dd4a144ecea811df0..0bd55d0e148321d5f1241823b7268589e472b2b2 100644 (file)
@@ -1,5 +1,6 @@
 ;
 ; 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
-