Debugger: Improved usability and added shortcuts/features

This commit is contained in:
Sour 2019-03-30 21:47:30 -04:00
parent fd0aefd130
commit 4402be3c52
15 changed files with 456 additions and 105 deletions

View file

@ -171,12 +171,13 @@ void Console::Stop(bool sendNotification)
void Console::Reset()
{
Lock();
shared_ptr<Debugger> debugger = _debugger;
if(debugger) {
debugger->Run();
}
Lock();
_dmaController->Reset();
_internalRegisters->Reset();
_memoryManager->Reset();
@ -196,6 +197,11 @@ void Console::PowerCycle()
{
shared_ptr<BaseCartridge> cart = _cart;
if(cart) {
shared_ptr<Debugger> debugger = _debugger;
if(debugger) {
debugger->Run();
}
RomInfo info = cart->GetRomInfo();
Lock();
LoadRom(info.RomFile, info.PatchFile, false);

View file

@ -203,10 +203,17 @@ uint32_t Disassembler::GetLineCount()
uint32_t Disassembler::GetLineIndex(uint32_t cpuAddress)
{
auto lock = _disassemblyLock.AcquireSafe();
for(int i = 0; i < _disassembly.size(); i++) {
if(_disassembly[i].CpuAddress == cpuAddress) {
return i;
uint32_t lastAddress = 0;
for(int i = 1; i < _disassembly.size(); i++) {
if(_disassembly[i].CpuAddress < 0) {
continue;
}
if(cpuAddress >= lastAddress && cpuAddress < (uint32_t)_disassembly[i].CpuAddress) {
return i - 1;
}
lastAddress = _disassembly[i].CpuAddress;
}
return 0;
}

View file

@ -2,6 +2,7 @@
#include "stdafx.h"
#include "BaseControlDevice.h"
#include "Console.h"
#include "Debugger.h"
class SystemActionManager : public BaseControlDevice
{
@ -46,6 +47,11 @@ public:
bool Reset()
{
if(!_needReset) {
shared_ptr<Debugger> debugger = _console->GetDebugger(false);
if(debugger) {
debugger->Run();
}
_needReset = true;
return true;
}
@ -55,6 +61,11 @@ public:
bool PowerCycle()
{
if(!_needPowerCycle) {
shared_ptr<Debugger> debugger = _console->GetDebugger(false);
if(debugger) {
debugger->Run();
}
_needPowerCycle = true;
return true;
}

View file

@ -15,7 +15,8 @@ namespace Mesen.GUI.Debugger.Controls
{
public partial class ctrlBreakpoints : BaseControl
{
public event EventHandler BreakpointNavigation;
public delegate void BreakpointNavigationHandler(Breakpoint bp);
public event BreakpointNavigationHandler BreakpointNavigation;
private Font _markedColumnFont;
public ctrlBreakpoints()
@ -125,7 +126,7 @@ namespace Mesen.GUI.Debugger.Controls
if(BreakpointNavigation != null) {
Breakpoint bp = lstBreakpoints.SelectedItems[0].Tag as Breakpoint;
if(bp.IsCpuBreakpoint && bp.GetRelativeAddress() >= 0) {
BreakpointNavigation(bp, null);
BreakpointNavigation(bp);
}
}
}

View file

@ -99,6 +99,7 @@
//
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
this.toolStripMenuItem2.Size = new System.Drawing.Size(146, 6);
this.toolStripMenuItem2.Visible = false;
//
// mnuShowLabels
//
@ -106,6 +107,7 @@
this.mnuShowLabels.Name = "mnuShowLabels";
this.mnuShowLabels.Size = new System.Drawing.Size(149, 22);
this.mnuShowLabels.Text = "Show Labels";
this.mnuShowLabels.Visible = false;
//
// lstBreakpoints
//

View file

@ -28,5 +28,16 @@ namespace Mesen.GUI.Debugger.Code
});
}
}
public void EnableDisableBreakpoint(int lineIndex)
{
int address = this._provider.GetLineAddress(lineIndex);
if(address >= 0) {
BreakpointManager.EnableDisableBreakpoint(new AddressInfo() {
Address = address,
Type = SnesMemoryType.CpuMemory
});
}
}
}
}

View file

@ -13,5 +13,6 @@ namespace Mesen.GUI.Debugger.Code
void RefreshCode();
void ToggleBreakpoint(int lineIndex);
void EnableDisableBreakpoint(int lineIndex);
}
}

View file

@ -91,12 +91,36 @@ namespace Mesen.GUI.Debugger.Controls
ctrlCode.ScrollToLineIndex(lineIndex, eHistoryType.None, false, true);
}
}
private void mnuToggleBreakpoint_Click(object sender, EventArgs e)
public ctrlScrollableTextbox CodeViewer { get { return ctrlCode; } }
public void GoToAddress(int address)
{
ctrlCode.ScrollToAddress(address);
}
public void GoToActiveAddress()
{
if(_styleProvider.ActiveAddress.HasValue) {
ctrlCode.ScrollToAddress(_styleProvider.ActiveAddress.Value);
}
}
public void ToggleBreakpoint()
{
_manager.ToggleBreakpoint(ctrlCode.SelectedLine);
}
public void EnableDisableBreakpoint()
{
_manager.EnableDisableBreakpoint(ctrlCode.SelectedLine);
}
private void mnuToggleBreakpoint_Click(object sender, EventArgs e)
{
ToggleBreakpoint();
}
private void ctrlCode_MouseDown(object sender, MouseEventArgs e)
{
if(e.X < 20) {

View file

@ -61,6 +61,11 @@ namespace Mesen.GUI.Debugger
}));
}
break;
case ConsoleNotificationType.GameLoaded:
//Configuration is lost when debugger is restarted (when switching game or power cycling)
ctrlScanlineCycleSelect.RefreshSettings();
break;
}
}

