diff --git a/BizHawk.Client.Common/config/Config.cs b/BizHawk.Client.Common/config/Config.cs index 292e2b1926..e94685c0ee 100644 --- a/BizHawk.Client.Common/config/Config.cs +++ b/BizHawk.Client.Common/config/Config.cs @@ -1,4 +1,5 @@ -using System.Drawing; +using System; +using System.Drawing; using System.Collections.Generic; using BizHawk.Emulation.Common; using BizHawk.Emulation.Cores.Nintendo.Gameboy; @@ -307,10 +308,60 @@ namespace BizHawk.Client.Common public int GifWriterFrameskip = 3; public int GifWriterDelay = -1; - // emulation core settings + #region emulation core settings + public Dictionary CoreSettings = new Dictionary(); public Dictionary CoreSyncSettings = new Dictionary(); + public object GetCoreSettings() + where T : IEmulator + { + return GetCoreSettings(typeof(T)); + } + public object GetCoreSettings(Type t) + { + object ret; + CoreSettings.TryGetValue(t.ToString(), out ret); + return ret; + } + public void PutCoreSettings(object o) + where T : IEmulator + { + PutCoreSettings(o, typeof(T)); + } + public void PutCoreSettings(object o, Type t) + { + if (o != null) + CoreSettings[t.ToString()] = o; + else + CoreSettings.Remove(t.ToString()); + } + public object GetCoreSyncSettings() + where T : IEmulator + { + return GetCoreSyncSettings(typeof(T)); + } + public object GetCoreSyncSettings(Type t) + { + object ret; + CoreSyncSettings.TryGetValue(t.ToString(), out ret); + return ret; + } + public void PutCoreSyncSettings(object o) + where T : IEmulator + { + PutCoreSyncSettings(o, typeof(T)); + } + public void PutCoreSyncSettings(object o, Type t) + { + if (o != null) + CoreSyncSettings[t.ToString()] = o; + else + CoreSyncSettings.Remove(t.ToString()); + } + + #endregion + // NESPPU Settings public bool AutoLoadNESPPU = false; public bool NESPPUSaveWindowPosition = true; @@ -591,9 +642,9 @@ namespace BizHawk.Client.Common public bool GGHighlightActiveDisplayRegion = false; // PCEngine Settings - public bool PceSpriteLimit = false; - public bool PceEqualizeVolume = false; - public bool PceArcadeCardRewindHack = true; + //public bool PceSpriteLimit = false; + //public bool PceEqualizeVolume = false; + //public bool PceArcadeCardRewindHack = true; // Genesis Settings diff --git a/BizHawk.Client.EmuHawk/MainForm.Events.cs b/BizHawk.Client.EmuHawk/MainForm.Events.cs index 28c603a056..29a21fbbfd 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Events.cs @@ -11,6 +11,7 @@ using BizHawk.Emulation.Cores.Calculators; using BizHawk.Emulation.Cores.Nintendo.Gameboy; using BizHawk.Emulation.Cores.Nintendo.NES; using BizHawk.Emulation.Cores.Nintendo.SNES; +using BizHawk.Emulation.Cores.PCEngine; namespace BizHawk.Client.EmuHawk { @@ -1235,9 +1236,11 @@ namespace BizHawk.Client.EmuHawk private void PCESubMenu_DropDownOpened(object sender, EventArgs e) { - PCEAlwaysPerformSpriteLimitMenuItem.Checked = Global.Config.PceSpriteLimit; - PCEAlwaysEqualizeVolumesMenuItem.Checked = Global.Config.PceEqualizeVolume; - PCEArcadeCardRewindEnableMenuItem.Checked = Global.Config.PceArcadeCardRewindHack; + var s = (PCEngine.PCESettings)Global.Emulator.GetSettings(); + + PCEAlwaysPerformSpriteLimitMenuItem.Checked = s.SpriteLimit; + PCEAlwaysEqualizeVolumesMenuItem.Checked = s.EqualizeVolume; + PCEArcadeCardRewindEnableMenuItem.Checked = s.ArcadeCardRewindHack; } private void PCEBGViewerMenuItem_Click(object sender, EventArgs e) @@ -1247,26 +1250,28 @@ namespace BizHawk.Client.EmuHawk private void PCEAlwaysPerformSpriteLimitMenuItem_Click(object sender, EventArgs e) { - Global.Config.PceSpriteLimit ^= true; - FlagNeedsReboot(); + var s = (PCEngine.PCESettings)Global.Emulator.GetSettings(); + s.SpriteLimit ^= true; + PutCoreSettings(s); } private void PCEAlwaysEqualizeVolumesMenuItem_Click(object sender, EventArgs e) { - Global.Config.PceEqualizeVolume ^= true; - FlagNeedsReboot(); + var s = (PCEngine.PCESettings)Global.Emulator.GetSettings(); + s.EqualizeVolume ^= true; + PutCoreSettings(s); } private void PCEArcadeCardRewindEnableMenuItem_Click(object sender, EventArgs e) { - Global.Config.PceArcadeCardRewindHack ^= true; - FlagNeedsReboot(); + var s = (PCEngine.PCESettings)Global.Emulator.GetSettings(); + s.ArcadeCardRewindHack ^= true; + PutCoreSettings(s); } private void PCEGraphicsSettingsMenuItem_Click(object sender, EventArgs e) { new PCEGraphicsConfig().ShowDialog(); - CoreFileProvider.SyncCoreCommInputSignals(); } #endregion diff --git a/BizHawk.Client.EmuHawk/MainForm.cs b/BizHawk.Client.EmuHawk/MainForm.cs index 00377e4754..35d85b220b 100644 --- a/BizHawk.Client.EmuHawk/MainForm.cs +++ b/BizHawk.Client.EmuHawk/MainForm.cs @@ -2152,6 +2152,16 @@ namespace BizHawk.Client.EmuHawk LoadRom(file.FullName); } + /// + /// send core settings to emu, setting reboot flag if needed + /// + /// + private void PutCoreSettings(object o) + { + if (Global.Emulator.PutSettings(o)) + FlagNeedsReboot(); + } + private void SaveConfig() { if (Global.Config.SaveWindowPosition) @@ -3253,23 +3263,8 @@ namespace BizHawk.Client.EmuHawk "This game requires a version 3.0 System card and won't run with the system card you've selected. Try selecting a 3.0 System Card in Config->Paths->PC Engine."); } - if (Global.Config.PceSpriteLimit) - { - game.AddOption("ForceSpriteLimit"); - } - - if (Global.Config.PceEqualizeVolume) - { - game.AddOption("EqualizeVolumes"); - } - - if (Global.Config.PceArcadeCardRewindHack) - { - game.AddOption("ArcadeRewindHack"); - } - game.FirmwareHash = Util.BytesToHexString(System.Security.Cryptography.SHA1.Create().ComputeHash(rom.RomData)); - nextEmulator = new PCEngine(nextComm, game, disc, rom.RomData); + nextEmulator = new PCEngine(nextComm, game, disc, rom.RomData, Global.Config.GetCoreSettings()); break; } } @@ -3410,12 +3405,7 @@ namespace BizHawk.Client.EmuHawk case "PCE": case "PCECD": case "SGX": - if (Global.Config.PceSpriteLimit) - { - game.AddOption("ForceSpriteLimit"); - } - - nextEmulator = new PCEngine(nextComm, game, rom.RomData); + nextEmulator = new PCEngine(nextComm, game, rom.RomData, Global.Config.GetCoreSettings()); break; case "GEN": { @@ -3431,10 +3421,9 @@ namespace BizHawk.Client.EmuHawk } break; case "NES": - { - var nes = new NES(nextComm, game, rom.FileData, Global.MovieSession.Movie.Header.BoardProperties); - nextEmulator = nes; - } + nextEmulator = new NES(nextComm, game, rom.FileData, + Global.Config.GetCoreSettings(), + Global.MovieSession.Movie.Header.BoardProperties); break; case "GB": case "GBC": @@ -3559,15 +3548,6 @@ namespace BizHawk.Client.EmuHawk return false; } - // load core settings - { - string typename = nextEmulator.GetType().ToString(); - object settings = null; - Global.Config.CoreSettings.TryGetValue(typename, out settings); - if (settings != null) - nextEmulator.PutSettings(settings); - } - CloseGame(); Global.Emulator.Dispose(); Global.Emulator = nextEmulator; @@ -3774,13 +3754,9 @@ namespace BizHawk.Client.EmuHawk { // save settings object - string typename = Global.Emulator.GetType().ToString(); - object settings = Global.Emulator.GetSettings(); - if (settings != null) - Global.Config.CoreSettings[typename] = settings; - object syncsettings = Global.Emulator.GetSyncSettings(); - if (syncsettings != null) - Global.Config.CoreSyncSettings[typename] = syncsettings; + Type t = Global.Emulator.GetType(); + Global.Config.PutCoreSettings(Global.Emulator.GetSettings(), t); + Global.Config.PutCoreSyncSettings(Global.Emulator.GetSyncSettings(), t); } Global.Emulator.Dispose(); diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.cs index b4a9928e33..9d2077afcb 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.cs @@ -15,7 +15,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES static readonly bool USE_DATABASE = true; public RomStatus RomStatus; - public NES(CoreComm comm, GameInfo game, byte[] rom, Dictionary boardProperties = null) + public NES(CoreComm comm, GameInfo game, byte[] rom, object Settings, Dictionary boardProperties = null) { byte[] fdsbios = comm.CoreFileProvider.GetFirmware("NES", "Bios_FDS", false); if (fdsbios != null && fdsbios.Length == 40976) @@ -48,6 +48,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES CoreComm.UsesDriveLed = true; b.SetDriveLightCallback((val) => CoreComm.DriveLED = val); } + PutSettings(Settings); } private NES() diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs index e571fc45a1..67880fe2cf 100644 --- a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs @@ -54,7 +54,7 @@ namespace BizHawk.Emulation.Cores.PCEngine // 21,477,270 Machine clocks / sec // 7,159,090 Cpu cycles / sec - public PCEngine(CoreComm comm, GameInfo game, byte[] rom) + public PCEngine(CoreComm comm, GameInfo game, byte[] rom, object Settings) { CoreComm = comm; CoreComm.CpuTraceAvailable = true; @@ -70,12 +70,12 @@ namespace BizHawk.Emulation.Cores.PCEngine Type = NecSystemType.SuperGrafx; break; } - Init(game, rom); + Init(game, rom, (PCESettings)Settings); } public string BoardName { get { return null; } } - public PCEngine(CoreComm comm, GameInfo game, Disc disc, byte[] rom) + public PCEngine(CoreComm comm, GameInfo game, Disc disc, byte[] rom, object Settings) { CoreComm = comm; CoreComm.CpuTraceAvailable = true; @@ -83,12 +83,12 @@ namespace BizHawk.Emulation.Cores.PCEngine systemid = "PCECD"; Type = NecSystemType.TurboCD; this.disc = disc; - Init(game, rom); + Init(game, rom, (PCESettings)Settings); // the default RomStatusDetails don't do anything with Disc CoreComm.RomStatusDetails = string.Format("{0}\r\nDisk partial hash:{1}", game.Name, disc.GetHash()); } - void Init(GameInfo game, byte[] rom) + void Init(GameInfo game, byte[] rom, PCESettings Settings) { Controller = NullController.GetNullController(); Cpu = new HuC6280(); @@ -99,6 +99,8 @@ namespace BizHawk.Emulation.Cores.PCEngine Cpu.Logger = (s) => CoreComm.Tracer.Put(s); + this.Settings = Settings; + if (TurboGrafx) { Ram = new byte[0x2000]; @@ -182,7 +184,7 @@ namespace BizHawk.Emulation.Cores.PCEngine { ArcadeRam = new byte[0x200000]; ArcadeCard = true; - ArcadeCardRewindHack = game["ArcadeRewindHack"]; + ArcadeCardRewindHack = Settings.ArcadeCardRewindHack; for (int i = 0; i < 4; i++) ArcadePage[i] = new ArcadeCardPage(); } @@ -194,7 +196,7 @@ namespace BizHawk.Emulation.Cores.PCEngine Cpu.WriteMemory21 = WriteMemoryPopulous; } - if (game["ForceSpriteLimit"] || game.NotInDatabase) + if (Settings.SpriteLimit || game.NotInDatabase) { VDC1.PerformSpriteLimit = true; if (VDC2 != null) @@ -207,7 +209,7 @@ namespace BizHawk.Emulation.Cores.PCEngine PSG.MaxVolume = int.Parse(game.OptionValue("PsgVol")); if (game["AdpcmVol"]) ADPCM.MaxVolume = int.Parse(game.OptionValue("AdpcmVol")); - if (game["EqualizeVolumes"] || (game.NotInDatabase && TurboCD)) + if (Settings.EqualizeVolume || (game.NotInDatabase && TurboCD)) SoundMixer.EqualizeVolumes(); // Ok, yes, HBlankPeriod's only purpose is game-specific hax. @@ -630,8 +632,17 @@ namespace BizHawk.Emulation.Cores.PCEngine public object GetSyncSettings() { return null; } public bool PutSettings(object o) { - Settings = (PCESettings)o; - return false; + PCESettings n = (PCESettings)o; + bool ret; + if (n.ArcadeCardRewindHack != Settings.ArcadeCardRewindHack || + n.SpriteLimit != Settings.SpriteLimit || + n.EqualizeVolume != Settings.EqualizeVolume) + ret = true; + else + ret = false; + + Settings = n; + return ret; } public class PCESettings @@ -641,6 +652,11 @@ namespace BizHawk.Emulation.Cores.PCEngine public bool ShowBG2 = true; public bool ShowOBJ2 = true; + // these three require core reboot to use + public bool SpriteLimit = false; + public bool EqualizeVolume = false; + public bool ArcadeCardRewindHack = true; + public PCESettings Clone() { return (PCESettings)MemberwiseClone();