;
; Ullrich von Bassewitz, 31.05.1998
;
; char* strncat (char* dest, const char* src, size_t n);
;

        .export         _strncat
        .import         popax
        .importzp       ptr1, ptr2, ptr3, tmp1, tmp2

_strncat:
        eor     #$FF            ; one's complement to count upwards
        sta     tmp1
        txa
        eor     #$FF
        sta     tmp2
        jsr     popax           ; get src
        sta     ptr1
        stx     ptr1+1
        jsr     popax           ; get dest
        sta     ptr2
        stx     ptr2+1
        sta     ptr3            ; remember for function return
        stx     ptr3+1
        ldy     #0

; find end of dest

L1:     lda     (ptr2),y
        beq     L2
        iny
        bne     L1
        inc     ptr2+1
        bne     L1

; end found, get offset in y into pointer

L2:     tya
        clc
        adc     ptr2
        sta     ptr2
        bcc     L3
        inc     ptr2+1

; copy src. We've put the ones complement of the count into the counter, so
; we'll increment the counter on top of the loop

L3:     ldy     #0
        ldx     tmp1            ; low counter byte

L4:     inx
        bne     L5
        inc     tmp2
        beq     L6              ; jump if done
L5:     lda     (ptr1),y
        sta     (ptr2),y
        beq     L7
        iny
        bne     L4
        inc     ptr1+1
        inc     ptr2+1
        bne     L4

; done, set the trailing zero and return pointer to dest

L6:     lda     #0
        sta     (ptr2),y
L7:     lda     ptr3
        ldx     ptr3+1
        rts