diff --git a/Core/DebuggerTypes.h b/Core/DebuggerTypes.h index 330c61f8..2e4c0fb9 100644 --- a/Core/DebuggerTypes.h +++ b/Core/DebuggerTypes.h @@ -40,6 +40,8 @@ enum class DebuggerFlags BreakOnPlay = 0x8000, BreakOnFirstCycle = 0x10000, + + BreakOnPpu2006ScrollGlitch = 0x20000, }; enum class BreakSource @@ -57,6 +59,7 @@ enum class BreakSource BreakOnCpuCrash = 9, Pause = 10, BreakAfterSuspend = 11, + BreakOnPpu2006ScrollGlitch = 12 }; enum class AddressType diff --git a/Core/PPU.cpp b/Core/PPU.cpp index b1b91a65..4feacebf 100644 --- a/Core/PPU.cpp +++ b/Core/PPU.cpp @@ -1288,8 +1288,16 @@ void PPU::UpdateState() //When a $2006 address update lands on the Y or X increment, the written value is bugged and is ANDed with the incremented value if(_cycle == 257) { _state.VideoRamAddr &= _updateVramAddr; + shared_ptr debugger = _console->GetDebugger(false); + if(debugger && debugger->CheckFlag(DebuggerFlags::BreakOnPpu2006ScrollGlitch)) { + debugger->BreakImmediately(BreakSource::BreakOnPpu2006ScrollGlitch); + } } else if(_cycle > 0 && (_cycle & 0x07) == 0 && (_cycle <= 256 || _cycle > 320)) { _state.VideoRamAddr = (_updateVramAddr & ~0x1F) | (_state.VideoRamAddr & _updateVramAddr & 0x1F); + shared_ptr debugger = _console->GetDebugger(false); + if(debugger && debugger->CheckFlag(DebuggerFlags::BreakOnPpu2006ScrollGlitch)) { + debugger->BreakImmediately(BreakSource::BreakOnPpu2006ScrollGlitch); + } } else { _state.VideoRamAddr = _updateVramAddr; } diff --git a/GUI.NET/Config/DebugInfo.cs b/GUI.NET/Config/DebugInfo.cs index b0d14ef4..8e214459 100644 --- a/GUI.NET/Config/DebugInfo.cs +++ b/GUI.NET/Config/DebugInfo.cs @@ -319,6 +319,7 @@ namespace Mesen.GUI.Config public bool BreakOnDebuggerFocus = false; public bool BreakOnCrash = false; public bool BreakOnDecayedOamRead = false; + public bool BreakOnPpu2006ScrollGlitch = false; public bool BreakOnUninitMemoryRead = false; public bool BreakOnInit = true; public bool BreakOnPlay = false; diff --git a/GUI.NET/Debugger/frmDebugger.Designer.cs b/GUI.NET/Debugger/frmDebugger.Designer.cs index f3a01f2d..92d47032 100644 --- a/GUI.NET/Debugger/frmDebugger.Designer.cs +++ b/GUI.NET/Debugger/frmDebugger.Designer.cs @@ -137,6 +137,7 @@ namespace Mesen.GUI.Debugger this.toolStripMenuItem26 = new System.Windows.Forms.ToolStripSeparator(); this.mnuBreakOnDecayedOamRead = new System.Windows.Forms.ToolStripMenuItem(); this.mnuBreakOnUninitMemoryRead = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuBreakOnPpu2006ScrollGlitch = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem15 = new System.Windows.Forms.ToolStripSeparator(); this.mnuBreakOnOpen = new System.Windows.Forms.ToolStripMenuItem(); this.mnuBreakOnDebuggerFocus = new System.Windows.Forms.ToolStripMenuItem(); @@ -1216,6 +1217,7 @@ namespace Mesen.GUI.Debugger this.toolStripMenuItem26, this.mnuBreakOnDecayedOamRead, this.mnuBreakOnUninitMemoryRead, + this.mnuBreakOnPpu2006ScrollGlitch, this.toolStripMenuItem15, this.mnuBreakOnOpen, this.mnuBreakOnDebuggerFocus, @@ -1303,6 +1305,14 @@ namespace Mesen.GUI.Debugger this.mnuBreakOnUninitMemoryRead.Text = "Break on uninitialized memory read"; this.mnuBreakOnUninitMemoryRead.Click += new System.EventHandler(this.mnuBreakOnUninitMemoryRead_Click); // + // mnuBreakOnPpu2006ScrollGlitch + // + this.mnuBreakOnPpu2006ScrollGlitch.CheckOnClick = true; + this.mnuBreakOnPpu2006ScrollGlitch.Name = "mnuBreakOnPpu2006ScrollGlitch"; + this.mnuBreakOnPpu2006ScrollGlitch.Size = new System.Drawing.Size(261, 22); + this.mnuBreakOnPpu2006ScrollGlitch.Text = "Break on PPU $2006 scroll glitch"; + this.mnuBreakOnPpu2006ScrollGlitch.Click += new System.EventHandler(this.mnuBreakOnPpu2006ScrollGlitch_Click); + // // toolStripMenuItem15 // this.toolStripMenuItem15.Name = "toolStripMenuItem15"; @@ -2271,5 +2281,6 @@ namespace Mesen.GUI.Debugger private System.Windows.Forms.ToolStripMenuItem mnuRunCpuCycle; private System.Windows.Forms.ToolStripMenuItem mnuShowSelectionLength; private System.Windows.Forms.ToolStripMenuItem mnuWatchWindow; + private System.Windows.Forms.ToolStripMenuItem mnuBreakOnPpu2006ScrollGlitch; } } \ No newline at end of file diff --git a/GUI.NET/Debugger/frmDebugger.cs b/GUI.NET/Debugger/frmDebugger.cs index 88d550ec..f5f45f83 100644 --- a/GUI.NET/Debugger/frmDebugger.cs +++ b/GUI.NET/Debugger/frmDebugger.cs @@ -112,6 +112,7 @@ namespace Mesen.GUI.Debugger this.mnuBreakOnBrk.Checked = ConfigManager.Config.DebugInfo.BreakOnBrk; this.mnuBreakOnUninitMemoryRead.Checked = ConfigManager.Config.DebugInfo.BreakOnUninitMemoryRead; this.mnuBreakOnDecayedOamRead.Checked = ConfigManager.Config.DebugInfo.BreakOnDecayedOamRead; + this.mnuBreakOnPpu2006ScrollGlitch.Checked = ConfigManager.Config.DebugInfo.BreakOnPpu2006ScrollGlitch; this.mnuBreakOnCrash.Checked = ConfigManager.Config.DebugInfo.BreakOnCrash; this.mnuBreakOnDebuggerFocus.Checked = ConfigManager.Config.DebugInfo.BreakOnDebuggerFocus; this.mnuBringToFrontOnBreak.Checked = ConfigManager.Config.DebugInfo.BringToFrontOnBreak; @@ -427,6 +428,7 @@ namespace Mesen.GUI.Debugger SetFlag(DebuggerFlags.BreakOnBrk, config.BreakOnBrk); SetFlag(DebuggerFlags.BreakOnUninitMemoryRead, config.BreakOnUninitMemoryRead); SetFlag(DebuggerFlags.BreakOnDecayedOamRead, config.BreakOnDecayedOamRead); + SetFlag(DebuggerFlags.BreakOnPpu2006ScrollGlitch, config.BreakOnPpu2006ScrollGlitch); SetFlag(DebuggerFlags.BreakOnInit, config.BreakOnInit); SetFlag(DebuggerFlags.BreakOnPlay, config.BreakOnPlay); SetFlag(DebuggerFlags.BreakOnFirstCycle, config.BreakOnFirstCycle); @@ -1224,6 +1226,13 @@ namespace Mesen.GUI.Debugger ConfigManager.ApplyChanges(); UpdateDebuggerFlags(); } + + private void mnuBreakOnPpu2006ScrollGlitch_Click(object sender, EventArgs e) + { + ConfigManager.Config.DebugInfo.BreakOnPpu2006ScrollGlitch = mnuBreakOnPpu2006ScrollGlitch.Checked; + ConfigManager.ApplyChanges(); + UpdateDebuggerFlags(); + } private void mnuBreakOnCrash_Click(object sender, EventArgs e) { diff --git a/GUI.NET/Dependencies/resources.en.xml b/GUI.NET/Dependencies/resources.en.xml index 77f0288f..05cd17a7 100644 --- a/GUI.NET/Dependencies/resources.en.xml +++ b/GUI.NET/Dependencies/resources.en.xml @@ -1246,6 +1246,7 @@ Uninitialized memory read Decayed OAM read CPU crashed + $2006 write scroll glitch RP2C03B diff --git a/GUI.NET/InteropEmu.cs b/GUI.NET/InteropEmu.cs index 15c6961c..3dfd06e8 100644 --- a/GUI.NET/InteropEmu.cs +++ b/GUI.NET/InteropEmu.cs @@ -1737,6 +1737,8 @@ namespace Mesen.GUI BreakOnPlay = 0x8000, BreakOnFirstCycle = 0x10000, + + BreakOnPpu2006ScrollGlitch = 0x20000, } public struct InteropRomInfo @@ -2357,6 +2359,7 @@ namespace Mesen.GUI BreakOnCpuCrash = 9, Pause = 10, BreakAfterSuspend = 11, + BreakOnPpu2006ScrollGlitch = 12 } public enum PpuAddressType