Debugger: Added option to break when a $2006 write scroll glitch occurs

This commit is contained in:
Sour 2019-11-11 20:19:45 -05:00
parent d96f09a1e1
commit 36e2d04fe9
7 changed files with 36 additions and 0 deletions

View file

@ -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

View file

@ -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> 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> debugger = _console->GetDebugger(false);
if(debugger && debugger->CheckFlag(DebuggerFlags::BreakOnPpu2006ScrollGlitch)) {
debugger->BreakImmediately(BreakSource::BreakOnPpu2006ScrollGlitch);
}
} else {
_state.VideoRamAddr = _updateVramAddr;
}

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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)
{

View file

@ -1246,6 +1246,7 @@
<Value ID="BreakOnUninitMemoryRead">Uninitialized memory read</Value>
<Value ID="BreakOnDecayedOamRead">Decayed OAM read</Value>
<Value ID="BreakOnCpuCrash">CPU crashed</Value>
<Value ID="BreakOnPpu2006ScrollGlitch">$2006 write scroll glitch</Value>
</Enum>
<Enum ID="VsPpuType">
<Value ID="RP2C03B">RP2C03B</Value>

View file

@ -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