cff531af |
1 | /* |
2 | * Generic memory routines. |
3 | * (C) notaz, 2007-2008 |
4 | * |
5 | * This work is licensed under the terms of MAME license. |
6 | * See COPYING file in the top-level directory. |
7 | */ |
fa1e5e29 |
8 | |
0a051f55 |
9 | @ 0x12345678 -> 0x34127856 |
10 | @ r4=temp, lr=0x00ff00ff |
11 | .macro bswap reg |
12 | and r4, \reg, lr |
13 | and \reg, lr, \reg, lsr #8 |
14 | orr \reg, \reg, r4, lsl #8 |
15 | .endm |
16 | |
0a051f55 |
17 | @ dest must be halfword aligned, src can be unaligned |
18 | .global memcpy16bswap @ unsigned short *dest, void *src, int count |
19 | |
20 | memcpy16bswap: |
21 | tst r1, #1 |
22 | bne mcp16bs_cant_align2 |
23 | |
24 | eor r3, r0, r1 |
25 | tst r3, #2 |
26 | bne mcp16bs_cant_align |
27 | |
28 | tst r0, #2 |
29 | beq mcp16bs_aligned |
30 | ldrh r3, [r1], #2 |
31 | sub r2, r2, #1 |
32 | orr r3, r3, r3, lsl #16 |
33 | mov r3, r3, lsr #8 |
34 | strh r3, [r0], #2 |
35 | |
36 | mcp16bs_aligned: |
37 | stmfd sp!, {r4,lr} |
38 | mov lr, #0xff |
39 | orr lr, lr, lr, lsl #16 |
40 | |
41 | subs r2, r2, #4 |
42 | bmi mcp16bs_fin4 |
43 | |
44 | mcp16bs_loop: |
45 | ldmia r1!, {r3,r12} |
46 | subs r2, r2, #4 |
47 | bswap r3 |
48 | bswap r12 |
49 | stmia r0!, {r3,r12} |
50 | bpl mcp16bs_loop |
51 | |
52 | mcp16bs_fin4: |
53 | tst r2, #2 |
54 | beq mcp16bs_fin2 |
55 | ldr r3, [r1], #4 |
56 | bswap r3 |
57 | str r3, [r0], #4 |
58 | |
59 | mcp16bs_fin2: |
60 | ldmfd sp!, {r4,lr} |
61 | ands r2, r2, #1 |
62 | bxeq lr |
63 | |
64 | mcp16bs_cant_align: |
65 | ldrh r3, [r1], #2 |
66 | subs r2, r2, #1 |
67 | orr r3, r3, r3, lsl #16 |
68 | mov r3, r3, lsr #8 |
69 | strh r3, [r0], #2 |
70 | bne mcp16bs_cant_align |
71 | bx lr |
72 | |
73 | @ worst case |
74 | mcp16bs_cant_align2: |
75 | ldrb r3, [r1], #1 |
76 | ldrb r12,[r1], #1 |
77 | subs r2, r2, #1 |
78 | mov r3, r3, lsl #8 |
79 | orr r3, r3, r12 |
80 | strh r3, [r0], #2 |
81 | bne mcp16bs_cant_align2 |
82 | bx lr |
83 | |
84 | |
fa1e5e29 |
85 | .global memset32 @ int *dest, int c, int count |
86 | |
87 | memset32: |
88 | stmfd sp!, {lr} |
89 | |
90 | mov r3, r1 |
91 | subs r2, r2, #4 |
92 | bmi mst32_fin |
93 | |
94 | mov r12,r1 |
95 | mov lr, r1 |
96 | |
97 | mst32_loop: |
98 | subs r2, r2, #4 |
99 | stmia r0!, {r1,r3,r12,lr} |
100 | bpl mst32_loop |
101 | |
102 | mst32_fin: |
103 | tst r2, #1 |
104 | strne r1, [r0], #4 |
105 | |
106 | tst r2, #2 |
107 | stmneia r0!, {r1,r3} |
108 | |
109 | ldmfd sp!, {lr} |
110 | bx lr |
111 | |
cff531af |
112 | @ vim:filetype=armasm |