Cleanup some GPGX stuff, fix system detection for archived roms

This commit is contained in:
CasualPokePlayer 2024-04-29 23:22:40 -07:00
parent 172f6cbbde
commit c41dea6683
3 changed files with 27 additions and 26 deletions

View File

@ -266,7 +266,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
[DisplayName("[SMS/GG] Load BIOS")]
[Description("Indicates whether to load the system BIOS rom.")]
[DefaultValue(false)]
public bool loadBIOS { get; set; }
public bool LoadBIOS { get; set; }
[DisplayName("[SMS] FM Sound Chip Type")]
[Description("Sets the method used to emulate the FM Sound Unit of the Sega Mark III/Master System. 'MAME' is fast and runs full speed on most systems.'Nuked' is cycle accurate, very high quality, and have substantial CPU requirements.")]
@ -339,7 +339,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
InputSystemA = SystemForSystem(ControlTypeLeft),
InputSystemB = SystemForSystem(ControlTypeRight),
Region = Region,
loadBIOS = loadBIOS,
LoadBIOS = LoadBIOS,
ForceSram = game["sram"],
SMSFMSoundChip = SMSFMSoundChip,
GenesisFMSoundChip = GenesisFMSoundChip,

View File

@ -38,14 +38,20 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
// Determining system ID from the rom. If no rom provided, assume Genesis (Sega CD)
SystemId = VSystemID.Raw.GEN;
var RomExtension = string.Empty;
var romExtension = "GEN";
if (lp.Roms.Count >= 1)
{
SystemId = lp.Roms[0].Game.System;
// We need to pass the exact file extension to GPGX for it to correctly interpret the console
RomExtension = Path.GetExtension(lp.Roms[0].RomPath).RemovePrefix('.');
romExtension = SystemId switch
{
VSystemID.Raw.GEN => "GEN",
VSystemID.Raw.SMS => "SMS",
VSystemID.Raw.GG => "GG",
VSystemID.Raw.SG => "SG",
_ => throw new InvalidOperationException("Invalid system id")
};
}
// three or six button?
// http://www.sega-16.com/forum/showthread.php?4398-Forgotten-Worlds-giving-you-GAME-OVER-immediately-Fix-inside&highlight=forgotten%20worlds
@ -97,18 +103,16 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
DriveLightEnabled = true;
}
LibGPGX.INPUT_SYSTEM system_a = SystemForSystem(_syncSettings.ControlTypeLeft);
LibGPGX.INPUT_SYSTEM system_b = SystemForSystem(_syncSettings.ControlTypeRight);
var initResult = Core.gpgx_init(RomExtension, LoadCallback, _syncSettings.GetNativeSettings(lp.Game));
var initSettings = _syncSettings.GetNativeSettings(lp.Game);
var initResult = Core.gpgx_init(romExtension, LoadCallback, ref initSettings);
if (!initResult)
{
throw new Exception($"{nameof(Core.gpgx_init)}() failed");
}
{
int fpsnum = 60;
int fpsden = 1;
Core.gpgx_get_fps(ref fpsnum, ref fpsden);
Core.gpgx_get_fps(out var fpsnum, out var fpsden);
VsyncNumerator = fpsnum;
VsyncDenominator = fpsden;
Region = VsyncNumerator / VsyncDenominator > 55 ? DisplayType.NTSC : DisplayType.PAL;
@ -137,7 +141,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
KillMemCallbacks();
_tracer = new GPGXTraceBuffer(this, _memoryDomains, this);
(ServiceProvider as BasicServiceProvider).Register<ITraceable>(_tracer);
((BasicServiceProvider)ServiceProvider).Register(_tracer);
}
_romfile = null;
@ -261,12 +265,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
if (firmwareID != null)
{
// this path will be the most common PEBKAC error, so be a bit more vocal about the problem
srcdata = CoreComm.CoreFileProvider.GetFirmware(firmwareID.Value, "GPGX firmwares are usually required.");
if (srcdata == null)
{
Console.WriteLine($"Frontend couldn't satisfy firmware request {firmwareID}");
return 0;
}
srcdata = CoreComm.CoreFileProvider.GetFirmwareOrThrow(firmwareID.Value, "GPGX firmwares are required.");
}
else
{
@ -384,7 +383,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
{
inputsize = Marshal.SizeOf(typeof(LibGPGX.InputData));
if (!Core.gpgx_get_control(input, inputsize))
{
throw new Exception($"{nameof(Core.gpgx_get_control)}() failed");
}
ControlConverter = new(input, systemId: SystemId, cdButtons: _cds is not null);
ControllerDefinition = ControlConverter.ControllerDef;

View File

@ -3,12 +3,12 @@ using System.Runtime.InteropServices;
using BizHawk.BizInvoke;
#pragma warning disable IDE1006
namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
{
public abstract class LibGPGX
{
public const string DllName = "libgenplusgx.dll";
[BizImport(CallingConvention.Cdecl)]
public abstract void gpgx_get_video(out int w, out int h, out int pitch, ref IntPtr buffer);
@ -31,7 +31,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
}
[StructLayout(LayoutKind.Sequential)]
public class InitSettings
public struct InitSettings
{
public uint BackdropColor;
public Region Region;
@ -73,17 +73,17 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
public GenesisFMSoundChipType GenesisFMSoundChip;
public bool SpritesAlwaysOnTop;
public bool loadBIOS;
public bool LoadBIOS;
}
[BizImport(CallingConvention.Cdecl)]
public abstract bool gpgx_init(
string feromextension,
load_archive_cb feload_archive_cb,
[In]InitSettings settings);
ref InitSettings settings);
[BizImport(CallingConvention.Cdecl)]
public abstract void gpgx_get_fps(ref int num, ref int den);
public abstract void gpgx_get_fps(out int num, out int den);
[BizImport(CallingConvention.Cdecl, Compatibility = true)]
public abstract bool gpgx_get_control([Out]InputData dest, int bytes);