diff --git a/Core/Console.cpp b/Core/Console.cpp index 345b520..82a3973 100644 --- a/Core/Console.cpp +++ b/Core/Console.cpp @@ -171,12 +171,13 @@ void Console::Stop(bool sendNotification) void Console::Reset() { - Lock(); shared_ptr debugger = _debugger; if(debugger) { debugger->Run(); } + Lock(); + _dmaController->Reset(); _internalRegisters->Reset(); _memoryManager->Reset(); @@ -196,6 +197,11 @@ void Console::PowerCycle() { shared_ptr cart = _cart; if(cart) { + shared_ptr debugger = _debugger; + if(debugger) { + debugger->Run(); + } + RomInfo info = cart->GetRomInfo(); Lock(); LoadRom(info.RomFile, info.PatchFile, false); diff --git a/Core/Disassembler.cpp b/Core/Disassembler.cpp index 5c91d51..cbdf951 100644 --- a/Core/Disassembler.cpp +++ b/Core/Disassembler.cpp @@ -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; } diff --git a/Core/SystemActionManager.h b/Core/SystemActionManager.h index f5a66ed..fab3b39 100644 --- a/Core/SystemActionManager.h +++ b/Core/SystemActionManager.h @@ -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 = _console->GetDebugger(false); + if(debugger) { + debugger->Run(); + } + _needReset = true; return true; } @@ -55,6 +61,11 @@ public: bool PowerCycle() { if(!_needPowerCycle) { + shared_ptr debugger = _console->GetDebugger(false); + if(debugger) { + debugger->Run(); + } + _needPowerCycle = true; return true; } diff --git a/UI/Debugger/Breakpoints/ctrlBreakpoints.cs b/UI/Debugger/Breakpoints/ctrlBreakpoints.cs index 05bd65e..08fa17d 100644 --- a/UI/Debugger/Breakpoints/ctrlBreakpoints.cs +++ b/UI/Debugger/Breakpoints/ctrlBreakpoints.cs @@ -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); } } } diff --git a/UI/Debugger/Breakpoints/ctrlBreakpoints.designer.cs b/UI/Debugger/Breakpoints/ctrlBreakpoints.designer.cs index 9981846..7088744 100644 --- a/UI/Debugger/Breakpoints/ctrlBreakpoints.designer.cs +++ b/UI/Debugger/Breakpoints/ctrlBreakpoints.designer.cs @@ -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 // diff --git a/UI/Debugger/Code/CpuDisassemblyManager.cs b/UI/Debugger/Code/CpuDisassemblyManager.cs index fe63336..5610f3f 100644 --- a/UI/Debugger/Code/CpuDisassemblyManager.cs +++ b/UI/Debugger/Code/CpuDisassemblyManager.cs @@ -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 + }); + } + } } } diff --git a/UI/Debugger/Code/IDisassemblyManager.cs b/UI/Debugger/Code/IDisassemblyManager.cs index 1619831..c279fd8 100644 --- a/UI/Debugger/Code/IDisassemblyManager.cs +++ b/UI/Debugger/Code/IDisassemblyManager.cs @@ -13,5 +13,6 @@ namespace Mesen.GUI.Debugger.Code void RefreshCode(); void ToggleBreakpoint(int lineIndex); + void EnableDisableBreakpoint(int lineIndex); } } diff --git a/UI/Debugger/Controls/ctrlDisassemblyView.cs b/UI/Debugger/Controls/ctrlDisassemblyView.cs index 61a6c57..fa7dbd9 100644 --- a/UI/Debugger/Controls/ctrlDisassemblyView.cs +++ b/UI/Debugger/Controls/ctrlDisassemblyView.cs @@ -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) { diff --git a/UI/Debugger/PpuViewer/frmPaletteViewer.cs b/UI/Debugger/PpuViewer/frmPaletteViewer.cs index d0e2245..5c40a53 100644 --- a/UI/Debugger/PpuViewer/frmPaletteViewer.cs +++ b/UI/Debugger/PpuViewer/frmPaletteViewer.cs @@ -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; } } diff --git a/UI/Debugger/PpuViewer/frmTileViewer.cs b/UI/Debugger/PpuViewer/frmTileViewer.cs index 2b3e7a0..2602d18 100644 --- a/UI/Debugger/PpuViewer/frmTileViewer.cs +++ b/UI/Debugger/PpuViewer/frmTileViewer.cs @@ -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; } } diff --git a/UI/Debugger/PpuViewer/frmTilemapViewer.cs b/UI/Debugger/PpuViewer/frmTilemapViewer.cs index 75a07c3..3b1931a 100644 --- a/UI/Debugger/PpuViewer/frmTilemapViewer.cs +++ b/UI/Debugger/PpuViewer/frmTilemapViewer.cs @@ -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; } } diff --git a/UI/Debugger/frmDbgPreferences.cs b/UI/Debugger/frmDbgPreferences.cs index 3928ee2..dc09184 100644 --- a/UI/Debugger/frmDbgPreferences.cs +++ b/UI/Debugger/frmDbgPreferences.cs @@ -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)) }; } diff --git a/UI/Debugger/frmDebugger.Designer.cs b/UI/Debugger/frmDebugger.Designer.cs index 31f3da0..6581af4 100644 --- a/UI/Debugger/frmDebugger.Designer.cs +++ b/UI/Debugger/frmDebugger.Designer.cs @@ -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; } } \ No newline at end of file diff --git a/UI/Debugger/frmDebugger.cs b/UI/Debugger/frmDebugger.cs index c6e89b7..c5119c6 100644 --- a/UI/Debugger/frmDebugger.cs +++ b/UI/Debugger/frmDebugger.cs @@ -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, } } diff --git a/UI/Program.cs b/UI/Program.cs index 2678a8d..6cfe9af 100644 --- a/UI/Program.cs +++ b/UI/Program.cs @@ -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) {