diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index 9e2b4ad..cb9067e 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -203,7 +203,7 @@ namespace ComSquare::PPU uint8_t PPU::read(uint24_t addr) { - return 0; + //return 0; switch (addr) { case PpuRegisters::mpyl: return this->_registers._mpy.mpyl; @@ -248,7 +248,7 @@ namespace ComSquare::PPU void PPU::write(uint24_t addr, uint8_t data) { - return; + //return; switch (addr) { case PpuRegisters::inidisp: this->_registers._inidisp.raw = data; @@ -294,20 +294,28 @@ namespace ComSquare::PPU break; case PpuRegisters::bg12nba: case PpuRegisters::bg34nba: - this->_registers._bgnba[addr - 0x0B].raw = data; + this->_registers._bgnba[addr - PpuRegisters::bg12nba].raw = data; break; case PpuRegisters::bg1hofs: - case PpuRegisters::bg1vofs: + // TODO need of special var for prev value for Mode 7 + this->_registers._m7ofs[addr - PpuRegisters::bg1hofs].raw = data; + __attribute__((fallthrough)); case PpuRegisters::bg2hofs: - case PpuRegisters::bg2vofs: case PpuRegisters::bg3hofs: - case PpuRegisters::bg3vofs: case PpuRegisters::bg4hofs: + this->_registers._bgofs[addr - PpuRegisters::bg1hofs].raw = ((data << 8) | (this->_ppuState.hvSharedScrollPrevValue & ~7) | (this->_ppuState.hScrollPrevValue & 7)) & 0x3FF; + this->_ppuState.hScrollPrevValue = data; + this->_ppuState.hvSharedScrollPrevValue = data; + break; + case PpuRegisters::bg1vofs: + // TODO need of special var for prev value for Mode 7 + this->_registers._bgnba[addr - PpuRegisters::bg12nba].raw = data; + __attribute__((fallthrough)); + case PpuRegisters::bg2vofs: + case PpuRegisters::bg3vofs: case PpuRegisters::bg4vofs: - // Work in progress ! - if (addr == PpuRegisters::bg1hofs || addr == PpuRegisters::bg1vofs) - this->_registers._m7ofs[addr - PpuRegisters::bg1hofs].raw = data; - this->_registers._bgofs[addr - PpuRegisters::bg1hofs].raw = data; + this->_registers._bgofs[addr - PpuRegisters::bg1hofs].raw = ((data << 8) | this->_ppuState.hvSharedScrollPrevValue) & 0x3FF; + this->_ppuState.hvSharedScrollPrevValue = data; break; case PpuRegisters::vmain: this->_registers._vmain.raw = data; diff --git a/sources/PPU/PPU.hpp b/sources/PPU/PPU.hpp index a155804..c3b0adb 100644 --- a/sources/PPU/PPU.hpp +++ b/sources/PPU/PPU.hpp @@ -13,6 +13,7 @@ #include "../Ram/Ram.hpp" #include "../Models/Vector2.hpp" #include "Background.hpp" +#include "PPUUtils.hpp" //#define max2BitTiles 4096 //#define max4BitTiles 2048 @@ -570,6 +571,8 @@ namespace ComSquare::PPU std::array, 1024> _screen; //! @brief Used for vram read registers (0x2139 - 0x213A) uint16_t _vramReadBuffer = 0; + //! @brief Struct that contain all necessary vars for the use of the registers + struct PpuState _ppuState; public: explicit PPU(Renderer::IRenderer &renderer); diff --git a/sources/PPU/PPUUtils.hpp b/sources/PPU/PPUUtils.hpp index 1453641..06de286 100644 --- a/sources/PPU/PPUUtils.hpp +++ b/sources/PPU/PPUUtils.hpp @@ -28,5 +28,13 @@ namespace ComSquare::PPU uint16_t raw = 0; }; + //! @brief Struct to save all specific variables needed for the registers (prev values for example) + struct PpuState { + //! @brief Used by by all eight BGnxOFS registers (0x210D - 0x2114) + uint8_t hvSharedScrollPrevValue; + //! @brief Shared by the four BGnHOFS registers + uint8_t hScrollPrevValue; + }; + } #endif //COMSQUARE_PPU_UTILS_HPP \ No newline at end of file