[MAME] Fix System Bus causing desyncs

This commit is contained in:
CasualPokePlayer 2024-03-28 17:58:34 -07:00
parent 22cbacd388
commit be6647f10c
1 changed files with 20 additions and 14 deletions

View File

@ -68,16 +68,12 @@ namespace BizHawk.Emulation.Cores.Arcades.MAME
var deviceName = MameGetString(MAMELuaCommand.GetMainCPUName);
//var addrSize = (size * 2).ToString();
var endian = MemoryDomain.Endian.Unknown;
if (endianString == "little")
var endian = endianString switch
{
endian = MemoryDomain.Endian.Little;
}
else if (endianString == "big")
{
endian = MemoryDomain.Endian.Big;
}
"little" => MemoryDomain.Endian.Little,
"big" => MemoryDomain.Endian.Big,
_ => MemoryDomain.Endian.Unknown
};
var mapCount = _core.mame_lua_get_int(MAMELuaCommand.GetSpaceMapCount);
@ -86,23 +82,33 @@ namespace BizHawk.Emulation.Cores.Arcades.MAME
var read = MameGetString($"return { MAMELuaCommand.SpaceMap }[{ i }].read.handlertype");
var write = MameGetString($"return { MAMELuaCommand.SpaceMap }[{ i }].write.handlertype");
if (read == "ram" && write == "ram" || read == "rom")
if (read is "ram" or "rom")
{
var firstOffset = _core.mame_lua_get_int($"return { MAMELuaCommand.SpaceMap }[{ i }].address_start");
var lastOffset = _core.mame_lua_get_int($"return { MAMELuaCommand.SpaceMap }[{ i }].address_end");
var name = $"{ deviceName } : { read } : 0x{ firstOffset:X}-0x{ lastOffset:X}";
domains.Add(new MAMEMemoryDomain(name, lastOffset - firstOffset + 1, endian,
dataWidth, read != "rom", _core, _exe, firstOffset, systemBusAddressShift, size));
dataWidth, write == "ram", _core, _exe, firstOffset, systemBusAddressShift, size));
}
}
domains.Add(new MAMEMemoryDomain(deviceName + " : System Bus", size, endian, dataWidth, false, _core, _exe, 0, systemBusAddressShift, size));
// don't allow raw system bus to be added if we want deterministic emulation (as many regions have side effects)
// (regions without side effects are covered in other domains anyways)
if (!DeterministicEmulation)
{
domains.Add(new MAMEMemoryDomain(deviceName + " : System Bus", size, endian, dataWidth, false, _core, _exe, 0, systemBusAddressShift, size));
}
domains.Add(_exe.GetPagesDomain());
_memoryDomains = new(domains);
_memoryDomains.SystemBus = _memoryDomains[deviceName + " : System Bus"];
(ServiceProvider as BasicServiceProvider).Register<IMemoryDomains>(_memoryDomains);
if (!DeterministicEmulation)
{
_memoryDomains.SystemBus = _memoryDomains[deviceName + " : System Bus"]!;
}
((BasicServiceProvider)ServiceProvider).Register<IMemoryDomains>(_memoryDomains);
}
}
}