summaryrefslogtreecommitdiff
path: root/m68k_debugging.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'm68k_debugging.cpp')
-rw-r--r--m68k_debugging.cpp53
1 files changed, 52 insertions, 1 deletions
diff --git a/m68k_debugging.cpp b/m68k_debugging.cpp
index f9b0b38..509299d 100644
--- a/m68k_debugging.cpp
+++ b/m68k_debugging.cpp
@@ -3,6 +3,7 @@
#include "m68k_debugging.hpp"
#include "musashi-m68k/m68k.h"
+#include "bus.hpp"
#include "utils.hpp"
#include <cstdlib>
@@ -56,7 +57,7 @@ static inline m68k_register_t ConvertRegisterId(M68KRegister register_id)
break;
}
assert(!"Unknown register_id");
- UNREACHABLE();
+ UNREACHABLE;
}
uint32_t M68KDebuggingControl::GetRegister(M68KRegister register_id) const
@@ -142,3 +143,53 @@ void M68KDebuggingControl::Write32(uint32_t address, uint32_t value)
{
m68k_write_memory_32(address, value);
}
+
+void M68KDebuggingControl::SetBreakpoint(BreakpointType type, uint32_t address, uint32_t length)
+{
+ switch (type) {
+ case BreakpointType::kSoftwareBreakpoint:
+ case BreakpointType::kHardwareBreakpoint: {
+ const auto it = std::find_if(
+ code_bkpts.begin(),
+ code_bkpts.end(),
+ [&](const Breakpoint& b) { return b.offset == address && b.length == length; });
+ if (it == code_bkpts.end())
+ code_bkpts.push_back(Breakpoint{address, length});
+ } break;
+ case BreakpointType::kWriteWatchpoint: {
+ } break;
+ case BreakpointType::kReadWatchpoint: {
+ } break;
+ case BreakpointType::kAccessWatchpoint: {
+ } break;
+ break;
+ case BreakpointType::kUnsupported: {
+ UNREACHABLE;
+ } break;
+ }
+}
+
+void M68KDebuggingControl::RemoveBreakpoint(BreakpointType type, uint32_t address, uint32_t length)
+{
+ switch (type) {
+ case BreakpointType::kSoftwareBreakpoint:
+ case BreakpointType::kHardwareBreakpoint: {
+ const auto it = std::find_if(
+ code_bkpts.begin(),
+ code_bkpts.end(),
+ [&](const Breakpoint& b) { return b.offset == address && b.length == length; });
+ if (it != code_bkpts.end())
+ code_bkpts.erase(it);
+ } break;
+ case BreakpointType::kWriteWatchpoint: {
+ } break;
+ case BreakpointType::kReadWatchpoint: {
+ } break;
+ case BreakpointType::kAccessWatchpoint: {
+ } break;
+ break;
+ case BreakpointType::kUnsupported: {
+ UNREACHABLE;
+ } break;
+ }
+}