Debugger: Allow byte code to be shown in source view

This commit is contained in:
Sour 2019-01-01 14:51:56 -05:00
parent 0b54ef6c0b
commit 413cf7a212
4 changed files with 47 additions and 29 deletions

View file

@ -33,7 +33,7 @@
this.mnuMarkAsCode = new System.Windows.Forms.ToolStripMenuItem();
this.mnuMarkAsData = new System.Windows.Forms.ToolStripMenuItem();
this.mnuMarkAsUnidentifiedData = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripSeparator();
this.sepMarkSelectionAs = new System.Windows.Forms.ToolStripSeparator();
this.mnuEditSelectedCode = new System.Windows.Forms.ToolStripMenuItem();
this.mnuEditSubroutine = new System.Windows.Forms.ToolStripMenuItem();
this.mnuUndoPrgChrEdit = new System.Windows.Forms.ToolStripMenuItem();
@ -76,7 +76,7 @@
//
this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuMarkSelectionAs,
this.toolStripMenuItem4,
this.sepMarkSelectionAs,
this.mnuEditSelectedCode,
this.mnuEditSubroutine,
this.mnuUndoPrgChrEdit,
@ -142,10 +142,10 @@
this.mnuMarkAsUnidentifiedData.Text = "Unidentified Code/Data";
this.mnuMarkAsUnidentifiedData.Click += new System.EventHandler(this.mnuMarkAsUnidentifiedData_Click);
//
// toolStripMenuItem4
// sepMarkSelectionAs
//
this.toolStripMenuItem4.Name = "toolStripMenuItem4";
this.toolStripMenuItem4.Size = new System.Drawing.Size(250, 6);
this.sepMarkSelectionAs.Name = "sepMarkSelectionAs";
this.sepMarkSelectionAs.Size = new System.Drawing.Size(250, 6);
//
// mnuEditSelectedCode
//
@ -417,7 +417,7 @@
private System.Windows.Forms.ToolStripMenuItem mnuMarkAsCode;
private System.Windows.Forms.ToolStripMenuItem mnuMarkAsData;
private System.Windows.Forms.ToolStripMenuItem mnuMarkAsUnidentifiedData;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem4;
private System.Windows.Forms.ToolStripSeparator sepMarkSelectionAs;
private System.Windows.Forms.ToolStripMenuItem mnuEditSelectedCode;
private System.Windows.Forms.ToolStripMenuItem mnuEditSubroutine;
private System.Windows.Forms.ToolStripMenuItem mnuUndoPrgChrEdit;

View file

@ -26,7 +26,7 @@ namespace Mesen.GUI.Debugger.Controls
private DebugViewInfo _config;
public ICodeViewer Viewer { get; set; }
public bool SourceView { get; set; }
public bool SourceView { get; private set; }
public CodeViewerActions()
{
@ -465,9 +465,13 @@ namespace Mesen.GUI.Debugger.Controls
items[nameof(mnuSetNextStatement)].Enabled = Viewer.ActiveAddress.HasValue;
items[nameof(mnuEditSelectedCode)].Enabled = items[nameof(mnuEditSubroutine)].Enabled = InteropEmu.DebugIsExecutionStopped() && Viewer.CodeViewer.CurrentLine >= 0;
bool hasSymbolProvider = Viewer.SymbolProvider != null;
items[nameof(mnuShowSourceAsComments)].Visible = hasSymbolProvider;
items[nameof(mnuSwitchView)].Visible = hasSymbolProvider;
items[nameof(sepSwitchView)].Visible = hasSymbolProvider;
if(SourceView) {
items[nameof(mnuMarkSelectionAs)].Visible = false;
items[nameof(mnuShowCodeNotes)].Visible = false;
items[nameof(mnuFindOccurrences)].Visible = false;
items[nameof(mnuEditSubroutine)].Visible = false;
@ -477,12 +481,8 @@ namespace Mesen.GUI.Debugger.Controls
items[nameof(mnuEditLabel)].Visible = false;
items[nameof(sepNavigation)].Visible = false;
items[nameof(mnuShowSourceAsComments)].Visible = false;
items[nameof(sepMarkSelectionAs)].Visible = false;
}
bool hasSymbolProvider = Viewer.SymbolProvider != null;
items[nameof(mnuShowSourceAsComments)].Visible = hasSymbolProvider;
items[nameof(mnuSwitchView)].Visible = hasSymbolProvider;
items[nameof(sepSwitchView)].Visible = hasSymbolProvider;
}
private bool UpdateContextMenu(Point mouseLocation)

View file

@ -84,17 +84,30 @@ namespace Mesen.GUI.Debugger.Controls
_lineNumberNotes = new List<string>();
List<string> codeLines = new List<string>();
byte[] prgRomContent = InteropEmu.DebugGetMemoryState(DebugMemoryType.PrgRom);
bool isC = CurrentFile.Name.EndsWith(".h") || CurrentFile.Name.EndsWith(".c");
int index = 0;
int lineIndex = 0;
foreach(string line in CurrentFile.Data) {
string l = line.Replace("\t", " ");
addressing.Add("");
int prgAddress = _symbolProvider.GetPrgAddress(CurrentFile.ID, index);
int prgAddress = _symbolProvider.GetPrgAddress(CurrentFile.ID, lineIndex);
if(prgAddress >= 0) {
int opSize = frmOpCodeTooltip.GetOpSize(prgRomContent[prgAddress]);
string byteCode = "";
for(int i = prgAddress, end = prgAddress + opSize; i < end ; i++) {
byteCode += "$" + prgRomContent[i].ToString("X2") + " ";
}
lineNotes.Add(byteCode);
} else {
lineNotes.Add("");
}
int relativeAddress = InteropEmu.DebugGetRelativeAddress((uint)prgAddress, AddressType.PrgRom);
lineNumbers.Add(relativeAddress);
lineNotes.Add("");
_lineNumberNotes.Add(prgAddress >= 0 ? prgAddress.ToString("X4") : "");
string trimmed = l.TrimStart();
@ -115,7 +128,7 @@ namespace Mesen.GUI.Debugger.Controls
comments.Add("");
codeLines.Add(trimmed);
}
index++;
lineIndex++;
}
ctrlCodeViewer.CodeHighlightingEnabled = !isC;

View file

@ -112,17 +112,7 @@ namespace Mesen.GUI.Debugger
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;
}
int opSize = GetOpSize(opCode);
string byteCode = "";
for(int i = 0; i < opSize; i++) {
@ -171,6 +161,21 @@ namespace Mesen.GUI.Debugger
base.OnLoad(e);
}
public static int GetOpSize(byte opCode)
{
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;
}
return opSize;
}
[Flags]
enum CpuFlag { None = 0, Carry = 1, Decimal = 2, Interrupt = 4, Negative = 8, Overflow = 16, Zero = 32 }
@ -196,7 +201,7 @@ namespace Mesen.GUI.Debugger
AbsX, AbsXW, AbsY, AbsYW
}
private AddrMode[] AddressingModes = new AddrMode[256] {
private static 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,