2 ; void* memcpy (void* dest, const void* src, size_t n);
3 ; void* memmove (void* dest, const void* src, size_t n);
5 ; Ullrich von Bassewitz, 10.12.1998
8 .export _memcpy, _memmove
10 .importzp ptr1, ptr2, ptr3, tmp1, tmp2
12 ; ----------------------------------------------------------------------
14 jsr getparms ; Get the parameters from stack
18 copyup: ldy #0 ; set up to move 256
19 ldx tmp2 ; hi byte of n
22 @L1: lda (ptr1),y ; get a byte
23 sta (ptr2),y ; store it
26 inc ptr1+1 ; bump ptrs
29 bne @L1 ; do another block
31 @L2: ldx tmp1 ; get low byte of n
32 beq done ; jump if done
34 @L3: lda (ptr1),y ; get a byte
35 sta (ptr2),y ; store it
41 ldx ptr3+1 ; get function result (dest)
45 ; ----------------------------------------------------------------------
47 jsr getparms ; Get the parameters from stack
49 cpx ptr1+1 ; dest > src?
52 @L1: beq done ; Both pointers are equal - nothing to copy
53 bcc copyup ; Copy upwards
67 ; Copy the incomplete page
69 ldy tmp1 ; Get low byte of count
76 bne @L2 ; Jump if not zero
80 @L3: ldx tmp2 ; Get hi byte of count
97 ; ----------------------------------------------------------------------
98 ; Get the parameters from stack
108 stx ptr2+1 ; save work copy
110 stx ptr3+1 ; save function result