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
66 .extern PicoWrite16_io
67 .extern m68k_comm_check
70 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
74 @ r0=addr[in,out], r1,r2=tmp
76 ands r1, r0, #0x01c000
77 ldrne pc, [pc, r1, lsr #12]
88 and r1, r0, #0x7e00 @ col
89 and r2, r0, #0x01fc @ row
91 orr r1, r2, r1, ror #13
94 and r1, r0, #0x3f00 @ col
95 and r2, r0, #0x00fc @ row
97 orr r1, r2, r1, ror #12
100 and r1, r0, #0x1f80 @ col
101 and r2, r0, #0x007c @ row
102 orr r1, r2, r1, ror #11
104 orr r1, r1, r2, lsr #6
107 and r1, r0, #0xfc00 @ col
108 and r2, r0, #0x03fc @ row
109 orr r1, r2, r1, ror #14
112 orr r0, r0, r1, ror #26 @ rol 4+2
116 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
124 PicoReadM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
128 PicoReadM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
134 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd (used everywhere)
142 cmp r1, #0x2000 @ a120xx?
147 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
149 ldrlt pc, [pc, r0, lsl #2]
151 .long m_m68k_read8_r00
152 .long m_m68k_read8_r01
153 .long m_m68k_read8_r02
154 .long m_m68k_read8_r03
155 .long m_m68k_read8_r04
156 .long m_read_null @ unused bits
157 .long m_m68k_read8_r06
158 .long m_m68k_read8_r07
159 .long m_m68k_read8_r08
160 .long m_m68k_read8_r09
161 .long m_read_null @ reserved
163 .long m_m68k_read8_r0c
164 .long m_m68k_read8_r0d
166 add r1, r1, #0x110000
168 and r0, r0, #0x04000000 @ we need irq2 mask state
172 add r1, r1, #0x110000
173 add r1, r1, #0x002200
174 ldrb r0, [r1, #2] @ Pico_mcd->m.busreq
177 add r1, r1, #0x110000
181 add r1, r1, #0x110000
189 add r1, r1, #0x110000
193 ldrb r0, [r1, #0x73] @ IRQ vector
207 add r1, r1, #0x110000
208 add r1, r1, #0x002200
209 ldr r0, [r1, #0x14] @ Pico_mcd->m.timer_stopwatch
213 add r1, r1, #0x110000
214 add r1, r1, #0x002200
220 add r1, r1, #0x110000
231 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
234 PicoReadM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
238 PicoReadM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
244 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
252 cmp r1, #0x2000 @ a120xx
255 m_m68k_read16_m68k_regs:
258 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
260 ldrlt pc, [pc, r0, lsl #1]
262 .long m_m68k_read16_r00
263 .long m_m68k_read16_r02
264 .long m_m68k_read16_r04
265 .long m_m68k_read16_r06
266 .long m_m68k_read16_r08
267 .long m_read_null @ reserved
268 .long m_m68k_read16_r0c
270 add r1, r1, #0x110000
272 add r1, r1, #0x002200
273 ldrb r1, [r1, #2] @ Pico_mcd->m.busreq
274 and r0, r0, #0x04000000 @ we need irq2 mask state
275 orr r0, r1, r0, lsr #11
278 add r1, r1, #0x110000
285 orr r0, r2, r0, lsl #8
288 add r1, r1, #0x110000
293 ldrh r0, [r1, #0x72] @ IRQ vector
299 add r1, r1, #0x110000
300 add r1, r1, #0x002200
306 add r1, r1, #0x110000
317 orr r0, r1, r0, lsl #8
321 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
324 PicoWriteM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
328 PicoWriteM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
335 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
344 cmp r2, #0x2000 @ a120xx?
349 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
352 PicoWriteM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
356 PicoWriteM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
363 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
371 cmp r2, #0x2000 @ a120xx?
377 beq m_m68k_write16_regs_spec
386 m_m68k_write16_regs_spec: @ special case
391 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
393 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
396 PicoReadS68k8_dec0: @ 0x080000 - 0x0bffff
397 mov r3, #0x080000 @ + ^ / 2
401 mov r3, #0x0a0000 @ + ^ / 2
405 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
406 movs r0, r0, lsr #1 @ +4-6 <<16
407 add r2, r2, r3 @ map to our address
420 bic r0, r0, #0xff0000
421 bic r0, r0, #0x008000
424 blo m_s68k_read8_comm
436 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
437 add r1, r1, #0x110000
447 @ must not trash r3 and r12
449 bic r0, r0, #0xff0000
450 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
452 orr r2, r2, #0x002200
454 bge m_s68k_read8_pcm_ram
461 m_s68k_read8_pcm_ram:
464 add r1, r1, #0x100000 @ pcm_ram
465 and r2, r2, #0x0f000000 @ bank
466 add r1, r1, r2, lsr #12
467 bic r0, r0, #0x00e000
473 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
476 PicoReadS68k16_dec0: @ 0x080000 - 0x0bffff
477 mov r3, #0x080000 @ + ^ / 2
481 mov r3, #0x0a0000 @ + ^ / 2
485 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
486 mov r0, r0, lsr #1 @ +4-6 <<16
487 add r2, r2, r3 @ map to our address
489 orr r0, r0, r0, lsl #4
497 @ pcm is on 8-bit bus, would this be same as byte access?
501 bic r0, r0, #0xff0000
502 bic r0, r0, #0x008000
503 bic r0, r0, #0x000001
510 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
513 .macro m_s68k_write8_2M_decode
516 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
517 movs r0, r0, lsr #1 @ +4-6 <<16
518 add r2, r2, r3 @ map to our address
521 PicoWriteS68k8_dec_m2b0: @ overwrite
525 PicoWriteS68k8_dec_m0b0:
529 PicoWriteS68k8_dec_m2b1: @ overwrite
533 PicoWriteS68k8_dec_m0b1:
536 m_s68k_write8_2M_decode
546 PicoWriteS68k8_dec_m1b0: @ underwrite
550 PicoWriteS68k8_dec_m1b1:
555 m_s68k_write8_2M_decode
570 bne m_s68k_write8_pcm
573 bic r0, r0, #0xff0000
574 bic r0, r0, #0x008000
582 orr r1, r1, r1, lsl #8
589 bic r0, r0, #0xff0000
597 m_s68k_write8_pcm_ram:
599 bic r0, r0, #0x00e000
600 ldr r3, [r3, #OFS_Pico_rom] @ Pico.mcd
602 add r2, r3, #0x110000
603 add r2, r2, #0x002200
604 add r2, r2, #0x000040
606 add r3, r3, #0x100000 @ pcm_ram
607 and r2, r2, #0x0f000000 @ bank
608 add r3, r3, r2, lsr #12
613 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
616 .macro m_s68k_write16_2M_decode
619 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
620 mov r0, r0, lsr #1 @ +4-6 <<16
621 add r2, r2, r3 @ map to our address
624 PicoWriteS68k16_dec_m0b0:
628 PicoWriteS68k16_dec_m0b1:
631 m_s68k_write16_2M_decode
633 orr r1, r1, r1, lsr #4
637 PicoWriteS68k16_dec_m1b0: @ underwrite
641 PicoWriteS68k16_dec_m1b1:
645 bicnes r1, r1, #0x00f0
647 orr r1, r1, r1, lsr #4
648 m_s68k_write16_2M_decode
659 PicoWriteS68k16_dec_m2b0: @ overwrite
663 PicoWriteS68k16_dec_m2b1:
667 bicnes r1, r1, #0x00f0
669 orr r1, r1, r1, lsr #4
670 m_s68k_write16_2M_decode
685 bne m_s68k_write8_pcm
688 bic r0, r0, #0xff0000
689 bic r0, r0, #0x008000
697 m_s68k_write16_regs_spec: @ special case
700 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
701 add r0, r0, #0x00000f
702 strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d;
707 @ vim:filetype=armasm