// // Created by Selim Mustafaev on 09.08.2023. // #ifndef NES_CARTRIDGE_H #define NES_CARTRIDGE_H #include "Mapper/Mapper0.h" #include #include #include namespace nes { namespace fs = std::filesystem; constexpr uint32_t ROM_MAGIC = 0x4E45531A; constexpr size_t PRG_CHUNK_SIZE = 16*1024; constexpr size_t CHR_CHUNK_SIZE = 8*1024; class Cartridge { public: enum Mirroring { Horizontal, Vertical }; struct Flags { uint8_t mirroring: 1; uint8_t reserved: 7; }; struct RomHeader { uint32_t magic; uint8_t prgChunks; uint8_t chrChunks; Flags flags; uint8_t reserved[9]; }; public: explicit Cartridge(const fs::path& path); public: uint8_t readPrg(uint16_t address); uint8_t readChr(uint16_t address); Mirroring mirroring() const; private: std::unique_ptr _romData; std::unique_ptr _mapper; RomHeader* _header; std::span _prgRom; std::span _chrRom; private: Mirroring _mirroring; }; } #endif //NES_CARTRIDGE_H