3#include "absl/status/statusor.h"
4#include "absl/strings/str_format.h"
27 return absl::InvalidArgumentError(absl::StrFormat(
28 "Unsupported button value: %d",
static_cast<int>(button)));
48 return client_->Connect(socket_path);
57 auto state =
client_->GetState();
58 if (!state.ok())
return false;
59 return state->running;
75 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
80 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
81 return client_->Step(1,
"over");
85 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
90 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
91 return absl::UnimplementedError(
92 "LoadRom not supported via Mesen2 Socket yet");
100 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
101 return client_->ReadByte(addr);
105 uint32_t addr,
size_t len) {
106 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
107 return client_->ReadBlock(addr, len);
111 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
112 return client_->WriteByte(addr, val);
116 uint32_t addr,
const std::vector<uint8_t>& data) {
117 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
118 return client_->WriteBlock(addr, data);
122 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
123 auto cpu_status =
client_->GetCpuState();
124 if (!cpu_status.ok())
return cpu_status.status();
126 auto& mk = *cpu_status;
130 out_state->
sp = mk.SP;
132 out_state->
pc = mk.PC;
133 out_state->
pb = mk.K;
134 out_state->
db = mk.DBR;
136 out_state->
flag_n = mk.P & 0x80;
137 out_state->
flag_v = mk.P & 0x40;
138 out_state->
flag_z = mk.P & 0x02;
139 out_state->
flag_c = mk.P & 0x01;
141 return absl::OkStatus();
145 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
146 auto game_state =
client_->GetGameState();
147 if (!game_state.ok())
return game_state.status();
149 auto& gs = *game_state;
156 return absl::OkStatus();
161 return absl::UnimplementedError(
162 "RunToBreakpoint not supported via Mesen2 Socket");
167 const std::string& condition,
const std::string& description) {
168 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
171 return absl::UnimplementedError(
172 "SPC700 breakpoints are not supported via Mesen2 Socket");
175 return absl::InvalidArgumentError(absl::StrFormat(
176 "Unsupported CPU kind for breakpoint: %d",
static_cast<int>(cpu)));
186 auto result =
client_->AddBreakpoint(addr, mesen_type, condition);
187 if (!result.ok())
return result.status();
189 return static_cast<uint32_t
>(*result);
193 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
194 return client_->RemoveBreakpoint(breakpoint_id);
199 return absl::UnimplementedError(
200 "ToggleBreakpoint not supported via Mesen2 Socket");
208 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
209 auto mapped_button = MapButton(button);
210 if (!mapped_button.ok())
return mapped_button.status();
211 return client_->SetButton(*mapped_button,
true);
215 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
216 auto mapped_button = MapButton(button);
217 if (!mapped_button.ok())
return mapped_button.status();
218 return client_->SetButton(*mapped_button,
false);
222 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
223 return client_->SaveState(slot);
227 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
228 return client_->LoadState(slot);
247 if (!
IsConnected())
return absl::UnavailableError(
"Not connected");
248 return client_->SetCollisionOverlay(enable);
absl::Status ReleaseButton(InputButton button) override
bool SupportsFeature(EmulatorFeature feature) const override
absl::Status GetGameState(GameSnapshot *out_state) override
std::unique_ptr< MesenSocketClient > client_
std::string GetLoadedRomPath() const override
absl::Status GetCpuState(CpuStateSnapshot *out_state) override
absl::StatusOr< uint8_t > ReadByte(uint32_t addr) override
absl::Status PressButton(InputButton button) override
absl::StatusOr< std::vector< uint8_t > > ReadBlock(uint32_t addr, size_t len) override
bool IsRunning() const override
absl::Status SetCollisionOverlay(bool enable) override
absl::Status WriteBlock(uint32_t addr, const std::vector< uint8_t > &data) override
absl::Status Step(int count) override
~MesenEmulatorAdapter() override
std::vector< BreakpointSnapshot > ListBreakpoints() override
absl::Status StepOver() override
absl::Status LoadState(int slot) override
absl::StatusOr< uint32_t > AddBreakpoint(uint32_t addr, BreakpointKind type, CpuKind cpu, const std::string &condition, const std::string &description) override
absl::Status ToggleBreakpoint(uint32_t breakpoint_id, bool enabled) override
absl::Status WriteByte(uint32_t addr, uint8_t val) override
absl::Status RemoveBreakpoint(uint32_t breakpoint_id) override
absl::Status Connect()
Explicitly connect to a Mesen2 socket (replaces auto-connect).
absl::Status StepOut() override
bool IsConnected() const override
absl::Status LoadRom(const std::string &path) override
absl::Status RunToBreakpoint(BreakpointHitResult *response) override
absl::Status SaveState(int slot) override
Unix socket client for Mesen2-OoS fork.
absl::StatusOr< emu::input::SnesButton > MapButton(InputButton button)
BreakpointType
Breakpoint types.
EmulatorFeature
Features that emulator backends may optionally support. Use with IEmulator::SupportsFeature() to quer...