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 .equiv PCM_STEP_SHIFT, 11
14 .global PicoRead8_mcd_io
15 .global PicoRead16_mcd_io
16 .global PicoWrite8_mcd_io
17 .global PicoWrite16_mcd_io
19 .global PicoReadS68k8_pr
20 .global PicoReadS68k16_pr
21 .global PicoWriteS68k8_pr
22 .global PicoWriteS68k16_pr
24 .global PicoReadM68k8_cell0
25 .global PicoReadM68k8_cell1
26 .global PicoReadM68k16_cell0
27 .global PicoReadM68k16_cell1
28 .global PicoWriteM68k8_cell0
29 .global PicoWriteM68k8_cell1
30 .global PicoWriteM68k16_cell0
31 .global PicoWriteM68k16_cell1
33 .global PicoReadS68k8_dec0
34 .global PicoReadS68k8_dec1
35 .global PicoReadS68k16_dec0
36 .global PicoReadS68k16_dec1
37 .global PicoWriteS68k8_dec_m0b0
38 .global PicoWriteS68k8_dec_m1b0
39 .global PicoWriteS68k8_dec_m2b0
40 .global PicoWriteS68k8_dec_m0b1
41 .global PicoWriteS68k8_dec_m1b1
42 .global PicoWriteS68k8_dec_m2b1
43 .global PicoWriteS68k16_dec_m0b0
44 .global PicoWriteS68k16_dec_m1b0
45 .global PicoWriteS68k16_dec_m2b0
46 .global PicoWriteS68k16_dec_m0b1
47 .global PicoWriteS68k16_dec_m1b1
48 .global PicoWriteS68k16_dec_m2b1
50 @ externs, just for reference
53 .extern m68k_reg_write8
54 .extern s68k_reg_read16
55 .extern s68k_reg_write8
56 .extern s68k_reg_write16
57 .extern s68k_poll_detect
64 .extern PicoWrite16_io
65 .extern m68k_comm_check
68 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
72 @ r0=addr[in,out], r1,r2=tmp
74 ands r1, r0, #0x01c000
75 ldrne pc, [pc, r1, lsr #12]
86 and r1, r0, #0x7e00 @ col
87 and r2, r0, #0x01fc @ row
89 orr r1, r2, r1, ror #13
92 and r1, r0, #0x3f00 @ col
93 and r2, r0, #0x00fc @ row
95 orr r1, r2, r1, ror #12
98 and r1, r0, #0x1f80 @ col
99 and r2, r0, #0x007c @ row
100 orr r1, r2, r1, ror #11
102 orr r1, r1, r2, lsr #6
105 and r1, r0, #0xfc00 @ col
106 and r2, r0, #0x03fc @ row
107 orr r1, r2, r1, ror #14
110 orr r0, r0, r1, ror #26 @ rol 4+2
114 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
122 PicoReadM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
126 PicoReadM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
130 ldr r1, =(Pico+0x22200)
140 cmp r1, #0x2000 @ a120xx?
143 ldr r1, =(Pico+0x22200)
145 ldr r1, [r1] @ Pico.mcd (used everywhere)
147 ldrlt pc, [pc, r0, lsl #2]
149 .long m_m68k_read8_r00
150 .long m_m68k_read8_r01
151 .long m_m68k_read8_r02
152 .long m_m68k_read8_r03
153 .long m_m68k_read8_r04
154 .long m_read_null @ unused bits
155 .long m_m68k_read8_r06
156 .long m_m68k_read8_r07
157 .long m_m68k_read8_r08
158 .long m_m68k_read8_r09
159 .long m_read_null @ reserved
161 .long m_m68k_read8_r0c
162 .long m_m68k_read8_r0d
164 add r1, r1, #0x110000
166 and r0, r0, #0x04000000 @ we need irq2 mask state
170 add r1, r1, #0x110000
171 add r1, r1, #0x002200
172 ldrb r0, [r1, #2] @ Pico_mcd->m.busreq
175 add r1, r1, #0x110000
179 add r1, r1, #0x110000
187 add r1, r1, #0x110000
191 ldrb r0, [r1, #0x73] @ IRQ vector
198 bl Read_CDC_Host @ TODO: make it local
205 add r1, r1, #0x110000
206 add r1, r1, #0x002200
207 ldr r0, [r1, #0x14] @ Pico_mcd->m.timer_stopwatch
211 add r1, r1, #0x110000
212 add r1, r1, #0x002200
218 add r1, r1, #0x110000
229 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
232 PicoReadM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
236 PicoReadM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
240 ldr r1, =(Pico+0x22200)
250 cmp r1, #0x2000 @ a120xx
253 m_m68k_read16_m68k_regs:
254 ldr r1, =(Pico+0x22200)
256 ldr r1, [r1] @ Pico.mcd (used everywhere)
258 ldrlt pc, [pc, r0, lsl #1]
260 .long m_m68k_read16_r00
261 .long m_m68k_read16_r02
262 .long m_m68k_read16_r04
263 .long m_m68k_read16_r06
264 .long m_m68k_read16_r08
265 .long m_read_null @ reserved
266 .long m_m68k_read16_r0c
268 add r1, r1, #0x110000
270 add r1, r1, #0x002200
271 ldrb r1, [r1, #2] @ Pico_mcd->m.busreq
272 and r0, r0, #0x04000000 @ we need irq2 mask state
273 orr r0, r1, r0, lsr #11
276 add r1, r1, #0x110000
283 orr r0, r2, r0, lsl #8
286 add r1, r1, #0x110000
291 ldrh r0, [r1, #0x72] @ IRQ vector
297 add r1, r1, #0x110000
298 add r1, r1, #0x002200
304 add r1, r1, #0x110000
315 orr r0, r1, r0, lsl #8
319 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
322 PicoWriteM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
326 PicoWriteM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
331 ldr r2, =(Pico+0x22200)
341 cmp r2, #0x2000 @ a120xx?
346 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
349 PicoWriteM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
353 PicoWriteM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
358 ldr r1, =(Pico+0x22200)
368 cmp r2, #0x2000 @ a120xx?
374 beq m_m68k_write16_regs_spec
383 m_m68k_write16_regs_spec: @ special case
388 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
390 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
393 PicoReadS68k8_dec0: @ 0x080000 - 0x0bffff
394 mov r3, #0x080000 @ + ^ / 2
398 mov r3, #0x0a0000 @ + ^ / 2
400 ldr r2, =(Pico+0x22200)
403 movs r0, r0, lsr #1 @ +4-6 <<16
404 add r2, r2, r3 @ map to our address
417 bic r0, r0, #0xff0000
418 bic r0, r0, #0x008000
421 blo m_s68k_read8_comm
432 ldr r1, =(Pico+0x22200)
434 add r1, r1, #0x110000
444 @ must not trash r3 and r12
445 ldr r1, =(Pico+0x22200)
446 bic r0, r0, #0xff0000
449 orr r2, r2, #0x002200
451 bge m_s68k_read8_pcm_ram
458 m_s68k_read8_pcm_ram:
461 add r1, r1, #0x100000 @ pcm_ram
462 and r2, r2, #0x0f000000 @ bank
463 add r1, r1, r2, lsr #12
464 bic r0, r0, #0x00e000
470 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
473 PicoReadS68k16_dec0: @ 0x080000 - 0x0bffff
474 mov r3, #0x080000 @ + ^ / 2
478 mov r3, #0x0a0000 @ + ^ / 2
480 ldr r2, =(Pico+0x22200)
483 mov r0, r0, lsr #1 @ +4-6 <<16
484 add r2, r2, r3 @ map to our address
486 orr r0, r0, r0, lsl #4
494 @ pcm is on 8-bit bus, would this be same as byte access?
498 bic r0, r0, #0xff0000
499 bic r0, r0, #0x008000
500 bic r0, r0, #0x000001
507 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
510 .macro m_s68k_write8_2M_decode
511 ldr r2, =(Pico+0x22200)
513 ldr r2, [r2] @ Pico.rom
514 movs r0, r0, lsr #1 @ +4-6 <<16
515 add r2, r2, r3 @ map to our address
518 PicoWriteS68k8_dec_m2b0: @ overwrite
522 PicoWriteS68k8_dec_m0b0:
526 PicoWriteS68k8_dec_m2b1: @ overwrite
530 PicoWriteS68k8_dec_m0b1:
533 m_s68k_write8_2M_decode
543 PicoWriteS68k8_dec_m1b0: @ underwrite
547 PicoWriteS68k8_dec_m1b1:
552 m_s68k_write8_2M_decode
567 bne m_s68k_write8_pcm
570 bic r0, r0, #0xff0000
571 bic r0, r0, #0x008000
579 orr r1, r1, r1, lsl #8
586 bic r0, r0, #0xff0000
594 m_s68k_write8_pcm_ram:
595 ldr r3, =(Pico+0x22200)
596 bic r0, r0, #0x00e000
599 add r2, r3, #0x110000
600 add r2, r2, #0x002200
601 add r2, r2, #0x000040
603 add r3, r3, #0x100000 @ pcm_ram
604 and r2, r2, #0x0f000000 @ bank
605 add r3, r3, r2, lsr #12
610 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
613 .macro m_s68k_write16_2M_decode
614 ldr r2, =(Pico+0x22200)
617 mov r0, r0, lsr #1 @ +4-6 <<16
618 add r2, r2, r3 @ map to our address
621 PicoWriteS68k16_dec_m0b0:
625 PicoWriteS68k16_dec_m0b1:
628 m_s68k_write16_2M_decode
630 orr r1, r1, r1, lsr #4
634 PicoWriteS68k16_dec_m1b0: @ underwrite
638 PicoWriteS68k16_dec_m1b1:
642 bicnes r1, r1, #0x00f0
644 orr r1, r1, r1, lsr #4
645 m_s68k_write16_2M_decode
656 PicoWriteS68k16_dec_m2b0: @ overwrite
660 PicoWriteS68k16_dec_m2b1:
664 bicnes r1, r1, #0x00f0
666 orr r1, r1, r1, lsr #4
667 m_s68k_write16_2M_decode
682 bne m_s68k_write8_pcm
685 bic r0, r0, #0xff0000
686 bic r0, r0, #0x008000
694 m_s68k_write16_regs_spec: @ special case
695 ldr r2, =(Pico+0x22200)
698 add r0, r0, #0x00000f
699 strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d;
704 @ vim:filetype=armasm