yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
emulator_service_impl.cc
Go to the documentation of this file.
2
4
5#include <grpcpp/grpcpp.h>
6#include <iostream>
7#include <thread>
8#include <chrono>
9#include <fstream>
10#include <unordered_set>
11
12#include "emu/emulator.h"
13#include "rom/rom.h"
16
17namespace yaze::net {
18
19namespace {
20emu::input::SnesButton ToSnesButton(agent::Button button) {
22 switch (button) {
23 case agent::A: return SnesButton::A;
24 case agent::B: return SnesButton::B;
25 case agent::X: return SnesButton::X;
26 case agent::Y: return SnesButton::Y;
27 case agent::L: return SnesButton::L;
28 case agent::R: return SnesButton::R;
29 case agent::SELECT: return SnesButton::SELECT;
30 case agent::START: return SnesButton::START;
31 case agent::UP: return SnesButton::UP;
32 case agent::DOWN: return SnesButton::DOWN;
33 case agent::LEFT: return SnesButton::LEFT;
34 case agent::RIGHT: return SnesButton::RIGHT;
35 default: return SnesButton::B;
36 }
37}
38
39emu::BreakpointManager::Type ToBreakpointType(agent::BreakpointType proto_type) {
41 switch (proto_type) {
42 case agent::EXECUTE: return BreakpointManager::Type::EXECUTE;
43 case agent::READ: return BreakpointManager::Type::READ;
44 case agent::WRITE: return BreakpointManager::Type::WRITE;
45 case agent::ACCESS: return BreakpointManager::Type::ACCESS;
46 case agent::CONDITIONAL: return BreakpointManager::Type::CONDITIONAL;
47 default: return BreakpointManager::Type::EXECUTE;
48 }
49}
50
51emu::BreakpointManager::CpuType ToCpuType(agent::CpuType proto_cpu) {
53 switch (proto_cpu) {
54 case agent::CPU_65816: return BreakpointManager::CpuType::CPU_65816;
55 case agent::SPC700: return BreakpointManager::CpuType::SPC700;
56 default: return BreakpointManager::CpuType::CPU_65816;
57 }
58}
59
62 switch (type) {
63 case BreakpointManager::Type::EXECUTE: return agent::EXECUTE;
64 case BreakpointManager::Type::READ: return agent::READ;
65 case BreakpointManager::Type::WRITE: return agent::WRITE;
66 case BreakpointManager::Type::ACCESS: return agent::ACCESS;
67 case BreakpointManager::Type::CONDITIONAL: return agent::CONDITIONAL;
68 default: return agent::EXECUTE;
69 }
70}
71
74 switch (cpu) {
75 case BreakpointManager::CpuType::CPU_65816: return agent::CPU_65816;
76 case BreakpointManager::CpuType::SPC700: return agent::SPC700;
77 default: return agent::CPU_65816;
78 }
79}
80} // namespace
81
83 RomGetter rom_getter,
84 RomLoader rom_loader)
85 : emulator_(emulator), rom_getter_(rom_getter), rom_loader_(rom_loader) {}
86
87// --- ROM Loading ---
88
90 grpc::ServerContext* context, const agent::LoadRomRequest* request,
91 agent::LoadRomResponse* response) {
92 if (!rom_loader_) {
93 response->set_success(false);
94 response->set_message("ROM loading not available (no loader callback set)");
95 return grpc::Status::OK;
96 }
97
98 const std::string& filepath = request->filepath();
99 if (filepath.empty()) {
100 response->set_success(false);
101 response->set_message("Filepath is required");
102 return grpc::Status::OK;
103 }
104
105 bool success = rom_loader_(filepath);
106 if (success) {
107 response->set_success(true);
108 response->set_message("ROM loaded successfully");
109 // Get ROM info if available
110 if (rom_getter_) {
111 Rom* rom = rom_getter_();
112 if (rom && rom->is_loaded()) {
113 response->set_rom_title(rom->title());
114 response->set_rom_size(rom->size());
115 }
116 }
117 } else {
118 response->set_success(false);
119 response->set_message("Failed to load ROM: " + filepath);
120 }
121 return grpc::Status::OK;
122}
123
125 grpc::ServerContext* context, const agent::Empty* request,
126 agent::LoadedRomPathResponse* response) {
127 if (!rom_getter_) {
128 response->set_has_rom(false);
129 return grpc::Status::OK;
130 }
131
132 Rom* rom = rom_getter_();
133 if (rom && rom->is_loaded()) {
134 response->set_has_rom(true);
135 response->set_filepath(rom->filename());
136 response->set_title(rom->title());
137 } else {
138 response->set_has_rom(false);
139 }
140 return grpc::Status::OK;
141}
142
143void EmulatorServiceImpl::CaptureCPUState(agent::CPUState* state) {
144 auto& cpu = emulator_->snes().cpu();
145 state->set_a(cpu.A);
146 state->set_x(cpu.X);
147 state->set_y(cpu.Y);
148 state->set_pc(cpu.PC);
149 state->set_pb(cpu.PB);
150 state->set_db(cpu.DB);
151 state->set_sp(cpu.SP());
152 state->set_d(cpu.D);
153 state->set_status(cpu.status);
154 state->set_flag_n(cpu.GetNegativeFlag());
155 state->set_flag_v(cpu.GetOverflowFlag());
156 state->set_flag_z(cpu.GetZeroFlag());
157 state->set_flag_c(cpu.GetCarryFlag());
158 state->set_cycles(emulator_->GetCurrentCycle());
159}
160
161// --- Core Lifecycle & Control ---
162
163grpc::Status EmulatorServiceImpl::ControlEmulator(grpc::ServerContext* context,
164 const agent::ControlRequest* request,
165 agent::CommandResponse* response) {
166 if (!emulator_) return grpc::Status(grpc::StatusCode::UNAVAILABLE, "Emulator not initialized.");
167
168 std::string action = request->action();
169 if (action == "start" || action == "resume") {
170 emulator_->set_running(true);
171 response->set_message("Emulator started/resumed.");
172 } else if (action == "stop" || action == "pause") {
173 emulator_->set_running(false);
174 response->set_message("Emulator stopped/paused.");
175 } else if (action == "reset") {
176 emulator_->snes().Reset(true);
177 response->set_message("Emulator reset.");
178 } else if (action == "init" || action == "initialize") {
179 Rom* rom = rom_getter_ ? rom_getter_() : nullptr;
180 if (rom && rom->is_loaded()) {
182 response->set_message("Emulator initialized with active ROM.");
183 } else {
184 return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "ROM not loaded in core.");
185 }
186 } else {
187 return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, "Unknown action: " + action);
188 }
189
190 response->set_success(true);
191 return grpc::Status::OK;
192}
193
194grpc::Status EmulatorServiceImpl::StepEmulator(grpc::ServerContext* context,
195 const agent::StepControlRequest* request,
196 agent::StepResponse* response) {
198 return grpc::Status(grpc::StatusCode::UNAVAILABLE, "SNES is not initialized.");
199 }
200
201 std::string mode = request->mode();
202 if (mode == "instruction") {
204 response->set_message("Stepped 1 instruction.");
205 } else if (mode == "over") {
207 auto result = step_controller_.StepOver();
208 response->set_message(result.message);
209 } else if (mode == "out") {
211 auto result = step_controller_.StepOut();
212 response->set_message(result.message);
213 } else {
214 return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, "Unknown step mode: " + mode);
215 }
216
217 CaptureCPUState(response->mutable_cpu_state());
218 response->set_success(true);
219 return grpc::Status::OK;
220}
221
222grpc::Status EmulatorServiceImpl::RunToBreakpoint(grpc::ServerContext* context,
223 const agent::Empty* request,
224 agent::BreakpointHitResponse* response) {
226 return grpc::Status(grpc::StatusCode::UNAVAILABLE, "SNES is not initialized.");
227 }
228
229 const int kMaxInstructions = 1000000;
230 int instruction_count = 0;
231 auto& bp_manager = emulator_->breakpoint_manager();
232 auto& cpu = emulator_->snes().cpu();
233
234 while (instruction_count++ < kMaxInstructions) {
235 uint32_t pc = (cpu.PB << 16) | cpu.PC;
236 if (bp_manager.ShouldBreakOnExecute(pc, emu::BreakpointManager::CpuType::CPU_65816)) {
237 response->set_hit(true);
238 auto* last_hit = bp_manager.GetLastHit();
239 if (last_hit) {
240 auto* bp_info = response->mutable_breakpoint();
241 bp_info->set_id(last_hit->id);
242 bp_info->set_address(last_hit->address);
243 bp_info->set_type(ToProtoBreakpointType(last_hit->type));
244 bp_info->set_cpu(ToProtoCpuType(last_hit->cpu));
245 bp_info->set_enabled(last_hit->enabled);
246 }
247 CaptureCPUState(response->mutable_cpu_state());
248 return grpc::Status::OK;
249 }
251 }
252 response->set_hit(false);
253 return grpc::Status::OK;
254}
255
256// --- Input & State ---
257
258grpc::Status EmulatorServiceImpl::PressButtons(grpc::ServerContext* context,
259 const agent::ButtonRequest* request,
260 agent::CommandResponse* response) {
261 if (!emulator_) return grpc::Status(grpc::StatusCode::UNAVAILABLE, "Emulator not initialized.");
262 auto& input_manager = emulator_->input_manager();
263 for (int i = 0; i < request->buttons_size(); i++) {
264 input_manager.PressButton(ToSnesButton(static_cast<agent::Button>(request->buttons(i))));
265 }
266 std::this_thread::sleep_for(std::chrono::milliseconds(50));
267 for (int i = 0; i < request->buttons_size(); i++) {
268 input_manager.ReleaseButton(ToSnesButton(static_cast<agent::Button>(request->buttons(i))));
269 }
270 response->set_success(true);
271 return grpc::Status::OK;
272}
273
274grpc::Status EmulatorServiceImpl::ReleaseButtons(grpc::ServerContext* context,
275 const agent::ButtonRequest* request,
276 agent::CommandResponse* response) {
277 if (!emulator_) return grpc::Status(grpc::StatusCode::UNAVAILABLE, "Emulator not initialized.");
278 auto& input_manager = emulator_->input_manager();
279 for (int i = 0; i < request->buttons_size(); i++) {
280 input_manager.ReleaseButton(ToSnesButton(static_cast<agent::Button>(request->buttons(i))));
281 }
282 response->set_success(true);
283 return grpc::Status::OK;
284}
285
286grpc::Status EmulatorServiceImpl::HoldButtons(grpc::ServerContext* context,
287 const agent::ButtonHoldRequest* request,
288 agent::CommandResponse* response) {
289 if (!emulator_) return grpc::Status(grpc::StatusCode::UNAVAILABLE, "Emulator not initialized.");
290 auto& input_manager = emulator_->input_manager();
291 for (int i = 0; i < request->buttons_size(); i++) {
292 input_manager.PressButton(ToSnesButton(static_cast<agent::Button>(request->buttons(i))));
293 }
294 std::this_thread::sleep_for(std::chrono::milliseconds(request->duration_ms()));
295 for (int i = 0; i < request->buttons_size(); i++) {
296 input_manager.ReleaseButton(ToSnesButton(static_cast<agent::Button>(request->buttons(i))));
297 }
298 response->set_success(true);
299 return grpc::Status::OK;
300}
301
302grpc::Status EmulatorServiceImpl::GetGameState(grpc::ServerContext* context,
303 const agent::GameStateRequest* request,
304 agent::GameStateResponse* response) {
306 return grpc::Status(grpc::StatusCode::UNAVAILABLE, "SNES is not initialized.");
307 }
308 auto& memory = emulator_->snes().memory();
309 response->set_game_mode(memory.ReadByte(0x7E0010));
310 response->set_link_state(memory.ReadByte(0x7E005D));
311 response->set_link_pos_x(memory.ReadWord(0x7E0020));
312 response->set_link_pos_y(memory.ReadWord(0x7E0022));
313 response->set_link_health(memory.ReadByte(0x7EF36D));
314
315 for (const auto& mem_req : request->memory_reads()) {
316 auto* mem_resp = response->add_memory_responses();
317 mem_resp->set_address(mem_req.address());
318 std::vector<uint8_t> data(mem_req.size());
319 for (uint32_t i = 0; i < mem_req.size(); ++i) {
320 data[i] = memory.ReadByte(mem_req.address() + i);
321 }
322 mem_resp->set_data(data.data(), data.size());
323 }
324
325#ifdef YAZE_WITH_GRPC
326 if (request->include_screenshot()) {
327 auto screenshot = yaze::test::CaptureHarnessScreenshot();
328 if (screenshot.ok()) {
329 std::ifstream file(screenshot->file_path, std::ios::binary);
330 if (file.good()) {
331 std::string png_data((std::istreambuf_iterator<char>(file)),
332 std::istreambuf_iterator<char>());
333 response->set_screenshot_png(png_data);
334 }
335 }
336 }
337#endif
338 return grpc::Status::OK;
339}
340
341grpc::Status EmulatorServiceImpl::ReadMemory(grpc::ServerContext* context,
342 const agent::MemoryRequest* request,
343 agent::MemoryResponse* response) {
345 return grpc::Status(grpc::StatusCode::UNAVAILABLE, "SNES is not initialized.");
346 }
347 // Use Snes::Read() for proper memory mapping (WRAM, registers, etc.)
348 auto& snes = emulator_->snes();
349 response->set_address(request->address());
350 std::vector<uint8_t> data(request->size());
351 for (uint32_t i = 0; i < request->size(); ++i) {
352 data[i] = snes.Read(request->address() + i);
353 }
354 response->set_data(data.data(), data.size());
355 return grpc::Status::OK;
356}
357
358grpc::Status EmulatorServiceImpl::WriteMemory(grpc::ServerContext* context,
359 const agent::MemoryWriteRequest* request,
360 agent::CommandResponse* response) {
362 return grpc::Status(grpc::StatusCode::UNAVAILABLE, "SNES is not initialized.");
363 }
364 auto& memory = emulator_->snes().memory();
365 const std::string& data = request->data();
366 for (uint32_t i = 0; i < data.size(); ++i) {
367 memory.WriteByte(request->address() + i, static_cast<uint8_t>(data[i]));
368 }
369 response->set_success(true);
370 return grpc::Status::OK;
371}
372
373// --- Debugging Management ---
374
375grpc::Status EmulatorServiceImpl::BreakpointControl(grpc::ServerContext* context,
376 const agent::BreakpointControlRequest* request,
377 agent::BreakpointControlResponse* response) {
378 if (!emulator_) return grpc::Status(grpc::StatusCode::UNAVAILABLE, "Emulator not initialized.");
379 auto& bp_manager = emulator_->breakpoint_manager();
380 std::string action = request->action();
381
382 if (action == "add") {
383 uint32_t id = bp_manager.AddBreakpoint(request->address(), ToBreakpointType(request->type()), ToCpuType(request->cpu()), request->condition(), request->description());
384 response->set_breakpoint_id(id);
385 response->set_message("Breakpoint added.");
386 } else if (action == "remove") {
387 bp_manager.RemoveBreakpoint(request->id());
388 response->set_message("Breakpoint removed.");
389 } else if (action == "toggle") {
390 bp_manager.SetEnabled(request->id(), request->enabled());
391 response->set_message("Breakpoint toggled.");
392 } else if (action == "list") {
393 auto breakpoints = bp_manager.GetAllBreakpoints();
394 for (const auto& bp : breakpoints) {
395 auto* info = response->add_breakpoints();
396 info->set_id(bp.id);
397 info->set_address(bp.address);
398 info->set_type(ToProtoBreakpointType(bp.type));
399 info->set_cpu(ToProtoCpuType(bp.cpu));
400 info->set_enabled(bp.enabled);
401 }
402 } else {
403 return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, "Unknown action: " + action);
404 }
405
406 response->set_success(true);
407 return grpc::Status::OK;
408}
409
410grpc::Status EmulatorServiceImpl::WatchpointControl(grpc::ServerContext* context,
411 const agent::WatchpointControlRequest* request,
412 agent::WatchpointControlResponse* response) {
413 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "WatchpointManager integration pending.");
414}
415
416// --- Analysis & Symbols ---
417
418grpc::Status EmulatorServiceImpl::GetDisassembly(grpc::ServerContext* context,
419 const agent::DisassemblyRequest* request,
420 agent::DisassemblyResponse* response) {
421 if (!emulator_ || !emulator_->is_snes_initialized()) return grpc::Status(grpc::StatusCode::UNAVAILABLE, "SNES not initialized.");
422
424 auto& memory = emulator_->snes().memory();
425 auto& cpu = emulator_->snes().cpu();
426
427 uint32_t addr = request->start_address();
428 for (uint32_t i = 0; i < request->count(); ++i) {
429 auto inst = dis.Disassemble(addr, [&memory](uint32_t a){ return memory.ReadByte(a); }, cpu.GetAccumulatorSize(), cpu.GetIndexSize());
430 auto* line = response->add_lines();
431 line->set_address(inst.address);
432 line->set_mnemonic(inst.mnemonic);
433 line->set_operand_str(inst.operand_str);
434 addr += inst.size;
435 }
436 return grpc::Status::OK;
437}
438
439grpc::Status EmulatorServiceImpl::GetExecutionTrace(grpc::ServerContext* context,
440 const agent::TraceRequest* request,
441 agent::TraceResponse* response) {
442 return grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "Trace not implemented.");
443}
444
445grpc::Status EmulatorServiceImpl::ResolveSymbol(grpc::ServerContext* context,
446 const agent::SymbolLookupRequest* request,
447 agent::SymbolLookupResponse* response) {
448 auto sym = symbol_provider_.FindSymbol(request->symbol_name());
449 if (sym) {
450 response->set_found(true);
451 response->set_symbol_name(sym->name);
452 response->set_address(sym->address);
453 }
454 return grpc::Status::OK;
455}
456
457grpc::Status EmulatorServiceImpl::GetSymbolAt(grpc::ServerContext* context,
458 const agent::AddressRequest* request,
459 agent::SymbolLookupResponse* response) {
460 auto sym = symbol_provider_.GetSymbol(request->address());
461 if (sym) {
462 response->set_found(true);
463 response->set_symbol_name(sym->name);
464 response->set_address(sym->address);
465 }
466 return grpc::Status::OK;
467}
468
469grpc::Status EmulatorServiceImpl::LoadSymbols(grpc::ServerContext* context,
470 const agent::SymbolFileRequest* request,
471 agent::CommandResponse* response) {
472 auto status = symbol_provider_.LoadSymbolFile(request->filepath(), (yaze::emu::debug::SymbolFormat)request->format());
473 response->set_success(status.ok());
474 response->set_message(std::string(status.message()));
475 return grpc::Status::OK;
476}
477
478// --- Session & Experiments ---
479
480grpc::Status EmulatorServiceImpl::GetDebugStatus(grpc::ServerContext* context,
481 const agent::Empty* request,
482 agent::DebugStatusResponse* response) {
483 if (!emulator_) return grpc::Status(grpc::StatusCode::UNAVAILABLE, "Emulator not initialized.");
484 response->set_is_running(emulator_->running());
485 CaptureCPUState(response->mutable_cpu_state());
486 response->set_active_breakpoints(emulator_->breakpoint_manager().GetAllBreakpoints().size());
487 return grpc::Status::OK;
488}
489
490grpc::Status EmulatorServiceImpl::TestRun(grpc::ServerContext* context,
491 const agent::TestRunRequest* request,
492 agent::TestRunResponse* response) {
493 if (!emulator_ || !emulator_->is_snes_initialized()) return grpc::Status(grpc::StatusCode::UNAVAILABLE, "SNES not initialized.");
494 auto& snes = emulator_->snes();
495 auto& cpu = snes.cpu();
496 auto& memory = snes.memory();
497
498 uint32_t addr = request->address();
499 const std::string& data = request->data();
500 for (size_t i = 0; i < data.size(); ++i) { memory.WriteByte(addr + i, (uint8_t)data[i]); }
501
502 bool was_running = emulator_->running();
503 emulator_->set_running(false);
504 cpu.PB = (addr >> 16) & 0xFF;
505 cpu.PC = addr & 0xFFFF;
506
507 uint32_t frames = request->frame_count() > 0 ? request->frame_count() : 60;
508 for (uint32_t i = 0; i < frames; ++i) {
510 if (cpu.PC == 0 && cpu.PB == 0) { response->set_crashed(true); break; }
511 }
512
513 CaptureCPUState(response->mutable_final_cpu_state());
514 emulator_->set_running(was_running);
515 response->set_success(!response->crashed());
516 return grpc::Status::OK;
517}
518
520 auto& memory = emulator_->snes().memory();
521 auto& cpu = emulator_->snes().cpu();
522 step_controller_.SetMemoryReader([&memory](uint32_t addr) -> uint8_t { return memory.ReadByte(addr); });
524 step_controller_.SetPcGetter([&cpu]() -> uint32_t { return (cpu.PB << 16) | cpu.PC; });
525}
526
527} // namespace yaze::net
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:24
auto filename() const
Definition rom.h:141
auto size() const
Definition rom.h:134
bool is_loaded() const
Definition rom.h:128
auto title() const
Definition rom.h:133
Manages CPU and SPC700 breakpoints for debugging.
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.
Definition emulator.h:39
BreakpointManager & breakpoint_manager()
Definition emulator.h:116
uint64_t GetCurrentCycle()
Definition emulator.h:127
void StepSingleInstruction()
Definition emulator.h:130
input::InputManager & input_manager()
Definition emulator.h:118
bool EnsureInitialized(Rom *rom)
Definition emulator.cc:178
void set_running(bool running)
Definition emulator.h:60
bool is_snes_initialized() const
Definition emulator.h:122
auto snes() -> Snes &
Definition emulator.h:58
auto running() const -> bool
Definition emulator.h:59
65816 CPU disassembler for debugging and ROM hacking
DisassembledInstruction Disassemble(uint32_t address, MemoryReader read_byte, bool m_flag=true, bool x_flag=true) const
Disassemble a single instruction.
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.
absl::Status LoadSymbolFile(const std::string &path, SymbolFormat format=SymbolFormat::kAuto)
Load symbols from a .sym file (various formats)
std::optional< Symbol > GetSymbol(uint32_t address) const
Get full symbol info for an address.
std::optional< Symbol > FindSymbol(const std::string &name) const
Find symbol by name.
void PressButton(SnesButton button)
void ReleaseButton(SnesButton button)
grpc::Status GetSymbolAt(grpc::ServerContext *context, const agent::AddressRequest *request, agent::SymbolLookupResponse *response) override
std::function< bool(const std::string &path)> RomLoader
grpc::Status ControlEmulator(grpc::ServerContext *context, const agent::ControlRequest *request, agent::CommandResponse *response) override
yaze::emu::debug::StepController step_controller_
grpc::Status TestRun(grpc::ServerContext *context, const agent::TestRunRequest *request, agent::TestRunResponse *response) override
grpc::Status GetDebugStatus(grpc::ServerContext *context, const agent::Empty *request, agent::DebugStatusResponse *response) override
grpc::Status WriteMemory(grpc::ServerContext *context, const agent::MemoryWriteRequest *request, agent::CommandResponse *response) override
grpc::Status ReleaseButtons(grpc::ServerContext *context, const agent::ButtonRequest *request, agent::CommandResponse *response) override
grpc::Status PressButtons(grpc::ServerContext *context, const agent::ButtonRequest *request, agent::CommandResponse *response) override
grpc::Status GetGameState(grpc::ServerContext *context, const agent::GameStateRequest *request, agent::GameStateResponse *response) override
grpc::Status BreakpointControl(grpc::ServerContext *context, const agent::BreakpointControlRequest *request, agent::BreakpointControlResponse *response) override
grpc::Status GetDisassembly(grpc::ServerContext *context, const agent::DisassemblyRequest *request, agent::DisassemblyResponse *response) override
grpc::Status LoadSymbols(grpc::ServerContext *context, const agent::SymbolFileRequest *request, agent::CommandResponse *response) override
yaze::emu::debug::SymbolProvider symbol_provider_
grpc::Status ReadMemory(grpc::ServerContext *context, const agent::MemoryRequest *request, agent::MemoryResponse *response) override
grpc::Status StepEmulator(grpc::ServerContext *context, const agent::StepControlRequest *request, agent::StepResponse *response) override
grpc::Status HoldButtons(grpc::ServerContext *context, const agent::ButtonHoldRequest *request, agent::CommandResponse *response) override
grpc::Status LoadRom(grpc::ServerContext *context, const agent::LoadRomRequest *request, agent::LoadRomResponse *response) override
EmulatorServiceImpl(yaze::emu::Emulator *emulator, RomGetter rom_getter=nullptr, RomLoader rom_loader=nullptr)
grpc::Status GetLoadedRomPath(grpc::ServerContext *context, const agent::Empty *request, agent::LoadedRomPathResponse *response) override
grpc::Status ResolveSymbol(grpc::ServerContext *context, const agent::SymbolLookupRequest *request, agent::SymbolLookupResponse *response) override
grpc::Status GetExecutionTrace(grpc::ServerContext *context, const agent::TraceRequest *request, agent::TraceResponse *response) override
grpc::Status RunToBreakpoint(grpc::ServerContext *context, const agent::Empty *request, agent::BreakpointHitResponse *response) override
void CaptureCPUState(agent::CPUState *state)
grpc::Status WatchpointControl(grpc::ServerContext *context, const agent::WatchpointControlRequest *request, agent::WatchpointControlResponse *response) override
SymbolFormat
Supported symbol file formats.
SnesButton
SNES controller button mapping (platform-agnostic)
agent::CpuType ToProtoCpuType(emu::BreakpointManager::CpuType cpu)
agent::BreakpointType ToProtoBreakpointType(emu::BreakpointManager::Type type)
emu::BreakpointManager::Type ToBreakpointType(agent::BreakpointType proto_type)
emu::BreakpointManager::CpuType ToCpuType(agent::CpuType proto_cpu)
emu::input::SnesButton ToSnesButton(agent::Button button)