mame: ram domains

This commit is contained in:
feos 2019-12-28 15:20:51 +03:00
parent 853af1c32a
commit 4ef8c8e34c
1 changed files with 74 additions and 23 deletions

View File

@ -298,7 +298,32 @@ namespace BizHawk.Emulation.Cores.Arcades.MAME
endian = MemoryDomain.Endian.Big;
}
domains.Add(new MemoryDomainDelegate("System Bus", size, endian,
if (LibMAME.mame_lua_get_bool("return true"))
{
int i = 0;
}
if (LibMAME.mame_lua_get_bool("return false"))
{
int i = 1;
}
var mapCount = LibMAME.mame_lua_get_int(MAMELuaCommand.GetSpaceMapCount);
for (int i = 1; i <= mapCount; i++)
{
var read = MameGetString($"{ MAMELuaCommand.SpaceMap }[{ i }].readtype");
var write = MameGetString($"{ MAMELuaCommand.SpaceMap }[{ i }].writetype");
if (LibMAME.mame_lua_get_bool(
$"local entry = { MAMELuaCommand.SpaceMap }[{ i }] " +
"return (entry.readtype == \"ram\" and entry.writetype == \"ram\")"))
{
var firstOffset = LibMAME.mame_lua_get_int($"return { MAMELuaCommand.SpaceMap }[{ i }].offset");
var lastOffset = LibMAME.mame_lua_get_int($"return { MAMELuaCommand.SpaceMap }[{ i }].endoff");
var name = $"RAM { firstOffset:X}-{ lastOffset:X}";
domains.Add(new MemoryDomainDelegate(name, lastOffset - firstOffset + 1, endian,
delegate (long addr)
{
if (addr < 0 || addr >= size)
@ -308,7 +333,8 @@ namespace BizHawk.Emulation.Cores.Arcades.MAME
_memAccess = true;
_mamePeriodicComplete.WaitOne();
var val = (byte)LibMAME.mame_lua_get_int(MAMELuaCommand.GetSpace + $":read_u8({ addr << _systemBusAddressShift })");
addr += firstOffset;
var val = (byte)LibMAME.mame_lua_get_int($"{ MAMELuaCommand.GetSpace }:read_u8({ addr << _systemBusAddressShift })");
_memoryAccessComplete.Set();
_memAccess = false;
return val;
@ -322,10 +348,30 @@ namespace BizHawk.Emulation.Cores.Arcades.MAME
_memAccess = true;
_mamePeriodicComplete.WaitOne();
LibMAME.mame_lua_execute(MAMELuaCommand.GetSpace + $":write_u8({ addr << _systemBusAddressShift }, { val })");
addr += firstOffset;
LibMAME.mame_lua_execute($"{ MAMELuaCommand.GetSpace }:write_u8({ addr << _systemBusAddressShift }, { val })");
_memoryAccessComplete.Set();
_memAccess = false;
}, dataWidth));
}
}
domains.Add(new MemoryDomainDelegate("System Bus", size, endian,
delegate (long addr)
{
if (addr < 0 || addr >= size)
{
throw new ArgumentOutOfRangeException();
}
_memAccess = true;
_mamePeriodicComplete.WaitOne();
var val = (byte)LibMAME.mame_lua_get_int($"{ MAMELuaCommand.GetSpace }:read_u8({ addr << _systemBusAddressShift })");
_memoryAccessComplete.Set();
_memAccess = false;
return val;
},
null, dataWidth));
_memoryDomains = new MemoryDomainList(domains);
(ServiceProvider as BasicServiceProvider).Register<IMemoryDomains>(_memoryDomains);
@ -637,6 +683,7 @@ namespace BizHawk.Emulation.Cores.Arcades.MAME
public const string Pause = "emu.pause()";
public const string Unpause = "emu.unpause()";
public const string Exit = "manager:machine():exit()";
public const string GetVersion = "return emu.app_version()";
public const string GetGameName = "return manager:machine():system().description";
public const string GetPixels = "return manager:machine():video():pixels()";
@ -645,11 +692,15 @@ namespace BizHawk.Emulation.Cores.Arcades.MAME
public const string GetRefresh = "return select(2, next(manager:machine().screens)):refresh_attoseconds()";
public const string GetWidth = "return (select(1, manager:machine():video():size()))";
public const string GetHeight = "return (select(2, manager:machine():video():size()))";
public const string GetSpace = "return manager:machine().devices[\":maincpu\"].spaces[\"program\"]";
public const string GetSpaceMapCount = "return #manager:machine().devices[\":maincpu\"].spaces[\"program\"].map";
public const string SpaceMap = "manager:machine().devices[\":maincpu\"].spaces[\"program\"].map";
public const string GetSpaceAddressMask = "return manager:machine().devices[\":maincpu\"].spaces[\"program\"].address_mask";
public const string GetSpaceAddressShift = "return manager:machine().devices[\":maincpu\"].spaces[\"program\"].shift";
public const string GetSpaceDataWidth = "return manager:machine().devices[\":maincpu\"].spaces[\"program\"].data_width";
public const string GetSpaceEndianness = "return manager:machine().devices[\":maincpu\"].spaces[\"program\"].endianness";
public const string GetBoundX =
"local x0,x1,y0,y1 = manager:machine():render():ui_target():view_bounds() " +
"return x1-x0";