3#include "absl/strings/str_format.h"
30 return SnesButton::SELECT;
32 return SnesButton::START;
34 return SnesButton::UP;
36 return SnesButton::DOWN;
38 return SnesButton::LEFT;
40 return SnesButton::RIGHT;
42 return absl::InvalidArgumentError(absl::StrFormat(
43 "Unsupported button value: %d",
static_cast<int>(button)));
92 : emulator_(emulator) {}
115 if (!
emulator_)
return absl::UnavailableError(
"Emulator not initialized");
116 for (
int i = 0; i < count; ++i) {
119 return absl::OkStatus();
123 if (!
emulator_)
return absl::UnavailableError(
"Emulator not initialized");
126 return absl::OkStatus();
130 if (!
emulator_)
return absl::UnavailableError(
"Emulator not initialized");
133 return absl::OkStatus();
140 [&memory](uint32_t addr) -> uint8_t {
return memory.ReadByte(addr); });
144 [&cpu]() -> uint32_t {
return (cpu.PB << 16) | cpu.PC; });
148 if (!
rom_loader_)
return absl::UnavailableError(
"No ROM loader configured");
150 return absl::InternalError(
"Failed to load ROM");
164 if (!
emulator_)
return absl::UnavailableError(
"Emulator not initialized");
169 uint32_t addr,
size_t len) {
170 if (!
emulator_)
return absl::UnavailableError(
"Emulator not initialized");
171 std::vector<uint8_t> data(len);
172 for (
size_t i = 0; i < len; ++i) {
179 if (!
emulator_)
return absl::UnavailableError(
"Emulator not initialized");
181 return absl::OkStatus();
185 uint32_t addr,
const std::vector<uint8_t>& data) {
186 if (!
emulator_)
return absl::UnavailableError(
"Emulator not initialized");
187 for (
size_t i = 0; i < data.size(); ++i) {
190 return absl::OkStatus();
201 state->
sp = cpu.SP();
203 state->
status = cpu.status;
204 state->
flag_n = cpu.GetNegativeFlag();
205 state->
flag_v = cpu.GetOverflowFlag();
206 state->
flag_z = cpu.GetZeroFlag();
207 state->
flag_c = cpu.GetCarryFlag();
212 if (!
emulator_)
return absl::UnavailableError(
"Emulator not initialized");
214 return absl::OkStatus();
218 if (!
emulator_)
return absl::UnavailableError(
"Emulator not initialized");
221 auto read8 = [&snes](uint32_t addr) {
return snes.Read(addr); };
222 auto read16 = [&read8](uint32_t addr) {
223 return static_cast<uint16_t
>(read8(addr)) |
224 (
static_cast<uint16_t
>(read8(addr + 1)) << 8);
233 return absl::OkStatus();
239 return absl::UnavailableError(
"SNES is not initialized.");
242 const int kMaxInstructions = 1000000;
243 int instruction_count = 0;
247 while (instruction_count++ < kMaxInstructions) {
248 uint32_t pc = (cpu.PB << 16) | cpu.PC;
249 if (bp_manager.ShouldBreakOnExecute(
251 response->
hit =
true;
252 auto* last_hit = bp_manager.GetLastHit();
261 return absl::OkStatus();
265 response->
hit =
false;
266 return absl::OkStatus();
271 const std::string& condition,
const std::string& description) {
272 if (!
emulator_)
return absl::UnavailableError(
"Emulator not initialized");
274 return bp_manager.
AddBreakpoint(addr, ToBreakpointType(type),
275 ToCpuType(cpu), condition, description);
279 if (!
emulator_)
return absl::UnavailableError(
"Emulator not initialized");
281 return absl::OkStatus();
286 if (!
emulator_)
return absl::UnavailableError(
"Emulator not initialized");
288 return absl::OkStatus();
292 std::vector<BreakpointSnapshot> result;
296 for (
const auto& bp : breakpoints) {
300 info.
kind = FromBreakpointType(bp.type);
301 info.
cpu = FromCpuType(bp.cpu);
303 result.push_back(info);
309 if (!
emulator_)
return absl::UnavailableError(
"Emulator not initialized");
310 auto snes_button = ToSnesButton(button);
311 if (!snes_button.ok())
return snes_button.status();
313 return absl::OkStatus();
317 if (!
emulator_)
return absl::UnavailableError(
"Emulator not initialized");
318 auto snes_button = ToSnesButton(button);
319 if (!snes_button.ok())
return snes_button.status();
321 return absl::OkStatus();
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Manages CPU and SPC700 breakpoints for debugging.
void RemoveBreakpoint(uint32_t id)
Remove a breakpoint by ID.
void SetEnabled(uint32_t id, bool enabled)
Enable or disable a breakpoint.
std::vector< Breakpoint > GetAllBreakpoints() const
Get all breakpoints.
uint32_t AddBreakpoint(uint32_t address, Type type, CpuType cpu, const std::string &condition="", const std::string &description="")
Add a new breakpoint.
A class for emulating and debugging SNES games.
BreakpointManager & breakpoint_manager()
uint64_t GetCurrentCycle()
void StepSingleInstruction()
input::InputManager & input_manager()
void set_running(bool running)
bool is_snes_initialized() const
auto running() const -> bool
void CaptureCPUState(CpuStateSnapshot *state)
absl::StatusOr< uint32_t > AddBreakpoint(uint32_t addr, BreakpointKind type, CpuKind cpu, const std::string &condition, const std::string &description) override
absl::Status GetCpuState(CpuStateSnapshot *out_state) override
absl::Status WriteBlock(uint32_t addr, const std::vector< uint8_t > &data) override
absl::Status StepOut() override
std::function< Rom *()> rom_getter_
absl::Status ToggleBreakpoint(uint32_t breakpoint_id, bool enabled) override
absl::Status Step(int count) override
absl::Status RemoveBreakpoint(uint32_t breakpoint_id) override
absl::Status StepOver() override
bool IsRunning() const override
std::string GetLoadedRomPath() const override
void InitializeStepController()
absl::StatusOr< std::vector< uint8_t > > ReadBlock(uint32_t addr, size_t len) override
absl::Status ReleaseButton(InputButton button) override
absl::Status WriteByte(uint32_t addr, uint8_t val) override
absl::Status GetGameState(GameSnapshot *out_state) override
absl::Status RunToBreakpoint(BreakpointHitResult *response) override
std::vector< BreakpointSnapshot > ListBreakpoints() override
std::function< bool(const std::string &) rom_loader_)
absl::Status LoadRom(const std::string &path) override
bool IsConnected() const override
absl::Status PressButton(InputButton button) override
absl::StatusOr< uint8_t > ReadByte(uint32_t addr) override
yaze::emu::debug::StepController step_controller_
InternalEmulatorAdapter(Emulator *emulator)
void SetMemoryReader(MemoryReader reader)
void SetPcGetter(PcGetter getter)
StepResult StepOver(uint32_t max_instructions=1000000)
Step over the current instruction.
void SetSingleStepper(SingleStepper stepper)
StepResult StepOut(uint32_t max_instructions=1000000)
Step out of the current subroutine.
CpuKind FromCpuType(BreakpointManager::CpuType cpu)
absl::StatusOr< input::SnesButton > ToSnesButton(InputButton button)
BreakpointKind FromBreakpointType(BreakpointManager::Type type)
BreakpointManager::CpuType ToCpuType(CpuKind kind)
BreakpointManager::Type ToBreakpointType(BreakpointKind kind)
BreakpointSnapshot breakpoint
CpuStateSnapshot cpu_state