mirror of
https://github.com/cc65/cc65.git
synced 2024-12-27 15:29:46 +00:00
64 lines
1.7 KiB
ArmAsm
64 lines
1.7 KiB
ArmAsm
;
|
|
; This file, instead of "common/memmove.s", will be assembled for the pce
|
|
; target. This version is smaller and faster because it uses the HuC6280's
|
|
; block-copy instructions.
|
|
;
|
|
; 2003-08-20, Ullrich von Bassewitz
|
|
; 2015-10-23, Greg King
|
|
;
|
|
; void* __fastcall__ memmove (void* dest, const void* src, size_t size);
|
|
;
|
|
; NOTE: This function uses entry points from "pce/memcpy.s"!
|
|
;
|
|
|
|
.export _memmove
|
|
|
|
.import memcpy_getparams, memcpy_increment, memcpy_transfer
|
|
.importzp ptr1, ptr2, ptr3
|
|
|
|
.macpack generic
|
|
.macpack longbranch
|
|
|
|
|
|
; ----------------------------------------------------------------------
|
|
_memmove:
|
|
jsr memcpy_getparams
|
|
|
|
; Check for the copy direction. If dest < src, we must copy downwards (start
|
|
; at low addresses, and increase pointers); otherwise, we must copy upwards
|
|
; (start at high addresses, and decrease pointers).
|
|
|
|
cmp ptr1
|
|
txa
|
|
sbc ptr1+1
|
|
jcc memcpy_increment ; Branch if dest < src
|
|
|
|
; Copy decrementing; adjust the pointers to the end of the memory regions.
|
|
|
|
lda ptr1
|
|
add ptr3
|
|
sta ptr1
|
|
lda ptr1+1
|
|
adc ptr3+1
|
|
sta ptr1+1
|
|
|
|
lda ptr1 ; point to last byte of source
|
|
bne @L1
|
|
dec ptr1+1
|
|
@L1: dec ptr1
|
|
|
|
lda ptr2
|
|
add ptr3
|
|
sta ptr2
|
|
lda ptr2+1
|
|
adc ptr3+1
|
|
sta ptr2+1
|
|
|
|
lda ptr2 ; point to last byte of target
|
|
bne @L2
|
|
dec ptr2+1
|
|
@L2: dec ptr2
|
|
|
|
ldy #$C3 ; TDD opcode
|
|
jmp memcpy_transfer
|