diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Core.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Core.cs index 5d3084afe4..ebd2a9257c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Core.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Core.cs @@ -291,7 +291,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 _pal = DetectPal(_game, Rom); } - _tia = new TIA(this, _pal); + _tia = new TIA(this, _pal, Settings.SECAMColors); _tia.GetFrameRate(out CoreComm.VsyncNum, out CoreComm.VsyncDen); // dcfilter coefficent is from real observed hardware behavior: a latched "1" will fully decay by ~170 or so tia sound cycles diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Settings.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Settings.cs index 70864bcffa..e2e4a3309a 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Settings.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Settings.cs @@ -19,7 +19,14 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 public bool PutSettings(object o) { - Settings = (A2600Settings)o; + A2600Settings newSettings = (A2600Settings)o; + if (Settings == null || Settings.SECAMColors != newSettings.SECAMColors) + { + if (_tia != null) + _tia.SetSECAM(newSettings.SECAMColors); + } + + Settings = newSettings; return false; } @@ -64,6 +71,9 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 [Description("Sets whether or not the Playfield layer will be displayed")] public bool ShowPlayfield { get; set; } + [Description("If true, PAL mode will show with SECAM (French) colors.")] + public bool SECAMColors { get; set; } + public int NTSCTopLine { get { return this._ntscTopLine; } @@ -106,7 +116,8 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 ShowMissle2 = true, ShowBall = true, ShowPlayfield = true, - BackgroundColor = Color.Black + BackgroundColor = Color.Black, + SECAMColors = false }; } } diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/TIA.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/TIA.cs index 0c515a2397..858ec98baa 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/TIA.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/TIA.cs @@ -142,6 +142,89 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 0xbb9f47, 0, 0xd2b656, 0, 0xe8cc63, 0, 0xfce070, 0 }; + private static readonly int[] SECAMPalette = + { + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + + 0x000000,0x000000,0x2121FF,0x2121FF, + 0xF03C79,0xF03C79,0xFF50FF,0xFF50FF, + 0x7FFF00,0x7FFF00,0x7FFFFF,0x7FFFFF, + 0xFFFF3F,0xFFFF3F,0xffffff,0xffffff, + }; + #endregion // in all cases, the TIA has 228 clocks per scanline @@ -180,7 +263,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 private readonly Atari2600 _core; private int[] _scanlinebuffer = new int[ScreenWidth * MaxScreenHeight]; - private readonly int[] _palette; + private int[] _palette; private byte _hsyncCnt; private int _capChargeStart; @@ -198,13 +281,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 public Audio[] AUD = { new Audio(), new Audio() }; - public TIA(Atari2600 core, bool pal) + public TIA(Atari2600 core, bool pal, bool secam) { _core = core; _player0.ScanCnt = 8; _player1.ScanCnt = 8; _pal = pal; - _palette = _pal ? PALPalette : NTSCPalette; + SetSECAM(secam); + } + + public void SetSECAM(bool secam) + { + _palette = _pal ? secam ? SECAMPalette : PALPalette : NTSCPalette; } public int CurrentScanLine @@ -245,7 +333,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 } return 275; // 275 comes from NTSC specs and the actual pixel clock of a 2600 TIA - } + } } public int VirtualHeight