View file

@ -77,6 +77,11 @@ namespace Mesen.GUI.Debugger
}));
}
break;
case ConsoleNotificationType.GameLoaded:
//Configuration is lost when debugger is restarted (when switching game or power cycling)
ctrlScanlineCycleSelect.RefreshSettings();
break;
}
}

View file

@ -83,6 +83,11 @@ namespace Mesen.GUI.Debugger
}));
}
break;
case ConsoleNotificationType.GameLoaded:
//Configuration is lost when debugger is restarted (when switching game or power cycling)
ctrlScanlineCycleSelect.RefreshSettings();
break;
}
}

View file

@ -35,32 +35,32 @@ namespace Mesen.GUI.Debugger
GetMember(nameof(DebuggerShortcutsConfig.Paste)),
GetMember(nameof(DebuggerShortcutsConfig.SelectAll)),
GetMember(nameof(DebuggerShortcutsConfig.Refresh)),
GetMember(nameof(DebuggerShortcutsConfig.MarkAsCode)),
GetMember(nameof(DebuggerShortcutsConfig.MarkAsData)),
GetMember(nameof(DebuggerShortcutsConfig.MarkAsUnidentified)),
GetMember(nameof(DebuggerShortcutsConfig.GoToAll)),
//GetMember(nameof(DebuggerShortcutsConfig.MarkAsCode)),
//GetMember(nameof(DebuggerShortcutsConfig.MarkAsData)),
//GetMember(nameof(DebuggerShortcutsConfig.MarkAsUnidentified)),
//GetMember(nameof(DebuggerShortcutsConfig.GoToAll)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditInMemoryViewer)),
GetMember(nameof(DebuggerShortcutsConfig.MemoryViewer_ViewInDisassembly)),
GetMember(nameof(DebuggerShortcutsConfig.OpenApuViewer)),
GetMember(nameof(DebuggerShortcutsConfig.OpenAssembler)),
//GetMember(nameof(DebuggerShortcutsConfig.OpenApuViewer)),
//GetMember(nameof(DebuggerShortcutsConfig.OpenAssembler)),
GetMember(nameof(DebuggerShortcutsConfig.OpenDebugger)),
GetMember(nameof(DebuggerShortcutsConfig.OpenEventViewer)),
GetMember(nameof(DebuggerShortcutsConfig.OpenMemoryTools)),
GetMember(nameof(DebuggerShortcutsConfig.OpenProfiler)),
GetMember(nameof(DebuggerShortcutsConfig.OpenScriptWindow)),
GetMember(nameof(DebuggerShortcutsConfig.OpenTextHooker)),
//GetMember(nameof(DebuggerShortcutsConfig.OpenProfiler)),
//GetMember(nameof(DebuggerShortcutsConfig.OpenScriptWindow)),
//GetMember(nameof(DebuggerShortcutsConfig.OpenTextHooker)),
GetMember(nameof(DebuggerShortcutsConfig.OpenTraceLogger)),
GetMember(nameof(DebuggerShortcutsConfig.OpenWatchWindow)),
//GetMember(nameof(DebuggerShortcutsConfig.OpenWatchWindow)),
GetMember(nameof(DebuggerShortcutsConfig.OpenTilemapViewer)),
GetMember(nameof(DebuggerShortcutsConfig.OpenTileViewer)),
GetMember(nameof(DebuggerShortcutsConfig.OpenSpriteViewer)),
//GetMember(nameof(DebuggerShortcutsConfig.OpenSpriteViewer)),
GetMember(nameof(DebuggerShortcutsConfig.OpenPaletteViewer)),
};
ctrlDbgShortcutsMemoryViewer.Shortcuts = new FieldInfo[] {
GetMember(nameof(DebuggerShortcutsConfig.MemoryViewer_Freeze)),
/*GetMember(nameof(DebuggerShortcutsConfig.MemoryViewer_Freeze)),
GetMember(nameof(DebuggerShortcutsConfig.MemoryViewer_Unfreeze)),
GetMember(nameof(DebuggerShortcutsConfig.MemoryViewer_AddToWatch)),
GetMember(nameof(DebuggerShortcutsConfig.MemoryViewer_EditBreakpoint)),
@ -68,15 +68,15 @@ 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_ViewInMemoryType))*/
};
ctrlDbgShortcutsScriptWindow.Shortcuts = new FieldInfo[] {
/*ctrlDbgShortcutsScriptWindow.Shortcuts = new FieldInfo[] {
GetMember(nameof(DebuggerShortcutsConfig.ScriptWindow_OpenScript)),
GetMember(nameof(DebuggerShortcutsConfig.ScriptWindow_SaveScript)),
GetMember(nameof(DebuggerShortcutsConfig.ScriptWindow_RunScript)),
GetMember(nameof(DebuggerShortcutsConfig.ScriptWindow_StopScript))
};
};*/
ctrlDbgShortcutsDebugger.Shortcuts = new FieldInfo[] {
GetMember(nameof(DebuggerShortcutsConfig.Reset)),
@ -87,35 +87,35 @@ namespace Mesen.GUI.Debugger
GetMember(nameof(DebuggerShortcutsConfig.StepInto)),
GetMember(nameof(DebuggerShortcutsConfig.StepOver)),
GetMember(nameof(DebuggerShortcutsConfig.StepOut)),
GetMember(nameof(DebuggerShortcutsConfig.StepBack)),
//GetMember(nameof(DebuggerShortcutsConfig.StepBack)),
GetMember(nameof(DebuggerShortcutsConfig.RunPpuCycle)),
GetMember(nameof(DebuggerShortcutsConfig.RunPpuScanline)),
GetMember(nameof(DebuggerShortcutsConfig.RunPpuFrame)),
GetMember(nameof(DebuggerShortcutsConfig.BreakIn)),
GetMember(nameof(DebuggerShortcutsConfig.BreakOn)),
GetMember(nameof(DebuggerShortcutsConfig.FindOccurrences)),
//GetMember(nameof(DebuggerShortcutsConfig.BreakIn)),
//GetMember(nameof(DebuggerShortcutsConfig.BreakOn)),
//GetMember(nameof(DebuggerShortcutsConfig.FindOccurrences)),
GetMember(nameof(DebuggerShortcutsConfig.GoToProgramCounter)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_SetNextStatement)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditSubroutine)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditSelectedCode)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditSourceFile)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditLabel)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_NavigateBack)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_NavigateForward)),
//GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_SetNextStatement)),
//GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditSubroutine)),
//GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditSelectedCode)),
//GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditSourceFile)),
//GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_EditLabel)),
//GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_NavigateBack)),
//GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_NavigateForward)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_ToggleBreakpoint)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_DisableEnableBreakpoint)),
GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_SwitchView)),
GetMember(nameof(DebuggerShortcutsConfig.FunctionList_EditLabel)),
GetMember(nameof(DebuggerShortcutsConfig.FunctionList_AddBreakpoint)),
GetMember(nameof(DebuggerShortcutsConfig.FunctionList_FindOccurrences)),
GetMember(nameof(DebuggerShortcutsConfig.LabelList_Add)),
GetMember(nameof(DebuggerShortcutsConfig.LabelList_Edit)),
GetMember(nameof(DebuggerShortcutsConfig.LabelList_Delete)),
GetMember(nameof(DebuggerShortcutsConfig.LabelList_AddBreakpoint)),
GetMember(nameof(DebuggerShortcutsConfig.LabelList_AddToWatch)),
GetMember(nameof(DebuggerShortcutsConfig.LabelList_FindOccurrences)),
GetMember(nameof(DebuggerShortcutsConfig.LabelList_ViewInCpuMemory)),
GetMember(nameof(DebuggerShortcutsConfig.LabelList_ViewInMemoryType)),
//GetMember(nameof(DebuggerShortcutsConfig.CodeWindow_SwitchView)),
//GetMember(nameof(DebuggerShortcutsConfig.FunctionList_EditLabel)),
//GetMember(nameof(DebuggerShortcutsConfig.FunctionList_AddBreakpoint)),
//GetMember(nameof(DebuggerShortcutsConfig.FunctionList_FindOccurrences)),
//GetMember(nameof(DebuggerShortcutsConfig.LabelList_Add)),
//GetMember(nameof(DebuggerShortcutsConfig.LabelList_Edit)),
//GetMember(nameof(DebuggerShortcutsConfig.LabelList_Delete)),
//GetMember(nameof(DebuggerShortcutsConfig.LabelList_AddBreakpoint)),
//GetMember(nameof(DebuggerShortcutsConfig.LabelList_AddToWatch)),
//GetMember(nameof(DebuggerShortcutsConfig.LabelList_FindOccurrences)),
//GetMember(nameof(DebuggerShortcutsConfig.LabelList_ViewInCpuMemory)),
//GetMember(nameof(DebuggerShortcutsConfig.LabelList_ViewInMemoryType)),
GetMember(nameof(DebuggerShortcutsConfig.BreakpointList_Add)),
GetMember(nameof(DebuggerShortcutsConfig.BreakpointList_Edit)),
GetMember(nameof(DebuggerShortcutsConfig.BreakpointList_GoToLocation)),
@ -123,12 +123,12 @@ namespace Mesen.GUI.Debugger
GetMember(nameof(DebuggerShortcutsConfig.WatchList_Delete)),
GetMember(nameof(DebuggerShortcutsConfig.WatchList_MoveUp)),
GetMember(nameof(DebuggerShortcutsConfig.WatchList_MoveDown)),
GetMember(nameof(DebuggerShortcutsConfig.SaveRom)),
GetMember(nameof(DebuggerShortcutsConfig.SaveRomAs)),
GetMember(nameof(DebuggerShortcutsConfig.SaveEditAsIps)),
GetMember(nameof(DebuggerShortcutsConfig.RevertPrgChrChanges)),
GetMember(nameof(DebuggerShortcutsConfig.ToggleVerifiedData)),
GetMember(nameof(DebuggerShortcutsConfig.ToggleUnidentifiedCodeData))
//GetMember(nameof(DebuggerShortcutsConfig.SaveRom)),
//GetMember(nameof(DebuggerShortcutsConfig.SaveRomAs)),
//GetMember(nameof(DebuggerShortcutsConfig.SaveEditAsIps)),
//GetMember(nameof(DebuggerShortcutsConfig.RevertPrgChrChanges)),
//GetMember(nameof(DebuggerShortcutsConfig.ToggleVerifiedData)),
//GetMember(nameof(DebuggerShortcutsConfig.ToggleUnidentifiedCodeData))
};
}

