platform ps2, handle audio similar to psp
[picodrive.git] / pico / memory_arm.S
CommitLineData
cff531af 1/*\r
2 * PicoDrive\r
3 * (C) notaz, 2006-2009\r
7bf552b5 4 * (C) irixxxx, 2019,2020\r
cff531af 5 *\r
6 * This work is licensed under the terms of MAME license.\r
7 * See COPYING file in the top-level directory.\r
8 */\r
cc68a136 9\r
9760505e 10#include "arm_features.h"\r
d40a5af4 11#include "pico_int_offs.h"\r
88fd63ad 12\r
0ace9b9a 13.equ SRR_MAPPED, (1 << 0)\r
14.equ SRR_READONLY, (1 << 1)\r
15.equ SRF_EEPROM, (1 << 1)\r
db1d3564 16.equ POPT_EN_32X, (1 << 20)\r
cc68a136 17\r
18.text\r
3ec29f01 19.align 4\r
cc68a136 20\r
0ace9b9a 21.global PicoRead8_sram\r
22.global PicoRead8_io\r
23.global PicoRead16_sram\r
24.global PicoRead16_io\r
25.global PicoWrite8_io\r
26.global PicoWrite16_io\r
cc68a136 27\r
9760505e 28 PIC_LDR_INIT()\r
29\r
88fd63ad 30PicoRead8_sram: @ u32 a\r
9760505e 31 PIC_LDR(r3, r1, Pico)\r
88fd63ad 32 ldr r1, [r3, #OFS_Pico_sv_end]\r
cc68a136 33 cmp r0, r1\r
b4db550e 34 bgt m_read8_nosram\r
88fd63ad 35 ldr r2, [r3, #OFS_Pico_sv_start]\r
36 cmp r0, r2\r
cc68a136 37 blt m_read8_nosram\r
88fd63ad 38 ldrb r1, [r3, #OFS_Pico_m_sram_reg]\r
0ace9b9a 39 tst r1, #SRR_MAPPED\r
40 beq m_read8_nosram\r
88fd63ad 41 ldr r1, [r3, #OFS_Pico_sv_flags]\r
0ace9b9a 42 tst r1, #SRF_EEPROM\r
43 bne m_read8_eeprom\r
88fd63ad 44 ldr r1, [r3, #OFS_Pico_sv_data]\r
45 sub r0, r0, r2\r
46 ldrb r0, [r0, r1]\r
0ace9b9a 47 bx lr\r
48\r
cc68a136 49m_read8_nosram:\r
88fd63ad 50 ldr r1, [r3, #OFS_Pico_romsize]\r
cc68a136 51 cmp r0, r1\r
52 movgt r0, #0\r
53 bxgt lr @ bad location\r
0ace9b9a 54 @ XXX: banking unfriendly\r
88fd63ad 55 ldr r1, [r3, #OFS_Pico_rom]\r
cc68a136 56 eor r0, r0, #1\r
57 ldrb r0, [r1, r0]\r
58 bx lr\r
59\r
0ace9b9a 60m_read8_eeprom:\r
61 stmfd sp!,{r0,lr}\r
62 bl EEPROM_read\r
b4db550e 63 ldmfd sp!,{r1,lr}\r
64 tst r1, #1\r
0ace9b9a 65 moveq r0, r0, lsr #8\r
78d817c3 66 and r0, r0, #0xff\r
0ace9b9a 67 bx lr\r
29a95187 68\r
29a95187 69\r
88fd63ad 70PicoRead8_io: @ u32 a\r
0ace9b9a 71 bic r2, r0, #0x001f @ most commonly we get i/o port read,\r
72 cmp r2, #0xa10000 @ so check for it first\r
531a8f38 73 beq io_ports_read\r
e5503e2f 74\r
0ace9b9a 75m_read8_not_io:\r
76 and r2, r0, #0xfc00\r
77 cmp r2, #0x1000\r
93f9619e 78 bne PicoRead8_32x\r
0ace9b9a 79\r
9760505e 80 PIC_LDR(r3, r1, Pico)\r
0ace9b9a 81 mov r1, r0\r
88fd63ad 82 ldr r0, [r3, #OFS_Pico_m_rotate]\r
0ace9b9a 83 add r0, r0, #1\r
88fd63ad 84 strb r0, [r3, #OFS_Pico_m_rotate]\r
0ace9b9a 85 eor r0, r0, r0, lsl #6\r
e5503e2f 86\r
cc68a136 87 tst r1, #1\r
0ace9b9a 88 bxne lr @ odd addr -> open bus\r
89 bic r0, r0, #1 @ bit0 defined in this area\r
90 and r2, r1, #0xff00\r
91 cmp r2, #0x1100\r
92 bxne lr @ not busreq\r
93\r
88fd63ad 94 ldrb r1, [r3, #OFS_Pico_m_z80Run]\r
95 ldrb r2, [r3, #OFS_Pico_m_z80_reset]\r
0ace9b9a 96 orr r0, r0, r1\r
97 orr r0, r0, r2\r
cc68a136 98 bx lr\r
99\r
cc68a136 100@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
101\r
0ace9b9a 102PicoRead16_sram: @ u32 a, u32 d\r
9760505e 103 PIC_LDR(r3, r1, Pico)\r
88fd63ad 104 ldr r1, [r3, #OFS_Pico_sv_end]\r
cc68a136 105 cmp r0, r1\r
b4db550e 106 bgt m_read16_nosram\r
88fd63ad 107 ldr r2, [r3, #OFS_Pico_sv_start]\r
108 cmp r0, r2\r
cc68a136 109 blt m_read16_nosram\r
88fd63ad 110 ldrb r1, [r3, #OFS_Pico_m_sram_reg]\r
0ace9b9a 111 tst r1, #SRR_MAPPED\r
7969166e 112 beq m_read16_nosram\r
88fd63ad 113 ldr r1, [r3, #OFS_Pico_sv_flags]\r
0ace9b9a 114 tst r1, #SRF_EEPROM\r
115 bne EEPROM_read\r
88fd63ad 116 ldr r1, [r3, #OFS_Pico_sv_data]\r
117 sub r0, r0, r2\r
118 ldrb r1, [r0, r1]!\r
119 ldrb r0, [r0, #1]\r
0ace9b9a 120 orr r0, r0, r1, lsl #8\r
121 bx lr\r
122\r
cc68a136 123m_read16_nosram:\r
88fd63ad 124 ldr r1, [r3, #OFS_Pico_romsize]\r
cc68a136 125 cmp r0, r1\r
126 movgt r0, #0\r
127 bxgt lr @ bad location\r
0ace9b9a 128 @ XXX: banking unfriendly\r
88fd63ad 129 ldr r1, [r3, #OFS_Pico_rom]\r
cc68a136 130 ldrh r0, [r1, r0]\r
131 bx lr\r
132\r
cc68a136 133\r
0ace9b9a 134PicoRead16_io: @ u32 a, u32 d\r
135 bic r2, r0, #0x001f @ most commonly we get i/o port read,\r
136 cmp r2, #0xa10000 @ so check for it first\r
137 bne m_read16_not_io\r
1dceadae 138 stmfd sp!,{lr}\r
531a8f38 139 bl io_ports_read @ same as read8\r
0ace9b9a 140 orr r0, r0, r0, lsl #8 @ only has bytes mirrored\r
1dceadae 141 ldmfd sp!,{pc}\r
cc68a136 142\r
0ace9b9a 143m_read16_not_io:\r
144 and r2, r0, #0xfc00\r
145 cmp r2, #0x1000\r
93f9619e 146 bne PicoRead16_32x\r
cc68a136 147\r
9760505e 148 PIC_LDR(r3, r2, Pico)\r
0ace9b9a 149 and r2, r0, #0xff00\r
88fd63ad 150 ldr r0, [r3, #OFS_Pico_m_rotate]\r
0ace9b9a 151 add r0, r0, #1\r
88fd63ad 152 strb r0, [r3, #OFS_Pico_m_rotate]\r
0ace9b9a 153 eor r0, r0, r0, lsl #5\r
154 eor r0, r0, r0, lsl #8\r
155 bic r0, r0, #0x100 @ bit8 defined in this area\r
156 cmp r2, #0x1100\r
157 bxne lr @ not busreq\r
158\r
88fd63ad 159 ldrb r1, [r3, #OFS_Pico_m_z80Run]\r
160 ldrb r2, [r3, #OFS_Pico_m_z80_reset]\r
0ace9b9a 161 orr r0, r0, r1, lsl #8\r
162 orr r0, r0, r2, lsl #8\r
cc68a136 163 bx lr\r
164\r
e5503e2f 165@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
166\r
0ace9b9a 167PicoWrite8_io: @ u32 a, u32 d\r
168 bic r2, r0, #0x1e @ most commonly we get i/o port write,\r
169 eor r2, r2, #0xa10000 @ so check for it first\r
170 eors r2, r2, #1\r
531a8f38 171 beq io_ports_write\r
e5503e2f 172\r
0ace9b9a 173m_write8_not_io:\r
174 tst r0, #1\r
175 bne m_write8_not_z80ctl @ even addrs only\r
176 and r2, r0, #0xff00\r
177 cmp r2, #0x1100\r
178 moveq r0, r1\r
179 beq ctl_write_z80busreq\r
180 cmp r2, #0x1200\r
181 moveq r0, r1\r
182 beq ctl_write_z80reset\r
183\r
184m_write8_not_z80ctl:\r
185 @ unlikely\r
186 eor r2, r0, #0xa10000\r
187 eor r2, r2, #0x003000\r
188 eors r2, r2, #0x0000f1\r
93f9619e 189 bne PicoWrite8_32x\r
9760505e 190 PIC_LDR(r3, r2, Pico)\r
88fd63ad 191 ldrb r2, [r3, #OFS_Pico_m_sram_reg]\r
0ace9b9a 192 and r1, r1, #(SRR_MAPPED|SRR_READONLY)\r
193 bic r2, r2, #(SRR_MAPPED|SRR_READONLY)\r
194 orr r2, r2, r1\r
88fd63ad 195 strb r2, [r3, #OFS_Pico_m_sram_reg]\r
e5503e2f 196 bx lr\r
197\r
0ace9b9a 198@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
e5503e2f 199\r
0ace9b9a 200PicoWrite16_io: @ u32 a, u32 d\r
201 bic r2, r0, #0x1f @ most commonly we get i/o port write,\r
202 cmp r2, #0xa10000 @ so check for it first\r
531a8f38 203 beq io_ports_write\r
0ace9b9a 204\r
205m_write16_not_io:\r
206 and r2, r0, #0xff00\r
207 cmp r2, #0x1100\r
208 moveq r0, r1, lsr #8\r
209 beq ctl_write_z80busreq\r
210 cmp r2, #0x1200\r
211 moveq r0, r1, lsr #8\r
212 beq ctl_write_z80reset\r
213\r
214m_write16_not_z80ctl:\r
215 @ unlikely\r
216 eor r2, r0, #0xa10000\r
217 eor r2, r2, #0x003000\r
218 eors r2, r2, #0x0000f0\r
93f9619e 219 bne PicoWrite16_32x\r
9760505e 220 PIC_LDR(r3, r2, Pico)\r
88fd63ad 221 ldrb r2, [r3, #OFS_Pico_m_sram_reg]\r
0ace9b9a 222 and r1, r1, #(SRR_MAPPED|SRR_READONLY)\r
223 bic r2, r2, #(SRR_MAPPED|SRR_READONLY)\r
224 orr r2, r2, r1\r
88fd63ad 225 strb r2, [r3, #OFS_Pico_m_sram_reg]\r
0ace9b9a 226 bx lr\r
e5503e2f 227\r
78d817c3 228.global m68k_read8\r
229.global m68k_read16\r
82b3e6cf 230.global m68k_read32\r
78d817c3 231.global m68k_write8\r
232.global m68k_write16\r
82b3e6cf 233.global m68k_write32\r
78d817c3 234\r
235m68k_read8:\r
9760505e 236 PIC_LDR(r3, r2, m68k_read8_map)\r
78d817c3 237 bic r0, r0, #0xff000000\r
238 mov r2, r0, lsr #16\r
239 ldr r3, [r3, r2, lsl #2]\r
240 eor r2, r0, #1\r
241 movs r3, r3, lsl #1\r
242 ldrccb r0, [r3, r2]\r
243 bxcc lr\r
244 bx r3\r
245\r
246m68k_read16:\r
9760505e 247 PIC_LDR(r3, r2, m68k_read16_map)\r
78d817c3 248 bic r0, r0, #0xff000000\r
249 mov r2, r0, lsr #16\r
250 ldr r3, [r3, r2, lsl #2]\r
251 bic r0, r0, #1\r
252 movs r3, r3, lsl #1\r
253 ldrcch r0, [r3, r0]\r
254 bxcc lr\r
255 bx r3\r
256\r
257m68k_read32:\r
9760505e 258 PIC_LDR(r3, r2, m68k_read16_map)\r
78d817c3 259 bic r0, r0, #0xff000000\r
260 mov r2, r0, lsr #16\r
261 ldr r3, [r3, r2, lsl #2]\r
262 bic r0, r0, #1\r
263 movs r3, r3, lsl #1\r
264 ldrcch r1, [r3, r0]!\r
265 ldrcch r0, [r3, #2]\r
266 orrcc r0, r0, r1, lsl #16\r
267 bxcc lr\r
268\r
269 stmfd sp!, {r0, r3, r4, lr}\r
270 mov lr, pc\r
271 bx r3\r
272 ldmfd sp!, {r1, r3}\r
273 str r0, [sp]\r
274 add r0, r1, #2\r
275 mov lr, pc\r
276 bx r3\r
277 ldmfd sp!, {r1, lr}\r
278 mov r0, r0, lsl #16\r
279 mov r1, r1, lsl #16\r
280 orr r0, r1, r0, lsr #16\r
281 bx lr\r
282\r
283m68k_write8:\r
9760505e 284 PIC_LDR(r3, r2, m68k_write8_map)\r
78d817c3 285 bic r0, r0, #0xff000000\r
286 mov r2, r0, lsr #16\r
287 ldr r3, [r3, r2, lsl #2]\r
288 eor r2, r0, #1\r
289 movs r3, r3, lsl #1\r
290 strccb r1, [r3, r2]\r
291 bxcc lr\r
292 bx r3\r
293\r
294m68k_write16:\r
9760505e 295 PIC_LDR(r3, r2, m68k_write16_map)\r
78d817c3 296 bic r0, r0, #0xff000000\r
297 mov r2, r0, lsr #16\r
298 ldr r3, [r3, r2, lsl #2]\r
299 bic r0, r0, #1\r
300 movs r3, r3, lsl #1\r
301 strcch r1, [r3, r0]\r
302 bxcc lr\r
303 bx r3\r
304\r
305m68k_write32:\r
9760505e 306 PIC_LDR(r3, r2, m68k_write16_map)\r
78d817c3 307 bic r0, r0, #0xff000000\r
308 mov r2, r0, lsr #16\r
309 ldr r3, [r3, r2, lsl #2]\r
310 bic r0, r0, #1\r
311 movs r3, r3, lsl #1\r
312 movcc r2, r1, lsr #16\r
313 strcch r2, [r3, r0]!\r
314 strcch r1, [r3, #2]\r
315 bxcc lr\r
316\r
317 stmfd sp!, {r0, r1, r3, lr}\r
318 mov r1, r1, lsr #16\r
319 mov lr, pc\r
320 bx r3\r
321 ldmfd sp!, {r0, r1, r3, lr}\r
322 add r0, r0, #2\r
323 bx r3\r
324\r
0ace9b9a 325.pool\r
e5503e2f 326\r
cff531af 327@ vim:filetype=armasm\r