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