diff --git a/Core/Debugger/Breakpoints.cpp b/Core/Debugger/Breakpoints.cpp index e7eefc426b..ebdcecffb7 100644 --- a/Core/Debugger/Breakpoints.cpp +++ b/Core/Debugger/Breakpoints.cpp @@ -100,6 +100,32 @@ void CBreakPoints::AddBreakPoint(u32 addr, bool temp) else if (!breakPoints_[bp].enabled) { breakPoints_[bp].enabled = true; + breakPoints_[bp].hasCond = false; + Update(addr); + } +} + +void CBreakPoints::AddBreakPoint(u32 addr, BreakPointCond cond) +{ + size_t bp = FindBreakpoint(addr); + if (bp == INVALID_BREAKPOINT) + { + BreakPoint pt; + pt.enabled = true; + pt.temporary = false; + pt.addr = addr; + pt.hasCond = true; + pt.cond = cond; + + breakPoints_.push_back(pt); + Update(addr); + } + else if (!breakPoints_[bp].enabled) + { + breakPoints_[bp].enabled = true; + breakPoints_[bp].temporary = false; + breakPoints_[bp].hasCond = true; + breakPoints_[bp].cond = cond; Update(addr); } } diff --git a/Core/Debugger/Breakpoints.h b/Core/Debugger/Breakpoints.h index b08ddbb8cb..2d5f2a13b5 100644 --- a/Core/Debugger/Breakpoints.h +++ b/Core/Debugger/Breakpoints.h @@ -18,16 +18,21 @@ #pragma once #include "../../Globals.h" +#include "DebugInterface.h" #include // TODO: Replace with expression or something. struct BreakPointCond { - u32 todo; + DebugInterface* debug; + PostfixExpression expression; + char expressionString[128]; - u32 Evaluate() const + u32 Evaluate() { - return 1; + u32 result; + if (debug->parseExpression(expression,result) == false) return 0; + return result; } }; @@ -97,6 +102,7 @@ public: static bool IsAddressBreakPoint(u32 addr); static bool IsTempBreakPoint(u32 addr); static void AddBreakPoint(u32 addr, bool temp = false); + static void AddBreakPoint(u32 addr, BreakPointCond cond); // conditional breakpoints aren't temporary static void RemoveBreakPoint(u32 addr); static void ChangeBreakPoint(u32 addr, bool enable); static void ClearAllBreakPoints(); diff --git a/Windows/Debugger/BreakpointWindow.cpp b/Windows/Debugger/BreakpointWindow.cpp index 5ff772f1b4..778b05f87a 100644 --- a/Windows/Debugger/BreakpointWindow.cpp +++ b/Windows/Debugger/BreakpointWindow.cpp @@ -15,15 +15,18 @@ INT_PTR CALLBACK BreakpointWindow::dlgFunc(HWND hwnd, UINT iMsg, WPARAM wParam, SendMessage(GetDlgItem(hwnd,IDC_BREAKPOINT_MEMORY),BM_SETCHECK,bp->memory ? BST_CHECKED : BST_UNCHECKED,0); SendMessage(GetDlgItem(hwnd,IDC_BREAKPOINT_READ),BM_SETCHECK, bp->read ? BST_CHECKED : BST_UNCHECKED,0); SendMessage(GetDlgItem(hwnd,IDC_BREAKPOINT_WRITE),BM_SETCHECK, bp->write ? BST_CHECKED : BST_UNCHECKED,0); + SendMessage(GetDlgItem(hwnd,IDC_BREAKPOINT_ONCHANGE),BM_SETCHECK, bp->onChange ? BST_CHECKED : BST_UNCHECKED,0); SendMessage(GetDlgItem(hwnd,IDC_BREAKPOINT_ENABLED),BM_SETCHECK, bp->enabled ? BST_CHECKED : BST_UNCHECKED,0); SendMessage(GetDlgItem(hwnd,IDC_BREAKPOINT_LOG),BM_SETCHECK, bp->log ? BST_CHECKED : BST_UNCHECKED,0); EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_READ),bp->memory); EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_WRITE),bp->memory); + EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_ONCHANGE),bp->memory); EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_SIZE),bp->memory); EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_CONDITION),!bp->memory); EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_LOG),bp->memory); + if (bp->address != -1) { sprintf(str,"0x%08X",bp->address); @@ -45,6 +48,7 @@ INT_PTR CALLBACK BreakpointWindow::dlgFunc(HWND hwnd, UINT iMsg, WPARAM wParam, bp->memory = false; EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_READ),bp->memory); EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_WRITE),bp->memory); + EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_ONCHANGE),bp->memory); EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_SIZE),bp->memory); EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_CONDITION),!bp->memory); EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_LOG),bp->memory); @@ -58,6 +62,7 @@ INT_PTR CALLBACK BreakpointWindow::dlgFunc(HWND hwnd, UINT iMsg, WPARAM wParam, bp->memory = true; EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_READ),bp->memory); EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_WRITE),bp->memory); + EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_ONCHANGE),bp->memory); EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_SIZE),bp->memory); EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_CONDITION),!bp->memory); EnableWindow(GetDlgItem(hwnd,IDC_BREAKPOINT_LOG),bp->memory); @@ -112,6 +117,7 @@ bool BreakpointWindow::fetchDialogData(HWND hwnd) write = (bool) SendMessage(GetDlgItem(hwnd,IDC_BREAKPOINT_WRITE),BM_GETCHECK,0,0); enabled = (bool) SendMessage(GetDlgItem(hwnd,IDC_BREAKPOINT_ENABLED),BM_GETCHECK,0,0); log = (bool) SendMessage(GetDlgItem(hwnd,IDC_BREAKPOINT_LOG),BM_GETCHECK,0,0); + onChange = (bool) SendMessage(GetDlgItem(hwnd,IDC_BREAKPOINT_ONCHANGE),BM_GETCHECK,0,0); // parse address GetWindowText(GetDlgItem(hwnd,IDC_BREAKPOINT_ADDRESS),str,256); @@ -171,56 +177,41 @@ bool BreakpointWindow::exec() return result; } -void BreakpointWindow::addMemcheck() -{ - MemCheckCondition cond; - if (read && write) cond = MEMCHECK_READWRITE; - else if (read) cond = MEMCHECK_READ; - else cond = MEMCHECK_WRITE; - - MemCheckResult result; - if (log && enabled) result = MEMCHECK_BOTH; - else if (log) result = MEMCHECK_LOG; - else if (enabled) result = MEMCHECK_BREAK; - else result = MEMCHECK_IGNORE; - - CBreakPoints::AddMemCheck(address,address+size,cond,result); -} - void BreakpointWindow::addBreakpoint() { - // todo: condition, enabled - CBreakPoints::AddBreakPoint(address,false); -} + if (memory) + { + // add memcheck + MemCheckCondition cond; + if (read && write) cond = MEMCHECK_READWRITE; + else if (read) cond = MEMCHECK_READ; + else cond = MEMCHECK_WRITE; -void BreakpointWindow::editMemcheck(MemCheck& memcheck) -{ - MemCheckCondition cond; - if (read && write) cond = MEMCHECK_READWRITE; - else if (read) cond = MEMCHECK_READ; - else cond = MEMCHECK_WRITE; + MemCheckResult result; + if (log && enabled) result = MEMCHECK_BOTH; + else if (log) result = MEMCHECK_LOG; + else if (enabled) result = MEMCHECK_BREAK; + else result = MEMCHECK_IGNORE; - MemCheckResult result; - if (log && enabled) result = MEMCHECK_BOTH; - else if (log) result = MEMCHECK_LOG; - else if (enabled) result = MEMCHECK_BREAK; - else result = MEMCHECK_IGNORE; + CBreakPoints::AddMemCheck(address,address+size,cond,result); + } else { + // add breakpoint + if (condition[0] != 0) + { + BreakPointCond cond; + cond.debug = cpu; + strcpy(cond.expressionString,condition); + cond.expression = compiledCondition; + CBreakPoints::AddBreakPoint(address,cond); + } else { + CBreakPoints::AddBreakPoint(address,false); + } - memcheck.cond = cond; - memcheck.result = result; - memcheck.start = address; - memcheck.end = address+size; - CBreakPoints::Update(); -} - -void BreakpointWindow::editBreakpoint(BreakPoint& memcheck) -{ - memcheck.addr = address; - memcheck.enabled = enabled; - - // todo - memcheck.hasCond = false; - CBreakPoints::Update(); + if (enabled == false) + { + CBreakPoints::ChangeBreakPoint(address,false); + } + } } void BreakpointWindow::loadFromMemcheck(MemCheck& memcheck) diff --git a/Windows/Debugger/BreakpointWindow.h b/Windows/Debugger/BreakpointWindow.h index 0180d74052..edb251d849 100644 --- a/Windows/Debugger/BreakpointWindow.h +++ b/Windows/Debugger/BreakpointWindow.h @@ -8,13 +8,13 @@ class BreakpointWindow { HWND parentHwnd; DebugInterface* cpu; - bool ctrlDown; bool memory; bool read; bool write; bool enabled; bool log; + bool onChange; u32 address; u32 size; char condition[128]; @@ -26,14 +26,13 @@ public: BreakpointWindow(HWND parent, DebugInterface* cpu): cpu(cpu) { parentHwnd = parent; - memory = false; + memory = true; + onChange = false; read = write = true; enabled = log = true; address = -1; size = 1; condition[0] = 0; - - ctrlDown = false; }; @@ -41,10 +40,7 @@ public: bool exec(); bool isMemoryBreakpoint() { return memory; }; - void addMemcheck(); void addBreakpoint(); - void editMemcheck(MemCheck& memcheck); - void editBreakpoint(BreakPoint& memcheck); void loadFromMemcheck(MemCheck& memcheck); void loadFromBreakpoint(BreakPoint& memcheck); diff --git a/Windows/Debugger/Debugger_Disasm.cpp b/Windows/Debugger/Debugger_Disasm.cpp index 7ffadf18cb..9b08644e5c 100644 --- a/Windows/Debugger/Debugger_Disasm.cpp +++ b/Windows/Debugger/Debugger_Disasm.cpp @@ -657,15 +657,7 @@ BOOL CDisasm::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) } BreakpointWindow bpw(m_hDlg,cpu); - if (bpw.exec()) - { - if (bpw.isMemoryBreakpoint()) - { - bpw.addMemcheck(); - } else { - bpw.addBreakpoint(); - } - } + if (bpw.exec()) bpw.addBreakpoint(); if (isRunning) { diff --git a/Windows/ppsspp.rc b/Windows/ppsspp.rc index 0f9cefef38..1b7dfc0b88 100644 Binary files a/Windows/ppsspp.rc and b/Windows/ppsspp.rc differ diff --git a/Windows/resource.h b/Windows/resource.h index df8d02f0bf..e75bbf8fa6 100644 Binary files a/Windows/resource.h and b/Windows/resource.h differ