diff --git a/CMakeLists.txt b/CMakeLists.txt index 05789fa..cd751aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -242,7 +242,7 @@ add_executable(ComSquare sources/Renderer/QtRenderer/QtRenderSfml.hpp sources/Debugger/TileViewer/TileViewer.cpp sources/Debugger/TileViewer/TileViewer.hpp - ) + sources/Debugger/TileViewer/TileRenderer.cpp sources/Debugger/TileViewer/TileRenderer.hpp) include_directories(ComSquare sources) diff --git a/sources/Debugger/TileViewer/TileRenderer.cpp b/sources/Debugger/TileViewer/TileRenderer.cpp new file mode 100644 index 0000000..647a003 --- /dev/null +++ b/sources/Debugger/TileViewer/TileRenderer.cpp @@ -0,0 +1,103 @@ +// +// Created by cbihan on 24/05/2021. +// + +#include +#include "TileRenderer.hpp" +#include "PPU/PPU.hpp" + +namespace ComSquare::Debugger +{ + TileRenderer::TileRenderer() + : _ram(nullptr), + _cgram(nullptr), + _bpp(2), + _palette(0), + buffer({{{0}}}) + { + } + + void TileRenderer::setRam(std::shared_ptr ram) + { + this->_ram = std::move(ram); + } + + void TileRenderer::render() + { + uint8_t colorReference; + uint24_t color; + std::vector palette = this->getPalette(this->_palette); + int bufX = 0; + int bufY = 0; + int nbTilesDrawn = 0; + int resetX = 0; + + for (uint24_t i = 0; i < this->_ram->getSize(); i += this->_bpp) { + if (bufX >= 1024 || bufY >= 1024) + break; + for (int j = 0; j < 8; j++) { + colorReference = this->getPixelReferenceFromTileRow(i, j); + color = PPU::getRealColor(palette[colorReference]); + buffer[bufY][bufX++] = color; + } + bufY++; + bufX = resetX; + } + } + + void TileRenderer::setPalette(int palette) + { + this->_palette = palette; + } + + void TileRenderer::setBpp(int bpp) + { + this->_bpp = bpp; + } + + uint8_t TileRenderer::getPixelReferenceFromTileRow(uint16_t tileRowAddress, uint8_t pixelIndex) + { + 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; + + switch (this->_bpp) { + case 8: + return highByte; + 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); + FALLTHROUGH + case 2: + result += ((highByte & (1U << shift)) | ((lowByte & (1U << shift)) << 1U)) >> shift; + default: + break; + } + return result; + } + + std::vector TileRenderer::getPalette(int nbPalette) + { + uint8_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); + + for (int i = 0; i < nbColors; i++) { + palette[i] = this->_cgram->read(addr); + palette[i] += this->_cgram->read(addr + 1) << 8U; + addr += 2; + } + return palette; + } + + void TileRenderer::setCgram(std::shared_ptr ram) + { + this->_cgram = std::move(ram); + } +} \ No newline at end of file diff --git a/sources/Debugger/TileViewer/TileRenderer.hpp b/sources/Debugger/TileViewer/TileRenderer.hpp new file mode 100644 index 0000000..ae2be50 --- /dev/null +++ b/sources/Debugger/TileViewer/TileRenderer.hpp @@ -0,0 +1,39 @@ +// +// Created by cbihan on 24/05/2021. +// + +#pragma once + +#include +#include "Ram/Ram.hpp" + +namespace ComSquare::Debugger +{ + class TileRenderer { + private: + //! @brief ram to render + std::shared_ptr _ram; + //! @brief cgram to access the colors + std::shared_ptr _cgram; + //! @brief The bpp to use while rendering + int _bpp; + //! @brief The palette number to use while rendering + int _palette; + public: + //! @brief internal buffer + std::array, 1024> buffer; + void setPalette(int palette); + void setCgram(std::shared_ptr ram); + void setBpp(int bpp); + void setRam(std::shared_ptr ram); + uint8_t getPixelReferenceFromTileRow(uint16_t tileRowAddress, uint8_t pixelIndex); + std::vector getPalette(int nbPalette); + //! @brief render the selected ram + void render(); + TileRenderer(); + TileRenderer(const TileRenderer &) = default; + ~TileRenderer() = default; + TileRenderer &operator=(const TileRenderer &) = default; + }; +} + diff --git a/sources/Debugger/TileViewer/TileViewer.cpp b/sources/Debugger/TileViewer/TileViewer.cpp index a4ffc0c..584c4e9 100644 --- a/sources/Debugger/TileViewer/TileViewer.cpp +++ b/sources/Debugger/TileViewer/TileViewer.cpp @@ -14,8 +14,6 @@ namespace ComSquare::Renderer #include #include #include -#include -#include #include "Utility/Utility.hpp" #include "PPU/PPU.hpp" @@ -56,92 +54,4 @@ namespace ComSquare::Debugger { return this->_ppu.cgramRead(addr); } - - TileRenderer::TileRenderer() - : _ram(nullptr), - _cgram(nullptr), - _bpp(2), - _palette(0), - buffer({{{0}}}) - { - } - - void TileRenderer::setRam(std::shared_ptr ram) - { - this->_ram = std::move(ram); - } - - void TileRenderer::render() - { - uint8_t colorReference; - uint24_t color; - std::vector palette = this->getPalette(this->_palette); - int bufX = 0; - int bufY = 0; - - for (uint24_t i = 0; i < this->_ram->getSize(); i += this->_bpp) { - for (int j = 0; j < 8; j ++) { - colorReference = this->getPixelReferenceFromTileRow(i, j); - color = PPU::getRealColor(palette[colorReference]); - buffer[bufY++][bufX++] = color; - } - } - } - - void TileRenderer::setPalette(int palette) - { - this->_palette = palette; - } - - void TileRenderer::setBpp(int bpp) - { - this->_bpp = bpp; - } - - uint8_t TileRenderer::getPixelReferenceFromTileRow(uint16_t tileRowAddress, uint8_t pixelIndex) - { - 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; - - switch (this->_bpp) { - case 8: - return highByte; - 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); - FALLTHROUGH - case 2: - result += ((highByte & (1U << shift)) | ((lowByte & (1U << shift)) << 1U)) >> shift; - default: - break; - } - return result; - } - - std::vector TileRenderer::getPalette(int nbPalette) - { - uint8_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); - - for (int i = 0; i < nbColors; i++) { - palette[i] = this->_cgram->read(addr); - palette[i] += this->_cgram->read(addr + 1) << 8U; - addr += 2; - } - return palette; - } - - void TileRenderer::setCgram(std::shared_ptr ram) - { - this->_cgram = std::move(ram); - } - } \ No newline at end of file diff --git a/sources/Debugger/TileViewer/TileViewer.hpp b/sources/Debugger/TileViewer/TileViewer.hpp index 63039cb..a36fe75 100644 --- a/sources/Debugger/TileViewer/TileViewer.hpp +++ b/sources/Debugger/TileViewer/TileViewer.hpp @@ -4,6 +4,11 @@ #pragma once +namespace ComSquare::PPU +{ + class PPU; +} + #include #include #include @@ -11,38 +16,12 @@ #include "PPU/PPU.hpp" #include "Debugger/ClosableWindow.hpp" #include "Renderer/QtRenderer/QtSFML.hpp" -#include "../../ui/ui_tileView.h" +#include "../../../ui/ui_tileView.h" #include "Ram/Ram.hpp" namespace ComSquare::Debugger { - class TileRenderer { - private: - //! @brief ram to render - std::shared_ptr _ram; - //! @brief cgram to access the colors - std::shared_ptr _cgram; - //! @brief The bpp to use while rendering - int _bpp; - //! @brief The palette number to use while rendering - int _palette; - public: - //! @brief internal buffer - std::array, 1024> buffer; - void setPalette(int palette); - void setCgram(std::shared_ptr ram); - void setBpp(int bpp); - void setRam(std::shared_ptr ram); - uint8_t getPixelReferenceFromTileRow(uint16_t tileRowAddress, uint8_t pixelIndex); - std::vector getPalette(int nbPalette); - //! @brief render the selected ram - void render(); - TileRenderer(); - TileRenderer(const TileRenderer &) = default; - ~TileRenderer() = default; - TileRenderer &operator=(const TileRenderer &) = default; - }; //! @brief window that allow the user to view all data going through the memory bus. class TileViewer : public QObject { diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index 3315ce3..e71ef61 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -9,6 +9,7 @@ #include "Exceptions/InvalidAddress.hpp" #include "Ram/Ram.hpp" #include "Models/Vector2.hpp" +#include "Debugger/TileViewer/TileRenderer.hpp" #include namespace ComSquare::PPU @@ -475,12 +476,12 @@ namespace ComSquare::PPU this->add_buffer(this->_screen, this->_subScreen); this->add_buffer(this->_screen, this->_mainScreen); //this->_backgrounds[2].renderBackground(); - //add_buffer(this->_screen, this->_backgrounds[2].buffer); + //add_buffer(this->_screen, this->_backgrounds[2].buffer);*/ for (unsigned long i = 0; i < this->_screen.size(); i++) { for (unsigned long j = 0; j < this->_screen[i].size(); j++) { this->_renderer.putPixel(j, i, this->_screen[i][j]); } - }*/ + } this->_renderer.drawScreen(); } diff --git a/sources/PPU/PPU.hpp b/sources/PPU/PPU.hpp index f52bd36..f68595b 100644 --- a/sources/PPU/PPU.hpp +++ b/sources/PPU/PPU.hpp @@ -13,11 +13,11 @@ #include "Models/Vector2.hpp" #include "Background.hpp" #include "PPUUtils.hpp" -#include "Debugger/TileViewer/TileViewer.hpp" +#include "Debugger/TileViewer/TileRenderer.hpp" #define FALLTHROUGH __attribute__((fallthrough)); -// TODO check if it usefull to have defines instead of constepxr +// TODO check if it useful to have defines instead of constexpr #define VRAMSIZE 65536 #define CGRAMSIZE 512 #define OAMRAMSIZE 544 diff --git a/sources/SNES.cpp b/sources/SNES.cpp index 1c45d36..e52d9fa 100644 --- a/sources/SNES.cpp +++ b/sources/SNES.cpp @@ -10,6 +10,7 @@ #include "Debugger/APUDebug.hpp" #include "Debugger/MemoryBusDebug.hpp" #include "Debugger/CGramDebug.hpp" +#include "Debugger/TileViewer/TileViewer.hpp" #endif namespace ComSquare