Correctly emulate SRAM register in SSFII mapper.

NOTE: This fix re-uses the cart property cart.hw.bankswitch to store the bank that is swapped out for SRAM when the register is active. This is convenient since the bottom bank cannot be swapped out and we still want bankswitch to be non-zero
This commit is contained in:
alyosha-tas 2017-04-13 17:39:42 -04:00 committed by GitHub
parent 66ce06e80f
commit 8eda3dfe16
1 changed files with 53 additions and 14 deletions

View File

@ -723,7 +723,7 @@ void md_cart_reset(int hard_reset)
m68k.memory_map[i].base = cart.rom + ((i<<16) & cart.mask);
}
}
/* SVP chip */
if (svp)
{
@ -927,20 +927,59 @@ static void mapper_sega_w(uint32 data)
*/
static void mapper_ssf2_w(uint32 address, uint32 data)
{
/* 8 x 512k banks */
address = (address << 2) & 0x38;
/* bank 0 remains unchanged */
if (address)
{
uint32 i;
uint8 *src = cart.rom + (data << 19);
/* 8 x 512k banks */
address = (address << 2) & 0x38;
/* bank 0 remains unchanged */
if (address)
{
uint32 i;
uint8 *src = cart.rom + (data << 19);
for (i = 0; i<8; i++)
{
m68k.memory_map[address++].base = src + (i << 16);
}
}
else // emulate turning on SRAM
{
if (data & 1)
{
if (sram.on)
{
/* Backup RAM mapped to $200000-$20ffff (normally mirrored up to $3fffff but this breaks Sonic Megamix and no game need it) */
cart.hw.bankshift = m68k.memory_map[0x20].base;
m68k.memory_map[0x20].base = sram.sram;
m68k.memory_map[0x20].read8 = sram_read_byte;
m68k.memory_map[0x20].read16 = sram_read_word;
zbank_memory_map[0x20].read = sram_read_byte;
for (i=0; i<8; i++)
{
m68k.memory_map[address++].base = src + (i<<16);
}
}
/* Backup RAM write protection */
if (data & 2)
{
m68k.memory_map[0x20].write8 = m68k_unused_8_w;
m68k.memory_map[0x20].write16 = m68k_unused_16_w;
zbank_memory_map[0x20].write = zbank_unused_w;
}
else
{
m68k.memory_map[0x20].write8 = sram_write_byte;
m68k.memory_map[0x20].write16 = sram_write_word;
zbank_memory_map[0x20].write = sram_write_byte;
}
}
}
else
{
// automatically turn off writing to SRAM if SRAM is not visible
m68k.memory_map[0x20].write8 = m68k_unused_8_w;
m68k.memory_map[0x20].write16 = m68k_unused_16_w;
zbank_memory_map[0x20].write = zbank_unused_w;
// put the ROM data back in the memory map
m68k.memory_map[0x20].base = cart.hw.bankshift;
}
}
}
/*