[Gambatte] upstream cleanup, use upstream for board name and other rom details, remove now unused MULTICART_COMPAT flag
This commit is contained in:
parent
37a7c69107
commit
c33d2cfbe5
Binary file not shown.
Binary file not shown.
|
@ -120,11 +120,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
[DefaultValue(ConsoleModeType.Auto)]
|
[DefaultValue(ConsoleModeType.Auto)]
|
||||||
public ConsoleModeType ConsoleMode { get; set; }
|
public ConsoleModeType ConsoleMode { get; set; }
|
||||||
|
|
||||||
[DisplayName("Multicart Compatibility")]
|
|
||||||
[Description("Use special compatibility hacks for certain multicart games. Relevant only for specific multicarts.")]
|
|
||||||
[DefaultValue(false)]
|
|
||||||
public bool MulticartCompat { get; set; }
|
|
||||||
|
|
||||||
[DisplayName("Cart Bus Pull-Up Time")]
|
[DisplayName("Cart Bus Pull-Up Time")]
|
||||||
[Description("Time it takes for the cart bus to pull-up to 0xFF in CPU cycles. Used to account for differences in pull-up times between carts/consoles.")]
|
[Description("Time it takes for the cart bus to pull-up to 0xFF in CPU cycles. Used to account for differences in pull-up times between carts/consoles.")]
|
||||||
[DefaultValue(8)]
|
[DefaultValue(8)]
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
using BizHawk.Common;
|
using BizHawk.Common;
|
||||||
using BizHawk.Common.CollectionExtensions;
|
using BizHawk.Common.CollectionExtensions;
|
||||||
|
@ -29,9 +30,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
ser.Register<ITraceable>(Tracer);
|
ser.Register<ITraceable>(Tracer);
|
||||||
InitMemoryCallbacks();
|
InitMemoryCallbacks();
|
||||||
|
|
||||||
ThrowExceptionForBadRom(file);
|
|
||||||
BoardName = MapperName(file);
|
|
||||||
|
|
||||||
DeterministicEmulation = deterministic;
|
DeterministicEmulation = deterministic;
|
||||||
|
|
||||||
GambatteState = LibGambatte.gambatte_create();
|
GambatteState = LibGambatte.gambatte_create();
|
||||||
|
@ -72,11 +70,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
IsSgb = true;
|
IsSgb = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_syncSettings.MulticartCompat)
|
|
||||||
{
|
|
||||||
flags |= LibGambatte.LoadFlags.MULTICART_COMPAT;
|
|
||||||
}
|
|
||||||
|
|
||||||
IsCgb = (flags & LibGambatte.LoadFlags.CGB_MODE) == LibGambatte.LoadFlags.CGB_MODE;
|
IsCgb = (flags & LibGambatte.LoadFlags.CGB_MODE) == LibGambatte.LoadFlags.CGB_MODE;
|
||||||
if (_syncSettings.EnableBIOS)
|
if (_syncSettings.EnableBIOS)
|
||||||
{
|
{
|
||||||
|
@ -95,6 +88,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
if (DeterministicEmulation) // throw a warning if a movie is being recorded with the bios disabled
|
if (DeterministicEmulation) // throw a warning if a movie is being recorded with the bios disabled
|
||||||
{
|
{
|
||||||
comm.ShowMessage("Detected disabled BIOS during movie recording. It is recommended to use a BIOS for movie recording. Change Sync Settings to run with a BIOS.");
|
comm.ShowMessage("Detected disabled BIOS during movie recording. It is recommended to use a BIOS for movie recording. Change Sync Settings to run with a BIOS.");
|
||||||
|
@ -121,7 +115,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
}
|
}
|
||||||
|
|
||||||
// set real default colors (before anyone mucks with them at all)
|
// set real default colors (before anyone mucks with them at all)
|
||||||
PutSettings((GambatteSettings)settings ?? new GambatteSettings());
|
PutSettings(settings ?? new GambatteSettings());
|
||||||
|
|
||||||
InitSound();
|
InitSound();
|
||||||
|
|
||||||
|
@ -131,16 +125,35 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
|
|
||||||
InputCallback = new LibGambatte.InputGetter(ControllerCallback);
|
InputCallback = new LibGambatte.InputGetter(ControllerCallback);
|
||||||
|
|
||||||
LibGambatte.gambatte_setinputgetter(GambatteState, InputCallback);
|
LibGambatte.gambatte_setinputgetter(GambatteState, InputCallback, IntPtr.Zero);
|
||||||
|
|
||||||
InitMemoryDomains();
|
InitMemoryDomains();
|
||||||
|
|
||||||
RomDetails = $"{game.Name}\r\n{SHA1Checksum.ComputePrefixedHex(file)}\r\n{MD5Checksum.ComputePrefixedHex(file)}\r\n";
|
byte[] mbcBuf = new byte[32];
|
||||||
|
uint rambanks = 0;
|
||||||
|
uint rombanks = 0;
|
||||||
|
uint crc = 0;
|
||||||
|
uint headerchecksumok = 0;
|
||||||
|
LibGambatte.gambatte_pakinfo(GambatteState, mbcBuf, ref rambanks, ref rombanks, ref crc, ref headerchecksumok);
|
||||||
|
|
||||||
byte[] buff = new byte[32];
|
byte[] romNameBuf = new byte[32];
|
||||||
LibGambatte.gambatte_romtitle(GambatteState, buff);
|
LibGambatte.gambatte_romtitle(GambatteState, romNameBuf);
|
||||||
string romname = System.Text.Encoding.ASCII.GetString(buff);
|
string romname = Encoding.ASCII.GetString(romNameBuf);
|
||||||
Console.WriteLine("Core reported rom name: {0}", romname);
|
|
||||||
|
RomDetails = $"{game.Name}\r\n{SHA1Checksum.ComputePrefixedHex(file)}\r\n{MD5Checksum.ComputePrefixedHex(file)}\r\n\r\n";
|
||||||
|
BoardName = Encoding.ASCII.GetString(mbcBuf);
|
||||||
|
|
||||||
|
RomDetails += $"Core reported Header Name: {romname}\r\n";
|
||||||
|
RomDetails += $"Core reported RAM Banks: {rambanks}\r\n";
|
||||||
|
RomDetails += $"Core reported ROM Banks: {rombanks}\r\n";
|
||||||
|
RomDetails += $"Core reported CRC32: {crc:X8}\r\n";
|
||||||
|
RomDetails += $"Core reported Header Checksum Status: {(headerchecksumok != 0 ? "OK" : "BAD")}\r\n";
|
||||||
|
|
||||||
|
if (_syncSettings.EnableBIOS && headerchecksumok == 0)
|
||||||
|
{
|
||||||
|
comm.ShowMessage("Core reports the header checksum is bad. This ROM will not boot with the official BIOS.\n" +
|
||||||
|
"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 && IsCgb && IsCGBDMGMode()) // without a bios, we need to set the palette for cgbdmg ourselves
|
||||||
{
|
{
|
||||||
|
@ -226,7 +239,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// number of reset stall ticks
|
/// number of reset stall ticks
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private uint ResetStallTicks { get; set; } = 0;
|
private uint ResetStallTicks { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// keep a copy of the input callback delegate so it doesn't get GCed
|
/// keep a copy of the input callback delegate so it doesn't get GCed
|
||||||
|
@ -291,7 +304,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
return ret.MakeImmutable();
|
return ret.MakeImmutable();
|
||||||
}
|
}
|
||||||
|
|
||||||
private LibGambatte.Buttons ControllerCallback()
|
private LibGambatte.Buttons ControllerCallback(IntPtr p)
|
||||||
{
|
{
|
||||||
InputCallbacks.Call();
|
InputCallbacks.Call();
|
||||||
IsLagFrame = false;
|
IsLagFrame = false;
|
||||||
|
@ -414,89 +427,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
endofframecallback?.Invoke(LibGambatte.gambatte_cpuread(GambatteState, 0xff40));
|
endofframecallback?.Invoke(LibGambatte.gambatte_cpuread(GambatteState, 0xff40));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static string MapperName(byte[] romdata)
|
|
||||||
{
|
|
||||||
return (romdata[0x147]) switch
|
|
||||||
{
|
|
||||||
0x00 => "Plain ROM",
|
|
||||||
0x01 => "MBC1 ROM",
|
|
||||||
0x02 => "MBC1 ROM+RAM",
|
|
||||||
0x03 => "MBC1 ROM+RAM+BATTERY",
|
|
||||||
0x05 => "MBC2 ROM",
|
|
||||||
0x06 => "MBC2 ROM+BATTERY",
|
|
||||||
0x08 => "Plain ROM+RAM",
|
|
||||||
0x09 => "Plain ROM+RAM+BATTERY",
|
|
||||||
0x0B => "MMM01 ROM", // fixme: mmm01's proper header is at the end of the rom!
|
|
||||||
0x0C => "MMM01 ROM+RAM",
|
|
||||||
0x0D => "MMM01 ROM+BATTERY",
|
|
||||||
0x0F => "MBC3 ROM+TIMER+BATTERY",
|
|
||||||
0x10 => "MBC3 ROM+TIMER+RAM+BATTERY",
|
|
||||||
0x11 => "MBC3 ROM",
|
|
||||||
0x12 => "MBC3 ROM+RAM",
|
|
||||||
0x13 => "MBC3 ROM+RAM+BATTERY",
|
|
||||||
0x19 => "MBC5 ROM",
|
|
||||||
0x1A => "MBC5 ROM+RAM",
|
|
||||||
0x1B => "MBC5 ROM+RAM+BATTERY",
|
|
||||||
0x1C => "MBC5 ROM+RUMBLE",
|
|
||||||
0x1D => "MBC5 ROM+RUMBLE+RAM",
|
|
||||||
0x1E => "MBC5 ROM+RUMBLE+RAM+BATTERY",
|
|
||||||
0xFC => "Pocket Camera ROM+RAM+BATTERY",
|
|
||||||
0xFE => "HuC3 ROM+RAM+BATTERY",
|
|
||||||
0xFF => "HuC1 ROM+RAM+BATTERY",
|
|
||||||
_ => "UNKNOWN",
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// throw exception with intelligible message on some kinds of bad rom
|
|
||||||
/// </summary>
|
|
||||||
private static void ThrowExceptionForBadRom(byte[] romdata)
|
|
||||||
{
|
|
||||||
if (romdata.Length < 0x148)
|
|
||||||
{
|
|
||||||
throw new ArgumentException("ROM is far too small to be a valid GB\\GBC rom!");
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (romdata[0x147])
|
|
||||||
{
|
|
||||||
case 0x00: break;
|
|
||||||
case 0x01: break;
|
|
||||||
case 0x02: break;
|
|
||||||
case 0x03: break;
|
|
||||||
case 0x05: break;
|
|
||||||
case 0x06: break;
|
|
||||||
case 0x08: break;
|
|
||||||
case 0x09: break;
|
|
||||||
|
|
||||||
case 0x0B: break;
|
|
||||||
case 0x0C: break;
|
|
||||||
case 0x0D: break;
|
|
||||||
|
|
||||||
case 0x0F: break;
|
|
||||||
case 0x10: break;
|
|
||||||
case 0x11: break;
|
|
||||||
case 0x12: break;
|
|
||||||
case 0x13: break;
|
|
||||||
|
|
||||||
case 0x19: break;
|
|
||||||
case 0x1A: break;
|
|
||||||
case 0x1B: break;
|
|
||||||
case 0x1C: break; // rumble
|
|
||||||
case 0x1D: break; // rumble
|
|
||||||
case 0x1E: break; // rumble
|
|
||||||
|
|
||||||
case 0x20: throw new UnsupportedGameException("\"MBC6\" Mapper not supported!");
|
|
||||||
case 0x22: throw new UnsupportedGameException("\"MBC7\" Mapper not supported!");
|
|
||||||
|
|
||||||
case 0xFC: break;
|
|
||||||
case 0xFD: throw new UnsupportedGameException("\"Bandai TAMA5\" Mapper not supported!");
|
|
||||||
case 0xFE: break;
|
|
||||||
case 0xFF: break;
|
|
||||||
default: throw new UnsupportedGameException($"Unknown mapper: {romdata[0x147]:x2}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int[] ColorsFromTitleHash(byte[] romdata)
|
private static int[] ColorsFromTitleHash(byte[] romdata)
|
||||||
{
|
{
|
||||||
int titleHash = 0;
|
int titleHash = 0;
|
||||||
|
|
|
@ -25,8 +25,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
CGB_MODE = 1,
|
CGB_MODE = 1,
|
||||||
/// <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>Previously a multicart heuristic enable. Reserved for future use.</summary>
|
||||||
MULTICART_COMPAT = 4,
|
RESERVED_FLAG = 4,
|
||||||
/// <summary>Treat the ROM as having SGB support regardless of what its header advertises.</summary>
|
/// <summary>Treat the ROM as having SGB support regardless of what its header advertises.</summary>
|
||||||
SGB_MODE = 8,
|
SGB_MODE = 8,
|
||||||
/// <summary>Prevent implicit saveSavedata calls for the ROM.</summary>
|
/// <summary>Prevent implicit saveSavedata calls for the ROM.</summary>
|
||||||
|
@ -43,7 +43,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
[Flags]
|
[Flags]
|
||||||
public enum CDLog_Flags : int
|
public enum CDLog_Flags : int
|
||||||
{
|
{
|
||||||
ExecFirst = 1,
|
ExecOpcode = 1,
|
||||||
ExecOperand = 2,
|
ExecOperand = 2,
|
||||||
Data = 4
|
Data = 4
|
||||||
}
|
}
|
||||||
|
@ -157,14 +157,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>bitfield combination of pressed buttons</returns>
|
/// <returns>bitfield combination of pressed buttons</returns>
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
public delegate Buttons InputGetter();
|
public delegate Buttons InputGetter(IntPtr p);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the callback used for getting input state.
|
/// Sets the callback used for getting input state.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="core">opaque state pointer</param>
|
/// <param name="core">opaque state pointer</param>
|
||||||
[DllImport("libgambatte", CallingConvention = CallingConvention.Cdecl)]
|
[DllImport("libgambatte", CallingConvention = CallingConvention.Cdecl)]
|
||||||
public static extern void gambatte_setinputgetter(IntPtr core, InputGetter getinput);
|
public static extern void gambatte_setinputgetter(IntPtr core, InputGetter getinput, IntPtr p);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets which SGB controller is in use, 0 indexed.
|
/// Gets which SGB controller is in use, 0 indexed.
|
||||||
|
@ -394,6 +394,18 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
[DllImport("libgambatte", CallingConvention = CallingConvention.Cdecl)]
|
[DllImport("libgambatte", CallingConvention = CallingConvention.Cdecl)]
|
||||||
public static extern void gambatte_romtitle(IntPtr core, byte[] data);
|
public static extern void gambatte_romtitle(IntPtr core, byte[] data);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Pakinfo of currently loaded ROM image.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="core">opaque state pointer</param>
|
||||||
|
/// <param name="mbc">enough room for 25 ascii chars plus terminator</param>
|
||||||
|
/// <param name="rambanks">number of rambanks</param>
|
||||||
|
/// <param name="rombanks">number of rombanks</param>
|
||||||
|
/// <param name="crc">core reported crc32</param>
|
||||||
|
/// <param name="headerchecksumok">core reported header checksum status</param>
|
||||||
|
[DllImport("libgambatte", CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void gambatte_pakinfo(IntPtr core, byte[] mbc, ref uint rambanks, ref uint rombanks, ref uint crc, ref uint headerchecksumok);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// memory areas that gambatte_getmemoryarea() can return
|
/// memory areas that gambatte_getmemoryarea() can return
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 3fd41666664ba779116373425b3832fb1994e59e
|
Subproject commit 08e3ed73f45c2902157b2eba3030fcf007e7947c
|
Loading…
Reference in New Issue