Imported Upstream version 2.9.0
[debian/cc1111] / device / lib / ds390 / memcpyx.c
1 #include <string.h>
2
3 void __xdata * memcpyx (
4         void __xdata * dst,
5         void __xdata * src,
6         int count
7         ) __naked
8 {
9     /* Shut compiler up about unused parameters. */
10     dst; src; count;
11     
12 /* AUTO_TOGGLE uses the '390 DPTS toggle bit. */    
13 #define AUTO_TOGGLE    
14 __asm
15     ; Destination is in DPTR. Save it on stack so we can return it at end.
16     
17     push dpx
18     push dph
19     push dpl
20     
21     mov  dps, #0x1        ; Alternate DPTR.
22     
23     ; count  is in _memcpyx_PARM_3
24     mov  dptr, #_memcpyx_PARM_3
25     movx a, @dptr
26     inc dptr
27     mov r2, a
28     movx a, @dptr
29     mov r3, a
30
31     ; src is in _memcpyx_PARM_2
32     mov  dptr, #_memcpyx_PARM_2
33     movx a, @dptr
34     inc  dptr
35     push acc
36     movx a, @dptr
37     inc  dptr
38     push acc
39     movx a, @dptr
40     mov  dpx1, a
41     pop  dph1
42     pop  dpl1
43
44 #ifdef AUTO_TOGGLE
45     mov dps, #0x21      ; Current DPTR is alt DPTR, toggle after each op.
46 #else
47     mov dps, #0x0       ; Current DPTR is normal DPTR, no toggle.
48 #endif    
49     
50     ; src is in alt DPTR, dst is in normal DPTR, count is in r2/r3.
51     
52     ; If we have zero bytes to copy, quick out.
53     mov  a, r2
54     orl  a, r3
55     jz   _memcpy_done
56
57     ; increment r3 if r2 != 0 (makes djnz end-of-loop sequence possible).
58     inc r3
59     cjne r2, #0x0, _memcpyx_loopTop
60     dec r3
61
62 _memcpyx_loopTop:
63
64 #ifdef AUTO_TOGGLE
65     movx a, @dptr
66     movx @dptr, a
67     inc dptr
68     inc dptr
69 #else
70     inc dps
71     movx a, @dptr
72     inc dptr
73     dec dps 
74     movx @dptr, a
75     inc dptr
76 #endif    
77
78     djnz r2, _memcpyx_loopTop
79     djnz r3, _memcpyx_loopTop
80     
81 _memcpy_done:
82
83 #ifdef AUTO_TOGGLE
84     mov dps, #0x0
85 #endif    
86
87     pop dpl
88     pop dph
89     pop dpx
90     ret
91 __endasm;    
92     
93 }