+\r
+#ifdef EMU_C68K\r
+static __inline int PicoMemBaseM68k(u32 pc)\r
+{\r
+ if ((pc&0xe00000)==0xe00000)\r
+ return (int)Pico.ram-(pc&0xff0000); // Program Counter in Ram\r
+\r
+ if (pc < 0x20000)\r
+ return (int)Pico_mcd->bios; // Program Counter in BIOS\r
+\r
+ if ((pc&0xfc0000)==0x200000)\r
+ {\r
+ if (!(Pico_mcd->s68k_regs[3]&4))\r
+ return (int)Pico_mcd->word_ram2M - 0x200000; // Program Counter in Word Ram\r
+ if (pc < 0x220000) {\r
+ int bank = Pico_mcd->s68k_regs[3]&1;\r
+ return (int)Pico_mcd->word_ram1M[bank] - 0x200000;\r
+ }\r
+ }\r
+\r
+ // Error - Program Counter is invalid\r
+ dprintf("m68k FIXME: unhandled jump to %06x", pc);\r
+\r
+ return (int)Pico_mcd->bios;\r
+}\r
+\r
+\r
+static u32 PicoCheckPcM68k(u32 pc)\r
+{\r
+ pc-=PicoCpuCM68k.membase; // Get real pc\r
+ pc&=0xfffffe;\r
+\r
+ PicoCpuCM68k.membase=PicoMemBaseM68k(pc);\r
+\r
+ return PicoCpuCM68k.membase+pc;\r
+}\r
+\r
+\r
+static __inline int PicoMemBaseS68k(u32 pc)\r
+{\r
+ if (pc < 0x80000) // PRG RAM\r
+ return (int)Pico_mcd->prg_ram;\r
+\r
+ if ((pc&0xfc0000)==0x080000) // WORD RAM 2M area (assume we are in the right mode..)\r
+ return (int)Pico_mcd->word_ram2M - 0x080000;\r
+\r
+ if ((pc&0xfe0000)==0x0c0000) { // word RAM 1M area\r
+ int bank = (Pico_mcd->s68k_regs[3]&1)^1;\r
+ return (int)Pico_mcd->word_ram1M[bank] - 0x0c0000;\r
+ }\r
+\r
+ // Error - Program Counter is invalid\r
+ dprintf("s68k FIXME: unhandled jump to %06x", pc);\r
+\r
+ return (int)Pico_mcd->prg_ram;\r
+}\r
+\r
+\r
+static u32 PicoCheckPcS68k(u32 pc)\r
+{\r
+ pc-=PicoCpuCS68k.membase; // Get real pc\r
+ pc&=0xfffffe;\r
+\r
+ PicoCpuCS68k.membase=PicoMemBaseS68k(pc);\r
+\r
+ return PicoCpuCS68k.membase+pc;\r
+}\r
+#endif\r
+\r
+#ifndef _ASM_CD_MEMORY_C\r
+void PicoMemResetCD(int r3)\r
+{\r
+#ifdef EMU_F68K\r
+ // update fetchmap..\r
+ int i;\r
+ if (!(r3 & 4))\r
+ {\r
+ for (i = M68K_FETCHBANK1*2/16; (i<<(24-FAMEC_FETCHBITS)) < 0x240000; i++)\r
+ PicoCpuFM68k.Fetch[i] = (unsigned int)Pico_mcd->word_ram2M - 0x200000;\r
+ }\r
+ else\r
+ {\r
+ for (i = M68K_FETCHBANK1*2/16; (i<<(24-FAMEC_FETCHBITS)) < 0x220000; i++)\r
+ PicoCpuFM68k.Fetch[i] = (unsigned int)Pico_mcd->word_ram1M[r3 & 1] - 0x200000;\r
+ for (i = M68K_FETCHBANK1*0x0c/0x100; (i<<(24-FAMEC_FETCHBITS)) < 0x0e0000; i++)\r
+ PicoCpuFS68k.Fetch[i] = (unsigned int)Pico_mcd->word_ram1M[(r3&1)^1] - 0x0c0000;\r
+ }\r
+#endif\r
+}\r
+#endif\r
+\r
+PICO_INTERNAL void PicoMemSetupCD(void)\r
+{\r
+ dprintf("PicoMemSetupCD()");\r
+#ifdef EMU_C68K\r
+ // Setup m68k memory callbacks:\r
+ PicoCpuCM68k.checkpc=PicoCheckPcM68k;\r
+ PicoCpuCM68k.fetch8 =PicoCpuCM68k.read8 =PicoReadM68k8;\r
+ PicoCpuCM68k.fetch16=PicoCpuCM68k.read16=PicoReadM68k16;\r
+ PicoCpuCM68k.fetch32=PicoCpuCM68k.read32=PicoReadM68k32;\r
+ PicoCpuCM68k.write8 =PicoWriteM68k8;\r
+ PicoCpuCM68k.write16=PicoWriteM68k16;\r
+ PicoCpuCM68k.write32=PicoWriteM68k32;\r
+ // s68k\r
+ PicoCpuCS68k.checkpc=PicoCheckPcS68k;\r
+ PicoCpuCS68k.fetch8 =PicoCpuCS68k.read8 =PicoReadS68k8;\r
+ PicoCpuCS68k.fetch16=PicoCpuCS68k.read16=PicoReadS68k16;\r
+ PicoCpuCS68k.fetch32=PicoCpuCS68k.read32=PicoReadS68k32;\r
+ PicoCpuCS68k.write8 =PicoWriteS68k8;\r
+ PicoCpuCS68k.write16=PicoWriteS68k16;\r
+ PicoCpuCS68k.write32=PicoWriteS68k32;\r
+#endif\r
+#ifdef EMU_F68K\r
+ // m68k\r
+ PicoCpuFM68k.read_byte =PicoReadM68k8;\r
+ PicoCpuFM68k.read_word =PicoReadM68k16;\r
+ PicoCpuFM68k.read_long =PicoReadM68k32;\r
+ PicoCpuFM68k.write_byte=PicoWriteM68k8;\r
+ PicoCpuFM68k.write_word=PicoWriteM68k16;\r
+ PicoCpuFM68k.write_long=PicoWriteM68k32;\r
+ // s68k\r
+ PicoCpuFS68k.read_byte =PicoReadS68k8;\r
+ PicoCpuFS68k.read_word =PicoReadS68k16;\r
+ PicoCpuFS68k.read_long =PicoReadS68k32;\r
+ PicoCpuFS68k.write_byte=PicoWriteS68k8;\r
+ PicoCpuFS68k.write_word=PicoWriteS68k16;\r
+ PicoCpuFS68k.write_long=PicoWriteS68k32;\r
+\r
+ // setup FAME fetchmap\r
+ {\r
+ int i;\r
+ // M68k\r
+ // by default, point everything to fitst 64k of ROM (BIOS)\r
+ for (i = 0; i < M68K_FETCHBANK1; i++)\r
+ PicoCpuFM68k.Fetch[i] = (unsigned int)Pico.rom - (i<<(24-FAMEC_FETCHBITS));\r
+ // now real ROM (BIOS)\r
+ for (i = 0; i < M68K_FETCHBANK1 && (i<<(24-FAMEC_FETCHBITS)) < Pico.romsize; i++)\r
+ PicoCpuFM68k.Fetch[i] = (unsigned int)Pico.rom;\r
+ // .. and RAM\r
+ for (i = M68K_FETCHBANK1*14/16; i < M68K_FETCHBANK1; i++)\r
+ PicoCpuFM68k.Fetch[i] = (unsigned int)Pico.ram - (i<<(24-FAMEC_FETCHBITS));\r
+ // S68k\r
+ // PRG RAM is default\r
+ for (i = 0; i < M68K_FETCHBANK1; i++)\r
+ PicoCpuFS68k.Fetch[i] = (unsigned int)Pico_mcd->prg_ram - (i<<(24-FAMEC_FETCHBITS));\r
+ // real PRG RAM\r
+ for (i = 0; i < M68K_FETCHBANK1 && (i<<(24-FAMEC_FETCHBITS)) < 0x80000; i++)\r
+ PicoCpuFS68k.Fetch[i] = (unsigned int)Pico_mcd->prg_ram;\r
+ // WORD RAM 2M area\r
+ for (i = M68K_FETCHBANK1*0x08/0x100; i < M68K_FETCHBANK1 && (i<<(24-FAMEC_FETCHBITS)) < 0xc0000; i++)\r
+ PicoCpuFS68k.Fetch[i] = (unsigned int)Pico_mcd->word_ram2M - 0x80000;\r
+ // PicoMemResetCD() will setup word ram for both\r
+ }\r
+#endif\r
+\r
+ // m68k_poll_addr = m68k_poll_cnt = 0;\r
+ s68k_poll_adclk = s68k_poll_cnt = 0;\r
+}\r
+\r
+\r