Debugger: Watch - Added edit in mem viewer + view in disassembly shortcuts

This commit is contained in:
Sour 2018-12-16 15:29:16 -05:00
parent 0b7660a3fa
commit be2cd9a850
4 changed files with 121 additions and 11 deletions

View file

@ -51,6 +51,11 @@ namespace Mesen.GUI.Config
[ShortcutName("Mark Selection as Unidentified Code/Data")]
public XmlKeys MarkAsUnidentified = Keys.Control | Keys.D3;
[ShortcutName("Edit in Memory Viewer")]
public XmlKeys CodeWindow_EditInMemoryViewer = Keys.F1;
[ShortcutName("View in disassembly")]
public XmlKeys MemoryViewer_ViewInDisassembly = Keys.None;
[ShortcutName("Open APU Viewer")]
public XmlKeys OpenApuViewer = Keys.Control | Keys.U;
[ShortcutName("Open Assembler")]
@ -119,8 +124,6 @@ namespace Mesen.GUI.Config
public XmlKeys CodeWindow_EditSubroutine = Keys.F4;
[ShortcutName("Code Window: Edit Selected Code")]
public XmlKeys CodeWindow_EditSelectedCode = Keys.None;
[ShortcutName("Code Window: Edit in Memory Viewer")]
public XmlKeys CodeWindow_EditInMemoryViewer = Keys.F1;
[ShortcutName("Code Window: Edit Label")]
public XmlKeys CodeWindow_EditLabel = Keys.F2;
[ShortcutName("Code Window: Navigate Back")]
@ -198,8 +201,6 @@ namespace Mesen.GUI.Config
public XmlKeys MemoryViewer_ViewInCpuMemory = Keys.None;
[ShortcutName("View in [memory type]")]
public XmlKeys MemoryViewer_ViewInMemoryType = Keys.None;
[ShortcutName("View in disassembly")]
public XmlKeys MemoryViewer_ViewInDisassembly = Keys.None;
//Script Window
[ShortcutName("Open Script")]

View file

@ -36,6 +36,9 @@
this.contextMenuWatch = new System.Windows.Forms.ContextMenuStrip(this.components);
this.mnuRemoveWatch = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
this.mnuEditInMemoryViewer = new System.Windows.Forms.ToolStripMenuItem();
this.mnuViewInDisassembly = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
this.mnuHexDisplay = new System.Windows.Forms.ToolStripMenuItem();
this.contextMenuWatch.SuspendLayout();
this.SuspendLayout();
@ -79,22 +82,47 @@
this.contextMenuWatch.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuRemoveWatch,
this.toolStripMenuItem1,
this.mnuEditInMemoryViewer,
this.mnuViewInDisassembly,
this.toolStripMenuItem2,
this.mnuHexDisplay});
this.contextMenuWatch.Name = "contextMenuWatch";
this.contextMenuWatch.Size = new System.Drawing.Size(184, 54);
this.contextMenuWatch.Size = new System.Drawing.Size(194, 126);
this.contextMenuWatch.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuWatch_Opening);
//
// mnuRemoveWatch
//
this.mnuRemoveWatch.Image = global::Mesen.GUI.Properties.Resources.Close;
this.mnuRemoveWatch.Name = "mnuRemoveWatch";
this.mnuRemoveWatch.Size = new System.Drawing.Size(183, 22);
this.mnuRemoveWatch.Size = new System.Drawing.Size(193, 22);
this.mnuRemoveWatch.Text = "Remove";
this.mnuRemoveWatch.Click += new System.EventHandler(this.mnuRemoveWatch_Click);
//
// toolStripMenuItem1
//
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
this.toolStripMenuItem1.Size = new System.Drawing.Size(180, 6);
this.toolStripMenuItem1.Size = new System.Drawing.Size(190, 6);
//
// mnuEditInMemoryViewer
//
this.mnuEditInMemoryViewer.Image = global::Mesen.GUI.Properties.Resources.CheatCode;
this.mnuEditInMemoryViewer.Name = "mnuEditInMemoryViewer";
this.mnuEditInMemoryViewer.Size = new System.Drawing.Size(193, 22);
this.mnuEditInMemoryViewer.Text = "Edit in Memory Viewer";
this.mnuEditInMemoryViewer.Click += new System.EventHandler(this.mnuEditInMemoryViewer_Click);
//
// mnuViewInDisassembly
//
this.mnuViewInDisassembly.Image = global::Mesen.GUI.Properties.Resources.Bug;
this.mnuViewInDisassembly.Name = "mnuViewInDisassembly";
this.mnuViewInDisassembly.Size = new System.Drawing.Size(193, 22);
this.mnuViewInDisassembly.Text = "View in disassembly";
this.mnuViewInDisassembly.Click += new System.EventHandler(this.mnuViewInDisassembly_Click);
//
// toolStripMenuItem2
//
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
this.toolStripMenuItem2.Size = new System.Drawing.Size(190, 6);
//
// mnuHexDisplay
//
@ -102,7 +130,7 @@
this.mnuHexDisplay.CheckOnClick = true;
this.mnuHexDisplay.CheckState = System.Windows.Forms.CheckState.Checked;
this.mnuHexDisplay.Name = "mnuHexDisplay";
this.mnuHexDisplay.Size = new System.Drawing.Size(183, 22);
this.mnuHexDisplay.Size = new System.Drawing.Size(193, 22);
this.mnuHexDisplay.Text = "Hexadecimal Display";
this.mnuHexDisplay.Click += new System.EventHandler(this.mnuHexDisplay_Click);
//
@ -127,5 +155,8 @@
private System.Windows.Forms.ToolStripMenuItem mnuRemoveWatch;
private System.Windows.Forms.ToolStripMenuItem mnuHexDisplay;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem mnuEditInMemoryViewer;
private System.Windows.Forms.ToolStripMenuItem mnuViewInDisassembly;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2;
}
}

