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
14#include "app/emu/snes.h"
15#include "rom/rom.h"
16
17namespace yaze {
18namespace gfx {
19class IRenderer;
20} // namespace gfx
21
22namespace editor {
23class PanelManager;
24} // namespace editor
25
30namespace emu {
31
32// REMOVED: EmulatorKeybindings (ImGuiKey-based)
33// Now using ui::InputHandler with SDL_GetKeyboardState() for proper continuous
34// polling
35
40class Emulator {
41 public:
42 Emulator() = default;
43 ~Emulator();
45 const std::vector<uint8_t>& rom_data);
46 void Run(Rom* rom);
47 void Cleanup();
48
49 // Panel visibility managed by PanelManager (dependency injection)
51 panel_manager_ = manager;
52 }
53 void SetInputConfig(const input::InputConfig& config);
55 std::function<void(const input::InputConfig&)> callback) {
56 input_config_changed_callback_ = std::move(callback);
57 }
58
59 auto snes() -> Snes& { return snes_; }
60 auto running() const -> bool { return running_; }
62
63 // Headless mode for background audio (music editor)
64 // Initializes SNES and audio without requiring visible emulator window
65 bool EnsureInitialized(Rom* rom);
66 // Runs emulator frame without UI rendering (for background audio)
67 void RunFrameOnly();
68 // Runs audio-focused frame: CPU+APU cycles without PPU rendering
69 // Used by MusicEditor for authentic, low-overhead audio playback
70 void RunAudioFrame();
71 // Reset frame timing (call before starting playback to prevent time buildup)
72 void ResetFrameTiming();
73
74 // Audio backend access
78 void ResumeAudio(); // For WASM/WebAudio context resumption
79
80 // Set an external audio backend (for sharing between emulator instances)
81 // When set, this backend is used instead of the internal one
85 void set_audio_buffer(int16_t* audio_buffer) { audio_buffer_ = audio_buffer; }
86 auto set_audio_device_id(SDL_AudioDeviceID audio_device) {
87 audio_device_ = audio_device;
88 }
89 void set_use_sdl_audio_stream(bool enabled);
91 // Mark audio stream as already configured (prevents RunAudioFrame from overriding)
96 auto wanted_samples() const -> int { return wanted_samples_; }
97 auto wanted_frames() const -> float { return wanted_frames_; }
99
100 // Render access
102 void* ppu_texture() { return ppu_texture_; }
103
104 // Turbo mode
105 bool is_turbo_mode() const { return turbo_mode_; }
106 void set_turbo_mode(bool turbo) { turbo_mode_ = turbo; }
107
108 // Audio focus mode - use RunAudioFrame() for lower overhead audio playback
109 bool is_audio_focus_mode() const { return audio_focus_mode_; }
110 void set_audio_focus_mode(bool focus) { audio_focus_mode_ = focus; }
111
112 // Audio settings
113 void set_interpolation_type(int type);
114 int get_interpolation_type() const;
115
116 // Debugger access
120 return symbol_provider_;
121 }
124 bool is_debugging() const { return debugging_; }
125 void set_debugging(bool debugging) { debugging_ = debugging; }
126 bool is_initialized() const { return initialized_; }
127 bool is_snes_initialized() const { return snes_initialized_; }
128
129 // AI Agent Integration API
130 bool IsEmulatorReady() const { return snes_.running() && !rom_data_.empty(); }
131 double GetCurrentFPS() const { return current_fps_; }
132 uint64_t GetCurrentCycle() { return snes_.mutable_cycles(); }
133 uint16_t GetCPUPC() { return snes_.cpu().PC; }
134 uint8_t GetCPUB() { return snes_.cpu().DB; }
135 void StepSingleInstruction() { snes_.cpu().RunOpcode(); }
136 void SetBreakpoint(uint32_t address) { snes_.cpu().SetBreakpoint(address); }
137 void ClearAllBreakpoints() { snes_.cpu().ClearBreakpoints(); }
138 std::vector<uint32_t> GetBreakpoints() {
139 return snes_.cpu().GetBreakpoints();
140 }
141
142 // Performance monitoring for AI agents
144 double fps;
145 uint64_t cycles;
148 uint16_t cpu_pc;
149 uint8_t cpu_pb;
150 };
152 return {.fps = current_fps_,
153 .cycles = snes_.mutable_cycles(),
154 .audio_frames_queued =
155 audio_backend_ ? audio_backend_->GetStatus().queued_frames : 0,
156 .is_running = running_,
157 .cpu_pc = snes_.cpu().PC,
158 .cpu_pb = snes_.cpu().PB};
159 }
160
161 // Performance history (for ImPlot)
162 std::vector<float> FrameTimeHistory() const;
163 std::vector<float> FpsHistory() const;
164 std::vector<float> AudioQueueHistory() const;
165 std::vector<float> DmaBytesHistory() const;
166 std::vector<float> VramBytesHistory() const;
167 std::vector<float> AudioRmsLeftHistory() const;
168 std::vector<float> AudioRmsRightHistory() const;
169 std::vector<float> RomBankFreeBytes() const;
170
171 private:
172 void RenderNavBar();
174
175 void RenderSnesPpu();
177 void RenderMemoryViewer();
180 void RenderAIAgentPanel();
181 void RenderSaveStates();
183 void RenderApuDebugger();
184 void RenderAudioMixer();
185
186 struct Bookmark {
187 std::string name;
188 uint64_t value;
189 };
190 std::vector<Bookmark> bookmarks;
191
193 const std::vector<InstructionEntry>& instructionLog);
194
195 bool step_ = true;
196 bool power_ = false;
197 bool loading_ = false;
198 bool running_ = false;
199 bool turbo_mode_ = false;
200 bool audio_focus_mode_ = false; // Skip PPU rendering for audio playback
201
204
205 uint8_t manual_pb_ = 0;
206 uint16_t manual_pc_ = 0;
207
208 // timing
210 uint64_t last_count;
211 double time_adder = 0.0;
212
213 // FPS tracking
215 double fps_timer_ = 0.0;
216 double current_fps_ = 0.0;
217
218 // Recent history for plotting (public for helper functions)
219 public:
220 static constexpr int kMetricHistorySize = 240;
221 private:
222 std::array<float, kMetricHistorySize> frame_time_history_{};
223 std::array<float, kMetricHistorySize> fps_history_{};
224 std::array<float, kMetricHistorySize> audio_queue_history_{};
225 std::array<float, kMetricHistorySize> dma_bytes_history_{};
226 std::array<float, kMetricHistorySize> vram_bytes_history_{};
227 std::array<float, kMetricHistorySize> audio_rms_left_history_{};
228 std::array<float, kMetricHistorySize> audio_rms_right_history_{};
231 void PushFrameMetrics(float frame_ms, uint32_t audio_frames,
232 uint64_t dma_bytes, uint64_t vram_bytes,
233 float audio_rms_left, float audio_rms_right);
234
236 SDL_AudioDeviceID audio_device_;
237
238 // Audio backend abstraction
239 std::unique_ptr<audio::IAudioBackend> audio_backend_;
240 audio::IAudioBackend* external_audio_backend_ = nullptr; // Shared backend (not owned)
241
243 bool initialized_ = false;
244 bool snes_initialized_ = false;
245 bool debugging_ = false;
247 void* ppu_texture_ = nullptr;
248 bool use_sdl_audio_stream_ = true; // Enable resampling by default (32kHz -> 48kHz)
249 bool audio_stream_config_dirty_ = true; // Start dirty to ensure setup on first use
252
253 // Panel visibility managed by EditorPanelManager - no member variables needed!
254
255 // Debugger infrastructure
259
260 std::vector<uint8_t> rom_data_;
261
262 // Input handling (abstracted for SDL2/SDL3/custom backends)
266
267 // Panel manager for card visibility (injected)
269};
270
271} // namespace emu
272} // namespace yaze
273
274#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:40
std::array< float, kMetricHistorySize > audio_queue_history_
Definition emulator.h:224
gfx::IRenderer * renderer()
Definition emulator.h:101
void Initialize(gfx::IRenderer *renderer, const std::vector< uint8_t > &rom_data)
Definition emulator.cc:114
BreakpointManager & breakpoint_manager()
Definition emulator.h:117
debug::SymbolProvider & symbol_provider()
Definition emulator.h:118
void RenderModernCpuDebugger()
Definition emulator.cc:1033
std::unique_ptr< audio::IAudioBackend > audio_backend_
Definition emulator.h:239
auto wanted_samples() const -> int
Definition emulator.h:96
bool is_debugging() const
Definition emulator.h:124
std::vector< float > FrameTimeHistory() const
Definition emulator.cc:813
void set_turbo_mode(bool turbo)
Definition emulator.h:106
bool is_initialized() const
Definition emulator.h:126
void set_input_config_changed_callback(std::function< void(const input::InputConfig &)> callback)
Definition emulator.h:54
void SetInputConfig(const input::InputConfig &config)
Definition emulator.cc:76
std::array< float, kMetricHistorySize > vram_bytes_history_
Definition emulator.h:226
void * ppu_texture()
Definition emulator.h:102
bool IsEmulatorReady() const
Definition emulator.h:130
const debug::SymbolProvider & symbol_provider() const
Definition emulator.h:119
bool audio_stream_env_checked_
Definition emulator.h:251
static constexpr int kMetricHistorySize
Definition emulator.h:220
void set_use_sdl_audio_stream(bool enabled)
Definition emulator.cc:81
auto wanted_frames() const -> float
Definition emulator.h:97
double GetCurrentFPS() const
Definition emulator.h:131
std::vector< float > RomBankFreeBytes() const
Definition emulator.cc:848
void set_debugging(bool debugging)
Definition emulator.h:125
std::array< float, kMetricHistorySize > audio_rms_left_history_
Definition emulator.h:227
void set_audio_buffer(int16_t *audio_buffer)
Definition emulator.h:85
std::vector< float > AudioRmsRightHistory() const
Definition emulator.cc:843
bool is_audio_focus_mode() const
Definition emulator.h:109
audio::IAudioBackend * external_audio_backend_
Definition emulator.h:240
void SetBreakpoint(uint32_t address)
Definition emulator.h:136
bool audio_stream_config_dirty_
Definition emulator.h:249
void set_renderer(gfx::IRenderer *renderer)
Definition emulator.h:98
std::array< float, kMetricHistorySize > frame_time_history_
Definition emulator.h:222
uint64_t GetCurrentCycle()
Definition emulator.h:132
uint64_t count_frequency
Definition emulator.h:209
void set_interpolation_type(int type)
Definition emulator.cc:99
std::vector< float > VramBytesHistory() const
Definition emulator.cc:833
std::array< float, kMetricHistorySize > fps_history_
Definition emulator.h:223
std::vector< float > AudioQueueHistory() const
Definition emulator.cc:823
void RenderKeyboardConfig()
Definition emulator.cc:1285
std::vector< float > DmaBytesHistory() const
Definition emulator.cc:828
void SetExternalAudioBackend(audio::IAudioBackend *backend)
Definition emulator.h:82
debug::DisassemblyViewer disassembly_viewer_
Definition emulator.h:258
std::function< void(const input::InputConfig &) input_config_changed_callback_)
Definition emulator.h:265
bool use_sdl_audio_stream() const
Definition emulator.h:90
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:781
void StepSingleInstruction()
Definition emulator.h:135
std::vector< uint8_t > rom_data_
Definition emulator.h:260
debug::SymbolProvider symbol_provider_
Definition emulator.h:257
auto set_audio_device_id(SDL_AudioDeviceID audio_device)
Definition emulator.h:86
input::InputManager & input_manager()
Definition emulator.h:123
void RenderPerformanceMonitor()
Definition emulator.cc:1259
bool EnsureInitialized(Rom *rom)
Definition emulator.cc:179
bool is_turbo_mode() const
Definition emulator.h:105
debug::DisassemblyViewer & disassembly_viewer()
Definition emulator.h:122
input::InputConfig input_config_
Definition emulator.h:264
void RenderBreakpointList()
Definition emulator.cc:1023
BreakpointManager breakpoint_manager_
Definition emulator.h:256
editor::PanelManager * panel_manager_
Definition emulator.h:268
uint64_t last_count
Definition emulator.h:210
std::vector< float > FpsHistory() const
Definition emulator.cc:818
void set_audio_focus_mode(bool focus)
Definition emulator.h:110
std::vector< Bookmark > bookmarks
Definition emulator.h:190
input::InputManager input_manager_
Definition emulator.h:263
std::array< float, kMetricHistorySize > audio_rms_right_history_
Definition emulator.h:228
void set_running(bool running)
Definition emulator.h:61
uint16_t GetCPUPC()
Definition emulator.h:133
SDL_AudioDeviceID audio_device_
Definition emulator.h:236
bool is_snes_initialized() const
Definition emulator.h:127
uint16_t manual_pc_
Definition emulator.h:206
void RenderCpuInstructionLog(const std::vector< InstructionEntry > &instructionLog)
Definition emulator.cc:1269
std::vector< float > AudioRmsLeftHistory() const
Definition emulator.cc:838
void ClearAllBreakpoints()
Definition emulator.h:137
void Run(Rom *rom)
Definition emulator.cc:431
audio::IAudioBackend * audio_backend()
Definition emulator.h:75
std::array< float, kMetricHistorySize > dma_bytes_history_
Definition emulator.h:225
auto snes() -> Snes &
Definition emulator.h:59
auto running() const -> bool
Definition emulator.h:60
uint8_t GetCPUB()
Definition emulator.h:134
void mark_audio_stream_configured()
Definition emulator.h:92
void RenderEmulatorInterface()
Definition emulator.cc:869
EmulatorMetrics GetMetrics()
Definition emulator.h:151
int16_t * audio_buffer_
Definition emulator.h:235
gfx::IRenderer * renderer_
Definition emulator.h:246
void set_panel_manager(editor::PanelManager *manager)
Definition emulator.h:50
int get_interpolation_type() const
Definition emulator.cc:108
std::vector< uint32_t > GetBreakpoints()
Definition emulator.h:138
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)