yaze 0.2.0
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 <memory>
6#include <string>
7#include <thread>
8
9#include "app/emu/audio/apu.h"
11#include "app/emu/cpu/clock.h"
12#include "app/emu/cpu/cpu.h"
15#include "app/emu/video/ppu.h"
16#include "app/rom.h"
17
18namespace yaze {
19namespace app {
20namespace emu {
21
22struct Input {
23 uint8_t type;
24 // latchline
26 // for controller
27 uint16_t current_state_; // actual state
29};
30
31class SNES {
32 public:
33 SNES() = default;
34 ~SNES() = default;
35
36 // Initialization
37 void Init(std::vector<uint8_t>& rom_data);
38 void Reset(bool hard = false);
39
40 // Emulation
41 void RunFrame();
42 void CatchUpApu();
43
44 // Controller input handling
45 void HandleInput();
46
47 // Clock cycling and synchronization
48 void RunCycle();
49 void RunCycles(int cycles);
50 void SyncCycles(bool start, int sync_cycles);
51
52 uint8_t ReadBBus(uint8_t adr);
53 uint8_t ReadReg(uint16_t adr);
54 uint8_t Rread(uint32_t adr);
55 uint8_t Read(uint32_t adr);
56
57 void WriteBBus(uint8_t adr, uint8_t val);
58 void WriteReg(uint16_t adr, uint8_t val);
59 void Write(uint32_t adr, uint8_t val);
60
61 int GetAccessTime(uint32_t adr);
62 uint8_t CpuRead(uint32_t adr);
63 void CpuWrite(uint32_t adr, uint8_t val);
64 void CpuIdle(bool waiting);
65
66 void SetSamples(int16_t* sample_data, int wanted_samples);
67 void SetPixels(uint8_t* pixel_data);
68 void SetButtonState(int player, int button, bool pressed);
69 bool running() const { return running_; }
70 auto cpu() -> Cpu& { return cpu_; }
71 auto ppu() -> video::Ppu& { return ppu_; }
72 auto apu() -> audio::Apu& { return apu_; }
73 auto Memory() -> memory::MemoryImpl& { return memory_; }
74 auto get_ram() -> uint8_t* { return ram; }
75 auto mutable_cycles() -> uint64_t& { return cycles_; }
76 void InitAccessTime(bool recalc);
77
78 std::vector<uint8_t> access_time;
79
80 private:
81 // Components of the SNES
85
87 [&](uint32_t adr) { return CpuRead(adr); },
88 [&](uint32_t adr, uint8_t val) { CpuWrite(adr, val); },
89 [&](bool waiting) { CpuIdle(waiting); },
90 };
94
95 // Currently loaded ROM
96 std::vector<uint8_t> rom_data;
97
98 // Emulation state
99 bool running_ = false;
100
101 // ram
102 uint8_t ram[0x20000];
103 uint32_t ram_adr_;
104
105 // Frame timing
106 uint32_t frames_ = 0;
107 uint64_t cycles_ = 0;
108 uint64_t sync_cycle_ = 0;
111
112 // Nmi / Irq
113 bool h_irq_enabled_ = false;
114 bool v_irq_enabled_ = false;
115 bool nmi_enabled_ = false;
116 uint16_t h_timer_ = 0;
117 uint16_t v_timer_ = 0;
118 bool in_nmi_ = false;
119 bool irq_condition_ = false;
120 bool in_irq_ = false;
122
123 // Multiplication / Division
124 uint8_t multiply_a_;
126 uint16_t divide_a_;
128
129 // Joypad State
132 uint16_t port_auto_read_[4]; // as read by auto-joypad read
133 bool auto_joy_read_ = false;
134 uint16_t auto_joy_timer_ = 0;
136
137 bool fast_mem_ = false;
138};
139
140} // namespace emu
141} // namespace app
142} // namespace yaze
143
144#endif // YAZE_APP_EMU_SNES_H
uint64_t cycles_
Definition snes.h:107
uint16_t port_auto_read_[4]
Definition snes.h:132
auto apu() -> audio::Apu &
Definition snes.h:72
uint8_t multiply_a_
Definition snes.h:124
audio::Apu apu_
Definition snes.h:93
void RunCycles(int cycles)
Definition snes.cc:233
uint32_t ram_adr_
Definition snes.h:103
memory::MemoryImpl memory_
Definition snes.h:84
void InitAccessTime(bool recalc)
Definition snes.cc:569
Debugger debugger
Definition snes.h:83
void Init(std::vector< uint8_t > &rom_data)
Definition snes.cc:37
void SyncCycles(bool start, int sync_cycles)
Definition snes.cc:243
uint8_t ReadReg(uint16_t adr)
Definition snes.cc:270
uint8_t Rread(uint32_t adr)
Definition snes.cc:323
void CpuIdle(bool waiting)
Definition snes.cc:540
memory::CpuCallbacks cpu_callbacks_
Definition snes.h:86
ClockImpl clock_
Definition snes.h:82
auto Memory() -> memory::MemoryImpl &
Definition snes.h:73
uint64_t sync_cycle_
Definition snes.h:108
void SetSamples(int16_t *sample_data, int wanted_samples)
Definition snes.cc:546
uint16_t divide_result_
Definition snes.h:127
void CatchUpApu()
Definition snes.cc:99
uint8_t CpuRead(uint32_t adr)
Definition snes.cc:521
std::vector< uint8_t > access_time
Definition snes.h:78
auto mutable_cycles() -> uint64_t &
Definition snes.h:75
auto ppu() -> video::Ppu &
Definition snes.h:71
void Write(uint32_t adr, uint8_t val)
Definition snes.cc:477
double apu_catchup_cycles_
Definition snes.h:109
uint16_t auto_joy_timer_
Definition snes.h:134
uint32_t frames_
Definition snes.h:106
void CpuWrite(uint32_t adr, uint8_t val)
Definition snes.cc:532
void WriteBBus(uint8_t adr, uint8_t val)
Definition snes.cc:359
int GetAccessTime(uint32_t adr)
Definition snes.cc:507
auto cpu() -> Cpu &
Definition snes.h:70
void SetButtonState(int player, int button, bool pressed)
Definition snes.cc:552
auto get_ram() -> uint8_t *
Definition snes.h:74
uint16_t h_timer_
Definition snes.h:116
uint8_t ram[0x20000]
Definition snes.h:102
void SetPixels(uint8_t *pixel_data)
Definition snes.cc:550
uint32_t next_horiz_event
Definition snes.h:110
uint16_t v_timer_
Definition snes.h:117
bool running() const
Definition snes.h:69
uint16_t multiply_result_
Definition snes.h:125
void WriteReg(uint16_t adr, uint8_t val)
Definition snes.cc:390
uint16_t divide_a_
Definition snes.h:126
std::vector< uint8_t > rom_data
Definition snes.h:96
video::Ppu ppu_
Definition snes.h:92
uint8_t ReadBBus(uint8_t adr)
Definition snes.cc:254
void Reset(bool hard=false)
Definition snes.cc:49
uint8_t Read(uint32_t adr)
Definition snes.cc:353
The Apu class represents the Audio Processing Unit (APU) of a system.
Definition apu.h:53
Implementation of the Memory interface for emulating memory in a SNES system.
Definition memory.h:164
Definition common.cc:21
uint16_t current_state_
Definition snes.h:27
uint16_t latched_state_
Definition snes.h:28