From 7016cb40134bc77a8e4b2ee69339b0fce88f0e30 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 19 Apr 2026 10:32:46 -0400 Subject: [PATCH] Respect bits 3 and 2 of FFFC. --- Machines/MasterSystem/MasterSystem.cpp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/Machines/MasterSystem/MasterSystem.cpp b/Machines/MasterSystem/MasterSystem.cpp index 5f067bf66..033a5ee81 100644 --- a/Machines/MasterSystem/MasterSystem.cpp +++ b/Machines/MasterSystem/MasterSystem.cpp @@ -511,8 +511,8 @@ private: HalfCycles time_since_sn76489_update_; HalfCycles time_until_debounce_; - std::array ram_; - std::array sram_; + std::array ram_; // Built-in RAM. + std::array sram_; // Cartridge-supplied save RAM. std::array bios_; std::vector cartridge_; @@ -554,16 +554,35 @@ private: } paging_; uint8_t memory_control_ = 0; void page_cartridge() { + if(paging_.control & 0x93) { + Logger::error().append("TODO: Unimplemented paging control bits in use: %02x", paging_.control); + } + // Either install the cartridge or don't; Japanese machines can't see // anything but the cartridge. if(!(memory_control_ & 0x40) || region_ == Target::Region::Japan) { + // Apply prima-facie ROM mapping. for(size_t c = 0; c < 3; ++c) { const size_t start_addr = (paging_.page[c] * 0x4000) % cartridge_.size(); map( read_pointers_, cartridge_.data() + start_addr, std::min(size_t(0x4000), cartridge_.size() - start_addr), - c * 0x4000); + c * 0x4000 + ); + map( + write_pointers_, + nullptr, + 0x4000, + c * 0x4000 + ); + } + + // Override with RAM if selected. + if(paging_.control & 0x08) { + uint8_t *const base = sram_.data() + ((paging_.control & 0x04) ? 0x4000 : 0); + map(read_pointers_, base, 0x4000, 0x8000); + map(write_pointers_, base, 0x4000, 0x8000); } // The first 1kb doesn't page though, if this is the Sega paging scheme.