+unsigned long m68k_read8_map [0x1000000 >> M68K_MEM_SHIFT];\r
+unsigned long m68k_read16_map [0x1000000 >> M68K_MEM_SHIFT];\r
+unsigned long m68k_write8_map [0x1000000 >> M68K_MEM_SHIFT];\r
+unsigned long m68k_write16_map[0x1000000 >> M68K_MEM_SHIFT];\r
+\r
+static void xmap_set(unsigned long *map, int shift, int start_addr, int end_addr,\r
+ void *func_or_mh, int is_func)\r
+{\r
+ unsigned long addr = (unsigned long)func_or_mh;\r
+ int mask = (1 << shift) - 1;\r
+ int i;\r
+\r
+ if ((start_addr & mask) != 0 || (end_addr & mask) != mask) {\r
+ elprintf(EL_STATUS|EL_ANOMALY, "xmap_set: tried to map bad range: %06x-%06x",\r
+ start_addr, end_addr);\r
+ return;\r
+ }\r
+\r
+ if (addr & 1) {\r
+ elprintf(EL_STATUS|EL_ANOMALY, "xmap_set: ptr is not aligned: %08lx", addr);\r
+ return;\r
+ }\r
+\r
+ if (!is_func)\r
+ addr -= start_addr;\r
+\r
+ for (i = start_addr >> shift; i <= end_addr >> shift; i++) {\r
+ map[i] = addr >> 1;\r
+ if (is_func)\r
+ map[i] |= 1 << (sizeof(addr) * 8 - 1);\r
+ }\r
+}\r
+\r
+void z80_map_set(unsigned long *map, int start_addr, int end_addr,\r
+ void *func_or_mh, int is_func)\r
+{\r
+ xmap_set(map, Z80_MEM_SHIFT, start_addr, end_addr, func_or_mh, is_func);\r
+}\r
+\r
+void cpu68k_map_set(unsigned long *map, int start_addr, int end_addr,\r
+ void *func_or_mh, int is_func)\r
+{\r
+ xmap_set(map, M68K_MEM_SHIFT, start_addr, end_addr, func_or_mh, is_func);\r
+}\r
+\r
+// more specialized/optimized function (does same as above)\r
+void cpu68k_map_all_ram(int start_addr, int end_addr, void *ptr, int is_sub)\r
+{\r
+ unsigned long *r8map, *r16map, *w8map, *w16map;\r
+ unsigned long addr = (unsigned long)ptr;\r
+ int shift = M68K_MEM_SHIFT;\r
+ int i;\r
+\r
+ if (!is_sub) {\r
+ r8map = m68k_read8_map;\r
+ r16map = m68k_read16_map;\r
+ w8map = m68k_write8_map;\r
+ w16map = m68k_write16_map;\r
+ } else {\r
+ r8map = s68k_read8_map;\r
+ r16map = s68k_read16_map;\r
+ w8map = s68k_write8_map;\r
+ w16map = s68k_write16_map;\r
+ }\r
+\r
+ addr -= start_addr;\r
+ addr >>= 1;\r
+ for (i = start_addr >> shift; i <= end_addr >> shift; i++)\r
+ r8map[i] = r16map[i] = w8map[i] = w16map[i] = addr;\r
+}\r
+\r
+static u32 m68k_unmapped_read8(u32 a)\r
+{\r
+ elprintf(EL_UIO, "m68k unmapped r8 [%06x] @%06x", a, SekPc);\r
+ return 0; // assume pulldown, as if MegaCD2 was attached\r
+}\r
+\r
+static u32 m68k_unmapped_read16(u32 a)\r
+{\r
+ elprintf(EL_UIO, "m68k unmapped r16 [%06x] @%06x", a, SekPc);\r
+ return 0;\r
+}\r
+\r
+static void m68k_unmapped_write8(u32 a, u32 d)\r
+{\r
+ elprintf(EL_UIO, "m68k unmapped w8 [%06x] %02x @%06x", a, d & 0xff, SekPc);\r
+}\r
+\r
+static void m68k_unmapped_write16(u32 a, u32 d)\r
+{\r
+ elprintf(EL_UIO, "m68k unmapped w16 [%06x] %04x @%06x", a, d & 0xffff, SekPc);\r
+}\r
+\r
+void m68k_map_unmap(int start_addr, int end_addr)\r
+{\r
+ unsigned long addr;\r
+ int shift = M68K_MEM_SHIFT;\r
+ int i;\r
+\r
+ addr = (unsigned long)m68k_unmapped_read8;\r
+ for (i = start_addr >> shift; i <= end_addr >> shift; i++)\r
+ m68k_read8_map[i] = (addr >> 1) | (1 << 31);\r
+\r
+ addr = (unsigned long)m68k_unmapped_read16;\r
+ for (i = start_addr >> shift; i <= end_addr >> shift; i++)\r
+ m68k_read16_map[i] = (addr >> 1) | (1 << 31);\r
+\r
+ addr = (unsigned long)m68k_unmapped_write8;\r
+ for (i = start_addr >> shift; i <= end_addr >> shift; i++)\r
+ m68k_write8_map[i] = (addr >> 1) | (1 << 31);\r
+\r
+ addr = (unsigned long)m68k_unmapped_write16;\r
+ for (i = start_addr >> shift; i <= end_addr >> shift; i++)\r
+ m68k_write16_map[i] = (addr >> 1) | (1 << 31);\r
+}\r
+\r
+MAKE_68K_READ8(m68k_read8, m68k_read8_map)\r
+MAKE_68K_READ16(m68k_read16, m68k_read16_map)\r
+MAKE_68K_READ32(m68k_read32, m68k_read16_map)\r
+MAKE_68K_WRITE8(m68k_write8, m68k_write8_map)\r
+MAKE_68K_WRITE16(m68k_write16, m68k_write16_map)\r
+MAKE_68K_WRITE32(m68k_write32, m68k_write16_map)\r
+\r
+// -----------------------------------------------------------------\r
+\r
+static u32 ym2612_read_local_68k(void);\r
+static int ym2612_write_local(u32 a, u32 d, int is_from_z80);\r
+static void z80_mem_setup(void);\r