[Gambatte] Many Updates (#2742)

* don't put isCGBMode for movies where CgbDmg mode is being used

* various Gambatte accuracy improvements + proper no BIOS support + tracelogger fixes
This commit is contained in:
CasualPokePlayer 2021-05-27 05:56:13 -07:00 committed by GitHub
parent 2c0c6aa0bb
commit 6432d99feb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 36 additions and 24 deletions

2
.gitignore vendored
View File

@ -14,6 +14,8 @@
**/ipch/** **/ipch/**
/Assets/dll/*.exp /Assets/dll/*.exp
/Assets/dll/*.lib /Assets/dll/*.lib
/Assets/dll/*.iobj
/Assets/dll/*.ipdb
*.ilk *.ilk
*.il *.il

Binary file not shown.

View File

@ -264,9 +264,9 @@ namespace BizHawk.Client.Common
if (emulator is Gameboy gb) if (emulator is Gameboy gb)
{ {
if (gb.IsCGBMode()) if (gb.IsCGBMode())
{ {
movie.HeaderEntries.Add("IsCGBMode", "1"); movie.HeaderEntries.Add(gb.IsCGBDMGMode() ? "IsCGBDMGMode" : "IsCGBMode", "1");
} }
movie.HeaderEntries.Add(HeaderKeys.CycleCount, "0"); movie.HeaderEntries.Add(HeaderKeys.CycleCount, "0");

View File

@ -24,7 +24,7 @@ namespace BizHawk.Client.EmuHawk
using var dlg = new GBPrefs(mainForm.DialogController); using var dlg = new GBPrefs(mainForm.DialogController);
dlg.gbPrefControl1.PutSettings(config, game, movieSession, s, ss); dlg.gbPrefControl1.PutSettings(config, game, movieSession, s, ss);
dlg.gbPrefControl1.ColorGameBoy = gb.IsCGBMode(); dlg.gbPrefControl1.ColorGameBoy = gb.IsCGBMode() && (!gb.IsCGBDMGMode() || ss.EnableBIOS);
if (mainForm.ShowDialogAsChild(dlg).IsOk()) if (mainForm.ShowDialogAsChild(dlg).IsOk())
{ {
dlg.gbPrefControl1.GetSettings(out s, out ss); dlg.gbPrefControl1.GetSettings(out s, out ss);

View File

@ -19,7 +19,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
{ {
_settings = o; _settings = o;
_disassembler.UseRGBDSSyntax = _settings.RgbdsSyntax; _disassembler.UseRGBDSSyntax = _settings.RgbdsSyntax;
if (IsCGBMode()) if (IsCGBMode() && (!IsCGBDMGMode() || _syncSettings.EnableBIOS))
{ {
SetCGBColors(_settings.CGBColors); SetCGBColors(_settings.CGBColors);
} }
@ -96,7 +96,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
public class GambatteSyncSettings public class GambatteSyncSettings
{ {
[DisplayName("Use official Nintendo BootROM")] [DisplayName("Use official Nintendo BootROM")]
[Description("Uses a provided official BootROM (or \"BIOS\") instead of built-in unofficial firmware. You must provide the BootROM. Should be used for TASing.")] [Description("When false, hacks are used to boot without a BIOS. When true, a provided official BootROM (or \"BIOS\") is used. You must provide the BootROM. Should be used for TASing.")]
[DefaultValue(false)] [DefaultValue(false)]
public bool EnableBIOS { get; set; } public bool EnableBIOS { get; set; }

View File

@ -20,12 +20,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
Disassembly = Disassembly =
LR35902.Disassemble( LR35902.Disassemble(
(ushort) s[1], (ushort) s[1],
addr => LibGambatte.gambatte_cpuread(GambatteState, addr), addr => (addr == (ushort)s[1]) ? (byte)((s[12] >> 16) & 0xFF) : ((addr == (ushort)s[1] + 1) ? (byte)((s[12] >> 8) & 0xFF) : (byte)(s[12] & 0xFF)),
_settings.RgbdsSyntax, _settings.RgbdsSyntax,
out _).PadRight(36), out _).PadRight(36),
RegisterInfo = RegisterInfo =
string.Format( string.Format(
"A:{3:x2} B:{4:x2} C:{5:x2} D:{6:x2} E:{7:x2} F:{8:x2} H:{9:x2} L:{10:x2} LY:{13:x2} SP:{2:x2} {11} Cy:{0}", "A:{3:x2} F:{8:x2} B:{4:x2} C:{5:x2} D:{6:x2} E:{7:x2} H:{9:x2} L:{10:x2} LY:{13:x2} SP:{2:x2} {11} Cy:{0}",
s[0], s[0],
s[1] & 0xffff, s[1] & 0xffff,
s[2] & 0xffff, s[2] & 0xffff,
@ -38,7 +38,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
s[9] & 0xff, s[9] & 0xff,
s[10] & 0xff, s[10] & 0xff,
s[11] != 0 ? "skip" : "", s[11] != 0 ? "skip" : "",
s[12] & 0xff, s[12] & 0xffffff,
s[13] & 0xff) s[13] & 0xff)
}); });
} }

View File

@ -71,11 +71,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
flags |= LibGambatte.LoadFlags.MULTICART_COMPAT; flags |= LibGambatte.LoadFlags.MULTICART_COMPAT;
} }
if (LibGambatte.gambatte_load(GambatteState, file, (uint)file.Length, flags) != 0)
{
throw new InvalidOperationException($"{nameof(LibGambatte.gambatte_load)}() returned non-zero (is this not a gb or gbc rom?)");
}
byte[] bios; byte[] bios;
string biosSystemId; string biosSystemId;
string biosId; string biosId;
@ -95,21 +90,19 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
if (_syncSettings.EnableBIOS) if (_syncSettings.EnableBIOS)
{ {
bios = comm.CoreFileProvider.GetFirmware(biosSystemId, biosId, true, "BIOS Not Found, Cannot Load. Change SyncSettings to run without BIOS."); bios = comm.CoreFileProvider.GetFirmware(biosSystemId, biosId, true, "BIOS Not Found, Cannot Load. Change SyncSettings to run without BIOS.");
if (LibGambatte.gambatte_loadbios(GambatteState, bios, (uint)bios.Length) != 0)
{
throw new InvalidOperationException($"{nameof(LibGambatte.gambatte_loadbios)}() returned non-zero (bios error)");
}
} }
else else
{ {
var builtinBios = (biosSystemId, biosId) switch { flags |= LibGambatte.LoadFlags.NO_BIOS;
("GB", "World") => Resources.FastDmgBoot,
("GBC", "World") => Resources.FastCgbBoot,
("GBC", "AGB") => Resources.FastAgbBoot,
(_, _) => throw new Exception("Internal GB Error (BIOS??)"),
};
bios = BizHawk.Common.Util.DecompressGzipFile(new MemoryStream(builtinBios.Value, false));
} }
if (LibGambatte.gambatte_loadbios(GambatteState, bios, (uint)bios.Length) != 0) if (LibGambatte.gambatte_load(GambatteState, file, (uint)file.Length, flags) != 0)
{ {
throw new InvalidOperationException($"{nameof(LibGambatte.gambatte_loadbios)}() returned non-zero (bios error)"); throw new InvalidOperationException($"{nameof(LibGambatte.gambatte_load)}() returned non-zero (is this not a gb or gbc rom?)");
} }
// set real default colors (before anyone mucks with them at all) // set real default colors (before anyone mucks with them at all)
@ -259,6 +252,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
//return LibGambatte.gambatte_iscgb(GambatteState); //return LibGambatte.gambatte_iscgb(GambatteState);
return IsCgb; return IsCgb;
} }
/// <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

@ -25,7 +25,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
/// <summary>Use GBA intial CPU register values when in CGB mode.</summary> /// <summary>Use GBA intial CPU register values when in CGB mode.</summary>
GBA_FLAG = 2, GBA_FLAG = 2,
/// <summary>Use heuristics to detect and support some multicart MBCs disguised as MBC1.</summary> /// <summary>Use heuristics to detect and support some multicart MBCs disguised as MBC1.</summary>
MULTICART_COMPAT = 4 MULTICART_COMPAT = 4,
/// <summary>Use heuristics to boot without a BIOS.</summary>
NO_BIOS = 8
} }
public enum CDLog_AddrType : int public enum CDLog_AddrType : int
@ -284,6 +286,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
[DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern bool gambatte_iscgb(IntPtr core); public static extern bool gambatte_iscgb(IntPtr core);
/// <summary>
/// Returns true if the currently loaded ROM image is treated as having CGB-DMG support.
/// </summary>
/// <param name="core">opaque state pointer</param>
[DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern bool gambatte_iscgbdmg(IntPtr core);
/// <summary> /// <summary>
/// Returns true if a ROM image is loaded. /// Returns true if a ROM image is loaded.
/// </summary> /// </summary>

@ -1 +1 @@
Subproject commit b9a38d535aa17223006e1913b507fc333a10b037 Subproject commit b5eab7d3893d009390a90c48fb418df4f52522f2