diff --git a/Source/Project64-core/Debugger.h b/Source/Project64-core/Debugger.h
index 0a5e685a1..8064205ee 100644
--- a/Source/Project64-core/Debugger.h
+++ b/Source/Project64-core/Debugger.h
@@ -21,6 +21,7 @@ __interface CDebugger
virtual void OpenSymbolsWindow(void) = 0;
virtual void OpenDMALogWindow(void) = 0;
virtual void OpenCPULogWindow(void) = 0;
+ virtual void OpenExcBreakpointsWindow(void) = 0;
virtual void OpenStackTraceWindow(void) = 0;
virtual void OpenStackViewWindow(void) = 0;
virtual void TLBChanged(void) = 0;
@@ -38,4 +39,5 @@ __interface CDebugger
virtual void CPUStepStarted(void) = 0;
virtual void CPUStep(void) = 0;
+ virtual void CPUStepEnded(void) = 0;
};
diff --git a/Source/Project64-core/N64System/Interpreter/InterpreterCPU.cpp b/Source/Project64-core/N64System/Interpreter/InterpreterCPU.cpp
index 6a545af41..ea778bb0b 100644
--- a/Source/Project64-core/N64System/Interpreter/InterpreterCPU.cpp
+++ b/Source/Project64-core/N64System/Interpreter/InterpreterCPU.cpp
@@ -305,26 +305,22 @@ void CInterpreterCPU::ExecuteCPU()
g_Settings->SaveBool(Debugger_SteppingOps, true);
}
+ g_Debugger->CPUStepStarted(); // may set stepping ops/skip op
+
if (isStepping())
{
g_Debugger->WaitForStep();
}
- bool bSkip = SkipOp();
-
- if (!bSkip)
- {
- g_Debugger->CPUStepStarted();
- bSkip = SkipOp();
- }
-
- if (bSkip)
+ if (SkipOp())
{
// Skip command if instructed by the debugger
g_Settings->SaveBool(Debugger_SkipOp, false);
PROGRAM_COUNTER += 4;
continue;
}
+
+ g_Debugger->CPUStep();
}
/* if (PROGRAM_COUNTER > 0x80000300 && PROGRAM_COUNTER < 0x80380000)
@@ -338,7 +334,7 @@ void CInterpreterCPU::ExecuteCPU()
_GPR[0].DW = 0; /* MIPS $zero hard-wired to 0 */
NextTimer -= CountPerOp;
- if (CDebugSettings::HaveDebugger()) { g_Debugger->CPUStep(); }
+ if (CDebugSettings::HaveDebugger()) { g_Debugger->CPUStepEnded(); }
PROGRAM_COUNTER += 4;
switch (R4300iOp::m_NextInstruction)
diff --git a/Source/Project64-core/Settings.cpp b/Source/Project64-core/Settings.cpp
index cf60a46b0..ddd4ab3eb 100644
--- a/Source/Project64-core/Settings.cpp
+++ b/Source/Project64-core/Settings.cpp
@@ -341,6 +341,7 @@ void CSettings::AddHowToHandleSetting(const char * BaseDirectory)
AddHandler(Debugger_AutoRefreshMemoryView, new CSettingTypeApplication("Debugger", "Auto Refresh Memory View", true));
AddHandler(Debugger_CPULoggingEnabled, new CSettingTypeApplication("Debugger", "Enable CPU Logging", false));
AddHandler(Debugger_CPULogBufferSize, new CSettingTypeApplication("Debugger", "CPU Log Buffer Size", (uint32_t)1024));
+ AddHandler(Debugger_ExceptionBreakpoints, new CSettingTypeApplication("Debugger", "Exception Breakpoints", (uint32_t)0));
AddHandler(Debugger_DebugLanguage, new CSettingTypeApplication("Debugger", "Debug Language", false));
AddHandler(Debugger_ShowDivByZero, new CSettingTypeApplication("Debugger", "Show Div by zero", false));
AddHandler(Debugger_AppLogFlush, new CSettingTypeApplication("Logging", "Log Auto Flush", (uint32_t)false));
diff --git a/Source/Project64-core/Settings/DebugSettings.cpp b/Source/Project64-core/Settings/DebugSettings.cpp
index 74bd48812..824577dcc 100644
--- a/Source/Project64-core/Settings/DebugSettings.cpp
+++ b/Source/Project64-core/Settings/DebugSettings.cpp
@@ -29,6 +29,7 @@ bool CDebugSettings::m_HaveWriteBP = false;
bool CDebugSettings::m_HaveReadBP = false;
bool CDebugSettings::m_bShowPifRamErrors = false;
bool CDebugSettings::m_bCPULoggingEnabled = false;
+uint32_t CDebugSettings::m_ExceptionBreakpoints = 0;
CDebugSettings::CDebugSettings()
{
@@ -49,6 +50,7 @@ CDebugSettings::CDebugSettings()
g_Settings->RegisterChangeCB(Debugger_WaitingForStep, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
g_Settings->RegisterChangeCB(Debugger_ShowPifErrors, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
g_Settings->RegisterChangeCB(Debugger_CPULoggingEnabled, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
+ g_Settings->RegisterChangeCB(Debugger_ExceptionBreakpoints, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
RefreshSettings();
}
@@ -71,6 +73,7 @@ CDebugSettings::~CDebugSettings()
g_Settings->UnregisterChangeCB(Debugger_WaitingForStep, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
g_Settings->UnregisterChangeCB(Debugger_ShowPifErrors, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
g_Settings->UnregisterChangeCB(Debugger_CPULoggingEnabled, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
+ g_Settings->UnregisterChangeCB(Debugger_ExceptionBreakpoints, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
}
}
@@ -89,6 +92,7 @@ void CDebugSettings::RefreshSettings()
m_HaveReadBP = m_HaveDebugger && g_Settings->LoadBool(Debugger_ReadBPExists);
m_bShowPifRamErrors = m_HaveDebugger && g_Settings->LoadBool(Debugger_ShowPifErrors);
m_bCPULoggingEnabled = m_HaveDebugger && g_Settings->LoadBool(Debugger_CPULoggingEnabled);
+ m_ExceptionBreakpoints = m_HaveDebugger ? g_Settings->LoadDword(Debugger_ExceptionBreakpoints) : 0;
m_Debugging = m_HaveDebugger && (m_HaveExecutionBP || m_WaitingForStep || m_HaveWriteBP || m_HaveReadBP);
}
\ No newline at end of file
diff --git a/Source/Project64-core/Settings/DebugSettings.h b/Source/Project64-core/Settings/DebugSettings.h
index d5f8dc63a..dc925db35 100644
--- a/Source/Project64-core/Settings/DebugSettings.h
+++ b/Source/Project64-core/Settings/DebugSettings.h
@@ -32,6 +32,7 @@ public:
static inline bool HaveReadBP(void) { return m_HaveReadBP; }
static inline bool bShowPifRamErrors(void) { return m_bShowPifRamErrors; }
static inline bool bCPULoggingEnabled(void) { return m_bCPULoggingEnabled; }
+ static inline uint32_t ExceptionBreakpoints(void) { return m_ExceptionBreakpoints; }
private:
static void StaticRefreshSettings(CDebugSettings * _this)
@@ -55,6 +56,7 @@ private:
static bool m_HaveReadBP;
static bool m_bShowPifRamErrors;
static bool m_bCPULoggingEnabled;
+ static uint32_t m_ExceptionBreakpoints;
static int32_t m_RefCount;
static bool m_Registered;
diff --git a/Source/Project64-core/Settings/SettingsID.h b/Source/Project64-core/Settings/SettingsID.h
index 354f1409b..c5a7e1c8d 100644
--- a/Source/Project64-core/Settings/SettingsID.h
+++ b/Source/Project64-core/Settings/SettingsID.h
@@ -255,6 +255,7 @@ enum SettingID
Debugger_AutoRefreshMemoryView,
Debugger_CPULoggingEnabled,
Debugger_CPULogBufferSize,
+ Debugger_ExceptionBreakpoints,
//Trace
Debugger_TraceMD5,
diff --git a/Source/Project64/Project64.vcxproj b/Source/Project64/Project64.vcxproj
index baf3dedac..6467a7786 100644
--- a/Source/Project64/Project64.vcxproj
+++ b/Source/Project64/Project64.vcxproj
@@ -88,6 +88,7 @@
+
@@ -151,6 +152,7 @@
+
diff --git a/Source/Project64/Project64.vcxproj.filters b/Source/Project64/Project64.vcxproj.filters
index af0bab4a3..5ba6971d7 100644
--- a/Source/Project64/Project64.vcxproj.filters
+++ b/Source/Project64/Project64.vcxproj.filters
@@ -228,6 +228,9 @@
Source Files\User Interface Source\Debugger Source
+
+ Source Files\User Interface Source\Debugger Source
+
@@ -437,6 +440,9 @@
Header Files\User Interface Headers\Debugger Headers
+
+ Header Files\User Interface Headers\Debugger Headers
+
diff --git a/Source/Project64/Settings/UISettings.cpp b/Source/Project64/Settings/UISettings.cpp
index 5a798fba2..68c6e7eb4 100644
--- a/Source/Project64/Settings/UISettings.cpp
+++ b/Source/Project64/Settings/UISettings.cpp
@@ -77,6 +77,7 @@ void RegisterUISettings (void)
g_Settings->AddHandler((SettingID)(FirstUISettings + DebuggerUI_StackTracePos), new CSettingTypeApplication("Debugger UI", "Stack Trace Pos", Default_None));
g_Settings->AddHandler((SettingID)(FirstUISettings + DebuggerUI_SymbolsPos), new CSettingTypeApplication("Debugger UI", "Symbols Pos", Default_None));
g_Settings->AddHandler((SettingID)(FirstUISettings + DebuggerUI_TLBPos), new CSettingTypeApplication("Debugger UI", "TLB Pos", Default_None));
+ g_Settings->AddHandler((SettingID)(FirstUISettings + DebuggerUI_ExceptionBPPos), new CSettingTypeApplication("Debugger UI", "Exception BP Pos", Default_None));
}
void UISettingsSaveBool(UISettingID Type, bool Value)
diff --git a/Source/Project64/Settings/UISettings.h b/Source/Project64/Settings/UISettings.h
index 2af177738..304757206 100644
--- a/Source/Project64/Settings/UISettings.h
+++ b/Source/Project64/Settings/UISettings.h
@@ -74,6 +74,7 @@ enum UISettingID
DebuggerUI_StackTracePos,
DebuggerUI_SymbolsPos,
DebuggerUI_TLBPos,
+ DebuggerUI_ExceptionBPPos
};
void RegisterUISettings (void);
diff --git a/Source/Project64/UserInterface/Debugger/Debugger-ExceptionBreakpoints.cpp b/Source/Project64/UserInterface/Debugger/Debugger-ExceptionBreakpoints.cpp
new file mode 100644
index 000000000..4ec0c39e6
--- /dev/null
+++ b/Source/Project64/UserInterface/Debugger/Debugger-ExceptionBreakpoints.cpp
@@ -0,0 +1,100 @@
+#include "stdafx.h"
+#include "DebuggerUI.h"
+
+CDebugExcBreakpoints::ExcCheckboxMeta CDebugExcBreakpoints::ExcCheckboxMap[] = {
+ { IDC_CHK_INT, 0 },
+ { IDC_CHK_MOD, 1 },
+ { IDC_CHK_RMISS, 2 },
+ { IDC_CHK_WMISS, 3 },
+ { IDC_CHK_RADE, 4 },
+ { IDC_CHK_WADE, 5 },
+ { IDC_CHK_IBE, 6 },
+ { IDC_CHK_DBE, 7 },
+ { IDC_CHK_SYSCALL, 8 },
+ { IDC_CHK_BREAK, 9 },
+ { IDC_CHK_II, 10 },
+ { IDC_CHK_CPU, 11 },
+ { IDC_CHK_OV, 12 },
+ { IDC_CHK_TRAP, 13 },
+ { IDC_CHK_VCEI, 14 },
+ { IDC_CHK_FPE, 15 },
+ { IDC_CHK_WATCH, 23 },
+ { IDC_CHK_VCED, 31 },
+ { 0, 0 }
+};
+
+CDebugExcBreakpoints::CDebugExcBreakpoints(CDebuggerUI* debugger) :
+ CDebugDialog(debugger)
+{
+}
+
+CDebugExcBreakpoints::~CDebugExcBreakpoints()
+{
+}
+
+LRESULT CDebugExcBreakpoints::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
+{
+ DlgSavePos_Init(DebuggerUI_ExceptionBPPos);
+
+ uint32_t excBreakpoints = g_Settings->LoadDword(Debugger_ExceptionBreakpoints);
+
+ for (int i = 0; ExcCheckboxMap[i].ctrlId != 0; i++)
+ {
+ uint32_t excBit = (1 << ExcCheckboxMap[i].exc);
+
+ if (excBreakpoints & excBit)
+ {
+ SendDlgItemMessage(ExcCheckboxMap[i].ctrlId, BM_SETCHECK, BST_CHECKED, 0);
+ }
+ }
+
+ LoadWindowPos();
+ WindowCreated();
+ return TRUE;
+}
+
+LRESULT CDebugExcBreakpoints::OnDestroy(void)
+{
+ return 0;
+}
+
+
+LRESULT CDebugExcBreakpoints::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND, BOOL& /*bHandled*/)
+{
+ switch (wID)
+ {
+ case IDOK:
+ case IDCANCEL:
+ EndDialog(0);
+ return FALSE;
+ }
+
+ for (int i = 0; ExcCheckboxMap[i].ctrlId != 0; i++)
+ {
+ if (ExcCheckboxMap[i].ctrlId == wID)
+ {
+ uint32_t excBit = (1 << ExcCheckboxMap[i].exc);
+ bool bChecked = (SendMessage(GetDlgItem(wID), BM_GETSTATE, 0, 0) & BST_CHECKED) != 0;
+ uint32_t excBreakpoints = g_Settings->LoadDword(Debugger_ExceptionBreakpoints);
+
+ if (bChecked)
+ {
+ excBreakpoints |= excBit;
+ }
+ else
+ {
+ excBreakpoints &= ~excBit;
+ }
+
+ g_Settings->SaveDword(Debugger_ExceptionBreakpoints, excBreakpoints);
+ break;
+ }
+ }
+
+ return FALSE;
+}
+
+void CDebugExcBreakpoints::OnExitSizeMove(void)
+{
+ SaveWindowPos();
+}
diff --git a/Source/Project64/UserInterface/Debugger/Debugger-ExceptionBreakpoints.h b/Source/Project64/UserInterface/Debugger/Debugger-ExceptionBreakpoints.h
new file mode 100644
index 000000000..e8fc387cd
--- /dev/null
+++ b/Source/Project64/UserInterface/Debugger/Debugger-ExceptionBreakpoints.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include
+#include "DebuggerUI.h"
+
+
+class CDebugExcBreakpoints :
+ public CDebugDialog
+{
+ typedef struct
+ {
+ WORD ctrlId;
+ int exc;
+ } ExcCheckboxMeta;
+
+public:
+ enum { IDD = IDD_Debugger_ExceptionBP };
+
+ CDebugExcBreakpoints(CDebuggerUI * debugger);
+ virtual ~CDebugExcBreakpoints(void);
+
+private:
+ static ExcCheckboxMeta ExcCheckboxMap[];
+
+ LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
+ LRESULT OnClicked(WORD wNotifyCode, WORD wID, HWND /*hWndCtl*/, BOOL& bHandled);
+
+ void OnExitSizeMove(void);
+ LRESULT OnDestroy(void);
+
+ BEGIN_MSG_MAP_EX(CDebugExcBreakpoints)
+ MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
+ COMMAND_CODE_HANDLER(BN_CLICKED, OnClicked)
+ MSG_WM_EXITSIZEMOVE(OnExitSizeMove)
+ MSG_WM_DESTROY(OnDestroy)
+ END_MSG_MAP()
+};
diff --git a/Source/Project64/UserInterface/Debugger/Debugger.cpp b/Source/Project64/UserInterface/Debugger/Debugger.cpp
index a1c0eec9e..9eb398de5 100644
--- a/Source/Project64/UserInterface/Debugger/Debugger.cpp
+++ b/Source/Project64/UserInterface/Debugger/Debugger.cpp
@@ -33,6 +33,7 @@ CDebuggerUI::CDebuggerUI() :
m_StackView(NULL),
m_DMALogView(NULL),
m_CPULogView(NULL),
+ m_ExcBreakpoints(NULL),
m_DMALog(NULL),
m_CPULog(NULL),
m_StepEvent(false)
@@ -65,6 +66,7 @@ CDebuggerUI::~CDebuggerUI(void)
delete m_StackTrace;
delete m_DMALogView;
delete m_CPULogView;
+ delete m_ExcBreakpoints;
delete m_DMALog;
delete m_CPULog;
@@ -179,6 +181,12 @@ void CDebuggerUI::Debug_Reset(void)
delete m_StackView;
m_StackView = NULL;
}
+ if (m_ExcBreakpoints)
+ {
+ m_ExcBreakpoints->HideWindow();
+ delete m_ExcBreakpoints;
+ m_ExcBreakpoints = NULL;
+ }
}
void CDebuggerUI::OpenMemoryDump()
@@ -344,6 +352,15 @@ void CDebuggerUI::OpenCPULogWindow(void)
m_CPULogView->ShowWindow();
}
+void CDebuggerUI::OpenExcBreakpointsWindow(void)
+{
+ if (m_ExcBreakpoints == NULL)
+ {
+ m_ExcBreakpoints = new CDebugExcBreakpoints(this);
+ }
+ m_ExcBreakpoints->ShowWindow();
+}
+
void CDebuggerUI::OpenStackTraceWindow(void)
{
if (m_StackTrace == NULL)
@@ -604,14 +621,13 @@ void CDebuggerUI::TLBChanged()
Debug_RefreshTLBWindow();
}
-// Exception handling - break on exception vector and show cpu log on certain errors
+
+// Exception handling - break on exception vector if exception bp is set
void CDebuggerUI::HandleCPUException(void)
{
- uint32_t pc = g_Reg->m_PROGRAM_COUNTER;
- int exc = g_Reg->CAUSE_REGISTER & 0x7C;
+ int exc = (g_Reg->CAUSE_REGISTER >> 2) & 0x1F;
- // ignore interrupt, syscall, coprocessor unusable, watch
- if (exc != EXC_INT && exc != EXC_SYSCALL && exc != EXC_CPU && exc != EXC_WATCH)
+ if ((CDebugSettings::ExceptionBreakpoints() & (1 << exc)))
{
if (CDebugSettings::bCPULoggingEnabled())
{
@@ -688,12 +704,19 @@ void CDebuggerUI::CPUStepStarted()
}
}
- if (pc == 0x80000000 || pc == 0x80000080 ||
- pc == 0xA0000100 || pc == 0x80000180)
+ if (CDebugSettings::ExceptionBreakpoints() != 0)
{
- HandleCPUException();
+ if (pc == 0x80000000 || pc == 0x80000080 ||
+ pc == 0xA0000100 || pc == 0x80000180)
+ {
+ HandleCPUException();
+ }
}
+}
+// Called before opcode is executed (not called if SkipOp is set)
+void CDebuggerUI::CPUStep()
+{
if (bCPULoggingEnabled())
{
m_CPULog->PushState();
@@ -705,7 +728,8 @@ void CDebuggerUI::CPUStepStarted()
}
}
-void CDebuggerUI::CPUStep()
+// Called after opcode has been executed
+void CDebuggerUI::CPUStepEnded()
{
OPCODE Opcode = R4300iOp::m_Opcode;
uint32_t op = Opcode.op;
diff --git a/Source/Project64/UserInterface/Debugger/DebuggerUI.h b/Source/Project64/UserInterface/Debugger/DebuggerUI.h
index f9f194113..893dc7b4a 100644
--- a/Source/Project64/UserInterface/Debugger/DebuggerUI.h
+++ b/Source/Project64/UserInterface/Debugger/DebuggerUI.h
@@ -15,4 +15,5 @@
#include "Debugger-DMALogView.h"
#include "Debugger-CPULogView.h"
#include "Debugger-StackView.h"
-#include "Debugger-StackTrace.h"
\ No newline at end of file
+#include "Debugger-StackTrace.h"
+#include "Debugger-ExceptionBreakpoints.h"
\ No newline at end of file
diff --git a/Source/Project64/UserInterface/Debugger/debugger.h b/Source/Project64/UserInterface/Debugger/debugger.h
index 2c5908bd1..bcd27e7c3 100644
--- a/Source/Project64/UserInterface/Debugger/debugger.h
+++ b/Source/Project64/UserInterface/Debugger/debugger.h
@@ -24,6 +24,7 @@ class CDebugDMALogView;
class CDebugCPULogView;
class CDebugStackView;
class CDebugStackTrace;
+class CDebugExcBreakpoints;
class CCPULog;
class CDMALog;
@@ -61,6 +62,7 @@ public:
void OpenDMALogWindow(void);
void OpenCPULogWindow(void);
void Debug_RefreshCPULogWindow(void);
+ void OpenExcBreakpointsWindow(void);
bool ExecutionBP(uint32_t address);
bool ReadBP8(uint32_t address);
@@ -90,23 +92,25 @@ protected:
void TLBChanged(void);
void CPUStepStarted(void);
void CPUStep(void);
+ void CPUStepEnded(void);
void FrameDrawn(void);
private:
CDebuggerUI(const CDebuggerUI&); // Disable copy constructor
CDebuggerUI& operator=(const CDebuggerUI&); // Disable assignment
- CDumpMemory * m_MemoryDump;
- CDebugMemoryView * m_MemoryView;
- CDebugMemorySearch * m_MemorySearch;
- CDebugTlb * m_DebugTLB;
- CDebugCommandsView * m_CommandsView;
- CDebugScripts * m_Scripts;
- CDebugSymbols * m_Symbols;
- CDebugDMALogView * m_DMALogView;
- CDebugCPULogView * m_CPULogView;
- CDebugStackTrace * m_StackTrace;
- CDebugStackView * m_StackView;
+ CDumpMemory * m_MemoryDump;
+ CDebugMemoryView * m_MemoryView;
+ CDebugMemorySearch * m_MemorySearch;
+ CDebugTlb * m_DebugTLB;
+ CDebugCommandsView * m_CommandsView;
+ CDebugScripts * m_Scripts;
+ CDebugSymbols * m_Symbols;
+ CDebugDMALogView * m_DMALogView;
+ CDebugCPULogView * m_CPULogView;
+ CDebugStackTrace * m_StackTrace;
+ CDebugStackView * m_StackView;
+ CDebugExcBreakpoints * m_ExcBreakpoints;
CBreakpoints * m_Breakpoints;
CScriptSystem * m_ScriptSystem;
diff --git a/Source/Project64/UserInterface/MainMenu.cpp b/Source/Project64/UserInterface/MainMenu.cpp
index 847d836db..52414d830 100644
--- a/Source/Project64/UserInterface/MainMenu.cpp
+++ b/Source/Project64/UserInterface/MainMenu.cpp
@@ -514,6 +514,7 @@ bool CMainMenu::ProcessMessage(HWND hWnd, DWORD /*FromAccelerator*/, DWORD MenuI
case ID_DEBUGGER_SYMBOLS: g_Debugger->OpenSymbolsWindow(); break;
case ID_DEBUGGER_DMALOG: g_Debugger->OpenDMALogWindow(); break;
case ID_DEBUGGER_CPULOG: g_Debugger->OpenCPULogWindow(); break;
+ case ID_DEBUGGER_EXCBREAKPOINTS: g_Debugger->OpenExcBreakpointsWindow(); break;
case ID_DEBUGGER_STACKTRACE: g_Debugger->OpenStackTraceWindow(); break;
case ID_DEBUGGER_STACKVIEW: g_Debugger->OpenStackViewWindow(); break;
case ID_CURRENT_SAVE_DEFAULT:
@@ -1132,6 +1133,12 @@ void CMainMenu::FillOutMenu(HMENU hMenu)
//Item.SetItemEnabled(CPURunning);
DebugMenu.push_back(Item);
+ /* Debug - Exception breakpoints
+ *******************/
+ Item.Reset(ID_DEBUGGER_EXCBREAKPOINTS, EMPTY_STRING, EMPTY_STDSTR, NULL, L"CPU Exception breakpoints...");
+ //Item.SetItemEnabled(CPURunning);
+ DebugMenu.push_back(Item);
+
/* Debugger - Symbols
****************/
Item.Reset(ID_DEBUGGER_SYMBOLS, EMPTY_STRING, EMPTY_STDSTR, NULL, L"Symbols...");
diff --git a/Source/Project64/UserInterface/MainMenu.h b/Source/Project64/UserInterface/MainMenu.h
index 2aef9bdb7..8490b4492 100644
--- a/Source/Project64/UserInterface/MainMenu.h
+++ b/Source/Project64/UserInterface/MainMenu.h
@@ -40,7 +40,7 @@ enum MainMenuID
ID_DEBUGGER_TLBENTRIES, ID_DEBUGGER_BREAKPOINTS, ID_DEBUGGER_MEMORY, ID_DEBUGGER_R4300REGISTERS,
ID_DEBUGGER_INTERRUPT_SP, ID_DEBUGGER_INTERRUPT_SI, ID_DEBUGGER_INTERRUPT_AI, ID_DEBUGGER_INTERRUPT_VI,
ID_DEBUGGER_INTERRUPT_PI, ID_DEBUGGER_INTERRUPT_DP, ID_DEBUGGER_SCRIPTS, ID_DEBUGGER_SYMBOLS, ID_DEBUGGER_DMALOG,
- ID_DEBUGGER_CPULOG, ID_DEBUGGER_STACKTRACE, ID_DEBUGGER_STACKVIEW, ID_DEBUG_ENANCEMENT,
+ ID_DEBUGGER_EXCBREAKPOINTS, ID_DEBUGGER_CPULOG, ID_DEBUGGER_STACKTRACE, ID_DEBUGGER_STACKVIEW, ID_DEBUG_ENANCEMENT,
// App logging
ID_DEBUGGER_APPLOG_FLUSH, ID_DEBUGGER_TRACE_MD5, ID_DEBUGGER_TRACE_SETTINGS, ID_DEBUGGER_TRACE_UNKNOWN, ID_DEBUGGER_TRACE_APPINIT,
diff --git a/Source/Project64/UserInterface/UIResources.rc b/Source/Project64/UserInterface/UIResources.rc
index b8e2ad67c..e5f967651 100644
--- a/Source/Project64/UserInterface/UIResources.rc
+++ b/Source/Project64/UserInterface/UIResources.rc
@@ -1319,6 +1319,30 @@ BEGIN
PUSHBUTTON "Export",IDC_BTN_EXPORT,360,7,56,13
END
+IDD_Debugger_ExceptionBP DIALOGEX 0, 0, 213, 107
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "CPU Exception Breakpoints"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ CONTROL "Interrupt",IDC_CHK_INT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,8,78,11
+ CONTROL "TLB Mod",IDC_CHK_MOD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,18,78,11
+ CONTROL "Read TLB Miss",IDC_CHK_RMISS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,28,80,11
+ CONTROL "Write TLB Miss",IDC_CHK_WMISS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,38,80,11
+ CONTROL "Read Address Error",IDC_CHK_RADE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,48,76,11
+ CONTROL "Write Address Error",IDC_CHK_WADE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,58,78,11
+ CONTROL "Instruction Bus Error",IDC_CHK_IBE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,68,79,11
+ CONTROL "Data Bus Error",IDC_CHK_DBE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,78,59,11
+ CONTROL "SYSCALL",IDC_CHK_SYSCALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,88,59,11
+ CONTROL "BREAK",IDC_CHK_BREAK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,96,8,59,11
+ CONTROL "Illegal Instruction",IDC_CHK_II,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,96,18,71,11
+ CONTROL "Coprocessor Unusable",IDC_CHK_CPU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,96,28,86,11
+ CONTROL "Overflow",IDC_CHK_OV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,96,38,59,11
+ CONTROL "Trap exception",IDC_CHK_TRAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,96,48,59,11
+ CONTROL "Virt. Coherency on Inst. fetch",IDC_CHK_VCEI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,96,58,107,11
+ CONTROL "Floating Point Exception",IDC_CHK_FPE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,96,68,91,11
+ CONTROL "Watchpoint reference",IDC_CHK_WATCH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,96,78,87,11
+ CONTROL "Virt. Coherency on data read",IDC_CHK_VCED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,96,88,106,11
+END
/////////////////////////////////////////////////////////////////////////////
//
@@ -1765,6 +1789,14 @@ BEGIN
TOPMARGIN, 7
BOTTOMMARGIN, 260
END
+
+ IDD_Debugger_ExceptionBP, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 206
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 100
+ END
END
#endif // APSTUDIO_INVOKED
@@ -1991,6 +2023,15 @@ BEGIN
0
END
+IDD_Debugger_RegCOP0 AFX_DIALOG_LAYOUT
+BEGIN
+ 0
+END
+
+IDD_Debugger_ExceptionBP AFX_DIALOG_LAYOUT
+BEGIN
+ 0
+END
/////////////////////////////////////////////////////////////////////////////
//
diff --git a/Source/Project64/UserInterface/resource.h b/Source/Project64/UserInterface/resource.h
index 47222aa27..96194cb85 100644
--- a/Source/Project64/UserInterface/resource.h
+++ b/Source/Project64/UserInterface/resource.h
@@ -81,7 +81,8 @@
#define IDD_Enhancement_Config 202
#define IDD_Enhancement_Edit 203
#define IDD_Debugger_CPULog 204
-#define VERSION_BUILD 781
+#define IDD_Debugger_ExceptionBP 207
+#define VERSION_BUILD 816
#define IDC_MENU_ITEM_TEXT 1000
#define IDC_CLOSE_BUTTON 1001
#define IDC_LIST2 1003
@@ -623,6 +624,25 @@
#define IDC_BUFFSIZE_EDIT 1457
#define IDC_REGSTATES_GRP 1458
#define IDC_BTN_EXPORT 1461
+#define IDC_CHK_INT 1462
+#define IDC_CHK_MOD 1463
+#define IDC_CHK_RMISS 1464
+#define IDC_CHK_WMISS 1465
+#define IDC_CHK_RADE 1466
+#define IDC_CHK_WADE 1467
+#define IDC_CHECK7 1468
+#define IDC_CHK_IBE 1468
+#define IDC_CHK_DBE 1469
+#define IDC_CHK_SYSCALL 1470
+#define IDC_CHK_BREAK 1471
+#define IDC_CHK_II 1472
+#define IDC_CHK_CPU 1473
+#define IDC_CHK_OV 1474
+#define IDC_CHK_TRAP 1475
+#define IDC_CHK_VCEI 1476
+#define IDC_CHK_FPE 1477
+#define IDC_CHK_WATCH 1478
+#define IDC_CHK_VCED 1479
#define ID_POPUP_SHOWINMEMORYVIEWER 40005
#define ID_POPUPMENU_PLAYGAMEWITHDISK 40008
#define ID_POPUPMENU_ADDSYMBOL 40013
@@ -660,9 +680,9 @@
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 206
+#define _APS_NEXT_RESOURCE_VALUE 209
#define _APS_NEXT_COMMAND_VALUE 40043
-#define _APS_NEXT_CONTROL_VALUE 1462
+#define _APS_NEXT_CONTROL_VALUE 1480
#define _APS_NEXT_SYMED_VALUE 102
#endif
#endif