+ a &= 0x1fe;\r
+ rdprintf("s68k_regs r32: [%02x] @ %06x", a, SekPcS68k);\r
+ if (a >= 0x58 && a < 0x68)\r
+ d = (gfx_cd_read(a)<<16)|gfx_cd_read(a+2);\r
+ else d = (s68k_reg_read16(a)<<16)|s68k_reg_read16(a+2);\r
+ rdprintf("ret = %08x", d);\r
+ goto end;\r
+ }\r
+\r
+ // word RAM (2M area)\r
+ if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
+ wrdprintf("s68k_wram2M r32: [%06x] @%06x", a, SekPcS68k);\r
+ if (Pico_mcd->s68k_regs[3]&4) { // 1M decode mode?\r
+ int bank = !(Pico_mcd->s68k_regs[3]&1);\r
+ a >>= 1;\r
+ d = Pico_mcd->word_ram1M[bank][((a+0)^1)&0x1ffff] << 16;\r
+ d |= Pico_mcd->word_ram1M[bank][((a+1)^1)&0x1ffff];\r
+ d |= d << 4; d &= 0x0f0f0f0f;\r
+ dprintf("FIXME: decode");\r
+ } else {\r
+ // allow access in any mode, like Gens does\r
+ u16 *pm=(u16 *)(Pico_mcd->word_ram2M+(a&0x3fffe)); d = (pm[0]<<16)|pm[1];\r
+ }\r
+ wrdprintf("ret = %08x", d);\r
+ goto end;\r
+ }\r
+\r
+ // word RAM (1M area)\r
+ if ((a&0xfe0000)==0x0c0000 && (Pico_mcd->s68k_regs[3]&4)) { // 0c0000-0dffff\r
+ int bank;\r
+ wrdprintf("s68k_wram1M r32: [%06x] @%06x", a, SekPcS68k);\r
+// if (!(Pico_mcd->s68k_regs[3]&4))\r
+// dprintf("s68k_wram1M FIXME: wrong mode");\r
+ bank = !(Pico_mcd->s68k_regs[3]&1);\r
+ u16 *pm=(u16 *)(Pico_mcd->word_ram1M[bank]+(a&0x1fffe)); d = (pm[0]<<16)|pm[1];\r
+ wrdprintf("ret = %08x", d);\r
+ goto end;\r
+ }\r
+\r
+ // PCM\r
+ if ((a&0xff8000)==0xff0000) {\r
+ dprintf("FIXME: s68k_pcm r32: [%06x] @%06x", a, SekPcS68k);\r
+ a &= 0x7fff;\r
+ if (a >= 0x2000) {\r
+ a >>= 1;\r
+ d = Pico_mcd->pcm_ram_b[Pico_mcd->pcm.bank][a&0xfff] << 16;\r
+ d |= Pico_mcd->pcm_ram_b[Pico_mcd->pcm.bank][(a+1)&0xfff];\r
+ } else if (a >= 0x20) {\r
+ a &= 0x1e;\r
+ if (a & 2) {\r
+ a >>= 2;\r
+ d = (Pico_mcd->pcm.ch[a].addr >> (PCM_STEP_SHIFT-8)) & 0xff0000;\r
+ d |= (Pico_mcd->pcm.ch[(a+1)&7].addr >> PCM_STEP_SHIFT) & 0xff;\r
+ } else {\r
+ d = Pico_mcd->pcm.ch[a>>2].addr >> PCM_STEP_SHIFT;\r
+ d = ((d<<16)&0xff0000) | ((d>>8)&0xff); // PCM chip is LE\r
+ }\r
+ }\r
+ dprintf("ret = %08x", d);\r
+ goto end;\r
+ }\r
+\r
+ // bram\r
+ if ((a&0xff0000)==0xfe0000) {\r
+ dprintf("FIXME: s68k_bram r32: [%06x] @%06x", a, SekPcS68k);\r
+ a = (a>>1)&0x1fff;\r
+ d = Pico_mcd->bram[a++] << 16; // middle endian? TODO: verify against Fusion..\r
+ d|= Pico_mcd->bram[a++] << 24;\r
+ d|= Pico_mcd->bram[a++];\r
+ d|= Pico_mcd->bram[a++] << 8;\r
+ dprintf("ret = %08x", d);\r