Fix gb roms running without bios

This commit is contained in:
nattthebear 2020-06-05 08:49:56 -04:00
parent 81628bf109
commit ad16294b11
4 changed files with 32 additions and 7 deletions

View File

@ -88,8 +88,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
public class GambatteSyncSettings public class GambatteSyncSettings
{ {
[DisplayName("Enable BIOS: WARNING: File must exist!")] [DisplayName("Enable official Nintendo BIOS")]
[Description("Boots game using system BIOS. Should be used for TASing")] [Description("Boots game using system BIOS. You must have the bios file. Should be used for TASing.")]
[DefaultValue(false)] [DefaultValue(false)]
public bool EnableBIOS { get; set; } public bool EnableBIOS { get; set; }

View File

@ -1,8 +1,9 @@
using System; using System;
using System.IO;
using BizHawk.Common.BufferExtensions; using BizHawk.Common.BufferExtensions;
using BizHawk.Emulation.Common; using BizHawk.Emulation.Common;
using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy; using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy;
using BizHawk.Emulation.Cores.Properties;
namespace BizHawk.Emulation.Cores.Nintendo.Gameboy namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
{ {
@ -83,6 +84,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
throw new InvalidOperationException($"{nameof(LibGambatte.gambatte_load)}() returned non-zero (is this not a gb or gbc rom?)"); throw new InvalidOperationException($"{nameof(LibGambatte.gambatte_load)}() returned non-zero (is this not a gb or gbc rom?)");
} }
byte[] bios;
string biosName; string biosName;
if ((flags & LibGambatte.LoadFlags.FORCE_DMG) == LibGambatte.LoadFlags.FORCE_DMG) if ((flags & LibGambatte.LoadFlags.FORCE_DMG) == LibGambatte.LoadFlags.FORCE_DMG)
{ {
@ -91,18 +93,40 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
} }
else else
{ {
// TODO: Fix AGB bios mode stuff
// biosName = _syncSettings.GBACGB ? "AGB" : "GBC";
biosName = "GBC"; biosName = "GBC";
IsCgb = true; IsCgb = true;
} }
if (_syncSettings.EnableBIOS) if (_syncSettings.EnableBIOS)
{ {
byte[] Bios; bios = comm.CoreFileProvider.GetFirmware(biosName, "World", true, "BIOS Not Found, Cannot Load. Change SyncSettings to run without BIOS.");
Bios = comm.CoreFileProvider.GetFirmware(biosName, "World", true, "BIOS Not Found, Cannot Load. Change SyncSettings to run without BIOS."); }
if (LibGambatte.gambatte_loadbios(GambatteState, Bios, (uint)Bios.Length) != 0) else
{
Lazy<byte[]> builtinBios;
switch (biosName)
{ {
throw new InvalidOperationException($"{nameof(LibGambatte.gambatte_loadbios)}() returned non-zero (bios error)"); case "GB":
builtinBios = Resources.SameboyDmgBoot;
break;
case "GBC":
builtinBios = Resources.SameboyCgbBoot;
break;
// TODO: This doesn't work; locks up before leaving the bios screen
// case "AGB":
// builtinBios = Resources.SameboyAgbBoot;
// break;
default:
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)
{
throw new InvalidOperationException($"{nameof(LibGambatte.gambatte_loadbios)}() returned non-zero (bios error)");
} }
// set real default colors (before anyone mucks with them at all) // set real default colors (before anyone mucks with them at all)

View File

@ -16,6 +16,7 @@ namespace BizHawk.Emulation.Cores.Properties {
internal static readonly Lazy<byte[]> CPC_OS_6128_ROM = new Lazy<byte[]>(() => ReadEmbeddedByteArray("CPC_OS_6128.ROM.gz")); internal static readonly Lazy<byte[]> CPC_OS_6128_ROM = new Lazy<byte[]>(() => ReadEmbeddedByteArray("CPC_OS_6128.ROM.gz"));
internal static readonly Lazy<byte[]> OS_464_ROM = new Lazy<byte[]>(() => ReadEmbeddedByteArray("OS_464.ROM.gz")); internal static readonly Lazy<byte[]> OS_464_ROM = new Lazy<byte[]>(() => ReadEmbeddedByteArray("OS_464.ROM.gz"));
internal static readonly Lazy<byte[]> SameboyCgbBoot = new Lazy<byte[]>(() => ReadEmbeddedByteArray("cgb_boot.rom.gz")); internal static readonly Lazy<byte[]> SameboyCgbBoot = new Lazy<byte[]>(() => ReadEmbeddedByteArray("cgb_boot.rom.gz"));
internal static readonly Lazy<byte[]> SameboyAgbBoot = new Lazy<byte[]>(() => ReadEmbeddedByteArray("agb_boot.rom.gz"));
internal static readonly Lazy<byte[]> SameboyDmgBoot = new Lazy<byte[]>(() => ReadEmbeddedByteArray("dmg_boot.rom.gz")); internal static readonly Lazy<byte[]> SameboyDmgBoot = new Lazy<byte[]>(() => ReadEmbeddedByteArray("dmg_boot.rom.gz"));
internal static readonly Lazy<byte[]> SgbCartPresent_SPC = new Lazy<byte[]>(() => ReadEmbeddedByteArray("sgb-cart-present.spc.gz")); internal static readonly Lazy<byte[]> SgbCartPresent_SPC = new Lazy<byte[]>(() => ReadEmbeddedByteArray("sgb-cart-present.spc.gz"));
internal static readonly Lazy<byte[]> ZX_128_ROM = new Lazy<byte[]>(() => ReadEmbeddedByteArray("128.ROM.gz")); internal static readonly Lazy<byte[]> ZX_128_ROM = new Lazy<byte[]>(() => ReadEmbeddedByteArray("128.ROM.gz"));

Binary file not shown.