View file

@ -46,16 +46,32 @@
this.mnuPowerCycle = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem24 = new System.Windows.Forms.ToolStripSeparator();
this.mnuToggleBreakpoint = new System.Windows.Forms.ToolStripMenuItem();
this.mnuDisableEnableBreakpoint = new System.Windows.Forms.ToolStripMenuItem();
this.mnuEnableDisableBreakpoint = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
this.mnuRunCpuCycle = new System.Windows.Forms.ToolStripMenuItem();
this.mnuRun1000Instructions = new System.Windows.Forms.ToolStripMenuItem();
this.mnuRunPpuCycle = new System.Windows.Forms.ToolStripMenuItem();
this.mnuRunScanline = new System.Windows.Forms.ToolStripMenuItem();
this.mnuRunOneFrame = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripSeparator();
this.mnuBreakIn = new System.Windows.Forms.ToolStripMenuItem();
this.mnuBreakOn = new System.Windows.Forms.ToolStripMenuItem();
this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mnuFind = new System.Windows.Forms.ToolStripMenuItem();
this.mnuFindNext = new System.Windows.Forms.ToolStripMenuItem();
this.mnuFindPrev = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem9 = new System.Windows.Forms.ToolStripSeparator();
this.mnuFindAllOccurrences = new System.Windows.Forms.ToolStripMenuItem();
this.mnuGoTo = new System.Windows.Forms.ToolStripMenuItem();
this.mnuGoToAddress = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem23 = new System.Windows.Forms.ToolStripSeparator();
this.mnuGoToProgramCounter = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem22 = new System.Windows.Forms.ToolStripSeparator();
this.mnuGoToResetHandler = new System.Windows.Forms.ToolStripMenuItem();
this.mnuGoToIrqHandler = new System.Windows.Forms.ToolStripMenuItem();
this.mnuGoToNmiHandler = new System.Windows.Forms.ToolStripMenuItem();
this.mnuGoToBrkHandler = new System.Windows.Forms.ToolStripMenuItem();
this.mnuGoToCopHandler = new System.Windows.Forms.ToolStripMenuItem();
this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mnuPreferences = new System.Windows.Forms.ToolStripMenuItem();
this.ctrlSplitContainer = new Mesen.GUI.Controls.ctrlSplitContainer();
this.ctrlStatus = new Mesen.GUI.Debugger.Controls.ctrlConsoleStatus();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
@ -88,7 +104,9 @@
// ctrlMesenMenuStrip1
//
this.ctrlMesenMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.debugToolStripMenuItem});
this.debugToolStripMenuItem,
this.searchToolStripMenuItem,
this.optionsToolStripMenuItem});
this.ctrlMesenMenuStrip1.Location = new System.Drawing.Point(0, 0);
this.ctrlMesenMenuStrip1.Name = "ctrlMesenMenuStrip1";
this.ctrlMesenMenuStrip1.Size = new System.Drawing.Size(832, 24);
@ -110,10 +128,8 @@
this.mnuPowerCycle,
this.toolStripMenuItem24,
this.mnuToggleBreakpoint,
this.mnuDisableEnableBreakpoint,
this.mnuEnableDisableBreakpoint,
this.toolStripMenuItem2,
this.mnuRunCpuCycle,
this.mnuRun1000Instructions,
this.mnuRunPpuCycle,
this.mnuRunScanline,
this.mnuRunOneFrame,
@ -128,7 +144,7 @@
//
this.mnuContinue.Image = global::Mesen.GUI.Properties.Resources.MediaPlay;
this.mnuContinue.Name = "mnuContinue";
this.mnuContinue.Size = new System.Drawing.Size(213, 22);
this.mnuContinue.Size = new System.Drawing.Size(212, 22);
this.mnuContinue.Text = "Continue";
//
// mnuBreak
@ -137,135 +153,258 @@
this.mnuBreak.Image = global::Mesen.GUI.Properties.Resources.MediaPause;
this.mnuBreak.Name = "mnuBreak";
this.mnuBreak.ShortcutKeyDisplayString = "";
this.mnuBreak.Size = new System.Drawing.Size(213, 22);
this.mnuBreak.Size = new System.Drawing.Size(212, 22);
this.mnuBreak.Text = "Break";
//
// toolStripMenuItem3
//
this.toolStripMenuItem3.Name = "toolStripMenuItem3";
this.toolStripMenuItem3.Size = new System.Drawing.Size(210, 6);
this.toolStripMenuItem3.Size = new System.Drawing.Size(209, 6);
//
// mnuStepInto
//
this.mnuStepInto.Image = global::Mesen.GUI.Properties.Resources.StepInto;
this.mnuStepInto.Name = "mnuStepInto";
this.mnuStepInto.Size = new System.Drawing.Size(213, 22);
this.mnuStepInto.Size = new System.Drawing.Size(212, 22);
this.mnuStepInto.Text = "Step Into";
//
// mnuStepOver
//
this.mnuStepOver.Image = global::Mesen.GUI.Properties.Resources.StepOver;
this.mnuStepOver.Name = "mnuStepOver";
this.mnuStepOver.Size = new System.Drawing.Size(213, 22);
this.mnuStepOver.Size = new System.Drawing.Size(212, 22);
this.mnuStepOver.Text = "Step Over";
//
// mnuStepOut
//
this.mnuStepOut.Image = global::Mesen.GUI.Properties.Resources.StepOut;
this.mnuStepOut.Name = "mnuStepOut";
this.mnuStepOut.Size = new System.Drawing.Size(213, 22);
this.mnuStepOut.Size = new System.Drawing.Size(212, 22);
this.mnuStepOut.Text = "Step Out";
//
// mnuStepBack
//
this.mnuStepBack.Image = global::Mesen.GUI.Properties.Resources.StepBack;
this.mnuStepBack.Name = "mnuStepBack";
this.mnuStepBack.Size = new System.Drawing.Size(213, 22);
this.mnuStepBack.Size = new System.Drawing.Size(212, 22);
this.mnuStepBack.Text = "Step Back";
this.mnuStepBack.Visible = false;
//
// toolStripMenuItem1
//
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
this.toolStripMenuItem1.Size = new System.Drawing.Size(210, 6);
this.toolStripMenuItem1.Size = new System.Drawing.Size(209, 6);
//
// mnuReset
//
this.mnuReset.Image = global::Mesen.GUI.Properties.Resources.Refresh;
this.mnuReset.Name = "mnuReset";
this.mnuReset.Size = new System.Drawing.Size(213, 22);
this.mnuReset.Size = new System.Drawing.Size(212, 22);
this.mnuReset.Text = "Reset";
//
// mnuPowerCycle
//
this.mnuPowerCycle.Image = global::Mesen.GUI.Properties.Resources.PowerCycle;
this.mnuPowerCycle.Name = "mnuPowerCycle";
this.mnuPowerCycle.Size = new System.Drawing.Size(213, 22);
this.mnuPowerCycle.Size = new System.Drawing.Size(212, 22);
this.mnuPowerCycle.Text = "Power Cycle";
//
// toolStripMenuItem24
//
this.toolStripMenuItem24.Name = "toolStripMenuItem24";
this.toolStripMenuItem24.Size = new System.Drawing.Size(210, 6);
this.toolStripMenuItem24.Size = new System.Drawing.Size(209, 6);
//
// mnuToggleBreakpoint
//
this.mnuToggleBreakpoint.Image = global::Mesen.GUI.Properties.Resources.Breakpoint;
this.mnuToggleBreakpoint.Name = "mnuToggleBreakpoint";
this.mnuToggleBreakpoint.Size = new System.Drawing.Size(213, 22);
this.mnuToggleBreakpoint.Size = new System.Drawing.Size(212, 22);
this.mnuToggleBreakpoint.Text = "Toggle Breakpoint";
//
// mnuDisableEnableBreakpoint
// mnuEnableDisableBreakpoint
//
this.mnuDisableEnableBreakpoint.Image = global::Mesen.GUI.Properties.Resources.BreakpointDisabled;
this.mnuDisableEnableBreakpoint.Name = "mnuDisableEnableBreakpoint";
this.mnuDisableEnableBreakpoint.Size = new System.Drawing.Size(213, 22);
this.mnuDisableEnableBreakpoint.Text = "Disable/Enable Breakpoint";
this.mnuEnableDisableBreakpoint.Image = global::Mesen.GUI.Properties.Resources.BreakpointDisabled;
this.mnuEnableDisableBreakpoint.Name = "mnuEnableDisableBreakpoint";
this.mnuEnableDisableBreakpoint.Size = new System.Drawing.Size(212, 22);
this.mnuEnableDisableBreakpoint.Text = "Disable/Enable Breakpoint";
//
// toolStripMenuItem2
//
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
this.toolStripMenuItem2.Size = new System.Drawing.Size(210, 6);
//
// mnuRunCpuCycle
//
this.mnuRunCpuCycle.Image = global::Mesen.GUI.Properties.Resources.JumpTarget;
this.mnuRunCpuCycle.Name = "mnuRunCpuCycle";
this.mnuRunCpuCycle.Size = new System.Drawing.Size(213, 22);
this.mnuRunCpuCycle.Text = "Run one CPU cycle";
//
// mnuRun1000Instructions
//
this.mnuRun1000Instructions.Name = "mnuRun1000Instructions";
this.mnuRun1000Instructions.Size = new System.Drawing.Size(213, 22);
this.mnuRun1000Instructions.Text = "Run 1000 CPU instructions";
this.toolStripMenuItem2.Size = new System.Drawing.Size(209, 6);
//
// mnuRunPpuCycle
//
this.mnuRunPpuCycle.Image = global::Mesen.GUI.Properties.Resources.RunPpuCycle;
this.mnuRunPpuCycle.Name = "mnuRunPpuCycle";
this.mnuRunPpuCycle.Size = new System.Drawing.Size(213, 22);
this.mnuRunPpuCycle.Size = new System.Drawing.Size(212, 22);
this.mnuRunPpuCycle.Text = "Run one PPU cycle";
//
// mnuRunScanline
//
this.mnuRunScanline.Image = global::Mesen.GUI.Properties.Resources.RunPpuScanline;
this.mnuRunScanline.Name = "mnuRunScanline";
this.mnuRunScanline.Size = new System.Drawing.Size(213, 22);
this.mnuRunScanline.Size = new System.Drawing.Size(212, 22);
this.mnuRunScanline.Text = "Run one scanline";
//
// mnuRunOneFrame
//
this.mnuRunOneFrame.Image = global::Mesen.GUI.Properties.Resources.RunPpuFrame;
this.mnuRunOneFrame.Name = "mnuRunOneFrame";
this.mnuRunOneFrame.Size = new System.Drawing.Size(213, 22);
this.mnuRunOneFrame.Size = new System.Drawing.Size(212, 22);
this.mnuRunOneFrame.Text = "Run one frame";
//
// toolStripMenuItem8
//
this.toolStripMenuItem8.Name = "toolStripMenuItem8";
this.toolStripMenuItem8.Size = new System.Drawing.Size(210, 6);
this.toolStripMenuItem8.Size = new System.Drawing.Size(209, 6);
this.toolStripMenuItem8.Visible = false;
//
// mnuBreakIn
//
this.mnuBreakIn.Name = "mnuBreakIn";
this.mnuBreakIn.Size = new System.Drawing.Size(213, 22);
this.mnuBreakIn.Size = new System.Drawing.Size(212, 22);
this.mnuBreakIn.Text = "Break in...";
this.mnuBreakIn.Visible = false;
//
// mnuBreakOn
//
this.mnuBreakOn.Name = "mnuBreakOn";
this.mnuBreakOn.Size = new System.Drawing.Size(213, 22);
this.mnuBreakOn.Size = new System.Drawing.Size(212, 22);
this.mnuBreakOn.Text = "Break on...";
this.mnuBreakOn.Visible = false;
//
// searchToolStripMenuItem
//
this.searchToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuFind,
this.mnuFindNext,
this.mnuFindPrev,
this.toolStripMenuItem9,
this.mnuFindAllOccurrences,
this.mnuGoTo});
this.searchToolStripMenuItem.Name = "searchToolStripMenuItem";
this.searchToolStripMenuItem.Size = new System.Drawing.Size(54, 20);
this.searchToolStripMenuItem.Text = "Search";
//
// mnuFind
//
this.mnuFind.Image = global::Mesen.GUI.Properties.Resources.Find;
this.mnuFind.Name = "mnuFind";
this.mnuFind.Size = new System.Drawing.Size(183, 22);
this.mnuFind.Text = "Find...";
//
// mnuFindNext
//
this.mnuFindNext.Image = global::Mesen.GUI.Properties.Resources.NextArrow;
this.mnuFindNext.Name = "mnuFindNext";
this.mnuFindNext.Size = new System.Drawing.Size(183, 22);
this.mnuFindNext.Text = "Find Next";
//
// mnuFindPrev
//
this.mnuFindPrev.Image = global::Mesen.GUI.Properties.Resources.PreviousArrow;
this.mnuFindPrev.Name = "mnuFindPrev";
this.mnuFindPrev.Size = new System.Drawing.Size(183, 22);
this.mnuFindPrev.Text = "Find Previous";
//
// toolStripMenuItem9
//
this.toolStripMenuItem9.Name = "toolStripMenuItem9";
this.toolStripMenuItem9.Size = new System.Drawing.Size(180, 6);
//
// mnuFindAllOccurrences
//
this.mnuFindAllOccurrences.Name = "mnuFindAllOccurrences";
this.mnuFindAllOccurrences.Size = new System.Drawing.Size(183, 22);
this.mnuFindAllOccurrences.Text = "Find All Occurrences";
this.mnuFindAllOccurrences.Visible = false;
//
// mnuGoTo
//
this.mnuGoTo.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuGoToAddress,
this.toolStripMenuItem23,
this.mnuGoToProgramCounter,
this.toolStripMenuItem22,
this.mnuGoToResetHandler,
this.mnuGoToIrqHandler,
this.mnuGoToNmiHandler,
this.mnuGoToBrkHandler,
this.mnuGoToCopHandler});
this.mnuGoTo.Name = "mnuGoTo";
this.mnuGoTo.Size = new System.Drawing.Size(183, 22);
this.mnuGoTo.Text = "Go To...";
this.mnuGoTo.DropDownOpening += new System.EventHandler(this.mnuGoTo_DropDownOpening);
//
// mnuGoToAddress
//
this.mnuGoToAddress.Name = "mnuGoToAddress";
this.mnuGoToAddress.Size = new System.Drawing.Size(166, 22);
this.mnuGoToAddress.Text = "Address";
//
// toolStripMenuItem23
//
this.toolStripMenuItem23.Name = "toolStripMenuItem23";
this.toolStripMenuItem23.Size = new System.Drawing.Size(163, 6);
//
// mnuGoToProgramCounter
//
this.mnuGoToProgramCounter.Name = "mnuGoToProgramCounter";
this.mnuGoToProgramCounter.ShortcutKeyDisplayString = "";
this.mnuGoToProgramCounter.Size = new System.Drawing.Size(166, 22);
this.mnuGoToProgramCounter.Text = "Program Counter";
//
// toolStripMenuItem22
//
this.toolStripMenuItem22.Name = "toolStripMenuItem22";
this.toolStripMenuItem22.Size = new System.Drawing.Size(163, 6);
//
// mnuGoToResetHandler
//
this.mnuGoToResetHandler.Name = "mnuGoToResetHandler";
this.mnuGoToResetHandler.Size = new System.Drawing.Size(166, 22);
this.mnuGoToResetHandler.Text = "Reset Handler";
//
// mnuGoToIrqHandler
//
this.mnuGoToIrqHandler.Name = "mnuGoToIrqHandler";
this.mnuGoToIrqHandler.Size = new System.Drawing.Size(166, 22);
this.mnuGoToIrqHandler.Text = "IRQ Handler";
//
// mnuGoToNmiHandler
//
this.mnuGoToNmiHandler.Name = "mnuGoToNmiHandler";
this.mnuGoToNmiHandler.Size = new System.Drawing.Size(166, 22);
this.mnuGoToNmiHandler.Text = "NMI Handler";
//
// mnuGoToBrkHandler
//
this.mnuGoToBrkHandler.Name = "mnuGoToBrkHandler";
this.mnuGoToBrkHandler.Size = new System.Drawing.Size(166, 22);
this.mnuGoToBrkHandler.Text = "BRK Handler";
//
// mnuGoToCopHandler
//
this.mnuGoToCopHandler.Name = "mnuGoToCopHandler";
this.mnuGoToCopHandler.Size = new System.Drawing.Size(166, 22);
this.mnuGoToCopHandler.Text = "COP Handler";
//
// optionsToolStripMenuItem
//
this.optionsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuPreferences});
this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem";
this.optionsToolStripMenuItem.Size = new System.Drawing.Size(61, 20);
this.optionsToolStripMenuItem.Text = "Options";
//
// mnuPreferences
//
this.mnuPreferences.Image = global::Mesen.GUI.Properties.Resources.Settings;
this.mnuPreferences.Name = "mnuPreferences";
this.mnuPreferences.Size = new System.Drawing.Size(209, 22);
this.mnuPreferences.Text = "Configure shortcut keys...";
this.mnuPreferences.Click += new System.EventHandler(this.mnuPreferences_Click);
//
// ctrlSplitContainer
//
@ -350,6 +489,7 @@
this.ctrlBreakpoints.Name = "ctrlBreakpoints";
this.ctrlBreakpoints.Size = new System.Drawing.Size(265, 145);
this.ctrlBreakpoints.TabIndex = 0;
this.ctrlBreakpoints.BreakpointNavigation += new Mesen.GUI.Debugger.Controls.ctrlBreakpoints.BreakpointNavigationHandler(this.ctrlBreakpoints_BreakpointNavigation);
//
// grpCallstack
//
@ -421,9 +561,8 @@
private System.Windows.Forms.ToolStripMenuItem mnuPowerCycle;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem24;
private System.Windows.Forms.ToolStripMenuItem mnuToggleBreakpoint;
private System.Windows.Forms.ToolStripMenuItem mnuDisableEnableBreakpoint;
private System.Windows.Forms.ToolStripMenuItem mnuEnableDisableBreakpoint;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2;
private System.Windows.Forms.ToolStripMenuItem mnuRunCpuCycle;
private System.Windows.Forms.ToolStripMenuItem mnuRunPpuCycle;
private System.Windows.Forms.ToolStripMenuItem mnuRunScanline;
private System.Windows.Forms.ToolStripMenuItem mnuRunOneFrame;
@ -437,9 +576,26 @@
private System.Windows.Forms.GroupBox grpBreakpoints;
private Controls.ctrlBreakpoints ctrlBreakpoints;
private Controls.ctrlConsoleStatus ctrlStatus;
private System.Windows.Forms.ToolStripMenuItem mnuRun1000Instructions;
private GUI.Controls.ctrlMesenToolStrip tsToolbar;
private System.Windows.Forms.GroupBox grpCallstack;
private Controls.ctrlCallstack ctrlCallstack;
private System.Windows.Forms.ToolStripMenuItem searchToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem mnuFind;
private System.Windows.Forms.ToolStripMenuItem mnuFindNext;
private System.Windows.Forms.ToolStripMenuItem mnuFindPrev;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem9;
private System.Windows.Forms.ToolStripMenuItem mnuFindAllOccurrences;
private System.Windows.Forms.ToolStripMenuItem mnuGoTo;
private System.Windows.Forms.ToolStripMenuItem mnuGoToAddress;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem23;
private System.Windows.Forms.ToolStripMenuItem mnuGoToProgramCounter;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem22;
private System.Windows.Forms.ToolStripMenuItem mnuGoToResetHandler;
private System.Windows.Forms.ToolStripMenuItem mnuGoToIrqHandler;
private System.Windows.Forms.ToolStripMenuItem mnuGoToNmiHandler;
private System.Windows.Forms.ToolStripMenuItem mnuGoToBrkHandler;
private System.Windows.Forms.ToolStripMenuItem mnuGoToCopHandler;
private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem mnuPreferences;
}
}

