diff --git a/sources/Debugger/TileViewer/TileRenderer.cpp b/sources/Debugger/TileViewer/TileRenderer.cpp index 912e256..0dda4fa 100644 --- a/sources/Debugger/TileViewer/TileRenderer.cpp +++ b/sources/Debugger/TileViewer/TileRenderer.cpp @@ -16,7 +16,7 @@ namespace ComSquare::Debugger _cgram(nullptr), _bpp(2), _paletteIndex(0), - _renderSize(5000), + _renderSize(0x5000), _nbColumns(16), buffer({{{0}}}) { @@ -41,7 +41,7 @@ namespace ComSquare::Debugger i.fill(0); for (uint24_t i = 0; i < fmin(this->_ram->getSize(), this->_renderSize); i += 2, it++) { - if (bufX > 128 || bufY > 128) + if (bufX > 1024 || bufY > 1024) break; if (it && it % 8 == 0) { resetX += PPU::Tile::NbPixelsWidth; @@ -76,27 +76,34 @@ namespace ComSquare::Debugger this->_bpp = bpp; } - uint8_t TileRenderer::getPixelReferenceFromTileRow(uint16_t tileRowAddress, uint8_t pixelIndex) + uint8_t TileRenderer::read2BPPValue(uint16_t tileRowAddress, uint8_t pixelIndex) { + // TODO unit test this size_t size = this->_ram->getSize(); uint8_t highByte = this->_ram->read(tileRowAddress % size); uint8_t lowByte = this->_ram->read((tileRowAddress + 1) % size); - uint8_t secondHighByte; - uint8_t secondLowByte; - uint16_t result = 0; uint8_t shift = 8 - 1U - pixelIndex; + return ((highByte & (1U << shift)) | ((lowByte & (1U << shift)) << 1U)) >> shift; + } + + uint8_t TileRenderer::getPixelReferenceFromTileRow(uint16_t tileRowAddress, uint8_t pixelIndex) + { + // TODO unit test this + uint16_t result = 0; + // TODO do a constexpr + const int TileByteSizeRow = 16; + switch (this->_bpp) { case 8: - return highByte; + result += this->read2BPPValue(tileRowAddress + TileByteSizeRow * 2, pixelIndex) << 4; + result += this->read2BPPValue(tileRowAddress + TileByteSizeRow * 3, pixelIndex) << 6; + FALLTHROUGH case 4: - secondHighByte = this->_ram->read((tileRowAddress + 16) % size); - secondLowByte = this->_ram->read((tileRowAddress + 17) % size); - result = ((secondHighByte & (1U << shift)) | ((secondLowByte & (1U << shift)) << 1U)); - result = (shift - 2 >= 0) ? result >> (shift - 2) : result << ((shift - 2) * -1); + result += this->read2BPPValue(tileRowAddress + TileByteSizeRow, pixelIndex) << 2; FALLTHROUGH case 2: - result += ((highByte & (1U << shift)) | ((lowByte & (1U << shift)) << 1U)) >> shift; + result += this->read2BPPValue(tileRowAddress, pixelIndex); default: break; } @@ -105,7 +112,7 @@ namespace ComSquare::Debugger std::vector TileRenderer::getPalette(int nbPalette) { - uint8_t nbColors = std::pow(2, this->_bpp); + uint16_t nbColors = std::pow(2, this->_bpp); uint16_t addr = nbPalette * this->_bpp * this->_bpp * 2; // 2 because it's 2 addr for 1 color std::vector palette(nbColors); diff --git a/sources/Debugger/TileViewer/TileRenderer.hpp b/sources/Debugger/TileViewer/TileRenderer.hpp index 9fc2620..e43dc29 100644 --- a/sources/Debugger/TileViewer/TileRenderer.hpp +++ b/sources/Debugger/TileViewer/TileRenderer.hpp @@ -29,7 +29,7 @@ namespace ComSquare::Debugger int _offsetY = 0; public: //! @brief internal buffer - std::array, 128> buffer; + std::array, 1024> buffer; //! @brief Set the palette to use for render (index of palette) void setPaletteIndex(int paletteIndex); //! @brief Set the ram to look for color references @@ -50,6 +50,7 @@ namespace ComSquare::Debugger int getNbColumns() const; uint8_t getPixelReferenceFromTileRow(uint16_t tileRowAddress, uint8_t pixelIndex); std::vector getPalette(int nbPalette); + uint8_t read2BPPValue(uint16_t tileRowAddress, uint8_t pixelIndex); //! @brief render the selected ram void render(); TileRenderer(); diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index 4b4ce3e..bf4304c 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -468,8 +468,8 @@ namespace ComSquare::PPU void PPU::update(unsigned cycles) { (void)cycles; - this->tileRenderer.setBpp(4); - this->tileRenderer.setPaletteIndex(2); + this->tileRenderer.setBpp(8); + this->tileRenderer.setPaletteIndex(0); this->tileRenderer.setNbColumns(16); this->tileRenderer.render(); // for (auto &i : this->_screen)