runs code in 1M wram, cell arrange, decode (untested)
[picodrive.git] / Pico / misc.s
1
2 @ vim:filetype=armasm
3
4
5 .global memcpy16 @ unsigned short *dest, unsigned short *src, int count
6
7 memcpy16:
8     eor     r3, r0, r1
9     tst     r3, #2
10     bne     mcp16_cant_align
11
12     tst     r0, #2
13     ldrneh  r3, [r1], #2
14     subne   r2, r2, #1
15     strneh  r3, [r0], #2
16
17     subs    r2, r2, #4
18     bmi     mcp16_fin
19
20 mcp16_loop:
21     ldmia   r1!, {r3,r12}
22     subs    r2, r2, #4
23     stmia   r0!, {r3,r12}
24     bpl     mcp16_loop
25
26 mcp16_fin:
27     tst     r2, #2
28     ldrne   r3, [r1], #4
29     strne   r3, [r0], #4
30     ands    r2, r2, #1
31     bxeq    lr
32
33 mcp16_cant_align:
34     ldrh    r3, [r1], #2
35     subs    r2, r2, #1
36     strh    r3, [r0], #2
37     bne     mcp16_cant_align
38
39     bx      lr
40
41
42
43 .global memcpy32 @ int *dest, int *src, int count
44
45 memcpy32:
46     stmfd   sp!, {r4,lr}
47
48     subs    r2, r2, #4
49     bmi     mcp32_fin
50
51 mcp32_loop:
52     ldmia   r1!, {r3,r4,r12,lr}
53     subs    r2, r2, #4
54     stmia   r0!, {r3,r4,r12,lr}
55     bpl     mcp32_loop
56
57 mcp32_fin:
58     tst     r2, #3
59     ldmeqfd sp!, {r4,pc}
60     tst     r2, #1
61     ldrne   r3, [r1], #4
62     strne   r3, [r0], #4
63
64 mcp32_no_unal1:
65     tst     r2, #2
66     ldmneia r1!, {r3,r12}
67     ldmfd   sp!, {r4,lr}
68     stmneia r0!, {r3,r12}
69     bx      lr
70
71
72
73 .global memset32 @ int *dest, int c, int count
74
75 memset32:
76     stmfd   sp!, {lr}
77
78     mov     r3, r1
79     subs    r2, r2, #4
80     bmi     mst32_fin
81
82     mov     r12,r1
83     mov     lr, r1
84
85 mst32_loop:
86     subs    r2, r2, #4
87     stmia   r0!, {r1,r3,r12,lr}
88     bpl     mst32_loop
89
90 mst32_fin:
91     tst     r2, #1
92     strne   r1, [r0], #4
93
94     tst     r2, #2
95     stmneia r0!, {r1,r3}
96
97     ldmfd   sp!, {lr}
98     bx      lr
99
100
101