|
|
|
@ -20,14 +20,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
[CoreConstructor(VSystemID.Raw.GB)]
|
|
|
|
|
[CoreConstructor(VSystemID.Raw.GBC)]
|
|
|
|
|
[CoreConstructor(VSystemID.Raw.SGB)]
|
|
|
|
|
public Gameboy(CoreComm comm, GameInfo game, byte[] file, GambatteSettings settings, GambatteSyncSettings syncSettings, bool deterministic)
|
|
|
|
|
public Gameboy(CoreComm comm, IGameInfo game, byte[] file, GambatteSettings settings, GambatteSyncSettings syncSettings, bool deterministic)
|
|
|
|
|
{
|
|
|
|
|
var ser = new BasicServiceProvider(this);
|
|
|
|
|
ser.Register<IDisassemblable>(_disassembler);
|
|
|
|
|
ServiceProvider = ser;
|
|
|
|
|
_serviceProvider = new(this);
|
|
|
|
|
_serviceProvider.Register<IDisassemblable>(_disassembler);
|
|
|
|
|
const string TRACE_HEADER = "LR35902: PC, opcode, registers (A, F, B, C, D, E, H, L, LY, SP, CY)";
|
|
|
|
|
Tracer = new TraceBuffer(TRACE_HEADER);
|
|
|
|
|
ser.Register<ITraceable>(Tracer);
|
|
|
|
|
_serviceProvider.Register(Tracer);
|
|
|
|
|
InitMemoryCallbacks();
|
|
|
|
|
|
|
|
|
|
DeterministicEmulation = deterministic;
|
|
|
|
@ -45,7 +44,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
{
|
|
|
|
|
_syncSettings = syncSettings ?? new GambatteSyncSettings();
|
|
|
|
|
|
|
|
|
|
LibGambatte.LoadFlags flags = LibGambatte.LoadFlags.READONLY_SAV;
|
|
|
|
|
var flags = LibGambatte.LoadFlags.READONLY_SAV;
|
|
|
|
|
|
|
|
|
|
switch (_syncSettings.ConsoleMode)
|
|
|
|
|
{
|
|
|
|
@ -57,10 +56,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
case GambatteSyncSettings.ConsoleModeType.GBA:
|
|
|
|
|
flags |= LibGambatte.LoadFlags.CGB_MODE | LibGambatte.LoadFlags.GBA_FLAG;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
case GambatteSyncSettings.ConsoleModeType.Auto:
|
|
|
|
|
if (game.System == VSystemID.Raw.GBC)
|
|
|
|
|
flags |= LibGambatte.LoadFlags.CGB_MODE;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
throw new InvalidOperationException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (game.System == VSystemID.Raw.SGB)
|
|
|
|
@ -71,7 +72,68 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IsCgb = (flags & LibGambatte.LoadFlags.CGB_MODE) == LibGambatte.LoadFlags.CGB_MODE;
|
|
|
|
|
if (_syncSettings.EnableBIOS)
|
|
|
|
|
|
|
|
|
|
bool ForceBios()
|
|
|
|
|
{
|
|
|
|
|
// if we're not recording a movie, we don't need to force a bios
|
|
|
|
|
if (!DeterministicEmulation)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// if this rom can't be booted with a bios, don't force one
|
|
|
|
|
|
|
|
|
|
// SGB bios on the GB side technically doesn't care at all here and will always boot the rom
|
|
|
|
|
// (there are checks on the SNES side but Gambatte's HLE doesn't bother with that)
|
|
|
|
|
if (IsSgb)
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// we need the rom loaded in for this; we'll reload it for real later on with proper flags
|
|
|
|
|
if (LibGambatte.gambatte_loadbuf(GambatteState, file, (uint)file.Length, flags) != 0)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidOperationException($"{nameof(LibGambatte.gambatte_loadbuf)}() returned non-zero (is this not a gb or gbc rom?)");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// header checksum must pass for bios to boot the ROM
|
|
|
|
|
var unused = new byte[32];
|
|
|
|
|
LibGambatte.gambatte_pakinfo(GambatteState, unused, out _, out _, out _, out var hcok);
|
|
|
|
|
if (hcok == 0)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CGB bios checks top half of nintendo logo, DMG bios checks entire logo
|
|
|
|
|
// TODO: this check should probably be moved into the C++ side (in pakinfo)
|
|
|
|
|
const int logoStart = 0x104;
|
|
|
|
|
var logoEnd = 0x134;
|
|
|
|
|
if (IsCgb)
|
|
|
|
|
{
|
|
|
|
|
logoEnd -= (logoEnd - logoStart) / 2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var nintendoLogo = new byte[]
|
|
|
|
|
{
|
|
|
|
|
0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B, 0x03, 0x73, 0x00, 0x83, 0x00, 0x0C, 0x00, 0x0D,
|
|
|
|
|
0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E, 0xDC, 0xCC, 0x6E, 0xE6, 0xDD, 0xDD, 0xD9, 0x99,
|
|
|
|
|
0xBB, 0xBB, 0x67, 0x63, 0x6E, 0x0E, 0xEC, 0xCC, 0xDD, 0xDC, 0x99, 0x9F, 0xBB, 0xB9, 0x33, 0x3E
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
for (var i = logoStart; i < logoEnd; i++)
|
|
|
|
|
{
|
|
|
|
|
if (nintendoLogo[i - logoStart] != LibGambatte.gambatte_cpuread(GambatteState, (ushort)i))
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// if we get here, the rom can boot with a bios
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var useBios = _syncSettings.EnableBIOS || ForceBios();
|
|
|
|
|
if (useBios)
|
|
|
|
|
{
|
|
|
|
|
FirmwareID fwid = new(
|
|
|
|
|
IsCgb ? "GBC" : "GB",
|
|
|
|
@ -80,7 +142,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
: _syncSettings.ConsoleMode is GambatteSyncSettings.ConsoleModeType.GBA
|
|
|
|
|
? "AGB"
|
|
|
|
|
: "World");
|
|
|
|
|
var bios = comm.CoreFileProvider.GetFirmwareOrThrow(fwid, "BIOS Not Found, Cannot Load. Change SyncSettings to run without BIOS."); // https://github.com/TASEmulators/BizHawk/issues/2832 tho
|
|
|
|
|
var bios = comm.CoreFileProvider.GetFirmwareOrThrow(fwid, "BIOS Not Found, cannot Load. Change GB Settings to run without BIOS.");
|
|
|
|
|
if (LibGambatte.gambatte_loadbiosbuf(GambatteState, bios, (uint)bios.Length) != 0)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidOperationException($"{nameof(LibGambatte.gambatte_loadbiosbuf)}() returned non-zero (bios error)");
|
|
|
|
@ -88,11 +150,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
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.");
|
|
|
|
|
}
|
|
|
|
|
flags |= LibGambatte.LoadFlags.NO_BIOS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -123,31 +180,27 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
LagCount = 0;
|
|
|
|
|
IsLagFrame = false;
|
|
|
|
|
|
|
|
|
|
InputCallback = new LibGambatte.InputGetter(ControllerCallback);
|
|
|
|
|
InputCallback = ControllerCallback;
|
|
|
|
|
|
|
|
|
|
LibGambatte.gambatte_setinputgetter(GambatteState, InputCallback, IntPtr.Zero);
|
|
|
|
|
|
|
|
|
|
if (_syncSettings.EnableRemote)
|
|
|
|
|
{
|
|
|
|
|
RemoteCallback = new LibGambatte.RemoteCallback(RemoteInputCallback);
|
|
|
|
|
RemoteCallback = RemoteInputCallback;
|
|
|
|
|
LibGambatte.gambatte_setremotecallback(GambatteState, RemoteCallback);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
InitMemoryDomains();
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
var mbcBuf = new byte[32];
|
|
|
|
|
LibGambatte.gambatte_pakinfo(GambatteState, mbcBuf, out var rambanks, out var rombanks, out var crc, out var headerchecksumok);
|
|
|
|
|
|
|
|
|
|
byte[] romNameBuf = new byte[32];
|
|
|
|
|
var romNameBuf = new byte[32];
|
|
|
|
|
LibGambatte.gambatte_romtitle(GambatteState, romNameBuf);
|
|
|
|
|
string romname = Encoding.ASCII.GetString(romNameBuf);
|
|
|
|
|
var romname = Encoding.ASCII.GetString(romNameBuf).TrimEnd();
|
|
|
|
|
|
|
|
|
|
RomDetails = $"{game.Name}\r\n{SHA1Checksum.ComputePrefixedHex(file)}\r\n{MD5Checksum.ComputePrefixedHex(file)}\r\n\r\n";
|
|
|
|
|
BoardName = Encoding.ASCII.GetString(mbcBuf);
|
|
|
|
|
BoardName = Encoding.ASCII.GetString(mbcBuf).TrimEnd();
|
|
|
|
|
|
|
|
|
|
RomDetails += $"Core reported Header Name: {romname}\r\n";
|
|
|
|
|
RomDetails += $"Core reported RAM Banks: {rambanks}\r\n";
|
|
|
|
@ -155,16 +208,16 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
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)
|
|
|
|
|
if (useBios && 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");
|
|
|
|
|
"Disable BIOS in GB settings to boot this game");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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 };
|
|
|
|
|
var cgbDmgColors = new[] { 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
|
|
|
|
|
{
|
|
|
|
|
cgbDmgColors = ColorsFromTitleHash(file);
|
|
|
|
@ -172,14 +225,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
ChangeDMGColors(cgbDmgColors);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!DeterministicEmulation && _syncSettings.RealTimeRTC)
|
|
|
|
|
{
|
|
|
|
|
LibGambatte.gambatte_settimemode(GambatteState, false);
|
|
|
|
|
}
|
|
|
|
|
LibGambatte.gambatte_settimemode(GambatteState, DeterministicEmulation || !_syncSettings.RealTimeRTC);
|
|
|
|
|
|
|
|
|
|
if (DeterministicEmulation)
|
|
|
|
|
{
|
|
|
|
|
ulong dividers = _syncSettings.InitialTime * (0x400000UL + (ulong)_syncSettings.RTCDivisorOffset) / 2UL;
|
|
|
|
|
var dividers = _syncSettings.InitialTime * (0x400000UL + (ulong)_syncSettings.RTCDivisorOffset) / 2UL;
|
|
|
|
|
LibGambatte.gambatte_settime(GambatteState, dividers);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -187,7 +237,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
|
|
|
|
|
LibGambatte.gambatte_setcartbuspulluptime(GambatteState, (uint)_syncSettings.CartBusPullUpTime);
|
|
|
|
|
|
|
|
|
|
_cdCallback = new LibGambatte.CDCallback(CDCallbackProc);
|
|
|
|
|
_cdCallback = CDCallbackProc;
|
|
|
|
|
|
|
|
|
|
ControllerDefinition = CreateControllerDefinition(
|
|
|
|
|
sgb: IsSgb,
|
|
|
|
@ -242,12 +292,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// remote command to send
|
|
|
|
|
/// </summary>
|
|
|
|
|
private byte RemoteCommand = 0;
|
|
|
|
|
private byte RemoteCommand;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// internal gambatte state
|
|
|
|
|
/// </summary>
|
|
|
|
|
internal IntPtr GambatteState { get; private set; } = IntPtr.Zero;
|
|
|
|
|
internal IntPtr GambatteState { get; private set; }
|
|
|
|
|
|
|
|
|
|
public int LagCount { get; set; }
|
|
|
|
|
public bool IsLagFrame { get; set; }
|
|
|
|
@ -259,13 +309,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// total cycles actually executed
|
|
|
|
|
/// </summary>
|
|
|
|
|
private ulong _cycleCount = 0;
|
|
|
|
|
private ulong callbackCycleCount = 0;
|
|
|
|
|
private ulong _cycleCount;
|
|
|
|
|
private ulong callbackCycleCount;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// number of extra cycles we overran in the last frame
|
|
|
|
|
/// </summary>
|
|
|
|
|
private uint frameOverflow = 0;
|
|
|
|
|
private uint frameOverflow;
|
|
|
|
|
public long CycleCount => (long)_cycleCount;
|
|
|
|
|
public double ClockRate => TICKSPERSECOND;
|
|
|
|
|
|
|
|
|
@ -290,8 +340,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
}
|
|
|
|
|
if (sgb)
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < 4; i++)
|
|
|
|
|
for (var i = 0; i < 4; i++)
|
|
|
|
|
{
|
|
|
|
|
// ReSharper disable once AccessToModifiedClosure
|
|
|
|
|
ret.BoolButtons.AddRange(
|
|
|
|
|
new[] { "Up", "Down", "Left", "Right", "Start", "Select", "B", "A" }
|
|
|
|
|
.Select(s => $"P{i + 1} {s}"));
|
|
|
|
@ -309,10 +360,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
{
|
|
|
|
|
InputCallbacks.Call();
|
|
|
|
|
IsLagFrame = false;
|
|
|
|
|
|
|
|
|
|
if (IsSgb)
|
|
|
|
|
{
|
|
|
|
|
int index = LibGambatte.gambatte_getjoypadindex(GambatteState);
|
|
|
|
|
uint b = (uint)CurrentButtons;
|
|
|
|
|
var index = LibGambatte.gambatte_getjoypadindex(GambatteState);
|
|
|
|
|
var b = (uint)CurrentButtons;
|
|
|
|
|
b >>= index * 8;
|
|
|
|
|
b &= 0xFF;
|
|
|
|
|
if ((b & 0x30) == 0x30) // snes software side blocks l+r
|
|
|
|
@ -323,13 +375,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
{
|
|
|
|
|
b &= ~0xC0u;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (LibGambatte.Buttons)b;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
return CurrentButtons;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private byte RemoteInputCallback()
|
|
|
|
|
{
|
|
|
|
@ -348,7 +399,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
public bool IsCGBDMGMode
|
|
|
|
|
=> LibGambatte.gambatte_iscgbdmg(GambatteState);
|
|
|
|
|
|
|
|
|
|
private InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
|
|
|
|
private InputCallbackSystem _inputCallbacks = new();
|
|
|
|
|
|
|
|
|
|
// low priority TODO: due to certain aspects of the core implementation,
|
|
|
|
|
// we don't smartly use the ActiveChanged event here.
|
|
|
|
@ -433,131 +484,131 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
|
|
|
|
|
private static int[] ColorsFromTitleHash(byte[] romdata)
|
|
|
|
|
{
|
|
|
|
|
int titleHash = 0;
|
|
|
|
|
for (int i = 0; i < 16; i++)
|
|
|
|
|
var titleHash = 0;
|
|
|
|
|
for (var i = 0; i < 16; i++)
|
|
|
|
|
{
|
|
|
|
|
titleHash += romdata[0x134 + i];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (titleHash & 0xFF) switch
|
|
|
|
|
{
|
|
|
|
|
0x01 or 0x10 or 0x29 or 0x52 or 0x5D or 0x68 or 0x6D or 0xF6 => new int[] { 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000, 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000 },
|
|
|
|
|
0x0C or 0x16 or 0x35 or 0x67 or 0x75 or 0x92 or 0x99 or 0xB7 => new int[] { 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000, 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000, 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000 },
|
|
|
|
|
0x14 => new int[] { 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x15 or 0xDB => new int[] { 0xFFFFFF, 0xFFFF00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFFFF00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFFFF00, 0xFF0000, 0x000000 },
|
|
|
|
|
0x17 or 0x8B => new int[] { 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
0x19 => new int[] { 0xFFFFFF, 0xFF9C00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x1D => new int[] { 0xA59CFF, 0xFFFF00, 0x006300, 0x000000, 0xFF6352, 0xD60000, 0x630000, 0x000000, 0xFF6352, 0xD60000, 0x630000, 0x000000 },
|
|
|
|
|
0x34 => new int[] { 0xFFFFFF, 0x7BFF00, 0xB57300, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x36 => new int[] { 0x52DE00, 0xFF8400, 0xFFFF00, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x39 or 0x43 or 0x97 => new int[] { 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
0x3C => new int[] { 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x3D => new int[] { 0xFFFFFF, 0x52FF00, 0xFF4200, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x3E or 0xE0 => new int[] { 0xFFFFFF, 0xFF9C00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFF9C00, 0xFF0000, 0x000000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
0x49 or 0x5C => new int[] { 0xA59CFF, 0xFFFF00, 0x006300, 0x000000, 0xFF6352, 0xD60000, 0x630000, 0x000000, 0x0000FF, 0xFFFFFF, 0xFFFF7B, 0x0084FF },
|
|
|
|
|
0x4B or 0x90 or 0x9A or 0xBD => new int[] { 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x4E => new int[] { 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFFFF7B, 0x0084FF, 0xFF0000 },
|
|
|
|
|
0x58 => new int[] { 0xFFFFFF, 0xA5A5A5, 0x525252, 0x000000, 0xFFFFFF, 0xA5A5A5, 0x525252, 0x000000, 0xFFFFFF, 0xA5A5A5, 0x525252, 0x000000 },
|
|
|
|
|
0x59 => new int[] { 0xFFFFFF, 0xADAD84, 0x42737B, 0x000000, 0xFFFFFF, 0xFF7300, 0x944200, 0x000000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
0x69 or 0xF2 => new int[] { 0xFFFFFF, 0xFFFF00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFFFF00, 0xFF0000, 0x000000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
0x6B => new int[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFC542, 0xFFD600, 0x943A00, 0x4A0000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
0x6F => new int[] { 0xFFFFFF, 0xFFCE00, 0x9C6300, 0x000000, 0xFFFFFF, 0xFFCE00, 0x9C6300, 0x000000, 0xFFFFFF, 0xFFCE00, 0x9C6300, 0x000000 },
|
|
|
|
|
0x70 => new int[] { 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x00FF00, 0x318400, 0x004A00, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
0x71 or 0xFF => new int[] { 0xFFFFFF, 0xFF9C00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFF9C00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFF9C00, 0xFF0000, 0x000000 },
|
|
|
|
|
0x86 or 0xA8 => new int[] { 0xFFFF9C, 0x94B5FF, 0x639473, 0x003A3A, 0xFFC542, 0xFFD600, 0x943A00, 0x4A0000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x88 => new int[] { 0xA59CFF, 0xFFFF00, 0x006300, 0x000000, 0xA59CFF, 0xFFFF00, 0x006300, 0x000000, 0xA59CFF, 0xFFFF00, 0x006300, 0x000000 },
|
|
|
|
|
0x8C => new int[] { 0xFFFFFF, 0xADAD84, 0x42737B, 0x000000, 0xFFFFFF, 0xFF7300, 0x944200, 0x000000, 0xFFFFFF, 0xADAD84, 0x42737B, 0x000000 },
|
|
|
|
|
0x95 => new int[] { 0xFFFFFF, 0x52FF00, 0xFF4200, 0x000000, 0xFFFFFF, 0x52FF00, 0xFF4200, 0x000000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
0x9C => new int[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFC542, 0xFFD600, 0x943A00, 0x4A0000 },
|
|
|
|
|
0x9D => new int[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000 },
|
|
|
|
|
0xA2 or 0xF7 => new int[] { 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000, 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
0xAA => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000 },
|
|
|
|
|
0xC9 => new int[] { 0xFFFFCE, 0x63EFEF, 0x9C8431, 0x5A5A5A, 0xFFFFFF, 0xFF7300, 0x944200, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
0xCE or 0xD1 or 0xF0 => new int[] { 0x6BFF00, 0xFFFFFF, 0xFF524A, 0x000000, 0xFFFFFF, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000 },
|
|
|
|
|
0xE8 => new int[] { 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF, 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF, 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF },
|
|
|
|
|
0x0D => (romdata[0x137]) switch
|
|
|
|
|
0x01 or 0x10 or 0x29 or 0x52 or 0x5D or 0x68 or 0x6D or 0xF6 => new[] { 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000, 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000 },
|
|
|
|
|
0x0C or 0x16 or 0x35 or 0x67 or 0x75 or 0x92 or 0x99 or 0xB7 => new[] { 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000, 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000, 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000 },
|
|
|
|
|
0x14 => new[] { 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x15 or 0xDB => new[] { 0xFFFFFF, 0xFFFF00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFFFF00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFFFF00, 0xFF0000, 0x000000 },
|
|
|
|
|
0x17 or 0x8B => new[] { 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
0x19 => new[] { 0xFFFFFF, 0xFF9C00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x1D => new[] { 0xA59CFF, 0xFFFF00, 0x006300, 0x000000, 0xFF6352, 0xD60000, 0x630000, 0x000000, 0xFF6352, 0xD60000, 0x630000, 0x000000 },
|
|
|
|
|
0x34 => new[] { 0xFFFFFF, 0x7BFF00, 0xB57300, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x36 => new[] { 0x52DE00, 0xFF8400, 0xFFFF00, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x39 or 0x43 or 0x97 => new[] { 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
0x3C => new[] { 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x3D => new[] { 0xFFFFFF, 0x52FF00, 0xFF4200, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x3E or 0xE0 => new[] { 0xFFFFFF, 0xFF9C00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFF9C00, 0xFF0000, 0x000000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
0x49 or 0x5C => new[] { 0xA59CFF, 0xFFFF00, 0x006300, 0x000000, 0xFF6352, 0xD60000, 0x630000, 0x000000, 0x0000FF, 0xFFFFFF, 0xFFFF7B, 0x0084FF },
|
|
|
|
|
0x4B or 0x90 or 0x9A or 0xBD => new[] { 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x4E => new[] { 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFFFF7B, 0x0084FF, 0xFF0000 },
|
|
|
|
|
0x58 => new[] { 0xFFFFFF, 0xA5A5A5, 0x525252, 0x000000, 0xFFFFFF, 0xA5A5A5, 0x525252, 0x000000, 0xFFFFFF, 0xA5A5A5, 0x525252, 0x000000 },
|
|
|
|
|
0x59 => new[] { 0xFFFFFF, 0xADAD84, 0x42737B, 0x000000, 0xFFFFFF, 0xFF7300, 0x944200, 0x000000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
0x69 or 0xF2 => new[] { 0xFFFFFF, 0xFFFF00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFFFF00, 0xFF0000, 0x000000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
0x6B => new[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFC542, 0xFFD600, 0x943A00, 0x4A0000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
0x6F => new[] { 0xFFFFFF, 0xFFCE00, 0x9C6300, 0x000000, 0xFFFFFF, 0xFFCE00, 0x9C6300, 0x000000, 0xFFFFFF, 0xFFCE00, 0x9C6300, 0x000000 },
|
|
|
|
|
0x70 => new[] { 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x00FF00, 0x318400, 0x004A00, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
0x71 or 0xFF => new[] { 0xFFFFFF, 0xFF9C00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFF9C00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFF9C00, 0xFF0000, 0x000000 },
|
|
|
|
|
0x86 or 0xA8 => new[] { 0xFFFF9C, 0x94B5FF, 0x639473, 0x003A3A, 0xFFC542, 0xFFD600, 0x943A00, 0x4A0000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x88 => new[] { 0xA59CFF, 0xFFFF00, 0x006300, 0x000000, 0xA59CFF, 0xFFFF00, 0x006300, 0x000000, 0xA59CFF, 0xFFFF00, 0x006300, 0x000000 },
|
|
|
|
|
0x8C => new[] { 0xFFFFFF, 0xADAD84, 0x42737B, 0x000000, 0xFFFFFF, 0xFF7300, 0x944200, 0x000000, 0xFFFFFF, 0xADAD84, 0x42737B, 0x000000 },
|
|
|
|
|
0x95 => new[] { 0xFFFFFF, 0x52FF00, 0xFF4200, 0x000000, 0xFFFFFF, 0x52FF00, 0xFF4200, 0x000000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
0x9C => new[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFC542, 0xFFD600, 0x943A00, 0x4A0000 },
|
|
|
|
|
0x9D => new[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000 },
|
|
|
|
|
0xA2 or 0xF7 => new[] { 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000, 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
0xAA => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000 },
|
|
|
|
|
0xC9 => new[] { 0xFFFFCE, 0x63EFEF, 0x9C8431, 0x5A5A5A, 0xFFFFFF, 0xFF7300, 0x944200, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
0xCE or 0xD1 or 0xF0 => new[] { 0x6BFF00, 0xFFFFFF, 0xFF524A, 0x000000, 0xFFFFFF, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000 },
|
|
|
|
|
0xE8 => new[] { 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF, 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF, 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF },
|
|
|
|
|
0x0D => romdata[0x137] switch
|
|
|
|
|
{
|
|
|
|
|
0x45 => new int[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFC542, 0xFFD600, 0x943A00, 0x4A0000, 0xFFC542, 0xFFD600, 0x943A00, 0x4A0000 },
|
|
|
|
|
0x52 => new int[] { 0xFFFFFF, 0xFFFF00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFFFF00, 0xFF0000, 0x000000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
_ => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x45 => new[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFC542, 0xFFD600, 0x943A00, 0x4A0000, 0xFFC542, 0xFFD600, 0x943A00, 0x4A0000 },
|
|
|
|
|
0x52 => new[] { 0xFFFFFF, 0xFFFF00, 0xFF0000, 0x000000, 0xFFFFFF, 0xFFFF00, 0xFF0000, 0x000000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
_ => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
},
|
|
|
|
|
0x18 => (romdata[0x137]) switch
|
|
|
|
|
0x18 => romdata[0x137] switch
|
|
|
|
|
{
|
|
|
|
|
0x4B => new int[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFC542, 0xFFD600, 0x943A00, 0x4A0000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
_ => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x4B => new[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFC542, 0xFFD600, 0x943A00, 0x4A0000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
_ => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
},
|
|
|
|
|
0x27 => (romdata[0x137]) switch
|
|
|
|
|
0x27 => romdata[0x137] switch
|
|
|
|
|
{
|
|
|
|
|
0x42 => new int[] { 0xA59CFF, 0xFFFF00, 0x006300, 0x000000, 0xFF6352, 0xD60000, 0x630000, 0x000000, 0x0000FF, 0xFFFFFF, 0xFFFF7B, 0x0084FF },
|
|
|
|
|
0x4E => new int[] { 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
_ => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x42 => new[] { 0xA59CFF, 0xFFFF00, 0x006300, 0x000000, 0xFF6352, 0xD60000, 0x630000, 0x000000, 0x0000FF, 0xFFFFFF, 0xFFFF7B, 0x0084FF },
|
|
|
|
|
0x4E => new[] { 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
_ => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
},
|
|
|
|
|
0x28 => (romdata[0x137]) switch
|
|
|
|
|
0x28 => romdata[0x137] switch
|
|
|
|
|
{
|
|
|
|
|
0x41 => new int[] { 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF, 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF, 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF },
|
|
|
|
|
0x46 => new int[] { 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
_ => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x41 => new[] { 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF, 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF, 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF },
|
|
|
|
|
0x46 => new[] { 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
_ => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
},
|
|
|
|
|
0x46 => (romdata[0x137]) switch
|
|
|
|
|
0x46 => romdata[0x137] switch
|
|
|
|
|
{
|
|
|
|
|
0x45 => new int[] { 0xB5B5FF, 0xFFFF94, 0xAD5A42, 0x000000, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A },
|
|
|
|
|
0x52 => new int[] { 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000, 0xFFFF00, 0xFF0000, 0x630000, 0x000000, 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000 },
|
|
|
|
|
_ => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x45 => new[] { 0xB5B5FF, 0xFFFF94, 0xAD5A42, 0x000000, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A },
|
|
|
|
|
0x52 => new[] { 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000, 0xFFFF00, 0xFF0000, 0x630000, 0x000000, 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000 },
|
|
|
|
|
_ => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
},
|
|
|
|
|
0x61 => (romdata[0x137]) switch
|
|
|
|
|
0x61 => romdata[0x137] switch
|
|
|
|
|
{
|
|
|
|
|
0x41 => new int[] { 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
0x45 => new int[] { 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
_ => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x41 => new[] { 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
0x45 => new[] { 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
_ => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
},
|
|
|
|
|
0x66 => (romdata[0x137]) switch
|
|
|
|
|
0x66 => romdata[0x137] switch
|
|
|
|
|
{
|
|
|
|
|
0x45 => new int[] { 0xFFFFFF, 0x7BFF00, 0xB57300, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
_ => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x45 => new[] { 0xFFFFFF, 0x7BFF00, 0xB57300, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
_ => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
},
|
|
|
|
|
0x6A => (romdata[0x137]) switch
|
|
|
|
|
0x6A => romdata[0x137] switch
|
|
|
|
|
{
|
|
|
|
|
0x49 => new int[] { 0xFFFFFF, 0x52FF00, 0xFF4200, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x4B => new int[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFC542, 0xFFD600, 0x943A00, 0x4A0000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
_ => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x49 => new[] { 0xFFFFFF, 0x52FF00, 0xFF4200, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x4B => new[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFC542, 0xFFD600, 0x943A00, 0x4A0000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
_ => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
},
|
|
|
|
|
0xA5 => (romdata[0x137]) switch
|
|
|
|
|
0xA5 => romdata[0x137] switch
|
|
|
|
|
{
|
|
|
|
|
0x41 => new int[] { 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF, 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF, 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF },
|
|
|
|
|
0x52 => new int[] { 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000, 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000 },
|
|
|
|
|
_ => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x41 => new[] { 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF, 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF, 0x000000, 0x008484, 0xFFDE00, 0xFFFFFF },
|
|
|
|
|
0x52 => new[] { 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000, 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000, 0xFFFFFF, 0x7BFF31, 0x008400, 0x000000 },
|
|
|
|
|
_ => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
},
|
|
|
|
|
0xB3 => (romdata[0x137]) switch
|
|
|
|
|
0xB3 => romdata[0x137] switch
|
|
|
|
|
{
|
|
|
|
|
0x42 => new int[] { 0xA59CFF, 0xFFFF00, 0x006300, 0x000000, 0xFF6352, 0xD60000, 0x630000, 0x000000, 0x0000FF, 0xFFFFFF, 0xFFFF7B, 0x0084FF },
|
|
|
|
|
0x52 => new int[] { 0xFFFFFF, 0x52FF00, 0xFF4200, 0x000000, 0xFFFFFF, 0x52FF00, 0xFF4200, 0x000000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
0x55 => new int[] { 0xFFFFFF, 0xADAD84, 0x42737B, 0x000000, 0xFFFFFF, 0xFF7300, 0x944200, 0x000000, 0xFFFFFF, 0xFF7300, 0x944200, 0x000000 },
|
|
|
|
|
_ => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x42 => new[] { 0xA59CFF, 0xFFFF00, 0x006300, 0x000000, 0xFF6352, 0xD60000, 0x630000, 0x000000, 0x0000FF, 0xFFFFFF, 0xFFFF7B, 0x0084FF },
|
|
|
|
|
0x52 => new[] { 0xFFFFFF, 0x52FF00, 0xFF4200, 0x000000, 0xFFFFFF, 0x52FF00, 0xFF4200, 0x000000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
0x55 => new[] { 0xFFFFFF, 0xADAD84, 0x42737B, 0x000000, 0xFFFFFF, 0xFF7300, 0x944200, 0x000000, 0xFFFFFF, 0xFF7300, 0x944200, 0x000000 },
|
|
|
|
|
_ => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
},
|
|
|
|
|
0xBF => (romdata[0x137]) switch
|
|
|
|
|
0xBF => romdata[0x137] switch
|
|
|
|
|
{
|
|
|
|
|
0x20 => new int[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x43 => new int[] { 0x6BFF00, 0xFFFFFF, 0xFF524A, 0x000000, 0xFFFFFF, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000 },
|
|
|
|
|
_ => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x20 => new[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x43 => new[] { 0x6BFF00, 0xFFFFFF, 0xFF524A, 0x000000, 0xFFFFFF, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000 },
|
|
|
|
|
_ => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
},
|
|
|
|
|
0xC6 => (romdata[0x137]) switch
|
|
|
|
|
0xC6 => romdata[0x137] switch
|
|
|
|
|
{
|
|
|
|
|
0x41 => new int[] { 0xFFFFFF, 0xADAD84, 0x42737B, 0x000000, 0xFFFFFF, 0xFF7300, 0x944200, 0x000000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
_ => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x41 => new[] { 0xFFFFFF, 0xADAD84, 0x42737B, 0x000000, 0xFFFFFF, 0xFF7300, 0x944200, 0x000000, 0xFFFFFF, 0x5ABDFF, 0xFF0000, 0x0000FF },
|
|
|
|
|
_ => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
},
|
|
|
|
|
0xD3 => (romdata[0x137]) switch
|
|
|
|
|
0xD3 => romdata[0x137] switch
|
|
|
|
|
{
|
|
|
|
|
0x49 => new int[] { 0xFFFFFF, 0xADAD84, 0x42737B, 0x000000, 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
0x52 => new int[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000 },
|
|
|
|
|
_ => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x49 => new[] { 0xFFFFFF, 0xADAD84, 0x42737B, 0x000000, 0xFFFFFF, 0xFFAD63, 0x843100, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
0x52 => new[] { 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x8C8CDE, 0x52528C, 0x000000 },
|
|
|
|
|
_ => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
},
|
|
|
|
|
0xF4 => (romdata[0x137]) switch
|
|
|
|
|
0xF4 => romdata[0x137] switch
|
|
|
|
|
{
|
|
|
|
|
0x20 => new int[] { 0xFFFFFF, 0x7BFF00, 0xB57300, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x2D => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
_ => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x20 => new[] { 0xFFFFFF, 0x7BFF00, 0xB57300, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
0x2D => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0x63A5FF, 0x0000FF, 0x000000 },
|
|
|
|
|
_ => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
},
|
|
|
|
|
_ => new int[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
_ => new[] { 0xFFFFFF, 0x7BFF31, 0x0063C5, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000, 0xFFFFFF, 0xFF8484, 0x943A3A, 0x000000 },
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -567,7 +618,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
var _bgpal = IntPtr.Zero;
|
|
|
|
|
var _sppal = IntPtr.Zero;
|
|
|
|
|
var _oam = IntPtr.Zero;
|
|
|
|
|
int unused = 0;
|
|
|
|
|
var unused = 0;
|
|
|
|
|
if (!LibGambatte.gambatte_getmemoryarea(GambatteState, LibGambatte.MemoryAreas.vram, ref _vram, ref unused)
|
|
|
|
|
|| !LibGambatte.gambatte_getmemoryarea(GambatteState, LibGambatte.MemoryAreas.bgpal, ref _bgpal, ref unused)
|
|
|
|
|
|| !LibGambatte.gambatte_getmemoryarea(GambatteState, LibGambatte.MemoryAreas.sppal, ref _sppal, ref unused)
|
|
|
|
@ -609,20 +660,21 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
endofframecallback = null;
|
|
|
|
|
if (callback == null || line == -1 || line == -2)
|
|
|
|
|
if (callback == null || line is -1 or -2)
|
|
|
|
|
{
|
|
|
|
|
scanlinecb = null;
|
|
|
|
|
LibGambatte.gambatte_setscanlinecallback(GambatteState, null, 0);
|
|
|
|
|
if (line == -1)
|
|
|
|
|
switch (line)
|
|
|
|
|
{
|
|
|
|
|
case -1:
|
|
|
|
|
endofframecallback = callback;
|
|
|
|
|
}
|
|
|
|
|
else if (line == -2)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
case -2:
|
|
|
|
|
callback(LibGambatte.gambatte_cpuread(GambatteState, 0xFF40));
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (line >= 0 && line <= 153)
|
|
|
|
|
else if (line is >= 0 and <= 153)
|
|
|
|
|
{
|
|
|
|
|
scanlinecb = () => callback(LibGambatte.gambatte_cpuread(GambatteState, 0xFF40));
|
|
|
|
|
LibGambatte.gambatte_setscanlinecallback(GambatteState, scanlinecb, line);
|
|
|
|
@ -648,7 +700,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
|
|
|
|
|
if (callback != null)
|
|
|
|
|
{
|
|
|
|
|
printer = new GambattePrinter(this, callback);
|
|
|
|
|
printer = new(this, callback);
|
|
|
|
|
_linkConnected = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@ -670,7 +722,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void ChangeDMGColors(int[] colors)
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < 12; i++)
|
|
|
|
|
for (var i = 0; i < 12; i++)
|
|
|
|
|
{
|
|
|
|
|
LibGambatte.gambatte_setdmgpalettecolor(GambatteState, (LibGambatte.PalType)(i / 4), (uint)i % 4, (uint)colors[i]);
|
|
|
|
|
}
|
|
|
|
@ -678,7 +730,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
|
|
|
|
|
|
|
|
public void SetCGBColors(GBColors.ColorType type)
|
|
|
|
|
{
|
|
|
|
|
int[] lut = GBColors.GetLut(type, IsSgb, _syncSettings.ConsoleMode is GambatteSyncSettings.ConsoleModeType.GBA);
|
|
|
|
|
var lut = GBColors.GetLut(type, IsSgb, _syncSettings.ConsoleMode is GambatteSyncSettings.ConsoleModeType.GBA);
|
|
|
|
|
LibGambatte.gambatte_setcgbpalette(GambatteState, lut);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|