yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
emulator.h
Go to the documentation of this file.
1#ifndef YAZE_APP_CORE_EMULATOR_H
2#define YAZE_APP_CORE_EMULATOR_H
3
4#include <array>
5#include <cstdint>
6#include <functional>
7#include <vector>
8
9#include "absl/status/status.h"
15#include "app/emu/snes.h"
16#include "rom/rom.h"
17
18namespace yaze {
19namespace gfx {
20class IRenderer;
21} // namespace gfx
22
23namespace editor {
24class WorkspaceWindowManager;
25} // namespace editor
26
31namespace emu {
32
33// REMOVED: EmulatorKeybindings (ImGuiKey-based)
34// Now using ui::InputHandler with SDL_GetKeyboardState() for proper continuous
35// polling
36
41class Emulator {
42 public:
43 Emulator() = default;
44 ~Emulator();
46 const std::vector<uint8_t>& rom_data);
47 void Run(Rom* rom);
48 void Cleanup();
49
50 // Window visibility managed by WorkspaceWindowManager (dependency injection)
54 void SetInputConfig(const input::InputConfig& config);
56 std::function<void(const input::InputConfig&)> callback) {
57 input_config_changed_callback_ = std::move(callback);
58 }
59
60 auto snes() -> Snes& { return snes_; }
61 auto running() const -> bool { return running_; }
63
64 // Headless mode for background audio (music editor)
65 // Initializes SNES and audio without requiring visible emulator window
66 bool EnsureInitialized(Rom* rom);
67 absl::Status ReloadRuntimeRom(const std::vector<uint8_t>& rom_data);
68 // Runs emulator frame without UI rendering (for background audio)
69 void RunFrameOnly();
70 // Runs audio-focused frame: CPU+APU cycles without PPU rendering
71 // Used by MusicEditor for authentic, low-overhead audio playback
72 void RunAudioFrame();
73 // Reset frame timing (call before starting playback to prevent time buildup)
74 void ResetFrameTiming();
75
76 // Audio backend access
80 void ResumeAudio(); // For WASM/WebAudio context resumption
81
82 // Set an external audio backend (for sharing between emulator instances)
83 // When set, this backend is used instead of the internal one
87 void set_audio_buffer(int16_t* audio_buffer) { audio_buffer_ = audio_buffer; }
88 auto set_audio_device_id(SDL_AudioDeviceID audio_device) {
89 audio_device_ = audio_device;
90 }
91 void set_use_sdl_audio_stream(bool enabled);
93 // Mark audio stream as already configured (prevents RunAudioFrame from overriding)
98 auto wanted_samples() const -> int { return wanted_samples_; }
99 auto wanted_frames() const -> float { return wanted_frames_; }
101
102 // Render access
104 void* ppu_texture() { return ppu_texture_; }
105
106 // Turbo mode
107 bool is_turbo_mode() const { return turbo_mode_; }
108 void set_turbo_mode(bool turbo) { turbo_mode_ = turbo; }
109
110 // Audio focus mode - use RunAudioFrame() for lower overhead audio playback
111 bool is_audio_focus_mode() const { return audio_focus_mode_; }
112 void set_audio_focus_mode(bool focus) { audio_focus_mode_ = focus; }
113
114 // Audio settings
115 void set_interpolation_type(int type);
116 int get_interpolation_type() const;
117
118 // Debugger access
122 return symbol_provider_;
123 }
126 bool is_debugging() const { return debugging_; }
127 void set_debugging(bool debugging) { debugging_ = debugging; }
128 bool is_initialized() const { return initialized_; }
129 bool is_snes_initialized() const { return snes_initialized_; }
130
131 // AI Agent Integration API
132 bool IsEmulatorReady() const { return snes_.running() && !rom_data_.empty(); }
133 double GetCurrentFPS() const { return current_fps_; }
134 uint64_t GetCurrentCycle() { return snes_.mutable_cycles(); }
135 uint16_t GetCPUPC() { return snes_.cpu().PC; }
136 uint8_t GetCPUB() { return snes_.cpu().DB; }
137 void StepSingleInstruction() { snes_.cpu().RunOpcode(); }
138 void SetBreakpoint(uint32_t address) { snes_.cpu().SetBreakpoint(address); }
139 void ClearAllBreakpoints() { snes_.cpu().ClearBreakpoints(); }
140 std::vector<uint32_t> GetBreakpoints() {
141 return snes_.cpu().GetBreakpoints();
142 }
143
144 // Performance monitoring for AI agents
146 double fps;
147 uint64_t cycles;
150 uint16_t cpu_pc;
151 uint8_t cpu_pb;
152 };
154 return {.fps = current_fps_,
155 .cycles = snes_.mutable_cycles(),
156 .audio_frames_queued =
157 audio_backend_ ? audio_backend_->GetStatus().queued_frames : 0,
158 .is_running = running_,
159 .cpu_pc = snes_.cpu().PC,
160 .cpu_pb = snes_.cpu().PB};
161 }
162
163 // Performance history (for ImPlot)
164 std::vector<float> FrameTimeHistory() const;
165 std::vector<float> FpsHistory() const;
166 std::vector<float> AudioQueueHistory() const;
167 std::vector<float> DmaBytesHistory() const;
168 std::vector<float> VramBytesHistory() const;
169 std::vector<float> AudioRmsLeftHistory() const;
170 std::vector<float> AudioRmsRightHistory() const;
171 std::vector<float> RomBankFreeBytes() const;
172
173 private:
174 void RenderNavBar();
176
177 void RenderSnesPpu();
179 void RenderMemoryViewer();
182 void RenderAIAgentPanel();
183 void RenderSaveStates();
185 void RenderApuDebugger();
186 void RenderAudioMixer();
187
188 struct Bookmark {
189 std::string name;
190 uint64_t value;
191 };
192 std::vector<Bookmark> bookmarks;
193
195 const std::vector<InstructionEntry>& instructionLog);
196
197 bool step_ = true;
198 bool power_ = false;
199 bool loading_ = false;
200 bool running_ = false;
201 bool turbo_mode_ = false;
202 bool audio_focus_mode_ = false; // Skip PPU rendering for audio playback
203
206
207 uint8_t manual_pb_ = 0;
208 uint16_t manual_pc_ = 0;
209
210 // timing
212 uint64_t last_count;
213 double time_adder = 0.0;
214
215 // FPS tracking
217 double fps_timer_ = 0.0;
218 double current_fps_ = 0.0;
219
220 // Recent history for plotting (public for helper functions)
221 public:
222 static constexpr int kMetricHistorySize = 240;
223 private:
224 std::array<float, kMetricHistorySize> frame_time_history_{};
225 std::array<float, kMetricHistorySize> fps_history_{};
226 std::array<float, kMetricHistorySize> audio_queue_history_{};
227 std::array<float, kMetricHistorySize> dma_bytes_history_{};
228 std::array<float, kMetricHistorySize> vram_bytes_history_{};
229 std::array<float, kMetricHistorySize> audio_rms_left_history_{};
230 std::array<float, kMetricHistorySize> audio_rms_right_history_{};
233 void PushFrameMetrics(float frame_ms, uint32_t audio_frames,
234 uint64_t dma_bytes, uint64_t vram_bytes,
235 float audio_rms_left, float audio_rms_right);
236
238 SDL_AudioDeviceID audio_device_;
239
240 // Audio backend abstraction
241 std::unique_ptr<audio::IAudioBackend> audio_backend_;
242 audio::IAudioBackend* external_audio_backend_ = nullptr; // Shared backend (not owned)
243
245 bool initialized_ = false;
246 bool snes_initialized_ = false;
247 bool debugging_ = false;
249 void* ppu_texture_ = nullptr;
250 bool use_sdl_audio_stream_ = true; // Enable resampling by default (32kHz -> 48kHz)
251 bool audio_stream_config_dirty_ = true; // Start dirty to ensure setup on first use
254
255 // Window visibility managed by WorkspaceWindowManager - no member variables needed!
256
257 // Debugger infrastructure
261
262 std::vector<uint8_t> rom_data_;
263
264 // Input handling (abstracted for SDL2/SDL3/custom backends)
268
269 // Panel manager for card visibility (injected)
271};
272
273} // namespace emu
274} // namespace yaze
275
276#endif // YAZE_APP_CORE_EMULATOR_H
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:28
Central registry for all editor cards with session awareness and dependency injection.
Manages CPU and SPC700 breakpoints for debugging.
A class for emulating and debugging SNES games.
Definition emulator.h:41
std::array< float, kMetricHistorySize > audio_queue_history_
Definition emulator.h:226
gfx::IRenderer * renderer()
Definition emulator.h:103
void Initialize(gfx::IRenderer *renderer, const std::vector< uint8_t > &rom_data)
Definition emulator.cc:114
BreakpointManager & breakpoint_manager()
Definition emulator.h:119
debug::SymbolProvider & symbol_provider()
Definition emulator.h:120
void RenderModernCpuDebugger()
Definition emulator.cc:1064
std::unique_ptr< audio::IAudioBackend > audio_backend_
Definition emulator.h:241
auto wanted_samples() const -> int
Definition emulator.h:98
bool is_debugging() const
Definition emulator.h:126
std::vector< float > FrameTimeHistory() const
Definition emulator.cc:844
void set_turbo_mode(bool turbo)
Definition emulator.h:108
bool is_initialized() const
Definition emulator.h:128
void set_input_config_changed_callback(std::function< void(const input::InputConfig &)> callback)
Definition emulator.h:55
void SetInputConfig(const input::InputConfig &config)
Definition emulator.cc:76
std::array< float, kMetricHistorySize > vram_bytes_history_
Definition emulator.h:228
void * ppu_texture()
Definition emulator.h:104
bool IsEmulatorReady() const
Definition emulator.h:132
const debug::SymbolProvider & symbol_provider() const
Definition emulator.h:121
bool audio_stream_env_checked_
Definition emulator.h:253
static constexpr int kMetricHistorySize
Definition emulator.h:222
void set_use_sdl_audio_stream(bool enabled)
Definition emulator.cc:81
auto wanted_frames() const -> float
Definition emulator.h:99
double GetCurrentFPS() const
Definition emulator.h:133
std::vector< float > RomBankFreeBytes() const
Definition emulator.cc:879
void set_window_manager(editor::WorkspaceWindowManager *manager)
Definition emulator.h:51
void set_debugging(bool debugging)
Definition emulator.h:127
std::array< float, kMetricHistorySize > audio_rms_left_history_
Definition emulator.h:229
void set_audio_buffer(int16_t *audio_buffer)
Definition emulator.h:87
std::vector< float > AudioRmsRightHistory() const
Definition emulator.cc:874
bool is_audio_focus_mode() const
Definition emulator.h:111
audio::IAudioBackend * external_audio_backend_
Definition emulator.h:242
void SetBreakpoint(uint32_t address)
Definition emulator.h:138
bool audio_stream_config_dirty_
Definition emulator.h:251
void set_renderer(gfx::IRenderer *renderer)
Definition emulator.h:100
std::array< float, kMetricHistorySize > frame_time_history_
Definition emulator.h:224
uint64_t GetCurrentCycle()
Definition emulator.h:134
uint64_t count_frequency
Definition emulator.h:211
void set_interpolation_type(int type)
Definition emulator.cc:99
std::vector< float > VramBytesHistory() const
Definition emulator.cc:864
std::array< float, kMetricHistorySize > fps_history_
Definition emulator.h:225
std::vector< float > AudioQueueHistory() const
Definition emulator.cc:854
void RenderKeyboardConfig()
Definition emulator.cc:1316
std::vector< float > DmaBytesHistory() const
Definition emulator.cc:859
void SetExternalAudioBackend(audio::IAudioBackend *backend)
Definition emulator.h:84
debug::DisassemblyViewer disassembly_viewer_
Definition emulator.h:260
std::function< void(const input::InputConfig &) input_config_changed_callback_)
Definition emulator.h:267
bool use_sdl_audio_stream() const
Definition emulator.h:92
void PushFrameMetrics(float frame_ms, uint32_t audio_frames, uint64_t dma_bytes, uint64_t vram_bytes, float audio_rms_left, float audio_rms_right)
Definition emulator.cc:812
void StepSingleInstruction()
Definition emulator.h:137
std::vector< uint8_t > rom_data_
Definition emulator.h:262
debug::SymbolProvider symbol_provider_
Definition emulator.h:259
auto set_audio_device_id(SDL_AudioDeviceID audio_device)
Definition emulator.h:88
input::InputManager & input_manager()
Definition emulator.h:125
void RenderPerformanceMonitor()
Definition emulator.cc:1290
bool EnsureInitialized(Rom *rom)
Definition emulator.cc:179
bool is_turbo_mode() const
Definition emulator.h:107
debug::DisassemblyViewer & disassembly_viewer()
Definition emulator.h:124
input::InputConfig input_config_
Definition emulator.h:266
void RenderBreakpointList()
Definition emulator.cc:1054
BreakpointManager breakpoint_manager_
Definition emulator.h:258
editor::WorkspaceWindowManager * window_manager_
Definition emulator.h:270
uint64_t last_count
Definition emulator.h:212
std::vector< float > FpsHistory() const
Definition emulator.cc:849
void set_audio_focus_mode(bool focus)
Definition emulator.h:112
std::vector< Bookmark > bookmarks
Definition emulator.h:192
input::InputManager input_manager_
Definition emulator.h:265
std::array< float, kMetricHistorySize > audio_rms_right_history_
Definition emulator.h:230
void set_running(bool running)
Definition emulator.h:62
uint16_t GetCPUPC()
Definition emulator.h:135
SDL_AudioDeviceID audio_device_
Definition emulator.h:238
bool is_snes_initialized() const
Definition emulator.h:129
uint16_t manual_pc_
Definition emulator.h:208
void RenderCpuInstructionLog(const std::vector< InstructionEntry > &instructionLog)
Definition emulator.cc:1300
std::vector< float > AudioRmsLeftHistory() const
Definition emulator.cc:869
void ClearAllBreakpoints()
Definition emulator.h:139
void Run(Rom *rom)
Definition emulator.cc:462
audio::IAudioBackend * audio_backend()
Definition emulator.h:77
std::array< float, kMetricHistorySize > dma_bytes_history_
Definition emulator.h:227
auto snes() -> Snes &
Definition emulator.h:60
auto running() const -> bool
Definition emulator.h:61
uint8_t GetCPUB()
Definition emulator.h:136
void mark_audio_stream_configured()
Definition emulator.h:94
void RenderEmulatorInterface()
Definition emulator.cc:900
EmulatorMetrics GetMetrics()
Definition emulator.h:153
int16_t * audio_buffer_
Definition emulator.h:237
absl::Status ReloadRuntimeRom(const std::vector< uint8_t > &rom_data)
Definition emulator.cc:258
gfx::IRenderer * renderer_
Definition emulator.h:248
int get_interpolation_type() const
Definition emulator.cc:108
std::vector< uint32_t > GetBreakpoints()
Definition emulator.h:140
auto mutable_cycles() -> uint64_t &
Definition snes.h:90
bool running() const
Definition snes.h:81
auto cpu() -> Cpu &
Definition snes.h:84
Abstract audio backend interface.
Advanced disassembly viewer with sparse storage and interactive features.
Provider for symbol (label) resolution in disassembly.
Defines an abstract interface for all rendering operations.
Definition irenderer.h:60
Input configuration (platform-agnostic key codes)