]> git.sur5r.net Git - cc65/blobdiff - libsrc/pce/memcpy.s
atari5200: conio now uses just four colors altogether
[cc65] / libsrc / pce / memcpy.s
index b06dad645b225d4d62f34664f37292ed2fd772f4..98db6a96439f03e1ec1818eb1f22b55e8029fe3d 100644 (file)
@@ -4,19 +4,20 @@
 ; 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
 
 
@@ -34,25 +35,25 @@ _memcpy:
         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
 
@@ -68,14 +69,23 @@ memcpy_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
@@ -91,4 +101,4 @@ memcpy_getparams:
 
 transfer:
         tii     $FFFF, $FFFF, $0001
-        jmp     popax                   ; get pointer; and, return it as result
+        jmp     popax                   ; get pointer; return it as result