; block-copy instructions.
;
; 2003-08-20, Ullrich von Bassewitz
-; 2015-10-11, Greg King
+; 2015-11-02, Greg King
;
; void* __fastcall__ memcpy (void* dest, const void* src, size_t size);
;
-; NOTE: This function contains entry points for memmove, which will resort
-; to memcpy for an incrementing copy. Don't change this module without looking
-; at "pce/memmove.s"!
+; NOTE: This function contains entry points for memmove(), which resorts to
+; memcpy() for incrementing copies. The PC-Engine memset() uses this memcpy()
+; to fill memory quickly. Don't change this module without looking at
+; "pce/memmove.s" and "pce/memset.s"!
;
.export _memcpy
.export memcpy_increment, memcpy_transfer, memcpy_getparams
- .import popax
+ .import incsp2, popax, popptr1
.importzp sp, ptr1, ptr2, ptr3
jsr memcpy_getparams
memcpy_increment:
- ldy #$73 ; TII
+ ldy #$73 ; TII opcode
memcpy_transfer:
- sty transfer+opcode
+ sty transfer + opcode
lda ptr1
ldx ptr1+1
- sta transfer+source
- stx transfer+source+1
+ sta transfer + source
+ stx transfer + source+1
lda ptr2
ldx ptr2+1
- sta transfer+destination
- stx transfer+destination+1
+ sta transfer + destination
+ stx transfer + destination+1
lda ptr3
ldx ptr3+1
- sta transfer+length
- stx transfer+length+1
+ sta transfer + length
+ stx transfer + length+1
jmp transfer
memcpy_getparams:
sta ptr3
stx ptr3+1 ; save size
+ ora ptr3+1
+ bne @L1
- jsr popax
- sta ptr1
- stx ptr1+1 ; save src
+; The size is zero; copy nothing; just return the dest address.
+; (The HuC6280's transfer instructions can't copy $0000 bytes;
+; they would copy $10000 [64K] bytes instead.)
-; (Direct stack access is four cycles faster [total cycle count].)
+ ply ; drop return address
+ plx
+ jsr incsp2 ; drop src address
+ jmp popax ; get pointer; return it as result
- ldy #1 ; save dest
+@L1: jsr popptr1 ; save src
+
+; (Direct stack access is six cycles faster [total cycle count].)
+
+ iny ; (Y=0 by popptr1, need '1' here) save dest
lda (sp),y ; get high byte
tax
lda (sp) ; get low byte
transfer:
tii $FFFF, $FFFF, $0001
- jmp popax ; get pointer; and, return it as result
+ jmp popax ; get pointer; return it as result