]> git.sur5r.net Git - cc65/blob - libsrc/common/memcpy.s
Copy TGI drivers into main lib dir
[cc65] / libsrc / common / memcpy.s
1 ;
2 ; void* memcpy (void* dest, const void* src, size_t n);
3 ; void* memmove (void* dest, const void* src, size_t n);
4 ;
5 ; Ullrich von Bassewitz, 10.12.1998
6 ;
7
8         .export         _memcpy, _memmove
9         .import         popax
10         .importzp       ptr1, ptr2, ptr3, tmp1, tmp2
11
12 ; ----------------------------------------------------------------------
13 _memcpy:
14         jsr     getparms        ; Get the parameters from stack
15
16 ; Copy upwards
17
18 copyup: ldy     #0              ; set up to move 256
19         ldx     tmp2            ; hi byte of n
20         beq     @L2
21
22 @L1:    lda     (ptr1),y        ; get a byte
23         sta     (ptr2),y        ; store it
24         iny
25         bne     @L1
26         inc     ptr1+1          ; bump ptrs
27         inc     ptr2+1
28         dex
29         bne     @L1             ; do another block
30
31 @L2:    ldx     tmp1            ; get low byte of n
32         beq     done            ; jump if done
33
34 @L3:    lda     (ptr1),y        ; get a byte
35         sta     (ptr2),y        ; store it
36         iny
37         dex
38         bne     @L3
39
40 done:   lda     ptr3
41         ldx     ptr3+1          ; get function result (dest)
42         rts
43
44
45 ; ----------------------------------------------------------------------
46 _memmove:
47         jsr     getparms        ; Get the parameters from stack
48
49         cpx     ptr1+1          ; dest > src?
50         bne     @L1
51         cmp     ptr1
52 @L1:    beq     done            ; Both pointers are equal - nothing to copy
53         bcc     copyup          ; Copy upwards
54
55 ; Copy downwards
56
57         clc
58         lda     ptr1+1
59         adc     tmp2
60         sta     ptr1+1
61
62         clc
63         lda     ptr2+1
64         adc     tmp2
65         sta     ptr2+1
66
67 ; Copy the incomplete page
68
69         ldy     tmp1            ; Get low byte of count
70         beq     @L3
71
72 @L2:    dey
73         lda     (ptr1),y
74         sta     (ptr2),y
75         tya                     ; Test Y
76         bne     @L2             ; Jump if not zero
77
78 ; Copy complete pages
79
80 @L3:    ldx     tmp2            ; Get hi byte of count
81         beq     done
82
83 @L4:    dec     ptr1+1
84         dec     ptr2+1
85 @L5:    dey
86         lda     (ptr1),y
87         sta     (ptr2),y
88         tya
89         bne     @L5
90         dex
91         bne     @L4
92
93 ; Done
94
95         beq     done
96
97 ; ----------------------------------------------------------------------
98 ; Get the parameters from stack
99            
100 getparms:
101         sta     tmp1            ; Save n
102         stx     tmp2
103         jsr     popax           ; src
104         sta     ptr1
105         stx     ptr1+1
106         jsr     popax           ; dest
107         sta     ptr2
108         stx     ptr2+1          ; save work copy
109         sta     ptr3
110         stx     ptr3+1          ; save function result
111         rts
112
113