Debugger: Added more information to opcode tooltip

This commit is contained in:
Sour 2018-02-10 23:01:16 -05:00
parent 3a4bab270e
commit d84c83e1e6
6 changed files with 303 additions and 87 deletions

View file

@ -116,7 +116,7 @@ namespace Mesen.GUI.Config
public int PpuDisplayScanline = 241; public int PpuDisplayScanline = 241;
public bool ShowCodePreview = true; public bool ShowCodePreview = true;
public bool ShowOpCodeTooltips = false; public bool ShowOpCodeTooltips = true;
public bool ShowCpuMemoryMapping = true; public bool ShowCpuMemoryMapping = true;
public bool ShowPpuMemoryMapping = true; public bool ShowPpuMemoryMapping = true;

View file

@ -382,17 +382,18 @@ namespace Mesen.GUI.Debugger
private Point _previousLocation; private Point _previousLocation;
private bool _preventCloseTooltip = false; private bool _preventCloseTooltip = false;
private string _hoverLastWord = ""; private string _hoverLastWord = "";
private int _hoverLastLineAddress = -1;
private void ShowTooltip(string word, Dictionary<string, string> values, int address) private void ShowTooltip(string word, Dictionary<string, string> values, int address, int lineAddress)
{ {
if(_hoverLastWord != word || _codeTooltip == null) { if(_hoverLastWord != word || _hoverLastLineAddress != lineAddress || _codeTooltip == null) {
if(!_preventCloseTooltip && _codeTooltip != null) { if(!_preventCloseTooltip && _codeTooltip != null) {
_codeTooltip.Close(); _codeTooltip.Close();
_codeTooltip = null; _codeTooltip = null;
} }
if(ConfigManager.Config.DebugInfo.ShowOpCodeTooltips && frmOpCodeTooltip.IsOpCode(word)) { if(ConfigManager.Config.DebugInfo.ShowOpCodeTooltips && frmOpCodeTooltip.IsOpCode(word)) {
_codeTooltip = new frmOpCodeTooltip(word); _codeTooltip = new frmOpCodeTooltip(word, lineAddress);
} else { } else {
bool isPrgRom = false; bool isPrgRom = false;
if(address >= 0 && ConfigManager.Config.DebugInfo.ShowCodePreview) { if(address >= 0 && ConfigManager.Config.DebugInfo.ShowCodePreview) {
@ -412,6 +413,7 @@ namespace Mesen.GUI.Debugger
_preventCloseTooltip = true; _preventCloseTooltip = true;
_hoverLastWord = word; _hoverLastWord = word;
_hoverLastLineAddress = lineAddress;
} }
private void ctrlCodeViewer_MouseLeave(object sender, EventArgs e) private void ctrlCodeViewer_MouseLeave(object sender, EventArgs e)
@ -465,7 +467,7 @@ namespace Mesen.GUI.Debugger
if(label != null) { if(label != null) {
DisplayLabelTooltip(word, label); DisplayLabelTooltip(word, label);
} else if(ConfigManager.Config.DebugInfo.ShowOpCodeTooltips && frmOpCodeTooltip.IsOpCode(word)) { } else if(ConfigManager.Config.DebugInfo.ShowOpCodeTooltips && frmOpCodeTooltip.IsOpCode(word)) {
ShowTooltip(word, null, -1); ShowTooltip(word, null, -1, ctrlCodeViewer.GetLineNumberAtPosition(e.Y));
} }
} }
_previousLocation = e.Location; _previousLocation = e.Location;
@ -482,7 +484,7 @@ namespace Mesen.GUI.Debugger
{ "Value", $"${byteValue.ToString("X2")} (byte){Environment.NewLine}${wordValue.ToString("X4")} (word)" } { "Value", $"${byteValue.ToString("X2")} (byte){Environment.NewLine}${wordValue.ToString("X4")} (word)" }
}; };
ShowTooltip(word, values, (int)address); ShowTooltip(word, values, (int)address, -1);
} }
private void DisplayLabelTooltip(string word, CodeLabel label) private void DisplayLabelTooltip(string word, CodeLabel label)
@ -501,7 +503,7 @@ namespace Mesen.GUI.Debugger
values["Comment"] = label.Comment; values["Comment"] = label.Comment;
} }
ShowTooltip(word, values, address); ShowTooltip(word, values, address, -1);
} }
private bool UpdateContextMenu(Point mouseLocation) private bool UpdateContextMenu(Point mouseLocation)

