mame: another approach

This commit is contained in:
feos 2020-04-09 12:26:11 +03:00
parent 4f08496815
commit 039a4612a6
2 changed files with 41 additions and 32 deletions

View File

@ -13,10 +13,25 @@ namespace BizHawk.Emulation.Cores.Arcades.MAME
ERROR, WARNING, INFO, DEBUG, VERBOSE, LOG, COUNT
}
public enum SaveError
{
NONE, NOT_FOUND, ILLEGAL_REGISTRATIONS, INVALID_HEADER, READ_ERROR, WRITE_ERROR, DISABLED
};
#region C API
// main launcher
[DllImport(dll, CallingConvention = cc)]
public static extern UInt32 mame_launch(int argc, string[] argv);
public static extern uint mame_launch(int argc, string[] argv);
[DllImport(dll, CallingConvention = cc)]
public static extern SaveError mame_save_buffer(byte[] buf, out int length);
[DllImport(dll, CallingConvention = cc)]
public static extern SaveError mame_load_buffer(byte[] buf, int length);
#endregion
#region Lua API
// execute

View File

@ -19,7 +19,7 @@ namespace BizHawk.Emulation.Cores.Arcades.MAME
author: "MAMEDev",
isPorted: true,
isReleased: false,
portedVersion: "0.218",
portedVersion: "0.220",
portedUrl: "https://github.com/mamedev/mame.git",
singleInstance: false)]
public partial class MAME : IEmulator, IVideoProvider, ISoundProvider, ISettable<object, MAME.SyncSettings>, IStatable
@ -185,22 +185,20 @@ namespace BizHawk.Emulation.Cores.Arcades.MAME
_memAccess = true;
_mamePeriodicComplete.WaitOne();
IntPtr ptr = LibMAME.mame_lua_get_string("return manager:machine():buffer_save()", out var lengthInBytes);
if (ptr == IntPtr.Zero)
{
Console.WriteLine("LibMAME ERROR: audio buffer pointer is null");
return;
}
Marshal.Copy(ptr, _mameSaveBuffer, 0, lengthInBytes);
if (!LibMAME.mame_lua_free_string(ptr))
{
Console.WriteLine("LibMAME ERROR: audio buffer wasn't freed");
}
writer.Write(_mameSaveBuffer.Length);
LibMAME.SaveError err = LibMAME.mame_save_buffer(_mameSaveBuffer, out int length);
if (length != _mameSaveBuffer.Length)
{
throw new InvalidOperationException("Savestate buffer size mismatch!");
}
if (err != LibMAME.SaveError.NONE)
{
throw new InvalidOperationException("MAME LOADSTATE ERROR: " + err.ToString());
}
writer.Write(_mameSaveBuffer);
writer.Write(Frame);
@ -221,19 +219,15 @@ namespace BizHawk.Emulation.Cores.Arcades.MAME
}
reader.Read(_mameSaveBuffer, 0, _mameSaveBuffer.Length);
LibMAME.SaveError err = LibMAME.mame_load_buffer(_mameSaveBuffer, _mameSaveBuffer.Length);
if (err != LibMAME.SaveError.NONE)
{
throw new InvalidOperationException("MAME SAVESTATE ERROR: " + err.ToString());
}
Frame = reader.ReadInt32();
string start = "manager:machine():buffer_load(\"";
string end = "\")";
byte[] command = new byte[start.Length + _mameSaveBuffer.Length + end.Length];
System.Buffer.BlockCopy(Encoding.ASCII.GetBytes(start), 0, command, 0, start.Length);
System.Buffer.BlockCopy(_mameSaveBuffer, 0, command, start.Length, _mameSaveBuffer.Length);
System.Buffer.BlockCopy(Encoding.ASCII.GetBytes(end), 0, command, start.Length + _mameSaveBuffer.Length, end.Length);
LibMAME.mame_lua_execute(command);
_memoryAccessComplete.Set();
_memAccess = false;
}
@ -711,9 +705,9 @@ namespace BizHawk.Emulation.Cores.Arcades.MAME
UpdateGameName();
InitMemoryDomains();
IntPtr ptr = LibMAME.mame_lua_get_string("return manager:machine():buffer_save()", out var lengthInBytes);
_mameSaveBuffer = new byte[lengthInBytes];
_hawkSaveBuffer = new byte[lengthInBytes + 4 + 4];
int length = LibMAME.mame_lua_get_int("return string.len(manager:machine():buffer_save())");
_mameSaveBuffer = new byte[length];
_hawkSaveBuffer = new byte[length + 4 + 4];
_mameStartupComplete.Set();
}