99 std::function<void(
bool waiting)>
idle;
113 virtual uint8_t
ReadByte(uint32_t address)
const = 0;
114 virtual uint16_t
ReadWord(uint32_t address)
const = 0;
117 uint16_t length)
const = 0;
119 virtual void WriteByte(uint32_t address, uint8_t value) = 0;
120 virtual void WriteWord(uint32_t address, uint16_t value) = 0;
121 virtual void WriteLong(uint32_t address, uint32_t value) = 0;
130 virtual uint16_t
SP()
const = 0;
131 virtual void SetSP(uint16_t value) = 0;
136 virtual uint8_t
at(
int i)
const = 0;
152 virtual auto h_pos() const -> uint16_t = 0;
153 virtual auto
v_pos() const -> uint16_t = 0;
168 void Initialize(
const std::vector<uint8_t>& romData,
bool verbose =
false);
171 uint8_t mapMode = memory_[(0x00 << 16) + 0xFFD5];
174 switch (mapMode & 0x07) {
185 throw std::invalid_argument(
186 "Unable to locate supported ROM mapping mode in the provided ROM "
187 "file. Please try another ROM file.");
195 uint8_t cart_read(uint8_t bank, uint16_t adr);
196 void cart_write(uint8_t bank, uint16_t adr, uint8_t val);
198 uint8_t cart_readLorom(uint8_t bank, uint16_t adr);
199 void cart_writeLorom(uint8_t bank, uint16_t adr, uint8_t val);
201 uint8_t cart_readHirom(uint8_t bank, uint16_t adr);
202 uint8_t cart_readExHirom(uint8_t bank, uint16_t adr);
204 void cart_writeHirom(uint8_t bank, uint16_t adr, uint8_t val);
206 uint8_t
ReadByte(uint32_t address)
const override {
207 uint32_t mapped_address = GetMappedAddress(address);
208 return memory_.at(mapped_address);
210 uint16_t
ReadWord(uint32_t address)
const override {
211 uint32_t mapped_address = GetMappedAddress(address);
212 return static_cast<uint16_t
>(memory_.at(mapped_address)) |
213 (
static_cast<uint16_t
>(memory_.at(mapped_address + 1)) << 8);
216 uint32_t mapped_address = GetMappedAddress(address);
217 return static_cast<uint32_t
>(memory_.at(mapped_address)) |
218 (
static_cast<uint32_t
>(memory_.at(mapped_address + 1)) << 8) |
219 (
static_cast<uint32_t
>(memory_.at(mapped_address + 2)) << 16);
222 uint16_t length)
const override {
223 uint32_t mapped_address = GetMappedAddress(address);
224 return std::vector<uint8_t>(memory_.begin() + mapped_address,
225 memory_.begin() + mapped_address + length);
228 void WriteByte(uint32_t address, uint8_t value)
override {
229 uint32_t mapped_address = GetMappedAddress(address);
230 memory_[mapped_address] = value;
232 void WriteWord(uint32_t address, uint16_t value)
override {
233 uint32_t mapped_address = GetMappedAddress(address);
234 memory_.at(mapped_address) = value & 0xFF;
235 memory_.at(mapped_address + 1) = (value >> 8) & 0xFF;
237 void WriteLong(uint32_t address, uint32_t value)
override {
238 uint32_t mapped_address = GetMappedAddress(address);
239 memory_.at(mapped_address) = value & 0xFF;
240 memory_.at(mapped_address + 1) = (value >> 8) & 0xFF;
241 memory_.at(mapped_address + 2) = (value >> 16) & 0xFF;
247 memory_.at(SP_--) = value;
250 std::cout <<
"Stack underflow!" << std::endl;
251 throw std::runtime_error(
"Stack underflow!");
257 return memory_.at(++SP_);
260 std::cout <<
"Stack overflow!" << std::endl;
261 throw std::runtime_error(
"Stack overflow!");
273 return (
static_cast<uint16_t
>(high) << 8) | low;
286 return (
static_cast<uint32_t
>(high) << 16) |
287 (
static_cast<uint32_t
>(mid) << 8) | low;
291 uint16_t
SP()
const override {
return SP_; }
293 void SetSP(uint16_t value)
override { SP_ = value; }
294 void ClearMemory()
override { std::fill(memory_.begin(), memory_.end(), 0); }
296 uint8_t
at(
int i)
const override {
return memory_[i]; }
298 if (i > memory_.size()) {
299 std::cout << i <<
" out of bounds \n";
305 auto size()
const {
return memory_.size(); }
306 auto begin()
const {
return memory_.begin(); }
307 auto end()
const {
return memory_.end(); }
308 auto data()
const {
return memory_.data(); }
310 auto open_bus() const -> uint8_t
override {
return open_bus_; }
312 return hdma_init_requested_;
315 return hdma_run_requested_;
320 hdma_run_requested_ = value;
323 hdma_init_requested_ = value;
326 void set_h_pos(uint16_t value)
override { h_pos_ = value; }
327 void set_v_pos(uint16_t value)
override { v_pos_ = value; }
328 auto h_pos() const -> uint16_t
override {
return h_pos_; }
329 auto v_pos() const -> uint16_t
override {
return v_pos_; }
330 auto pal_timing() const ->
bool override {
return pal_timing_; }
341 uint32_t GetMappedAddress(uint32_t address)
const;
343 bool verbose_ =
false;
346 bool hdma_run_requested_ =
false;
347 bool hdma_init_requested_ =
false;
349 bool pal_timing_ =
false;
356 uint8_t dma_state_ = 0;
362 uint8_t open_bus_ = 0;
Implementation of the Memory interface for emulating memory in a SNES system.
uint32_t ReadWordLong(uint32_t address) const override
std::vector< uint8_t > memory_
auto mutable_sp() -> uint16_t &
void WriteWord(uint32_t address, uint16_t value) override
void WriteLong(uint32_t address, uint32_t value) override
uint16_t PopWord() override
auto v_pos() const -> uint16_t override
void set_dma_state(uint8_t value)
auto dma_channels() -> DmaChannel *
void set_h_pos(uint16_t value) override
void PushWord(uint16_t value) override
std::vector< uint8_t > ReadByteVector(uint32_t address, uint16_t length) const override
void set_open_bus(uint8_t value) override
auto h_pos() const -> uint16_t override
void init_hdma_request() override
uint8_t at(int i) const override
void run_hdma_request() override
uint8_t ReadByte(uint32_t address) const override
std::vector< uint8_t > rom_
auto hdma_run_requested() const -> bool override
uint16_t SP() const override
void ClearMemory() override
void set_hdma_run_requested(bool value) override
void PushLong(uint32_t value) override
void SetSP(uint16_t value) override
void set_pal_timing(bool value) override
auto dma_state() -> uint8_t &
void WriteByte(uint32_t address, uint8_t value) override
auto open_bus() const -> uint8_t override
void set_v_pos(uint16_t value) override
std::vector< uint8_t > ram_
uint8_t PopByte() override
uint32_t PopLong() override
void set_hdma_init_requested(bool value) override
uint16_t GetHeaderOffset()
uint16_t ReadWord(uint32_t address) const override
auto pal_timing() const -> bool override
void PushByte(uint8_t value) override
auto hdma_init_requested() const -> bool override
uint8_t operator[](int i) const override
virtual std::vector< uint8_t > ReadByteVector(uint32_t address, uint16_t length) const =0
virtual void PushLong(uint32_t value)=0
virtual void WriteLong(uint32_t address, uint32_t value)=0
virtual void set_pal_timing(bool value)=0
virtual void PushByte(uint8_t value)=0
virtual uint16_t SP() const =0
virtual void set_v_pos(uint16_t value)=0
virtual void SetSP(uint16_t value)=0
virtual void PushWord(uint16_t value)=0
virtual auto v_pos() const -> uint16_t=0
virtual void WriteByte(uint32_t address, uint8_t value)=0
virtual uint8_t operator[](int i) const =0
virtual void set_hdma_run_requested(bool value)=0
virtual uint8_t at(int i) const =0
virtual uint8_t open_bus() const =0
virtual void WriteWord(uint32_t address, uint16_t value)=0
virtual void set_h_pos(uint16_t value)=0
virtual void run_hdma_request()=0
virtual bool hdma_run_requested() const =0
virtual uint8_t ReadByte(uint32_t address) const =0
virtual auto h_pos() const -> uint16_t=0
virtual void set_hdma_init_requested(bool value)=0
virtual uint32_t PopLong()=0
virtual uint16_t ReadWord(uint32_t address) const =0
virtual uint32_t ReadWordLong(uint32_t address) const =0
virtual void init_hdma_request()=0
virtual uint8_t PopByte()=0
virtual uint16_t PopWord()=0
virtual void ClearMemory()=0
virtual auto pal_timing() const -> bool=0
virtual void set_open_bus(uint8_t value)=0
virtual bool hdma_init_requested() const =0
virtual ~Memory()=default
uint16_t checksumComplement
constexpr uint32_t kROMSize
constexpr uint32_t kRAMSize
struct yaze::app::emu::memory::CpuCallbacks CpuCallbacks
constexpr uint32_t kROMStart
void DrawSnesMemoryMapping(const MemoryImpl &memory)
constexpr uint32_t kRAMStart
std::function< uint8_t(uint32_t)> read_byte
std::function< void(bool waiting)> idle
std::function< void(uint32_t, uint8_t)> write_byte