diff options
author | Oxore <oxore@protonmail.com> | 2022-08-30 16:49:38 +0300 |
---|---|---|
committer | Oxore <oxore@protonmail.com> | 2022-08-30 16:49:38 +0300 |
commit | ed3cf413dfe5f874f203f8b6a696af29cfc47dcd (patch) | |
tree | 9d9c181a568cf1833218444c0d2b26b33063435e /m68k_debugging.cpp | |
parent | 026894023fa53fa32fd342d18e05f55743cf6c4b (diff) |
Impl emulator stepping with GDB
Diffstat (limited to 'm68k_debugging.cpp')
-rw-r--r-- | m68k_debugging.cpp | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/m68k_debugging.cpp b/m68k_debugging.cpp new file mode 100644 index 0000000..f9b0b38 --- /dev/null +++ b/m68k_debugging.cpp @@ -0,0 +1,144 @@ +/* SPDX-License-Identifier: Unlicense + */ + +#include "m68k_debugging.hpp" +#include "musashi-m68k/m68k.h" +#include "utils.hpp" + +#include <cstdlib> +#include <cassert> + +static inline m68k_register_t ConvertRegisterId(M68KRegister register_id) +{ + switch (register_id) { + case M68KRegister::kD0: + return M68K_REG_D0; + case M68KRegister::kD1: + return M68K_REG_D1; + case M68KRegister::kD2: + return M68K_REG_D2; + case M68KRegister::kD3: + return M68K_REG_D3; + case M68KRegister::kD4: + return M68K_REG_D4; + case M68KRegister::kD5: + return M68K_REG_D5; + case M68KRegister::kD6: + return M68K_REG_D6; + case M68KRegister::kD7: + return M68K_REG_D7; + case M68KRegister::kA0: + return M68K_REG_A0; + case M68KRegister::kA1: + return M68K_REG_A1; + case M68KRegister::kA2: + return M68K_REG_A2; + case M68KRegister::kA3: + return M68K_REG_A3; + case M68KRegister::kA4: + return M68K_REG_A4; + case M68KRegister::kA5: + return M68K_REG_A5; + case M68KRegister::kA6: + return M68K_REG_A6; + case M68KRegister::kA7: + return M68K_REG_A7; + case M68KRegister::kPS: + return M68K_REG_SR; + case M68KRegister::kPC: + return M68K_REG_PC; + case M68KRegister::kFP0: + case M68KRegister::kFPC: + case M68KRegister::kFPS: + case M68KRegister::kFPI: + case M68KRegister::kRegistersCount: + assert(!"Unsupported register_id"); + break; + } + assert(!"Unknown register_id"); + UNREACHABLE(); +} + +uint32_t M68KDebuggingControl::GetRegister(M68KRegister register_id) const +{ + return m68k_get_reg(nullptr, ConvertRegisterId(register_id)); +} + +M68KCPUState M68KDebuggingControl::GetCPUState() const +{ + return M68KCPUState{ + static_cast<size_t>(M68KRegister::kPC) + 1, + { + GetRegister(M68KRegister::kD0), + GetRegister(M68KRegister::kD1), + GetRegister(M68KRegister::kD2), + GetRegister(M68KRegister::kD3), + GetRegister(M68KRegister::kD4), + GetRegister(M68KRegister::kD5), + GetRegister(M68KRegister::kD6), + GetRegister(M68KRegister::kD7), + GetRegister(M68KRegister::kA0), + GetRegister(M68KRegister::kA1), + GetRegister(M68KRegister::kA2), + GetRegister(M68KRegister::kA3), + GetRegister(M68KRegister::kA4), + GetRegister(M68KRegister::kA5), + GetRegister(M68KRegister::kA6), + GetRegister(M68KRegister::kA7), + GetRegister(M68KRegister::kPS), + GetRegister(M68KRegister::kPC), + }, + }; +} + +void M68KDebuggingControl::SetRegister(M68KRegister register_id, uint32_t value) +{ + return m68k_set_reg(ConvertRegisterId(register_id), value); +} + +void M68KDebuggingControl::Reset() +{ + m68k_pulse_reset(); +} + +void M68KDebuggingControl::Continue() +{ + // TODO + abort(); +} + +void M68KDebuggingControl::Pause() +{ + // TODO + abort(); +} + +uint8_t M68KDebuggingControl::Read8(uint32_t address) const +{ + return static_cast<uint8_t>(m68k_read_memory_8(address & 0x00FFFFFF)); +} + +uint16_t M68KDebuggingControl::Read16(uint32_t address) const +{ + return static_cast<uint16_t>(m68k_read_memory_16(address & 0x00FFFFFF)); +} + +uint32_t M68KDebuggingControl::Read32(uint32_t address) const +{ + return static_cast<uint32_t>(m68k_read_memory_32(address & 0x00FFFFFF)); +} + +void M68KDebuggingControl::Write8(uint32_t address, uint8_t value) +{ + m68k_write_memory_8(address, value); +} + +void M68KDebuggingControl::Write16(uint32_t address, uint16_t value) +{ + m68k_write_memory_16(address, value); +} + +void M68KDebuggingControl::Write32(uint32_t address, uint32_t value) +{ + m68k_write_memory_32(address, value); +} |