Refactor `IGameboyCommon.IsCGBMode`

This commit is contained in:
YoshiRulz 2022-12-20 18:47:11 +10:00
parent a54c94230f
commit 7703ee5f37
No known key found for this signature in database
GPG Key ID: C4DE31C245353FB7
14 changed files with 63 additions and 56 deletions

View File

@ -253,10 +253,8 @@ namespace BizHawk.Client.Common
if (emulator is IGameboyCommon gb) if (emulator is IGameboyCommon gb)
{ {
if (gb.IsCGBMode()) //TODO doesn't IsCGBDMGMode imply IsCGBMode?
{ if (gb.IsCGBMode) movie.HeaderEntries.Add(gb.IsCGBDMGMode ? "IsCGBDMGMode" : "IsCGBMode", "1");
movie.HeaderEntries.Add(gb.IsCGBDMGMode() ? "IsCGBDMGMode" : "IsCGBMode", "1");
}
} }
if (emulator is SMS sms) if (emulator is SMS sms)

View File

@ -2065,7 +2065,7 @@ namespace BizHawk.Client.EmuHawk
case VSystemID.Raw.GBC: case VSystemID.Raw.GBC:
case VSystemID.Raw.SGB when Emulator is Gameboy: case VSystemID.Raw.SGB when Emulator is Gameboy:
GBSubMenu.Visible = true; GBSubMenu.Visible = true;
SameBoyColorChooserMenuItem.Visible = Emulator is Sameboy sameboy && !sameboy.IsCGBMode(); // palette config only works in DMG mode SameBoyColorChooserMenuItem.Visible = Emulator is Sameboy { IsCGBMode: false }; // palette config only works in DMG mode
break; break;
case VSystemID.Raw.SGB when Emulator is BsnesCore or SubBsnesCore: case VSystemID.Raw.SGB when Emulator is BsnesCore or SubBsnesCore:
case VSystemID.Raw.SNES when Emulator is LibsnesCore { IsSGB: true }: // doesn't use "SGB" sysID case VSystemID.Raw.SNES when Emulator is LibsnesCore { IsSGB: true }: // doesn't use "SGB" sysID

View File

@ -3,11 +3,6 @@ using BizHawk.Emulation.Cores.Atari.Jaguar;
using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy; using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy;
using BizHawk.Emulation.Cores.Consoles.Sega.gpgx; using BizHawk.Emulation.Cores.Consoles.Sega.gpgx;
using BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive; using BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive;
using BizHawk.Emulation.Cores.Nintendo.BSNES;
using BizHawk.Emulation.Cores.Nintendo.Gameboy;
using BizHawk.Emulation.Cores.Nintendo.GBHawkLink;
using BizHawk.Emulation.Cores.Nintendo.GBHawkLink3x;
using BizHawk.Emulation.Cores.Nintendo.GBHawkLink4x;
using BizHawk.Emulation.Cores.Nintendo.SNES; using BizHawk.Emulation.Cores.Nintendo.SNES;
namespace BizHawk.Client.EmuHawk namespace BizHawk.Client.EmuHawk
@ -114,19 +109,12 @@ namespace BizHawk.Client.EmuHawk
VSystemID.Raw.DEBUG => ConsoleID.UnknownConsoleID, VSystemID.Raw.DEBUG => ConsoleID.UnknownConsoleID,
VSystemID.Raw.Dreamcast => ConsoleID.Dreamcast, VSystemID.Raw.Dreamcast => ConsoleID.Dreamcast,
VSystemID.Raw.GameCube => ConsoleID.GameCube, VSystemID.Raw.GameCube => ConsoleID.GameCube,
VSystemID.Raw.GB when Emu is IGameboyCommon gb => gb.IsCGBMode() ? ConsoleID.GBC : ConsoleID.GB, VSystemID.Raw.GB when Emu is IGameboyCommon { IsCGBMode: true } => ConsoleID.GBC,
VSystemID.Raw.GB => ConsoleID.GB,
VSystemID.Raw.GBA => ConsoleID.GBA, VSystemID.Raw.GBA => ConsoleID.GBA,
VSystemID.Raw.GBC => ConsoleID.GBC, // Not actually used VSystemID.Raw.GBC => ConsoleID.GBC, // Not actually used
VSystemID.Raw.GBL => Emu switch // actually can be a mix of GB and GBC VSystemID.Raw.GBL when Emu is ILinkedGameBoyCommon { First: { IsCGBMode: true } } => ConsoleID.GBC,
{ VSystemID.Raw.GBL => ConsoleID.GB, // actually can be a mix of GB and GBC
// there's probably a better way for all this
GambatteLink gb => gb.IsCGBMode(0) ? ConsoleID.GBC : ConsoleID.GB,
// WHY ARE THESE PUBLIC???
GBHawkLink gb => gb.L.IsCGBMode() ? ConsoleID.GBC : ConsoleID.GB,
GBHawkLink3x gb => gb.L.IsCGBMode() ? ConsoleID.GBC : ConsoleID.GB,
GBHawkLink4x gb => gb.A.IsCGBMode() ? ConsoleID.GBC : ConsoleID.GB,
_ => ConsoleID.UnknownConsoleID,
},
VSystemID.Raw.GEN when Emu is GPGX gpgx => gpgx.IsMegaCD ? ConsoleID.SegaCD : ConsoleID.MegaDrive, VSystemID.Raw.GEN when Emu is GPGX gpgx => gpgx.IsMegaCD ? ConsoleID.SegaCD : ConsoleID.MegaDrive,
VSystemID.Raw.GEN when Emu is PicoDrive pico => pico.Is32XActive ? ConsoleID.Sega32X : ConsoleID.MegaDrive, VSystemID.Raw.GEN when Emu is PicoDrive pico => pico.Is32XActive ? ConsoleID.Sega32X : ConsoleID.MegaDrive,
VSystemID.Raw.GG => ConsoleID.GameGear, VSystemID.Raw.GG => ConsoleID.GameGear,