View file

@ -9,13 +9,19 @@ using System.Threading.Tasks;
using System.Windows.Forms;
using Mesen.GUI.Config;
using Mesen.GUI.Controls;
using System.Text.RegularExpressions;
using System.Globalization;
namespace Mesen.GUI.Debugger
{
public partial class ctrlWatch : BaseControl
{
private static Regex _watchAddressOrLabel = new Regex(@"^(\[|{)(\s*((\$[0-9A-Fa-f]+)|(\d+)|([@_a-zA-Z0-9]+)))\s*[,]{0,1}\d*\s*(\]|})$", RegexOptions.Compiled);
private int _currentSelection = -1;
private int _previousMaxLength = -1;
private int _selectedAddress = -1;
private CodeLabel _selectedLabel = null;
public ctrlWatch()
{
@ -31,9 +37,22 @@ namespace Mesen.GUI.Debugger
this.mnuHexDisplay.Checked = ConfigManager.Config.DebugInfo.HexDisplay;
WatchManager.WatchChanged += WatchManager_WatchChanged;
mnuRemoveWatch.InitShortcut(this, nameof(DebuggerShortcutsConfig.WatchList_Delete));
mnuEditInMemoryViewer.InitShortcut(this, nameof(DebuggerShortcutsConfig.CodeWindow_EditInMemoryViewer));
mnuViewInDisassembly.InitShortcut(this, nameof(DebuggerShortcutsConfig.MemoryViewer_ViewInDisassembly));
}
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
UpdateActions();
return base.ProcessCmdKey(ref msg, keyData);
}
private void contextMenuWatch_Opening(object sender, CancelEventArgs e)
{
UpdateActions();
}
private void WatchManager_WatchChanged(object sender, EventArgs e)
{
if(this.InvokeRequired) {
@ -120,6 +139,36 @@ namespace Mesen.GUI.Debugger
private void lstWatch_SelectedIndexChanged(object sender, EventArgs e)
{
mnuRemoveWatch.Enabled = lstWatch.SelectedItems.Count >= 1;
UpdateActions();
}
private void UpdateActions()
{
mnuEditInMemoryViewer.Enabled = false;
mnuViewInDisassembly.Enabled = false;
if(lstWatch.SelectedItems.Count == 1) {
Match match = _watchAddressOrLabel.Match(lstWatch.SelectedItems[0].Text);
if(match.Success) {
string address = match.Groups[3].Value;
if(address[0] >= '0' && address[0] <= '9' || address[0] == '$') {
//CPU Address
_selectedAddress = Int32.Parse(address[0] == '$' ? address.Substring(1) : address, address[0] == '$' ? NumberStyles.AllowHexSpecifier : NumberStyles.None);
_selectedLabel = null;
mnuEditInMemoryViewer.Enabled = true;
mnuViewInDisassembly.Enabled = true;
} else {
//Label
_selectedAddress = -1;
_selectedLabel = LabelManager.GetLabel(address);
if(_selectedLabel != null) {
mnuEditInMemoryViewer.Enabled = true;
mnuViewInDisassembly.Enabled = true;
}
}
}
}
}
private void lstWatch_Click(object sender, EventArgs e)
@ -149,5 +198,34 @@ namespace Mesen.GUI.Debugger
WatchManager.RemoveWatch(itemsToRemove.ToArray());
}
}
private void mnuViewInDisassembly_Click(object sender, EventArgs e)
{
if(lstWatch.SelectedItems.Count != 1) {
return;
}
if(_selectedAddress >= 0) {
DebugWindowManager.GetDebugger().ScrollToAddress(_selectedAddress);
} else if(_selectedLabel != null) {
int relAddress = _selectedLabel.GetRelativeAddress();
if(relAddress >= 0) {
DebugWindowManager.GetDebugger().ScrollToAddress(relAddress);
}
}
}
private void mnuEditInMemoryViewer_Click(object sender, EventArgs e)
{
if(lstWatch.SelectedItems.Count != 1) {
return;
}
if(_selectedAddress >= 0) {
DebugWindowManager.OpenMemoryViewer(_selectedAddress, DebugMemoryType.CpuMemory);
} else if(_selectedLabel != null) {
DebugWindowManager.OpenMemoryViewer((int)_selectedLabel.Address, _selectedLabel.AddressType.ToMemoryType());
}
}
}
}