View file

@ -144,7 +144,8 @@ namespace Mesen.GUI.Debugger
} }
} }
if(int.TryParse(txtAddress.Text, NumberStyles.HexNumber, null, out int address)) { int address;
if(int.TryParse(txtAddress.Text, NumberStyles.HexNumber, null, out address)) {
if(address > maxValue) { if(address > maxValue) {
return false; return false;
} }

View file

@ -29,17 +29,25 @@
{ {
this.panel1 = new System.Windows.Forms.Panel(); this.panel1 = new System.Windows.Forms.Panel();
this.tlpMain = new System.Windows.Forms.TableLayoutPanel(); this.tlpMain = new System.Windows.Forms.TableLayoutPanel();
this.lblAffectedStatusFlags = new System.Windows.Forms.Label();
this.lblName = new System.Windows.Forms.Label();
this.lblOpCodeDescription = new System.Windows.Forms.Label();
this.lblByteCode = new System.Windows.Forms.Label();
this.lblAddressingMode = new System.Windows.Forms.Label();
this.lblCycleCount = new System.Windows.Forms.Label();
this.ctrlFlagNegative = new Mesen.GUI.Debugger.Controls.ctrlFlagStatus(); this.ctrlFlagNegative = new Mesen.GUI.Debugger.Controls.ctrlFlagStatus();
this.ctrlFlagOverflow = new Mesen.GUI.Debugger.Controls.ctrlFlagStatus(); this.ctrlFlagOverflow = new Mesen.GUI.Debugger.Controls.ctrlFlagStatus();
this.ctrlFlagDecimal = new Mesen.GUI.Debugger.Controls.ctrlFlagStatus(); this.ctrlFlagDecimal = new Mesen.GUI.Debugger.Controls.ctrlFlagStatus();
this.ctrlFlagInterrupt = new Mesen.GUI.Debugger.Controls.ctrlFlagStatus(); this.ctrlFlagInterrupt = new Mesen.GUI.Debugger.Controls.ctrlFlagStatus();
this.ctrlFlagZero = new Mesen.GUI.Debugger.Controls.ctrlFlagStatus(); this.ctrlFlagZero = new Mesen.GUI.Debugger.Controls.ctrlFlagStatus();
this.ctrlFlagCarry = new Mesen.GUI.Debugger.Controls.ctrlFlagStatus(); this.ctrlFlagCarry = new Mesen.GUI.Debugger.Controls.ctrlFlagStatus();
this.lblName = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label();
this.lblOpCodeDescription = new System.Windows.Forms.Label(); this.tlpOpCodeInfo = new System.Windows.Forms.TableLayoutPanel();
this.lblAffectedStatusFlags = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.panel1.SuspendLayout(); this.panel1.SuspendLayout();
this.tlpMain.SuspendLayout(); this.tlpMain.SuspendLayout();
this.tlpOpCodeInfo.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// panel1 // panel1
@ -51,7 +59,7 @@
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(0, 0); this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1"; this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(305, 96); this.panel1.Size = new System.Drawing.Size(305, 357);
this.panel1.TabIndex = 0; this.panel1.TabIndex = 0;
// //
// tlpMain // tlpMain
@ -66,79 +74,43 @@
this.tlpMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 35F)); this.tlpMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 35F));
this.tlpMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 35F)); this.tlpMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 35F));
this.tlpMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.tlpMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tlpMain.Controls.Add(this.lblAffectedStatusFlags, 0, 2); this.tlpMain.Controls.Add(this.lblAffectedStatusFlags, 0, 3);
this.tlpMain.Controls.Add(this.ctrlFlagNegative, 6, 3); this.tlpMain.Controls.Add(this.ctrlFlagNegative, 6, 4);
this.tlpMain.Controls.Add(this.ctrlFlagOverflow, 5, 3); this.tlpMain.Controls.Add(this.ctrlFlagOverflow, 5, 4);
this.tlpMain.Controls.Add(this.ctrlFlagDecimal, 4, 3); this.tlpMain.Controls.Add(this.ctrlFlagDecimal, 4, 4);
this.tlpMain.Controls.Add(this.ctrlFlagInterrupt, 3, 3); this.tlpMain.Controls.Add(this.ctrlFlagInterrupt, 3, 4);
this.tlpMain.Controls.Add(this.ctrlFlagZero, 2, 3); this.tlpMain.Controls.Add(this.ctrlFlagZero, 2, 4);
this.tlpMain.Controls.Add(this.ctrlFlagCarry, 1, 3); this.tlpMain.Controls.Add(this.ctrlFlagCarry, 1, 4);
this.tlpMain.Controls.Add(this.lblName, 0, 0); this.tlpMain.Controls.Add(this.lblName, 0, 0);
this.tlpMain.Controls.Add(this.lblOpCodeDescription, 0, 1); this.tlpMain.Controls.Add(this.lblOpCodeDescription, 0, 1);
this.tlpMain.Controls.Add(this.tlpOpCodeInfo, 0, 2);
this.tlpMain.Location = new System.Drawing.Point(0, 0); this.tlpMain.Location = new System.Drawing.Point(0, 0);
this.tlpMain.MaximumSize = new System.Drawing.Size(295, 0); this.tlpMain.MaximumSize = new System.Drawing.Size(295, 0);
this.tlpMain.MinimumSize = new System.Drawing.Size(295, 0); this.tlpMain.MinimumSize = new System.Drawing.Size(295, 0);
this.tlpMain.Name = "tlpMain"; this.tlpMain.Name = "tlpMain";
this.tlpMain.RowCount = 5; this.tlpMain.RowCount = 6;
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F)); this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F));
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); this.tlpMain.Size = new System.Drawing.Size(295, 159);
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tlpMain.Size = new System.Drawing.Size(295, 92);
this.tlpMain.TabIndex = 0; this.tlpMain.TabIndex = 0;
// //
// ctrlFlagNegative // lblAffectedStatusFlags
// //
this.ctrlFlagNegative.Anchor = System.Windows.Forms.AnchorStyles.None; this.lblAffectedStatusFlags.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.ctrlFlagNegative.Location = new System.Drawing.Point(224, 69); this.lblAffectedStatusFlags.AutoSize = true;
this.ctrlFlagNegative.Name = "ctrlFlagNegative"; this.tlpMain.SetColumnSpan(this.lblAffectedStatusFlags, 8);
this.ctrlFlagNegative.Size = new System.Drawing.Size(20, 20); this.lblAffectedStatusFlags.ForeColor = System.Drawing.SystemColors.GrayText;
this.ctrlFlagNegative.TabIndex = 6; this.lblAffectedStatusFlags.Location = new System.Drawing.Point(0, 104);
// this.lblAffectedStatusFlags.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
// ctrlFlagOverflow this.lblAffectedStatusFlags.Name = "lblAffectedStatusFlags";
// this.lblAffectedStatusFlags.Size = new System.Drawing.Size(108, 13);
this.ctrlFlagOverflow.Anchor = System.Windows.Forms.AnchorStyles.None; this.lblAffectedStatusFlags.TabIndex = 24;
this.ctrlFlagOverflow.Location = new System.Drawing.Point(189, 69); this.lblAffectedStatusFlags.Text = "Affected Status Flags";
this.ctrlFlagOverflow.Name = "ctrlFlagOverflow";
this.ctrlFlagOverflow.Size = new System.Drawing.Size(20, 20);
this.ctrlFlagOverflow.TabIndex = 5;
//
// ctrlFlagDecimal
//
this.ctrlFlagDecimal.Anchor = System.Windows.Forms.AnchorStyles.None;
this.ctrlFlagDecimal.Location = new System.Drawing.Point(154, 69);
this.ctrlFlagDecimal.Name = "ctrlFlagDecimal";
this.ctrlFlagDecimal.Size = new System.Drawing.Size(20, 20);
this.ctrlFlagDecimal.TabIndex = 4;
//
// ctrlFlagInterrupt
//
this.ctrlFlagInterrupt.Anchor = System.Windows.Forms.AnchorStyles.None;
this.ctrlFlagInterrupt.Location = new System.Drawing.Point(119, 69);
this.ctrlFlagInterrupt.Name = "ctrlFlagInterrupt";
this.ctrlFlagInterrupt.Size = new System.Drawing.Size(20, 20);
this.ctrlFlagInterrupt.TabIndex = 3;
//
// ctrlFlagZero
//
this.ctrlFlagZero.Anchor = System.Windows.Forms.AnchorStyles.None;
this.ctrlFlagZero.Location = new System.Drawing.Point(84, 69);
this.ctrlFlagZero.Name = "ctrlFlagZero";
this.ctrlFlagZero.Size = new System.Drawing.Size(20, 20);
this.ctrlFlagZero.TabIndex = 2;
//
// ctrlFlagCarry
//
this.ctrlFlagCarry.Anchor = System.Windows.Forms.AnchorStyles.None;
this.ctrlFlagCarry.Location = new System.Drawing.Point(49, 69);
this.ctrlFlagCarry.Name = "ctrlFlagCarry";
this.ctrlFlagCarry.Size = new System.Drawing.Size(20, 20);
this.ctrlFlagCarry.TabIndex = 1;
// //
// lblName // lblName
// //
@ -165,25 +137,144 @@
this.lblOpCodeDescription.TabIndex = 0; this.lblOpCodeDescription.TabIndex = 0;
this.lblOpCodeDescription.Text = "Desc"; this.lblOpCodeDescription.Text = "Desc";
// //
// lblAffectedStatusFlags // lblByteCode
// //
this.lblAffectedStatusFlags.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.lblByteCode.AutoSize = true;
this.lblAffectedStatusFlags.AutoSize = true; this.lblByteCode.Location = new System.Drawing.Point(101, 0);
this.tlpMain.SetColumnSpan(this.lblAffectedStatusFlags, 8); this.lblByteCode.Name = "lblByteCode";
this.lblAffectedStatusFlags.ForeColor = System.Drawing.SystemColors.GrayText; this.lblByteCode.Size = new System.Drawing.Size(56, 13);
this.lblAffectedStatusFlags.Location = new System.Drawing.Point(0, 53); this.lblByteCode.TabIndex = 25;
this.lblAffectedStatusFlags.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0); this.lblByteCode.Text = "Byte Code";
this.lblAffectedStatusFlags.Name = "lblAffectedStatusFlags"; //
this.lblAffectedStatusFlags.Size = new System.Drawing.Size(108, 13); // lblAddressingMode
this.lblAffectedStatusFlags.TabIndex = 24; //
this.lblAffectedStatusFlags.Text = "Affected Status Flags"; this.lblAddressingMode.AutoSize = true;
this.lblAddressingMode.Location = new System.Drawing.Point(101, 13);
this.lblAddressingMode.Name = "lblAddressingMode";
this.lblAddressingMode.Size = new System.Drawing.Size(89, 13);
this.lblAddressingMode.TabIndex = 26;
this.lblAddressingMode.Text = "Addressing Mode";
//
// lblCycleCount
//
this.lblCycleCount.AutoSize = true;
this.lblCycleCount.Location = new System.Drawing.Point(101, 26);
this.lblCycleCount.Name = "lblCycleCount";
this.lblCycleCount.Size = new System.Drawing.Size(64, 13);
this.lblCycleCount.TabIndex = 27;
this.lblCycleCount.Text = "Cycle Count";
//
// ctrlFlagNegative
//
this.ctrlFlagNegative.Anchor = System.Windows.Forms.AnchorStyles.None;
this.ctrlFlagNegative.Location = new System.Drawing.Point(224, 120);
this.ctrlFlagNegative.Name = "ctrlFlagNegative";
this.ctrlFlagNegative.Size = new System.Drawing.Size(20, 20);
this.ctrlFlagNegative.TabIndex = 6;
//
// ctrlFlagOverflow
//
this.ctrlFlagOverflow.Anchor = System.Windows.Forms.AnchorStyles.None;
this.ctrlFlagOverflow.Location = new System.Drawing.Point(189, 120);
this.ctrlFlagOverflow.Name = "ctrlFlagOverflow";
this.ctrlFlagOverflow.Size = new System.Drawing.Size(20, 20);
this.ctrlFlagOverflow.TabIndex = 5;
//
// ctrlFlagDecimal
//
this.ctrlFlagDecimal.Anchor = System.Windows.Forms.AnchorStyles.None;
this.ctrlFlagDecimal.Location = new System.Drawing.Point(154, 120);
this.ctrlFlagDecimal.Name = "ctrlFlagDecimal";
this.ctrlFlagDecimal.Size = new System.Drawing.Size(20, 20);
this.ctrlFlagDecimal.TabIndex = 4;
//
// ctrlFlagInterrupt
//
this.ctrlFlagInterrupt.Anchor = System.Windows.Forms.AnchorStyles.None;
this.ctrlFlagInterrupt.Location = new System.Drawing.Point(119, 120);
this.ctrlFlagInterrupt.Name = "ctrlFlagInterrupt";
this.ctrlFlagInterrupt.Size = new System.Drawing.Size(20, 20);
this.ctrlFlagInterrupt.TabIndex = 3;
//
// ctrlFlagZero
//
this.ctrlFlagZero.Anchor = System.Windows.Forms.AnchorStyles.None;
this.ctrlFlagZero.Location = new System.Drawing.Point(84, 120);
this.ctrlFlagZero.Name = "ctrlFlagZero";
this.ctrlFlagZero.Size = new System.Drawing.Size(20, 20);
this.ctrlFlagZero.TabIndex = 2;
//
// ctrlFlagCarry
//
this.ctrlFlagCarry.Anchor = System.Windows.Forms.AnchorStyles.None;
this.ctrlFlagCarry.Location = new System.Drawing.Point(49, 120);
this.ctrlFlagCarry.Name = "ctrlFlagCarry";
this.ctrlFlagCarry.Size = new System.Drawing.Size(20, 20);
this.ctrlFlagCarry.TabIndex = 1;
//
// label1
//
this.label1.AutoSize = true;
this.label1.ForeColor = System.Drawing.SystemColors.GrayText;
this.label1.Location = new System.Drawing.Point(3, 0);
this.label1.MaximumSize = new System.Drawing.Size(280, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(59, 13);
this.label1.TabIndex = 28;
this.label1.Text = "Byte Code:";
//
// tlpOpCodeInfo
//
this.tlpOpCodeInfo.ColumnCount = 2;
this.tlpMain.SetColumnSpan(this.tlpOpCodeInfo, 8);
this.tlpOpCodeInfo.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tlpOpCodeInfo.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tlpOpCodeInfo.Controls.Add(this.label2, 0, 1);
this.tlpOpCodeInfo.Controls.Add(this.lblByteCode, 1, 0);
this.tlpOpCodeInfo.Controls.Add(this.label1, 0, 0);
this.tlpOpCodeInfo.Controls.Add(this.lblAddressingMode, 1, 1);
this.tlpOpCodeInfo.Controls.Add(this.lblCycleCount, 1, 2);
this.tlpOpCodeInfo.Controls.Add(this.label3, 0, 2);
this.tlpOpCodeInfo.Dock = System.Windows.Forms.DockStyle.Fill;
this.tlpOpCodeInfo.Location = new System.Drawing.Point(0, 51);
this.tlpOpCodeInfo.Margin = new System.Windows.Forms.Padding(0, 10, 0, 0);
this.tlpOpCodeInfo.Name = "tlpOpCodeInfo";
this.tlpOpCodeInfo.RowCount = 4;
this.tlpOpCodeInfo.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpOpCodeInfo.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpOpCodeInfo.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpOpCodeInfo.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tlpOpCodeInfo.Size = new System.Drawing.Size(295, 41);
this.tlpOpCodeInfo.TabIndex = 29;
//
// label2
//
this.label2.AutoSize = true;
this.label2.ForeColor = System.Drawing.SystemColors.GrayText;
this.label2.Location = new System.Drawing.Point(3, 13);
this.label2.MaximumSize = new System.Drawing.Size(280, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(92, 13);
this.label2.TabIndex = 29;
this.label2.Text = "Addressing Mode:";
//
// label3
//
this.label3.AutoSize = true;
this.label3.ForeColor = System.Drawing.SystemColors.GrayText;
this.label3.Location = new System.Drawing.Point(3, 26);
this.label3.MaximumSize = new System.Drawing.Size(280, 0);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(67, 13);
this.label3.TabIndex = 30;
this.label3.Text = "Cycle Count:";
// //
// frmOpCodeTooltip // frmOpCodeTooltip
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoSize = true; this.AutoSize = true;
this.ClientSize = new System.Drawing.Size(305, 96); this.ClientSize = new System.Drawing.Size(305, 357);
this.ControlBox = false; this.ControlBox = false;
this.Controls.Add(this.panel1); this.Controls.Add(this.panel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
@ -199,6 +290,8 @@
this.panel1.PerformLayout(); this.panel1.PerformLayout();
this.tlpMain.ResumeLayout(false); this.tlpMain.ResumeLayout(false);
this.tlpMain.PerformLayout(); this.tlpMain.PerformLayout();
this.tlpOpCodeInfo.ResumeLayout(false);
this.tlpOpCodeInfo.PerformLayout();
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout(); this.PerformLayout();
@ -217,5 +310,12 @@
private Controls.ctrlFlagStatus ctrlFlagCarry; private Controls.ctrlFlagStatus ctrlFlagCarry;
private System.Windows.Forms.Label lblName; private System.Windows.Forms.Label lblName;
private System.Windows.Forms.Label lblAffectedStatusFlags; private System.Windows.Forms.Label lblAffectedStatusFlags;
private System.Windows.Forms.Label lblByteCode;
private System.Windows.Forms.Label lblAddressingMode;
private System.Windows.Forms.Label lblCycleCount;
private System.Windows.Forms.TableLayoutPanel tlpOpCodeInfo;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label3;
} }
} }