View File

@ -94,7 +94,7 @@ namespace BizHawk.Client.EmuHawk
public override void Restart() public override void Restart()
{ {
_cgb = Gb.IsCGBMode(); _cgb = Gb.IsCGBMode;
_lcdc = 0; _lcdc = 0;
label4.Enabled = _cgb; label4.Enabled = _cgb;

View File

@ -226,9 +226,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
DeterministicEmulation = true; DeterministicEmulation = true;
} }
public bool IsCGBMode() => is_GBC; public bool IsCGBMode
=> is_GBC; //TODO inline
public bool IsCGBDMGMode() => is_GB_in_GBC; public bool IsCGBDMGMode
=> is_GB_in_GBC; //TODO inline
/// <summary> /// <summary>
/// Produces a palette in the form that certain frontend inspection tools. /// Produces a palette in the form that certain frontend inspection tools.

View File

@ -1,5 +1,6 @@
using System; using System;
using BizHawk.Emulation.Common; using BizHawk.Emulation.Common;
using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy;
using BizHawk.Emulation.Cores.Nintendo.GBHawk; using BizHawk.Emulation.Cores.Nintendo.GBHawk;
namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
@ -7,13 +8,17 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
[Core(CoreNames.GBHawkLink, "")] [Core(CoreNames.GBHawkLink, "")]
[ServiceNotApplicable(new[] { typeof(IDriveLight) })] [ServiceNotApplicable(new[] { typeof(IDriveLight) })]
public partial class GBHawkLink : IEmulator, ISaveRam, IDebuggable, IStatable, IInputPollable, IRegionable, ILinkable, public partial class GBHawkLink : IEmulator, ISaveRam, IDebuggable, IStatable, IInputPollable, IRegionable, ILinkable,
ISettable<GBHawkLink.GBLinkSettings, GBHawkLink.GBLinkSyncSettings> ISettable<GBHawkLink.GBLinkSettings, GBHawkLink.GBLinkSyncSettings>,
ILinkedGameBoyCommon
{ {
// we want to create two GBHawk instances that we will run concurrently // we want to create two GBHawk instances that we will run concurrently
// maybe up to 4 eventually? // maybe up to 4 eventually?
public GBHawk.GBHawk L; public GBHawk.GBHawk L;
public GBHawk.GBHawk R; public GBHawk.GBHawk R;
public IGameboyCommon First
=> L;
// if true, the link cable is currently connected // if true, the link cable is currently connected
private bool _cableconnected = true; private bool _cableconnected = true;

View File

@ -1,5 +1,6 @@
using System; using System;
using BizHawk.Emulation.Common; using BizHawk.Emulation.Common;
using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy;
using BizHawk.Emulation.Cores.Nintendo.GBHawk; using BizHawk.Emulation.Cores.Nintendo.GBHawk;
namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink3x namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink3x
@ -7,7 +8,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink3x
[Core(CoreNames.GBHawkLink3x, "")] [Core(CoreNames.GBHawkLink3x, "")]
[ServiceNotApplicable(new[] { typeof(IDriveLight) })] [ServiceNotApplicable(new[] { typeof(IDriveLight) })]
public partial class GBHawkLink3x : IEmulator, ISaveRam, IDebuggable, IStatable, IInputPollable, IRegionable, public partial class GBHawkLink3x : IEmulator, ISaveRam, IDebuggable, IStatable, IInputPollable, IRegionable,
ISettable<GBHawkLink3x.GBLink3xSettings, GBHawkLink3x.GBLink3xSyncSettings> ISettable<GBHawkLink3x.GBLink3xSettings, GBHawkLink3x.GBLink3xSyncSettings>,
ILinkedGameBoyCommon
{ {
// we want to create two GBHawk instances that we will run concurrently // we want to create two GBHawk instances that we will run concurrently
// maybe up to 4 eventually? // maybe up to 4 eventually?
@ -15,6 +17,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink3x
public GBHawk.GBHawk C; public GBHawk.GBHawk C;
public GBHawk.GBHawk R; public GBHawk.GBHawk R;
public IGameboyCommon First
=> L;
// if true, the link cable is currently connected // if true, the link cable is currently connected
private bool _cableconnected_LC = false; private bool _cableconnected_LC = false;
private bool _cableconnected_CR = false; private bool _cableconnected_CR = false;

View File

@ -1,5 +1,6 @@
using System; using System;
using BizHawk.Emulation.Common; using BizHawk.Emulation.Common;
using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy;
using BizHawk.Emulation.Cores.Nintendo.GBHawk; using BizHawk.Emulation.Cores.Nintendo.GBHawk;
namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink4x namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink4x
@ -7,7 +8,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink4x
[Core(CoreNames.GBHawkLink4x, "")] [Core(CoreNames.GBHawkLink4x, "")]
[ServiceNotApplicable(new[] { typeof(IDriveLight) })] [ServiceNotApplicable(new[] { typeof(IDriveLight) })]
public partial class GBHawkLink4x : IEmulator, ISaveRam, IDebuggable, IStatable, IInputPollable, IRegionable, public partial class GBHawkLink4x : IEmulator, ISaveRam, IDebuggable, IStatable, IInputPollable, IRegionable,
ISettable<GBHawkLink4x.GBLink4xSettings, GBHawkLink4x.GBLink4xSyncSettings> ISettable<GBHawkLink4x.GBLink4xSettings, GBHawkLink4x.GBLink4xSyncSettings>,
ILinkedGameBoyCommon
{ {
// we want to create two GBHawk instances that we will run concurrently // we want to create two GBHawk instances that we will run concurrently
public GBHawk.GBHawk A; public GBHawk.GBHawk A;
@ -15,6 +17,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink4x
public GBHawk.GBHawk C; public GBHawk.GBHawk C;
public GBHawk.GBHawk D; public GBHawk.GBHawk D;
public IGameboyCommon First
=> A;
// if true, the link cable is currently connected // if true, the link cable is currently connected
private bool _cableconnected_LR = false; private bool _cableconnected_LR = false;
private bool _cableconnected_UD = false; private bool _cableconnected_UD = false;

View File

@ -100,7 +100,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
} }
else if (address < 0xA000u) // vram (may be banked on CGB in CGB enhanced mode) else if (address < 0xA000u) // vram (may be banked on CGB in CGB enhanced mode)
{ {
if (IsCGBMode() && !IsCGBDMGMode()) if (IsCGBMode && !IsCGBDMGMode)
{ {
address += (uint)(bank * 0x2000); address += (uint)(bank * 0x2000);
} }
@ -120,7 +120,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
} }
else if (address < 0xE000u) // wram bank x (always one for dmg/cgb in dmg mode) else if (address < 0xE000u) // wram bank x (always one for dmg/cgb in dmg mode)
{ {
if (IsCGBMode() && !IsCGBDMGMode()) if (IsCGBMode && !IsCGBDMGMode)
{ {
address += (uint)(bank * 0x1000); address += (uint)(bank * 0x1000);
} }

View File

@ -20,7 +20,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
{ {
_settings = o; _settings = o;
_disassembler.UseRGBDSSyntax = _settings.RgbdsSyntax; _disassembler.UseRGBDSSyntax = _settings.RgbdsSyntax;
if (IsCGBMode() || IsSgb) if (IsCGBMode || IsSgb)
{ {
SetCGBColors(_settings.CGBColors); SetCGBColors(_settings.CGBColors);
} }

View File

@ -161,8 +161,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
"Disable BIOS in sync settings to boot this game"); "Disable BIOS in sync settings to boot this game");
} }
if (!_syncSettings.EnableBIOS && IsCgb && IsCGBDMGMode()) // without a bios, we need to set the palette for cgbdmg ourselves if (!_syncSettings.EnableBIOS && IsCGBMode && IsCGBDMGMode) //TODO doesn't IsCGBDMGMode imply IsCGBMode?
{ {
// without a bios, we need to set the palette for cgbdmg ourselves
int[] cgbDmgColors = new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 }; int[] cgbDmgColors = new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 };
if (file[0x14B] == 0x01 || (file[0x14B] == 0x33 && file[0x144] == '0' && file[0x145] == '1')) // Nintendo licencees get special palettes if (file[0x14B] == 0x01 || (file[0x14B] == 0x33 && file[0x144] == '0' && file[0x145] == '1')) // Nintendo licencees get special palettes
{ {
@ -337,22 +338,15 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
return RemoteCommand; return RemoteCommand;
} }
/// <summary> public bool IsCGBMode
/// true if the emulator is currently emulating CGB #if true
/// </summary> => IsCgb; //TODO inline
public bool IsCGBMode() #else
{ => LibGambatte.gambatte_iscgb(GambatteState);
//return LibGambatte.gambatte_iscgb(GambatteState); #endif
return IsCgb;
} public bool IsCGBDMGMode
=> LibGambatte.gambatte_iscgbdmg(GambatteState);
/// <summary>
/// true if the emulator is currently emulating CGB in DMG compatibility mode (NOTE: this mode does not take affect until the bootrom unmaps itself)
/// </summary>
public bool IsCGBDMGMode()
{
return LibGambatte.gambatte_iscgbdmg(GambatteState);
}
private InputCallbackSystem _inputCallbacks = new InputCallbackSystem(); private InputCallbackSystem _inputCallbacks = new InputCallbackSystem();

View File

@ -3,12 +3,13 @@ using System.Linq;
using BizHawk.Common.CollectionExtensions; using BizHawk.Common.CollectionExtensions;
using BizHawk.Emulation.Common; using BizHawk.Emulation.Common;
using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy;
namespace BizHawk.Emulation.Cores.Nintendo.Gameboy namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
{ {
[PortedCore(CoreNames.GambatteLink, "sinamas/natt")] [PortedCore(CoreNames.GambatteLink, "sinamas/natt")]
[ServiceNotApplicable(new[] { typeof(IDriveLight) })] [ServiceNotApplicable(new[] { typeof(IDriveLight) })]
public partial class GambatteLink : ILinkable, IRomInfo public partial class GambatteLink : ILinkable, ILinkedGameBoyCommon, IRomInfo
{ {
[CoreConstructor(VSystemID.Raw.GBL)] [CoreConstructor(VSystemID.Raw.GBL)]
public GambatteLink(CoreLoadParameters<GambatteLinkSettings, GambatteLinkSyncSettings> lp) public GambatteLink(CoreLoadParameters<GambatteLinkSettings, GambatteLinkSyncSettings> lp)
@ -136,10 +137,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
private readonly SaveController[] _linkedConts; private readonly SaveController[] _linkedConts;
public bool IsCGBMode(int which) public IGameboyCommon First
{ => _linkedCores[0];
return which < _numCores && _linkedCores[which].IsCGBMode();
}
private ControllerDefinition GBLinkController { get; } private ControllerDefinition GBLinkController { get; }

View File

@ -14,11 +14,20 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy
/// <param name="exposure">The darkness/intensity of the print job. What the exact values mean is somewhat subjective but 127 is the most exposed/darkest value.</param> /// <param name="exposure">The darkness/intensity of the print job. What the exact values mean is somewhat subjective but 127 is the most exposed/darkest value.</param>
public delegate void PrinterCallback(IntPtr image, byte height, byte top_margin, byte bottom_margin, byte exposure); public delegate void PrinterCallback(IntPtr image, byte height, byte top_margin, byte bottom_margin, byte exposure);
public interface ILinkedGameBoyCommon : ISpecializedEmulatorService
{
/// <remarks>really just for RetroAchivements; can be changed to a list later</remarks>
IGameboyCommon First { get; }
}
public interface IGameboyCommon : ISpecializedEmulatorService public interface IGameboyCommon : ISpecializedEmulatorService
{ {
bool IsCGBMode(); /// <value><see langword="true"/> iff the emulator is currently emulating CGB</value>
bool IsCGBMode { get; }
bool IsCGBDMGMode(); /// <value><see langword="true"/> iff the emulator is currently emulating CGB in DMG compatibility mode</value>
/// <remarks>NOTE: this mode does not take affect until the bootrom unmaps itself</remarks>
bool IsCGBDMGMode { get; }
/// <summary> /// <summary>
/// Acquire GPU memory for inspection. The returned object must be disposed as soon as the frontend /// Acquire GPU memory for inspection. The returned object must be disposed as soon as the frontend

View File

@ -36,9 +36,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.Sameboy
public bool IsCgb { get; set; } public bool IsCgb { get; set; }
public bool IsCGBMode() => IsCgb; public bool IsCGBMode
=> IsCgb; //TODO inline
public bool IsCGBDMGMode() => LibSameboy.sameboy_iscgbdmg(SameboyState); public bool IsCGBDMGMode
=> LibSameboy.sameboy_iscgbdmg(SameboyState);
private readonly LibSameboy.InputCallback _inputcb; private readonly LibSameboy.InputCallback _inputcb;