3 @ Memory I/O handlers for Sega/Mega CD emulation
4 @ (c) Copyright 2007-2009, Grazvydas "notaz" Ignotas
7 .equiv PCM_STEP_SHIFT, 11
12 .global PicoReadM68k8_io
13 .global PicoReadM68k16_io
14 .global PicoWriteM68k8_io
15 .global PicoWriteM68k16_io
17 .global PicoReadS68k8_pr
18 .global PicoReadS68k16_pr
19 .global PicoWriteS68k8_pr
20 .global PicoWriteS68k16_pr
22 .global PicoReadM68k8_cell0
23 .global PicoReadM68k8_cell1
24 .global PicoReadM68k16_cell0
25 .global PicoReadM68k16_cell1
26 .global PicoWriteM68k8_cell0
27 .global PicoWriteM68k8_cell1
28 .global PicoWriteM68k16_cell0
29 .global PicoWriteM68k16_cell1
31 .global PicoReadS68k8_dec0
32 .global PicoReadS68k8_dec1
33 .global PicoReadS68k16_dec0
34 .global PicoReadS68k16_dec1
35 .global PicoWriteS68k8_dec_m0b0
36 .global PicoWriteS68k8_dec_m1b0
37 .global PicoWriteS68k8_dec_m2b0
38 .global PicoWriteS68k8_dec_m0b1
39 .global PicoWriteS68k8_dec_m1b1
40 .global PicoWriteS68k8_dec_m2b1
41 .global PicoWriteS68k16_dec_m0b0
42 .global PicoWriteS68k16_dec_m1b0
43 .global PicoWriteS68k16_dec_m2b0
44 .global PicoWriteS68k16_dec_m0b1
45 .global PicoWriteS68k16_dec_m1b1
46 .global PicoWriteS68k16_dec_m2b1
48 @ externs, just for reference
51 .extern m68k_reg_write8
52 .extern s68k_reg_read16
53 .extern s68k_reg_write8
54 .extern s68k_poll_adclk
55 .extern s68k_poll_detect
57 .extern gfx_cd_write16
62 .extern PicoWrite16_io
65 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
69 @ r0=addr[in,out], r1,r2=tmp
71 ands r1, r0, #0x01c000
72 ldrne pc, [pc, r1, lsr #12]
83 and r1, r0, #0x7e00 @ col
84 and r2, r0, #0x01fc @ row
86 orr r1, r2, r1, ror #13
89 and r1, r0, #0x3f00 @ col
90 and r2, r0, #0x00fc @ row
92 orr r1, r2, r1, ror #12
95 and r1, r0, #0x1f80 @ col
96 and r2, r0, #0x007c @ row
97 orr r1, r2, r1, ror #11
99 orr r1, r1, r2, lsr #6
102 and r1, r0, #0xfc00 @ col
103 and r2, r0, #0x03fc @ row
104 orr r1, r2, r1, ror #14
107 orr r0, r0, r1, ror #26 @ rol 4+2
111 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
119 PicoReadM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
123 PicoReadM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
127 ldr r1, =(Pico+0x22200)
137 cmp r1, #0x2000 @ a120xx?
140 ldr r1, =(Pico+0x22200)
142 ldr r1, [r1] @ Pico.mcd (used everywhere)
144 ldrlt pc, [pc, r0, lsl #2]
146 .long m_m68k_read8_r00
147 .long m_m68k_read8_r01
148 .long m_m68k_read8_r02
149 .long m_m68k_read8_r03
150 .long m_m68k_read8_r04
151 .long m_read_null @ unused bits
152 .long m_m68k_read8_r06
153 .long m_m68k_read8_r07
154 .long m_m68k_read8_r08
155 .long m_m68k_read8_r09
156 .long m_read_null @ reserved
158 .long m_m68k_read8_r0c
159 .long m_m68k_read8_r0d
161 add r1, r1, #0x110000
163 and r0, r0, #0x04000000 @ we need irq2 mask state
167 add r1, r1, #0x110000
168 add r1, r1, #0x002200
169 ldrb r0, [r1, #2] @ Pico_mcd->m.busreq
172 add r1, r1, #0x110000
176 add r1, r1, #0x110000
178 add r1, r1, #0x002200
181 tst r1, #2 @ DMNA pending?
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
220 add r1, r1, #0x110000
225 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
228 PicoReadM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
232 PicoReadM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
236 ldr r1, =(Pico+0x22200)
246 cmp r1, #0x2000 @ a120xx
249 m_m68k_read16_m68k_regs:
250 ldr r1, =(Pico+0x22200)
252 ldr r1, [r1] @ Pico.mcd (used everywhere)
254 ldrlt pc, [pc, r0, lsl #1]
256 .long m_m68k_read16_r00
257 .long m_m68k_read16_r02
258 .long m_m68k_read16_r04
259 .long m_m68k_read16_r06
260 .long m_m68k_read16_r08
261 .long m_read_null @ reserved
262 .long m_m68k_read16_r0c
264 add r1, r1, #0x110000
266 add r1, r1, #0x002200
267 ldrb r1, [r1, #2] @ Pico_mcd->m.busreq
268 and r0, r0, #0x04000000 @ we need irq2 mask state
269 orr r0, r1, r0, lsr #11
272 add r1, r1, #0x110000
275 add r1, r1, #0x002200
278 orr r0, r2, r0, lsl #8
279 tst r1, #2 @ DMNA pending?
285 add r1, r1, #0x110000
290 ldrh r0, [r1, #0x72] @ IRQ vector
296 add r1, r1, #0x110000
297 add r1, r1, #0x002200
303 addlt r1, r1, #0x110000
309 orr r0, r0, r1, lsl #8
313 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
316 PicoWriteM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
320 PicoWriteM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
325 ldr r2, =(Pico+0x22200)
335 cmp r2, #0x2000 @ a120xx?
340 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
343 PicoWriteM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
347 PicoWriteM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
352 ldr r1, =(Pico+0x22200)
362 cmp r2, #0x2000 @ a120xx?
368 beq m_m68k_write16_regs_spec
377 m_m68k_write16_regs_spec: @ special case
378 ldr r2, =(Pico+0x22200)
379 ldr r3, =s68k_poll_adclk
382 add r0, r0, #0x00000e
384 strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0x0e] = d >> 8;
390 ldr r0, =PicoCpuCS68k
391 str r1, [r0, #0x58] @ push s68k out of stopped state
396 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
398 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
401 PicoReadS68k8_dec0: @ 0x080000 - 0x0bffff
402 mov r3, #0x080000 @ + ^ / 2
406 mov r3, #0x0a0000 @ + ^ / 2
408 ldr r2, =(Pico+0x22200)
411 movs r0, r0, lsr #1 @ +4-6 <<16
412 add r2, r2, r3 @ map to our address
425 bic r0, r0, #0xff0000
426 bic r0, r0, #0x008000
429 blo m_s68k_read8_comm
432 ldrlo r2, =gfx_cd_read
433 ldrhs r2, =s68k_reg_read16
445 ldr r1, =(Pico+0x22200)
447 add r1, r1, #0x110000
456 @ must not trash r3 and r12
457 ldr r1, =(Pico+0x22200)
458 bic r0, r0, #0xff0000
459 @ bic r0, r0, #0x008000
462 orr r2, r2, #0x002200
464 bge m_s68k_read8_pcm_ram
468 orr r2, r2, #(0x48+8) @ pcm.ch + addr_offset
471 ldr r1, [r1, r2, lsl #2]
473 moveq r0, r1, lsr #PCM_STEP_SHIFT
474 movne r0, r1, lsr #(PCM_STEP_SHIFT+8)
478 m_s68k_read8_pcm_ram:
481 add r1, r1, #0x100000 @ pcm_ram
482 and r2, r2, #0x0f000000 @ bank
483 add r1, r1, r2, lsr #12
484 bic r0, r0, #0x00e000
490 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
493 PicoReadS68k16_dec0: @ 0x080000 - 0x0bffff
494 mov r3, #0x080000 @ + ^ / 2
498 mov r3, #0x0a0000 @ + ^ / 2
500 ldr r2, =(Pico+0x22200)
503 mov r0, r0, lsr #1 @ +4-6 <<16
504 add r2, r2, r3 @ map to our address
506 orr r0, r0, r0, lsl #4
514 @ pcm is on 8-bit bus, would this be same as byte access?
518 bic r0, r0, #0xff0000
519 bic r0, r0, #0x008000
520 bic r0, r0, #0x000001
530 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
533 .macro m_s68k_write8_2M_decode
534 ldr r2, =(Pico+0x22200)
536 ldr r2, [r2] @ Pico.rom
537 movs r0, r0, lsr #1 @ +4-6 <<16
538 add r2, r2, r3 @ map to our address
541 PicoWriteS68k8_dec_m2b0: @ overwrite
545 PicoWriteS68k8_dec_m0b0:
549 PicoWriteS68k8_dec_m2b1: @ overwrite
553 PicoWriteS68k8_dec_m0b1:
556 m_s68k_write8_2M_decode
566 PicoWriteS68k8_dec_m1b0: @ underwrite
570 PicoWriteS68k8_dec_m1b1:
575 m_s68k_write8_2M_decode
590 bne m_s68k_write8_pcm
593 bic r0, r0, #0xff0000
594 bic r0, r0, #0x008000
602 orr r1, r1, r1, lsl #8
609 bic r0, r0, #0xff0000
617 m_s68k_write8_pcm_ram:
618 ldr r3, =(Pico+0x22200)
619 bic r0, r0, #0x00e000
622 add r2, r3, #0x110000
623 add r2, r2, #0x002200
624 add r2, r2, #0x000040
626 add r3, r3, #0x100000 @ pcm_ram
627 and r2, r2, #0x0f000000 @ bank
628 add r3, r3, r2, lsr #12
633 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
636 .macro m_s68k_write16_2M_decode
637 ldr r2, =(Pico+0x22200)
640 mov r0, r0, lsr #1 @ +4-6 <<16
641 add r2, r2, r3 @ map to our address
644 PicoWriteS68k16_dec_m0b0:
648 PicoWriteS68k16_dec_m0b1:
651 m_s68k_write16_2M_decode
653 orr r1, r1, r1, lsr #4
657 PicoWriteS68k16_dec_m1b0: @ underwrite
661 PicoWriteS68k16_dec_m1b1:
665 bicnes r1, r1, #0x00f0
667 orr r1, r1, r1, lsr #4
668 m_s68k_write16_2M_decode
679 PicoWriteS68k16_dec_m2b0: @ overwrite
683 PicoWriteS68k16_dec_m2b1:
687 bicnes r1, r1, #0x00f0
689 orr r1, r1, r1, lsr #4
690 m_s68k_write16_2M_decode
705 bne m_s68k_write8_pcm
708 bic r0, r0, #0xff0000
709 bic r0, r0, #0x008000
715 beq m_s68k_write16_regs_spec
727 m_s68k_write16_regs_spec: @ special case
728 ldr r2, =(Pico+0x22200)
731 add r0, r0, #0x00000f
732 strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d;