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 "app/emu/audio/apu.h"
9#include "app/emu/cpu/cpu.h"
12#include "app/emu/video/ppu.h"
13
14namespace yaze {
15namespace emu {
16
17struct Input {
18 uint8_t type;
20 // for controller
21 uint16_t current_state_; // actual state
23};
24
25class Snes {
26 public:
27 Snes() {
28 // Initialize input controllers to clean state
29 input1 = {};
30 input2 = {};
31
32 cpu_.callbacks().read_byte = [this](uint32_t adr) { return CpuRead(adr); };
33 cpu_.callbacks().write_byte = [this](uint32_t adr, uint8_t val) { CpuWrite(adr, val); };
34 cpu_.callbacks().idle = [this](bool waiting) { CpuIdle(waiting); };
35 }
36 ~Snes() = default;
37
38 void Init(std::vector<uint8_t>& rom_data);
39 void Reset(bool hard = false);
40 void RunFrame();
41 void CatchUpApu();
42 void HandleInput();
43 void RunCycle();
44 void RunCycles(int cycles);
45 void SyncCycles(bool start, int sync_cycles);
46
47 uint8_t ReadBBus(uint8_t adr);
48 uint8_t ReadReg(uint16_t adr);
49 uint8_t Rread(uint32_t adr);
50 uint8_t Read(uint32_t adr);
51
52 void WriteBBus(uint8_t adr, uint8_t val);
53 void WriteReg(uint16_t adr, uint8_t val);
54 void Write(uint32_t adr, uint8_t val);
55
56 int GetAccessTime(uint32_t adr);
57 uint8_t CpuRead(uint32_t adr);
58 void CpuWrite(uint32_t adr, uint8_t val);
59 void CpuIdle(bool waiting);
60 void InitAccessTime(bool recalc);
61 std::vector<uint8_t> access_time;
62
63 void SetSamples(int16_t* sample_data, int wanted_samples);
64 void SetPixels(uint8_t* pixel_data);
65 void SetButtonState(int player, int button, bool pressed);
66
67 void loadState(const std::string& path);
68 void saveState(const std::string& path);
69
70 bool running() const { return running_; }
71 auto cpu() -> Cpu& { return cpu_; }
72 auto ppu() -> Ppu& { return ppu_; }
73 auto apu() -> Apu& { return apu_; }
74 auto memory() -> MemoryImpl& { return memory_; }
75 auto get_ram() -> uint8_t* { return ram; }
76 auto mutable_cycles() -> uint64_t& { return cycles_; }
77
78 // Audio debugging
80
81 bool fast_mem_ = false;
82
83 private:
88
89 std::vector<uint8_t> rom_data;
90
91 bool running_ = false;
92
93 // ram
94 uint8_t ram[0x20000];
95 uint32_t ram_adr_;
96
97 // Frame timing
98 uint32_t frames_ = 0;
99 uint64_t cycles_ = 0;
100 uint64_t sync_cycle_ = 0;
103
104 // Nmi / Irq
105 bool h_irq_enabled_ = false;
106 bool v_irq_enabled_ = false;
107 bool nmi_enabled_ = false;
108 uint16_t h_timer_ = 0;
109 uint16_t v_timer_ = 0;
110 bool in_nmi_ = false;
111 bool irq_condition_ = false;
112 bool in_irq_ = false;
114
115 // Multiplication / Division
116 uint8_t multiply_a_;
118 uint16_t divide_a_;
120
121 // Joypad State
124 uint16_t port_auto_read_[4]; // as read by auto-joypad read
125 bool auto_joy_read_ = false;
126 uint16_t auto_joy_timer_ = 0;
128
129 // Audio debugging
131};
132
133} // namespace emu
134} // namespace yaze
135
136#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:42
Implementation of the Memory interface for emulating memory in a SNES system.
Definition memory.h:118
bool nmi_enabled_
Definition snes.h:107
uint32_t frames_
Definition snes.h:98
Input input1
Definition snes.h:122
auto mutable_cycles() -> uint64_t &
Definition snes.h:76
void SetSamples(int16_t *sample_data, int wanted_samples)
Definition snes.cc:692
void CatchUpApu()
Definition snes.cc:131
uint8_t Rread(uint32_t adr)
Definition snes.cc:426
uint64_t cycles_
Definition snes.h:99
void RunCycles(int cycles)
Definition snes.cc:311
uint16_t v_timer_
Definition snes.h:109
auto apu_handshake_tracker() -> debug::ApuHandshakeTracker &
Definition snes.h:79
uint16_t port_auto_read_[4]
Definition snes.h:124
void WriteBBus(uint8_t adr, uint8_t val)
Definition snes.cc:469
uint8_t CpuRead(uint32_t adr)
Definition snes.cc:667
auto ppu() -> Ppu &
Definition snes.h:72
void SetButtonState(int player, int button, bool pressed)
Definition snes.cc:698
uint8_t Read(uint32_t adr)
Definition snes.cc:463
uint16_t h_timer_
Definition snes.h:108
void saveState(const std::string &path)
Definition snes.cc:768
std::vector< uint8_t > access_time
Definition snes.h:61
debug::ApuHandshakeTracker apu_handshake_tracker_
Definition snes.h:130
bool running() const
Definition snes.h:70
bool irq_condition_
Definition snes.h:111
~Snes()=default
bool h_irq_enabled_
Definition snes.h:105
void Reset(bool hard=false)
Definition snes.cc:54
bool fast_mem_
Definition snes.h:81
void RunFrame()
Definition snes.cc:98
uint8_t ReadReg(uint16_t adr)
Definition snes.cc:359
auto apu() -> Apu &
Definition snes.h:73
auto get_ram() -> uint8_t *
Definition snes.h:75
void CpuIdle(bool waiting)
Definition snes.cc:686
uint16_t divide_result_
Definition snes.h:119
void WriteReg(uint16_t adr, uint8_t val)
Definition snes.cc:514
void CpuWrite(uint32_t adr, uint8_t val)
Definition snes.cc:678
bool v_irq_enabled_
Definition snes.h:106
bool in_nmi_
Definition snes.h:110
uint16_t multiply_result_
Definition snes.h:117
uint32_t next_horiz_event
Definition snes.h:102
bool in_irq_
Definition snes.h:112
uint8_t ReadBBus(uint8_t adr)
Definition snes.cc:332
bool running_
Definition snes.h:91
void Write(uint32_t adr, uint8_t val)
Definition snes.cc:623
auto cpu() -> Cpu &
Definition snes.h:71
uint64_t sync_cycle_
Definition snes.h:100
uint16_t divide_a_
Definition snes.h:118
void InitAccessTime(bool recalc)
Definition snes.cc:813
bool auto_joy_read_
Definition snes.h:125
void loadState(const std::string &path)
Definition snes.cc:720
bool in_vblank_
Definition snes.h:113
void SyncCycles(bool start, int sync_cycles)
Definition snes.cc:321
std::vector< uint8_t > rom_data
Definition snes.h:89
void Init(std::vector< uint8_t > &rom_data)
Definition snes.cc:36
auto memory() -> MemoryImpl &
Definition snes.h:74
Input input2
Definition snes.h:123
uint8_t multiply_a_
Definition snes.h:116
void SetPixels(uint8_t *pixel_data)
Definition snes.cc:696
uint8_t ram[0x20000]
Definition snes.h:94
uint16_t auto_joy_timer_
Definition snes.h:126
void HandleInput()
Definition snes.cc:137
MemoryImpl memory_
Definition snes.h:84
void RunCycle()
Definition snes.cc:173
bool ppu_latch_
Definition snes.h:127
uint32_t ram_adr_
Definition snes.h:95
double apu_catchup_cycles_
Definition snes.h:101
int GetAccessTime(uint32_t adr)
Definition snes.cc:653
IPL ROM handshake tracker.
Main namespace for the application.
uint16_t current_state_
Definition snes.h:21
bool latch_line_
Definition snes.h:19
uint8_t type
Definition snes.h:18
uint16_t latched_state_
Definition snes.h:22