removed z80 cycle code in nonacc mode as it was only causing trouble
[picodrive.git] / Pico / Memory.s
CommitLineData
4ff2d527 1@ vim:filetype=armasm\r
2\r
cc68a136 3@ memory handlers with banking support for SSF II - The New Challengers\r
4@ mostly based on Gens code\r
5\r
6cadc2da 6@ (c) Copyright 2006-2007, Grazvydas "notaz" Ignotas\r
cc68a136 7@ All Rights Reserved\r
8\r
9\r
e5503e2f 10.include "port_config.s"\r
cc68a136 11\r
12.text\r
13\r
14@ default jump tables\r
15\r
16m_read8_def_table:\r
17 .long m_read8_rom0 @ 0x000000 - 0x07FFFF\r
18 .long m_read8_rom1 @ 0x080000 - 0x0FFFFF\r
19 .long m_read8_rom2 @ 0x100000 - 0x17FFFF\r
20 .long m_read8_rom3 @ 0x180000 - 0x1FFFFF\r
21 .long m_read8_rom4 @ 0x200000 - 0x27FFFF\r
22 .long m_read8_rom5 @ 0x280000 - 0x2FFFFF\r
23 .long m_read8_rom6 @ 0x300000 - 0x37FFFF\r
24 .long m_read8_rom7 @ 0x380000 - 0x3FFFFF\r
29a95187 25 .long m_read8_rom8 @ 0x400000 - 0x47FFFF - for all those large ROM hacks\r
cc68a136 26 .long m_read8_rom9 @ 0x480000 - 0x4FFFFF\r
27 .long m_read8_romA @ 0x500000 - 0x57FFFF\r
28 .long m_read8_romB @ 0x580000 - 0x5FFFFF\r
29 .long m_read8_romC @ 0x600000 - 0x67FFFF\r
30 .long m_read8_romD @ 0x680000 - 0x6FFFFF\r
31 .long m_read8_romE @ 0x700000 - 0x77FFFF\r
32 .long m_read8_romF @ 0x780000 - 0x7FFFFF\r
29a95187 33 .long m_read8_rom10 @ 0x800000 - 0x87FFFF\r
34 .long m_read8_rom11 @ 0x880000 - 0x8FFFFF\r
35 .long m_read8_rom12 @ 0x900000 - 0x97FFFF\r
36 .long m_read8_rom13 @ 0x980000 - 0x9FFFFF\r
cc68a136 37 .long m_read8_misc @ 0xA00000 - 0xA7FFFF\r
38 .long m_read_null @ 0xA80000 - 0xAFFFFF\r
39 .long m_read_null @ 0xB00000 - 0xB7FFFF\r
40 .long m_read_null @ 0xB80000 - 0xBFFFFF\r
41 .long m_read8_vdp @ 0xC00000 - 0xC7FFFF\r
42 .long m_read8_vdp @ 0xC80000 - 0xCFFFFF\r
43 .long m_read_null @ 0xD00000 - 0xD7FFFF\r
44 .long m_read_null @ 0xD80000 - 0xDFFFFF\r
45 .long m_read8_ram @ 0xE00000 - 0xE7FFFF\r
46 .long m_read8_ram @ 0xE80000 - 0xEFFFFF\r
47 .long m_read8_ram @ 0xF00000 - 0xF7FFFF\r
48 .long m_read8_ram @ 0xF80000 - 0xFFFFFF\r
49\r
50m_read16_def_table:\r
51 .long m_read16_rom0 @ 0x000000 - 0x07FFFF\r
52 .long m_read16_rom1 @ 0x080000 - 0x0FFFFF\r
53 .long m_read16_rom2 @ 0x100000 - 0x17FFFF\r
54 .long m_read16_rom3 @ 0x180000 - 0x1FFFFF\r
55 .long m_read16_rom4 @ 0x200000 - 0x27FFFF\r
56 .long m_read16_rom5 @ 0x280000 - 0x2FFFFF\r
57 .long m_read16_rom6 @ 0x300000 - 0x37FFFF\r
58 .long m_read16_rom7 @ 0x380000 - 0x3FFFFF\r
59 .long m_read16_rom8 @ 0x400000 - 0x47FFFF\r
60 .long m_read16_rom9 @ 0x480000 - 0x4FFFFF\r
61 .long m_read16_romA @ 0x500000 - 0x57FFFF\r
62 .long m_read16_romB @ 0x580000 - 0x5FFFFF\r
63 .long m_read16_romC @ 0x600000 - 0x67FFFF\r
64 .long m_read16_romD @ 0x680000 - 0x6FFFFF\r
65 .long m_read16_romE @ 0x700000 - 0x77FFFF\r
66 .long m_read16_romF @ 0x780000 - 0x7FFFFF\r
29a95187 67 .long m_read16_rom10 @ 0x800000 - 0x87FFFF\r
68 .long m_read16_rom11 @ 0x880000 - 0x8FFFFF\r
69 .long m_read16_rom12 @ 0x900000 - 0x97FFFF\r
70 .long m_read16_rom13 @ 0x980000 - 0x9FFFFF\r
cc68a136 71 .long m_read16_misc @ 0xA00000 - 0xA7FFFF\r
72 .long m_read_null @ 0xA80000 - 0xAFFFFF\r
73 .long m_read_null @ 0xB00000 - 0xB7FFFF\r
74 .long m_read_null @ 0xB80000 - 0xBFFFFF\r
75 .long m_read16_vdp @ 0xC00000 - 0xC7FFFF\r
76 .long m_read_null @ 0xC80000 - 0xCFFFFF\r
77 .long m_read_null @ 0xD00000 - 0xD7FFFF\r
78 .long m_read_null @ 0xD80000 - 0xDFFFFF\r
79 .long m_read16_ram @ 0xE00000 - 0xE7FFFF\r
80 .long m_read16_ram @ 0xE80000 - 0xEFFFFF\r
81 .long m_read16_ram @ 0xF00000 - 0xF7FFFF\r
82 .long m_read16_ram @ 0xF80000 - 0xFFFFFF\r
83\r
84m_read32_def_table:\r
85 .long m_read32_rom0 @ 0x000000 - 0x07FFFF\r
86 .long m_read32_rom1 @ 0x080000 - 0x0FFFFF\r
87 .long m_read32_rom2 @ 0x100000 - 0x17FFFF\r
88 .long m_read32_rom3 @ 0x180000 - 0x1FFFFF\r
89 .long m_read32_rom4 @ 0x200000 - 0x27FFFF\r
90 .long m_read32_rom5 @ 0x280000 - 0x2FFFFF\r
91 .long m_read32_rom6 @ 0x300000 - 0x37FFFF\r
92 .long m_read32_rom7 @ 0x380000 - 0x3FFFFF\r
93 .long m_read32_rom8 @ 0x400000 - 0x47FFFF\r
94 .long m_read32_rom9 @ 0x480000 - 0x4FFFFF\r
95 .long m_read32_romA @ 0x500000 - 0x57FFFF\r
96 .long m_read32_romB @ 0x580000 - 0x5FFFFF\r
97 .long m_read32_romC @ 0x600000 - 0x67FFFF\r
98 .long m_read32_romD @ 0x680000 - 0x6FFFFF\r
99 .long m_read32_romE @ 0x700000 - 0x77FFFF\r
100 .long m_read32_romF @ 0x780000 - 0x7FFFFF\r
29a95187 101 .long m_read32_rom10 @ 0x800000 - 0x87FFFF\r
102 .long m_read32_rom11 @ 0x880000 - 0x8FFFFF\r
103 .long m_read32_rom12 @ 0x900000 - 0x97FFFF\r
104 .long m_read32_rom13 @ 0x980000 - 0x9FFFFF\r
cc68a136 105 .long m_read32_misc @ 0xA00000 - 0xA7FFFF\r
106 .long m_read_null @ 0xA80000 - 0xAFFFFF\r
107 .long m_read_null @ 0xB00000 - 0xB7FFFF\r
108 .long m_read_null @ 0xB80000 - 0xBFFFFF\r
109 .long m_read32_vdp @ 0xC00000 - 0xC7FFFF\r
110 .long m_read_null @ 0xC80000 - 0xCFFFFF\r
111 .long m_read_null @ 0xD00000 - 0xD7FFFF\r
112 .long m_read_null @ 0xD80000 - 0xDFFFFF\r
113 .long m_read32_ram @ 0xE00000 - 0xE7FFFF\r
114 .long m_read32_ram @ 0xE80000 - 0xEFFFFF\r
115 .long m_read32_ram @ 0xF00000 - 0xF7FFFF\r
116 .long m_read32_ram @ 0xF80000 - 0xFFFFFF\r
117\r
118\r
119@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
120\r
121.bss\r
122@.section .bss, "brw"\r
123@.data\r
124\r
125@ used tables\r
126m_read8_table:\r
127 .skip 32*4\r
128\r
129m_read16_table:\r
130 .skip 32*4\r
131\r
132m_read32_table:\r
133 .skip 32*4\r
134\r
135\r
136@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
137\r
138.text\r
139\r
140.global PicoMemReset\r
141.global PicoRead8\r
142.global PicoRead16\r
143.global PicoRead32\r
e5503e2f 144.global PicoWrite8\r
cc68a136 145.global PicoWriteRomHW_SSF2\r
e5503e2f 146.global m_m68k_read8_misc\r
147.global m_m68k_write8_misc\r
cc68a136 148\r
149\r
150PicoMemReset:\r
151 ldr r12,=(Pico+0x22204)\r
152 ldr r12,[r12] @ romsize\r
153 add r12,r12,#0x80000\r
154 sub r12,r12,#1\r
155 mov r12,r12,lsr #19\r
156\r
157 ldr r0, =m_read8_table\r
158 ldr r1, =m_read8_def_table\r
159 mov r2, #32\r
1601:\r
161 ldr r3, [r1], #4\r
162 str r3, [r0], #4\r
163 subs r2, r2, #1\r
164 bne 1b\r
165\r
166 ldr r0, =m_read16_table\r
167 ldr r1, =m_read16_def_table\r
168 mov r2, #32\r
1691:\r
170 subs r2, r2, #1\r
171 ldr r3, [r1], #4\r
172 str r3, [r0], #4\r
173 bne 1b\r
174\r
175 ldr r0, =m_read32_table\r
176 ldr r1, =m_read32_def_table\r
177 mov r2, #32\r
1781:\r
179 subs r2, r2, #1\r
180 ldr r3, [r1], #4\r
181 str r3, [r0], #4\r
182 bne 1b\r
183\r
184 @ update memhandlers according to ROM size\r
185 ldr r1, =m_read8_above_rom\r
186 ldr r0, =m_read8_table\r
187 mov r2, #16\r
1881:\r
189 sub r2, r2, #1\r
190 cmp r2, r12\r
191 blt 2f\r
192 cmp r2, #4\r
193 beq 1b @ do not touch the SRAM area\r
194 str r1, [r0, r2, lsl #2]\r
195 b 1b\r
1962:\r
197 ldr r1, =m_read16_above_rom\r
198 ldr r0, =m_read16_table\r
199 mov r2, #16\r
2001:\r
201 sub r2, r2, #1\r
202 cmp r2, r12\r
203 blt 2f\r
204 cmp r2, #4\r
205 beq 1b\r
206 str r1, [r0, r2, lsl #2]\r
207 b 1b\r
2082:\r
209 ldr r1, =m_read32_above_rom\r
210 ldr r0, =m_read32_table\r
211 mov r2, #16\r
2121:\r
213 sub r2, r2, #1\r
214 cmp r2, r12\r
215 blt 2f\r
216 cmp r2, #4\r
217 beq 1b\r
218 str r1, [r0, r2, lsl #2]\r
219 b 1b\r
2202:\r
221 bx lr\r
222\r
223.pool\r
224\r
225@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
226\r
227PicoRead8: @ u32 a\r
228 ldr r2, =m_read8_table\r
229 bic r0, r0, #0xff000000\r
230 and r1, r0, #0x00f80000\r
231 ldr pc, [r2, r1, lsr #17]\r
232\r
233PicoRead16: @ u32 a\r
234 ldr r2, =m_read16_table\r
235 bic r0, r0, #0xff000000\r
236 and r1, r0, #0x00f80000\r
237 ldr pc, [r2, r1, lsr #17]\r
238\r
239PicoRead32: @ u32 a\r
240 ldr r2, =m_read32_table\r
241 bic r0, r0, #0xff000000\r
242 and r1, r0, #0x00f80000\r
243 ldr pc, [r2, r1, lsr #17]\r
244\r
245.pool\r
246\r
247@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
248\r
249m_read_null:\r
250 mov r0, #0\r
251 bx lr\r
252\r
253\r
254.macro m_read8_rom sect\r
255 ldr r1, =(Pico+0x22200)\r
256 bic r0, r0, #0xf80000\r
257 ldr r1, [r1]\r
258.if \sect\r
259 orr r0, r0, #0x080000*\sect\r
260.endif\r
261 eor r0, r0, #1\r
262 ldrb r0, [r1, r0]\r
263 bx lr\r
264.endm\r
265\r
266\r
267m_read8_rom0: @ 0x000000 - 0x07ffff\r
268 m_read8_rom 0\r
269\r
270m_read8_rom1: @ 0x080000 - 0x0fffff\r
271 m_read8_rom 1\r
272\r
273m_read8_rom2: @ 0x100000 - 0x17ffff\r
274 m_read8_rom 2\r
275\r
276m_read8_rom3: @ 0x180000 - 0x1fffff\r
277 m_read8_rom 3\r
278\r
279m_read8_rom4: @ 0x200000 - 0x27ffff, SRAM area\r
280 ldr r2, =(SRam)\r
281 ldr r3, =(Pico+0x22200)\r
282 ldr r1, [r2, #8] @ SRam.end\r
283 bic r0, r0, #0xf80000\r
284 orr r0, r0, #0x200000\r
285 cmp r0, r1\r
286 bgt m_read8_nosram\r
287 ldr r1, [r2, #4] @ SRam.start (1ci)\r
288 cmp r0, r1\r
289 blt m_read8_nosram\r
290 ldrb r1, [r3, #0x11] @ Pico.m.sram_reg (1ci)\r
291 sub r12,r0, #0x200000\r
292 tst r1, #0x10\r
293 bne m_read8_detected\r
294 cmp r12,#1\r
295 ble m_read8_detected\r
296 tst r1, #1\r
297 orrne r1, r1, #0x10\r
298 strneb r1, [r3, #0x11]\r
299m_read8_detected:\r
300 tst r1, #4 @ EEPROM read?\r
bf537655 301 bne SRAMReadEEPROM\r
cc68a136 302m_read8_noteeprom:\r
303 tst r1, #1\r
304 beq m_read8_nosram\r
305 ldr r3, [r2] @ SRam.data\r
306 ldr r2, [r2, #4] @ SRam.start (1ci)\r
307 sub r3, r3, r2\r
308 ldrb r0, [r3, r0]\r
309 bx lr\r
310m_read8_nosram:\r
311 ldr r1, [r3, #4] @ 1ci\r
312 cmp r0, r1\r
313 movgt r0, #0\r
314 bxgt lr @ bad location\r
315 ldr r1, [r3]\r
316 eor r0, r0, #1\r
317 ldrb r0, [r1, r0]\r
318 bx lr\r
319\r
320m_read8_rom5: @ 0x280000 - 0x2fffff\r
321 m_read8_rom 5\r
322\r
323m_read8_rom6: @ 0x300000 - 0x37ffff\r
324 m_read8_rom 6\r
325\r
326m_read8_rom7: @ 0x380000 - 0x3fffff\r
327 m_read8_rom 7\r
328\r
329m_read8_rom8: @ 0x400000 - 0x47ffff\r
330 m_read8_rom 8\r
331\r
332m_read8_rom9: @ 0x480000 - 0x4fffff\r
333 m_read8_rom 9\r
334\r
cc68a136 335m_read8_romA: @ 0x500000 - 0x57ffff\r
336 m_read8_rom 0xA\r
337\r
338m_read8_romB: @ 0x580000 - 0x5fffff\r
339 m_read8_rom 0xB\r
340\r
341m_read8_romC: @ 0x600000 - 0x67ffff\r
342 m_read8_rom 0xC\r
343\r
344m_read8_romD: @ 0x680000 - 0x6fffff\r
345 m_read8_rom 0xD\r
346\r
347m_read8_romE: @ 0x700000 - 0x77ffff\r
348 m_read8_rom 0xE\r
349\r
350m_read8_romF: @ 0x780000 - 0x7fffff\r
351 m_read8_rom 0xF\r
352\r
29a95187 353m_read8_rom10: @ 0x800000 - 0x87ffff\r
354 m_read8_rom 0x10\r
355\r
356m_read8_rom11: @ 0x880000 - 0x8fffff\r
357 m_read8_rom 0x11\r
358\r
359m_read8_rom12: @ 0x900000 - 0x97ffff\r
360 m_read8_rom 0x12\r
361\r
362m_read8_rom13: @ 0x980000 - 0x9fffff\r
363 m_read8_rom 0x13\r
364\r
e5503e2f 365\r
366m_m68k_read8_misc:\r
cc68a136 367m_read8_misc:\r
e5503e2f 368 bic r2, r0, #0x001f @ most commonly we get i/o port read,\r
369 cmp r2, #0xa10000 @ so check for it first\r
370 bne m_read8_misc2\r
371m_read8_misc_io:\r
372 ands r0, r0, #0x1e\r
373 beq m_read8_misc_hwreg\r
374 cmp r0, #4\r
e5503e2f 375 movlt r0, #0\r
376 moveq r0, #1\r
bf537655 377 ble PadRead\r
e5503e2f 378 ldr r3, =(Pico+0x22000)\r
379 mov r0, r0, lsr #1 @ other IO ports (Pico.ioports[a])\r
380 ldrb r0, [r3, r0]\r
381 bx lr\r
382\r
383m_read8_misc_hwreg:\r
384 ldr r3, =(Pico+0x22200)\r
385 ldrb r0, [r3, #0x0f] @ Pico.m.hardware\r
386 bx lr\r
387\r
388m_read8_misc2:\r
389 mov r2, #0xa10000 @ games also like to poll busreq,\r
390 orr r2, r2, #0x001100 @ so we'll try it now\r
391 cmp r0, r2\r
bf537655 392 beq z80ReadBusReq\r
e5503e2f 393\r
394 and r2, r0, #0xff0000 @ finally it might be\r
395 cmp r2, #0xa00000 @ z80 area\r
396 bne m_read8_misc3\r
397 tst r0, #0x4000\r
bf537655 398 beq z80Read8 @ z80 RAM\r
e5503e2f 399 and r2, r0, #0x6000\r
400 cmp r2, #0x4000\r
401 mvnne r0, #0\r
402 bxne lr @ invalid\r
403.if EXTERNAL_YM2612\r
404 ldr r1, =PicoOpt\r
405 ldr r1, [r1]\r
406 tst r1, #1\r
407 beq m_read8_fake_ym2612\r
408 tst r1, #0x200\r
bf537655 409 beq YM2612Read_\r
410 b YM2612Read_940\r
e5503e2f 411.else\r
bf537655 412 b YM2612Read_\r
e5503e2f 413.endif\r
e5503e2f 414\r
415m_read8_fake_ym2612:\r
416 ldr r3, =(Pico+0x22200)\r
417 ldrb r0, [r3, #8] @ Pico.m.rotate\r
418 add r1, r0, #1\r
419 strb r1, [r3, #8]\r
420 and r0, r0, #3\r
421 bx lr\r
422\r
423m_read8_misc3:\r
424 @ if everything else fails, use generic handler\r
cc68a136 425 stmfd sp!,{r0,lr}\r
426 bic r0, r0, #1\r
427 mov r1, #8\r
428 bl OtherRead16\r
429 ldmfd sp!,{r1,lr}\r
430 tst r1, #1\r
431 moveq r0, r0, lsr #8\r
432 bx lr\r
433\r
e5503e2f 434\r
cc68a136 435m_read8_vdp:\r
436 tst r0, #0x70000\r
437 tsteq r0, #0x000e0\r
438 bxne lr @ invalid read\r
439 stmfd sp!,{r0,lr}\r
440 bic r0, r0, #1\r
441 bl PicoVideoRead\r
442 ldmfd sp!,{r1,lr}\r
443 tst r1, #1\r
444 moveq r0, r0, lsr #8\r
445 bx lr\r
446\r
447m_read8_ram:\r
448 ldr r1, =Pico\r
449 bic r0, r0, #0xff0000\r
450 eor r0, r0, #1\r
451 ldrb r0, [r1, r0]\r
452 bx lr\r
453\r
454m_read8_above_rom:\r
455 stmfd sp!,{r0,lr}\r
456 bic r0, r0, #1\r
457 mov r1, #8\r
66fdc0f0 458 bl OtherRead16End\r
cc68a136 459 ldmfd sp!,{r1,lr}\r
460 tst r1, #1\r
461 moveq r0, r0, lsr #8\r
462 bx lr\r
463\r
464.pool\r
465\r
466@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
467\r
468.macro m_read16_rom sect\r
469 ldr r1, =(Pico+0x22200)\r
470 bic r0, r0, #0xf80000\r
471 ldr r1, [r1]\r
472 bic r0, r0, #1\r
473.if \sect\r
474 orr r0, r0, #0x080000*\sect\r
475.endif\r
476 ldrh r0, [r1, r0]\r
477 bx lr\r
478.endm\r
479\r
480\r
481m_read16_rom0: @ 0x000000 - 0x07ffff\r
482 m_read16_rom 0\r
483\r
484m_read16_rom1: @ 0x080000 - 0x0fffff\r
485 m_read16_rom 1\r
486\r
487m_read16_rom2: @ 0x100000 - 0x17ffff\r
488 m_read16_rom 2\r
489\r
490m_read16_rom3: @ 0x180000 - 0x1fffff\r
491 m_read16_rom 3\r
492\r
493m_read16_rom4: @ 0x200000 - 0x27ffff, SRAM area (NBA Live 95)\r
494 ldr r2, =(SRam)\r
495 ldr r3, =(Pico+0x22200)\r
496 ldr r1, [r2, #8] @ SRam.end\r
497 bic r0, r0, #0xf80000\r
498 bic r0, r0, #1\r
499 orr r0, r0, #0x200000\r
500 cmp r0, r1\r
501 bgt m_read16_nosram\r
502 ldrb r1, [r3, #0x11] @ Pico.m.sram_reg (2ci)\r
503 tst r1, #1\r
504 beq m_read16_nosram\r
505 ldr r1, [r2, #4] @ SRam.start (1ci)\r
506 cmp r0, r1\r
507 blt m_read16_nosram\r
508 ldr r2, [r2] @ SRam.data (1ci)\r
509 sub r2, r2, r1\r
510 ldrh r0, [r2, r0] @ 2ci\r
511 and r1, r0, #0xff\r
512 mov r0, r0, lsr #8\r
513 orr r0, r0, r1, lsl #8\r
514 bx lr\r
721cd396 515\r
cc68a136 516m_read16_nosram:\r
517 ldr r1, [r3, #4] @ 1ci\r
518 cmp r0, r1\r
519 movgt r0, #0\r
520 bxgt lr @ bad location\r
521 ldr r1, [r3] @ 1ci\r
522 ldrh r0, [r1, r0]\r
523 bx lr\r
524\r
525m_read16_rom5: @ 0x280000 - 0x2fffff\r
526 m_read16_rom 5\r
527\r
528m_read16_rom6: @ 0x300000 - 0x37ffff\r
529 m_read16_rom 6\r
530\r
531m_read16_rom7: @ 0x380000 - 0x3fffff\r
532 m_read16_rom 7\r
533\r
534m_read16_rom8: @ 0x400000 - 0x47ffff\r
535 m_read16_rom 8\r
536\r
537m_read16_rom9: @ 0x480000 - 0x4fffff\r
538 m_read16_rom 9\r
539\r
cc68a136 540m_read16_romA: @ 0x500000 - 0x57ffff\r
541 m_read16_rom 0xA\r
542\r
543m_read16_romB: @ 0x580000 - 0x5fffff\r
544 m_read16_rom 0xB\r
545\r
546m_read16_romC: @ 0x600000 - 0x67ffff\r
547 m_read16_rom 0xC\r
548\r
549m_read16_romD: @ 0x680000 - 0x6fffff\r
550 m_read16_rom 0xD\r
551\r
552m_read16_romE: @ 0x700000 - 0x77ffff\r
553 m_read16_rom 0xE\r
554\r
555m_read16_romF: @ 0x780000 - 0x7fffff\r
556 m_read16_rom 0xF\r
557\r
29a95187 558m_read16_rom10: @ 0x800000 - 0x87ffff\r
559 m_read16_rom 0x10\r
560\r
561m_read16_rom11: @ 0x880000 - 0x8fffff\r
562 m_read16_rom 0x11\r
563\r
564m_read16_rom12: @ 0x900000 - 0x97ffff\r
565 m_read16_rom 0x12\r
566\r
567m_read16_rom13: @ 0x980000 - 0x9fffff\r
568 m_read16_rom 0x13\r
569\r
cc68a136 570m_read16_misc:\r
cc68a136 571 bic r0, r0, #1\r
4ff2d527 572 mov r1, #16\r
573 b OtherRead16\r
cc68a136 574\r
575m_read16_vdp:\r
576 tst r0, #0x70000\r
577 tsteq r0, #0x000e0\r
578 bxne lr @ invalid read\r
cc68a136 579 bic r0, r0, #1\r
4ff2d527 580 b PicoVideoRead\r
cc68a136 581\r
582m_read16_ram:\r
583 ldr r1, =Pico\r
584 bic r0, r0, #0xff0000\r
585 bic r0, r0, #1\r
586 ldrh r0, [r1, r0]\r
587 bx lr\r
588\r
589m_read16_above_rom:\r
cc68a136 590 bic r0, r0, #1\r
4ff2d527 591 mov r1, #16\r
592 b OtherRead16End\r
cc68a136 593\r
594.pool\r
595\r
596@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
597\r
598.macro m_read32_rom sect\r
599 ldr r1, =(Pico+0x22200)\r
600 bic r0, r0, #0xf80000\r
601 ldr r1, [r1]\r
602 bic r0, r0, #1\r
603.if \sect\r
604 orr r0, r0, #0x080000*\sect\r
605.endif\r
606 ldrh r0, [r1, r0]!\r
607 ldrh r1, [r1, #2] @ 1ci\r
608 orr r0, r1, r0, lsl #16\r
609 bx lr\r
610.endm\r
611\r
612\r
613m_read32_rom0: @ 0x000000 - 0x07ffff\r
614 m_read32_rom 0\r
615\r
616m_read32_rom1: @ 0x080000 - 0x0fffff\r
617 m_read32_rom 1\r
618\r
619m_read32_rom2: @ 0x100000 - 0x17ffff\r
620 m_read32_rom 2\r
621\r
622m_read32_rom3: @ 0x180000 - 0x1fffff\r
623 m_read32_rom 3\r
624\r
625m_read32_rom4: @ 0x200000 - 0x27ffff, SRAM area (does any game do long reads?)\r
626 ldr r2, =(SRam)\r
627 ldr r3, =(Pico+0x22200)\r
628 ldr r1, [r2, #8] @ SRam.end\r
629 bic r0, r0, #0xf80000\r
630 bic r0, r0, #1\r
631 orr r0, r0, #0x200000\r
632 cmp r0, r1\r
633 bgt m_read32_nosram\r
634 ldrb r1, [r3, #0x11] @ Pico.m.sram_reg (2ci)\r
635 tst r1, #1\r
636 beq m_read32_nosram\r
637 ldr r1, [r2, #4] @ SRam.start (1ci)\r
638 cmp r0, r1\r
639 blt m_read32_nosram\r
640 ldr r2, [r2] @ SRam.data (1ci)\r
641 sub r2, r2, r1\r
642 ldrh r0, [r2, r0]! @ (1ci)\r
643 ldrh r1, [r2, #2]\r
644 orr r0, r0, r0, lsl #16\r
645 mov r0, r0, ror #8\r
646 mov r0, r0, lsl #16\r
647 orr r0, r0, r1, lsr #8\r
648 and r1, r1, #0xff\r
649 orr r0, r0, r1, lsl #8\r
650 bx lr\r
721cd396 651\r
cc68a136 652m_read32_nosram:\r
653 ldr r1, [r3, #4] @ (1ci)\r
654 cmp r0, r1\r
655 movgt r0, #0\r
656 bxgt lr @ bad location\r
657 ldr r1, [r3] @ (1ci)\r
658 ldrh r0, [r1, r0]!\r
659 ldrh r1, [r1, #2] @ (2ci)\r
660 orr r0, r1, r0, lsl #16\r
661 bx lr\r
662\r
663m_read32_rom5: @ 0x280000 - 0x2fffff\r
664 m_read32_rom 5\r
665\r
666m_read32_rom6: @ 0x300000 - 0x37ffff\r
667 m_read32_rom 6\r
668\r
669m_read32_rom7: @ 0x380000 - 0x3fffff\r
670 m_read32_rom 7\r
671\r
672m_read32_rom8: @ 0x400000 - 0x47ffff\r
673 m_read32_rom 8\r
674\r
675m_read32_rom9: @ 0x480000 - 0x4fffff\r
676 m_read32_rom 9\r
677\r
cc68a136 678m_read32_romA: @ 0x500000 - 0x57ffff\r
679 m_read32_rom 0xA\r
680\r
681m_read32_romB: @ 0x580000 - 0x5fffff\r
682 m_read32_rom 0xB\r
683\r
684m_read32_romC: @ 0x600000 - 0x67ffff\r
685 m_read32_rom 0xC\r
686\r
687m_read32_romD: @ 0x680000 - 0x6fffff\r
688 m_read32_rom 0xD\r
689\r
690m_read32_romE: @ 0x700000 - 0x77ffff\r
691 m_read32_rom 0xE\r
692\r
693m_read32_romF: @ 0x780000 - 0x7fffff\r
694 m_read32_rom 0xF\r
695\r
29a95187 696m_read32_rom10: @ 0x800000 - 0x87ffff\r
697 m_read32_rom 0x10\r
698\r
699m_read32_rom11: @ 0x880000 - 0x8fffff\r
700 m_read32_rom 0x11\r
701\r
702m_read32_rom12: @ 0x900000 - 0x97ffff\r
703 m_read32_rom 0x12\r
704\r
705m_read32_rom13: @ 0x980000 - 0x9fffff\r
706 m_read32_rom 0x13\r
707\r
cc68a136 708m_read32_misc:\r
709 bic r0, r0, #1\r
710 stmfd sp!,{r0,lr}\r
711 mov r1, #32\r
712 bl OtherRead16\r
713 mov r1, r0\r
714 ldmfd sp!,{r0}\r
715 stmfd sp!,{r1}\r
716 add r0, r0, #2\r
717 mov r1, #32\r
718 bl OtherRead16\r
719 ldmfd sp!,{r1,lr}\r
720 orr r0, r0, r1, lsl #16\r
721 bx lr\r
722\r
723m_read32_vdp:\r
724 tst r0, #0x70000\r
725 tsteq r0, #0x000e0\r
726 bxne lr @ invalid read\r
727 bic r0, r0, #1\r
4ff2d527 728 add r1, r0, #2\r
729 stmfd sp!,{r1,lr}\r
cc68a136 730 bl PicoVideoRead\r
4ff2d527 731 swp r0, r0, [sp]\r
cc68a136 732 bl PicoVideoRead\r
733 ldmfd sp!,{r1,lr}\r
734 orr r0, r0, r1, lsl #16\r
735 bx lr\r
736\r
737m_read32_ram:\r
738 ldr r1, =Pico\r
739 bic r0, r0, #0xff0000\r
740 bic r0, r0, #1\r
741 ldrh r0, [r1, r0]!\r
742 ldrh r1, [r1, #2] @ 2ci\r
743 orr r0, r1, r0, lsl #16\r
744 bx lr\r
745\r
746m_read32_above_rom:\r
747 bic r0, r0, #1\r
748 stmfd sp!,{r0,lr}\r
749 mov r1, #32\r
66fdc0f0 750 bl OtherRead16End\r
cc68a136 751 mov r1, r0\r
752 ldmfd sp!,{r0}\r
753 stmfd sp!,{r1}\r
754 add r0, r0, #2\r
755 mov r1, #32\r
66fdc0f0 756 bl OtherRead16End\r
cc68a136 757 ldmfd sp!,{r1,lr}\r
758 orr r0, r0, r1, lsl #16\r
759 bx lr\r
760\r
761.pool\r
762\r
763@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
764\r
765PicoWriteRomHW_SSF2: @ u32 a, u32 d\r
766 and r0, r0, #0xe\r
767 movs r0, r0, lsr #1\r
768 bne pwr_banking\r
769\r
770 @ sram register\r
771 ldr r2, =(Pico+0x22211) @ Pico.m.sram_reg\r
721cd396 772 ldrb r0, [r2]\r
cc68a136 773 and r1, r1, #3\r
721cd396 774 bic r0, r0, #3\r
775 orr r0, r0, r1\r
776 strb r0, [r2]\r
cc68a136 777 bx lr\r
778\r
779pwr_banking:\r
780 and r1, r1, #0x1f\r
781\r
782 ldr r3, =m_read8_def_table\r
783 ldr r2, =m_read8_table\r
784 ldr r12, [r3, r1, lsl #2]\r
785 str r12, [r2, r0, lsl #2]\r
786\r
787 ldr r3, =m_read16_def_table\r
788 ldr r2, =m_read16_table\r
789 ldr r12, [r3, r1, lsl #2]\r
790 str r12, [r2, r0, lsl #2]\r
791\r
792 ldr r3, =m_read32_def_table\r
793 ldr r2, =m_read32_table\r
794 ldr r12, [r3, r1, lsl #2]\r
795 str r12, [r2, r0, lsl #2]\r
796 \r
797 bx lr\r
721cd396 798\r
e5503e2f 799@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
800\r
801@ Here we only handle most often used locations,\r
802@ everything else is passed to generic handlers\r
803\r
804PicoWrite8: @ u32 a, u8 d\r
805 bic r0, r0, #0xff000000\r
806 and r2, r0, #0x00e00000\r
807 cmp r2, #0x00e00000 @ RAM?\r
808 ldr r3, =Pico\r
809 biceq r0, r0, #0x00ff0000\r
810 eoreq r0, r0, #1\r
811 streqb r1, [r3, r0]\r
812 bxeq lr\r
813\r
814m_m68k_write8_misc:\r
815 bic r2, r0, #0x1f @ most commonly we get i/o port write,\r
816 cmp r2, #0xa10000 @ so check for it first\r
817 bne m_write8_misc2\r
818m_write8_io:\r
819 ldr r2, =PicoOpt\r
820 and r0, r0, #0x1e\r
821 ldr r2, [r2]\r
822 ldr r3, =(Pico+0x22000) @ Pico.ioports\r
823 tst r2, #0x20 @ 6 button pad?\r
824 streqb r1, [r3, r0, lsr #1]\r
825 bxeq lr\r
826 cmp r0, #2\r
827 cmpne r0, #4\r
828 bne m_write8_io_done @ not likely to happen\r
829 add r2, r3, #0x200 @ Pico+0x22200\r
830 mov r12,#0\r
831 cmp r0, #2\r
832 streqb r12,[r2,#0x18]\r
833 strneb r12,[r2,#0x19] @ Pico.m.padDelay[i] = 0\r
834 tst r1, #0x40 @ TH\r
835 beq m_write8_io_done\r
836 ldrb r12,[r3, r0, lsr #1]\r
837 tst r12,#0x40\r
838 bne m_write8_io_done\r
839 cmp r0, #2\r
840 ldreqb r12,[r2,#0x0a]\r
841 ldrneb r12,[r2,#0x0b] @ Pico.m.padTHPhase\r
842 add r12,r12,#1\r
843 streqb r12,[r2,#0x0a]\r
844 strneb r12,[r2,#0x0b] @ Pico.m.padTHPhase\r
845m_write8_io_done:\r
846 strb r1, [r3, r0, lsr #1]\r
847 bx lr\r
848\r
849\r
850m_write8_misc2:\r
851 and r2, r0, #0xff0000\r
852 cmp r2, #0xa00000 @ z80 area?\r
853 bne m_write8_not_z80\r
854 tst r0, #0x4000\r
855 bne m_write8_z80_not_ram\r
856 ldr r3, =(Pico+0x20000) @ Pico.zram\r
857 add r2, r3, #0x02200 @ Pico+0x22200\r
858 ldrb r2, [r2, #9] @ Pico.m.z80Run\r
859 bic r0, r0, #0xff0000\r
860 bic r0, r0, #0x00e000\r
861 tst r2, #1\r
862 streqb r1, [r3, r0] @ zram\r
863 bx lr\r
864\r
865m_write8_z80_not_ram:\r
866 and r2, r0, #0x6000\r
867 cmp r2, #0x4000\r
868 bne m_write8_z80_not_ym2612\r
869 ldr r2, =PicoOpt\r
870 and r0, r0, #3\r
871 ldr r2, [r2]\r
872 tst r2, #1\r
873 bxeq lr\r
874 stmfd sp!,{lr}\r
875.if EXTERNAL_YM2612\r
876 tst r2, #0x200\r
877 ldreq r2, =YM2612Write_\r
878 ldrne r2, =YM2612Write_940\r
879 mov lr, pc\r
880 bx r2\r
881.else\r
882 bl YM2612Write_\r
883.endif\r
884 ldr r2, =emustatus\r
885 ldmfd sp!,{lr}\r
886 ldr r1, [r2]\r
887 orr r1, r0, r2\r
888 str r1, [r2] @ emustatus|=YM2612Write(a&3, d);\r
889 bx lr\r
890\r
891m_write8_z80_not_ym2612: @ not too likely\r
892 mov r2, r0, lsl #17\r
893 bic r2, r2, #6<<17\r
894 mov r3, #0x7f00\r
895 orr r3, r3, #0x0011\r
896 cmp r3, r2, lsr #17 @ psg @ z80 area?\r
897 beq m_write8_psg\r
898 and r2, r0, #0x7f00\r
899 cmp r2, #0x6000 @ bank register?\r
900 bxne lr @ invalid write\r
901\r
902m_write8_z80_bank_reg:\r
903 ldr r3, =(Pico+0x22208) @ Pico.m\r
904 ldrh r2, [r3, #0x0a]\r
905 mov r1, r1, lsr #8\r
906 orr r2, r1, r2, lsr #1\r
907 bic r2, r2, #0xfe00\r
908 strh r2, [r3, #0x0a]\r
909 bx lr\r
910\r
911\r
912m_write8_not_z80:\r
913 and r2, r0, #0xe70000\r
914 cmp r2, #0xc00000 @ VDP area?\r
bf537655 915 bne OtherWrite8 @ passthrough\r
e5503e2f 916 and r2, r0, #0xf9\r
917 cmp r2, #0x11\r
bf537655 918 bne OtherWrite8\r
e5503e2f 919m_write8_psg:\r
920 ldr r2, =PicoOpt\r
921 mov r0, r1\r
922 ldr r2, [r2]\r
923 tst r2, #2\r
924 bxeq lr\r
bf537655 925 b SN76496Write\r
e5503e2f 926\r