picodrive: region select. closes #929
This commit is contained in:
parent
3ca8f9da9f
commit
569730a61b
|
@ -1690,10 +1690,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
switch (system)
|
switch (system)
|
||||||
{
|
{
|
||||||
case "GEN":
|
case "GEN":
|
||||||
if (!(Emulator is PicoDrive)) // Currently PicoDrive doesn't support anything in this menu
|
GenesisSubMenu.Visible = true;
|
||||||
{
|
|
||||||
GenesisSubMenu.Visible = true;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case "TI83":
|
case "TI83":
|
||||||
TI83SubMenu.Visible = true;
|
TI83SubMenu.Visible = true;
|
||||||
|
@ -3355,7 +3352,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
AbortAv();
|
AbortAv();
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE_AUTODUMP:
|
HANDLE_AUTODUMP:
|
||||||
if (argParse._autoDumpLength > 0)
|
if (argParse._autoDumpLength > 0)
|
||||||
{
|
{
|
||||||
argParse._autoDumpLength--;
|
argParse._autoDumpLength--;
|
||||||
|
@ -3544,7 +3541,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
|
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
|
|
||||||
string loaderName = "*" + OpenAdvancedSerializer.Serialize(ioa);
|
string loaderName = "*" + OpenAdvancedSerializer.Serialize(ioa);
|
||||||
Emulator = loader.LoadedEmulator;
|
Emulator = loader.LoadedEmulator;
|
||||||
Global.Game = loader.Game;
|
Global.Game = loader.Game;
|
||||||
|
|
|
@ -20,6 +20,15 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive
|
||||||
[UnmanagedFunctionPointer(CC)]
|
[UnmanagedFunctionPointer(CC)]
|
||||||
public delegate void CDReadCallback(int lba, IntPtr dest, bool audio);
|
public delegate void CDReadCallback(int lba, IntPtr dest, bool audio);
|
||||||
|
|
||||||
|
public enum Region : int
|
||||||
|
{
|
||||||
|
Auto = 0,
|
||||||
|
JapanNTSC = 1,
|
||||||
|
JapanPAL = 2,
|
||||||
|
US = 4,
|
||||||
|
Europe = 8
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -28,7 +37,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive
|
||||||
/// 32X games will still run, but will not have memory domains</param>
|
/// 32X games will still run, but will not have memory domains</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[BizImport(CC)]
|
[BizImport(CC)]
|
||||||
public abstract bool Init(bool cd, bool _32xPreinit);
|
public abstract bool Init(bool cd, bool _32xPreinit, Region regionAutoOrder, Region regionOverride);
|
||||||
|
|
||||||
[BizImport(CC)]
|
[BizImport(CC)]
|
||||||
public abstract void SetCDReadCallback(CDReadCallback callback);
|
public abstract void SetCDReadCallback(CDReadCallback callback);
|
||||||
|
|
|
@ -8,12 +8,14 @@ using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using BizHawk.Common;
|
||||||
|
using System.ComponentModel;
|
||||||
|
|
||||||
namespace BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive
|
namespace BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive
|
||||||
{
|
{
|
||||||
[Core("PicoDrive", "notaz", true, true,
|
[Core("PicoDrive", "notaz", true, true,
|
||||||
"0e352905c7aa80b166933970abbcecfce96ad64e", "https://github.com/notaz/picodrive", false)]
|
"0e352905c7aa80b166933970abbcecfce96ad64e", "https://github.com/notaz/picodrive", false)]
|
||||||
public class PicoDrive : WaterboxCore, IDriveLight, IRegionable
|
public class PicoDrive : WaterboxCore, IDriveLight, IRegionable, ISettable<object, PicoDrive.SyncSettings>
|
||||||
{
|
{
|
||||||
private LibPicoDrive _core;
|
private LibPicoDrive _core;
|
||||||
private LibPicoDrive.CDReadCallback _cdcallback;
|
private LibPicoDrive.CDReadCallback _cdcallback;
|
||||||
|
@ -22,15 +24,15 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive
|
||||||
private bool _isPal;
|
private bool _isPal;
|
||||||
|
|
||||||
[CoreConstructor("GEN")]
|
[CoreConstructor("GEN")]
|
||||||
public PicoDrive(CoreComm comm, GameInfo game, byte[] rom, bool deterministic)
|
public PicoDrive(CoreComm comm, GameInfo game, byte[] rom, bool deterministic, SyncSettings syncSettings)
|
||||||
:this(comm, game, rom, null, deterministic)
|
: this(comm, game, rom, null, deterministic, syncSettings)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public PicoDrive(CoreComm comm, GameInfo game, Disc cd, bool deterministic)
|
public PicoDrive(CoreComm comm, GameInfo game, Disc cd, bool deterministic, SyncSettings syncSettings)
|
||||||
:this(comm, game, null, cd, deterministic)
|
: this(comm, game, null, cd, deterministic, syncSettings)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
private PicoDrive(CoreComm comm, GameInfo game, byte[] rom, Disc cd, bool deterministic)
|
private PicoDrive(CoreComm comm, GameInfo game, byte[] rom, Disc cd, bool deterministic, SyncSettings syncSettings)
|
||||||
: base(comm, new Configuration
|
: base(comm, new Configuration
|
||||||
{
|
{
|
||||||
MaxSamples = 2048,
|
MaxSamples = 2048,
|
||||||
|
@ -49,6 +51,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive
|
||||||
throw new InvalidOperationException("32X BIOS files are required for deterministic mode");
|
throw new InvalidOperationException("32X BIOS files are required for deterministic mode");
|
||||||
deterministic |= has32xBios;
|
deterministic |= has32xBios;
|
||||||
|
|
||||||
|
_syncSettings = syncSettings ?? new SyncSettings();
|
||||||
|
|
||||||
_core = PreInit<LibPicoDrive>(new PeRunnerOptions
|
_core = PreInit<LibPicoDrive>(new PeRunnerOptions
|
||||||
{
|
{
|
||||||
Filename = "picodrive.wbx",
|
Filename = "picodrive.wbx",
|
||||||
|
@ -83,7 +87,12 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive
|
||||||
_exe.AddReadonlyFile(rom, "romfile.md");
|
_exe.AddReadonlyFile(rom, "romfile.md");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_core.Init(cd != null, game["32X"]))
|
var regionAutoOrder = (LibPicoDrive.Region)(
|
||||||
|
(int)_syncSettings.FirstChoice |
|
||||||
|
(int)_syncSettings.SecondChoice << 4 |
|
||||||
|
(int)_syncSettings.ThirdChoice << 8);
|
||||||
|
|
||||||
|
if (!_core.Init(cd != null, game["32X"], regionAutoOrder, _syncSettings.RegionOverride))
|
||||||
throw new InvalidOperationException("Core rejected the file!");
|
throw new InvalidOperationException("Core rejected the file!");
|
||||||
|
|
||||||
if (cd != null)
|
if (cd != null)
|
||||||
|
@ -174,6 +183,68 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive
|
||||||
_core.SetCDReadCallback(_cdcallback);
|
_core.SetCDReadCallback(_cdcallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region ISettable
|
||||||
|
|
||||||
|
public class SyncSettings
|
||||||
|
{
|
||||||
|
[DefaultValue(LibPicoDrive.Region.Auto)]
|
||||||
|
[Description("If set, force the console to this region")]
|
||||||
|
public LibPicoDrive.Region RegionOverride { get; set; }
|
||||||
|
|
||||||
|
[DefaultValue(LibPicoDrive.Region.Auto)]
|
||||||
|
[Description("When region is set to automatic, highest priority region to use if the game supports multiple regions")]
|
||||||
|
public LibPicoDrive.Region FirstChoice { get; set; }
|
||||||
|
|
||||||
|
[DefaultValue(LibPicoDrive.Region.Auto)]
|
||||||
|
[Description("When region is set to automatic, second highest priority region to use if the game supports multiple regions")]
|
||||||
|
public LibPicoDrive.Region SecondChoice { get; set; }
|
||||||
|
|
||||||
|
[DefaultValue(LibPicoDrive.Region.Auto)]
|
||||||
|
[Description("When region is set to automatic, lowest priority region to use if the game supports multiple regions")]
|
||||||
|
public LibPicoDrive.Region ThirdChoice { get; set; }
|
||||||
|
|
||||||
|
public SyncSettings Clone()
|
||||||
|
{
|
||||||
|
return (SyncSettings)MemberwiseClone();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool NeedsReboot(SyncSettings x, SyncSettings y)
|
||||||
|
{
|
||||||
|
return !DeepEquality.DeepEquals(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SyncSettings()
|
||||||
|
{
|
||||||
|
SettingsUtil.SetDefaultValues(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private SyncSettings _syncSettings;
|
||||||
|
|
||||||
|
public object GetSettings()
|
||||||
|
{
|
||||||
|
return new object();
|
||||||
|
}
|
||||||
|
|
||||||
|
public SyncSettings GetSyncSettings()
|
||||||
|
{
|
||||||
|
return _syncSettings.Clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool PutSettings(object o)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool PutSyncSettings(SyncSettings o)
|
||||||
|
{
|
||||||
|
var ret = SyncSettings.NeedsReboot(_syncSettings, o);
|
||||||
|
_syncSettings = o;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region IDriveLight
|
#region IDriveLight
|
||||||
|
|
||||||
public bool DriveLightEnabled { get; private set; }
|
public bool DriveLightEnabled { get; private set; }
|
||||||
|
|
Binary file not shown.
|
@ -138,8 +138,11 @@ static const uint8_t *TryLoadBios(const char *name)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ECL_EXPORT int Init(int cd, int _32xPreinit)
|
ECL_EXPORT int Init(int cd, int _32xPreinit, int regionAutoOrder, int regionOverride)
|
||||||
{
|
{
|
||||||
|
PicoAutoRgnOrder = regionAutoOrder;
|
||||||
|
PicoRegionOverride = regionOverride;
|
||||||
|
|
||||||
p32x_bios_g = TryLoadBios("32x.g");
|
p32x_bios_g = TryLoadBios("32x.g");
|
||||||
p32x_bios_m = TryLoadBios("32x.m");
|
p32x_bios_m = TryLoadBios("32x.m");
|
||||||
p32x_bios_s = TryLoadBios("32x.s");
|
p32x_bios_s = TryLoadBios("32x.s");
|
||||||
|
|
Loading…
Reference in New Issue