2 @* Memory I/O handlers for Sega/Mega CD emulation
3 @* (C) notaz, 2007-2009
5 @* This work is licensed under the terms of MAME license.
6 @* See COPYING file in the top-level directory.
9 #include "../pico_int_o32.h"
11 .equiv PCM_STEP_SHIFT, 11
16 .global PicoRead8_mcd_io
17 .global PicoRead16_mcd_io
18 .global PicoWrite8_mcd_io
19 .global PicoWrite16_mcd_io
21 .global PicoReadS68k8_pr
22 .global PicoReadS68k16_pr
23 .global PicoWriteS68k8_pr
24 .global PicoWriteS68k16_pr
26 .global PicoReadM68k8_cell0
27 .global PicoReadM68k8_cell1
28 .global PicoReadM68k16_cell0
29 .global PicoReadM68k16_cell1
30 .global PicoWriteM68k8_cell0
31 .global PicoWriteM68k8_cell1
32 .global PicoWriteM68k16_cell0
33 .global PicoWriteM68k16_cell1
35 .global PicoReadS68k8_dec0
36 .global PicoReadS68k8_dec1
37 .global PicoReadS68k16_dec0
38 .global PicoReadS68k16_dec1
39 .global PicoWriteS68k8_dec_m0b0
40 .global PicoWriteS68k8_dec_m1b0
41 .global PicoWriteS68k8_dec_m2b0
42 .global PicoWriteS68k8_dec_m0b1
43 .global PicoWriteS68k8_dec_m1b1
44 .global PicoWriteS68k8_dec_m2b1
45 .global PicoWriteS68k16_dec_m0b0
46 .global PicoWriteS68k16_dec_m1b0
47 .global PicoWriteS68k16_dec_m2b0
48 .global PicoWriteS68k16_dec_m0b1
49 .global PicoWriteS68k16_dec_m1b1
50 .global PicoWriteS68k16_dec_m2b1
52 @ externs, just for reference
55 .extern m68k_reg_write8
56 .extern s68k_reg_read16
57 .extern s68k_reg_write8
58 .extern s68k_reg_write16
59 .extern s68k_poll_detect
65 .extern PicoWrite16_io
66 .extern m68k_comm_check
69 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
73 @ r0=addr[in,out], r1,r2=tmp
75 ands r1, r0, #0x01c000
76 ldrne pc, [pc, r1, lsr #12]
87 and r1, r0, #0x7e00 @ col
88 and r2, r0, #0x01fc @ row
90 orr r1, r2, r1, ror #13
93 and r1, r0, #0x3f00 @ col
94 and r2, r0, #0x00fc @ row
96 orr r1, r2, r1, ror #12
99 and r1, r0, #0x1f80 @ col
100 and r2, r0, #0x007c @ row
101 orr r1, r2, r1, ror #11
103 orr r1, r1, r2, lsr #6
106 and r1, r0, #0xfc00 @ col
107 and r2, r0, #0x03fc @ row
108 orr r1, r2, r1, ror #14
111 orr r0, r0, r1, ror #26 @ rol 4+2
115 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
123 PicoReadM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
127 PicoReadM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
133 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd (used everywhere)
141 cmp r1, #0x2000 @ a120xx?
146 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
148 ldrlt pc, [pc, r0, lsl #2]
150 .long m_m68k_read8_r00
151 .long m_m68k_read8_r01
152 .long m_m68k_read8_r02
153 .long m_m68k_read8_r03
154 .long m_m68k_read8_r04
155 .long m_read_null @ unused bits
156 .long m_m68k_read8_r06
157 .long m_m68k_read8_r07
158 .long m_m68k_read8_r08
159 .long m_m68k_read8_r09
160 .long m_read_null @ reserved
162 .long m_m68k_read8_r0c
163 .long m_m68k_read8_r0d
165 add r1, r1, #0x110000
167 and r0, r0, #0x04000000 @ we need irq2 mask state
171 add r1, r1, #0x110000
172 add r1, r1, #0x002200
173 ldrb r0, [r1, #2] @ Pico_mcd->m.busreq
176 add r1, r1, #0x110000
180 add r1, r1, #0x110000
188 add r1, r1, #0x110000
192 ldrb r0, [r1, #0x73] @ IRQ vector
206 add r1, r1, #0x110000
207 add r1, r1, #0x002200
208 ldr r0, [r1, #0x14] @ Pico_mcd->m.timer_stopwatch
212 add r1, r1, #0x110000
213 add r1, r1, #0x002200
219 add r1, r1, #0x110000
230 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
233 PicoReadM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
237 PicoReadM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
243 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
251 cmp r1, #0x2000 @ a120xx
254 m_m68k_read16_m68k_regs:
257 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
259 ldrlt pc, [pc, r0, lsl #1]
261 .long m_m68k_read16_r00
262 .long m_m68k_read16_r02
263 .long m_m68k_read16_r04
264 .long m_m68k_read16_r06
265 .long m_m68k_read16_r08
266 .long m_read_null @ reserved
267 .long m_m68k_read16_r0c
269 add r1, r1, #0x110000
271 add r1, r1, #0x002200
272 ldrb r1, [r1, #2] @ Pico_mcd->m.busreq
273 and r0, r0, #0x04000000 @ we need irq2 mask state
274 orr r0, r1, r0, lsr #11
277 add r1, r1, #0x110000
284 orr r0, r2, r0, lsl #8
287 add r1, r1, #0x110000
292 ldrh r0, [r1, #0x72] @ IRQ vector
298 add r1, r1, #0x110000
299 add r1, r1, #0x002200
305 add r1, r1, #0x110000
316 orr r0, r1, r0, lsl #8
320 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
323 PicoWriteM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
327 PicoWriteM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
334 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
343 cmp r2, #0x2000 @ a120xx?
348 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
351 PicoWriteM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
355 PicoWriteM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
362 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
370 cmp r2, #0x2000 @ a120xx?
376 beq m_m68k_write16_regs_spec
385 m_m68k_write16_regs_spec: @ special case
390 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
392 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
395 PicoReadS68k8_dec0: @ 0x080000 - 0x0bffff
396 mov r3, #0x080000 @ + ^ / 2
400 mov r3, #0x0a0000 @ + ^ / 2
404 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
405 movs r0, r0, lsr #1 @ +4-6 <<16
406 add r2, r2, r3 @ map to our address
419 bic r0, r0, #0xff0000
420 bic r0, r0, #0x008000
423 blo m_s68k_read8_comm
435 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
436 add r1, r1, #0x110000
446 @ must not trash r3 and r12
448 bic r0, r0, #0xff0000
449 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
451 orr r2, r2, #0x002200
453 bge m_s68k_read8_pcm_ram
460 m_s68k_read8_pcm_ram:
463 add r1, r1, #0x100000 @ pcm_ram
464 and r2, r2, #0x0f000000 @ bank
465 add r1, r1, r2, lsr #12
466 bic r0, r0, #0x00e000
472 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
475 PicoReadS68k16_dec0: @ 0x080000 - 0x0bffff
476 mov r3, #0x080000 @ + ^ / 2
480 mov r3, #0x0a0000 @ + ^ / 2
484 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
485 mov r0, r0, lsr #1 @ +4-6 <<16
486 add r2, r2, r3 @ map to our address
488 orr r0, r0, r0, lsl #4
496 @ pcm is on 8-bit bus, would this be same as byte access?
500 bic r0, r0, #0xff0000
501 bic r0, r0, #0x008000
502 bic r0, r0, #0x000001
509 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
512 .macro m_s68k_write8_2M_decode
515 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
516 movs r0, r0, lsr #1 @ +4-6 <<16
517 add r2, r2, r3 @ map to our address
520 PicoWriteS68k8_dec_m2b0: @ overwrite
524 PicoWriteS68k8_dec_m0b0:
528 PicoWriteS68k8_dec_m2b1: @ overwrite
532 PicoWriteS68k8_dec_m0b1:
535 m_s68k_write8_2M_decode
545 PicoWriteS68k8_dec_m1b0: @ underwrite
549 PicoWriteS68k8_dec_m1b1:
554 m_s68k_write8_2M_decode
569 bne m_s68k_write8_pcm
572 bic r0, r0, #0xff0000
573 bic r0, r0, #0x008000
581 orr r1, r1, r1, lsl #8
588 bic r0, r0, #0xff0000
596 m_s68k_write8_pcm_ram:
598 bic r0, r0, #0x00e000
599 ldr r3, [r3, #OFS_Pico_rom] @ Pico.mcd
601 add r2, r3, #0x110000
602 add r2, r2, #0x002200
603 add r2, r2, #0x000040
605 add r3, r3, #0x100000 @ pcm_ram
606 and r2, r2, #0x0f000000 @ bank
607 add r3, r3, r2, lsr #12
612 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
615 .macro m_s68k_write16_2M_decode
618 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
619 mov r0, r0, lsr #1 @ +4-6 <<16
620 add r2, r2, r3 @ map to our address
623 PicoWriteS68k16_dec_m0b0:
627 PicoWriteS68k16_dec_m0b1:
630 m_s68k_write16_2M_decode
632 orr r1, r1, r1, lsr #4
636 PicoWriteS68k16_dec_m1b0: @ underwrite
640 PicoWriteS68k16_dec_m1b1:
644 bicnes r1, r1, #0x00f0
646 orr r1, r1, r1, lsr #4
647 m_s68k_write16_2M_decode
658 PicoWriteS68k16_dec_m2b0: @ overwrite
662 PicoWriteS68k16_dec_m2b1:
666 bicnes r1, r1, #0x00f0
668 orr r1, r1, r1, lsr #4
669 m_s68k_write16_2M_decode
684 bne m_s68k_write8_pcm
687 bic r0, r0, #0xff0000
688 bic r0, r0, #0x008000
696 m_s68k_write16_regs_spec: @ special case
699 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
700 add r0, r0, #0x00000f
701 strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d;
706 @ vim:filetype=armasm