From 28ac82d68baaca5ba2037c3bec58577bea3dc7eb Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 19 Aug 2023 14:13:52 -0400 Subject: [PATCH] Add Memory Mapping, Direct Page memory --- src/app/emu/mem.h | 95 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 93 insertions(+), 2 deletions(-) diff --git a/src/app/emu/mem.h b/src/app/emu/mem.h index 1dc7280a..2bd5a589 100644 --- a/src/app/emu/mem.h +++ b/src/app/emu/mem.h @@ -1,6 +1,28 @@ #ifndef MEM_H #define MEM_H +#include +#include +#include + +namespace yaze { +namespace app { +namespace emu { + +class DirectPageMemory { + public: + DirectPageMemory(size_t size = 256) : memory_(size, 0) {} + + uint8_t ReadByte(uint8_t address) const { return memory_[address]; } + + void WriteByte(uint8_t address, uint8_t value) { memory_[address] = value; } + + auto size() const { return memory_.size(); } + + private: + std::vector memory_; +}; + // memory.h class Memory { public: @@ -8,6 +30,10 @@ class Memory { virtual uint8_t ReadByte(uint16_t address) const = 0; virtual uint16_t ReadWord(uint16_t address) const = 0; virtual uint32_t ReadWordLong(uint16_t address) const = 0; + + virtual void WriteByte(uint32_t address, uint8_t value) = 0; + virtual void WriteWord(uint32_t address, uint16_t value) = 0; + virtual void SetMemory(const std::vector& data) = 0; virtual uint8_t operator[](int i) const = 0; @@ -17,12 +43,36 @@ class Memory { class MemoryImpl : public Memory { public: uint8_t ReadByte(uint16_t address) const override { + if (address < dp_memory_.size()) { + return dp_memory_.ReadByte(static_cast(address)); + } + // uint32_t mapped_address = GetMappedAddress(address); return memory_.at(address); } uint16_t ReadWord(uint16_t address) const override { - return static_cast(memory_.at(address)) | - (static_cast(memory_.at(address + 1)) << 8); + if (address < dp_memory_.size()) { + return dp_memory_.ReadByte(static_cast(address)); + } + uint32_t mapped_address = GetMappedAddress(address); + return static_cast(memory_.at(mapped_address)) | + (static_cast(memory_.at(mapped_address + 1)) << 8); } + uint32_t ReadWordLong(uint16_t address) const override { + uint32_t mapped_address = GetMappedAddress(address); + return static_cast(memory_.at(mapped_address)) | + (static_cast(memory_.at(mapped_address + 1)) << 8) | + (static_cast(memory_.at(mapped_address + 2)) << 16); + } + void WriteByte(uint32_t address, uint8_t value) override { + uint32_t mapped_address = GetMappedAddress(address); + memory_.at(mapped_address) = value; + } + void WriteWord(uint32_t address, uint16_t value) override { + uint32_t mapped_address = GetMappedAddress(address); + memory_.at(mapped_address) = value & 0xFF; + memory_.at(mapped_address + 1) = (value >> 8) & 0xFF; + } + void SetMemory(const std::vector& data) override { memory_ = data; } uint8_t at(int i) const override { return memory_[i]; } @@ -38,8 +88,49 @@ class MemoryImpl : public Memory { return memory_[i]; } + private: + uint32_t GetMappedAddress(uint32_t address) const { + uint32_t bank = address >> 16; + uint32_t offset = address & 0xFFFF; + + switch (bank) { + case 0x00: // Direct Page / Stack + return 0x0000 + offset; + case 0x01: // Main RAM + return 0x2000 + offset; + case 0x02: // ROM (LoROM) + return 0x4000 + offset; + case 0x03: // ROM (HiROM) + return 0x8000 + offset; + default: + return address; // Return the original address if no mapping is defined + } + } + + // Direct Page Memory + DirectPageMemory dp_memory_; + + // Define memory regions + std::vector rom_; + std::vector ram_; + std::vector vram_; + std::vector oam_; + + static const uint32_t kROMStart = 0xC00000; + static const uint32_t kROMSize = 0x400000; + static const uint32_t kRAMStart = 0x7E0000; + static const uint32_t kRAMSize = 0x20000; + static const uint32_t kVRAMStart = 0x210000; + static const uint32_t kVRAMSize = 0x10000; + static const uint32_t kOAMStart = 0x218000; + static const uint32_t kOAMSize = 0x220; + // Memory (64KB) std::vector memory_; }; +} // namespace emu +} // namespace app +} // namespace yaze + #endif // MEM_H \ No newline at end of file