mirror of
https://github.com/cc65/cc65.git
synced 2024-11-01 11:04:34 +00:00
72 lines
1.3 KiB
ArmAsm
72 lines
1.3 KiB
ArmAsm
;
|
|
; Ullrich von Bassewitz, 31.05.1998
|
|
; Christian Krueger: 12-Aug-2013, minor optimizations
|
|
;
|
|
; char* strncat (char* dest, const char* src, size_t n);
|
|
;
|
|
|
|
.export _strncat
|
|
.import popax, popptr1
|
|
.importzp ptr1, ptr2, ptr3, tmp1, tmp2
|
|
.macpack cpu
|
|
|
|
_strncat:
|
|
inx
|
|
stx tmp2
|
|
tax
|
|
inx
|
|
stx tmp1 ; save count with each byte incremented separately
|
|
|
|
jsr popptr1 ; get src
|
|
|
|
jsr popax ; get dest
|
|
sta ptr3 ; remember for function return
|
|
stx ptr3+1
|
|
stx ptr2+1
|
|
tay ; low byte as offset in Y
|
|
.if (.cpu .bitand ::CPU_ISET_65SC02)
|
|
stz ptr2
|
|
.else
|
|
ldx #0
|
|
stx ptr2 ; destination on page boundary
|
|
.endif
|
|
|
|
; find end of dest
|
|
|
|
L1: lda (ptr2),y
|
|
beq L2
|
|
iny
|
|
bne L1
|
|
inc ptr2+1
|
|
bne L1
|
|
|
|
; end found, apply offset to dest ptr and reset y
|
|
L2: sty ptr2
|
|
|
|
; 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: dex
|
|
bne L5
|
|
dec 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
|