mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-11-10 21:05:12 +01:00
[Core/CD] disabled 68k & Z80 access to PRG-RAM when SUB-CPU is running (proper fix for Dungeon Explorer USA version)
This commit is contained in:
parent
d11e0166fa
commit
e9e56c56b0
@ -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)
|
||||
{
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user