View file

@ -9,6 +9,7 @@ using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using Mesen.GUI.Controls; using Mesen.GUI.Controls;
using Mesen.GUI.Config; using Mesen.GUI.Config;
using Mesen.GUI.Forms;
namespace Mesen.GUI.Debugger namespace Mesen.GUI.Debugger
{ {
@ -102,12 +103,42 @@ namespace Mesen.GUI.Debugger
return _descriptions.TryGetValue(text.ToLowerInvariant(), out desc); return _descriptions.TryGetValue(text.ToLowerInvariant(), out desc);
} }
public frmOpCodeTooltip(string opcode) public frmOpCodeTooltip(string opcode, int relativeAddress)
{ {
InitializeComponent(); InitializeComponent();
OpCodeDesc desc = _descriptions[opcode.ToLowerInvariant()]; OpCodeDesc desc = _descriptions[opcode.ToLowerInvariant()];
if(relativeAddress >= 0) {
byte opCode = InteropEmu.DebugGetMemoryValue(DebugMemoryType.CpuMemory, (UInt32)relativeAddress);
int opSize = 1;
switch(AddressingModes[opCode]) {
case AddrMode.Abs: case AddrMode.AbsX: case AddrMode.AbsXW: case AddrMode.AbsY: case AddrMode.AbsYW: case AddrMode.Ind:
opSize = 3;
break;
case AddrMode.Imm: case AddrMode.IndX: case AddrMode.IndY: case AddrMode.IndYW: case AddrMode.Rel: case AddrMode.Zero: case AddrMode.ZeroX: case AddrMode.ZeroY:
opSize = 2;
break;
}
string byteCode = "";
for(int i = 0; i < opSize; i++) {
byte value = InteropEmu.DebugGetMemoryValue(DebugMemoryType.CpuMemory, (UInt32)(relativeAddress + i));
byteCode += "$" + value.ToString("X2") + " ";
}
lblByteCode.Text = byteCode;
lblAddressingMode.Text = ResourceHelper.GetEnumText(AddressingModes[opCode]);
lblCycleCount.Text = OpCycles[opCode].ToString();
if(OpCycles[opCode] != OpCyclesCrossed[opCode]) {
lblCycleCount.Text += $" ({OpCyclesCrossed[opCode]} if page crossed)";
}
} else {
tlpOpCodeInfo.Visible = false;
}
ctrlFlagCarry.Letter = "C"; ctrlFlagCarry.Letter = "C";
ctrlFlagDecimal.Letter = "D"; ctrlFlagDecimal.Letter = "D";
ctrlFlagInterrupt.Letter = "I"; ctrlFlagInterrupt.Letter = "I";
@ -131,11 +162,11 @@ namespace Mesen.GUI.Debugger
base.OnShown(e); base.OnShown(e);
this.Width = this.tlpMain.Width; this.Width = this.tlpMain.Width;
this.Height = this.tlpMain.Height; this.Height = this.tlpMain.Height;
} }
[Flags] [Flags]
enum CpuFlag { None = 0, Carry = 1, Decimal = 2, Interrupt = 4, Negative = 8, Overflow = 16, Zero = 32} enum CpuFlag { None = 0, Carry = 1, Decimal = 2, Interrupt = 4, Negative = 8, Overflow = 16, Zero = 32 }
class OpCodeDesc class OpCodeDesc
{ {
@ -150,7 +181,70 @@ namespace Mesen.GUI.Debugger
Flags = flags; Flags = flags;
} }
} }
enum AddrMode
{
None, Acc, Imp, Imm, Rel,
Zero, Abs, ZeroX, ZeroY,
Ind, IndX, IndY, IndYW,
AbsX, AbsXW, AbsY, AbsYW
}
private AddrMode[] AddressingModes = new AddrMode[256] {
AddrMode.Imp, AddrMode.IndX, AddrMode.None, AddrMode.IndX, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Imp, AddrMode.Imm, AddrMode.Acc, AddrMode.Imm, AddrMode.Abs, AddrMode.Abs, AddrMode.Abs, AddrMode.Abs,
AddrMode.Rel, AddrMode.IndY, AddrMode.None, AddrMode.IndYW, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.Imp, AddrMode.AbsY, AddrMode.Imp, AddrMode.AbsYW,AddrMode.AbsX, AddrMode.AbsX, AddrMode.AbsXW,AddrMode.AbsXW,
AddrMode.Abs, AddrMode.IndX, AddrMode.None, AddrMode.IndX, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Imp, AddrMode.Imm, AddrMode.Acc, AddrMode.Imm, AddrMode.Abs, AddrMode.Abs, AddrMode.Abs, AddrMode.Abs,
AddrMode.Rel, AddrMode.IndY, AddrMode.None, AddrMode.IndYW, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.Imp, AddrMode.AbsY, AddrMode.Imp, AddrMode.AbsYW,AddrMode.AbsX, AddrMode.AbsX, AddrMode.AbsXW,AddrMode.AbsXW,
AddrMode.Imp, AddrMode.IndX, AddrMode.None, AddrMode.IndX, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Imp, AddrMode.Imm, AddrMode.Acc, AddrMode.Imm, AddrMode.Abs, AddrMode.Abs, AddrMode.Abs, AddrMode.Abs,
AddrMode.Rel, AddrMode.IndY, AddrMode.None, AddrMode.IndYW, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.Imp, AddrMode.AbsY, AddrMode.Imp, AddrMode.AbsYW,AddrMode.AbsX, AddrMode.AbsX, AddrMode.AbsXW,AddrMode.AbsXW,
AddrMode.Imp, AddrMode.IndX, AddrMode.None, AddrMode.IndX, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Imp, AddrMode.Imm, AddrMode.Acc, AddrMode.Imm, AddrMode.Ind, AddrMode.Abs, AddrMode.Abs, AddrMode.Abs,
AddrMode.Rel, AddrMode.IndY, AddrMode.None, AddrMode.IndYW, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.Imp, AddrMode.AbsY, AddrMode.Imp, AddrMode.AbsYW,AddrMode.AbsX, AddrMode.AbsX, AddrMode.AbsXW,AddrMode.AbsXW,
AddrMode.Imm, AddrMode.IndX, AddrMode.Imm, AddrMode.IndX, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Imp, AddrMode.Imm, AddrMode.Imp, AddrMode.Imm, AddrMode.Abs, AddrMode.Abs, AddrMode.Abs, AddrMode.Abs,
AddrMode.Rel, AddrMode.IndYW, AddrMode.None, AddrMode.IndYW, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.ZeroY, AddrMode.ZeroY, AddrMode.Imp, AddrMode.AbsYW,AddrMode.Imp, AddrMode.AbsYW,AddrMode.AbsXW,AddrMode.AbsXW,AddrMode.AbsYW,AddrMode.AbsYW,
AddrMode.Imm, AddrMode.IndX, AddrMode.Imm, AddrMode.IndX, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Imp, AddrMode.Imm, AddrMode.Imp, AddrMode.Imm, AddrMode.Abs, AddrMode.Abs, AddrMode.Abs, AddrMode.Abs,
AddrMode.Rel, AddrMode.IndY, AddrMode.None, AddrMode.IndY, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.ZeroY, AddrMode.ZeroY, AddrMode.Imp, AddrMode.AbsY, AddrMode.Imp, AddrMode.AbsY, AddrMode.AbsX, AddrMode.AbsX, AddrMode.AbsY, AddrMode.AbsY,
AddrMode.Imm, AddrMode.IndX, AddrMode.Imm, AddrMode.IndX, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Imp, AddrMode.Imm, AddrMode.Imp, AddrMode.Imm, AddrMode.Abs, AddrMode.Abs, AddrMode.Abs, AddrMode.Abs,
AddrMode.Rel, AddrMode.IndY, AddrMode.None, AddrMode.IndYW, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.Imp, AddrMode.AbsY, AddrMode.Imp, AddrMode.AbsYW,AddrMode.AbsX, AddrMode.AbsX, AddrMode.AbsXW,AddrMode.AbsXW,
AddrMode.Imm, AddrMode.IndX, AddrMode.Imm, AddrMode.IndX, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Zero, AddrMode.Imp, AddrMode.Imm, AddrMode.Imp, AddrMode.Imm, AddrMode.Abs, AddrMode.Abs, AddrMode.Abs, AddrMode.Abs,
AddrMode.Rel, AddrMode.IndY, AddrMode.None, AddrMode.IndYW, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.ZeroX, AddrMode.Imp, AddrMode.AbsY, AddrMode.Imp, AddrMode.AbsYW,AddrMode.AbsX, AddrMode.AbsX, AddrMode.AbsXW,AddrMode.AbsXW,
};
private int[] OpCycles = new int[256] {
7, 6, 2, 8, 3, 3, 5, 5, 3, 2, 2, 2, 4, 4, 6, 6,
2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7,
6, 6, 2, 8, 3, 3, 5, 5, 4, 2, 2, 2, 4, 4, 6, 6,
2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7,
6, 6, 2, 8, 3, 3, 5, 5, 3, 2, 2, 2, 3, 4, 6, 6,
2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7,
6, 6, 2, 8, 3, 3, 5, 5, 4, 2, 2, 2, 5, 4, 6, 6,
2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7,
2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4,
2, 6, 2, 6, 4, 4, 4, 4, 2, 5, 2, 5, 5, 5, 5, 5,
2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4,
2, 5, 2, 5, 4, 4, 4, 4, 2, 4, 2, 4, 4, 4, 4, 4,
2, 6, 2, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6,
2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7,
2, 6, 3, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6,
2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7
};
private int[] OpCyclesCrossed = new int[256] {
7, 6, 2, 8, 3, 3, 5, 5, 3, 2, 2, 2, 4, 4, 6, 6,
3, 6, 2, 8, 4, 4, 6, 6, 2, 5, 2, 7, 5, 5, 7, 7,
6, 6, 2, 8, 3, 3, 5, 5, 4, 2, 2, 2, 4, 4, 6, 6,
3, 6, 2, 8, 4, 4, 6, 6, 2, 5, 2, 7, 5, 5, 7, 7,
6, 6, 2, 8, 3, 3, 5, 5, 3, 2, 2, 2, 3, 4, 6, 6,
3, 6, 2, 8, 4, 4, 6, 6, 2, 5, 2, 7, 5, 5, 7, 7,
6, 6, 2, 8, 3, 3, 5, 5, 4, 2, 2, 2, 5, 4, 6, 6,
3, 6, 2, 8, 4, 4, 6, 6, 2, 5, 2, 7, 5, 5, 7, 7,
2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4,
3, 6, 2, 6, 4, 4, 4, 4, 2, 5, 2, 5, 5, 5, 5, 5,
2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4,
3, 6, 2, 5, 4, 4, 4, 4, 2, 5, 2, 5, 5, 5, 5, 5,
2, 6, 2, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6,
3, 6, 2, 8, 4, 4, 6, 6, 2, 5, 2, 7, 5, 5, 7, 7,
2, 6, 3, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6,
3, 6, 2, 8, 4, 4, 6, 6, 2, 5, 2, 7, 5, 5, 7, 7,
};
} }
} }

