yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
snes.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EMU_SNES_H
2#define YAZE_APP_EMU_SNES_H
3
4#include <cstdint>
5#include <functional>
6#include <memory>
7
8#include "absl/status/status.h"
9
10#include "app/emu/audio/apu.h"
11#include "app/emu/cpu/cpu.h"
14#include "app/emu/video/ppu.h"
15
16namespace yaze {
17namespace emu {
18
19struct Input {
20 uint8_t type;
22 // for controller
23 uint16_t current_state_; // actual state from this frame
24 uint16_t latched_state_; // state being shifted out for serial read
25 uint16_t previous_state_; // state from previous frame for edge detection
26};
27
28class Snes {
29 public:
30 Snes() {
31 // Initialize input controllers to clean state
32 input1 = {};
33 input2 = {};
34
35 cpu_.callbacks().read_byte = [this](uint32_t adr) {
36 return CpuRead(adr);
37 };
38 cpu_.callbacks().write_byte = [this](uint32_t adr, uint8_t val) {
39 CpuWrite(adr, val);
40 };
41 cpu_.callbacks().idle = [this](bool waiting) {
42 CpuIdle(waiting);
43 };
44 }
45 ~Snes() = default;
46
47 void Init(const std::vector<uint8_t>& rom_data);
48 void Reset(bool hard = false);
49 void RunFrame();
50 void RunAudioFrame(); // Audio-focused frame: runs CPU+APU, skips PPU rendering
51 void CatchUpApu();
52 void HandleInput();
53 void RunCycle();
54 void RunCycles(int cycles);
55 void SyncCycles(bool start, int sync_cycles);
56
57 uint8_t ReadBBus(uint8_t adr);
58 uint8_t ReadReg(uint16_t adr);
59 uint8_t Rread(uint32_t adr);
60 uint8_t Read(uint32_t adr);
61
62 void WriteBBus(uint8_t adr, uint8_t val);
63 void WriteReg(uint16_t adr, uint8_t val);
64 void Write(uint32_t adr, uint8_t val);
65
66 int GetAccessTime(uint32_t adr);
67 uint8_t CpuRead(uint32_t adr);
68 void CpuWrite(uint32_t adr, uint8_t val);
69 void CpuIdle(bool waiting);
70 void InitAccessTime(bool recalc);
71 std::vector<uint8_t> access_time;
72
73 void SetSamples(int16_t* sample_data, int wanted_samples);
74 void SetPixels(uint8_t* pixel_data);
75 void SetButtonState(int player, int button, bool pressed);
76
77 absl::Status loadState(const std::string& path);
78 absl::Status saveState(const std::string& path);
79 absl::Status LoadLegacyState(std::istream& file);
80
81 bool running() const { return running_; }
82 bool audio_only_mode() const { return audio_only_mode_; }
83 void set_audio_only_mode(bool mode) { audio_only_mode_ = mode; }
84 auto cpu() -> Cpu& { return cpu_; }
85 auto ppu() -> Ppu& { return ppu_; }
86 auto apu() -> Apu& { return apu_; }
87 auto apu() const -> const Apu& { return apu_; }
88 auto memory() -> MemoryImpl& { return memory_; }
89 auto get_ram() -> uint8_t* { return ram; }
90 auto mutable_cycles() -> uint64_t& { return cycles_; }
91
92 // Input state accessors (for debugging UI)
93 uint16_t GetInput1State() const { return input1.current_state_; }
94 uint16_t GetInput2State() const { return input2.current_state_; }
95 uint16_t GetPortAutoRead(int index) const {
96 return (index >= 0 && index < 4) ? port_auto_read_[index] : 0;
97 }
98 bool IsAutoJoyReadEnabled() const { return auto_joy_read_; }
99
100 // Frame metrics
104 }
105 void AccumulateDmaBytes(uint32_t bytes) { dma_bytes_frame_ += bytes; }
106 void AccumulateVramBytes(uint32_t bytes) { vram_bytes_frame_ += bytes; }
107 uint64_t dma_bytes_frame() const { return dma_bytes_frame_; }
108 uint64_t vram_bytes_frame() const { return vram_bytes_frame_; }
109
110 // Audio debugging
114
115 bool fast_mem_ = false;
116
117 private:
122
123 std::vector<uint8_t> rom_data;
124
125 bool running_ = false;
126 bool audio_only_mode_ = false; // Skip PPU rendering for audio-focused playback
127
128 // ram
129 uint8_t ram[0x20000];
130 uint32_t ram_adr_;
131
132 // Frame timing
133 uint32_t frames_ = 0;
134 uint64_t cycles_ = 0;
135 uint64_t sync_cycle_ = 0;
136 uint64_t dma_bytes_frame_ = 0;
137 uint64_t vram_bytes_frame_ = 0;
140
141 // Nmi / Irq
142 bool h_irq_enabled_ = false;
143 bool v_irq_enabled_ = false;
144 bool nmi_enabled_ = false;
145 uint16_t h_timer_ = 0;
146 uint16_t v_timer_ = 0;
147 bool in_nmi_ = false;
148 bool irq_condition_ = false;
149 bool in_irq_ = false;
151
152 // Multiplication / Division
153 uint8_t multiply_a_;
155 uint16_t divide_a_;
157
158 // Joypad State
161 uint16_t port_auto_read_[4]; // as read by auto-joypad read
162 bool auto_joy_read_ = false;
163 uint16_t auto_joy_timer_ = 0;
165
166 // Audio debugging
168};
169
170} // namespace emu
171} // namespace yaze
172
173#endif // YAZE_APP_EMU_SNES_H
The Apu class represents the Audio Processing Unit (APU) of a system.
Definition apu.h:53
auto & callbacks()
Definition cpu.h:45
Implementation of the Memory interface for emulating memory in a SNES system.
Definition memory.h:118
bool nmi_enabled_
Definition snes.h:144
uint32_t frames_
Definition snes.h:133
Input input1
Definition snes.h:159
auto mutable_cycles() -> uint64_t &
Definition snes.h:90
void SetSamples(int16_t *sample_data, int wanted_samples)
Definition snes.cc:847
void CatchUpApu()
Definition snes.cc:267
auto apu() const -> const Apu &
Definition snes.h:87
uint8_t Rread(uint32_t adr)
Definition snes.cc:587
uint64_t dma_bytes_frame_
Definition snes.h:136
uint64_t cycles_
Definition snes.h:134
void RunCycles(int cycles)
Definition snes.cc:473
uint16_t v_timer_
Definition snes.h:146
auto apu_handshake_tracker() -> debug::ApuHandshakeTracker &
Definition snes.h:111
uint16_t port_auto_read_[4]
Definition snes.h:161
void WriteBBus(uint8_t adr, uint8_t val)
Definition snes.cc:626
uint8_t CpuRead(uint32_t adr)
Definition snes.cc:822
auto ppu() -> Ppu &
Definition snes.h:85
uint64_t vram_bytes_frame_
Definition snes.h:137
absl::Status saveState(const std::string &path)
Definition snes.cc:922
void SetButtonState(int player, int button, bool pressed)
Definition snes.cc:855
uint8_t Read(uint32_t adr)
Definition snes.cc:620
uint16_t h_timer_
Definition snes.h:145
std::vector< uint8_t > access_time
Definition snes.h:71
debug::ApuHandshakeTracker apu_handshake_tracker_
Definition snes.h:167
bool running() const
Definition snes.h:81
bool irq_condition_
Definition snes.h:148
bool audio_only_mode() const
Definition snes.h:82
~Snes()=default
bool h_irq_enabled_
Definition snes.h:142
bool audio_only_mode_
Definition snes.h:126
void Reset(bool hard=false)
Definition snes.cc:181
bool fast_mem_
Definition snes.h:115
uint64_t vram_bytes_frame() const
Definition snes.h:108
void RunFrame()
Definition snes.cc:229
uint8_t ReadReg(uint16_t adr)
Definition snes.cc:527
auto apu() -> Apu &
Definition snes.h:86
auto get_ram() -> uint8_t *
Definition snes.h:89
void CpuIdle(bool waiting)
Definition snes.cc:841
uint16_t divide_result_
Definition snes.h:156
void WriteReg(uint16_t adr, uint8_t val)
Definition snes.cc:674
void CpuWrite(uint32_t adr, uint8_t val)
Definition snes.cc:833
bool v_irq_enabled_
Definition snes.h:143
bool in_nmi_
Definition snes.h:147
uint16_t multiply_result_
Definition snes.h:154
void ResetFrameMetrics()
Definition snes.h:101
uint32_t next_horiz_event
Definition snes.h:139
bool in_irq_
Definition snes.h:149
uint8_t ReadBBus(uint8_t adr)
Definition snes.cc:494
bool running_
Definition snes.h:125
void Write(uint32_t adr, uint8_t val)
Definition snes.cc:770
auto cpu() -> Cpu &
Definition snes.h:84
uint64_t sync_cycle_
Definition snes.h:135
uint16_t divide_a_
Definition snes.h:155
void set_audio_only_mode(bool mode)
Definition snes.h:83
void InitAccessTime(bool recalc)
Definition snes.cc:1137
uint16_t GetInput2State() const
Definition snes.h:94
void RunAudioFrame()
Definition snes.cc:243
void Init(const std::vector< uint8_t > &rom_data)
Definition snes.cc:162
uint64_t dma_bytes_frame() const
Definition snes.h:107
bool auto_joy_read_
Definition snes.h:162
bool in_vblank_
Definition snes.h:150
bool IsAutoJoyReadEnabled() const
Definition snes.h:98
absl::Status LoadLegacyState(std::istream &file)
Definition snes.cc:880
void SyncCycles(bool start, int sync_cycles)
Definition snes.cc:483
void AccumulateDmaBytes(uint32_t bytes)
Definition snes.h:105
uint16_t GetInput1State() const
Definition snes.h:93
std::vector< uint8_t > rom_data
Definition snes.h:123
absl::Status loadState(const std::string &path)
Definition snes.cc:998
auto memory() -> MemoryImpl &
Definition snes.h:88
Input input2
Definition snes.h:160
uint8_t multiply_a_
Definition snes.h:153
void SetPixels(uint8_t *pixel_data)
Definition snes.cc:851
uint8_t ram[0x20000]
Definition snes.h:129
uint16_t auto_joy_timer_
Definition snes.h:163
void HandleInput()
Definition snes.cc:273
void AccumulateVramBytes(uint32_t bytes)
Definition snes.h:106
MemoryImpl memory_
Definition snes.h:118
uint16_t GetPortAutoRead(int index) const
Definition snes.h:95
void RunCycle()
Definition snes.cc:315
bool ppu_latch_
Definition snes.h:164
uint32_t ram_adr_
Definition snes.h:130
double apu_catchup_cycles_
Definition snes.h:138
int GetAccessTime(uint32_t adr)
Definition snes.cc:806
IPL ROM handshake tracker.
uint16_t current_state_
Definition snes.h:23
bool latch_line_
Definition snes.h:21
uint8_t type
Definition snes.h:20
uint16_t previous_state_
Definition snes.h:25
uint16_t latched_state_
Definition snes.h:24