Merge pull request #679 from parasyte/bug/snes-compat-memory-domains-rebase

libsnes: Fix disassembler with compatibility core
This commit is contained in:
Paul Kratt 2016-08-09 21:00:38 -05:00 committed by GitHub
commit 4a2c58e1cb
8 changed files with 138 additions and 11 deletions

View File

@ -20,6 +20,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
eMessage_QUERY_library_revision_major,
eMessage_QUERY_library_revision_minor,
eMessage_QUERY_get_region,
eMessage_QUERY_get_mapper,
eMessage_QUERY_get_memory_size,
eMessage_QUERY_get_memory_data, //note: this function isnt used and hasnt been tested in a while
eMessage_QUERY_peek,
@ -187,6 +188,21 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
LOGICAL_REGS = 201
}
public enum SNES_MAPPER : byte
{
LOROM = 0,
HIROM = 1,
EXLOROM = 2,
EXHIROM = 3,
SUPERFXROM = 4,
SA1ROM = 5,
SPC7110ROM = 6,
BSCLOROM = 7,
BSCHIROM = 8,
BSXROM = 9,
STROM = 10
}
public enum SNES_REGION : byte
{
NTSC = 0,
@ -221,4 +237,4 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
JOYPAD_R = 11
}
}
}
}

View File

@ -32,6 +32,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
return (SNES_REGION)brPipe.ReadByte();
}
public SNES_MAPPER QUERY_get_mapper()
{
WritePipeMessage(eMessage.eMessage_QUERY_get_mapper);
return (SNES_MAPPER)brPipe.ReadByte();
}
public int QUERY_get_memory_size(SNES_MEMORY id)
{
WritePipeMessage(eMessage.eMessage_QUERY_get_memory_size);
@ -231,4 +237,4 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
}
}
}
}

View File