View file

@ -319,6 +319,25 @@
<Value ID="SaveRam">Save RAM</Value> <Value ID="SaveRam">Save RAM</Value>
<Value ID="InternalRam">Built-in NES RAM</Value> <Value ID="InternalRam">Built-in NES RAM</Value>
</Enum> </Enum>
<Enum ID="AddrMode">
<Value ID="None">None</Value>
<Value ID="Acc">Accumulator</Value>
<Value ID="Imp">Implicit</Value>
<Value ID="Imm">Immediate</Value>
<Value ID="Rel">Relative</Value>
<Value ID="Zero">Zero Page</Value>
<Value ID="Abs">Absolute</Value>
<Value ID="ZeroX">Zero Page, X</Value>
<Value ID="ZeroY">Zero Page, Y</Value>
<Value ID="Ind">Indirect</Value>
<Value ID="IndX">Indexed Indirect</Value>
<Value ID="IndY">Indirect Indexed</Value>
<Value ID="IndYW">Indirect Indexed</Value>
<Value ID="AbsX">Absolute, X</Value>
<Value ID="AbsXW">Absolute, X</Value>
<Value ID="AbsY">Absolute, Y</Value>
<Value ID="AbsYW">Absolute, Y</Value>
</Enum>
<Enum ID="StatusFlagFormat"> <Enum ID="StatusFlagFormat">
<Value ID="Hexadecimal">Hexadecimal</Value> <Value ID="Hexadecimal">Hexadecimal</Value>
<Value ID="Text">Text</Value> <Value ID="Text">Text</Value>