summaryrefslogtreecommitdiff
path: root/programs/sub-suite/libc.s
diff options
context:
space:
mode:
Diffstat (limited to 'programs/sub-suite/libc.s')
-rw-r--r--programs/sub-suite/libc.s31
1 files changed, 31 insertions, 0 deletions
diff --git a/programs/sub-suite/libc.s b/programs/sub-suite/libc.s
index 18c10db..74ad654 100644
--- a/programs/sub-suite/libc.s
+++ b/programs/sub-suite/libc.s
@@ -508,3 +508,34 @@ free:
plb.q ; Restore B.
pla.q ; Restore A.
rts ; End of free.
+
+
+; memcpy: memory to memory copy.
+; Input: A = Destination pointer. B = Source pointer. Y = Number of bytes to copy.
+; Output: A = Destination pointer.
+; Caller preserved registers: none.
+; Callie preserved registers: none.
+
+memcpy:
+ pha.q ; Preserve the return value.
+ pha.q ; Push the destination pointer on the stack.
+ phb.q ; Push the source pointer on the stack.
+ phy.q ; Push the size on the stack.
+ and #0 ; Reset A.
+ tab ; Reset B.
+ cpy #0 ; Is the size zero?
+ beq @end ; Yes, so we're done.
+@loop:
+ lda (sp+9) ; Get a byte from the source.
+ sta (sp+17) ; Copy it to the destination.
+ inc.q sp+9 ; Increment the source pointer.
+ inc.q sp+17 ; Increment the destination pointer.
+ dey ; Decrement the size.
+ beq @end ; The size is zero, so we're done.
+ bra @loop ; Keep looping.
+@end:
+ pla.q ; Clean up the stack frame.
+ pla.q ;
+ pla.q ;
+ pla.q ; Restore the return value.
+ rts ; End of memcpy.