diff options
author | Oxore <oxore@protonmail.com> | 2022-10-02 00:49:39 +0300 |
---|---|---|
committer | Oxore <oxore@protonmail.com> | 2022-10-02 00:59:23 +0300 |
commit | 15d14d36fc7ac30cdbde8c2a78e901ba2c47e94d (patch) | |
tree | 4606963389204dffa7a8cef51fb34ed80ecc01a3 /emulator.cpp | |
parent | 72abe5f3e714df9cc8310a78bdfa648feb79c4d2 (diff) |
Impl setting registers via GDB
Diffstat (limited to 'emulator.cpp')
-rw-r--r-- | emulator.cpp | 42 |
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 = |