View file

@ -47,6 +47,20 @@ namespace Mesen.GUI.Debugger
}
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if(keyData == ConfigManager.Config.Debug.Shortcuts.ToggleBreakContinue) {
if(EmuApi.IsPaused()) {
DebugApi.ResumeExecution();
} else {
DebugApi.Step(1);
}
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
private void InitShortcuts()
{
mnuReset.InitShortcut(this, nameof(DebuggerShortcutsConfig.Reset));
@ -62,41 +76,113 @@ namespace Mesen.GUI.Debugger
mnuStepInto.InitShortcut(this, nameof(DebuggerShortcutsConfig.StepInto));
mnuStepOver.InitShortcut(this, nameof(DebuggerShortcutsConfig.StepOver));
mnuRunCpuCycle.InitShortcut(this, nameof(DebuggerShortcutsConfig.RunCpuCycle));
mnuRunPpuCycle.InitShortcut(this, nameof(DebuggerShortcutsConfig.RunPpuCycle));
mnuRunScanline.InitShortcut(this, nameof(DebuggerShortcutsConfig.RunPpuScanline));
mnuRunOneFrame.InitShortcut(this, nameof(DebuggerShortcutsConfig.RunPpuFrame));
mnuToggleBreakpoint.InitShortcut(this, nameof(DebuggerShortcutsConfig.CodeWindow_ToggleBreakpoint));
mnuEnableDisableBreakpoint.InitShortcut(this, nameof(DebuggerShortcutsConfig.CodeWindow_DisableEnableBreakpoint));
mnuReset.InitShortcut(this, nameof(DebuggerShortcutsConfig.Reset));
mnuPowerCycle.InitShortcut(this, nameof(DebuggerShortcutsConfig.PowerCycle));
mnuGoToAddress.InitShortcut(this, nameof(DebuggerShortcutsConfig.GoTo));
mnuGoToProgramCounter.InitShortcut(this, nameof(DebuggerShortcutsConfig.GoToProgramCounter));
mnuFind.InitShortcut(this, nameof(DebuggerShortcutsConfig.Find));
mnuFindNext.InitShortcut(this, nameof(DebuggerShortcutsConfig.FindNext));
mnuFindPrev.InitShortcut(this, nameof(DebuggerShortcutsConfig.FindPrev));
mnuStepInto.Click += (s, e) => { DebugApi.Step(1); };
mnuStepOver.Click += (s, e) => { DebugApi.Step(1, StepType.CpuStepOver); };
mnuStepOut.Click += (s, e) => { DebugApi.Step(1, StepType.CpuStepOut); };
mnuRun1000Instructions.Click += (s, e) => { DebugApi.Step(1000); };
mnuRunPpuCycle.Click += (s, e) => { DebugApi.Step(1, StepType.PpuStep); };
mnuRunScanline.Click += (s, e) => { DebugApi.Step(341, StepType.PpuStep); };
mnuRunOneFrame.Click += (s, e) => { DebugApi.Step(341*262, StepType.PpuStep); }; //TODO ntsc/pal
mnuContinue.Click += (s, e) => { DebugApi.ResumeExecution(); };
mnuBreak.Click += (s, e) => { DebugApi.Step(1); };
mnuReset.Click += (s, e) => { EmuApi.Reset(); };
mnuPowerCycle.Click += (s, e) => { EmuApi.PowerCycle(); };
mnuToggleBreakpoint.Click += (s, e) => { ctrlDisassemblyView.ToggleBreakpoint(); };
mnuEnableDisableBreakpoint.Click += (s, e) => { ctrlDisassemblyView.EnableDisableBreakpoint(); };
mnuGoToAddress.Click += (s, e) => { GoToAddress(); };
mnuGoToNmiHandler.Click += (s, e) => { GoToVector(CpuVector.Nmi); };
mnuGoToIrqHandler.Click += (s, e) => { GoToVector(CpuVector.Irq); };
mnuGoToResetHandler.Click += (s, e) => { GoToVector(CpuVector.Reset); };
mnuGoToBrkHandler.Click += (s, e) => { GoToVector(CpuVector.Brk); };
mnuGoToCopHandler.Click += (s, e) => { GoToVector(CpuVector.Cop); };
mnuGoToProgramCounter.Click += (s, e) => { ctrlDisassemblyView.GoToActiveAddress(); };
mnuFind.Click += (s, e) => { ctrlDisassemblyView.CodeViewer.OpenSearchBox(); };
mnuFindNext.Click += (s, e) => { ctrlDisassemblyView.CodeViewer.FindNext(); };
mnuFindPrev.Click += (s, e) => { ctrlDisassemblyView.CodeViewer.FindPrevious(); };
}
private void InitToolbar()
{
tsToolbar.AddItemsToToolbar(
mnuContinue, mnuBreak, null,
mnuStepInto, mnuStepOver, mnuStepOut, mnuStepBack, null,
mnuRunCpuCycle, null,
mnuStepInto, mnuStepOver, mnuStepOut, null,
mnuRunPpuCycle, mnuRunScanline, mnuRunOneFrame, null,
mnuToggleBreakpoint, mnuDisableEnableBreakpoint, null,
mnuToggleBreakpoint, mnuEnableDisableBreakpoint, null,
mnuBreakIn, null, mnuBreakOn
);
}
private void UpdateContinueAction()
{
bool paused = EmuApi.IsPaused();
mnuContinue.Enabled = paused;
mnuBreak.Enabled = !paused;
if(!paused) {
ctrlDisassemblyView.SetActiveAddress(null);
}
}
private void GoToAddress()
{
GoToAddress address = new GoToAddress();
using(frmGoToLine frm = new frmGoToLine(address, 6)) {
frm.StartPosition = FormStartPosition.CenterParent;
if(frm.ShowDialog(ctrlDisassemblyView) == DialogResult.OK) {
ctrlDisassemblyView.GoToAddress((int)address.Address);
}
}
}
private int GetVectorAddress(CpuVector vector)
{
uint address = (uint)vector;
byte lsb = DebugApi.GetMemoryValue(SnesMemoryType.CpuMemory, address);
byte msb = DebugApi.GetMemoryValue(SnesMemoryType.CpuMemory, address + 1);
return (msb << 8) | lsb;
}
private void GoToVector(CpuVector vector)
{
ctrlDisassemblyView.GoToAddress(GetVectorAddress(vector));
}
private void OnNotificationReceived(NotificationEventArgs e)
{
switch(e.NotificationType) {
case ConsoleNotificationType.PpuFrameDone:
this.BeginInvoke((MethodInvoker)(() => {
UpdateContinueAction();
}));
break;
case ConsoleNotificationType.CodeBreak:
DebugState state = DebugApi.GetState();
int activeAddress = (int)((state.Cpu.K << 16) | state.Cpu.PC);
this.BeginInvoke((MethodInvoker)(() => {
UpdateContinueAction();
ctrlStatus.UpdateStatus(state);
ctrlDisassemblyView.SetActiveAddress(activeAddress);
ctrlWatch.UpdateWatch(true);
@ -110,5 +196,35 @@ namespace Mesen.GUI.Debugger
{
ctrlDisassemblyView.ScrollToAddress(address);
}
private void mnuPreferences_Click(object sender, EventArgs e)
{
using(frmDbgPreferences frm = new frmDbgPreferences()) {
frm.ShowDialog(sender, this);
}
}
private void ctrlBreakpoints_BreakpointNavigation(Breakpoint bp)
{
ctrlDisassemblyView.GoToAddress(bp.GetRelativeAddress());
}
private void mnuGoTo_DropDownOpening(object sender, EventArgs e)
{
mnuGoToNmiHandler.Text = "NMI Handler ($" + GetVectorAddress(CpuVector.Nmi).ToString("X4") + ")";
mnuGoToIrqHandler.Text = "IRQ Handler ($" + GetVectorAddress(CpuVector.Irq).ToString("X4") + ")";
mnuGoToResetHandler.Text = "Reset Handler ($" + GetVectorAddress(CpuVector.Reset).ToString("X4") + ")";
mnuGoToBrkHandler.Text = "BRK Handler ($" + GetVectorAddress(CpuVector.Brk).ToString("X4") + ")";
mnuGoToCopHandler.Text = "COP Handler ($" + GetVectorAddress(CpuVector.Cop).ToString("X4") + ")";
}
}
public enum CpuVector
{
Reset = 0xFFFC,
Nmi = 0xFFEA,
Irq = 0xFFEE,
Brk = 0xFFE6,
Cop = 0xFFE4,
}
}

View file

@ -11,6 +11,7 @@ using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Serialization;
using Mesen.GUI.Config;
using Mesen.GUI.Debugger.Workspace;
using Mesen.GUI.Forms;
using Mesen.GUI.Utilities;
@ -46,7 +47,7 @@ namespace Mesen.GUI
Task.Run(() => {
//Cache deserializers in another thread
new XmlSerializer(typeof(Configuration));
//new XmlSerializer(typeof(DebugWorkspace));
new XmlSerializer(typeof(DebugWorkspace));
});
if(Type.GetType("Mono.Runtime") != null) {