From 15d14d36fc7ac30cdbde8c2a78e901ba2c47e94d Mon Sep 17 00:00:00 2001 From: Oxore Date: Sun, 2 Oct 2022 00:49:39 +0300 Subject: Impl setting registers via GDB --- emulator.cpp | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'emulator.cpp') 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(packet.data.get()); + const auto& registers = data->registers; + for (size_t i = 0; i < registers.size(); i++) { + m68k_debug.SetRegister(static_cast(i), registers[i]); + } + return "OK"; + } + break; + case PacketType::kReadRegister: + { + const auto * const data = + static_cast(packet.data.get()); + const auto reg_id = static_cast(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(packet.data.get()); + const auto reg_id = static_cast(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 = -- cgit v1.2.3