summaryrefslogtreecommitdiff
path: root/Source/Core/Common/Src/BreakPoints.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/Common/Src/BreakPoints.cpp')
-rw-r--r--Source/Core/Common/Src/BreakPoints.cpp154
1 files changed, 154 insertions, 0 deletions
diff --git a/Source/Core/Common/Src/BreakPoints.cpp b/Source/Core/Common/Src/BreakPoints.cpp
new file mode 100644
index 0000000000..446852028c
--- /dev/null
+++ b/Source/Core/Common/Src/BreakPoints.cpp
@@ -0,0 +1,154 @@
+// Copyright (C) 2003-2009 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#include "Common.h"
+
+#include "DebugInterface.h"
+#include "BreakPoints.h"
+
+void TMemCheck::Action(DebugInterface *debug_interface, u32 iValue, u32 addr, bool write, int size, u32 pc)
+{
+ if ((write && OnWrite) || (!write && OnRead))
+ {
+ if (Log)
+ {
+ DEBUG_LOG(MEMMAP, "CHK %08x %s%i at %08x (%s)",
+ iValue, write ? "Write" : "Read", // read or write
+ size*8, addr, // address
+ debug_interface->GetDescription(addr).c_str() // symbol map description
+ );
+ }
+ if (Break)
+ debug_interface->breakNow();
+ }
+}
+
+bool BreakPoints::IsAddressBreakPoint(u32 _iAddress)
+{
+ std::vector<TBreakPoint>::iterator iter;
+ for (iter = m_BreakPoints.begin(); iter != m_BreakPoints.end(); ++iter)
+ if ((*iter).iAddress == _iAddress)
+ return true;
+ return false;
+}
+
+bool BreakPoints::IsTempBreakPoint(u32 _iAddress)
+{
+ std::vector<TBreakPoint>::iterator iter;
+
+ for (iter = m_BreakPoints.begin(); iter != m_BreakPoints.end(); ++iter)
+ if ((*iter).iAddress == _iAddress && (*iter).bTemporary)
+ return true;
+
+ return false;
+}
+
+bool BreakPoints::Add(u32 em_address, bool temp)
+{
+ if (!IsAddressBreakPoint(em_address)) // only add new addresses
+ {
+ TBreakPoint pt; // breakpoint settings
+ pt.bOn = true;
+ pt.bTemporary = temp;
+ pt.iAddress = em_address;
+
+ m_BreakPoints.push_back(pt);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+bool BreakPoints::Remove(u32 _iAddress)
+{
+ std::vector<TBreakPoint>::iterator iter;
+ for (iter = m_BreakPoints.begin(); iter != m_BreakPoints.end(); ++iter)
+ {
+ if ((*iter).iAddress == _iAddress)
+ {
+ m_BreakPoints.erase(iter);
+ return true;
+ }
+ }
+ return false;
+}
+
+void BreakPoints::Clear()
+{
+ m_BreakPoints.clear();
+}
+
+void BreakPoints::DeleteByAddress(u32 _Address)
+{
+ // first check breakpoints
+ {
+ std::vector<TBreakPoint>::iterator iter;
+ for (iter = m_BreakPoints.begin(); iter != m_BreakPoints.end(); ++iter)
+ {
+ if ((*iter).iAddress == _Address)
+ {
+ m_BreakPoints.erase(iter);
+ return;
+ }
+ }
+ }
+}
+
+void MemChecks::Add(const TMemCheck& _rMemoryCheck)
+{
+ m_MemChecks.push_back(_rMemoryCheck);
+}
+
+
+TMemCheck *MemChecks::GetMemCheck(u32 address)
+{
+ std::vector<TMemCheck>::iterator iter;
+ for (iter = m_MemChecks.begin(); iter != m_MemChecks.end(); ++iter)
+ {
+ if ((*iter).bRange)
+ {
+ if (address >= (*iter).StartAddress && address <= (*iter).EndAddress)
+ return &(*iter);
+ }
+ else
+ {
+ if ((*iter).StartAddress == address)
+ return &(*iter);
+ }
+ }
+
+ //none found
+ return 0;
+}
+
+void MemChecks::Clear()
+{
+ m_MemChecks.clear();
+}
+
+void MemChecks::DeleteByAddress(u32 _Address)
+{
+ std::vector<TMemCheck>::iterator iter;
+ for (iter = m_MemChecks.begin(); iter != m_MemChecks.end(); ++iter)
+ {
+ if ((*iter).StartAddress == _Address)
+ {
+ m_MemChecks.erase(iter);
+ return;
+ }
+ }
+}