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 PicoReadM68k8_io
15 .global PicoReadM68k16_io
16 .global PicoWriteM68k8_io
17 .global PicoWriteM68k16_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_poll_adclk
57 .extern s68k_poll_detect
59 .extern gfx_cd_write16
64 .extern PicoWrite16_io
67 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
71 @ r0=addr[in,out], r1,r2=tmp
73 ands r1, r0, #0x01c000
74 ldrne pc, [pc, r1, lsr #12]
85 and r1, r0, #0x7e00 @ col
86 and r2, r0, #0x01fc @ row
88 orr r1, r2, r1, ror #13
91 and r1, r0, #0x3f00 @ col
92 and r2, r0, #0x00fc @ row
94 orr r1, r2, r1, ror #12
97 and r1, r0, #0x1f80 @ col
98 and r2, r0, #0x007c @ row
99 orr r1, r2, r1, ror #11
101 orr r1, r1, r2, lsr #6
104 and r1, r0, #0xfc00 @ col
105 and r2, r0, #0x03fc @ row
106 orr r1, r2, r1, ror #14
109 orr r0, r0, r1, ror #26 @ rol 4+2
113 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
121 PicoReadM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
125 PicoReadM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
129 ldr r1, =(Pico+0x22200)
139 cmp r1, #0x2000 @ a120xx?
142 ldr r1, =(Pico+0x22200)
144 ldr r1, [r1] @ Pico.mcd (used everywhere)
146 ldrlt pc, [pc, r0, lsl #2]
148 .long m_m68k_read8_r00
149 .long m_m68k_read8_r01
150 .long m_m68k_read8_r02
151 .long m_m68k_read8_r03
152 .long m_m68k_read8_r04
153 .long m_read_null @ unused bits
154 .long m_m68k_read8_r06
155 .long m_m68k_read8_r07
156 .long m_m68k_read8_r08
157 .long m_m68k_read8_r09
158 .long m_read_null @ reserved
160 .long m_m68k_read8_r0c
161 .long m_m68k_read8_r0d
163 add r1, r1, #0x110000
165 and r0, r0, #0x04000000 @ we need irq2 mask state
169 add r1, r1, #0x110000
170 add r1, r1, #0x002200
171 ldrb r0, [r1, #2] @ Pico_mcd->m.busreq
174 add r1, r1, #0x110000
178 add r1, r1, #0x110000
180 add r1, r1, #0x002200
183 tst r1, #2 @ DMNA pending?
189 add r1, r1, #0x110000
193 ldrb r0, [r1, #0x73] @ IRQ vector
200 bl Read_CDC_Host @ TODO: make it local
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
222 add r1, r1, #0x110000
227 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
230 PicoReadM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
234 PicoReadM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
238 ldr r1, =(Pico+0x22200)
248 cmp r1, #0x2000 @ a120xx
251 m_m68k_read16_m68k_regs:
252 ldr r1, =(Pico+0x22200)
254 ldr r1, [r1] @ Pico.mcd (used everywhere)
256 ldrlt pc, [pc, r0, lsl #1]
258 .long m_m68k_read16_r00
259 .long m_m68k_read16_r02
260 .long m_m68k_read16_r04
261 .long m_m68k_read16_r06
262 .long m_m68k_read16_r08
263 .long m_read_null @ reserved
264 .long m_m68k_read16_r0c
266 add r1, r1, #0x110000
268 add r1, r1, #0x002200
269 ldrb r1, [r1, #2] @ Pico_mcd->m.busreq
270 and r0, r0, #0x04000000 @ we need irq2 mask state
271 orr r0, r1, r0, lsr #11
274 add r1, r1, #0x110000
277 add r1, r1, #0x002200
280 orr r0, r2, r0, lsl #8
281 tst r1, #2 @ DMNA pending?
287 add r1, r1, #0x110000
292 ldrh r0, [r1, #0x72] @ IRQ vector
298 add r1, r1, #0x110000
299 add r1, r1, #0x002200
305 addlt r1, r1, #0x110000
311 orr r0, r0, r1, lsl #8
315 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
318 PicoWriteM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
322 PicoWriteM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
327 ldr r2, =(Pico+0x22200)
337 cmp r2, #0x2000 @ a120xx?
342 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
345 PicoWriteM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
349 PicoWriteM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
354 ldr r1, =(Pico+0x22200)
364 cmp r2, #0x2000 @ a120xx?
370 beq m_m68k_write16_regs_spec
379 m_m68k_write16_regs_spec: @ special case
380 ldr r2, =(Pico+0x22200)
381 ldr r3, =s68k_poll_adclk
384 add r0, r0, #0x00000e
386 strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0x0e] = d >> 8;
392 ldr r0, =PicoCpuCS68k
393 str r1, [r0, #0x58] @ push s68k out of stopped state
398 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
400 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
403 PicoReadS68k8_dec0: @ 0x080000 - 0x0bffff
404 mov r3, #0x080000 @ + ^ / 2
408 mov r3, #0x0a0000 @ + ^ / 2
410 ldr r2, =(Pico+0x22200)
413 movs r0, r0, lsr #1 @ +4-6 <<16
414 add r2, r2, r3 @ map to our address
427 bic r0, r0, #0xff0000
428 bic r0, r0, #0x008000
431 blo m_s68k_read8_comm
434 ldrlo r2, =gfx_cd_read
435 ldrhs r2, =s68k_reg_read16
447 ldr r1, =(Pico+0x22200)
449 add r1, r1, #0x110000
458 @ must not trash r3 and r12
459 ldr r1, =(Pico+0x22200)
460 bic r0, r0, #0xff0000
461 @ bic r0, r0, #0x008000
464 orr r2, r2, #0x002200
466 bge m_s68k_read8_pcm_ram
470 orr r2, r2, #(0x48+8) @ pcm.ch + addr_offset
473 ldr r1, [r1, r2, lsl #2]
475 moveq r0, r1, lsr #PCM_STEP_SHIFT
476 movne r0, r1, lsr #(PCM_STEP_SHIFT+8)
480 m_s68k_read8_pcm_ram:
483 add r1, r1, #0x100000 @ pcm_ram
484 and r2, r2, #0x0f000000 @ bank
485 add r1, r1, r2, lsr #12
486 bic r0, r0, #0x00e000
492 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
495 PicoReadS68k16_dec0: @ 0x080000 - 0x0bffff
496 mov r3, #0x080000 @ + ^ / 2
500 mov r3, #0x0a0000 @ + ^ / 2
502 ldr r2, =(Pico+0x22200)
505 mov r0, r0, lsr #1 @ +4-6 <<16
506 add r2, r2, r3 @ map to our address
508 orr r0, r0, r0, lsl #4
516 @ pcm is on 8-bit bus, would this be same as byte access?
520 bic r0, r0, #0xff0000
521 bic r0, r0, #0x008000
522 bic r0, r0, #0x000001
532 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
535 .macro m_s68k_write8_2M_decode
536 ldr r2, =(Pico+0x22200)
538 ldr r2, [r2] @ Pico.rom
539 movs r0, r0, lsr #1 @ +4-6 <<16
540 add r2, r2, r3 @ map to our address
543 PicoWriteS68k8_dec_m2b0: @ overwrite
547 PicoWriteS68k8_dec_m0b0:
551 PicoWriteS68k8_dec_m2b1: @ overwrite
555 PicoWriteS68k8_dec_m0b1:
558 m_s68k_write8_2M_decode
568 PicoWriteS68k8_dec_m1b0: @ underwrite
572 PicoWriteS68k8_dec_m1b1:
577 m_s68k_write8_2M_decode
592 bne m_s68k_write8_pcm
595 bic r0, r0, #0xff0000
596 bic r0, r0, #0x008000
604 orr r1, r1, r1, lsl #8
611 bic r0, r0, #0xff0000
619 m_s68k_write8_pcm_ram:
620 ldr r3, =(Pico+0x22200)
621 bic r0, r0, #0x00e000
624 add r2, r3, #0x110000
625 add r2, r2, #0x002200
626 add r2, r2, #0x000040
628 add r3, r3, #0x100000 @ pcm_ram
629 and r2, r2, #0x0f000000 @ bank
630 add r3, r3, r2, lsr #12
635 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
638 .macro m_s68k_write16_2M_decode
639 ldr r2, =(Pico+0x22200)
642 mov r0, r0, lsr #1 @ +4-6 <<16
643 add r2, r2, r3 @ map to our address
646 PicoWriteS68k16_dec_m0b0:
650 PicoWriteS68k16_dec_m0b1:
653 m_s68k_write16_2M_decode
655 orr r1, r1, r1, lsr #4
659 PicoWriteS68k16_dec_m1b0: @ underwrite
663 PicoWriteS68k16_dec_m1b1:
667 bicnes r1, r1, #0x00f0
669 orr r1, r1, r1, lsr #4
670 m_s68k_write16_2M_decode
681 PicoWriteS68k16_dec_m2b0: @ overwrite
685 PicoWriteS68k16_dec_m2b1:
689 bicnes r1, r1, #0x00f0
691 orr r1, r1, r1, lsr #4
692 m_s68k_write16_2M_decode
707 bne m_s68k_write8_pcm
710 bic r0, r0, #0xff0000
711 bic r0, r0, #0x008000
717 beq m_s68k_write16_regs_spec
729 m_s68k_write16_regs_spec: @ special case
730 ldr r2, =(Pico+0x22200)
733 add r0, r0, #0x00000f
734 strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d;
739 @ vim:filetype=armasm