From e9e56c56b08fd7db7127764c7191ac50b04d54b6 Mon Sep 17 00:00:00 2001 From: EkeEke Date: Wed, 28 Jan 2015 00:32:44 +0100 Subject: [PATCH] [Core/CD] disabled 68k & Z80 access to PRG-RAM when SUB-CPU is running (proper fix for Dungeon Explorer USA version) --- core/cd_hw/scd.c | 24 ++++++++++++++++++- core/mem68k.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++- core/mem68k.h | 2 +- 3 files changed, 85 insertions(+), 3 deletions(-) diff --git a/core/cd_hw/scd.c b/core/cd_hw/scd.c index 9287ed5..7b27137 100644 --- a/core/cd_hw/scd.c +++ b/core/cd_hw/scd.c @@ -1094,7 +1094,7 @@ void scd_init(void) m68k.memory_map[i].write8 = NULL; m68k.memory_map[i].write16 = NULL; zbank_memory_map[i].read = NULL; - zbank_memory_map[i].write = zbank_unused_w; /* Z80 cannot write to PRG-RAM (Dungeon Explorer USA version) */ + zbank_memory_map[i].write = NULL; } else @@ -1479,6 +1479,28 @@ int scd_context_load(uint8 *state) m68k.memory_map[scd.cartridge.boot + 0x02].base = scd.prg_ram + ((scd.regs[0x03>>1].byte.l & 0xc0) << 11); m68k.memory_map[scd.cartridge.boot + 0x03].base = m68k.memory_map[scd.cartridge.boot + 0x02].base + 0x10000; + /* PRG-RAM can only be accessed from MAIN 68K & Z80 when SUB-CPU is halted (Dungeon Explorer USA version) */ + if ((scd.regs[0x00].byte.l & 0x03) != 0x01) + { + /* PRG-RAM (128KB bank) is mapped to $020000-$03FFFF (resp. $420000-$43FFFF) */ + m68k.memory_map[scd.cartridge.boot + 0x02].read8 = m68k.memory_map[scd.cartridge.boot + 0x03].read8 = NULL; + m68k.memory_map[scd.cartridge.boot + 0x02].read16 = m68k.memory_map[scd.cartridge.boot + 0x03].read16 = NULL; + m68k.memory_map[scd.cartridge.boot + 0x02].write8 = m68k.memory_map[scd.cartridge.boot + 0x03].write8 = NULL; + m68k.memory_map[scd.cartridge.boot + 0x02].write16 = m68k.memory_map[scd.cartridge.boot + 0x03].write16 = NULL; + zbank_memory_map[scd.cartridge.boot + 0x02].read = zbank_memory_map[scd.cartridge.boot + 0x03].read = NULL; + zbank_memory_map[scd.cartridge.boot + 0x02].write = zbank_memory_map[scd.cartridge.boot + 0x03].write = NULL; + } + else + { + /* $020000-$03FFFF (resp. $420000-$43FFFF) is not mapped */ + m68k.memory_map[scd.cartridge.boot + 0x02].read8 = m68k.memory_map[scd.cartridge.boot + 0x03].read8 = m68k_read_bus_8; + m68k.memory_map[scd.cartridge.boot + 0x02].read16 = m68k.memory_map[scd.cartridge.boot + 0x03].read16 = m68k_read_bus_16; + m68k.memory_map[scd.cartridge.boot + 0x02].write8 = m68k.memory_map[scd.cartridge.boot + 0x03].write8 = m68k_unused_w_8; + m68k.memory_map[scd.cartridge.boot + 0x02].write16 = m68k.memory_map[scd.cartridge.boot + 0x03].write16 = m68k_unused_w_16; + zbank_memory_map[scd.cartridge.boot + 0x02].read = zbank_memory_map[scd.cartridge.boot + 0x03].read = zbank_unused_r; + zbank_memory_map[scd.cartridge.boot + 0x02].write = zbank_memory_map[scd.cartridge.boot + 0x03].write = zbank_unused_w; + } + /* Word-RAM */ if (scd.regs[0x03>>1].byte.l & 0x04) { diff --git a/core/mem68k.c b/core/mem68k.c index bdef7ba..3e708cf 100644 --- a/core/mem68k.c +++ b/core/mem68k.c @@ -3,7 +3,7 @@ * Main 68k bus handlers * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) - * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) + * Copyright (C) 2007-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: @@ -646,6 +646,8 @@ void ctrl_io_write_byte(unsigned int address, unsigned int data) case 0x01: /* SUB-CPU control */ { + unsigned int status = s68k.cpu_stopped; + /* RESET bit */ if (data & 0x01) { @@ -674,6 +676,34 @@ void ctrl_io_write_byte(unsigned int address, unsigned int data) s68k_pulse_halt(); } + /* check if SUB-CPU status has changed */ + if (s68k.cpu_stopped != status) + { + unsigned int base = scd.cartridge.boot; + + /* PRG-RAM can only be accessed from MAIN 68K & Z80 when SUB-CPU is halted (Dungeon Explorer USA version) */ + if (s68k.cpu_stopped & STOP_LEVEL_HALT) + { + /* PRG-RAM (128KB bank) is mapped to $020000-$03FFFF (resp. $420000-$43FFFF) */ + m68k.memory_map[base + 0x02].read8 = m68k.memory_map[base + 0x03].read8 = NULL; + m68k.memory_map[base + 0x02].read16 = m68k.memory_map[base + 0x03].read16 = NULL; + m68k.memory_map[base + 0x02].write8 = m68k.memory_map[base + 0x03].write8 = NULL; + m68k.memory_map[base + 0x02].write16 = m68k.memory_map[base + 0x03].write16 = NULL; + zbank_memory_map[base + 0x02].read = zbank_memory_map[base + 0x03].read = NULL; + zbank_memory_map[base + 0x02].write = zbank_memory_map[base + 0x03].write = NULL; + } + else + { + /* $020000-$03FFFF (resp. $420000-$43FFFF) is not mapped */ + m68k.memory_map[base + 0x02].read8 = m68k.memory_map[base + 0x03].read8 = m68k_read_bus_8; + m68k.memory_map[base + 0x02].read16 = m68k.memory_map[base + 0x03].read16 = m68k_read_bus_16; + m68k.memory_map[base + 0x02].write8 = m68k.memory_map[base + 0x03].write8 = m68k_unused_w_8; + m68k.memory_map[base + 0x02].write16 = m68k.memory_map[base + 0x03].write16 = m68k_unused_w_16; + zbank_memory_map[base + 0x02].read = zbank_memory_map[base + 0x03].read = zbank_unused_r; + zbank_memory_map[base + 0x02].write = zbank_memory_map[base + 0x03].write = zbank_unused_w; + } + } + scd.regs[0x00].byte.l = data; return; } @@ -842,6 +872,8 @@ void ctrl_io_write_word(unsigned int address, unsigned int data) { case 0x00: /* SUB-CPU interrupt & control */ { + unsigned int status = s68k.cpu_stopped; + /* RESET bit */ if (data & 0x01) { @@ -870,6 +902,34 @@ void ctrl_io_write_word(unsigned int address, unsigned int data) s68k_pulse_halt(); } + /* check if SUB-CPU status has changed */ + if (s68k.cpu_stopped != status) + { + unsigned int base = scd.cartridge.boot; + + /* PRG-RAM can only be accessed from MAIN 68K & Z80 when SUB-CPU is halted (Dungeon Explorer USA version) */ + if (s68k.cpu_stopped & STOP_LEVEL_HALT) + { + /* PRG-RAM (128KB bank) is mapped to $020000-$03FFFF (resp. $420000-$43FFFF) */ + m68k.memory_map[base + 0x02].read8 = m68k.memory_map[base + 0x03].read8 = NULL; + m68k.memory_map[base + 0x02].read16 = m68k.memory_map[base + 0x03].read16 = NULL; + m68k.memory_map[base + 0x02].write8 = m68k.memory_map[base + 0x03].write8 = NULL; + m68k.memory_map[base + 0x02].write16 = m68k.memory_map[base + 0x03].write16 = NULL; + zbank_memory_map[base + 0x02].read = zbank_memory_map[base + 0x03].read = NULL; + zbank_memory_map[base + 0x02].write = zbank_memory_map[base + 0x03].write = NULL; + } + else + { + /* $020000-$03FFFF (resp. $420000-$43FFFF) is not mapped */ + m68k.memory_map[base + 0x02].read8 = m68k.memory_map[base + 0x03].read8 = m68k_read_bus_8; + m68k.memory_map[base + 0x02].read16 = m68k.memory_map[base + 0x03].read16 = m68k_read_bus_16; + m68k.memory_map[base + 0x02].write8 = m68k.memory_map[base + 0x03].write8 = m68k_unused_w_8; + m68k.memory_map[base + 0x02].write16 = m68k.memory_map[base + 0x03].write16 = m68k_unused_w_16; + zbank_memory_map[base + 0x02].read = zbank_memory_map[base + 0x03].read = zbank_unused_r; + zbank_memory_map[base + 0x02].write = zbank_memory_map[base + 0x03].write = zbank_unused_w; + } + } + /* IFL2 bit */ if (data & 0x100) { diff --git a/core/mem68k.h b/core/mem68k.h index 1d8bc3b..eff1639 100644 --- a/core/mem68k.h +++ b/core/mem68k.h @@ -3,7 +3,7 @@ * Main 68k bus handlers * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) - * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) + * Copyright (C) 2007-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: