You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.1 KiB
ArmAsm
73 lines
1.1 KiB
ArmAsm
;
|
|
; 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
|
|
|
|
|