]> git.sur5r.net Git - cc65/blobdiff - libsrc/common/strcat.s
Optimization of two string functions (size & speed).
[cc65] / libsrc / common / strcat.s
index 8640626f348bed943d1cbeaccffa10982a9dcaef..279bfe65b8b2d71e8d2f91f73d0a59d1f3f4581f 100644 (file)
@@ -1,55 +1,47 @@
 ;
 ; Ullrich von Bassewitz, 31.05.1998
+; Christian Krueger: 2013-Jul-24, minor optimization
 ;
 ; char* strcat (char* dest, const char* src);
 ;
 
-               .export         _strcat
-       .import         popax
-       .importzp       ptr1, ptr2, tmp3
+        .export         _strcat
+        .import         popax
+        .importzp       ptr1, ptr2, tmp3
 
 _strcat:
-               sta     ptr1            ; Save src
-               stx     ptr1+1
-               jsr     popax           ; Get dest
-       sta     ptr2
-       stx     ptr2+1
-       sta     tmp3            ; Remember for function return
-       ldy     #0
-
-; find end of dest
-
-sc1:   lda     (ptr2),y
-       beq     sc2
-       iny
-       bne     sc1
-       inc     ptr2+1
-       bne     sc1
-
-; end found, get offset in y into pointer
-
-sc2:   tya
-       clc
-       adc     ptr2
-       sta     ptr2
-       bcc     sc3
-       inc     ptr2+1
-
-; copy src
-
-sc3:   ldy     #0
-sc4:   lda     (ptr1),y
-       sta     (ptr2),y
-       beq     sc5
-       iny
-       bne     sc4
-       inc     ptr1+1
-       inc     ptr2+1
-       bne     sc4
-
-; done, return pointer to dest
-
-sc5:   lda     tmp3            ; X does still contain high byte
-       rts
-
+        sta     ptr1            ; Save src
+        stx     ptr1+1
+        jsr     popax           ; Get dest
+        sta     tmp3            ; Remember for function return
+       tay
+       lda     #0
+       sta     ptr2            ; access from page start, y contains low byte
+        stx     ptr2+1
+
+findEndOfDest:
+       lda     (ptr2),y
+        beq     endOfDestFound
+        iny
+        bne     findEndOfDest
+        inc     ptr2+1
+        bne     findEndOfDest
+
+endOfDestFound:
+       sty     ptr2            ; advance pointer to last y position    
+       ldy     #0              ; reset new y-offset
+
+copyByte:
+       lda     (ptr1),y
+        sta     (ptr2),y
+        beq     done
+        iny
+        bne     copyByte
+        inc     ptr1+1
+        inc     ptr2+1
+        bne     copyByte       ; like bra here
+
+; return pointer to dest
+done:  lda     tmp3            ; X does still contain high byte
+        rts