fixing scroll registers except mode 7

This commit is contained in:
Clément Le Bihan
2021-02-02 17:51:34 +01:00
parent a4d9047a89
commit 58fd02c8ec
3 changed files with 29 additions and 10 deletions
+18 -10
View File
@@ -203,7 +203,7 @@ namespace ComSquare::PPU
uint8_t PPU::read(uint24_t addr) uint8_t PPU::read(uint24_t addr)
{ {
return 0; //return 0;
switch (addr) { switch (addr) {
case PpuRegisters::mpyl: case PpuRegisters::mpyl:
return this->_registers._mpy.mpyl; return this->_registers._mpy.mpyl;
@@ -248,7 +248,7 @@ namespace ComSquare::PPU
void PPU::write(uint24_t addr, uint8_t data) void PPU::write(uint24_t addr, uint8_t data)
{ {
return; //return;
switch (addr) { switch (addr) {
case PpuRegisters::inidisp: case PpuRegisters::inidisp:
this->_registers._inidisp.raw = data; this->_registers._inidisp.raw = data;
@@ -294,20 +294,28 @@ namespace ComSquare::PPU
break; break;
case PpuRegisters::bg12nba: case PpuRegisters::bg12nba:
case PpuRegisters::bg34nba: case PpuRegisters::bg34nba:
this->_registers._bgnba[addr - 0x0B].raw = data; this->_registers._bgnba[addr - PpuRegisters::bg12nba].raw = data;
break; break;
case PpuRegisters::bg1hofs: 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::bg2hofs:
case PpuRegisters::bg2vofs:
case PpuRegisters::bg3hofs: case PpuRegisters::bg3hofs:
case PpuRegisters::bg3vofs:
case PpuRegisters::bg4hofs: 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: case PpuRegisters::bg4vofs:
// Work in progress ! this->_registers._bgofs[addr - PpuRegisters::bg1hofs].raw = ((data << 8) | this->_ppuState.hvSharedScrollPrevValue) & 0x3FF;
if (addr == PpuRegisters::bg1hofs || addr == PpuRegisters::bg1vofs) this->_ppuState.hvSharedScrollPrevValue = data;
this->_registers._m7ofs[addr - PpuRegisters::bg1hofs].raw = data;
this->_registers._bgofs[addr - PpuRegisters::bg1hofs].raw = data;
break; break;
case PpuRegisters::vmain: case PpuRegisters::vmain:
this->_registers._vmain.raw = data; this->_registers._vmain.raw = data;
+3
View File
@@ -13,6 +13,7 @@
#include "../Ram/Ram.hpp" #include "../Ram/Ram.hpp"
#include "../Models/Vector2.hpp" #include "../Models/Vector2.hpp"
#include "Background.hpp" #include "Background.hpp"
#include "PPUUtils.hpp"
//#define max2BitTiles 4096 //#define max2BitTiles 4096
//#define max4BitTiles 2048 //#define max4BitTiles 2048
@@ -570,6 +571,8 @@ namespace ComSquare::PPU
std::array<std::array<uint32_t, 1024>, 1024> _screen; std::array<std::array<uint32_t, 1024>, 1024> _screen;
//! @brief Used for vram read registers (0x2139 - 0x213A) //! @brief Used for vram read registers (0x2139 - 0x213A)
uint16_t _vramReadBuffer = 0; uint16_t _vramReadBuffer = 0;
//! @brief Struct that contain all necessary vars for the use of the registers
struct PpuState _ppuState;
public: public:
explicit PPU(Renderer::IRenderer &renderer); explicit PPU(Renderer::IRenderer &renderer);
+8
View File
@@ -28,5 +28,13 @@ namespace ComSquare::PPU
uint16_t raw = 0; 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 #endif //COMSQUARE_PPU_UTILS_HPP