@ -480,9 +480,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
bool LoadCurrent()
{
bool result = false;
if (CurrLoadParams.type == LoadParamType.Normal)
return api.CMD_load_cartridge_normal(CurrLoadParams.xml_data, CurrLoadParams.rom_data);
else return api.CMD_load_cartridge_super_game_boy(CurrLoadParams.rom_xml, CurrLoadParams.rom_data, CurrLoadParams.rom_size, CurrLoadParams.dmg_xml, CurrLoadParams.dmg_data, CurrLoadParams.dmg_size);
result = api.CMD_load_cartridge_normal(CurrLoadParams.xml_data, CurrLoadParams.rom_data);
else result = api.CMD_load_cartridge_super_game_boy(CurrLoadParams.rom_xml, CurrLoadParams.rom_data, CurrLoadParams.rom_size, CurrLoadParams.dmg_xml, CurrLoadParams.dmg_data, CurrLoadParams.dmg_size);
mapper = api.QUERY_get_mapper();
return result;
}
/// <summary>
@ -1064,6 +1069,88 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
return null;
}
private LibsnesApi.SNES_MAPPER? mapper = null;
// works for ROM, garbage for anything else
byte FakeBusRead(int addr)
{
addr &= 0xffffff;
int bank = addr >> 16;
int low = addr & 0xffff;
if (!mapper.HasValue)
{
return 0;
}
switch (mapper)
{
case LibsnesApi.SNES_MAPPER.LOROM:
if (low >= 0x8000)
{
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
}
break;
case LibsnesApi.SNES_MAPPER.EXLOROM:
if ((bank >= 0x40 && bank <= 0x7f) || low >= 0x8000)
{
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
}
break;
case LibsnesApi.SNES_MAPPER.HIROM:
case LibsnesApi.SNES_MAPPER.EXHIROM:
if ((bank >= 0x40 && bank <= 0x7f) || bank >= 0xc0 || low >= 0x8000)
{
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
}
break;
case LibsnesApi.SNES_MAPPER.SUPERFXROM:
if ((bank >= 0x40 && bank <= 0x5f) || (bank >= 0xc0 && bank <= 0xdf) ||
(low >= 0x8000 && ((bank >= 0x00 && bank <= 0x3f) || (bank >= 0x80 && bank <= 0xbf))))
{
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
}
break;
case LibsnesApi.SNES_MAPPER.SA1ROM:
if (bank >= 0xc0 || (low >= 0x8000 && ((bank >= 0x00 && bank <= 0x3f) || (bank >= 0x80 && bank <= 0xbf))))
{
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
}
break;
case LibsnesApi.SNES_MAPPER.BSCLOROM:
if (low >= 0x8000 && ((bank >= 0x00 && bank <= 0x3f) || (bank >= 0x80 && bank <= 0xbf)))
{
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
}
break;
case LibsnesApi.SNES_MAPPER.BSCHIROM:
if ((bank >= 0x40 && bank <= 0x5f) || (bank >= 0xc0 && bank <= 0xdf) ||
(low >= 0x8000 && ((bank >= 0x00 && bank <= 0x1f) || (bank >= 0x80 && bank <= 0x9f))))
{
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
}
break;
case LibsnesApi.SNES_MAPPER.BSXROM:
if ((bank >= 0x40 && bank <= 0x7f) || bank >= 0xc0 ||
(low >= 0x8000 && ((bank >= 0x00 && bank <= 0x3f) || (bank >= 0x80 && bank <= 0xbf))) ||
(low >= 0x6000 && low <= 0x7fff && (bank >= 0x20 && bank <= 0x3f)))
{
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
}
break;
case LibsnesApi.SNES_MAPPER.STROM:
if (low >= 0x8000 && ((bank >= 0x00 && bank <= 0x5f) || (bank >= 0x80 && bank <= 0xdf)))
{
return api.QUERY_peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr);
}
break;
default:
throw new InvalidOperationException(string.Format("Unknown mapper: {0}", mapper));
}
return 0;
}
unsafe void MakeFakeBus()
{
int size = api.QUERY_get_memory_size(LibsnesApi.SNES_MEMORY.WRAM);
@ -1079,7 +1166,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
if (a.HasValue)
return blockptr[a.Value];
else
return 0;
return FakeBusRead((int)addr);
},
(addr, val) =>
{

View File

@ -26,6 +26,8 @@ struct Interface : public SNES::Interface {
uint32_t *buffer;
uint32_t *palette;
SnesCartridge cart;
//zero 11-sep-2012
time_t randomSeed() { return 0; }
@ -127,7 +129,8 @@ struct Interface : public SNES::Interface {
pallocSharedMemory(0),
pfreeSharedMemory(0),
backdropColor(-1),
ptrace(0)
ptrace(0),
cart(nullptr, 0)
{
buffer = new uint32_t[512 * 480];
palette = new uint32_t[16 * 32768];
@ -468,7 +471,8 @@ bool snes_load_cartridge_normal(
) {
snes_cheat_reset();
if(rom_data) SNES::cartridge.rom.copy(rom_data, rom_size);
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : SnesCartridge(rom_data, rom_size).markup;
iface->cart = SnesCartridge(rom_data, rom_size);
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : iface->cart.markup;
SNES::cartridge.load(SNES::Cartridge::Mode::Normal, { xmlrom });
SNES::system.power();
return true;
@ -480,7 +484,8 @@ bool snes_load_cartridge_bsx_slotted(
) {
snes_cheat_reset();
if(rom_data) SNES::cartridge.rom.copy(rom_data, rom_size);
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : SnesCartridge(rom_data, rom_size).markup;
iface->cart = SnesCartridge(rom_data, rom_size);
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : iface->cart.markup;
if(bsx_data) SNES::bsxflash.memory.copy(bsx_data, bsx_size);
string xmlbsx = (bsx_xml && *bsx_xml) ? string(bsx_xml) : SnesCartridge(bsx_data, bsx_size).markup;
SNES::cartridge.load(SNES::Cartridge::Mode::BsxSlotted, xmlrom);
@ -494,7 +499,8 @@ bool snes_load_cartridge_bsx(
) {
snes_cheat_reset();
if(rom_data) SNES::cartridge.rom.copy(rom_data, rom_size);
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : SnesCartridge(rom_data, rom_size).markup;
iface->cart = SnesCartridge(rom_data, rom_size);
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : iface->cart.markup;
if(bsx_data) SNES::bsxflash.memory.copy(bsx_data, bsx_size);
string xmlbsx = (bsx_xml && *bsx_xml) ? string(bsx_xml) : SnesCartridge(bsx_data, bsx_size).markup;
SNES::cartridge.load(SNES::Cartridge::Mode::Bsx, xmlrom);
@ -509,7 +515,8 @@ bool snes_load_cartridge_sufami_turbo(
) {
snes_cheat_reset();
if(rom_data) SNES::cartridge.rom.copy(rom_data, rom_size);
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : SnesCartridge(rom_data, rom_size).markup;
iface->cart = SnesCartridge(rom_data, rom_size);
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : iface->cart.markup;
if(sta_data) SNES::sufamiturbo.slotA.rom.copy(sta_data, sta_size);
string xmlsta = (sta_xml && *sta_xml) ? string(sta_xml) : SnesCartridge(sta_data, sta_size).markup;
if(stb_data) SNES::sufamiturbo.slotB.rom.copy(stb_data, stb_size);
@ -525,7 +532,8 @@ bool snes_load_cartridge_super_game_boy(
) {
snes_cheat_reset();
if(rom_data) SNES::cartridge.rom.copy(rom_data, rom_size);
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : SnesCartridge(rom_data, rom_size).markup;
iface->cart = SnesCartridge(rom_data, rom_size);
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : iface->cart.markup;
if(dmg_data) {
//GameBoyCartridge needs to modify dmg_data (for MMM01 emulation); so copy data
uint8_t *data = new uint8_t[dmg_size];
@ -547,6 +555,10 @@ bool snes_get_region(void) {
return SNES::system.region() == SNES::System::Region::NTSC ? 0 : 1;
}
char snes_get_mapper(void) {
return iface->cart.mapper;
}
uint8_t* snes_get_memory_data(unsigned id) {
if(SNES::cartridge.loaded() == false) return 0;

View File

@ -149,6 +149,7 @@ bool snes_load_cartridge_super_game_boy(
void snes_unload_cartridge(void);
bool snes_get_region(void);
char snes_get_mapper(void);
uint8_t* snes_get_memory_data(unsigned id);
const char* snes_get_memory_id_name(unsigned id);
unsigned snes_get_memory_size(unsigned id);

View File

@ -54,6 +54,7 @@ enum eMessage : int32
eMessage_QUERY_library_revision_major,
eMessage_QUERY_library_revision_minor,
eMessage_QUERY_get_region,
eMessage_QUERY_get_mapper,
eMessage_QUERY_get_memory_size,
eMessage_QUERY_get_memory_data, //note: this function isnt used and hasnt been tested in a while
eMessage_QUERY_peek,
@ -727,6 +728,10 @@ bool Handle_QUERY(eMessage msg)
WritePipe((char)snes_get_region());
break;
case eMessage_QUERY_get_mapper:
WritePipe(snes_get_mapper());
break;
case eMessage_QUERY_get_memory_size:
WritePipe((u32)snes_get_memory_size(ReadPipe<u32>()));
break;