summaryrefslogtreecommitdiff
path: root/emulator.cpp
diff options
context:
space:
mode:
authorOxore <oxore@protonmail.com>2022-10-02 00:49:39 +0300
committerOxore <oxore@protonmail.com>2022-10-02 00:59:23 +0300
commit15d14d36fc7ac30cdbde8c2a78e901ba2c47e94d (patch)
tree4606963389204dffa7a8cef51fb34ed80ecc01a3 /emulator.cpp
parent72abe5f3e714df9cc8310a78bdfa648feb79c4d2 (diff)
Impl setting registers via GDB
Diffstat (limited to 'emulator.cpp')
-rw-r--r--emulator.cpp42
1 files changed, 41 insertions, 1 deletions
diff --git a/emulator.cpp b/emulator.cpp
index 7e6ad25..b5ad031 100644
--- a/emulator.cpp
+++ b/emulator.cpp
@@ -211,7 +211,7 @@ static std::string CreateResponse(
{
const M68KCPUState state = m68k_debug.GetCPUState();
std::string result{};
- for (size_t i = 0; i < state.registers_count ;i++)
+ for (size_t i = 0; i < state.registers_count; i++)
{
constexpr size_t value_size = std::string_view("12345678").length();
char value[value_size + 1]{};
@@ -221,6 +221,46 @@ static std::string CreateResponse(
}
return result;
}
+ case PacketType::kWriteGeneralRegisters:
+ {
+ const auto * const data =
+ static_cast<const PacketDataWriteGeneralRegisters*>(packet.data.get());
+ const auto& registers = data->registers;
+ for (size_t i = 0; i < registers.size(); i++) {
+ m68k_debug.SetRegister(static_cast<M68KRegister>(i), registers[i]);
+ }
+ return "OK";
+ }
+ break;
+ case PacketType::kReadRegister:
+ {
+ const auto * const data =
+ static_cast<const PacketDataReadRegister*>(packet.data.get());
+ const auto reg_id = static_cast<M68KRegister>(data->reg_id);
+ if (reg_id >= M68KRegister::kRegistersCount) {
+ return "E00";
+ }
+ const uint32_t value = m68k_debug.GetRegister(reg_id);
+ constexpr size_t value_size = std::string_view("12345678").length();
+ char value_str[value_size + 1]{};
+ const int ret = snprintf(value_str, value_size + 1, "%08x", value);
+ assert(ret == value_size);
+ return std::string(value_str, value_size);
+ }
+ break;
+ case PacketType::kWriteRegister:
+ {
+ const auto * const data =
+ static_cast<const PacketDataWriteRegister*>(packet.data.get());
+ const auto reg_id = static_cast<M68KRegister>(data->reg_id);
+ const auto value = data->value;
+ if (reg_id >= M68KRegister::kRegistersCount) {
+ return "E00";
+ }
+ m68k_debug.SetRegister(reg_id, value);
+ return "OK";
+ }
+ break;
case PacketType::kReadMemory:
{
const auto * const data =