2 ; Ullrich von Bassewitz, 2003-08-20
3 ; Performance increase (about 20%) by
4 ; Christian Krueger, 2009-09-13
6 ; void* __fastcall__ memmove (void* dest, const void* src, size_t size);
8 ; NOTE: This function uses entry points from memcpy!
12 .import memcpy_getparams, memcpy_upwards, popax
13 .importzp ptr1, ptr2, ptr3, ptr4, tmp1
18 ; ----------------------------------------------------------------------
22 ; Check for the copy direction. If dest < src, we must copy upwards (start at
23 ; low addresses and increase pointers), otherwise we must copy downwards
24 ; (start at high addresses and decrease pointers).
30 jcc memcpy_upwards ; Branch if dest < src (upwards copy)
32 ; Copy downwards. Adjust the pointers to the end of the memory regions.
42 ; handle fractions of a page size first
44 ldy ptr3 ; count, low byte
45 bne @entry ; something to copy?
46 beq PageSizeCopy ; here like bra...
54 lda (ptr1),y ; copy remaining byte
57 PageSizeCopy: ; assert Y = 0
58 ldx ptr3+1 ; number of pages
59 beq done ; none? -> done
62 dec ptr1+1 ; adjust base...
64 dey ; in entry case: 0 -> FF
65 lda (ptr1),y ; need to copy this 'intro byte'
66 sta (ptr2),y ; to 'land' later on Y=0! (as a result of the '.repeat'-block!)
69 .repeat 2 ; Unroll this a bit to make it faster...
74 @copyEntry: ; in entry case: 0 -> FF
76 lda (ptr1),y ; Y = 0, copy last byte
78 dex ; one page to copy less
79 bne @initBase ; still a page to copy?
83 done: jmp popax ; Pop ptr and return as result