From 6432d99febd2bfafe16bb9156328d8579e827217 Mon Sep 17 00:00:00 2001 From: CasualPokePlayer <50538166+CasualPokePlayer@users.noreply.github.com> Date: Thu, 27 May 2021 05:56:13 -0700 Subject: [PATCH] [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 --- .gitignore | 2 ++ Assets/dll/libgambatte.dll | Bin 194560 -> 195072 bytes .../movie/MovieConversionExtensions.cs | 4 +-- .../config/GB/GBPrefs.cs | 2 +- .../Nintendo/Gameboy/Gambatte.ISettable.cs | 4 +-- .../Nintendo/Gameboy/Gambatte.ITraceable.cs | 6 ++-- .../Consoles/Nintendo/Gameboy/Gambatte.cs | 29 +++++++++--------- .../Consoles/Nintendo/Gameboy/LibGambatte.cs | 11 ++++++- submodules/gambatte | 2 +- 9 files changed, 36 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index db2295c5f0..dc96a70d40 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,8 @@ **/ipch/** /Assets/dll/*.exp /Assets/dll/*.lib +/Assets/dll/*.iobj +/Assets/dll/*.ipdb *.ilk *.il diff --git a/Assets/dll/libgambatte.dll b/Assets/dll/libgambatte.dll index 161f1e5d55a4f99c0d86e6e065e7c5d75bedb4c8..077f26822a9efbdae835a09689d66fd45a14972f 100644 GIT binary patch delta 45884 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 AasU7T delta 44986 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%0DInFri#QE*1pb@MDPciNW_#OUXNkH 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 Stk2z0x}j!Uuk+?Vt^Wlo(bGo& diff --git a/src/BizHawk.Client.Common/movie/MovieConversionExtensions.cs b/src/BizHawk.Client.Common/movie/MovieConversionExtensions.cs index 4fb04c2286..77655ebee3 100644 --- a/src/BizHawk.Client.Common/movie/MovieConversionExtensions.cs +++ b/src/BizHawk.Client.Common/movie/MovieConversionExtensions.cs @@ -264,9 +264,9 @@ namespace BizHawk.Client.Common 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"); diff --git a/src/BizHawk.Client.EmuHawk/config/GB/GBPrefs.cs b/src/BizHawk.Client.EmuHawk/config/GB/GBPrefs.cs index c2e4f3ca49..52bf4dac4c 100644 --- a/src/BizHawk.Client.EmuHawk/config/GB/GBPrefs.cs +++ b/src/BizHawk.Client.EmuHawk/config/GB/GBPrefs.cs @@ -24,7 +24,7 @@ namespace BizHawk.Client.EmuHawk using var dlg = new GBPrefs(mainForm.DialogController); 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()) { dlg.gbPrefControl1.GetSettings(out s, out ss); diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ISettable.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ISettable.cs index 38b550d5b0..7b1cdaf441 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ISettable.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ISettable.cs @@ -19,7 +19,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy { _settings = o; _disassembler.UseRGBDSSyntax = _settings.RgbdsSyntax; - if (IsCGBMode()) + if (IsCGBMode() && (!IsCGBDMGMode() || _syncSettings.EnableBIOS)) { SetCGBColors(_settings.CGBColors); } @@ -96,7 +96,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy public class GambatteSyncSettings { [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)] public bool EnableBIOS { get; set; } diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ITraceable.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ITraceable.cs index 2b4ea1a3b5..10d78f562a 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ITraceable.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ITraceable.cs @@ -20,12 +20,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy Disassembly = LR35902.Disassemble( (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, out _).PadRight(36), RegisterInfo = 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[1] & 0xffff, s[2] & 0xffff, @@ -38,7 +38,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy s[9] & 0xff, s[10] & 0xff, s[11] != 0 ? "skip" : "", - s[12] & 0xff, + s[12] & 0xffffff, s[13] & 0xff) }); } diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs index 2b7512c954..88f98bac71 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -71,11 +71,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy 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; string biosSystemId; string biosId; @@ -95,21 +90,19 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy if (_syncSettings.EnableBIOS) { 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 { - var builtinBios = (biosSystemId, biosId) switch { - ("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)); + flags |= LibGambatte.LoadFlags.NO_BIOS; } - 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) @@ -259,6 +252,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy //return LibGambatte.gambatte_iscgb(GambatteState); return IsCgb; } + + /// + /// true if the emulator is currently emulating CGB in DMG compatibility mode (NOTE: this mode does not take affect until the bootrom unmaps itself) + /// + public bool IsCGBDMGMode() + { + return LibGambatte.gambatte_iscgbdmg(GambatteState); + } private InputCallbackSystem _inputCallbacks = new InputCallbackSystem(); diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs index 8d1a4ca5fb..2cc5b0c2b5 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs @@ -25,7 +25,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy /// Use GBA intial CPU register values when in CGB mode. GBA_FLAG = 2, /// Use heuristics to detect and support some multicart MBCs disguised as MBC1. - MULTICART_COMPAT = 4 + MULTICART_COMPAT = 4, + /// Use heuristics to boot without a BIOS. + NO_BIOS = 8 } public enum CDLog_AddrType : int @@ -284,6 +286,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] public static extern bool gambatte_iscgb(IntPtr core); + /// + /// Returns true if the currently loaded ROM image is treated as having CGB-DMG support. + /// + /// opaque state pointer + [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern bool gambatte_iscgbdmg(IntPtr core); + /// /// Returns true if a ROM image is loaded. /// diff --git a/submodules/gambatte b/submodules/gambatte index b9a38d535a..b5eab7d389 160000 --- a/submodules/gambatte +++ b/submodules/gambatte @@ -1 +1 @@ -Subproject commit b9a38d535aa17223006e1913b507fc333a10b037 +Subproject commit b5eab7d3893d009390a90c48fb418df4f52522f2