1#ifndef YAZE_APP_EMU_MEMORY_H
2#define YAZE_APP_EMU_MEMORY_H
53 std::function<void(
bool waiting)>
idle;
67 virtual uint8_t
ReadByte(uint32_t address)
const = 0;
68 virtual uint16_t
ReadWord(uint32_t address)
const = 0;
71 uint16_t length)
const = 0;
73 virtual void WriteByte(uint32_t address, uint8_t value) = 0;
74 virtual void WriteWord(uint32_t address, uint16_t value) = 0;
75 virtual void WriteLong(uint32_t address, uint32_t value) = 0;
84 virtual uint16_t
SP()
const = 0;
85 virtual void SetSP(uint16_t value) = 0;
90 virtual uint8_t
at(
int i)
const = 0;
106 virtual auto h_pos() const -> uint16_t = 0;
107 virtual auto
v_pos() const -> uint16_t = 0;
120 void Initialize(
const std::vector<uint8_t> &romData,
bool verbose =
false);
124 switch (
memory_[(0x00 << 16) + 0xFFD5] & 0x07) {
135 throw std::invalid_argument(
136 "Unable to locate supported ROM mapping mode in the provided ROM "
137 "file. Please try another ROM file.");
143 uint8_t cart_read(uint8_t bank, uint16_t adr);
144 void cart_write(uint8_t bank, uint16_t adr, uint8_t val);
146 uint8_t cart_readLorom(uint8_t bank, uint16_t adr);
147 void cart_writeLorom(uint8_t bank, uint16_t adr, uint8_t val);
149 uint8_t cart_readHirom(uint8_t bank, uint16_t adr);
150 uint8_t cart_readExHirom(uint8_t bank, uint16_t adr);
152 void cart_writeHirom(uint8_t bank, uint16_t adr, uint8_t val);
154 uint8_t
ReadByte(uint32_t address)
const override {
156 return memory_.at(mapped_address);
158 uint16_t
ReadWord(uint32_t address)
const override {
160 return static_cast<uint16_t
>(
memory_.at(mapped_address)) |
161 (
static_cast<uint16_t
>(
memory_.at(mapped_address + 1)) << 8);
165 return static_cast<uint32_t
>(
memory_.at(mapped_address)) |
166 (
static_cast<uint32_t
>(
memory_.at(mapped_address + 1)) << 8) |
167 (
static_cast<uint32_t
>(
memory_.at(mapped_address + 2)) << 16);
170 uint16_t length)
const override {
172 return std::vector<uint8_t>(
memory_.begin() + mapped_address,
173 memory_.begin() + mapped_address + length);
176 void WriteByte(uint32_t address, uint8_t value)
override {
178 memory_[mapped_address] = value;
180 void WriteWord(uint32_t address, uint16_t value)
override {
182 memory_.at(mapped_address) = value & 0xFF;
183 memory_.at(mapped_address + 1) = (value >> 8) & 0xFF;
185 void WriteLong(uint32_t address, uint32_t value)
override {
187 memory_.at(mapped_address) = value & 0xFF;
188 memory_.at(mapped_address + 1) = (value >> 8) & 0xFF;
189 memory_.at(mapped_address + 2) = (value >> 16) & 0xFF;
198 std::cout <<
"Stack underflow!" << std::endl;
199 throw std::runtime_error(
"Stack underflow!");
208 std::cout <<
"Stack overflow!" << std::endl;
209 throw std::runtime_error(
"Stack overflow!");
221 return (
static_cast<uint16_t
>(high) << 8) | low;
234 return (
static_cast<uint32_t
>(high) << 16) |
235 (
static_cast<uint32_t
>(mid) << 8) | low;
239 uint16_t
SP()
const override {
return SP_; }
241 void SetSP(uint16_t value)
override {
SP_ = value; }
247 std::cout << i <<
" out of bounds \n";
Implementation of the Memory interface for emulating memory in a SNES system.
uint8_t at(int i) const override
auto open_bus() const -> uint8_t override
void set_dma_state(uint8_t value)
auto dma_state() -> uint8_t &
void WriteWord(uint32_t address, uint16_t value) override
void set_h_pos(uint16_t value) override
std::vector< uint8_t > rom_
uint16_t GetHeaderOffset()
void init_hdma_request() override
void WriteByte(uint32_t address, uint8_t value) override
uint16_t SP() const override
auto dma_channels() -> DmaChannel *
void set_v_pos(uint16_t value) override
auto v_pos() const -> uint16_t override
std::vector< uint8_t > ram_
bool hdma_init_requested_
void set_hdma_run_requested(bool value) override
uint16_t PopWord() override
uint8_t PopByte() override
auto hdma_init_requested() const -> bool override
auto mutable_sp() -> uint16_t &
uint32_t ReadWordLong(uint32_t address) const override
auto h_pos() const -> uint16_t override
void WriteLong(uint32_t address, uint32_t value) override
uint32_t GetMappedAddress(uint32_t address) const
void SetSP(uint16_t value) override
void set_open_bus(uint8_t value) override
std::vector< uint8_t > memory_
void PushWord(uint16_t value) override
uint8_t operator[](int i) const override
uint32_t PopLong() override
void run_hdma_request() override
void ClearMemory() override
void set_pal_timing(bool value) override
void PushByte(uint8_t value) override
auto pal_timing() const -> bool override
void set_hdma_init_requested(bool value) override
void PushLong(uint32_t value) override
std::vector< uint8_t > ReadByteVector(uint32_t address, uint16_t length) const override
void Initialize(const std::vector< uint8_t > &romData, bool verbose=false)
auto hdma_run_requested() const -> bool override
uint16_t ReadWord(uint32_t address) const override
uint8_t ReadByte(uint32_t address) const override
virtual void PushWord(uint16_t value)=0
virtual void PushLong(uint32_t value)=0
virtual void WriteLong(uint32_t address, uint32_t value)=0
virtual void init_hdma_request()=0
virtual ~Memory()=default
virtual bool hdma_run_requested() const =0
virtual void set_v_pos(uint16_t value)=0
virtual uint16_t PopWord()=0
virtual void WriteWord(uint32_t address, uint16_t value)=0
virtual void ClearMemory()=0
virtual auto pal_timing() const -> bool=0
virtual uint32_t PopLong()=0
virtual uint16_t SP() const =0
virtual auto h_pos() const -> uint16_t=0
virtual auto v_pos() const -> uint16_t=0
virtual void PushByte(uint8_t value)=0
virtual void set_hdma_run_requested(bool value)=0
virtual uint32_t ReadWordLong(uint32_t address) const =0
virtual uint8_t ReadByte(uint32_t address) const =0
virtual void WriteByte(uint32_t address, uint8_t value)=0
virtual void run_hdma_request()=0
virtual bool hdma_init_requested() const =0
virtual uint8_t open_bus() const =0
virtual uint8_t PopByte()=0
virtual uint8_t operator[](int i) const =0
virtual void set_hdma_init_requested(bool value)=0
virtual std::vector< uint8_t > ReadByteVector(uint32_t address, uint16_t length) const =0
virtual void set_h_pos(uint16_t value)=0
virtual void SetSP(uint16_t value)=0
virtual void set_pal_timing(bool value)=0
virtual uint16_t ReadWord(uint32_t address) const =0
virtual uint8_t at(int i) const =0
virtual void set_open_bus(uint8_t value)=0
SNES Emulation and debugging tools.
constexpr uint32_t kROMSize
struct yaze::emu::DmaChannel DmaChannel
constexpr uint32_t kROMStart
constexpr uint32_t kRAMStart
constexpr uint32_t kRAMSize
struct yaze::emu::CpuCallbacks CpuCallbacks
Main namespace for the application.
std::function< void(bool waiting)> idle
std::function< uint8_t(uint32_t)> read_byte
std::function< void(uint32_t, uint8_t)> write_byte