View file

@ -36,6 +36,8 @@ namespace Mesen.GUI.Debugger
GetMember(nameof(DebuggerShortcutsConfig.MarkAsCode)),
GetMember(nameof(DebuggerShortcutsConfig.MarkAsData)),
GetMember(nameof(DebuggerShortcutsConfig.MarkAsUnidentified)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditInMemoryViewer)),
GetMember(nameof(DebuggerShortcutsConfig.MemoryViewer_ViewInDisassembly)),
GetMember(nameof(DebuggerShortcutsConfig.OpenApuViewer)),
GetMember(nameof(DebuggerShortcutsConfig.OpenAssembler)),
@ -57,8 +59,7 @@ namespace Mesen.GUI.Debugger
GetMember(nameof(DebuggerShortcutsConfig.MemoryViewer_Import)),
GetMember(nameof(DebuggerShortcutsConfig.MemoryViewer_Export)),
GetMember(nameof(DebuggerShortcutsConfig.MemoryViewer_ViewInCpuMemory)),
GetMember(nameof(DebuggerShortcutsConfig.MemoryViewer_ViewInMemoryType)),
GetMember(nameof(DebuggerShortcutsConfig.MemoryViewer_ViewInDisassembly))
GetMember(nameof(DebuggerShortcutsConfig.MemoryViewer_ViewInMemoryType))
};
ctrlDbgShortcutsScriptWindow.Shortcuts = new FieldInfo[] {
@ -88,7 +89,6 @@ namespace Mesen.GUI.Debugger
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_SetNextStatement)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditSubroutine)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditSelectedCode)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditInMemoryViewer)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditLabel)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_NavigateBack)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_NavigateForward)),