5e89f0f5 |
1 | @ vim:filetype=armasm |
2 | |
3 | .equ M68K_MEM_SHIFT, 16 |
4 | |
5 | .global cyclone_checkpc |
6 | .global cyclone_fetch8 |
7 | .global cyclone_fetch16 |
8 | .global cyclone_fetch32 |
9 | .global cyclone_read8 |
10 | .global cyclone_read16 |
11 | .global cyclone_read32 |
12 | .global cyclone_write8 |
13 | .global cyclone_write16 |
14 | .global cyclone_write32 |
15 | |
16 | @ Warning: here we abuse the fact that we are only called |
17 | @ from Cyclone, and assume that r7 contains context pointer. |
18 | cyclone_checkpc: |
19 | ldr r1, [r7, #0x60] @ membase |
20 | sub r0, r0, r1 |
21 | bic r0, r0, #0xff000000 |
22 | bics r0, r0, #1 |
23 | beq crashed |
24 | |
25 | ldr r1, [r7, #0x6c] @ read16 map |
26 | mov r2, r0, lsr #M68K_MEM_SHIFT |
27 | ldr r1, [r1, r2, lsl #2] |
28 | movs r1, r1, lsl #1 |
29 | bcs crashed |
30 | |
31 | str r1, [r7, #0x60] @ membase |
32 | add r0, r0, r1 |
33 | bx lr |
34 | |
35 | crashed: |
36 | stmfd sp!,{lr} |
37 | mov r1, r7 |
38 | bl cyclone_crashed |
39 | ldr r0, [r7, #0x40] @ reload PC + membase |
40 | ldmfd sp!,{pc} |
41 | |
42 | |
43 | cyclone_read8: @ u32 a |
44 | cyclone_fetch8: |
45 | bic r0, r0, #0xff000000 |
46 | ldr r1, [r7, #0x68] @ read8 map |
47 | mov r2, r0, lsr #M68K_MEM_SHIFT |
48 | ldr r1, [r1, r2, lsl #2] |
49 | eor r2, r0, #1 |
50 | movs r1, r1, lsl #1 |
51 | ldrccb r0, [r1, r2] |
52 | bxcc lr |
53 | bx r1 |
54 | |
55 | |
56 | cyclone_read16: @ u32 a |
57 | cyclone_fetch16: |
58 | bic r0, r0, #0xff000000 |
59 | ldr r1, [r7, #0x6c] @ read16 map |
60 | mov r2, r0, lsr #M68K_MEM_SHIFT |
61 | ldr r1, [r1, r2, lsl #2] |
62 | bic r0, r0, #1 |
63 | movs r1, r1, lsl #1 |
64 | ldrcch r0, [r1, r0] |
65 | bxcc lr |
66 | bx r1 |
67 | |
68 | |
69 | cyclone_read32: @ u32 a |
70 | cyclone_fetch32: |
71 | bic r0, r0, #0xff000000 |
72 | ldr r1, [r7, #0x6c] @ read16 map |
73 | mov r2, r0, lsr #M68K_MEM_SHIFT |
74 | ldr r1, [r1, r2, lsl #2] |
75 | bic r0, r0, #1 |
76 | movs r1, r1, lsl #1 |
77 | ldrcch r0, [r1, r0]! |
78 | ldrcch r1, [r1, #2] |
79 | orrcc r0, r1, r0, lsl #16 |
80 | bxcc lr |
81 | |
82 | stmfd sp!,{r0,r1,lr} |
83 | mov lr, pc |
84 | bx r1 |
85 | mov r2, r0, lsl #16 |
86 | ldmia sp, {r0,r1} |
87 | str r2, [sp] |
88 | add r0, r0, #2 |
89 | mov lr, pc |
90 | bx r1 |
91 | ldr r1, [sp] |
92 | mov r0, r0, lsl #16 |
93 | orr r0, r1, r0, lsr #16 |
94 | ldmfd sp!,{r1,r2,pc} |
95 | |
96 | |
97 | cyclone_write8: @ u32 a, u8 d |
98 | bic r0, r0, #0xff000000 |
99 | ldr r2, [r7, #0x74] @ write8 map |
100 | mov r3, r0, lsr #M68K_MEM_SHIFT |
101 | ldr r2, [r2, r3, lsl #2] |
102 | eor r3, r0, #1 |
103 | movs r2, r2, lsl #1 |
104 | strccb r1, [r2, r3] |
105 | bxcc lr |
106 | bx r2 |
107 | |
108 | |
109 | cyclone_write16: @ u32 a, u16 d |
110 | bic r0, r0, #0xff000000 |
111 | ldr r2, [r7, #0x78] @ write16 map |
112 | mov r3, r0, lsr #M68K_MEM_SHIFT |
113 | ldr r2, [r2, r3, lsl #2] |
114 | bic r0, r0, #1 |
115 | movs r2, r2, lsl #1 |
116 | strcch r1, [r2, r0] |
117 | bxcc lr |
118 | bx r2 |
119 | |
120 | |
121 | cyclone_write32: @ u32 a, u32 d |
122 | bic r0, r0, #0xff000000 |
123 | ldr r2, [r7, #0x78] @ write16 map |
124 | mov r3, r0, lsr #M68K_MEM_SHIFT |
125 | ldr r2, [r2, r3, lsl #2] |
126 | bic r0, r0, #1 |
127 | movs r2, r2, lsl #1 |
128 | movcc r3, r1, lsr #16 |
129 | strcch r3, [r2, r0]! |
130 | strcch r1, [r2, #2] |
131 | bxcc lr |
132 | |
133 | stmfd sp!,{r0-r2,lr} |
134 | mov r1, r1, lsr #16 |
135 | mov lr, pc |
136 | bx r2 |
137 | ldmfd sp!,{r0-r2,lr} |
138 | add r0, r0, #2 |
139 | bx r2 |
140 | |