From ed3cf413dfe5f874f203f8b6a696af29cfc47dcd Mon Sep 17 00:00:00 2001 From: Oxore Date: Tue, 30 Aug 2022 16:49:38 +0300 Subject: Impl emulator stepping with GDB --- m68k_debugging.cpp | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 m68k_debugging.cpp (limited to 'm68k_debugging.cpp') 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 +#include + +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(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(m68k_read_memory_8(address & 0x00FFFFFF)); +} + +uint16_t M68KDebuggingControl::Read16(uint32_t address) const +{ + return static_cast(m68k_read_memory_16(address & 0x00FFFFFF)); +} + +uint32_t M68KDebuggingControl::Read32(uint32_t address) const +{ + return static_cast(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); +} -- cgit v1.2.3