fix up some stuff in the libretro wrapper. still doesn't do much
This commit is contained in:
parent
87f8d13ca5
commit
9ce2920d16
|
@ -3305,6 +3305,13 @@ namespace BizHawk.Client.EmuHawk
|
||||||
}
|
}
|
||||||
nextEmulator = new N64(nextComm, game, rom.RomData, video_settings, SaveType);
|
nextEmulator = new N64(nextComm, game, rom.RomData, video_settings, SaveType);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "DEBUG":
|
||||||
|
if (VersionInfo.INTERIM)
|
||||||
|
{
|
||||||
|
nextEmulator = LibRetroEmulator.CreateDebug(nextComm, rom.RomData);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -178,6 +178,10 @@ namespace BizHawk.Emulation.Common
|
||||||
case ".N64":
|
case ".N64":
|
||||||
Game.System = "N64";
|
Game.System = "N64";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ".DEBUG":
|
||||||
|
Game.System = "DEBUG";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Game.Name = Path.GetFileNameWithoutExtension(fileName).Replace('_', ' ');
|
Game.Name = Path.GetFileNameWithoutExtension(fileName).Replace('_', ' ');
|
||||||
|
|
|
@ -312,9 +312,9 @@ namespace BizHawk.Emulation.Common
|
||||||
public string library_name;
|
public string library_name;
|
||||||
public string library_version;
|
public string library_version;
|
||||||
public string valid_extensions;
|
public string valid_extensions;
|
||||||
[MarshalAs(UnmanagedType.U8)]
|
[MarshalAs(UnmanagedType.U1)]
|
||||||
public bool need_fullpath;
|
public bool need_fullpath;
|
||||||
[MarshalAs(UnmanagedType.U8)]
|
[MarshalAs(UnmanagedType.U1)]
|
||||||
public bool block_extract;
|
public bool block_extract;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -355,7 +355,7 @@ namespace BizHawk.Emulation.Common
|
||||||
|
|
||||||
// standard callbacks
|
// standard callbacks
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
[return:MarshalAs(UnmanagedType.U8)]
|
[return:MarshalAs(UnmanagedType.U1)]
|
||||||
public delegate bool retro_environment_t(RETRO_ENVIRONMENT cmd, IntPtr data);
|
public delegate bool retro_environment_t(RETRO_ENVIRONMENT cmd, IntPtr data);
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
public delegate void retro_video_refresh_t(IntPtr data, uint width, uint height, uint pitch);
|
public delegate void retro_video_refresh_t(IntPtr data, uint width, uint height, uint pitch);
|
||||||
|
@ -400,20 +400,20 @@ namespace BizHawk.Emulation.Common
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
public delegate uint epretro_serialize_size();
|
public delegate uint epretro_serialize_size();
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
[return: MarshalAs(UnmanagedType.U8)]
|
[return: MarshalAs(UnmanagedType.U1)]
|
||||||
public delegate bool epretro_serialize(IntPtr data, uint size);
|
public delegate bool epretro_serialize(IntPtr data, uint size);
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
[return: MarshalAs(UnmanagedType.U8)]
|
[return: MarshalAs(UnmanagedType.U1)]
|
||||||
public delegate bool epretro_unserialize(IntPtr data, uint size);
|
public delegate bool epretro_unserialize(IntPtr data, uint size);
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
public delegate void epretro_cheat_reset();
|
public delegate void epretro_cheat_reset();
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
public delegate void epretro_cheat_set(uint index, [MarshalAs(UnmanagedType.U8)]bool enabled, string code);
|
public delegate void epretro_cheat_set(uint index, [MarshalAs(UnmanagedType.U1)]bool enabled, string code);
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
[return: MarshalAs(UnmanagedType.U8)]
|
[return: MarshalAs(UnmanagedType.U1)]
|
||||||
public delegate bool epretro_load_game(ref retro_game_info game);
|
public delegate bool epretro_load_game(ref retro_game_info game);
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
[return: MarshalAs(UnmanagedType.U8)]
|
[return: MarshalAs(UnmanagedType.U1)]
|
||||||
public delegate bool epretro_load_game_special(uint game_type, ref retro_game_info info, uint num_info);
|
public delegate bool epretro_load_game_special(uint game_type, ref retro_game_info info, uint num_info);
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
public delegate void epretro_unload_game();
|
public delegate void epretro_unload_game();
|
||||||
|
|
|
@ -37,7 +37,9 @@ namespace BizHawk.Emulation.Common
|
||||||
case LibRetro.RETRO_ENVIRONMENT.SET_PIXEL_FORMAT:
|
case LibRetro.RETRO_ENVIRONMENT.SET_PIXEL_FORMAT:
|
||||||
{
|
{
|
||||||
LibRetro.RETRO_PIXEL_FORMAT fmt = 0;
|
LibRetro.RETRO_PIXEL_FORMAT fmt = 0;
|
||||||
Marshal.PtrToStructure(data, fmt);
|
int[] tmp = new int[1];
|
||||||
|
Marshal.Copy(data, tmp, 0, 1);
|
||||||
|
fmt = (LibRetro.RETRO_PIXEL_FORMAT)tmp[0];
|
||||||
switch (fmt)
|
switch (fmt)
|
||||||
{
|
{
|
||||||
case LibRetro.RETRO_PIXEL_FORMAT.RGB565:
|
case LibRetro.RETRO_PIXEL_FORMAT.RGB565:
|
||||||
|
@ -103,6 +105,29 @@ namespace BizHawk.Emulation.Common
|
||||||
|
|
||||||
private LibRetro retro;
|
private LibRetro retro;
|
||||||
|
|
||||||
|
public static LibRetroEmulator CreateDebug(CoreComm nextComm, byte[] debugfile)
|
||||||
|
{
|
||||||
|
System.IO.TextReader tr = new System.IO.StreamReader(new System.IO.MemoryStream(debugfile, false));
|
||||||
|
string modulename = tr.ReadLine();
|
||||||
|
string romname = tr.ReadLine();
|
||||||
|
|
||||||
|
byte[] romdata = System.IO.File.ReadAllBytes(romname);
|
||||||
|
|
||||||
|
var emu = new LibRetroEmulator(nextComm, modulename);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!emu.Load(romdata))
|
||||||
|
throw new Exception("LibRetroEmulator.Load() failed");
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
emu.Dispose();
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
return emu;
|
||||||
|
}
|
||||||
|
|
||||||
public LibRetroEmulator(CoreComm nextComm, string modulename)
|
public LibRetroEmulator(CoreComm nextComm, string modulename)
|
||||||
{
|
{
|
||||||
retro_environment_cb = new LibRetro.retro_environment_t(retro_environment);
|
retro_environment_cb = new LibRetro.retro_environment_t(retro_environment);
|
||||||
|
@ -113,27 +138,35 @@ namespace BizHawk.Emulation.Common
|
||||||
retro_input_state_cb = new LibRetro.retro_input_state_t(retro_input_state);
|
retro_input_state_cb = new LibRetro.retro_input_state_t(retro_input_state);
|
||||||
|
|
||||||
retro = new LibRetro(modulename);
|
retro = new LibRetro(modulename);
|
||||||
CoreComm = nextComm;
|
try
|
||||||
|
{
|
||||||
|
CoreComm = nextComm;
|
||||||
|
|
||||||
retro.retro_set_environment(retro_environment_cb);
|
LibRetro.retro_system_info sys = new LibRetro.retro_system_info();
|
||||||
retro.retro_init();
|
retro.retro_get_system_info(ref sys);
|
||||||
retro.retro_set_video_refresh(retro_video_refresh_cb);
|
|
||||||
retro.retro_set_audio_sample(retro_audio_sample_cb);
|
if (sys.need_fullpath)
|
||||||
retro.retro_set_audio_sample_batch(retro_audio_sample_batch_cb);
|
throw new ArgumentException("This libretro core needs filepaths");
|
||||||
retro.retro_set_input_poll(retro_input_poll_cb);
|
if (sys.block_extract)
|
||||||
retro.retro_set_input_state(retro_input_state_cb);
|
throw new ArgumentException("This libretro needs non-blocked extract");
|
||||||
|
|
||||||
|
retro.retro_set_environment(retro_environment_cb);
|
||||||
|
retro.retro_init();
|
||||||
|
retro.retro_set_video_refresh(retro_video_refresh_cb);
|
||||||
|
retro.retro_set_audio_sample(retro_audio_sample_cb);
|
||||||
|
retro.retro_set_audio_sample_batch(retro_audio_sample_batch_cb);
|
||||||
|
retro.retro_set_input_poll(retro_input_poll_cb);
|
||||||
|
retro.retro_set_input_state(retro_input_state_cb);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
retro.Dispose();
|
||||||
|
throw;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Load(byte[] data)
|
public bool Load(byte[] data)
|
||||||
{
|
{
|
||||||
LibRetro.retro_system_info sys = new LibRetro.retro_system_info();
|
|
||||||
retro.retro_get_system_info(ref sys);
|
|
||||||
|
|
||||||
if (sys.need_fullpath)
|
|
||||||
throw new ArgumentException("This libretro core needs filepaths");
|
|
||||||
if (sys.block_extract)
|
|
||||||
throw new ArgumentException("This libretro needs non-blocked extract");
|
|
||||||
|
|
||||||
LibRetro.retro_game_info gi = new LibRetro.retro_game_info();
|
LibRetro.retro_game_info gi = new LibRetro.retro_game_info();
|
||||||
fixed (byte* p = &data[0])
|
fixed (byte* p = &data[0])
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue