Debugger: Added several configuration options for debugger break behavior

This commit is contained in:
Sour 2019-04-30 21:05:53 -04:00
parent 70e595ff37
commit 87fddaa751
15 changed files with 426 additions and 48 deletions

View file

@ -191,12 +191,10 @@ void Console::Reset()
//_cart->Reset();
//_controlManager->Reset();
_notificationManager->SendNotification(ConsoleNotificationType::GameReset);
_memoryManager->IncrementMasterClockValue<166>();
if(debugger) {
debugger->Step(1);
}
Unlock();
}
@ -258,11 +256,13 @@ bool Console::LoadRom(VirtualFile romFile, VirtualFile patchFile, bool stopRom)
_debugger->Release();
_debugger.reset();
GetDebugger();
_debugger->Step(1);
}
_ppu->PowerOn();
_cpu->PowerOn();
_notificationManager->SendNotification(ConsoleNotificationType::GameLoaded);
_memoryManager->IncrementMasterClockValue<166>();
_rewindManager.reset(new RewindManager(shared_from_this()));
@ -273,7 +273,6 @@ bool Console::LoadRom(VirtualFile romFile, VirtualFile patchFile, bool stopRom)
UpdateRegion();
_paused = false;
_notificationManager->SendNotification(ConsoleNotificationType::GameLoaded);
string modelName = _region == ConsoleRegion::Pal ? "PAL" : "NTSC";
string messageTitle = MessageManager::Localize("GameLoaded") + " (" + modelName + ")";

View file

@ -7,6 +7,7 @@
#include "Spc.h"
#include "BaseCartridge.h"
#include "MemoryManager.h"
#include "EmuSettings.h"
#include "SoundMixer.h"
#include "NotificationManager.h"
#include "CpuTypes.h"
@ -33,6 +34,7 @@ Debugger::Debugger(shared_ptr<Console> console)
_cpu = console->GetCpu();
_ppu = console->GetPpu();
_spc = console->GetSpc();
_settings = console->GetSettings();
_memoryManager = console->GetMemoryManager();
_watchExpEval[(int)CpuType::Cpu].reset(new ExpressionEvaluator(this, CpuType::Cpu));
@ -126,10 +128,20 @@ void Debugger::ProcessCpuRead(uint32_t addr, uint8_t value, MemoryOperationType
_cpuStepCount--;
}
/*if(value == 0x00 || value == 0xDB || value == 0x42) {
//Break on BRK/STP/WDM
_cpuStepCount = 0;
}*/
if(_settings->CheckDebuggerFlag(DebuggerFlags::CpuDebuggerEnabled)) {
if(value == 0x00 || value == 0x02 || value == 0x42 || value == 0xDB) {
//Break on BRK/STP/WDM/COP
if(value == 0x00 && _settings->CheckDebuggerFlag(DebuggerFlags::BreakOnBrk)) {
_cpuStepCount = 0;
} else if(value == 0x02 && _settings->CheckDebuggerFlag(DebuggerFlags::BreakOnCop)) {
_cpuStepCount = 0;
} else if(value == 0x42 && _settings->CheckDebuggerFlag(DebuggerFlags::BreakOnWdm)) {
_cpuStepCount = 0;
} else if(value == 0xDB && _settings->CheckDebuggerFlag(DebuggerFlags::BreakOnStp)) {
_cpuStepCount = 0;
}
}
}
} else if(type == MemoryOperationType::ExecOperand) {
if(addressInfo.Type == SnesMemoryType::PrgRom && addressInfo.Address >= 0) {
_codeDataLogger->SetFlags(addressInfo.Address, CdlFlags::Code | (state.PS & (CdlFlags::IndexMode8 | CdlFlags::MemoryMode8)));

View file

@ -10,6 +10,7 @@ class Ppu;
class Spc;
class BaseCartridge;
class MemoryManager;
class EmuSettings;
class TraceLogger;
class ExpressionEvaluator;
@ -35,6 +36,8 @@ private:
shared_ptr<Spc> _spc;
shared_ptr<MemoryManager> _memoryManager;
shared_ptr<BaseCartridge> _baseCartridge;
shared_ptr<EmuSettings> _settings;
shared_ptr<TraceLogger> _traceLogger;
shared_ptr<MemoryDumper> _memoryDumper;

View file

@ -7,6 +7,7 @@
EmuSettings::EmuSettings()
{
_flags = 0;
_debuggerFlags = 0;
_inputConfigVersion = 0;
}
@ -225,4 +226,22 @@ void EmuSettings::ClearFlag(EmulationFlags flag)
bool EmuSettings::CheckFlag(EmulationFlags flag)
{
return (_flags & (int)flag) != 0;
}
}
void EmuSettings::SetDebuggerFlag(DebuggerFlags flag, bool enabled)
{
if(enabled) {
if((_debuggerFlags & (int)flag) == 0) {
_debuggerFlags |= (int)flag;
}
} else {
if((_debuggerFlags & (int)flag) != 0) {
_debuggerFlags &= ~(int)flag;
}
}
}
bool EmuSettings::CheckDebuggerFlag(DebuggerFlags flag)
{
return (_debuggerFlags & (int)flag) != 0;
}

View file

@ -14,6 +14,8 @@ private:
atomic<uint32_t> _flags;
atomic<uint32_t> _inputConfigVersion;
atomic<uint32_t> _debuggerFlags;
string _audioDevice;
string _saveFolder;
string _saveStateFolder;
@ -60,4 +62,7 @@ public:
void SetFlagState(EmulationFlags flag, bool enabled);
void ClearFlag(EmulationFlags flag);
bool CheckFlag(EmulationFlags flag);
void SetDebuggerFlag(DebuggerFlags flag, bool enabled);
bool CheckDebuggerFlag(DebuggerFlags flags);
};

View file

@ -412,3 +412,21 @@ struct ShortcutKeyInfo
EmulatorShortcut Shortcut;
KeyCombination Keys;
};
enum class DebuggerFlags : uint32_t
{
BreakOnBrk = 0x01,
BreakOnCop = 0x02,
BreakOnWdm = 0x04,
BreakOnStp = 0x08,
BreakOnUninitRead = 0x10,
ShowVerifiedData = 0x100,
DisassembleVerifiedData = 0x200,
ShowUnidentifiedData = 0x400,
DisassembleUnidentifiedData = 0x800,
SpcDebuggerEnabled = 0x40000000,
CpuDebuggerEnabled = 0x80000000
};

View file

@ -45,4 +45,9 @@ extern "C" {
_returnString = _soundManager ? _soundManager->GetAvailableDevices() : "";
return _returnString.c_str();
}
DllExport void __stdcall SetDebuggerFlag(DebuggerFlags flag, bool enabled)
{
_console->GetSettings()->SetDebuggerFlag(flag, enabled);
}
}

View file

@ -68,6 +68,7 @@ namespace Mesen.GUI.Config
Input.ApplyConfig();
Emulation.ApplyConfig();
Preferences.ApplyConfig();
Debug.Debugger.ApplyConfig();
}
public void InitializeDefaults()

View file

@ -17,6 +17,18 @@ namespace Mesen.GUI.Config
public bool ShowByteCode = false;
public bool BreakOnBrk = false;
public bool BreakOnCop = false;
public bool BreakOnWdm = false;
public bool BreakOnStp = false;
public bool BreakOnUninitRead = false;
public bool BreakOnOpen = true;
public bool BreakOnPowerCycleReset = true;
public bool BringToFrontOnBreak = true;
public bool BringToFrontOnPause = false;
public int BreakOnValue = 0;
public int BreakInCount = 1;
public BreakInMetric BreakInMetric = BreakInMetric.CpuInstructions;
@ -46,6 +58,15 @@ namespace Mesen.GUI.Config
public XmlColor CodeWriteBreakpointColor = Color.FromArgb(40, 120, 80);
public XmlColor CodeReadBreakpointColor = Color.FromArgb(40, 40, 200);
public XmlColor CodeActiveStatementColor = Color.Yellow;
public void ApplyConfig()
{
ConfigApi.SetDebuggerFlag(DebuggerFlags.BreakOnBrk, BreakOnBrk);
ConfigApi.SetDebuggerFlag(DebuggerFlags.BreakOnCop, BreakOnCop);
ConfigApi.SetDebuggerFlag(DebuggerFlags.BreakOnWdm, BreakOnWdm);
ConfigApi.SetDebuggerFlag(DebuggerFlags.BreakOnStp, BreakOnStp);
ConfigApi.SetDebuggerFlag(DebuggerFlags.BreakOnUninitRead, BreakOnUninitRead);
}
}
public enum BreakInMetric

View file

@ -17,17 +17,11 @@ namespace Mesen.GUI.Debugger
{
return new List<Form>(_openedWindows);
}
public static Form OpenDebugWindow(DebugWindow window)
{
Form existingWindow = GetExistingSingleInstanceWindow(window);
if(existingWindow != null) {
existingWindow.BringToFront();
if(existingWindow.WindowState == FormWindowState.Minimized) {
//Unminimize window if it was minimized
existingWindow.WindowState = FormWindowState.Normal;
}
existingWindow.Focus();
BringToFront(existingWindow);
return existingWindow;
} else {
BaseForm frm = null;
@ -134,6 +128,16 @@ namespace Mesen.GUI.Debugger
_openedWindows.Remove((Form)sender);
CleanupDebugger();
}
public static void BringToFront(Form form)
{
form.BringToFront();
if(form.WindowState == FormWindowState.Minimized) {
//Unminimize window if it was minimized
form.WindowState = FormWindowState.Normal;
}
form.Focus();
}
}
public enum DebugWindow

View file

@ -55,7 +55,7 @@ namespace Mesen.GUI.Debugger
GetMember(nameof(DebuggerShortcutsConfig.OpenTilemapViewer)),
GetMember(nameof(DebuggerShortcutsConfig.OpenTileViewer)),
//GetMember(nameof(DebuggerShortcutsConfig.OpenSpriteViewer)),
GetMember(nameof(DebuggerShortcutsConfig.OpenSpriteViewer)),
GetMember(nameof(DebuggerShortcutsConfig.OpenPaletteViewer)),
};
@ -108,14 +108,14 @@ namespace Mesen.GUI.Debugger
//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_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.LabelList_ViewInCpuMemory)),
GetMember(nameof(DebuggerShortcutsConfig.LabelList_ViewInMemoryType)),
GetMember(nameof(DebuggerShortcutsConfig.BreakpointList_Add)),
GetMember(nameof(DebuggerShortcutsConfig.BreakpointList_Edit)),
GetMember(nameof(DebuggerShortcutsConfig.BreakpointList_GoToLocation)),

View file

@ -71,9 +71,31 @@
this.mnuGoToBrkHandler = new System.Windows.Forms.ToolStripMenuItem();
this.mnuGoToCopHandler = new System.Windows.Forms.ToolStripMenuItem();
this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mnuDisassemblyOptions = new System.Windows.Forms.ToolStripMenuItem();
this.mnuUnidentifiedData = new System.Windows.Forms.ToolStripMenuItem();
this.hideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.showDisassemblyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.showAsDataToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mnuVerifiedData = new System.Windows.Forms.ToolStripMenuItem();
this.hideToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.showDisassemblyToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.showAsDataToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripSeparator();
this.mnuShowByteCode = new System.Windows.Forms.ToolStripMenuItem();
this.mnuBreakOptions = new System.Windows.Forms.ToolStripMenuItem();
this.mnuBreakOnPowerCycleReset = new System.Windows.Forms.ToolStripMenuItem();
this.mnuBreakOnOpen = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem12 = new System.Windows.Forms.ToolStripSeparator();
this.mnuBreakOnBrk = new System.Windows.Forms.ToolStripMenuItem();
this.mnuBreakOnCop = new System.Windows.Forms.ToolStripMenuItem();
this.mnuBreakOnWdm = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem11 = new System.Windows.Forms.ToolStripSeparator();
this.mnuBreakOnUnitRead = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem10 = new System.Windows.Forms.ToolStripSeparator();
this.mnuBringToFrontOnBreak = new System.Windows.Forms.ToolStripMenuItem();
this.mnuBringToFrontOnPause = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripSeparator();
this.fontSizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mnuFontOptions = new System.Windows.Forms.ToolStripMenuItem();
this.mnuIncreaseFontSize = new System.Windows.Forms.ToolStripMenuItem();
this.mnuDecreaseFontSize = new System.Windows.Forms.ToolStripMenuItem();
this.mnuResetFontSize = new System.Windows.Forms.ToolStripMenuItem();
@ -83,6 +105,7 @@
this.mnuPreferences = new System.Windows.Forms.ToolStripMenuItem();
this.ctrlSplitContainer = new Mesen.GUI.Controls.ctrlSplitContainer();
this.panel1 = new System.Windows.Forms.Panel();
this.ctrlLabelList = new Mesen.GUI.Debugger.Controls.ctrlLabelList();
this.ctrlPpuStatus = new Mesen.GUI.Debugger.Controls.ctrlPpuStatus();
this.ctrlSpcStatus = new Mesen.GUI.Debugger.Controls.ctrlSpcStatus();
this.ctrlCpuStatus = new Mesen.GUI.Debugger.Controls.ctrlCpuStatus();
@ -95,7 +118,7 @@
this.grpCallstack = new System.Windows.Forms.GroupBox();
this.ctrlCallstack = new Mesen.GUI.Debugger.Controls.ctrlCallstack();
this.tsToolbar = new Mesen.GUI.Controls.ctrlMesenToolStrip();
this.ctrlLabelList = new Mesen.GUI.Debugger.Controls.ctrlLabelList();
this.mnuBreakOnStp = new System.Windows.Forms.ToolStripMenuItem();
this.ctrlMesenMenuStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.ctrlSplitContainer)).BeginInit();
this.ctrlSplitContainer.Panel1.SuspendLayout();
@ -406,39 +429,203 @@
// optionsToolStripMenuItem
//
this.optionsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuShowByteCode,
this.mnuDisassemblyOptions,
this.mnuBreakOptions,
this.toolStripMenuItem5,
this.fontSizeToolStripMenuItem,
this.mnuFontOptions,
this.toolStripMenuItem4,
this.mnuPreferences});
this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem";
this.optionsToolStripMenuItem.Size = new System.Drawing.Size(61, 20);
this.optionsToolStripMenuItem.Text = "Options";
//
// mnuDisassemblyOptions
//
this.mnuDisassemblyOptions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuUnidentifiedData,
this.mnuVerifiedData,
this.toolStripMenuItem6,
this.mnuShowByteCode});
this.mnuDisassemblyOptions.Name = "mnuDisassemblyOptions";
this.mnuDisassemblyOptions.Size = new System.Drawing.Size(209, 22);
this.mnuDisassemblyOptions.Text = "Disassembly Options";
//
// mnuUnidentifiedData
//
this.mnuUnidentifiedData.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.hideToolStripMenuItem,
this.showDisassemblyToolStripMenuItem,
this.showAsDataToolStripMenuItem});
this.mnuUnidentifiedData.Image = global::Mesen.GUI.Properties.Resources.UnidentifiedData;
this.mnuUnidentifiedData.Name = "mnuUnidentifiedData";
this.mnuUnidentifiedData.Size = new System.Drawing.Size(166, 22);
this.mnuUnidentifiedData.Text = "Unidentified Data";
this.mnuUnidentifiedData.Visible = false;
//
// hideToolStripMenuItem
//
this.hideToolStripMenuItem.Name = "hideToolStripMenuItem";
this.hideToolStripMenuItem.Size = new System.Drawing.Size(170, 22);
this.hideToolStripMenuItem.Text = "Hide";
//
// showDisassemblyToolStripMenuItem
//
this.showDisassemblyToolStripMenuItem.Name = "showDisassemblyToolStripMenuItem";
this.showDisassemblyToolStripMenuItem.Size = new System.Drawing.Size(170, 22);
this.showDisassemblyToolStripMenuItem.Text = "Show disassembly";
//
// showAsDataToolStripMenuItem
//
this.showAsDataToolStripMenuItem.Name = "showAsDataToolStripMenuItem";
this.showAsDataToolStripMenuItem.Size = new System.Drawing.Size(170, 22);
this.showAsDataToolStripMenuItem.Text = "Show as data";
//
// mnuVerifiedData
//
this.mnuVerifiedData.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.hideToolStripMenuItem1,
this.showDisassemblyToolStripMenuItem1,
this.showAsDataToolStripMenuItem1});
this.mnuVerifiedData.Image = global::Mesen.GUI.Properties.Resources.VerifiedData;
this.mnuVerifiedData.Name = "mnuVerifiedData";
this.mnuVerifiedData.Size = new System.Drawing.Size(166, 22);
this.mnuVerifiedData.Text = "Verified Data";
this.mnuVerifiedData.Visible = false;
//
// hideToolStripMenuItem1
//
this.hideToolStripMenuItem1.Name = "hideToolStripMenuItem1";
this.hideToolStripMenuItem1.Size = new System.Drawing.Size(170, 22);
this.hideToolStripMenuItem1.Text = "Hide";
//
// showDisassemblyToolStripMenuItem1
//
this.showDisassemblyToolStripMenuItem1.Name = "showDisassemblyToolStripMenuItem1";
this.showDisassemblyToolStripMenuItem1.Size = new System.Drawing.Size(170, 22);
this.showDisassemblyToolStripMenuItem1.Text = "Show disassembly";
//
// showAsDataToolStripMenuItem1
//
this.showAsDataToolStripMenuItem1.Name = "showAsDataToolStripMenuItem1";
this.showAsDataToolStripMenuItem1.Size = new System.Drawing.Size(170, 22);
this.showAsDataToolStripMenuItem1.Text = "Show as data";
//
// toolStripMenuItem6
//
this.toolStripMenuItem6.Name = "toolStripMenuItem6";
this.toolStripMenuItem6.Size = new System.Drawing.Size(163, 6);
this.toolStripMenuItem6.Visible = false;
//
// mnuShowByteCode
//
this.mnuShowByteCode.CheckOnClick = true;
this.mnuShowByteCode.Name = "mnuShowByteCode";
this.mnuShowByteCode.Size = new System.Drawing.Size(209, 22);
this.mnuShowByteCode.Size = new System.Drawing.Size(166, 22);
this.mnuShowByteCode.Text = "Show byte code";
//
// mnuBreakOptions
//
this.mnuBreakOptions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuBreakOnPowerCycleReset,
this.mnuBreakOnOpen,
this.toolStripMenuItem12,
this.mnuBreakOnBrk,
this.mnuBreakOnCop,
this.mnuBreakOnStp,
this.mnuBreakOnWdm,
this.toolStripMenuItem11,
this.mnuBreakOnUnitRead,
this.toolStripMenuItem10,
this.mnuBringToFrontOnBreak,
this.mnuBringToFrontOnPause});
this.mnuBreakOptions.Name = "mnuBreakOptions";
this.mnuBreakOptions.Size = new System.Drawing.Size(209, 22);
this.mnuBreakOptions.Text = "Break Options";
this.mnuBreakOptions.DropDownOpening += new System.EventHandler(this.mnuBreakOptions_DropDownOpening);
//
// mnuBreakOnPowerCycleReset
//
this.mnuBreakOnPowerCycleReset.Name = "mnuBreakOnPowerCycleReset";
this.mnuBreakOnPowerCycleReset.Size = new System.Drawing.Size(261, 22);
this.mnuBreakOnPowerCycleReset.Text = "Break on power/reset";
//
// mnuBreakOnOpen
//
this.mnuBreakOnOpen.Name = "mnuBreakOnOpen";
this.mnuBreakOnOpen.Size = new System.Drawing.Size(261, 22);
this.mnuBreakOnOpen.Text = "Break when debugger is opened";
//
// toolStripMenuItem12
//
this.toolStripMenuItem12.Name = "toolStripMenuItem12";
this.toolStripMenuItem12.Size = new System.Drawing.Size(258, 6);
//
// mnuBreakOnBrk
//
this.mnuBreakOnBrk.Name = "mnuBreakOnBrk";
this.mnuBreakOnBrk.Size = new System.Drawing.Size(261, 22);
this.mnuBreakOnBrk.Text = "Break on BRK";
//
// mnuBreakOnCop
//
this.mnuBreakOnCop.Name = "mnuBreakOnCop";
this.mnuBreakOnCop.Size = new System.Drawing.Size(261, 22);
this.mnuBreakOnCop.Text = "Break on COP";
//
// mnuBreakOnWdm
//
this.mnuBreakOnWdm.Name = "mnuBreakOnWdm";
this.mnuBreakOnWdm.Size = new System.Drawing.Size(261, 22);
this.mnuBreakOnWdm.Text = "Break on WDM";
//
// toolStripMenuItem11
//
this.toolStripMenuItem11.Name = "toolStripMenuItem11";
this.toolStripMenuItem11.Size = new System.Drawing.Size(258, 6);
this.toolStripMenuItem11.Visible = false;
//
// mnuBreakOnUnitRead
//
this.mnuBreakOnUnitRead.Name = "mnuBreakOnUnitRead";
this.mnuBreakOnUnitRead.Size = new System.Drawing.Size(261, 22);
this.mnuBreakOnUnitRead.Text = "Break on uninitialized memory read";
this.mnuBreakOnUnitRead.Visible = false;
//
// toolStripMenuItem10
//
this.toolStripMenuItem10.Name = "toolStripMenuItem10";
this.toolStripMenuItem10.Size = new System.Drawing.Size(258, 6);
//
// mnuBringToFrontOnBreak
//
this.mnuBringToFrontOnBreak.Name = "mnuBringToFrontOnBreak";
this.mnuBringToFrontOnBreak.Size = new System.Drawing.Size(261, 22);
this.mnuBringToFrontOnBreak.Text = "Bring debugger to front on break";
//
// mnuBringToFrontOnPause
//
this.mnuBringToFrontOnPause.Name = "mnuBringToFrontOnPause";
this.mnuBringToFrontOnPause.Size = new System.Drawing.Size(261, 22);
this.mnuBringToFrontOnPause.Text = "Bring debugger to front on pause";
this.mnuBringToFrontOnPause.Visible = false;
//
// toolStripMenuItem5
//
this.toolStripMenuItem5.Name = "toolStripMenuItem5";
this.toolStripMenuItem5.Size = new System.Drawing.Size(206, 6);
//
// fontSizeToolStripMenuItem
// mnuFontOptions
//
this.fontSizeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuFontOptions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuIncreaseFontSize,
this.mnuDecreaseFontSize,
this.mnuResetFontSize,
this.toolStripMenuItem21,
this.mnuSelectFont});
this.fontSizeToolStripMenuItem.Image = global::Mesen.GUI.Properties.Resources.Font;
this.fontSizeToolStripMenuItem.Name = "fontSizeToolStripMenuItem";
this.fontSizeToolStripMenuItem.Size = new System.Drawing.Size(209, 22);
this.fontSizeToolStripMenuItem.Text = "Font Options";
this.mnuFontOptions.Image = global::Mesen.GUI.Properties.Resources.Font;
this.mnuFontOptions.Name = "mnuFontOptions";
this.mnuFontOptions.Size = new System.Drawing.Size(209, 22);
this.mnuFontOptions.Text = "Font Options";
//
// mnuIncreaseFontSize
//
@ -518,6 +705,15 @@
this.panel1.Size = new System.Drawing.Size(348, 421);
this.panel1.TabIndex = 2;
//
// ctrlLabelList
//
this.ctrlLabelList.CpuType = Mesen.GUI.CpuType.Cpu;
this.ctrlLabelList.Dock = System.Windows.Forms.DockStyle.Fill;
this.ctrlLabelList.Location = new System.Drawing.Point(0, 315);
this.ctrlLabelList.Name = "ctrlLabelList";
this.ctrlLabelList.Size = new System.Drawing.Size(348, 106);
this.ctrlLabelList.TabIndex = 4;
//
// ctrlPpuStatus
//
this.ctrlPpuStatus.Dock = System.Windows.Forms.DockStyle.Top;
@ -641,13 +837,11 @@
this.tsToolbar.TabIndex = 3;
this.tsToolbar.Text = "ctrlMesenToolStrip1";
//
// ctrlLabelList
// mnuBreakOnStp
//
this.ctrlLabelList.Dock = System.Windows.Forms.DockStyle.Fill;
this.ctrlLabelList.Location = new System.Drawing.Point(0, 315);
this.ctrlLabelList.Name = "ctrlLabelList";
this.ctrlLabelList.Size = new System.Drawing.Size(348, 106);
this.ctrlLabelList.TabIndex = 4;
this.mnuBreakOnStp.Name = "mnuBreakOnStp";
this.mnuBreakOnStp.Size = new System.Drawing.Size(261, 22);
this.mnuBreakOnStp.Text = "Break on STP";
//
// frmDebugger
//
@ -730,18 +924,41 @@
private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem mnuPreferences;
private System.Windows.Forms.PictureBox picWatchHelp;
private System.Windows.Forms.ToolStripMenuItem fontSizeToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem mnuFontOptions;
private System.Windows.Forms.ToolStripMenuItem mnuIncreaseFontSize;
private System.Windows.Forms.ToolStripMenuItem mnuDecreaseFontSize;
private System.Windows.Forms.ToolStripMenuItem mnuResetFontSize;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem21;
private System.Windows.Forms.ToolStripMenuItem mnuSelectFont;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem4;
private System.Windows.Forms.ToolStripMenuItem mnuShowByteCode;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem5;
private System.Windows.Forms.Panel panel1;
private Controls.ctrlPpuStatus ctrlPpuStatus;
private Controls.ctrlSpcStatus ctrlSpcStatus;
private Controls.ctrlLabelList ctrlLabelList;
private System.Windows.Forms.ToolStripMenuItem mnuDisassemblyOptions;
private System.Windows.Forms.ToolStripMenuItem mnuUnidentifiedData;
private System.Windows.Forms.ToolStripMenuItem hideToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem showDisassemblyToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem showAsDataToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem mnuVerifiedData;
private System.Windows.Forms.ToolStripMenuItem hideToolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem showDisassemblyToolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem showAsDataToolStripMenuItem1;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem6;
private System.Windows.Forms.ToolStripMenuItem mnuShowByteCode;
private System.Windows.Forms.ToolStripMenuItem mnuBreakOptions;
private System.Windows.Forms.ToolStripMenuItem mnuBreakOnBrk;
private System.Windows.Forms.ToolStripMenuItem mnuBreakOnCop;
private System.Windows.Forms.ToolStripMenuItem mnuBreakOnWdm;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem11;
private System.Windows.Forms.ToolStripMenuItem mnuBreakOnUnitRead;
private System.Windows.Forms.ToolStripMenuItem mnuBreakOnOpen;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem10;
private System.Windows.Forms.ToolStripMenuItem mnuBringToFrontOnBreak;
private System.Windows.Forms.ToolStripMenuItem mnuBringToFrontOnPause;
private System.Windows.Forms.ToolStripMenuItem mnuBreakOnPowerCycleReset;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem12;
private System.Windows.Forms.ToolStripMenuItem mnuBreakOnStp;
}
}

View file

@ -19,6 +19,7 @@ namespace Mesen.GUI.Debugger
private EntityBinder _entityBinder = new EntityBinder();
private NotificationListener _notifListener;
private CpuType _cpuType;
private bool _firstBreak = true;
public CpuType CpuType { get { return _cpuType; } }
@ -56,7 +57,8 @@ namespace Mesen.GUI.Debugger
LoadConfig();
toolTip.SetToolTip(picWatchHelp, ctrlWatch.GetTooltipText());
ConfigApi.SetDebuggerFlag(_cpuType == CpuType.Cpu ? DebuggerFlags.CpuDebuggerEnabled : DebuggerFlags.SpcDebuggerEnabled, true);
BreakpointManager.AddCpuType(_cpuType);
DebugApi.Step(10000, StepType.CpuStep);
}
@ -65,12 +67,14 @@ namespace Mesen.GUI.Debugger
{
base.OnClosing(e);
DebuggerInfo cfg = ConfigManager.Config.Debug.Debugger;
cfg.WindowSize = this.WindowState != FormWindowState.Normal ? this.RestoreBounds.Size : this.Size;
cfg.WindowLocation = this.WindowState != FormWindowState.Normal ? this.RestoreBounds.Location : this.Location;
_entityBinder.UpdateObject();
ConfigManager.ApplyChanges();
ConfigApi.SetDebuggerFlag(_cpuType == CpuType.Cpu ? DebuggerFlags.CpuDebuggerEnabled : DebuggerFlags.SpcDebuggerEnabled, false);
BreakpointManager.RemoveCpuType(_cpuType);
if(this._notifListener != null) {
@ -165,6 +169,37 @@ namespace Mesen.GUI.Debugger
mnuIncreaseFontSize.Click += (s, e) => { ctrlDisassemblyView.CodeViewer.TextZoom += 10; };
mnuDecreaseFontSize.Click += (s, e) => { ctrlDisassemblyView.CodeViewer.TextZoom -= 10; };
mnuResetFontSize.Click += (s, e) => { ctrlDisassemblyView.CodeViewer.TextZoom = 100; };
mnuBreakOnBrk.Click += (s, e) => { InvertFlag(ref ConfigManager.Config.Debug.Debugger.BreakOnBrk); };
mnuBreakOnCop.Click += (s, e) => { InvertFlag(ref ConfigManager.Config.Debug.Debugger.BreakOnCop); };
mnuBreakOnStp.Click += (s, e) => { InvertFlag(ref ConfigManager.Config.Debug.Debugger.BreakOnStp); };
mnuBreakOnWdm.Click += (s, e) => { InvertFlag(ref ConfigManager.Config.Debug.Debugger.BreakOnWdm); };
mnuBreakOnOpen.Click += (s, e) => { InvertFlag(ref ConfigManager.Config.Debug.Debugger.BreakOnOpen); };
mnuBreakOnPowerCycleReset.Click += (s, e) => { InvertFlag(ref ConfigManager.Config.Debug.Debugger.BreakOnPowerCycleReset); };
mnuBreakOnUnitRead.Click += (s, e) => { InvertFlag(ref ConfigManager.Config.Debug.Debugger.BreakOnUninitRead); };
mnuBringToFrontOnBreak.Click += (s, e) => { InvertFlag(ref ConfigManager.Config.Debug.Debugger.BringToFrontOnBreak); };
mnuBringToFrontOnPause.Click += (s, e) => { InvertFlag(ref ConfigManager.Config.Debug.Debugger.BringToFrontOnPause); };
}
private void InvertFlag(ref bool flag)
{
flag = !flag;
ConfigManager.ApplyChanges();
ConfigManager.Config.Debug.Debugger.ApplyConfig();
}
private void mnuBreakOptions_DropDownOpening(object sender, EventArgs e)
{
DebuggerInfo cfg = ConfigManager.Config.Debug.Debugger;
mnuBreakOnBrk.Checked = cfg.BreakOnBrk;
mnuBreakOnCop.Checked = cfg.BreakOnCop;
mnuBreakOnStp.Checked = cfg.BreakOnStp;
mnuBreakOnWdm.Checked = cfg.BreakOnWdm;
mnuBreakOnOpen.Checked = cfg.BreakOnOpen;
mnuBreakOnPowerCycleReset.Checked = cfg.BreakOnPowerCycleReset;
mnuBreakOnUnitRead.Checked = cfg.BreakOnUninitRead;
mnuBringToFrontOnBreak.Checked = cfg.BringToFrontOnBreak;
mnuBringToFrontOnPause.Checked = cfg.BringToFrontOnPause;
}
private void InitToolbar()
@ -264,6 +299,10 @@ namespace Mesen.GUI.Debugger
{
switch(e.NotificationType) {
case ConsoleNotificationType.GameLoaded: {
if(ConfigManager.Config.Debug.Debugger.BreakOnPowerCycleReset) {
DebugApi.Step(1, StepType.PpuStep);
}
DebugState state = DebugApi.GetState();
this.BeginInvoke((MethodInvoker)(() => {
DebugWorkspaceManager.ImportDbgFile();
@ -274,6 +313,12 @@ namespace Mesen.GUI.Debugger
break;
}
case ConsoleNotificationType.GameReset:
if(ConfigManager.Config.Debug.Debugger.BreakOnPowerCycleReset) {
DebugApi.Step(1, StepType.PpuStep);
}
break;
case ConsoleNotificationType.PpuFrameDone:
this.BeginInvoke((MethodInvoker)(() => {
UpdateContinueAction();
@ -285,8 +330,17 @@ namespace Mesen.GUI.Debugger
int activeAddress = _cpuType == CpuType.Cpu ? (int)((state.Cpu.K << 16) | state.Cpu.PC) : (int)state.Spc.PC;
this.BeginInvoke((MethodInvoker)(() => {
if(ConfigManager.Config.Debug.Debugger.BringToFrontOnBreak) {
DebugWindowManager.BringToFront(this);
}
UpdateContinueAction();
UpdateDebugger(state, activeAddress);
if(_firstBreak && !ConfigManager.Config.Debug.Debugger.BreakOnOpen) {
DebugApi.ResumeExecution();
}
_firstBreak = false;
}));
break;
}

View file

@ -121,9 +121,9 @@
<value>17, 17</value>
</metadata>
<metadata name="ctrlMesenMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 56</value>
<value>107, 17</value>
</metadata>
<metadata name="tsToolbar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 95</value>
<value>275, 17</value>
</metadata>
</root>

View file

@ -25,10 +25,30 @@ namespace Mesen.GUI
[DllImport(DllPath)] public static extern void SetPreferences(InteropPreferencesConfig config);
[DllImport(DllPath)] public static extern void SetShortcutKeys([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]ShortcutKeyInfo[] shortcuts, UInt32 count);
[DllImport(DllPath)] public static extern void SetDebuggerFlag(DebuggerFlags flag, bool enabled);
[DllImport(DllPath, EntryPoint = "GetAudioDevices")] private static extern IntPtr GetAudioDevicesWrapper();
public static List<string> GetAudioDevices()
{
return new List<string>(Utf8Marshaler.PtrToStringUtf8(ConfigApi.GetAudioDevicesWrapper()).Split(new string[1] { "||" }, StringSplitOptions.RemoveEmptyEntries));
}
}
public enum DebuggerFlags : UInt32
{
BreakOnBrk = 0x01,
BreakOnCop = 0x02,
BreakOnWdm = 0x04,
BreakOnStp = 0x08,
BreakOnUninitRead = 0x10,
ShowVerifiedData = 0x100,
DisassembleVerifiedData = 0x200,
ShowUnidentifiedData = 0x400,
DisassembleUnidentifiedData = 0x800,
SpcDebuggerEnabled = 0x40000000,
CpuDebuggerEnabled = 0x80000000
}
}