Sameboy SGB: allow hiding beautiful borders. Closes #938

This commit is contained in:
nattthebear 2017-07-25 17:16:12 -04:00
parent 06a369dbe2
commit 2329ebbe62
1 changed files with 58 additions and 13 deletions

View File

@ -16,7 +16,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy
"https://sameboy.github.io/", false)]
public class Sameboy : WaterboxCore,
IGameboyCommon, ISaveRam,
ISettable<object, Sameboy.SyncSettings>
ISettable<Sameboy.Settings, Sameboy.SyncSettings>
{
/// <summary>
/// the nominal length of one frame
@ -38,20 +38,20 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy
private bool _sgb;
[CoreConstructor("SGB")]
public Sameboy(byte[] rom, CoreComm comm, SyncSettings syncSettings, bool deterministic)
: this(rom, comm, true, syncSettings, deterministic)
public Sameboy(byte[] rom, CoreComm comm, Settings settings, SyncSettings syncSettings, bool deterministic)
: this(rom, comm, true, settings, syncSettings, deterministic)
{ }
[CoreConstructor("GB")]
public Sameboy(CoreComm comm, byte[] rom, SyncSettings syncSettings, bool deterministic)
: this(rom, comm, false, syncSettings, deterministic)
public Sameboy(CoreComm comm, byte[] rom, Settings settings, SyncSettings syncSettings, bool deterministic)
: this(rom, comm, false, settings, syncSettings, deterministic)
{ }
public Sameboy(byte[] rom, CoreComm comm, bool sgb, SyncSettings syncSettings, bool deterministic)
public Sameboy(byte[] rom, CoreComm comm, bool sgb, Settings settings, SyncSettings syncSettings, bool deterministic)
: base(comm, new Configuration
{
DefaultWidth = sgb ? 256 : 160,
DefaultHeight = sgb ? 224 : 144,
DefaultWidth = sgb && (settings == null || settings.ShowSgbBorder) ? 256 : 160,
DefaultHeight = sgb && (settings == null || settings.ShowSgbBorder) ? 224 : 144,
MaxWidth = sgb ? 256 : 160,
MaxHeight = sgb ? 224 : 144,
MaxSamples = 1024,
@ -74,6 +74,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy
_sgb = sgb;
Console.WriteLine("Automaticly detected CGB to " + _cgb);
_syncSettings = syncSettings ?? new SyncSettings();
_settings = settings ?? new Settings();
var bios = _syncSettings.UseRealBIOS && !sgb
? comm.CoreFileProvider.GetFirmware(_cgb ? "GBC" : "GB", "World", true)
@ -179,8 +180,31 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy
#region ISettable
private Settings _settings;
private SyncSettings _syncSettings;
public class Settings
{
[DisplayName("Show SGB Border")]
[DefaultValue(true)]
public bool ShowSgbBorder { get; set; }
public Settings Clone()
{
return (Settings)MemberwiseClone();
}
public static bool NeedsReboot(Settings x, Settings y)
{
return false;
}
public Settings()
{
SettingsUtil.SetDefaultValues(this);
}
}
public class SyncSettings
{
[DisplayName("Initial Time")]
@ -213,9 +237,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy
}
}
public object GetSettings()
public Settings GetSettings()
{
return null;
return _settings.Clone();
}
public SyncSettings GetSyncSettings()
@ -223,9 +247,11 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy
return _syncSettings.Clone();
}
public bool PutSettings(object o)
public bool PutSettings(Settings o)
{
return false;
var ret = Settings.NeedsReboot(_settings, o);
_settings = o;
return ret;
}
public bool PutSyncSettings(SyncSettings o)
@ -246,10 +272,29 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy
};
}
protected override void FrameAdvancePost()
protected unsafe override void FrameAdvancePost()
{
if (_scanlineCallback != null && _scanlineCallbackLine == -1)
_scanlineCallback(_core.GetIoReg(0x40));
if (_sgb && !_settings.ShowSgbBorder)
{
fixed(int *buff = _videoBuffer)
{
int* dst = buff;
int* src = buff + (224 - 144) / 2 * 256 + (256 - 160) / 2;
for (int j = 0; j < 144; j++)
{
for (int i = 0; i < 160; i++)
{
*dst++ = *src++;
}
src += 256 - 160;
}
}
BufferWidth = 160;
BufferHeight = 144;
}
}
protected override void LoadStateBinaryInternal(BinaryReader reader)