From fad712f9e2ac7608eeeba79c9a814539a3bb7c8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 4 May 2021 23:30:20 +0200 Subject: [PATCH 01/35] fixing typos and indents --- sources/Renderer/QtRenderer/QtWidgetSFML.hpp | 2 +- sources/SNES.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sources/Renderer/QtRenderer/QtWidgetSFML.hpp b/sources/Renderer/QtRenderer/QtWidgetSFML.hpp index 1825d51..ce5c5c9 100644 --- a/sources/Renderer/QtRenderer/QtWidgetSFML.hpp +++ b/sources/Renderer/QtRenderer/QtWidgetSFML.hpp @@ -28,7 +28,7 @@ namespace ComSquare::Renderer //! @brief QT event that refresh the widget. (A draw screen) void paintEvent(QPaintEvent*) override; - // @brief Internal timer used for update intervals. + //! @brief Internal timer used for update intervals. QTimer _timer; //! @brief Has the SF window been created yet. bool _isInitialized = false; diff --git a/sources/SNES.cpp b/sources/SNES.cpp index 3ad1cb4..295da1f 100644 --- a/sources/SNES.cpp +++ b/sources/SNES.cpp @@ -124,7 +124,7 @@ namespace ComSquare void SNES::enableMemoryBusDebugging() { - #ifdef DEBUGGER_ENABLED + #ifdef DEBUGGER_ENABLED if (this->bus->isDebugger()) std::static_pointer_cast(this->bus)->focus(); else @@ -132,9 +132,9 @@ namespace ComSquare this->bus = std::make_shared(*this, *this->bus); this->cpu->setMemoryBus(this->bus); } - #else + #else std::cerr << "Debugging features are not enabled. You can't enable the debugger." << std::endl; - #endif + #endif } void SNES::disableMemoryBusDebugging() @@ -160,7 +160,7 @@ namespace ComSquare void SNES::disableCgramDebugging() { #ifdef DEBUGGER_ENABLED - this->_cgramViewer = nullptr; + this->_cgramViewer = nullptr; #endif } From dfc0aef74b35c54f2efaee4b9d1a7a02465eedf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Fri, 7 May 2021 00:16:16 +0200 Subject: [PATCH 02/35] starting to implement test ui to try to connect window and sfmlQwidget --- CMakeLists.txt | 2 +- sources/Debugger/TileViewer.cpp | 58 +++++++++++++++++++++++ sources/Debugger/TileViewer.hpp | 80 ++++++++++++++++++++++++++++++++ ui/testSfml.ui | 82 +++++++++++++++++++++++++++++++++ 4 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 sources/Debugger/TileViewer.cpp create mode 100644 sources/Debugger/TileViewer.hpp create mode 100644 ui/testSfml.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index dbc442d..5aa595c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -237,7 +237,7 @@ add_executable(ComSquare sources/APU/DSP/Timer.cpp sources/APU/DSP/BRR.cpp sources/PPU/PPUUtils.cpp - ) + sources/Debugger/TileViewer.cpp sources/Debugger/TileViewer.hpp) target_compile_definitions(ComSquare PUBLIC DEBUGGER_ENABLED) diff --git a/sources/Debugger/TileViewer.cpp b/sources/Debugger/TileViewer.cpp new file mode 100644 index 0000000..e6c73f9 --- /dev/null +++ b/sources/Debugger/TileViewer.cpp @@ -0,0 +1,58 @@ +// +// Created by cbihan on 5/7/21. +// + +#include "TileViewer.hpp" +#include "../SNES.hpp" +#include +#include +#include +#include +#include "../Utility/Utility.hpp" + +namespace ComSquare::Debugger +{ + TileViewer::TileViewer(SNES &snes, ComSquare::PPU::PPU &ppu) + : _window(new ClosableWindow(*this, &TileViewer::disableViewer)), + _snes(snes), + _ui(), + _ppu(ppu) + { + this->_window->setContextMenuPolicy(Qt::NoContextMenu); + this->_window->setAttribute(Qt::WA_QuitOnClose, false); + this->_window->setAttribute(Qt::WA_DeleteOnClose); + + this->_ui.setupUi(this->_window); +// QMainWindow::connect(this->_ui.cgram_view, &QTableView::pressed, this, &TileViewer::tileClicked); + this->_window->show(); + QEvent::registerEventType(); + } + + void TileViewer::disableViewer() + { + return; + } + + void TileViewer::focus() + { + this->_window->activateWindow(); + } + + bool TileViewer::isDebugger() + { + return true; + } + + uint16_t TileViewer::read(uint8_t addr) + { + return this->_ppu.cgramRead(addr); + } + + void TileViewer::tileClicked(const QModelIndex &index) + { + return; + if (!index.isValid()) + return; + this->updateInfoTile(index.row(), index.column()); + } +} \ No newline at end of file diff --git a/sources/Debugger/TileViewer.hpp b/sources/Debugger/TileViewer.hpp new file mode 100644 index 0000000..d3444f6 --- /dev/null +++ b/sources/Debugger/TileViewer.hpp @@ -0,0 +1,80 @@ +// +// Created by cbihan on 5/7/21. +// + +#pragma once + +#include +#include "../PPU/PPU.hpp" +#include "../../ui/ui_cgramView.h" +#include +#include +#include +#include +#include "ClosableWindow.hpp" + +/* +//! @brief The qt model that bind the logs to the view. +class CGramModel : public QAbstractTableModel +{ +Q_OBJECT +private: + //! @brief The ppu to log the cgram. + ComSquare::PPU::PPU &_ppu; +public: + //! @brief The number of columns + const int column = 16; + //! @brief The number of rows + const int rows = 16; + int x; + int y; + explicit CGramModel(ComSquare::PPU::PPU &ppu); + CGramModel(const CGramModel &) = delete; + const CGramModel &operator=(const CGramModel &) = delete; + ~CGramModel() override = default; + + //! @brief The number of row the table has. + int rowCount(const QModelIndex &parent) const override; + //! @brief The number of column the table has. + int columnCount(const QModelIndex &parent) const override; + //! @brief Return a data representing the table cell. + QVariant data(const QModelIndex &index, int role) const override; +}; + */ + +namespace ComSquare::Debugger +{ + //! @brief window that allow the user to view all data going through the memory bus. + class TileViewer : public QObject { + private: + //! @brief The QT window for this debugger. + ClosableWindow *_window; + //! @brief A reference to the snes (to disable the debugger). + SNES &_snes; + //! @brief A widget that contain the whole UI. + Ui::CgramView _ui; + //! @brief A reference to the ppu + ComSquare::PPU::PPU &_ppu; + public: + //! @brief Called when the window is closed. Turn off the debugger. + void disableViewer(); + public: + explicit TileViewer(SNES &snes, ComSquare::PPU::PPU &ppu); + TileViewer(const TileViewer &) = delete; + TileViewer &operator=(const TileViewer &) = delete; + ~TileViewer() = default; + + //! @brief Read data at the CGRAM address send it to the debugger. + //! @param addr The address to read from. + //! @return The color value in BGR, looks like this xbbbbbgggggrrrrr. + uint16_t read(uint8_t addr); + //! @brief Focus the debugger's window. + void focus(); + //! @brief Return true if the Bus is overloaded with debugging features. + bool isDebugger(); + //! @brief Update the text fields with corresponding tile info + void updateInfoTile(int row, int column); + //! @brief Update call updateInfoTile with the correct address + void tileClicked(const QModelIndex &index); + }; +} diff --git a/ui/testSfml.ui b/ui/testSfml.ui new file mode 100644 index 0000000..3bc2b67 --- /dev/null +++ b/ui/testSfml.ui @@ -0,0 +1,82 @@ + + + TileViwer + + + + 0 + 0 + 577 + 478 + + + + Palette Viewer + + + + :/resources/Logo.png:/resources/Logo.png + + + + + + + 0 + + + + Tab 1 + + + + + Tab 2 + + + + + 250 + 170 + 83 + 25 + + + + PushButton + + + + + + 150 + 160 + 83 + 25 + + + + PushButton + + + + + + + + + + + 0 + 0 + 577 + 22 + + + + + + + + + From 699fee9537ae3b617a7e7756365db3ad42b4059b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Fri, 7 May 2021 00:29:37 +0200 Subject: [PATCH 03/35] starting window --- sources/Renderer/QtRenderer/QtSFML.cpp | 10 ++++++++++ sources/Renderer/QtRenderer/QtSFML.hpp | 2 ++ sources/SNES.cpp | 17 +++++++++++++++++ sources/SNES.hpp | 7 +++++++ ui/testSfml.ui | 6 +++--- 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/sources/Renderer/QtRenderer/QtSFML.cpp b/sources/Renderer/QtRenderer/QtSFML.cpp index 950ca09..11ff3c5 100644 --- a/sources/Renderer/QtRenderer/QtSFML.cpp +++ b/sources/Renderer/QtRenderer/QtSFML.cpp @@ -77,6 +77,11 @@ namespace ComSquare::Renderer QMainWindow::connect(registerDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableRegisterViewer); debugger->addAction(registerDebugger); + QAction *tileDebugger = new QAction("Tile Viewer", &this->_window); + tileDebugger->setShortcut(Qt::Key_F8); + QMainWindow::connect(tileDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableTileViewer); + debugger->addAction(tileDebugger); + this->_window.show(); } @@ -154,4 +159,9 @@ namespace ComSquare::Renderer { this->_snes.enableRegisterDebugging(); } + + void QtFullSFML::enableTileViewer() + { + this->_snes.enableTileViewerDebugging(); + } } \ No newline at end of file diff --git a/sources/Renderer/QtRenderer/QtSFML.hpp b/sources/Renderer/QtRenderer/QtSFML.hpp index 2156052..a55afc5 100644 --- a/sources/Renderer/QtRenderer/QtSFML.hpp +++ b/sources/Renderer/QtRenderer/QtSFML.hpp @@ -37,6 +37,8 @@ namespace ComSquare::Renderer void enableCgramViewer(); //! @brief Action called when clicking on the enable DMA viewer button. void enableRegisterViewer(); + //! @brief Action called when clicking on the enable Tile viwer button + void enableTileViewer(); //! @brief Action called when clicking on the reset button. void reset(); diff --git a/sources/SNES.cpp b/sources/SNES.cpp index 295da1f..1c45d36 100644 --- a/sources/SNES.cpp +++ b/sources/SNES.cpp @@ -180,4 +180,21 @@ namespace ComSquare this->_registerViewer = std::make_unique(*this); #endif } + + void SNES::disableTileViewerDebugging() + { + #ifdef DEBUGGER_ENABLED + this->_tileViewer = nullptr; + #endif + } + + void SNES::enableTileViewerDebugging() + { + #ifdef DEBUGGER_ENABLED + if (this->_tileViewer) + this->_tileViewer->focus(); + else + this->_tileViewer = std::make_unique(*this, *this->ppu); + } + #endif } diff --git a/sources/SNES.hpp b/sources/SNES.hpp index 4739600..757b0b7 100644 --- a/sources/SNES.hpp +++ b/sources/SNES.hpp @@ -19,6 +19,7 @@ #include "Debugger/HeaderViewer.hpp" #include "Debugger/CGramDebug.hpp" #include "Debugger/RegisterViewer.hpp" + #include "Debugger/TileViewer.hpp" #endif namespace ComSquare @@ -35,6 +36,8 @@ namespace ComSquare std::unique_ptr _cgramViewer; //! @brief The window that allow the user to view registers. std::unique_ptr _registerViewer; + //! @brief The window that allow the user to view the cgram as tiles. + std::unique_ptr _tileViewer; #endif public: //! @brief The memory bus that map addresses to components. @@ -87,6 +90,10 @@ namespace ComSquare void disableRegisterDebugging(); //! @brief Enable the Register's debugging window. void enableRegisterDebugging(); + //! @brief Disable the TileViewer's debugging window. + void disableTileViewerDebugging(); + //! @brief Enable the TileViewer's debugging window. + void enableTileViewerDebugging(); //! @brief Create all the components using a common memory bus for all of them. SNES(const std::string &ramPath, Renderer::IRenderer &renderer); diff --git a/ui/testSfml.ui b/ui/testSfml.ui index 3bc2b67..ea35f63 100644 --- a/ui/testSfml.ui +++ b/ui/testSfml.ui @@ -1,7 +1,7 @@ - TileViwer - + TileViewer + 0 @@ -11,7 +11,7 @@ - Palette Viewer + Tile Viewer From d94c26aac3516c02bb4fc1d236835456767857f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Fri, 7 May 2021 00:35:40 +0200 Subject: [PATCH 04/35] rnamming and fixing small things --- sources/Debugger/TileViewer.cpp | 2 +- ui/{testSfml.ui => tileView.ui} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename ui/{testSfml.ui => tileView.ui} (100%) diff --git a/sources/Debugger/TileViewer.cpp b/sources/Debugger/TileViewer.cpp index e6c73f9..5e452ae 100644 --- a/sources/Debugger/TileViewer.cpp +++ b/sources/Debugger/TileViewer.cpp @@ -30,7 +30,7 @@ namespace ComSquare::Debugger void TileViewer::disableViewer() { - return; + this->_snes.disableTileViewerDebugging(); } void TileViewer::focus() diff --git a/ui/testSfml.ui b/ui/tileView.ui similarity index 100% rename from ui/testSfml.ui rename to ui/tileView.ui From da612e4b2399703405a4f8f8127747a20cf9011b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Fri, 7 May 2021 00:43:24 +0200 Subject: [PATCH 05/35] starting window correctly and generating correct files --- CMakeLists.txt | 4 +++- sources/Debugger/TileViewer.hpp | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5aa595c..8953676 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -237,7 +237,9 @@ add_executable(ComSquare sources/APU/DSP/Timer.cpp sources/APU/DSP/BRR.cpp sources/PPU/PPUUtils.cpp - sources/Debugger/TileViewer.cpp sources/Debugger/TileViewer.hpp) + sources/Debugger/TileViewer.cpp + sources/Debugger/TileViewer.hpp + ui/tileView.ui) target_compile_definitions(ComSquare PUBLIC DEBUGGER_ENABLED) diff --git a/sources/Debugger/TileViewer.hpp b/sources/Debugger/TileViewer.hpp index d3444f6..365ed1a 100644 --- a/sources/Debugger/TileViewer.hpp +++ b/sources/Debugger/TileViewer.hpp @@ -6,7 +6,7 @@ #include #include "../PPU/PPU.hpp" -#include "../../ui/ui_cgramView.h" +#include "../../ui/ui_tileView.h" #include #include #include @@ -52,7 +52,7 @@ namespace ComSquare::Debugger //! @brief A reference to the snes (to disable the debugger). SNES &_snes; //! @brief A widget that contain the whole UI. - Ui::CgramView _ui; + Ui::TileViewer _ui; //! @brief A reference to the ppu ComSquare::PPU::PPU &_ppu; public: From 06fcc69326cc22585453c7d84759cd4f6b30153e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 19 May 2021 00:31:18 +0200 Subject: [PATCH 06/35] starting to implement QTSFML and QTSFMLWIndow --- CMakeLists.txt | 234 ++++++++++--------- sources/Debugger/TileViewer.cpp | 15 +- sources/Debugger/TileViewer.hpp | 16 +- sources/Renderer/QtRenderer/QtRenderSfml.cpp | 28 +++ sources/Renderer/QtRenderer/QtRenderSfml.hpp | 57 +++++ sources/Renderer/QtRenderer/QtSFML.cpp | 131 ++++++----- sources/Renderer/QtRenderer/QtSFML.hpp | 32 ++- sources/main.cpp | 3 +- ui/tileView.ui | 7 +- 9 files changed, 321 insertions(+), 202 deletions(-) create mode 100644 sources/Renderer/QtRenderer/QtRenderSfml.cpp create mode 100644 sources/Renderer/QtRenderer/QtRenderSfml.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8953676..773536f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ project(ComSquare) add_compile_options(-W -Wall -Wextra -Wshadow) # make unit tests -add_executable(unit_tests +add_executable(unit_tests EXCLUDE_FROM_ALL tests/CPU/testAddressingMode.cpp tests/CPU/testInterupts.cpp tests/testMemoryBus.cpp @@ -125,121 +125,123 @@ set(CMAKE_AUTOUIC ON) # make app add_executable(ComSquare - sources/main.cpp - sources/SNES.cpp - sources/SNES.hpp - sources/Memory/MemoryBus.cpp - sources/Memory/MemoryBus.hpp - sources/Memory/AMemory.hpp - sources/Memory/AMemory.cpp - sources/PPU/PPU.cpp - sources/PPU/PPU.hpp - sources/CPU/CPU.cpp - sources/CPU/CPU.hpp - sources/Cartridge/Cartridge.cpp - sources/Cartridge/Cartridge.hpp - sources/Exceptions/NotImplementedException.hpp - sources/APU/APU.hpp - sources/APU/APU.cpp - sources/Exceptions/InvalidAddress.hpp - sources/Exceptions/InvalidRom.hpp - sources/Models/Int24.hpp - sources/Models/Int24.hpp - sources/Ram/Ram.cpp - sources/Ram/Ram.hpp - sources/Memory/MemoryShadow.cpp - sources/Memory/MemoryShadow.hpp - sources/Memory/ARectangleMemory.cpp - sources/Memory/ARectangleMemory.hpp - sources/APU/DSP/DSP.cpp - sources/APU/DSP/DSP.hpp - sources/Renderer/IRenderer.hpp - sources/Renderer/SFRenderer.hpp - sources/Renderer/SFRenderer.cpp - sources/Exceptions/InvalidAction.hpp - sources/Cartridge/InterruptVectors.hpp - sources/Memory/RectangleShadow.cpp - sources/Memory/RectangleShadow.hpp - sources/Exceptions/InvalidOpcode.hpp - sources/CPU/Instructions/Interrupts.cpp - sources/CPU/Instructions/MathematicalOperations.cpp - sources/APU/Instructions/Standbys.cpp - sources/APU/Instructions/ProgramStatusWord.cpp - sources/APU/Instructions/Bit.cpp - sources/CPU/Instructions/MathematicalOperations.cpp - sources/CPU/Instructions/MemoryInstructions.cpp - sources/CPU/Instructions/InternalInstruction.cpp - sources/Ram/ExtendedRam.cpp - sources/Ram/ExtendedRam.hpp - sources/Debugger/CPU/CPUDebug.cpp - sources/Debugger/CPU/CPUDebug.hpp - sources/Renderer/QtRenderer/QtSFML.cpp - sources/Renderer/QtRenderer/QtSFML.hpp - sources/Renderer/QtRenderer/QtWidgetSFML.cpp - sources/Renderer/QtRenderer/QtWidgetSFML.hpp - ui/cpuView.ui - ui/ramView.ui - ui/cartridgeView.ui - ui/apuView.ui - ui/busView.ui - resources/appResources.qrc - sources/Utility/Utility.hpp - sources/Debugger/MemoryViewer.cpp - sources/Debugger/MemoryViewer.hpp - sources/Utility/Utility.cpp - sources/Debugger/HeaderViewer.cpp - sources/Debugger/HeaderViewer.hpp - sources/CPU/Instructions/BitsInstructions.cpp - sources/Debugger/HeaderViewer.cpp - sources/Debugger/HeaderViewer.hpp - sources/Debugger/APUDebug.hpp - sources/Debugger/APUDebug.cpp - sources/APU/Instructions/Stack.cpp - sources/APU/Instructions/Subroutine.cpp - sources/APU/Instructions/ProgramFlow.cpp - sources/APU/Operand.cpp - sources/APU/Instructions/DecimalCompensation.cpp - sources/APU/Instructions/MultiplicationDivision.cpp - sources/APU/Instructions/16bitArithmetic.cpp - sources/APU/Instructions/16bitDataTransmission.cpp - sources/APU/Instructions/8bitShiftRotation.cpp - sources/APU/Instructions/8bitIncrementDecrement.cpp - sources/APU/Instructions/8bitLogical.cpp - sources/APU/Instructions/8bitArithmetic.cpp - sources/APU/Instructions/8bitDataTransmission.cpp - sources/APU/IPL/IPL.hpp - sources/APU/IPL/IPL.cpp - sources/CPU/Instructions/TransferRegisters.cpp - sources/CPU/AddressingModes.cpp - sources/Debugger/MemoryBusDebug.cpp - sources/Debugger/MemoryBusDebug.hpp - sources/Debugger/ClosableWindow.hpp - sources/Models/Components.hpp - sources/CPU/Instruction.hpp - sources/Exceptions/DebuggableError.hpp - sources/Debugger/CPU/Disassembly.cpp - sources/Models/Components.hpp - sources/Debugger/CGramDebug.cpp - sources/Debugger/CGramDebug.hpp - sources/Models/Vector2.hpp - sources/PPU/Background.cpp - sources/PPU/Background.hpp - sources/CPU/DMA/DMA.cpp - sources/CPU/DMA/DMA.hpp - ui/registersView.ui - sources/Debugger/RegisterViewer.cpp - sources/Debugger/RegisterViewer.hpp - sources/Memory/IMemory.hpp - sources/APU/DSP/Voice.cpp - sources/APU/DSP/Echo.cpp - sources/APU/DSP/Gauss.cpp - sources/APU/DSP/Envelope.cpp - sources/APU/DSP/Timer.cpp - sources/APU/DSP/BRR.cpp - sources/PPU/PPUUtils.cpp - sources/Debugger/TileViewer.cpp - sources/Debugger/TileViewer.hpp - ui/tileView.ui) + sources/main.cpp + sources/SNES.cpp + sources/SNES.hpp + sources/Memory/MemoryBus.cpp + sources/Memory/MemoryBus.hpp + sources/Memory/AMemory.hpp + sources/Memory/AMemory.cpp + sources/PPU/PPU.cpp + sources/PPU/PPU.hpp + sources/CPU/CPU.cpp + sources/CPU/CPU.hpp + sources/Cartridge/Cartridge.cpp + sources/Cartridge/Cartridge.hpp + sources/Exceptions/NotImplementedException.hpp + sources/APU/APU.hpp + sources/APU/APU.cpp + sources/Exceptions/InvalidAddress.hpp + sources/Exceptions/InvalidRom.hpp + sources/Models/Int24.hpp + sources/Models/Int24.hpp + sources/Ram/Ram.cpp + sources/Ram/Ram.hpp + sources/Memory/MemoryShadow.cpp + sources/Memory/MemoryShadow.hpp + sources/Memory/ARectangleMemory.cpp + sources/Memory/ARectangleMemory.hpp + sources/APU/DSP/DSP.cpp + sources/APU/DSP/DSP.hpp + sources/Renderer/IRenderer.hpp + sources/Renderer/SFRenderer.hpp + sources/Renderer/SFRenderer.cpp + sources/Exceptions/InvalidAction.hpp + sources/Cartridge/InterruptVectors.hpp + sources/Memory/RectangleShadow.cpp + sources/Memory/RectangleShadow.hpp + sources/Exceptions/InvalidOpcode.hpp + sources/CPU/Instructions/Interrupts.cpp + sources/CPU/Instructions/MathematicalOperations.cpp + sources/APU/Instructions/Standbys.cpp + sources/APU/Instructions/ProgramStatusWord.cpp + sources/APU/Instructions/Bit.cpp + sources/CPU/Instructions/MathematicalOperations.cpp + sources/CPU/Instructions/MemoryInstructions.cpp + sources/CPU/Instructions/InternalInstruction.cpp + sources/Ram/ExtendedRam.cpp + sources/Ram/ExtendedRam.hpp + sources/Debugger/CPU/CPUDebug.cpp + sources/Debugger/CPU/CPUDebug.hpp + sources/Renderer/QtRenderer/QtSFML.cpp + sources/Renderer/QtRenderer/QtSFML.hpp + sources/Renderer/QtRenderer/QtWidgetSFML.cpp + sources/Renderer/QtRenderer/QtWidgetSFML.hpp + ui/cpuView.ui + ui/ramView.ui + ui/cartridgeView.ui + ui/apuView.ui + ui/busView.ui + resources/appResources.qrc + sources/Utility/Utility.hpp + sources/Debugger/MemoryViewer.cpp + sources/Debugger/MemoryViewer.hpp + sources/Utility/Utility.cpp + sources/Debugger/HeaderViewer.cpp + sources/Debugger/HeaderViewer.hpp + sources/CPU/Instructions/BitsInstructions.cpp + sources/Debugger/HeaderViewer.cpp + sources/Debugger/HeaderViewer.hpp + sources/Debugger/APUDebug.hpp + sources/Debugger/APUDebug.cpp + sources/APU/Instructions/Stack.cpp + sources/APU/Instructions/Subroutine.cpp + sources/APU/Instructions/ProgramFlow.cpp + sources/APU/Operand.cpp + sources/APU/Instructions/DecimalCompensation.cpp + sources/APU/Instructions/MultiplicationDivision.cpp + sources/APU/Instructions/16bitArithmetic.cpp + sources/APU/Instructions/16bitDataTransmission.cpp + sources/APU/Instructions/8bitShiftRotation.cpp + sources/APU/Instructions/8bitIncrementDecrement.cpp + sources/APU/Instructions/8bitLogical.cpp + sources/APU/Instructions/8bitArithmetic.cpp + sources/APU/Instructions/8bitDataTransmission.cpp + sources/APU/IPL/IPL.hpp + sources/APU/IPL/IPL.cpp + sources/CPU/Instructions/TransferRegisters.cpp + sources/CPU/AddressingModes.cpp + sources/Debugger/MemoryBusDebug.cpp + sources/Debugger/MemoryBusDebug.hpp + sources/Debugger/ClosableWindow.hpp + sources/Models/Components.hpp + sources/CPU/Instruction.hpp + sources/Exceptions/DebuggableError.hpp + sources/Debugger/CPU/Disassembly.cpp + sources/Models/Components.hpp + sources/Debugger/CGramDebug.cpp + sources/Debugger/CGramDebug.hpp + sources/Models/Vector2.hpp + sources/PPU/Background.cpp + sources/PPU/Background.hpp + sources/CPU/DMA/DMA.cpp + sources/CPU/DMA/DMA.hpp + ui/registersView.ui + sources/Debugger/RegisterViewer.cpp + sources/Debugger/RegisterViewer.hpp + sources/Memory/IMemory.hpp + sources/APU/DSP/Voice.cpp + sources/APU/DSP/Echo.cpp + sources/APU/DSP/Gauss.cpp + sources/APU/DSP/Envelope.cpp + sources/APU/DSP/Timer.cpp + sources/APU/DSP/BRR.cpp + sources/PPU/PPUUtils.cpp + sources/Debugger/TileViewer.cpp + sources/Debugger/TileViewer.hpp + ui/tileView.ui sources/Renderer/QtRenderer/QtRenderSfml.cpp sources/Renderer/QtRenderer/QtRenderSfml.hpp) + +#include_directories(ComSquare sources) target_compile_definitions(ComSquare PUBLIC DEBUGGER_ENABLED) diff --git a/sources/Debugger/TileViewer.cpp b/sources/Debugger/TileViewer.cpp index 5e452ae..7dad780 100644 --- a/sources/Debugger/TileViewer.cpp +++ b/sources/Debugger/TileViewer.cpp @@ -2,6 +2,12 @@ // Created by cbihan on 5/7/21. // +namespace ComSquare::Renderer +{ + class QtFullSFML; +} + +#include "../Renderer/QtRenderer/QtSFML.hpp" #include "TileViewer.hpp" #include "../SNES.hpp" #include @@ -21,9 +27,9 @@ namespace ComSquare::Debugger this->_window->setContextMenuPolicy(Qt::NoContextMenu); this->_window->setAttribute(Qt::WA_QuitOnClose, false); this->_window->setAttribute(Qt::WA_DeleteOnClose); + //this->_sfWidget = std::make_unique(snes, this->_ui.tab, QPoint(0, 0), QSize(this->_ui.tab->width(), this->_ui.tab->height()), 30); this->_ui.setupUi(this->_window); -// QMainWindow::connect(this->_ui.cgram_view, &QTableView::pressed, this, &TileViewer::tileClicked); this->_window->show(); QEvent::registerEventType(); } @@ -48,11 +54,4 @@ namespace ComSquare::Debugger return this->_ppu.cgramRead(addr); } - void TileViewer::tileClicked(const QModelIndex &index) - { - return; - if (!index.isValid()) - return; - this->updateInfoTile(index.row(), index.column()); - } } \ No newline at end of file diff --git a/sources/Debugger/TileViewer.hpp b/sources/Debugger/TileViewer.hpp index 365ed1a..c9c26c5 100644 --- a/sources/Debugger/TileViewer.hpp +++ b/sources/Debugger/TileViewer.hpp @@ -4,14 +4,20 @@ #pragma once +namespace ComSquare::Renderer +{ + class QtSFML; +} + #include -#include "../PPU/PPU.hpp" -#include "../../ui/ui_tileView.h" #include #include #include #include #include "ClosableWindow.hpp" +//#include "../Renderer/QtRenderer/QtSFML.hpp" +#include "../PPU/PPU.hpp" +#include "../../ui/ui_tileView.h" /* //! @brief The qt model that bind the logs to the view. @@ -55,6 +61,8 @@ namespace ComSquare::Debugger Ui::TileViewer _ui; //! @brief A reference to the ppu ComSquare::PPU::PPU &_ppu; + //! @brief the window + //Renderer::QtSFML _sfWidget; public: //! @brief Called when the window is closed. Turn off the debugger. void disableViewer(); @@ -72,9 +80,5 @@ namespace ComSquare::Debugger void focus(); //! @brief Return true if the Bus is overloaded with debugging features. bool isDebugger(); - //! @brief Update the text fields with corresponding tile info - void updateInfoTile(int row, int column); - //! @brief Update call updateInfoTile with the correct address - void tileClicked(const QModelIndex &index); }; } diff --git a/sources/Renderer/QtRenderer/QtRenderSfml.cpp b/sources/Renderer/QtRenderer/QtRenderSfml.cpp new file mode 100644 index 0000000..239c4fc --- /dev/null +++ b/sources/Renderer/QtRenderer/QtRenderSfml.cpp @@ -0,0 +1,28 @@ +// +// Created by cbihan on 18/05/2021. +// + +#include "QtRenderSfml.hpp" +#include + +namespace ComSquare::Renderer +{ + QtRenderSFML::QtRenderSFML(ComSquare::SNES &snes, QWidget *parent, const QPoint &position, const QSize &size, int frameRate) + : QtWidgetSFML(parent, position, size, frameRate), + _snes(snes) + { + } + + void QtRenderSFML::_onUpdate() + { + try { + this->_snes.update(); + } catch (const DebuggableError &e) { + std::cout << "Invalid rom's instruction: " << e.what() << std::endl; + this->_snes.enableCPUDebuggingWithError(e); + } catch (std::exception &e) { + std::cerr << "An error occurred: " << e.what() << std::endl; + QApplication::quit(); + } + } +} \ No newline at end of file diff --git a/sources/Renderer/QtRenderer/QtRenderSfml.hpp b/sources/Renderer/QtRenderer/QtRenderSfml.hpp new file mode 100644 index 0000000..5eeab48 --- /dev/null +++ b/sources/Renderer/QtRenderer/QtRenderSfml.hpp @@ -0,0 +1,57 @@ +// +// Created by cbihan on 18/05/2021. +// + +#pragma once + +#include +#include +#include +#include +#include +#include "../IRenderer.hpp" +#include "../SFRenderer.hpp" +#include "QtWidgetSFML.hpp" +#include "QtSFML.hpp" + +namespace ComSquare::Renderer +{ + class QtRenderSFML : public QtWidgetSFML + { + private: + //! @brief The main window that the app reside on. + //QMainWindow _window; + QWidget _window; + //! @brief The SFML widget. + std::unique_ptr _sfWidget = nullptr; + public: + + void setParentWidget(QWidget &widget); + //! @brief Use this function to create the window. + //! @param maxFPS The number of FPS you aim to run on. + void createWindow(SNES &snes, int maxFPS) override; + //! @brief Add a pixel to the buffer to the coordinates x, y with the color rgba. + //! @param X horizontal index. + //! @param Y vertical index. + //! @param rgba The color of the pixel. + void putPixel(unsigned y, unsigned x, uint32_t rgba) override; + //! @brief This function doesn't do anything because QT internally handle drawing to the screen. + void drawScreen() override; + //! @brief Playing all samples from buffer + //! @param samples Buffer containing samples + //! @param sampleCount number of samples inside buffer + void playAudio(std::span samples, uint64_t sampleCount) override; + //! @brief Set a new name to the window, if there is already a name it will be overwrite. + //! @param newWindowName new title for the window. + void setWindowName(std::string &newWindowName) override; + //! @brief Constructor that return a SFML renderer inside a QT window. + //! @param height _height of the window. + //! @param width _width of the window. + QtRenderSFML(SNES &snes, QWidget* parent, const QPoint& position, const QSize& size, int frameRate = 0); + QtRenderSFML(const QtRenderSFML &) = delete; + QtRenderSFML &operator=(const QtRenderSFML &) = delete; + ~QtRenderSFML() override = default; + }; + }; + +} diff --git a/sources/Renderer/QtRenderer/QtSFML.cpp b/sources/Renderer/QtRenderer/QtSFML.cpp index 11ff3c5..3cdb657 100644 --- a/sources/Renderer/QtRenderer/QtSFML.cpp +++ b/sources/Renderer/QtRenderer/QtSFML.cpp @@ -17,72 +17,15 @@ namespace ComSquare::Renderer { - QtSFML::QtSFML(unsigned int h, unsigned int w) : - _window(), _sfWidget(nullptr) + QtSFML::QtSFML(QWidget *parentWidget) + : _window(parentWidget), _sfWidget(nullptr) { - this->_window.resize(w, h); - this->_window.setWindowIcon(QIcon(":/resources/Logo.png")); + this->_window->resize(parentWidget->width(), parentWidget->height()); } void QtSFML::createWindow(SNES &snes, int maxFPS) { - this->setWindowName(snes.cartridge->header.gameName); this->_sfWidget = std::make_unique(snes, &_window, QPoint(0, 0), QSize(this->_window.width(), this->_window.height()), maxFPS); - this->_window.setCentralWidget(this->_sfWidget.get()); - - QMenu *file = this->_window.menuBar()->addMenu("&File"); - //TODO implement rom opening from this menu. - (void)file; - - QMenu *game = this->_window.menuBar()->addMenu("&Game"); - QAction *reset = new QAction("Reset", &this->_window); - QMainWindow::connect(reset, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::reset); - game->addAction(reset); - - - - QMenu *debugger = this->_window.menuBar()->addMenu("&Debugger"); - QAction *cpuDebugger = new QAction("CPU's Debugger", &this->_window); - cpuDebugger->setShortcut(Qt::Key_F1); - QMainWindow::connect(cpuDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableDebugCPU); - debugger->addAction(cpuDebugger); - - QAction *ramViewer = new QAction("Memory viewer", &this->_window); - ramViewer->setShortcut(Qt::Key_F2); - QMainWindow::connect(ramViewer, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableRamViewer); - debugger->addAction(ramViewer); - - QAction *headerViewer = new QAction("Header viewer", &this->_window); - headerViewer->setShortcut(Qt::Key_F3); - QMainWindow::connect(headerViewer, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableHeaderViewer); - debugger->addAction(headerViewer); - - QAction *apuDebugger = new QAction("APU's Debugger", &this->_window); - apuDebugger->setShortcut(Qt::Key_F4); - QMainWindow::connect(apuDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableDebugAPU); - debugger->addAction(apuDebugger); - - QAction *busDebugger = new QAction("Memory bus Viewer", &this->_window); - busDebugger->setShortcut(Qt::Key_F5); - QMainWindow::connect(busDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableDebugBus); - debugger->addAction(busDebugger); - - QAction *cgramDebugger = new QAction("Palette Viewer", &this->_window); - cgramDebugger->setShortcut(Qt::Key_F6); - QMainWindow::connect(cgramDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableCgramViewer); - debugger->addAction(cgramDebugger); - - QAction *registerDebugger = new QAction("Registers Viewer", &this->_window); - registerDebugger->setShortcut(Qt::Key_F7); - QMainWindow::connect(registerDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableRegisterViewer); - debugger->addAction(registerDebugger); - - QAction *tileDebugger = new QAction("Tile Viewer", &this->_window); - tileDebugger->setShortcut(Qt::Key_F8); - QMainWindow::connect(tileDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableTileViewer); - debugger->addAction(tileDebugger); - - this->_window.show(); } void QtSFML::putPixel(unsigned y, unsigned x, uint32_t rgba) @@ -164,4 +107,72 @@ namespace ComSquare::Renderer { this->_snes.enableTileViewerDebugging(); } + + QtSFMLWindow::QtSFMLWindow(unsigned int height, unsigned int width) + : QtSFML(this->_window) + { + this->_window.resize(width, height); + this->_window.setWindowIcon(QIcon(":/resources/Logo.png")); + } + + void QtSFMLWindow::createWindow(SNES &snes, int maxFPS) + { + QtSFML::createWindow(snes, maxFPS); + this->setWindowName(snes.cartridge->header.gameName); + this->_window.setCentralWidget(this->_sfWidget.get()); + + QMenu *file = this->_window.menuBar()->addMenu("&File"); + //TODO implement rom opening from this menu. + (void)file; + + QMenu *game = this->_window.menuBar()->addMenu("&Game"); + QAction *reset = new QAction("Reset", &this->_window); + QMainWindow::connect(reset, &QAction::triggered, this->window.get(), &QtFullSFML::reset); + game->addAction(reset); + + + + QMenu *debugger = this->_window.menuBar()->addMenu("&Debugger"); + QAction *cpuDebugger = new QAction("CPU's Debugger", &this->_window); + cpuDebugger->setShortcut(Qt::Key_F1); + QMainWindow::connect(cpuDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableDebugCPU); + debugger->addAction(cpuDebugger); + + QAction *ramViewer = new QAction("Memory viewer", &this->_window); + ramViewer->setShortcut(Qt::Key_F2); + QMainWindow::connect(ramViewer, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableRamViewer); + debugger->addAction(ramViewer); + + QAction *headerViewer = new QAction("Header viewer", &this->_window); + headerViewer->setShortcut(Qt::Key_F3); + QMainWindow::connect(headerViewer, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableHeaderViewer); + debugger->addAction(headerViewer); + + QAction *apuDebugger = new QAction("APU's Debugger", &this->_window); + apuDebugger->setShortcut(Qt::Key_F4); + QMainWindow::connect(apuDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableDebugAPU); + debugger->addAction(apuDebugger); + + QAction *busDebugger = new QAction("Memory bus Viewer", &this->_window); + busDebugger->setShortcut(Qt::Key_F5); + QMainWindow::connect(busDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableDebugBus); + debugger->addAction(busDebugger); + + QAction *cgramDebugger = new QAction("Palette Viewer", &this->_window); + cgramDebugger->setShortcut(Qt::Key_F6); + QMainWindow::connect(cgramDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableCgramViewer); + debugger->addAction(cgramDebugger); + + QAction *registerDebugger = new QAction("Registers Viewer", &this->_window); + registerDebugger->setShortcut(Qt::Key_F7); + QMainWindow::connect(registerDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableRegisterViewer); + debugger->addAction(registerDebugger); + + QAction *tileDebugger = new QAction("Tile Viewer", &this->_window); + tileDebugger->setShortcut(Qt::Key_F8); + QMainWindow::connect(tileDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableTileViewer); + debugger->addAction(tileDebugger); + + this->_window.show(); + } } \ No newline at end of file diff --git a/sources/Renderer/QtRenderer/QtSFML.hpp b/sources/Renderer/QtRenderer/QtSFML.hpp index a55afc5..ec46702 100644 --- a/sources/Renderer/QtRenderer/QtSFML.hpp +++ b/sources/Renderer/QtRenderer/QtSFML.hpp @@ -37,7 +37,7 @@ namespace ComSquare::Renderer void enableCgramViewer(); //! @brief Action called when clicking on the enable DMA viewer button. void enableRegisterViewer(); - //! @brief Action called when clicking on the enable Tile viwer button + //! @brief Action called when clicking on the enable Tile viewer button void enableTileViewer(); //! @brief Action called when clicking on the reset button. @@ -49,17 +49,18 @@ namespace ComSquare::Renderer ~QtFullSFML() override = default; }; - //! @brief A SFML renderer inside a QT window. + //! @brief A SFML renderer inside a QT widget. class QtSFML : public IRenderer { private: //! @brief The main window that the app reside on. - QMainWindow _window; + //QMainWindow _window; + QWidget *_window; //! @brief The SFML widget. std::unique_ptr _sfWidget = nullptr; public: //! @brief Use this function to create the window. //! @param maxFPS The number of FPS you aim to run on. - void createWindow(SNES &snes, int maxFPS) override; + virtual void createWindow(SNES &snes, int maxFPS) override; //! @brief Add a pixel to the buffer to the coordinates x, y with the color rgba. //! @param X horizontal index. //! @param Y vertical index. @@ -74,14 +75,29 @@ namespace ComSquare::Renderer //! @brief Set a new name to the window, if there is already a name it will be overwrite. //! @param newWindowName new title for the window. void setWindowName(std::string &newWindowName) override; - //! @brief Constructor that return a SFML renderer inside a QT window. - //! @param height _height of the window. - //! @param width _width of the window. - QtSFML(unsigned int height, unsigned int width); + //! @brief Constructor that return a SFML renderer inside a QT widget. + QtSFML(QWidget *parentWidget); QtSFML(const QtSFML &) = delete; QtSFML &operator=(const QtSFML &) = delete; ~QtSFML() = default; }; + + class QtSFMLWindow : public QtSFML { + private: + //! @brief The main window that the app reside on. + QMainWindow _window; + public: + //! @brief Use this function to create the window. + //! @param maxFPS The number of FPS you aim to run on. + void createWindow(SNES &snes, int maxFPS) override; + //! @brief Constructor that return a SFML renderer inside a QT window. + //! @param height _height of the window. + //! @param width _width of the window. + QtSFMLWindow(unsigned int height, unsigned int width); + QtSFMLWindow(const QtSFMLWindow &) = delete; + QtSFMLWindow &operator=(const QtSFMLWindow &) = delete; + ~QtSFMLWindow() = default; + }; } #endif //COMSQUARE_QTSFML_HPP diff --git a/sources/main.cpp b/sources/main.cpp index a13903b..e31bbd7 100644 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -6,7 +6,6 @@ #include #include #include "SNES.hpp" -#include "Renderer/SFRenderer.hpp" #include "Renderer/QtRenderer/QtSFML.hpp" using namespace ComSquare; @@ -81,7 +80,7 @@ int main(int argc, char **argv) } QApplication app(argc, argv); QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton); - Renderer::QtSFML renderer(1100, 1100); + Renderer::QtSFMLWindow renderer(1100, 1100); try { SNES snes(argv[1], renderer); renderer.createWindow(snes, 60); diff --git a/ui/tileView.ui b/ui/tileView.ui index ea35f63..0d098a5 100644 --- a/ui/tileView.ui +++ b/ui/tileView.ui @@ -24,9 +24,12 @@ 0 + + false + - Tab 1 + my truc @@ -70,7 +73,7 @@ 0 0 577 - 22 + 27 From b078d863a3b3dbf4b2220ecd6a64690988084c65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 19 May 2021 00:37:49 +0200 Subject: [PATCH 07/35] "fixing" segfault --- sources/Renderer/QtRenderer/QtRenderSfml.cpp | 4 ++-- sources/Renderer/QtRenderer/QtRenderSfml.hpp | 2 -- sources/Renderer/QtRenderer/QtSFML.cpp | 9 ++++----- sources/Renderer/QtRenderer/QtSFML.hpp | 2 +- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/sources/Renderer/QtRenderer/QtRenderSfml.cpp b/sources/Renderer/QtRenderer/QtRenderSfml.cpp index 239c4fc..4b81096 100644 --- a/sources/Renderer/QtRenderer/QtRenderSfml.cpp +++ b/sources/Renderer/QtRenderer/QtRenderSfml.cpp @@ -6,7 +6,7 @@ #include namespace ComSquare::Renderer -{ +{/* QtRenderSFML::QtRenderSFML(ComSquare::SNES &snes, QWidget *parent, const QPoint &position, const QSize &size, int frameRate) : QtWidgetSFML(parent, position, size, frameRate), _snes(snes) @@ -24,5 +24,5 @@ namespace ComSquare::Renderer std::cerr << "An error occurred: " << e.what() << std::endl; QApplication::quit(); } - } + }*/ } \ No newline at end of file diff --git a/sources/Renderer/QtRenderer/QtRenderSfml.hpp b/sources/Renderer/QtRenderer/QtRenderSfml.hpp index 5eeab48..a02bfd5 100644 --- a/sources/Renderer/QtRenderer/QtRenderSfml.hpp +++ b/sources/Renderer/QtRenderer/QtRenderSfml.hpp @@ -52,6 +52,4 @@ namespace ComSquare::Renderer QtRenderSFML &operator=(const QtRenderSFML &) = delete; ~QtRenderSFML() override = default; }; - }; - } diff --git a/sources/Renderer/QtRenderer/QtSFML.cpp b/sources/Renderer/QtRenderer/QtSFML.cpp index 3cdb657..4e6dbbc 100644 --- a/sources/Renderer/QtRenderer/QtSFML.cpp +++ b/sources/Renderer/QtRenderer/QtSFML.cpp @@ -20,12 +20,11 @@ namespace ComSquare::Renderer QtSFML::QtSFML(QWidget *parentWidget) : _window(parentWidget), _sfWidget(nullptr) { - this->_window->resize(parentWidget->width(), parentWidget->height()); } void QtSFML::createWindow(SNES &snes, int maxFPS) { - this->_sfWidget = std::make_unique(snes, &_window, QPoint(0, 0), QSize(this->_window.width(), this->_window.height()), maxFPS); + this->_sfWidget = std::make_unique(snes, this->_window, QPoint(0, 0), QSize(this->_window->width(), this->_window->height()), maxFPS); } void QtSFML::putPixel(unsigned y, unsigned x, uint32_t rgba) @@ -42,7 +41,7 @@ namespace ComSquare::Renderer void QtSFML::setWindowName(std::string &newWindowName) { - this->_window.setWindowTitle((newWindowName + " - ComSquare").c_str()); + this->_window->setWindowTitle((newWindowName + " - ComSquare").c_str()); } QtFullSFML::QtFullSFML(SNES &snes, QWidget *parent, const QPoint &position, const QSize &size, int frameRate) : @@ -109,7 +108,7 @@ namespace ComSquare::Renderer } QtSFMLWindow::QtSFMLWindow(unsigned int height, unsigned int width) - : QtSFML(this->_window) + : QtSFML(&this->_window) { this->_window.resize(width, height); this->_window.setWindowIcon(QIcon(":/resources/Logo.png")); @@ -127,7 +126,7 @@ namespace ComSquare::Renderer QMenu *game = this->_window.menuBar()->addMenu("&Game"); QAction *reset = new QAction("Reset", &this->_window); - QMainWindow::connect(reset, &QAction::triggered, this->window.get(), &QtFullSFML::reset); + QMainWindow::connect(reset, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::reset); game->addAction(reset); diff --git a/sources/Renderer/QtRenderer/QtSFML.hpp b/sources/Renderer/QtRenderer/QtSFML.hpp index ec46702..e68464f 100644 --- a/sources/Renderer/QtRenderer/QtSFML.hpp +++ b/sources/Renderer/QtRenderer/QtSFML.hpp @@ -53,8 +53,8 @@ namespace ComSquare::Renderer class QtSFML : public IRenderer { private: //! @brief The main window that the app reside on. - //QMainWindow _window; QWidget *_window; + protected: //! @brief The SFML widget. std::unique_ptr _sfWidget = nullptr; public: From e5ce5efb25de4754e4d22ece201636d743e1a311 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 19 May 2021 00:41:18 +0200 Subject: [PATCH 08/35] rm comment --- sources/Debugger/TileViewer.hpp | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/sources/Debugger/TileViewer.hpp b/sources/Debugger/TileViewer.hpp index c9c26c5..2295dea 100644 --- a/sources/Debugger/TileViewer.hpp +++ b/sources/Debugger/TileViewer.hpp @@ -19,35 +19,6 @@ namespace ComSquare::Renderer #include "../PPU/PPU.hpp" #include "../../ui/ui_tileView.h" -/* -//! @brief The qt model that bind the logs to the view. -class CGramModel : public QAbstractTableModel -{ -Q_OBJECT -private: - //! @brief The ppu to log the cgram. - ComSquare::PPU::PPU &_ppu; -public: - //! @brief The number of columns - const int column = 16; - //! @brief The number of rows - const int rows = 16; - int x; - int y; - explicit CGramModel(ComSquare::PPU::PPU &ppu); - CGramModel(const CGramModel &) = delete; - const CGramModel &operator=(const CGramModel &) = delete; - ~CGramModel() override = default; - - //! @brief The number of row the table has. - int rowCount(const QModelIndex &parent) const override; - //! @brief The number of column the table has. - int columnCount(const QModelIndex &parent) const override; - //! @brief Return a data representing the table cell. - QVariant data(const QModelIndex &index, int role) const override; -}; - */ - namespace ComSquare::Debugger { //! @brief window that allow the user to view all data going through the memory bus. From dbf3f6aaa4861aff6246fb7f830653d67f4d8db2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 19 May 2021 00:56:43 +0200 Subject: [PATCH 09/35] compil issues recursive include + weird error (orcerride doesn't override) --- sources/Debugger/CPU/CPUDebug.hpp | 1 - sources/Debugger/TileViewer.cpp | 2 +- sources/Debugger/TileViewer.hpp | 7 ++----- sources/Renderer/QtRenderer/QtSFML.hpp | 2 +- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/sources/Debugger/CPU/CPUDebug.hpp b/sources/Debugger/CPU/CPUDebug.hpp index 9120cec..bcc6cab 100644 --- a/sources/Debugger/CPU/CPUDebug.hpp +++ b/sources/Debugger/CPU/CPUDebug.hpp @@ -7,7 +7,6 @@ #include #include "../../CPU/CPU.hpp" -#include "../../Renderer/SFRenderer.hpp" #include "../../SNES.hpp" #include "../../../ui/ui_cpuView.h" #include "../ClosableWindow.hpp" diff --git a/sources/Debugger/TileViewer.cpp b/sources/Debugger/TileViewer.cpp index 7dad780..072254d 100644 --- a/sources/Debugger/TileViewer.cpp +++ b/sources/Debugger/TileViewer.cpp @@ -27,9 +27,9 @@ namespace ComSquare::Debugger this->_window->setContextMenuPolicy(Qt::NoContextMenu); this->_window->setAttribute(Qt::WA_QuitOnClose, false); this->_window->setAttribute(Qt::WA_DeleteOnClose); - //this->_sfWidget = std::make_unique(snes, this->_ui.tab, QPoint(0, 0), QSize(this->_ui.tab->width(), this->_ui.tab->height()), 30); this->_ui.setupUi(this->_window); + this->_sfWidget(this->_ui.tab); this->_window->show(); QEvent::registerEventType(); } diff --git a/sources/Debugger/TileViewer.hpp b/sources/Debugger/TileViewer.hpp index 2295dea..5a6de45 100644 --- a/sources/Debugger/TileViewer.hpp +++ b/sources/Debugger/TileViewer.hpp @@ -9,14 +9,11 @@ namespace ComSquare::Renderer class QtSFML; } -#include #include #include #include -#include #include "ClosableWindow.hpp" -//#include "../Renderer/QtRenderer/QtSFML.hpp" -#include "../PPU/PPU.hpp" +#include "../Renderer/QtRenderer/QtSFML.hpp" #include "../../ui/ui_tileView.h" namespace ComSquare::Debugger @@ -33,7 +30,7 @@ namespace ComSquare::Debugger //! @brief A reference to the ppu ComSquare::PPU::PPU &_ppu; //! @brief the window - //Renderer::QtSFML _sfWidget; + Renderer::QtSFML _sfWidget; public: //! @brief Called when the window is closed. Turn off the debugger. void disableViewer(); diff --git a/sources/Renderer/QtRenderer/QtSFML.hpp b/sources/Renderer/QtRenderer/QtSFML.hpp index e68464f..565885c 100644 --- a/sources/Renderer/QtRenderer/QtSFML.hpp +++ b/sources/Renderer/QtRenderer/QtSFML.hpp @@ -46,7 +46,7 @@ namespace ComSquare::Renderer QtFullSFML(SNES &snes, QWidget* parent, const QPoint& position, const QSize& size, int frameRate = 0); QtFullSFML(const QtFullSFML &) = delete; QtFullSFML &operator=(const QtFullSFML &) = delete; - ~QtFullSFML() override = default; + ~QtFullSFML() = default; }; //! @brief A SFML renderer inside a QT widget. From cf1c6614c150db3550bb6da9c8de20b7c6e1be7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 19 May 2021 10:03:45 +0200 Subject: [PATCH 10/35] fixing include recursive --- CMakeLists.txt | 2 +- sources/Debugger/TileViewer.cpp | 2 +- sources/Debugger/TileViewer.hpp | 9 +++------ sources/Renderer/QtRenderer/QtSFML.cpp | 1 + sources/Renderer/SFRenderer.cpp | 1 + sources/Renderer/SFRenderer.hpp | 1 - 6 files changed, 7 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 773536f..1589597 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -241,7 +241,7 @@ add_executable(ComSquare sources/Debugger/TileViewer.hpp ui/tileView.ui sources/Renderer/QtRenderer/QtRenderSfml.cpp sources/Renderer/QtRenderer/QtRenderSfml.hpp) -#include_directories(ComSquare sources) +include_directories(ComSquare sources) target_compile_definitions(ComSquare PUBLIC DEBUGGER_ENABLED) diff --git a/sources/Debugger/TileViewer.cpp b/sources/Debugger/TileViewer.cpp index 072254d..b7c0aa3 100644 --- a/sources/Debugger/TileViewer.cpp +++ b/sources/Debugger/TileViewer.cpp @@ -29,7 +29,7 @@ namespace ComSquare::Debugger this->_window->setAttribute(Qt::WA_DeleteOnClose); this->_ui.setupUi(this->_window); - this->_sfWidget(this->_ui.tab); + this->_sfWidget = std::make_unique(this->_ui.tab); this->_window->show(); QEvent::registerEventType(); } diff --git a/sources/Debugger/TileViewer.hpp b/sources/Debugger/TileViewer.hpp index 5a6de45..9515523 100644 --- a/sources/Debugger/TileViewer.hpp +++ b/sources/Debugger/TileViewer.hpp @@ -4,18 +4,15 @@ #pragma once -namespace ComSquare::Renderer -{ - class QtSFML; -} - #include #include #include +#include "PPU/PPU.hpp" #include "ClosableWindow.hpp" #include "../Renderer/QtRenderer/QtSFML.hpp" #include "../../ui/ui_tileView.h" + namespace ComSquare::Debugger { //! @brief window that allow the user to view all data going through the memory bus. @@ -30,7 +27,7 @@ namespace ComSquare::Debugger //! @brief A reference to the ppu ComSquare::PPU::PPU &_ppu; //! @brief the window - Renderer::QtSFML _sfWidget; + std::unique_ptr _sfWidget; public: //! @brief Called when the window is closed. Turn off the debugger. void disableViewer(); diff --git a/sources/Renderer/QtRenderer/QtSFML.cpp b/sources/Renderer/QtRenderer/QtSFML.cpp index 4e6dbbc..48bbfae 100644 --- a/sources/Renderer/QtRenderer/QtSFML.cpp +++ b/sources/Renderer/QtRenderer/QtSFML.cpp @@ -7,6 +7,7 @@ #include #include #include +#include "SNES.hpp" #include "../../Exceptions/DebuggableError.hpp" #include "QtSFML.hpp" diff --git a/sources/Renderer/SFRenderer.cpp b/sources/Renderer/SFRenderer.cpp index b051ff7..82e876f 100644 --- a/sources/Renderer/SFRenderer.cpp +++ b/sources/Renderer/SFRenderer.cpp @@ -8,6 +8,7 @@ #include #include #include +#include "SNES.hpp" #include namespace ComSquare::Renderer diff --git a/sources/Renderer/SFRenderer.hpp b/sources/Renderer/SFRenderer.hpp index 8221ea3..c73c1e5 100644 --- a/sources/Renderer/SFRenderer.hpp +++ b/sources/Renderer/SFRenderer.hpp @@ -6,7 +6,6 @@ #define COMSQUARE_SFRENDERER_HPP #include "IRenderer.hpp" -#include "../SNES.hpp" #include #include #include From 4024b51c9fe0e70707206283edf794356df64f6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Mon, 24 May 2021 00:28:08 +0200 Subject: [PATCH 11/35] starting to implement true TileRenderer --- CMakeLists.txt | 9 +- sources/Debugger/TileViewer.cpp | 57 ------- sources/Debugger/TileViewer/TileViewer.cpp | 142 ++++++++++++++++++ .../Debugger/{ => TileViewer}/TileViewer.hpp | 32 +++- sources/PPU/Background.cpp | 10 +- sources/PPU/Background.hpp | 4 +- sources/PPU/PPU.cpp | 16 +- sources/PPU/PPU.hpp | 1 + 8 files changed, 194 insertions(+), 77 deletions(-) delete mode 100644 sources/Debugger/TileViewer.cpp create mode 100644 sources/Debugger/TileViewer/TileViewer.cpp rename sources/Debugger/{ => TileViewer}/TileViewer.hpp (59%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2f6095d..05789fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -237,9 +237,12 @@ add_executable(ComSquare sources/APU/DSP/Timer.cpp sources/APU/DSP/BRR.cpp sources/PPU/PPUUtils.cpp - sources/Debugger/TileViewer.cpp - sources/Debugger/TileViewer.hpp - ui/tileView.ui sources/Renderer/QtRenderer/QtRenderSfml.cpp sources/Renderer/QtRenderer/QtRenderSfml.hpp) + ui/tileView.ui + sources/Renderer/QtRenderer/QtRenderSfml.cpp + sources/Renderer/QtRenderer/QtRenderSfml.hpp + sources/Debugger/TileViewer/TileViewer.cpp + sources/Debugger/TileViewer/TileViewer.hpp + ) include_directories(ComSquare sources) diff --git a/sources/Debugger/TileViewer.cpp b/sources/Debugger/TileViewer.cpp deleted file mode 100644 index b7c0aa3..0000000 --- a/sources/Debugger/TileViewer.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// -// Created by cbihan on 5/7/21. -// - -namespace ComSquare::Renderer -{ - class QtFullSFML; -} - -#include "../Renderer/QtRenderer/QtSFML.hpp" -#include "TileViewer.hpp" -#include "../SNES.hpp" -#include -#include -#include -#include -#include "../Utility/Utility.hpp" - -namespace ComSquare::Debugger -{ - TileViewer::TileViewer(SNES &snes, ComSquare::PPU::PPU &ppu) - : _window(new ClosableWindow(*this, &TileViewer::disableViewer)), - _snes(snes), - _ui(), - _ppu(ppu) - { - this->_window->setContextMenuPolicy(Qt::NoContextMenu); - this->_window->setAttribute(Qt::WA_QuitOnClose, false); - this->_window->setAttribute(Qt::WA_DeleteOnClose); - - this->_ui.setupUi(this->_window); - this->_sfWidget = std::make_unique(this->_ui.tab); - this->_window->show(); - QEvent::registerEventType(); - } - - void TileViewer::disableViewer() - { - this->_snes.disableTileViewerDebugging(); - } - - void TileViewer::focus() - { - this->_window->activateWindow(); - } - - bool TileViewer::isDebugger() - { - return true; - } - - uint16_t TileViewer::read(uint8_t addr) - { - return this->_ppu.cgramRead(addr); - } - -} \ No newline at end of file diff --git a/sources/Debugger/TileViewer/TileViewer.cpp b/sources/Debugger/TileViewer/TileViewer.cpp new file mode 100644 index 0000000..652500e --- /dev/null +++ b/sources/Debugger/TileViewer/TileViewer.cpp @@ -0,0 +1,142 @@ +// +// Created by cbihan on 5/7/21. +// + +namespace ComSquare::Renderer +{ + class QtFullSFML; +} + +#include "Renderer/QtRenderer/QtSFML.hpp" +#include "TileViewer.hpp" +#include "SNES.hpp" +#include +#include +#include +#include +#include +#include +#include "Utility/Utility.hpp" +#include "PPU/PPU.hpp" + +namespace ComSquare::Debugger +{ + TileViewer::TileViewer(SNES &snes, ComSquare::PPU::PPU &ppu) + : _window(new ClosableWindow(*this, &TileViewer::disableViewer)), + _snes(snes), + _ui(), + _ppu(ppu) + { + this->_window->setContextMenuPolicy(Qt::NoContextMenu); + this->_window->setAttribute(Qt::WA_QuitOnClose, false); + this->_window->setAttribute(Qt::WA_DeleteOnClose); + + this->_ui.setupUi(this->_window); + this->_sfWidget = std::make_unique(this->_ui.tab); + this->_window->show(); + QEvent::registerEventType(); + } + + void TileViewer::disableViewer() + { + this->_snes.disableTileViewerDebugging(); + } + + void TileViewer::focus() + { + this->_window->activateWindow(); + } + + bool TileViewer::isDebugger() + { + return true; + } + + uint16_t TileViewer::read(uint8_t addr) + { + 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; + } + +} \ No newline at end of file diff --git a/sources/Debugger/TileViewer.hpp b/sources/Debugger/TileViewer/TileViewer.hpp similarity index 59% rename from sources/Debugger/TileViewer.hpp rename to sources/Debugger/TileViewer/TileViewer.hpp index 9515523..e0e5f89 100644 --- a/sources/Debugger/TileViewer.hpp +++ b/sources/Debugger/TileViewer/TileViewer.hpp @@ -7,14 +7,42 @@ #include #include #include +#include #include "PPU/PPU.hpp" #include "ClosableWindow.hpp" -#include "../Renderer/QtRenderer/QtSFML.hpp" -#include "../../ui/ui_tileView.h" +#include "Renderer/QtRenderer/QtSFML.hpp" +#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 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 { private: diff --git a/sources/PPU/Background.cpp b/sources/PPU/Background.cpp index 1f9601b..bc603b9 100644 --- a/sources/PPU/Background.cpp +++ b/sources/PPU/Background.cpp @@ -121,10 +121,10 @@ namespace ComSquare::PPU return this->getPixelReferenceFromTileRow(tileAddress, column); } - uint8_t Background::getPixelReferenceFromTileRow(uint16_t tileAddress, uint8_t pixelIndex) + uint8_t Background::getPixelReferenceFromTileRow(uint16_t tileRowAddress, uint8_t pixelIndex) { - uint8_t highByte = this->_vram->read(tileAddress % VRAMSIZE); - uint8_t lowByte = this->_vram->read((tileAddress + 1) % VRAMSIZE); + uint8_t highByte = this->_vram->read(tileRowAddress % VRAMSIZE); + uint8_t lowByte = this->_vram->read((tileRowAddress + 1) % VRAMSIZE); uint8_t secondHighByte; uint8_t secondLowByte; uint16_t result = 0; @@ -134,8 +134,8 @@ namespace ComSquare::PPU case 8: return highByte; case 4: - secondHighByte = this->_vram->read((tileAddress + 16) % VRAMSIZE); - secondLowByte = this->_vram->read((tileAddress + 17) % VRAMSIZE); + secondHighByte = this->_vram->read((tileRowAddress + 16) % VRAMSIZE); + secondLowByte = this->_vram->read((tileRowAddress + 17) % VRAMSIZE); result = ((secondHighByte & (1U << shift)) | ((secondLowByte & (1U << shift)) << 1U)); result = (shift - 2 >= 0) ? result >> (shift - 2) : result << ((shift - 2) * -1); FALLTHROUGH diff --git a/sources/PPU/Background.hpp b/sources/PPU/Background.hpp index 07fbd6a..d7f6796 100644 --- a/sources/PPU/Background.hpp +++ b/sources/PPU/Background.hpp @@ -70,10 +70,10 @@ namespace ComSquare::PPU //! @return The array of color of the palette std::vector getPalette(int nbPalette); //! @brief Get the color reference of a pixel from the address of the row - //! @param tileAddress The address of the line of pixel + //! @param tileRowAddress The address of the line of pixel //! @param pixelIndex The index of the pixel (0 - 7) //! @return The color Reference - uint8_t getPixelReferenceFromTileRow(uint16_t tileAddress, uint8_t pixelIndex); + uint8_t getPixelReferenceFromTileRow(uint16_t tileRowAddress, uint8_t pixelIndex); //! @brief Get the color pixel reference from the tile address //! @param tileAddress The starting address of the tile //! @param pixelIndex The index of the pixel (0 - 255) diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index 2b2555a..d015fd1 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -41,7 +41,7 @@ namespace ComSquare::PPU this->cgram->write(7, 0x03); this->cgram->write(66, 0xE0); this->cgram->write(67, 0x7F); - +/* //tiles int vram_test[] = { 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, @@ -74,17 +74,17 @@ namespace ComSquare::PPU 00,0x03,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x0c,0x00,0x18,0x00,0xf0,0x00,0xe0, 00,0x00,0x00,0x00,0x80,0x00,0xc0,0x00,0xe0,0x00,0xf0,0x00,0xf8,0x00,0xfc,0x00, 00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x07,0x00,0x0f,00,0x1f,00,0x3f,00, -1 - }; - /*int *cgram_test = get_dump_cgram(); + }; */ + int *cgram_test = get_dump_cgram(); for (int i = 0; cgram_test[i] != -1; i++) { this->cgram->write(i, cgram_test[i]); - }*/ + } - // int *vram_test = get_dump_vram(); + int *vram_test = get_dump_vram(); for (int i = 0; vram_test[i] != -1; i++) { this->vram->write(i, vram_test[i]); } - int vram_test_2[] = {8, 00, 02, 00, 0x0A, 00, 02, 00, 0x0A, 00, 00, 00, 00, 00, 00, -1}; + /* int vram_test_2[] = {8, 00, 02, 00, 0x0A, 00, 02, 00, 0x0A, 00, 00, 00, 00, 00, 00, -1}; for (int i = 0; vram_test_2[i] != -1; i++) { this->vram->write(i + 0x8000, vram_test_2[i]); } @@ -143,8 +143,8 @@ namespace ComSquare::PPU //this->_registers._bgofs[3].raw = 0x03DF; this->_registers._t[0].enableWindowDisplayBg1 = true; this->_registers._t[0].enableWindowDisplayBg2 = true; + */ - /* //registers aladin this->_registers._bgmode.bgMode = 1; @@ -199,7 +199,7 @@ namespace ComSquare::PPU this->_registers._t[0].enableWindowDisplayBg2 = true; this->_registers._t[0].enableWindowDisplayBg3 = true; -*/ + } uint8_t PPU::read(uint24_t addr) diff --git a/sources/PPU/PPU.hpp b/sources/PPU/PPU.hpp index 8dc2bab..af750cc 100644 --- a/sources/PPU/PPU.hpp +++ b/sources/PPU/PPU.hpp @@ -569,6 +569,7 @@ namespace ComSquare::PPU 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); From effd70cf1e65ebcb205ba156954ed2224752dde2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Mon, 24 May 2021 00:44:18 +0200 Subject: [PATCH 12/35] start to test the implementation of tilerenderer --- sources/Debugger/TileViewer/TileViewer.cpp | 5 +++++ sources/Debugger/TileViewer/TileViewer.hpp | 9 +++++---- sources/PPU/PPU.cpp | 15 ++++++++++----- sources/PPU/PPU.hpp | 13 ++++++++----- sources/SNES.hpp | 2 +- 5 files changed, 29 insertions(+), 15 deletions(-) diff --git a/sources/Debugger/TileViewer/TileViewer.cpp b/sources/Debugger/TileViewer/TileViewer.cpp index 652500e..a4ffc0c 100644 --- a/sources/Debugger/TileViewer/TileViewer.cpp +++ b/sources/Debugger/TileViewer/TileViewer.cpp @@ -139,4 +139,9 @@ namespace ComSquare::Debugger 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 e0e5f89..63039cb 100644 --- a/sources/Debugger/TileViewer/TileViewer.hpp +++ b/sources/Debugger/TileViewer/TileViewer.hpp @@ -9,9 +9,9 @@ #include #include #include "PPU/PPU.hpp" -#include "ClosableWindow.hpp" +#include "Debugger/ClosableWindow.hpp" #include "Renderer/QtRenderer/QtSFML.hpp" -#include "ui/ui_tileView.h" +#include "../../ui/ui_tileView.h" #include "Ram/Ram.hpp" @@ -24,13 +24,14 @@ namespace ComSquare::Debugger //! @brief cgram to access the colors std::shared_ptr _cgram; //! @brief The bpp to use while rendering - int _bpp, + int _bpp; //! @brief The palette number to use while rendering int _palette; public: //! @brief internal buffer - std::array, 1024> 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); diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index d015fd1..3315ce3 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -5,10 +5,10 @@ #include #include #include "PPU.hpp" -#include "../Exceptions/NotImplementedException.hpp" -#include "../Exceptions/InvalidAddress.hpp" -#include "../Ram/Ram.hpp" -#include "../Models/Vector2.hpp" +#include "Exceptions/NotImplementedException.hpp" +#include "Exceptions/InvalidAddress.hpp" +#include "Ram/Ram.hpp" +#include "Models/Vector2.hpp" #include namespace ComSquare::PPU @@ -31,6 +31,8 @@ namespace ComSquare::PPU _mainScreen({{{0}}}), _subScreen({{{0}}}) { + this->tileRenderer.setRam(this->vram); + this->tileRenderer.setCgram(this->cgram); this->_registers._isLowByte = true; //colors for the cgram @@ -465,7 +467,10 @@ namespace ComSquare::PPU void PPU::update(unsigned cycles) { (void)cycles; + this->tileRenderer.render(); + this->add_buffer(this->_screen, this->tileRenderer.buffer); + /* this->renderMainAndSubScreen(); this->add_buffer(this->_screen, this->_subScreen); this->add_buffer(this->_screen, this->_mainScreen); @@ -475,7 +480,7 @@ namespace ComSquare::PPU 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 af750cc..f52bd36 100644 --- a/sources/PPU/PPU.hpp +++ b/sources/PPU/PPU.hpp @@ -6,13 +6,14 @@ #define COMSQUARE_PPU_HPP #include -#include "../Memory/AMemory.hpp" -#include "../Memory/MemoryBus.hpp" -#include "../Renderer/IRenderer.hpp" -#include "../Ram/Ram.hpp" -#include "../Models/Vector2.hpp" +#include "Memory/AMemory.hpp" +#include "Memory/MemoryBus.hpp" +#include "Renderer/IRenderer.hpp" +#include "Ram/Ram.hpp" +#include "Models/Vector2.hpp" #include "Background.hpp" #include "PPUUtils.hpp" +#include "Debugger/TileViewer/TileViewer.hpp" #define FALLTHROUGH __attribute__((fallthrough)); @@ -631,6 +632,8 @@ namespace ComSquare::PPU Vector2 getBgScroll(int bgNumber) const; //! @brief Allow to look the value of each write register (used by Register debugger) const Registers &getWriteRegisters() const; + + Debugger::TileRenderer tileRenderer; }; //! @brief Transform SNES color code BGR to uint32_t RGB diff --git a/sources/SNES.hpp b/sources/SNES.hpp index 757b0b7..133730e 100644 --- a/sources/SNES.hpp +++ b/sources/SNES.hpp @@ -19,7 +19,7 @@ #include "Debugger/HeaderViewer.hpp" #include "Debugger/CGramDebug.hpp" #include "Debugger/RegisterViewer.hpp" - #include "Debugger/TileViewer.hpp" + #include "Debugger/TileViewer/TileViewer.hpp" #endif namespace ComSquare From eee41aeaf708a24f3b495b6442536f8ea3ee82d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Mon, 24 May 2021 01:24:03 +0200 Subject: [PATCH 13/35] tile rendering is working (still some issues) --- CMakeLists.txt | 2 +- sources/Debugger/TileViewer/TileRenderer.cpp | 103 +++++++++++++++++++ sources/Debugger/TileViewer/TileRenderer.hpp | 39 +++++++ sources/Debugger/TileViewer/TileViewer.cpp | 90 ---------------- sources/Debugger/TileViewer/TileViewer.hpp | 33 ++---- sources/PPU/PPU.cpp | 5 +- sources/PPU/PPU.hpp | 4 +- sources/SNES.cpp | 1 + 8 files changed, 155 insertions(+), 122 deletions(-) create mode 100644 sources/Debugger/TileViewer/TileRenderer.cpp create mode 100644 sources/Debugger/TileViewer/TileRenderer.hpp 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 From 569a955d5be122fa1780c1f4a5f5e3a06ac14549 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 25 May 2021 00:03:48 +0200 Subject: [PATCH 14/35] cleaning a little bit rendering still some trailing issues --- sources/Debugger/TileViewer/TileRenderer.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/sources/Debugger/TileViewer/TileRenderer.cpp b/sources/Debugger/TileViewer/TileRenderer.cpp index 647a003..8e5f12f 100644 --- a/sources/Debugger/TileViewer/TileRenderer.cpp +++ b/sources/Debugger/TileViewer/TileRenderer.cpp @@ -31,14 +31,26 @@ namespace ComSquare::Debugger int bufY = 0; int nbTilesDrawn = 0; int resetX = 0; + int it = 0; - for (uint24_t i = 0; i < this->_ram->getSize(); i += this->_bpp) { + for (uint24_t i = 0; i < this->_ram->getSize(); i += this->_bpp, it++) { if (bufX >= 1024 || bufY >= 1024) break; + if (it && it % 8 == 0) { + resetX += 8; + bufX = resetX; + bufY -= 8; + nbTilesDrawn++; + } + if (nbTilesDrawn && nbTilesDrawn % 16 == 0) { + resetX = 0; + bufX = resetX; + bufY += 8; + } for (int j = 0; j < 8; j++) { colorReference = this->getPixelReferenceFromTileRow(i, j); color = PPU::getRealColor(palette[colorReference]); - buffer[bufY][bufX++] = color; + buffer[bufX++][bufY] = color; } bufY++; bufX = resetX; From 26d8dd71238321c17b3a2a984d910ca1ab945937 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 25 May 2021 00:28:03 +0200 Subject: [PATCH 15/35] tile renderer is working fine with 2 bpp --- CMakeLists.txt | 2 +- sources/Debugger/TileViewer/TileRenderer.cpp | 31 +++++++++++++++----- sources/Debugger/TileViewer/TileRenderer.hpp | 10 +++++++ sources/PPU/Background.cpp | 11 +++---- sources/PPU/Background.hpp | 4 --- sources/PPU/Tile.hpp | 18 ++++++++++++ 6 files changed, 58 insertions(+), 18 deletions(-) create mode 100644 sources/PPU/Tile.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index cd751aa..3d5bfe2 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) + sources/Debugger/TileViewer/TileRenderer.cpp sources/Debugger/TileViewer/TileRenderer.hpp sources/PPU/Tile.hpp) include_directories(ComSquare sources) diff --git a/sources/Debugger/TileViewer/TileRenderer.cpp b/sources/Debugger/TileViewer/TileRenderer.cpp index 8e5f12f..3b2b000 100644 --- a/sources/Debugger/TileViewer/TileRenderer.cpp +++ b/sources/Debugger/TileViewer/TileRenderer.cpp @@ -3,8 +3,10 @@ // #include +#include #include "TileRenderer.hpp" #include "PPU/PPU.hpp" +#include "PPU/Tile.hpp" namespace ComSquare::Debugger { @@ -13,6 +15,8 @@ namespace ComSquare::Debugger _cgram(nullptr), _bpp(2), _palette(0), + _renderSize(5000), + _nbColumns(16), buffer({{{0}}}) { } @@ -27,25 +31,26 @@ namespace ComSquare::Debugger uint8_t colorReference; uint24_t color; std::vector palette = this->getPalette(this->_palette); - int bufX = 0; - int bufY = 0; + int bufX = this->_offsetX; + int bufY = this->_offsetY; int nbTilesDrawn = 0; - int resetX = 0; + int resetX = bufX; int it = 0; - for (uint24_t i = 0; i < this->_ram->getSize(); i += this->_bpp, it++) { + for (uint24_t i = 0; i < fmin(this->_ram->getSize(), this->_renderSize); i += this->_bpp, it++) { if (bufX >= 1024 || bufY >= 1024) break; if (it && it % 8 == 0) { - resetX += 8; + resetX += PPU::Tile::NbPixelsWidth; bufX = resetX; - bufY -= 8; + bufY -= PPU::Tile::NbPixelsHeight; nbTilesDrawn++; } if (nbTilesDrawn && nbTilesDrawn % 16 == 0) { - resetX = 0; + nbTilesDrawn = 0; + resetX = this->_offsetX; bufX = resetX; - bufY += 8; + bufY += PPU::Tile::NbPixelsHeight; } for (int j = 0; j < 8; j++) { colorReference = this->getPixelReferenceFromTileRow(i, j); @@ -112,4 +117,14 @@ namespace ComSquare::Debugger { this->_cgram = std::move(ram); } + + void TileRenderer::setRenderSize(int size) + { + this->_renderSize = size; + } + + void TileRenderer::setNbColumns(int nbColumns) + { + this->_nbColumns = nbColumns; + } } \ No newline at end of file diff --git a/sources/Debugger/TileViewer/TileRenderer.hpp b/sources/Debugger/TileViewer/TileRenderer.hpp index ae2be50..45c86ce 100644 --- a/sources/Debugger/TileViewer/TileRenderer.hpp +++ b/sources/Debugger/TileViewer/TileRenderer.hpp @@ -19,12 +19,22 @@ namespace ComSquare::Debugger int _bpp; //! @brief The palette number to use while rendering int _palette; + //! @brief The size to render in the ram + int _renderSize; + //! @brief The number of tile columns to display + int _nbColumns; + //! @brief render offset in x + int _offsetX = 100; + //! @brief render offset in y + int _offsetY = 120; public: //! @brief internal buffer std::array, 1024> buffer; void setPalette(int palette); void setCgram(std::shared_ptr ram); void setBpp(int bpp); + void setNbColumns(int nbColumns); + void setRenderSize(int size); void setRam(std::shared_ptr ram); uint8_t getPixelReferenceFromTileRow(uint16_t tileRowAddress, uint8_t pixelIndex); std::vector getPalette(int nbPalette); diff --git a/sources/PPU/Background.cpp b/sources/PPU/Background.cpp index bc603b9..234fbb4 100644 --- a/sources/PPU/Background.cpp +++ b/sources/PPU/Background.cpp @@ -6,6 +6,7 @@ #include "PPU.hpp" #include "Background.hpp" #include +#include "Tile.hpp" #include "Models/Vector2.hpp" namespace ComSquare::PPU @@ -107,13 +108,13 @@ namespace ComSquare::PPU uint8_t row = pixelIndex / this->_characterNbPixels.x; uint8_t column = pixelIndex % this->_characterNbPixels.y; - if (row >= TileNbPixelsHeight) { + if (row >= Tile::NbPixelsHeight) { tileAddress += 0x80 * this->_bpp; - row -= TileNbPixelsHeight; + row -= Tile::NbPixelsHeight; } - if (column >= TileNbPixelsWidth) { + if (column >= Tile::NbPixelsWidth) { tileAddress += 0x8 * this->_bpp; - column -= TileNbPixelsWidth; + column -= Tile::NbPixelsWidth; } // TODO might not work with 8 bpp must check tileAddress += 2 * row; @@ -128,7 +129,7 @@ namespace ComSquare::PPU uint8_t secondHighByte; uint8_t secondLowByte; uint16_t result = 0; - uint8_t shift = TileNbPixelsWidth - 1U - pixelIndex; + uint8_t shift = Tile::NbPixelsWidth - 1U - pixelIndex; switch (this->_bpp) { case 8: diff --git a/sources/PPU/Background.hpp b/sources/PPU/Background.hpp index d7f6796..a68a0fd 100644 --- a/sources/PPU/Background.hpp +++ b/sources/PPU/Background.hpp @@ -24,10 +24,6 @@ namespace ComSquare::PPU static constexpr int NbCharacterWidth = 32; //! @brief The number of character a TileMap has in height static constexpr int NbCharacterHeight = 32; - //! @brief The minimum number of pixel a tile can have in width - static constexpr int TileNbPixelsWidth = 8; - //! @brief The minimum number of pixel a tile can have in height - static constexpr int TileNbPixelsHeight = 8; //! @brief The number of bytes used by a range of pixels (1 pixel per byte) //! @note Used like: bpp * TileBaseByteSize to get the size of byte of 1 row of pixels static constexpr unsigned TileBaseByteSize = 8; diff --git a/sources/PPU/Tile.hpp b/sources/PPU/Tile.hpp new file mode 100644 index 0000000..52025a5 --- /dev/null +++ b/sources/PPU/Tile.hpp @@ -0,0 +1,18 @@ +// +// Created by cbihan on 25/05/2021. +// + +#pragma once + +namespace ComSquare::PPU +{ + //! @brief Info on tile struct + struct Tile + { + //! @brief The number of pixel a base tile can have in width + static constexpr int NbPixelsWidth = 8; + //! @brief The number of pixel a base tile can have in height + static constexpr int NbPixelsHeight = 8; + }; + +} \ No newline at end of file From 434dea2ba17c8880e5187bcd3a9f72e7113dee40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 25 May 2021 00:51:54 +0200 Subject: [PATCH 16/35] found issues with rendering in 4 bpp --- sources/Debugger/TileViewer/TileRenderer.cpp | 26 ++++++++++++++++---- sources/Debugger/TileViewer/TileRenderer.hpp | 16 ++++++++++-- sources/PPU/PPU.cpp | 3 +++ 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/sources/Debugger/TileViewer/TileRenderer.cpp b/sources/Debugger/TileViewer/TileRenderer.cpp index 3b2b000..4f24d41 100644 --- a/sources/Debugger/TileViewer/TileRenderer.cpp +++ b/sources/Debugger/TileViewer/TileRenderer.cpp @@ -14,7 +14,7 @@ namespace ComSquare::Debugger : _ram(nullptr), _cgram(nullptr), _bpp(2), - _palette(0), + _paletteIndex(0), _renderSize(5000), _nbColumns(16), buffer({{{0}}}) @@ -30,7 +30,7 @@ namespace ComSquare::Debugger { uint8_t colorReference; uint24_t color; - std::vector palette = this->getPalette(this->_palette); + std::vector palette = this->getPalette(this->_paletteIndex); int bufX = this->_offsetX; int bufY = this->_offsetY; int nbTilesDrawn = 0; @@ -46,8 +46,9 @@ namespace ComSquare::Debugger bufY -= PPU::Tile::NbPixelsHeight; nbTilesDrawn++; } - if (nbTilesDrawn && nbTilesDrawn % 16 == 0) { + if (nbTilesDrawn && nbTilesDrawn % this->_nbColumns == 0) { nbTilesDrawn = 0; + break; resetX = this->_offsetX; bufX = resetX; bufY += PPU::Tile::NbPixelsHeight; @@ -62,9 +63,9 @@ namespace ComSquare::Debugger } } - void TileRenderer::setPalette(int palette) + void TileRenderer::setPaletteIndex(int paletteIndex) { - this->_palette = palette; + this->_paletteIndex = paletteIndex; } void TileRenderer::setBpp(int bpp) @@ -127,4 +128,19 @@ namespace ComSquare::Debugger { this->_nbColumns = nbColumns; } + + int TileRenderer::getBpp() const + { + return this->_bpp; + } + + int TileRenderer::getPaletteIndex() const + { + return this->_paletteIndex; + } + + int TileRenderer::getNbColumns() const + { + return this->_nbColumns; + } } \ No newline at end of file diff --git a/sources/Debugger/TileViewer/TileRenderer.hpp b/sources/Debugger/TileViewer/TileRenderer.hpp index 45c86ce..8788566 100644 --- a/sources/Debugger/TileViewer/TileRenderer.hpp +++ b/sources/Debugger/TileViewer/TileRenderer.hpp @@ -18,7 +18,7 @@ namespace ComSquare::Debugger //! @brief The bpp to use while rendering int _bpp; //! @brief The palette number to use while rendering - int _palette; + int _paletteIndex; //! @brief The size to render in the ram int _renderSize; //! @brief The number of tile columns to display @@ -30,12 +30,24 @@ namespace ComSquare::Debugger public: //! @brief internal buffer std::array, 1024> buffer; - void setPalette(int palette); + //! @brief Set the palette to use for render (index of palette) + void setPaletteIndex(int paletteIndex); + //! @brief Set the ram to look for color references void setCgram(std::shared_ptr ram); + //! @brief Set the bpp to render graphics void setBpp(int bpp); + //! @brief Set the number of maximum columns void setNbColumns(int nbColumns); + //! @brief Set the size of ram to render void setRenderSize(int size); + //! @brief The ram to render void setRam(std::shared_ptr ram); + //! @brief Get the current bpp + int getBpp() const; + //! @brief Get the index of the current palette used + int getPaletteIndex() const; + //! @brief Get the numbr of maximum tile columns to render + int getNbColumns() const; uint8_t getPixelReferenceFromTileRow(uint16_t tileRowAddress, uint8_t pixelIndex); std::vector getPalette(int nbPalette); //! @brief render the selected ram diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index e71ef61..21c348d 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -468,6 +468,9 @@ namespace ComSquare::PPU void PPU::update(unsigned cycles) { (void)cycles; + this->tileRenderer.setBpp(4); + this->tileRenderer.setPaletteIndex(2); + this->tileRenderer.setNbColumns(1); this->tileRenderer.render(); this->add_buffer(this->_screen, this->tileRenderer.buffer); From 19ca61885771cde0e14ba6dfa48445863200edfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 25 May 2021 23:55:31 +0200 Subject: [PATCH 17/35] TileRenderer.cpp is now working for 2 & 4 bpps --- sources/Debugger/TileViewer/TileRenderer.cpp | 10 ++++++---- sources/Debugger/TileViewer/TileRenderer.hpp | 6 +++--- sources/PPU/PPU.cpp | 14 +++++++++----- sources/PPU/PPU.hpp | 6 ++++-- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/sources/Debugger/TileViewer/TileRenderer.cpp b/sources/Debugger/TileViewer/TileRenderer.cpp index 4f24d41..06925ca 100644 --- a/sources/Debugger/TileViewer/TileRenderer.cpp +++ b/sources/Debugger/TileViewer/TileRenderer.cpp @@ -7,6 +7,7 @@ #include "TileRenderer.hpp" #include "PPU/PPU.hpp" #include "PPU/Tile.hpp" +#include namespace ComSquare::Debugger { @@ -37,18 +38,19 @@ namespace ComSquare::Debugger int resetX = bufX; int it = 0; - for (uint24_t i = 0; i < fmin(this->_ram->getSize(), this->_renderSize); i += this->_bpp, it++) { - if (bufX >= 1024 || bufY >= 1024) + for (uint24_t i = 0; i < fmin(this->_ram->getSize(), this->_renderSize); i += 2, it++) { + if (bufX > 128 || bufY > 128) break; if (it && it % 8 == 0) { resetX += PPU::Tile::NbPixelsWidth; bufX = resetX; bufY -= PPU::Tile::NbPixelsHeight; + i += (this->_bpp - 2) * 0x8; nbTilesDrawn++; } if (nbTilesDrawn && nbTilesDrawn % this->_nbColumns == 0) { nbTilesDrawn = 0; - break; + //break; resetX = this->_offsetX; bufX = resetX; bufY += PPU::Tile::NbPixelsHeight; @@ -87,7 +89,7 @@ namespace ComSquare::Debugger case 8: return highByte; case 4: - secondHighByte = this->_ram->read((tileRowAddress + 16) % size); + 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); diff --git a/sources/Debugger/TileViewer/TileRenderer.hpp b/sources/Debugger/TileViewer/TileRenderer.hpp index 8788566..9fc2620 100644 --- a/sources/Debugger/TileViewer/TileRenderer.hpp +++ b/sources/Debugger/TileViewer/TileRenderer.hpp @@ -24,12 +24,12 @@ namespace ComSquare::Debugger //! @brief The number of tile columns to display int _nbColumns; //! @brief render offset in x - int _offsetX = 100; + int _offsetX = 0; //! @brief render offset in y - int _offsetY = 120; + int _offsetY = 0; public: //! @brief internal buffer - std::array, 1024> buffer; + std::array, 128> 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 diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index 21c348d..4b4ce3e 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -470,9 +470,11 @@ namespace ComSquare::PPU (void)cycles; this->tileRenderer.setBpp(4); this->tileRenderer.setPaletteIndex(2); - this->tileRenderer.setNbColumns(1); + this->tileRenderer.setNbColumns(16); this->tileRenderer.render(); - this->add_buffer(this->_screen, this->tileRenderer.buffer); + // for (auto &i : this->_screen) + // i.fill(0xde571dff); + this->add_buffer(this->_screen, this->tileRenderer.buffer, {200, 200}); /* this->renderMainAndSubScreen(); @@ -815,13 +817,15 @@ namespace ComSquare::PPU } } - template - void PPU::add_buffer(std::array, DEST_SIZE> &bufferDest, std::array, SRC_SIZE> &bufferSrc) + template + void PPU::add_buffer(std::array, DEST_SIZE_X> &bufferDest, + const std::array, SRC_SIZE_X> &bufferSrc, + const Vector2 &offset) { for (unsigned long i = 0; i < bufferSrc.size(); i++) { for (unsigned long j = 0; j < bufferSrc[i].size(); j++) { if (bufferSrc[i][j] > 0xFF) // 0xFF correspond to a black pixel with full brightness - bufferDest[i][j] = bufferSrc[i][j]; + bufferDest[i + offset.x ][j + offset.y] = bufferSrc[i][j]; } } } diff --git a/sources/PPU/PPU.hpp b/sources/PPU/PPU.hpp index f68595b..4347101 100644 --- a/sources/PPU/PPU.hpp +++ b/sources/PPU/PPU.hpp @@ -620,8 +620,10 @@ namespace ComSquare::PPU //! @brief Render the Main and sub screen correctly void renderMainAndSubScreen(); //! @brief Add a bg buffer to another buffer - template - void add_buffer(std::array, DEST_SIZE> &bufferDest, std::array, SRC_SIZE> &bufferSrc); + template + void add_buffer(std::array, DEST_SIZE_X> &bufferDest, + const std::array, SRC_SIZE_X> &bufferSrc, + const Vector2 &offset = {0, 0}); //! @brief Add a bg to the sub and/or main screen void addToMainSubScreen(Background &bg); //! @brief Get the current background Mode From 85ac1422e2b3eddb9080f174f98a2660b04b639a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 26 May 2021 00:44:37 +0200 Subject: [PATCH 18/35] adding a real ui for the tile viewer --- sources/Debugger/TileViewer/TileRenderer.cpp | 3 +- sources/Debugger/TileViewer/TileViewer.cpp | 5 +- sources/Debugger/TileViewer/TileViewer.hpp | 6 +- ui/tileView.ui | 147 +++++++++++++------ 4 files changed, 114 insertions(+), 47 deletions(-) diff --git a/sources/Debugger/TileViewer/TileRenderer.cpp b/sources/Debugger/TileViewer/TileRenderer.cpp index 06925ca..912e256 100644 --- a/sources/Debugger/TileViewer/TileRenderer.cpp +++ b/sources/Debugger/TileViewer/TileRenderer.cpp @@ -37,6 +37,8 @@ namespace ComSquare::Debugger int nbTilesDrawn = 0; int resetX = bufX; int it = 0; + for (auto &i : buffer) + i.fill(0); for (uint24_t i = 0; i < fmin(this->_ram->getSize(), this->_renderSize); i += 2, it++) { if (bufX > 128 || bufY > 128) @@ -50,7 +52,6 @@ namespace ComSquare::Debugger } if (nbTilesDrawn && nbTilesDrawn % this->_nbColumns == 0) { nbTilesDrawn = 0; - //break; resetX = this->_offsetX; bufX = resetX; bufY += PPU::Tile::NbPixelsHeight; diff --git a/sources/Debugger/TileViewer/TileViewer.cpp b/sources/Debugger/TileViewer/TileViewer.cpp index 584c4e9..51babac 100644 --- a/sources/Debugger/TileViewer/TileViewer.cpp +++ b/sources/Debugger/TileViewer/TileViewer.cpp @@ -23,14 +23,15 @@ namespace ComSquare::Debugger : _window(new ClosableWindow(*this, &TileViewer::disableViewer)), _snes(snes), _ui(), - _ppu(ppu) + _ppu(ppu), + _tileRenderer() { this->_window->setContextMenuPolicy(Qt::NoContextMenu); this->_window->setAttribute(Qt::WA_QuitOnClose, false); this->_window->setAttribute(Qt::WA_DeleteOnClose); this->_ui.setupUi(this->_window); - this->_sfWidget = std::make_unique(this->_ui.tab); + //this->_sfWidget = std::make_unique(this->_ui.tab); this->_window->show(); QEvent::registerEventType(); } diff --git a/sources/Debugger/TileViewer/TileViewer.hpp b/sources/Debugger/TileViewer/TileViewer.hpp index a36fe75..0f28006 100644 --- a/sources/Debugger/TileViewer/TileViewer.hpp +++ b/sources/Debugger/TileViewer/TileViewer.hpp @@ -18,7 +18,7 @@ namespace ComSquare::PPU #include "Renderer/QtRenderer/QtSFML.hpp" #include "../../../ui/ui_tileView.h" #include "Ram/Ram.hpp" - +#include "TileRenderer.hpp" namespace ComSquare::Debugger { @@ -35,7 +35,9 @@ namespace ComSquare::Debugger //! @brief A reference to the ppu ComSquare::PPU::PPU &_ppu; //! @brief the window - std::unique_ptr _sfWidget; + //std::unique_ptr _sfWidget; + + TileRenderer _tileRenderer; public: //! @brief Called when the window is closed. Turn off the debugger. void disableViewer(); diff --git a/ui/tileView.ui b/ui/tileView.ui index 0d098a5..65da1ef 100644 --- a/ui/tileView.ui +++ b/ui/tileView.ui @@ -20,50 +20,113 @@ - - - 0 - - - false - - - - my truc - - - - - Tab 2 - - - - - 250 - 170 - 83 - 25 - - + + + - PushButton + SFML window here :) - - - - 150 - 160 - 83 - 25 - - - - PushButton - - - - + + + + + + + Address + + + + + + + + + + SIze (bytes) + + + + + + + true + + + 100 + + + 10000 + + + 5000 + + + + + + + Columns + + + + + + + + + + 1 + + + 16 + + + + + + + Format + + + + + + + 2 bpp + + + 0 + + + hjhu + + + true + + + + 2 bpp + + + + + 4 bpp + + + + + 8 bpp + + + + + + + + + + @@ -73,7 +136,7 @@ 0 0 577 - 27 + 24 From 7a0b2303d73f630e82a62aaeffcf9b4dde070e73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 27 May 2021 00:14:49 +0200 Subject: [PATCH 19/35] TileRenderer.cpp is now supporting rendering 8bpp color format --- sources/Debugger/TileViewer/TileRenderer.cpp | 33 ++++++++++++-------- sources/Debugger/TileViewer/TileRenderer.hpp | 3 +- sources/PPU/PPU.cpp | 4 +-- 3 files changed, 24 insertions(+), 16 deletions(-) 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) From 000cc9f61f902db09dc993b0170678eaf5c096a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 27 May 2021 01:03:03 +0200 Subject: [PATCH 20/35] cool setup --- sources/PPU/PPU.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index bf4304c..d6cffeb 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -468,12 +468,11 @@ namespace ComSquare::PPU void PPU::update(unsigned cycles) { (void)cycles; - this->tileRenderer.setBpp(8); - this->tileRenderer.setPaletteIndex(0); + this->tileRenderer.setBpp(4); + this->tileRenderer.setPaletteIndex(2); this->tileRenderer.setNbColumns(16); + this->tileRenderer.setRenderSize(0x6000); this->tileRenderer.render(); - // for (auto &i : this->_screen) - // i.fill(0xde571dff); this->add_buffer(this->_screen, this->tileRenderer.buffer, {200, 200}); /* @@ -488,6 +487,12 @@ namespace ComSquare::PPU } } this->_renderer.drawScreen(); + for (auto &i : this->_mainScreen) + i.fill(0XFF); + for (auto &i : this->_subScreen) + i.fill(0XFF); + for (auto &i : this->_screen) + i.fill(0XFF); } std::string PPU::getName() const From e666aca28ef78ed9b64137f16cef1ce7ffcb492e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 27 May 2021 17:10:43 +0200 Subject: [PATCH 21/35] starting to work --- sources/Debugger/TileViewer/TileRenderer.cpp | 13 +++-- sources/Debugger/TileViewer/TileRenderer.hpp | 8 +-- sources/Debugger/TileViewer/TileViewer.cpp | 54 ++++++++++++++++++++ sources/Debugger/TileViewer/TileViewer.hpp | 21 +++++++- sources/PPU/PPU.cpp | 14 +---- sources/PPU/PPU.hpp | 14 ++++- 6 files changed, 102 insertions(+), 22 deletions(-) diff --git a/sources/Debugger/TileViewer/TileRenderer.cpp b/sources/Debugger/TileViewer/TileRenderer.cpp index 0dda4fa..34f971f 100644 --- a/sources/Debugger/TileViewer/TileRenderer.cpp +++ b/sources/Debugger/TileViewer/TileRenderer.cpp @@ -32,15 +32,15 @@ namespace ComSquare::Debugger uint8_t colorReference; uint24_t color; std::vector palette = this->getPalette(this->_paletteIndex); - int bufX = this->_offsetX; - int bufY = this->_offsetY; + int bufX = 0; + int bufY = 0; int nbTilesDrawn = 0; int resetX = bufX; int it = 0; for (auto &i : buffer) i.fill(0); - for (uint24_t i = 0; i < fmin(this->_ram->getSize(), this->_renderSize); i += 2, it++) { + for (uint24_t i = this->_ramOffset; i + this->_ramOffset < fmin(this->_ram->getSize(), this->_renderSize); i += 2, it++) { if (bufX > 1024 || bufY > 1024) break; if (it && it % 8 == 0) { @@ -52,7 +52,7 @@ namespace ComSquare::Debugger } if (nbTilesDrawn && nbTilesDrawn % this->_nbColumns == 0) { nbTilesDrawn = 0; - resetX = this->_offsetX; + resetX = 0; bufX = resetX; bufY += PPU::Tile::NbPixelsHeight; } @@ -153,4 +153,9 @@ namespace ComSquare::Debugger { return this->_nbColumns; } + + void TileRenderer::setRamOffset(int offset) + { + this->_ramOffset = offset; + } } \ No newline at end of file diff --git a/sources/Debugger/TileViewer/TileRenderer.hpp b/sources/Debugger/TileViewer/TileRenderer.hpp index e43dc29..e12b1c5 100644 --- a/sources/Debugger/TileViewer/TileRenderer.hpp +++ b/sources/Debugger/TileViewer/TileRenderer.hpp @@ -23,10 +23,8 @@ namespace ComSquare::Debugger int _renderSize; //! @brief The number of tile columns to display int _nbColumns; - //! @brief render offset in x - int _offsetX = 0; - //! @brief render offset in y - int _offsetY = 0; + //! @brief Bytes to skip from the start of the ram + int _ramOffset; public: //! @brief internal buffer std::array, 1024> buffer; @@ -42,6 +40,8 @@ namespace ComSquare::Debugger void setRenderSize(int size); //! @brief The ram to render void setRam(std::shared_ptr ram); + //! @brief Set the ram offset + void setRamOffset(int offset); //! @brief Get the current bpp int getBpp() const; //! @brief Get the index of the current palette used diff --git a/sources/Debugger/TileViewer/TileViewer.cpp b/sources/Debugger/TileViewer/TileViewer.cpp index 51babac..76e4990 100644 --- a/sources/Debugger/TileViewer/TileViewer.cpp +++ b/sources/Debugger/TileViewer/TileViewer.cpp @@ -15,6 +15,7 @@ namespace ComSquare::Renderer #include #include #include "Utility/Utility.hpp" +#include "TileRenderer.hpp" #include "PPU/PPU.hpp" namespace ComSquare::Debugger @@ -26,12 +27,17 @@ namespace ComSquare::Debugger _ppu(ppu), _tileRenderer() { + this->_tileRenderer.setRam(ppu.vram); + this->_tileRenderer.setCgram(ppu.cgram); this->_window->setContextMenuPolicy(Qt::NoContextMenu); this->_window->setAttribute(Qt::WA_QuitOnClose, false); this->_window->setAttribute(Qt::WA_DeleteOnClose); this->_ui.setupUi(this->_window); //this->_sfWidget = std::make_unique(this->_ui.tab); + QMainWindow::connect(this->_ui.NbColumns, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setNbColumns(nb); }); + QMainWindow::connect(this->_ui.ByteSize, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setRenderSize(nb); }); + QMainWindow::connect(this->_ui.Address, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setRamOffset(nb); }); this->_window->show(); QEvent::registerEventType(); } @@ -55,4 +61,52 @@ namespace ComSquare::Debugger { return this->_ppu.cgramRead(addr); } + + void TileViewer::setPaletteIndex(int paletteIndex) + { + this->_tileRenderer.setPaletteIndex(paletteIndex); + } + + void TileViewer::setBpp(int bpp) + { + this->_tileRenderer.setBpp(bpp); + } + + void TileViewer::setNbColumns(int nbColumns) + { + this->_tileRenderer.setNbColumns(nbColumns); + this->internalUpdate(); + } + + void TileViewer::setRenderSize(int size) + { + this->_tileRenderer.setRenderSize(size); + this->internalUpdate(); + } + + int TileViewer::getBpp() const + { + return this->_tileRenderer.getBpp(); + } + + int TileViewer::getPaletteIndex() const + { + return this->_tileRenderer.getPaletteIndex(); + } + + int TileViewer::getNbColumns() const + { + return this->_tileRenderer.getNbColumns(); + } + + void TileViewer::internalUpdate() + { + this->_tileRenderer.render(); + this->_ppu.add_buffer(this->_tileRenderer.buffer, {200, 200}); + } + + void TileViewer::setRamOffset(int offset) + { + this->_tileRenderer.setRamOffset(offset); + } } \ No newline at end of file diff --git a/sources/Debugger/TileViewer/TileViewer.hpp b/sources/Debugger/TileViewer/TileViewer.hpp index 0f28006..e1e90a6 100644 --- a/sources/Debugger/TileViewer/TileViewer.hpp +++ b/sources/Debugger/TileViewer/TileViewer.hpp @@ -36,7 +36,7 @@ namespace ComSquare::Debugger ComSquare::PPU::PPU &_ppu; //! @brief the window //std::unique_ptr _sfWidget; - + //! @brief The tile renderer TileRenderer _tileRenderer; public: //! @brief Called when the window is closed. Turn off the debugger. @@ -55,5 +55,24 @@ namespace ComSquare::Debugger void focus(); //! @brief Return true if the Bus is overloaded with debugging features. bool isDebugger(); + //! @brief Set the palette to use for render (index of palette) + void setPaletteIndex(int paletteIndex); + //! @brief Set the bpp to render graphics + void setBpp(int bpp); + //! @brief Set the number of maximum columns + void setNbColumns(int nbColumns); + //! @brief Set the size of ram to render + void setRenderSize(int size); + //! @brief Set the ram offset + void setRamOffset(int offset); + //! @brief Get the current bpp + int getBpp() const; + //! @brief Get the index of the current palette used + int getPaletteIndex() const; + //! @brief Get the numbr of maximum tile columns to render + int getNbColumns() const; + //! @brief Update the tile renderer + void internalUpdate(); + }; } diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index d6cffeb..9e825fe 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -32,8 +32,6 @@ namespace ComSquare::PPU _mainScreen({{{0}}}), _subScreen({{{0}}}) { - this->tileRenderer.setRam(this->vram); - this->tileRenderer.setCgram(this->cgram); this->_registers._isLowByte = true; //colors for the cgram @@ -207,7 +205,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; @@ -252,7 +250,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; @@ -468,12 +466,6 @@ namespace ComSquare::PPU void PPU::update(unsigned cycles) { (void)cycles; - this->tileRenderer.setBpp(4); - this->tileRenderer.setPaletteIndex(2); - this->tileRenderer.setNbColumns(16); - this->tileRenderer.setRenderSize(0x6000); - this->tileRenderer.render(); - this->add_buffer(this->_screen, this->tileRenderer.buffer, {200, 200}); /* this->renderMainAndSubScreen(); @@ -491,8 +483,6 @@ namespace ComSquare::PPU i.fill(0XFF); for (auto &i : this->_subScreen) i.fill(0XFF); - for (auto &i : this->_screen) - i.fill(0XFF); } std::string PPU::getName() const diff --git a/sources/PPU/PPU.hpp b/sources/PPU/PPU.hpp index 4347101..a6acb79 100644 --- a/sources/PPU/PPU.hpp +++ b/sources/PPU/PPU.hpp @@ -635,7 +635,19 @@ namespace ComSquare::PPU //! @brief Allow to look the value of each write register (used by Register debugger) const Registers &getWriteRegisters() const; - Debugger::TileRenderer tileRenderer; + template + void add_buffer(const std::array, SRC_SIZE_X> &buffer, + const Vector2 &offset = {0, 0}) + { + for (auto &i : this->_screen) + i.fill(0XFF); + for (unsigned long i = 0; i < buffer.size(); i++) { + for (unsigned long j = 0; j < buffer[i].size(); j++) { + if (buffer[i][j] > 0xFF) // 0xFF correspond to a black pixel with full brightness + this->_screen[i + offset.x][j + offset.y] = buffer[i][j]; + } + } + } }; //! @brief Transform SNES color code BGR to uint32_t RGB From a81cf8ece0b2ae9397b6c737a8b482ceb9010e83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 27 May 2021 23:00:36 +0200 Subject: [PATCH 22/35] adding ui details (and great visuals fixes) --- sources/Debugger/TileViewer/TileViewer.cpp | 39 ++++++++++- sources/Debugger/TileViewer/TileViewer.hpp | 2 + ui/tileView.ui | 80 +++++++++++++++++++--- 3 files changed, 110 insertions(+), 11 deletions(-) diff --git a/sources/Debugger/TileViewer/TileViewer.cpp b/sources/Debugger/TileViewer/TileViewer.cpp index 76e4990..48484f6 100644 --- a/sources/Debugger/TileViewer/TileViewer.cpp +++ b/sources/Debugger/TileViewer/TileViewer.cpp @@ -38,8 +38,13 @@ namespace ComSquare::Debugger QMainWindow::connect(this->_ui.NbColumns, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setNbColumns(nb); }); QMainWindow::connect(this->_ui.ByteSize, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setRenderSize(nb); }); QMainWindow::connect(this->_ui.Address, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setRamOffset(nb); }); + QMainWindow::connect(this->_ui.PaletteIndex, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setPaletteIndex(nb); }); + QMainWindow::connect(this->_ui.BppFormat, QOverload::of(&QComboBox::currentIndexChanged), this, [this](int index) -> void { this->_bppChangeUIHandler(index); }); + + // used to setup ui restrictions + this->setBpp(this->getBpp()); this->_window->show(); - QEvent::registerEventType(); + this->internalUpdate(); } void TileViewer::disableViewer() @@ -65,11 +70,30 @@ namespace ComSquare::Debugger void TileViewer::setPaletteIndex(int paletteIndex) { this->_tileRenderer.setPaletteIndex(paletteIndex); + this->internalUpdate(); } void TileViewer::setBpp(int bpp) { + this->_ui.PaletteIndex->setDisabled(bpp > 4); + switch (bpp) { + case 8: + this->_ui.PaletteIndex->setValue(0); + break; + case 4: + this->_ui.PaletteIndex->setMaximum(15); + if (this->_ui.PaletteIndex->value() > 15) { + this->_ui.PaletteIndex->setValue(15); + } + break; + case 2: + default: + bpp = 2; + this->_ui.PaletteIndex->setMaximum(63); + break; + } this->_tileRenderer.setBpp(bpp); + this->internalUpdate(); } void TileViewer::setNbColumns(int nbColumns) @@ -108,5 +132,18 @@ namespace ComSquare::Debugger void TileViewer::setRamOffset(int offset) { this->_tileRenderer.setRamOffset(offset); + this->internalUpdate(); + } + + void TileViewer::_bppChangeUIHandler(int index) + { + switch (index) { + case 0: return this->setBpp(2); + case 1: return this->setBpp(4); + case 2: return this->setBpp(8); + default: + break; + } + // TODO error handling } } \ No newline at end of file diff --git a/sources/Debugger/TileViewer/TileViewer.hpp b/sources/Debugger/TileViewer/TileViewer.hpp index e1e90a6..9f21ff8 100644 --- a/sources/Debugger/TileViewer/TileViewer.hpp +++ b/sources/Debugger/TileViewer/TileViewer.hpp @@ -38,6 +38,8 @@ namespace ComSquare::Debugger //std::unique_ptr _sfWidget; //! @brief The tile renderer TileRenderer _tileRenderer; + //! @brief Change the bpp from the index given by the ui (QT combo box) + void _bppChangeUIHandler(int index); public: //! @brief Called when the window is closed. Turn off the debugger. void disableViewer(); diff --git a/ui/tileView.ui b/ui/tileView.ui index 65da1ef..0ad6a39 100644 --- a/ui/tileView.ui +++ b/ui/tileView.ui @@ -38,7 +38,26 @@ - + + + 0x + + + 0 + + + 999999 + + + 4096 + + + QAbstractSpinBox::DefaultStepType + + + 16 + + @@ -52,26 +71,50 @@ true + + + + + 0x + - 100 + 0 - 10000 + 999999999 + + + 4096 + + + QAbstractSpinBox::DefaultStepType - 5000 + 20480 + + + 16 + + ArrowCursor + Columns + + + + + false + @@ -81,16 +124,19 @@ 16 - - - - - - Format + + 10 + + + 255 + + + + 2 bpp @@ -121,6 +167,20 @@ + + + + Format + + + + + + + Palette Index + + + From e32b1d830db433ce58441f077d198275b1666b08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 27 May 2021 23:04:11 +0200 Subject: [PATCH 23/35] fixing start address --- sources/Debugger/TileViewer/TileRenderer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/Debugger/TileViewer/TileRenderer.cpp b/sources/Debugger/TileViewer/TileRenderer.cpp index 34f971f..570e35d 100644 --- a/sources/Debugger/TileViewer/TileRenderer.cpp +++ b/sources/Debugger/TileViewer/TileRenderer.cpp @@ -40,7 +40,7 @@ namespace ComSquare::Debugger for (auto &i : buffer) i.fill(0); - for (uint24_t i = this->_ramOffset; i + this->_ramOffset < fmin(this->_ram->getSize(), this->_renderSize); i += 2, it++) { + for (uint24_t i = this->_ramOffset; i < fmin(this->_ram->getSize(), this->_renderSize) + this->_ramOffset; i += 2, it++) { if (bufX > 1024 || bufY > 1024) break; if (it && it % 8 == 0) { From 36bb0587c3e09cf9b8b06a2a5ac676fb39154ca3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 27 May 2021 23:18:20 +0200 Subject: [PATCH 24/35] testing sfml window --- sources/Debugger/TileViewer/TileViewer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/Debugger/TileViewer/TileViewer.cpp b/sources/Debugger/TileViewer/TileViewer.cpp index 48484f6..4cf52d3 100644 --- a/sources/Debugger/TileViewer/TileViewer.cpp +++ b/sources/Debugger/TileViewer/TileViewer.cpp @@ -34,7 +34,7 @@ namespace ComSquare::Debugger this->_window->setAttribute(Qt::WA_DeleteOnClose); this->_ui.setupUi(this->_window); - //this->_sfWidget = std::make_unique(this->_ui.tab); + //this->_sfWidget = std::make_unique(this->_ui.label_5); QMainWindow::connect(this->_ui.NbColumns, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setNbColumns(nb); }); QMainWindow::connect(this->_ui.ByteSize, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setRenderSize(nb); }); QMainWindow::connect(this->_ui.Address, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setRamOffset(nb); }); From 81a32100f11c07703be89b34bdffd238a302c785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 8 Jun 2021 22:40:15 +0200 Subject: [PATCH 25/35] adding the first working sfml window (flicker warning) ui update --- CMakeLists.txt | 2 +- sources/Debugger/TileViewer/TileViewer.cpp | 2 +- sources/Debugger/TileViewer/TileViewer.hpp | 4 +- .../QtRenderer/QtSfmlTileRenderer.cpp | 24 ++++++ .../QtRenderer/QtSfmlTileRenderer.hpp | 33 +++++++ ui/tileView.ui | 85 +++++++++---------- 6 files changed, 100 insertions(+), 50 deletions(-) create mode 100644 sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp create mode 100644 sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d5bfe2..ce2d3df 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 sources/PPU/Tile.hpp) + sources/Debugger/TileViewer/TileRenderer.cpp sources/Debugger/TileViewer/TileRenderer.hpp sources/PPU/Tile.hpp sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp) include_directories(ComSquare sources) diff --git a/sources/Debugger/TileViewer/TileViewer.cpp b/sources/Debugger/TileViewer/TileViewer.cpp index 4cf52d3..5ebb089 100644 --- a/sources/Debugger/TileViewer/TileViewer.cpp +++ b/sources/Debugger/TileViewer/TileViewer.cpp @@ -34,7 +34,7 @@ namespace ComSquare::Debugger this->_window->setAttribute(Qt::WA_DeleteOnClose); this->_ui.setupUi(this->_window); - //this->_sfWidget = std::make_unique(this->_ui.label_5); + this->_sfWidget = std::make_unique(this->_ui.widget_sfml); QMainWindow::connect(this->_ui.NbColumns, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setNbColumns(nb); }); QMainWindow::connect(this->_ui.ByteSize, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setRenderSize(nb); }); QMainWindow::connect(this->_ui.Address, QOverload::of(&QSpinBox::valueChanged), this, [this](int nb) -> void { this->setRamOffset(nb); }); diff --git a/sources/Debugger/TileViewer/TileViewer.hpp b/sources/Debugger/TileViewer/TileViewer.hpp index 9f21ff8..52482d3 100644 --- a/sources/Debugger/TileViewer/TileViewer.hpp +++ b/sources/Debugger/TileViewer/TileViewer.hpp @@ -15,7 +15,7 @@ namespace ComSquare::PPU #include #include "PPU/PPU.hpp" #include "Debugger/ClosableWindow.hpp" -#include "Renderer/QtRenderer/QtSFML.hpp" +#include "Renderer/QtRenderer/QtSfmlTileRenderer.hpp" #include "../../../ui/ui_tileView.h" #include "Ram/Ram.hpp" #include "TileRenderer.hpp" @@ -35,7 +35,7 @@ namespace ComSquare::Debugger //! @brief A reference to the ppu ComSquare::PPU::PPU &_ppu; //! @brief the window - //std::unique_ptr _sfWidget; + std::unique_ptr _sfWidget; //! @brief The tile renderer TileRenderer _tileRenderer; //! @brief Change the bpp from the index given by the ui (QT combo box) diff --git a/sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp new file mode 100644 index 0000000..fbb175e --- /dev/null +++ b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp @@ -0,0 +1,24 @@ +// +// Created by cbihan on 08/06/2021. +// + +#include +#include "QtSfmlTileRenderer.hpp" + +namespace ComSquare::Renderer +{ + + QtSFMLTileRenderer::QtSFMLTileRenderer(QWidget *parent, + int frameRate) + : QtWidgetSFML(parent, {0, 0}, {500, 1000}, frameRate) + { + // todo the size of the sfml renderwindow should fill the parent + std::cout << "size: " << parent->width() << " " << parent->height() << std::endl; + } + + void QtSFMLTileRenderer::_onUpdate() + { + this->_window.clear(sf::Color::Blue); + this->_window.display(); + } +} \ No newline at end of file diff --git a/sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp new file mode 100644 index 0000000..fea7945 --- /dev/null +++ b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp @@ -0,0 +1,33 @@ +// +// Created by cbihan on 08/06/2021. +// + +#pragma once + +#include +#include "QtWidgetSFML.hpp" + +namespace ComSquare::Renderer +{ + class QtSFMLTileRenderer : public QtWidgetSFML + { + private: + //! @brief internal buffer + //sf::Image _image; + //! @brief sprite + //sf::Sprite _sprite; + public: + + //! @brief Function called to update this widget. + void _onUpdate() override; + + //! @brief ctor + explicit QtSFMLTileRenderer(QWidget* parent, int frameRate = 0); + //! @brief copy ctor + QtSFMLTileRenderer(const QtSFMLTileRenderer &) = delete; + //! @brief default ctor + ~QtSFMLTileRenderer() override = default; + //! @brief assignment operator + QtSFMLTileRenderer &operator=(const QtSFMLTileRenderer &) = delete; + }; +} \ No newline at end of file diff --git a/ui/tileView.ui b/ui/tileView.ui index 0ad6a39..eb91790 100644 --- a/ui/tileView.ui +++ b/ui/tileView.ui @@ -22,11 +22,7 @@ - - - SFML window here :) - - + @@ -97,42 +93,10 @@ - - - - ArrowCursor - + + - Columns - - - - - - - - - - false - - - - - - 1 - - - 16 - - - 10 - - - - - - - 255 + Format @@ -167,10 +131,35 @@ - - + + + + ArrowCursor + - Format + Columns + + + + + + + + + + false + + + + + + 1 + + + 16 + + + 10 @@ -181,11 +170,15 @@ + + + + 255 + + + - - - From b8acc1520ad619df6a0cd98ab8b01232665ecad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 8 Jun 2021 23:07:24 +0200 Subject: [PATCH 26/35] whao it seems to work --- sources/Debugger/TileViewer/TileViewer.cpp | 1 + sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp | 11 ++++++++--- sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp | 8 +++----- sources/Renderer/SFRenderer.cpp | 6 +----- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/sources/Debugger/TileViewer/TileViewer.cpp b/sources/Debugger/TileViewer/TileViewer.cpp index 5ebb089..918da78 100644 --- a/sources/Debugger/TileViewer/TileViewer.cpp +++ b/sources/Debugger/TileViewer/TileViewer.cpp @@ -126,6 +126,7 @@ namespace ComSquare::Debugger void TileViewer::internalUpdate() { this->_tileRenderer.render(); + this->_sfWidget->buffer = this->_tileRenderer.buffer; this->_ppu.add_buffer(this->_tileRenderer.buffer, {200, 200}); } diff --git a/sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp index fbb175e..55d5348 100644 --- a/sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp +++ b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp @@ -10,7 +10,7 @@ namespace ComSquare::Renderer QtSFMLTileRenderer::QtSFMLTileRenderer(QWidget *parent, int frameRate) - : QtWidgetSFML(parent, {0, 0}, {500, 1000}, frameRate) + : QtWidgetSFML(parent, {0, 0}, {1025, 1025}, frameRate) { // todo the size of the sfml renderwindow should fill the parent std::cout << "size: " << parent->width() << " " << parent->height() << std::endl; @@ -18,7 +18,12 @@ namespace ComSquare::Renderer void QtSFMLTileRenderer::_onUpdate() { - this->_window.clear(sf::Color::Blue); - this->_window.display(); + this->_window.clear(sf::Color::Black); + for (unsigned long i = 0; i < this->buffer.size(); i++) { + for (unsigned long j = 0; j < this->buffer[i].size(); j++) { + this->putPixel(j, i, this->buffer[i][j]); + } + } + this->drawScreen(); } } \ No newline at end of file diff --git a/sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp index fea7945..a8c4b55 100644 --- a/sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp +++ b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp @@ -4,19 +4,17 @@ #pragma once +#include #include #include "QtWidgetSFML.hpp" +#include "Debugger/TileViewer/TileRenderer.hpp" namespace ComSquare::Renderer { class QtSFMLTileRenderer : public QtWidgetSFML { - private: - //! @brief internal buffer - //sf::Image _image; - //! @brief sprite - //sf::Sprite _sprite; public: + std::array, 1024> buffer; //! @brief Function called to update this widget. void _onUpdate() override; diff --git a/sources/Renderer/SFRenderer.cpp b/sources/Renderer/SFRenderer.cpp index 82e876f..8bb23fe 100644 --- a/sources/Renderer/SFRenderer.cpp +++ b/sources/Renderer/SFRenderer.cpp @@ -68,11 +68,7 @@ namespace ComSquare::Renderer if (y >= this->_videoMode.height) throw InvalidPixelPosition("Height", y, this->_videoMode.height); - sf::Color pixels; - pixels.r = rgba >> 24U; - pixels.g = rgba >> 16U; - pixels.b = rgba >> 8U; - pixels.a = rgba >> 0U; + sf::Color pixels(rgba); this->_pixelBuffer[this->_videoMode.width * y + x] = pixels; } From f1d567a7747a83fad7f7923816a5ecc519912c80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 8 Jun 2021 23:10:28 +0200 Subject: [PATCH 27/35] samba !!! --- sources/Debugger/TileViewer/TileViewer.cpp | 1 - sources/PPU/PPU.cpp | 4 ++-- sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/sources/Debugger/TileViewer/TileViewer.cpp b/sources/Debugger/TileViewer/TileViewer.cpp index 918da78..1bfe041 100644 --- a/sources/Debugger/TileViewer/TileViewer.cpp +++ b/sources/Debugger/TileViewer/TileViewer.cpp @@ -127,7 +127,6 @@ namespace ComSquare::Debugger { this->_tileRenderer.render(); this->_sfWidget->buffer = this->_tileRenderer.buffer; - this->_ppu.add_buffer(this->_tileRenderer.buffer, {200, 200}); } void TileViewer::setRamOffset(int offset) diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index 9e825fe..8d04ffb 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -467,12 +467,12 @@ namespace ComSquare::PPU { (void)cycles; - /* + this->renderMainAndSubScreen(); 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]); diff --git a/sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp index 55d5348..782b3cc 100644 --- a/sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp +++ b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp @@ -13,7 +13,6 @@ namespace ComSquare::Renderer : QtWidgetSFML(parent, {0, 0}, {1025, 1025}, frameRate) { // todo the size of the sfml renderwindow should fill the parent - std::cout << "size: " << parent->width() << " " << parent->height() << std::endl; } void QtSFMLTileRenderer::_onUpdate() From daa7e285d10770878f57d8877e868dc28e46c269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 8 Jun 2021 23:58:07 +0200 Subject: [PATCH 28/35] Tile renderer is building --- CMakeLists.txt | 2 +- sources/PPU/Background.hpp | 8 +-- sources/PPU/TileRenderer.cpp | 131 +++++++++++++++++++++++++++++++++++ sources/PPU/TileRenderer.hpp | 56 +++++++++++++++ 4 files changed, 190 insertions(+), 7 deletions(-) create mode 100644 sources/PPU/TileRenderer.cpp create mode 100644 sources/PPU/TileRenderer.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ce2d3df..d4c9328 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 sources/PPU/Tile.hpp sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp) + sources/Debugger/TileViewer/TileRenderer.cpp sources/Debugger/TileViewer/TileRenderer.hpp sources/PPU/Tile.hpp sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp sources/PPU/TileRenderer.cpp sources/PPU/TileRenderer.hpp) include_directories(ComSquare sources) diff --git a/sources/PPU/Background.hpp b/sources/PPU/Background.hpp index a68a0fd..d82b742 100644 --- a/sources/PPU/Background.hpp +++ b/sources/PPU/Background.hpp @@ -2,8 +2,7 @@ // Created by cbihan on 5/14/20. // -#ifndef COMSQUARE_BACKGROUND_HPP -#define COMSQUARE_BACKGROUND_HPP +#pragma once #include #include @@ -123,7 +122,4 @@ namespace ComSquare::PPU //! @brief Delete assignment operator Background &operator=(const Background &) = delete; }; -} - - -#endif //COMSQUARE_BACKGROUND_HPP \ No newline at end of file +} \ No newline at end of file diff --git a/sources/PPU/TileRenderer.cpp b/sources/PPU/TileRenderer.cpp new file mode 100644 index 0000000..2da2425 --- /dev/null +++ b/sources/PPU/TileRenderer.cpp @@ -0,0 +1,131 @@ +// +// Created by cbihan on 24/05/2021. +// + +#include +#include +#include "TileRenderer.hpp" +#include "PPU/PPU.hpp" +#include "PPU/Tile.hpp" +#include + +namespace ComSquare::PPU +{ + TileRenderer::TileRenderer() + : _ram(nullptr), + _cgram(nullptr), + _bpp(2), + _paletteIndex(0), + buffer({{{0}}}) + { + } + + void TileRenderer::setRam(std::shared_ptr ram) + { + this->_ram = std::move(ram); + } + + void TileRenderer::render(uint16_t tileAddress) + { + std::vector palette = this->getPalette(this->_paletteIndex); + int it = 0; + + for (auto &row : this->buffer) { + for (auto &pixel : row) { + pixel = getRealColor(palette[this->getPixelReferenceFromTile(tileAddress, it++)]); + } + } + } + + uint8_t TileRenderer::getPixelReferenceFromTile(uint16_t tileAddress, uint8_t pixelIndex) + { + uint8_t row = pixelIndex / Tile::NbPixelsWidth; + uint8_t column = pixelIndex % Tile::NbPixelsHeight; + + if (row >= Tile::NbPixelsHeight) { + tileAddress += 0x80 * this->_bpp; + row -= Tile::NbPixelsHeight; + } + if (column >= Tile::NbPixelsWidth) { + tileAddress += 0x8 * this->_bpp; + column -= Tile::NbPixelsWidth; + } + // TODO might not work with 8 bpp must check + tileAddress += 2 * row; + + return this->getPixelReferenceFromTileRow(tileAddress, column); + } + + void TileRenderer::setPaletteIndex(int paletteIndex) + { + this->_paletteIndex = paletteIndex; + } + + void TileRenderer::setBpp(int bpp) + { + this->_bpp = bpp; + } + + 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 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: + result += this->read2BPPValue(tileRowAddress + TileByteSizeRow * 2, pixelIndex) << 4; + result += this->read2BPPValue(tileRowAddress + TileByteSizeRow * 3, pixelIndex) << 6; + FALLTHROUGH + case 4: + result += this->read2BPPValue(tileRowAddress + TileByteSizeRow, pixelIndex) << 2; + FALLTHROUGH + case 2: + result += this->read2BPPValue(tileRowAddress, pixelIndex); + default: + break; + } + return result; + } + + std::vector TileRenderer::getPalette(int nbPalette) + { + 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); + + 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); + } + + int TileRenderer::getBpp() const + { + return this->_bpp; + } + + int TileRenderer::getPaletteIndex() const + { + return this->_paletteIndex; + } +} \ No newline at end of file diff --git a/sources/PPU/TileRenderer.hpp b/sources/PPU/TileRenderer.hpp new file mode 100644 index 0000000..7e9a10d --- /dev/null +++ b/sources/PPU/TileRenderer.hpp @@ -0,0 +1,56 @@ +// +// Created by cbihan on 24/05/2021. +// + +#pragma once + +#include +#include "Ram/Ram.hpp" + +namespace ComSquare::PPU +{ + 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 _paletteIndex; + public: + // todo background or ppu should have constexpr to explain it (16) + //! @brief internal buffer max rendered tiles are 16x16 + std::array, 8> 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 + void setCgram(std::shared_ptr ram); + //! @brief Set the bpp to render graphics + void setBpp(int bpp); + //! @brief The ram to render + void setRam(std::shared_ptr ram); + //! @brief Get the current bpp + int getBpp() const; + //! @brief Get the index of the current palette used + int getPaletteIndex() const; + //! @brief Gives the reference of pixel using the tileAddress and the pixelIndex + //! @note This function is wrapper of getPixelReferenceFromTileRow + uint8_t getPixelReferenceFromTile(uint16_t tileAddress, uint8_t pixelIndex); + //! @brief get the pixel color reference to use in the selected palette + uint8_t getPixelReferenceFromTileRow(uint16_t tileRowAddress, uint8_t pixelIndex); + //! @brief Gives the actual selected palette with all of it's colors + //! @warning Values are CGRAM colors use PPU::getRealColor function to get the actual real color + std::vector getPalette(int nbPalette); + //! @brief read the 2bpp value for a pixel (used multple times for 4bpp and 8bpp) + uint8_t read2BPPValue(uint16_t tileRowAddress, uint8_t pixelIndex); + //! @brief render the tile (8x8) at the tileAddress + //! @param tileAddress The address of the tile to render + void render(uint16_t tileAddress); + TileRenderer(); + TileRenderer(const TileRenderer &) = default; + ~TileRenderer() = default; + TileRenderer &operator=(const TileRenderer &) = default; + }; +} \ No newline at end of file From 17607d6fcbc442a6057b36824d1ef23fcba27184 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 9 Jun 2021 00:55:38 +0200 Subject: [PATCH 29/35] HflipArray and VFLipArray aren't working --- sources/PPU/Background.cpp | 31 +++++++++++++++++++++++++++++-- sources/PPU/Background.hpp | 7 ++++--- sources/PPU/PPUUtils.cpp | 13 ++++--------- sources/PPU/PPUUtils.hpp | 32 ++++++++++++++++++++++++++++++++ sources/PPU/TileRenderer.cpp | 5 ++++- 5 files changed, 73 insertions(+), 15 deletions(-) diff --git a/sources/PPU/Background.cpp b/sources/PPU/Background.cpp index 234fbb4..d86aefb 100644 --- a/sources/PPU/Background.cpp +++ b/sources/PPU/Background.cpp @@ -7,6 +7,7 @@ #include "Background.hpp" #include #include "Tile.hpp" +#include "PPUUtils.hpp" #include "Models/Vector2.hpp" namespace ComSquare::PPU @@ -26,6 +27,8 @@ namespace ComSquare::PPU _cgram(ppu.cgram), buffer({{{0}}}) { + this->tileRenderer.setRam(this->_vram); + this->tileRenderer.setCgram(this->_cgram); } void Background::renderBackground() @@ -58,11 +61,34 @@ namespace ComSquare::PPU uint32_t color = 0; tileData.raw = data; - palette = getPalette(tileData.palette); + + if (tileData.tilePriority != this->_priority) + return; // X horizontal // Y vertical + + this->tileRenderer.setPaletteIndex(tileData.palette); graphicAddress = this->_tilesetAddress + (tileData.posY * NbTilePerRow * this->_bpp * TileBaseByteSize) + (tileData.posX * this->_bpp * TileBaseByteSize); + for (int i = 0; i < this->_characterNbPixels.y; i += 8) { + for (int j = 0; j < this->_characterNbPixels.x; j += 8) { + this->tileRenderer.render(graphicAddress); + merge2DArray(this->tileBuffer, this->tileRenderer.buffer, {i, j}); + } + } + + if (tileData.verticalFlip) + VFlipArray(this->tileBuffer); + if (tileData.horizontalFlip) + HFlipArray(this->tileBuffer); for (int i = 0; i < this->_characterNbPixels.y; i++) { + for (int j = 0; j < this->_characterNbPixels.x; j++) { + this->buffer[pos.x][pos.y] = this->tileBuffer[i][j]; + pos.x++; + } + pos.x -= this->_characterNbPixels.x; + pos.y++; + } + /*for (int i = 0; i < this->_characterNbPixels.y; i++) { index = i * this->_characterNbPixels.x; if (tileData.verticalFlip) index = (this->_characterNbPixels.y - 1 - i) * this->_characterNbPixels.x; @@ -78,7 +104,7 @@ namespace ComSquare::PPU } pos.x -= this->_characterNbPixels.x; pos.y++; - } + }*/ } std::vector Background::getPalette(int nbPalette) @@ -190,6 +216,7 @@ namespace ComSquare::PPU this->_bpp = bpp; else this->_bpp = 2; + this->tileRenderer.setBpp(this->_bpp); } void Background::setTilemaps(Vector2 tileMaps) diff --git a/sources/PPU/Background.hpp b/sources/PPU/Background.hpp index d82b742..9707839 100644 --- a/sources/PPU/Background.hpp +++ b/sources/PPU/Background.hpp @@ -8,17 +8,18 @@ #include #include #include "../Models/Vector2.hpp" +#include "TileRenderer.hpp" #include "../Ram/Ram.hpp" #include "PPU.hpp" -//! @brief Transform SNES color code BGR to uint32_t RGB -uint32_t getRealColor(uint16_t color); - namespace ComSquare::PPU { class PPU; class Background { private: + TileRenderer tileRenderer; + std::array, 16> tileBuffer = {{{0}}}; + //! @brief The number of character a TileMap has in width static constexpr int NbCharacterWidth = 32; //! @brief The number of character a TileMap has in height diff --git a/sources/PPU/PPUUtils.cpp b/sources/PPU/PPUUtils.cpp index be10b14..8a1c5d8 100644 --- a/sources/PPU/PPUUtils.cpp +++ b/sources/PPU/PPUUtils.cpp @@ -9,16 +9,11 @@ namespace ComSquare::PPU uint32_t getRealColor(uint16_t color) { - uint8_t blue; - uint8_t red; - uint8_t green; - uint32_t pixelTmp; + uint8_t blue = (color & 0x7D00U) >> 10U; + uint8_t green = (color & 0x03E0U) >> 5U; + uint8_t red = (color & 0x001FU); + uint32_t pixelTmp = 0xFF; - blue = (color & 0x7D00U) >> 10U; - green = (color & 0x03E0U) >> 5U; - red = (color & 0x001FU); - - pixelTmp = 0xFF; pixelTmp += (red * 255U / 31U) << 24U; pixelTmp += (green * 255U / 31U) << 16U; pixelTmp += (blue * 255U / 31U) << 8U; diff --git a/sources/PPU/PPUUtils.hpp b/sources/PPU/PPUUtils.hpp index 06de286..52d66ae 100644 --- a/sources/PPU/PPUUtils.hpp +++ b/sources/PPU/PPUUtils.hpp @@ -6,9 +6,15 @@ #define COMSQUARE_PPU_UTILS_HPP #include +#include +#include +#include "Models//Vector2.hpp" namespace ComSquare::PPU { + + //! @brief Transform SNES color code BGR to uint32_t RGB + uint32_t getRealColor(uint16_t color); //! @brief Used to parse easily VRAM Tile information union TileMapData { struct { @@ -36,5 +42,31 @@ namespace ComSquare::PPU uint8_t hScrollPrevValue; }; + template + void merge2DArray(std::array, DEST_SIZE_Y> &bufferDest, + const std::array, SRC_SIZE_Y> &bufferSrc, + const Vector2 &offset = {0, 0}) + { + for (int i = offset.y; i < bufferSrc.size(); i++) { + for (int j = offset.x; j < bufferSrc[i].size(); j++) { + bufferDest[i][j] = bufferSrc[i][j]; + } + } + } + + template + void VFlipArray(std::array, SRC_SIZE_Y> &array) + { + for (auto &row : array) { + std::reverse(row.begin(), row.end()); + } + } + + template + void HFlipArray(std::array, SRC_SIZE_Y> &array) + { + std::reverse(array.begin(), array.end()); + } + } #endif //COMSQUARE_PPU_UTILS_HPP \ No newline at end of file diff --git a/sources/PPU/TileRenderer.cpp b/sources/PPU/TileRenderer.cpp index 2da2425..348049d 100644 --- a/sources/PPU/TileRenderer.cpp +++ b/sources/PPU/TileRenderer.cpp @@ -29,10 +29,12 @@ namespace ComSquare::PPU { std::vector palette = this->getPalette(this->_paletteIndex); int it = 0; + this->buffer = {{{0}}}; for (auto &row : this->buffer) { for (auto &pixel : row) { - pixel = getRealColor(palette[this->getPixelReferenceFromTile(tileAddress, it++)]); + uint8_t pixelReference = this->getPixelReferenceFromTile(tileAddress, it++); + pixel = pixelReference ? getRealColor(palette[pixelReference]) : 0; } } } @@ -102,6 +104,7 @@ namespace ComSquare::PPU std::vector TileRenderer::getPalette(int nbPalette) { + // todo if needed the tile renderer could cache the palette to avoid recompute this every render 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); From 3b072dea560ea360e99899f2062f6f9594a46a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 9 Jun 2021 10:36:53 +0200 Subject: [PATCH 30/35] flipped tile seems to work now but need to check on it later --- sources/PPU/Background.cpp | 26 +++----------------------- sources/PPU/PPUUtils.hpp | 14 +++++++++----- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/sources/PPU/Background.cpp b/sources/PPU/Background.cpp index d86aefb..d145831 100644 --- a/sources/PPU/Background.cpp +++ b/sources/PPU/Background.cpp @@ -55,10 +55,6 @@ namespace ComSquare::PPU { uint16_t graphicAddress; union TileMapData tileData; - std::vector palette; - int index = 0; - uint8_t reference = 0; - uint32_t color = 0; tileData.raw = data; @@ -76,10 +72,11 @@ namespace ComSquare::PPU } } + // todo check why i need to invert vertical and horizontal flips if (tileData.verticalFlip) - VFlipArray(this->tileBuffer); + HFlipArray(this->tileBuffer, {this->_characterNbPixels.x, this->_characterNbPixels.y}); if (tileData.horizontalFlip) - HFlipArray(this->tileBuffer); + VFlipArray(this->tileBuffer, {this->_characterNbPixels.x, this->_characterNbPixels.y}); for (int i = 0; i < this->_characterNbPixels.y; i++) { for (int j = 0; j < this->_characterNbPixels.x; j++) { this->buffer[pos.x][pos.y] = this->tileBuffer[i][j]; @@ -88,23 +85,6 @@ namespace ComSquare::PPU pos.x -= this->_characterNbPixels.x; pos.y++; } - /*for (int i = 0; i < this->_characterNbPixels.y; i++) { - index = i * this->_characterNbPixels.x; - if (tileData.verticalFlip) - index = (this->_characterNbPixels.y - 1 - i) * this->_characterNbPixels.x; - if (tileData.horizontalFlip) - index += this->_characterNbPixels.x - 1; - for (int j = 0; j < this->_characterNbPixels.x; j++) { - reference = getPixelReferenceFromTile(graphicAddress, index); - color = getRealColor(palette[reference]); - if (tileData.tilePriority == this->_priority) // reference 0 is considered as transparency - this->buffer[pos.x][pos.y] = (reference) ? color : 0; - index += (tileData.horizontalFlip) ? -1 : 1; - pos.x++; - } - pos.x -= this->_characterNbPixels.x; - pos.y++; - }*/ } std::vector Background::getPalette(int nbPalette) diff --git a/sources/PPU/PPUUtils.hpp b/sources/PPU/PPUUtils.hpp index 52d66ae..29a6695 100644 --- a/sources/PPU/PPUUtils.hpp +++ b/sources/PPU/PPUUtils.hpp @@ -55,17 +55,21 @@ namespace ComSquare::PPU } template - void VFlipArray(std::array, SRC_SIZE_Y> &array) + void VFlipArray(std::array, SRC_SIZE_Y> &array, + const Vector2 &size, + const Vector2 &offset = {0, 0}) { - for (auto &row : array) { - std::reverse(row.begin(), row.end()); + for (int i = offset.y; i < offset.y + size.y; i++) { + std::reverse(array[i].begin() + offset.x, array[i].begin() + offset.x + size.x); } } template - void HFlipArray(std::array, SRC_SIZE_Y> &array) + void HFlipArray(std::array, SRC_SIZE_Y> &array, + const Vector2 &size, + const Vector2 &offset = {0, 0}) { - std::reverse(array.begin(), array.end()); + std::reverse(array.begin() + offset.x, array.begin() + offset.x + size.x); } } From 6a7242dffd6dcb5d158e5fa2908c1212b7eb4220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 9 Jun 2021 10:40:39 +0200 Subject: [PATCH 31/35] fixing warning compil --- sources/PPU/PPU.cpp | 14 +++++++------- sources/PPU/PPUUtils.hpp | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index 8d04ffb..b43cdb8 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -42,7 +42,7 @@ namespace ComSquare::PPU this->cgram->write(7, 0x03); this->cgram->write(66, 0xE0); this->cgram->write(67, 0x7F); -/* + //tiles int vram_test[] = { 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, @@ -75,17 +75,17 @@ namespace ComSquare::PPU 00,0x03,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x0c,0x00,0x18,0x00,0xf0,0x00,0xe0, 00,0x00,0x00,0x00,0x80,0x00,0xc0,0x00,0xe0,0x00,0xf0,0x00,0xf8,0x00,0xfc,0x00, 00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x07,0x00,0x0f,00,0x1f,00,0x3f,00, -1 - }; */ - int *cgram_test = get_dump_cgram(); + }; + /*int *cgram_test = get_dump_cgram(); for (int i = 0; cgram_test[i] != -1; i++) { this->cgram->write(i, cgram_test[i]); } - int *vram_test = get_dump_vram(); + int *vram_test = get_dump_vram(); */ for (int i = 0; vram_test[i] != -1; i++) { this->vram->write(i, vram_test[i]); } - /* int vram_test_2[] = {8, 00, 02, 00, 0x0A, 00, 02, 00, 0x0A, 00, 00, 00, 00, 00, 00, -1}; + int vram_test_2[] = {8, 00, 02, 00, 0x0A, 00, 02, 00, 0x0A, 00, 00, 00, 00, 00, 00, -1}; for (int i = 0; vram_test_2[i] != -1; i++) { this->vram->write(i + 0x8000, vram_test_2[i]); } @@ -144,8 +144,8 @@ namespace ComSquare::PPU //this->_registers._bgofs[3].raw = 0x03DF; this->_registers._t[0].enableWindowDisplayBg1 = true; this->_registers._t[0].enableWindowDisplayBg2 = true; - */ +/* //registers aladin this->_registers._bgmode.bgMode = 1; @@ -199,7 +199,7 @@ namespace ComSquare::PPU this->_registers._t[0].enableWindowDisplayBg1 = true; this->_registers._t[0].enableWindowDisplayBg2 = true; this->_registers._t[0].enableWindowDisplayBg3 = true; - + */ } diff --git a/sources/PPU/PPUUtils.hpp b/sources/PPU/PPUUtils.hpp index 29a6695..88124da 100644 --- a/sources/PPU/PPUUtils.hpp +++ b/sources/PPU/PPUUtils.hpp @@ -47,8 +47,8 @@ namespace ComSquare::PPU const std::array, SRC_SIZE_Y> &bufferSrc, const Vector2 &offset = {0, 0}) { - for (int i = offset.y; i < bufferSrc.size(); i++) { - for (int j = offset.x; j < bufferSrc[i].size(); j++) { + for (unsigned long i = offset.y; i < bufferSrc.size(); i++) { + for (unsigned long j = offset.x; j < bufferSrc[i].size(); j++) { bufferDest[i][j] = bufferSrc[i][j]; } } From bc0823342c9de4f0c2f2a626d7e7a746afeae671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 22 Jun 2021 23:03:53 +0200 Subject: [PATCH 32/35] fixing offset issues with 2bpp rendering --- sources/PPU/Background.cpp | 11 +++++++++-- sources/PPU/PPUUtils.hpp | 6 +++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/sources/PPU/Background.cpp b/sources/PPU/Background.cpp index d145831..ecdb64e 100644 --- a/sources/PPU/Background.cpp +++ b/sources/PPU/Background.cpp @@ -60,16 +60,23 @@ namespace ComSquare::PPU if (tileData.tilePriority != this->_priority) return; + + Vector2i tileOffset = {0, 0}; // X horizontal // Y vertical this->tileRenderer.setPaletteIndex(tileData.palette); - graphicAddress = this->_tilesetAddress + (tileData.posY * NbTilePerRow * this->_bpp * TileBaseByteSize) + (tileData.posX * this->_bpp * TileBaseByteSize); for (int i = 0; i < this->_characterNbPixels.y; i += 8) { for (int j = 0; j < this->_characterNbPixels.x; j += 8) { + graphicAddress = this->_tilesetAddress + + ((tileData.posY + tileOffset.y) * NbTilePerRow * this->_bpp * TileBaseByteSize) + + ((tileData.posX + tileOffset.x) * this->_bpp * TileBaseByteSize); this->tileRenderer.render(graphicAddress); - merge2DArray(this->tileBuffer, this->tileRenderer.buffer, {i, j}); + merge2DArray(this->tileBuffer, this->tileRenderer.buffer, {j, i}); + tileOffset.x += 1; } + tileOffset.x = 0; + tileOffset.y += 1; } // todo check why i need to invert vertical and horizontal flips diff --git a/sources/PPU/PPUUtils.hpp b/sources/PPU/PPUUtils.hpp index 88124da..1cdb0a7 100644 --- a/sources/PPU/PPUUtils.hpp +++ b/sources/PPU/PPUUtils.hpp @@ -47,9 +47,9 @@ namespace ComSquare::PPU const std::array, SRC_SIZE_Y> &bufferSrc, const Vector2 &offset = {0, 0}) { - for (unsigned long i = offset.y; i < bufferSrc.size(); i++) { - for (unsigned long j = offset.x; j < bufferSrc[i].size(); j++) { - bufferDest[i][j] = bufferSrc[i][j]; + for (unsigned long i = 0; i < bufferSrc.size(); i++) { + for (unsigned long j = 0; j < bufferSrc[i].size(); j++) { + bufferDest[i + offset.y][j + offset.x] = bufferSrc[i][j]; } } } From 7b7520ce698aceccf8c4f1e9827aa304bb8c63cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 22 Jun 2021 23:54:04 +0200 Subject: [PATCH 33/35] general cleanup can not work with 4bpp going to check --- CMakeLists.txt | 2 +- .../Debugger/TileViewer/RAMTileRenderer.cpp | 111 ++++++++++++ .../{TileRenderer.hpp => RAMTileRenderer.hpp} | 28 +-- sources/Debugger/TileViewer/TileRenderer.cpp | 161 ------------------ sources/Debugger/TileViewer/TileViewer.cpp | 2 +- sources/Debugger/TileViewer/TileViewer.hpp | 4 +- sources/PPU/Background.cpp | 25 +-- sources/PPU/Background.hpp | 10 +- sources/PPU/PPU.cpp | 2 +- sources/PPU/PPU.hpp | 2 +- sources/PPU/Tile.hpp | 3 + .../QtRenderer/QtSfmlTileRenderer.hpp | 2 +- 12 files changed, 152 insertions(+), 200 deletions(-) create mode 100644 sources/Debugger/TileViewer/RAMTileRenderer.cpp rename sources/Debugger/TileViewer/{TileRenderer.hpp => RAMTileRenderer.hpp} (70%) delete mode 100644 sources/Debugger/TileViewer/TileRenderer.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index d4c9328..29b9efc 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 sources/PPU/Tile.hpp sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp sources/PPU/TileRenderer.cpp sources/PPU/TileRenderer.hpp) + sources/Debugger/TileViewer/RAMTileRenderer.cpp sources/Debugger/TileViewer/RAMTileRenderer.hpp sources/PPU/Tile.hpp sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp sources/PPU/TileRenderer.cpp sources/PPU/TileRenderer.hpp) include_directories(ComSquare sources) diff --git a/sources/Debugger/TileViewer/RAMTileRenderer.cpp b/sources/Debugger/TileViewer/RAMTileRenderer.cpp new file mode 100644 index 0000000..c635e6d --- /dev/null +++ b/sources/Debugger/TileViewer/RAMTileRenderer.cpp @@ -0,0 +1,111 @@ +// +// Created by cbihan on 24/05/2021. +// + +#include +#include +#include "RAMTileRenderer.hpp" +#include "PPU/PPU.hpp" +#include "PPU/Tile.hpp" +#include + +namespace ComSquare::Debugger +{ + RAMTileRenderer::RAMTileRenderer() + : _ram(nullptr), + _renderSize(0x5000), + _nbColumns(16), + _ramOffset(0), + _bpp(2), + buffer({{{0}}}) + { + } + + void RAMTileRenderer::setRam(std::shared_ptr ram) + { + this->_ram = ram; + this->_tileRenderer.setRam(ram); + } + + void RAMTileRenderer::render() + { + int bufX = 0; + int bufY = 0; + int nbTilesDrawn = 0; + int resetX = bufX; + for (auto &i : buffer) + i.fill(0); + uint24_t limit = fmin(this->_ram->getSize(), this->_renderSize) + this->_ramOffset; + + for (uint24_t i = this->_ramOffset; i < limit; i += PPU::Tile::BaseByteSize * this->_bpp, nbTilesDrawn++) { + if (bufX > 1024 || bufY > 1024) + break; + + this->_tileRenderer.render(i); + if (nbTilesDrawn) { + resetX += PPU::Tile::NbPixelsWidth; + bufX = resetX; + bufY -= PPU::Tile::NbPixelsHeight; + } + if (nbTilesDrawn && nbTilesDrawn % this->_nbColumns == 0) { + nbTilesDrawn = 0; + resetX = 0; + bufX = resetX; + bufY += PPU::Tile::NbPixelsHeight; + } + + for (const auto &raw : this->_tileRenderer.buffer) { + for (const auto &pixel : raw) { + buffer[bufX++][bufY] = pixel; + } + bufY++; + bufX = resetX; + } + } + } + + void RAMTileRenderer::setPaletteIndex(int paletteIndex) + { + this->_tileRenderer.setPaletteIndex(paletteIndex); + } + + void RAMTileRenderer::setBpp(int bpp) + { + this->_tileRenderer.setBpp(bpp); + } + + void RAMTileRenderer::setCgram(std::shared_ptr ram) + { + this->_tileRenderer.setCgram(ram); + } + + void RAMTileRenderer::setRenderSize(int size) + { + this->_renderSize = size; + } + + void RAMTileRenderer::setNbColumns(int nbColumns) + { + this->_nbColumns = nbColumns; + } + + int RAMTileRenderer::getBpp() const + { + return this->_tileRenderer.getBpp(); + } + + int RAMTileRenderer::getPaletteIndex() const + { + return this->_tileRenderer.getPaletteIndex(); + } + + int RAMTileRenderer::getNbColumns() const + { + return this->_nbColumns; + } + + void RAMTileRenderer::setRamOffset(int offset) + { + this->_ramOffset = offset; + } +} \ No newline at end of file diff --git a/sources/Debugger/TileViewer/TileRenderer.hpp b/sources/Debugger/TileViewer/RAMTileRenderer.hpp similarity index 70% rename from sources/Debugger/TileViewer/TileRenderer.hpp rename to sources/Debugger/TileViewer/RAMTileRenderer.hpp index e12b1c5..8c4eeb0 100644 --- a/sources/Debugger/TileViewer/TileRenderer.hpp +++ b/sources/Debugger/TileViewer/RAMTileRenderer.hpp @@ -5,26 +5,25 @@ #pragma once #include +#include "PPU/TileRenderer.hpp" #include "Ram/Ram.hpp" namespace ComSquare::Debugger { - class TileRenderer { + class RAMTileRenderer { 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 _paletteIndex; //! @brief The size to render in the ram int _renderSize; //! @brief The number of tile columns to display int _nbColumns; //! @brief Bytes to skip from the start of the ram int _ramOffset; + //! @brief The actual bpp to render + int _bpp; + //! @brief The class tha actually render the tile + PPU::TileRenderer _tileRenderer; public: //! @brief internal buffer std::array, 1024> buffer; @@ -48,15 +47,16 @@ namespace ComSquare::Debugger int getPaletteIndex() const; //! @brief Get the numbr of maximum tile columns to render 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(); - TileRenderer(const TileRenderer &) = default; - ~TileRenderer() = default; - TileRenderer &operator=(const TileRenderer &) = default; + //! @brief ctor + RAMTileRenderer(); + //! @brief copy ctor + RAMTileRenderer(const RAMTileRenderer &) = default; + //! @brief dtor + ~RAMTileRenderer() = default; + //! @brief assignment operator + RAMTileRenderer &operator=(const RAMTileRenderer &) = default; }; } diff --git a/sources/Debugger/TileViewer/TileRenderer.cpp b/sources/Debugger/TileViewer/TileRenderer.cpp deleted file mode 100644 index 570e35d..0000000 --- a/sources/Debugger/TileViewer/TileRenderer.cpp +++ /dev/null @@ -1,161 +0,0 @@ -// -// Created by cbihan on 24/05/2021. -// - -#include -#include -#include "TileRenderer.hpp" -#include "PPU/PPU.hpp" -#include "PPU/Tile.hpp" -#include - -namespace ComSquare::Debugger -{ - TileRenderer::TileRenderer() - : _ram(nullptr), - _cgram(nullptr), - _bpp(2), - _paletteIndex(0), - _renderSize(0x5000), - _nbColumns(16), - 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->_paletteIndex); - int bufX = 0; - int bufY = 0; - int nbTilesDrawn = 0; - int resetX = bufX; - int it = 0; - for (auto &i : buffer) - i.fill(0); - - for (uint24_t i = this->_ramOffset; i < fmin(this->_ram->getSize(), this->_renderSize) + this->_ramOffset; i += 2, it++) { - if (bufX > 1024 || bufY > 1024) - break; - if (it && it % 8 == 0) { - resetX += PPU::Tile::NbPixelsWidth; - bufX = resetX; - bufY -= PPU::Tile::NbPixelsHeight; - i += (this->_bpp - 2) * 0x8; - nbTilesDrawn++; - } - if (nbTilesDrawn && nbTilesDrawn % this->_nbColumns == 0) { - nbTilesDrawn = 0; - resetX = 0; - bufX = resetX; - bufY += PPU::Tile::NbPixelsHeight; - } - for (int j = 0; j < 8; j++) { - colorReference = this->getPixelReferenceFromTileRow(i, j); - color = PPU::getRealColor(palette[colorReference]); - buffer[bufX++][bufY] = color; - } - bufY++; - bufX = resetX; - } - } - - void TileRenderer::setPaletteIndex(int paletteIndex) - { - this->_paletteIndex = paletteIndex; - } - - void TileRenderer::setBpp(int bpp) - { - this->_bpp = bpp; - } - - 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 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: - result += this->read2BPPValue(tileRowAddress + TileByteSizeRow * 2, pixelIndex) << 4; - result += this->read2BPPValue(tileRowAddress + TileByteSizeRow * 3, pixelIndex) << 6; - FALLTHROUGH - case 4: - result += this->read2BPPValue(tileRowAddress + TileByteSizeRow, pixelIndex) << 2; - FALLTHROUGH - case 2: - result += this->read2BPPValue(tileRowAddress, pixelIndex); - default: - break; - } - return result; - } - - std::vector TileRenderer::getPalette(int nbPalette) - { - 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); - - 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); - } - - void TileRenderer::setRenderSize(int size) - { - this->_renderSize = size; - } - - void TileRenderer::setNbColumns(int nbColumns) - { - this->_nbColumns = nbColumns; - } - - int TileRenderer::getBpp() const - { - return this->_bpp; - } - - int TileRenderer::getPaletteIndex() const - { - return this->_paletteIndex; - } - - int TileRenderer::getNbColumns() const - { - return this->_nbColumns; - } - - void TileRenderer::setRamOffset(int offset) - { - this->_ramOffset = offset; - } -} \ No newline at end of file diff --git a/sources/Debugger/TileViewer/TileViewer.cpp b/sources/Debugger/TileViewer/TileViewer.cpp index 1bfe041..e74033b 100644 --- a/sources/Debugger/TileViewer/TileViewer.cpp +++ b/sources/Debugger/TileViewer/TileViewer.cpp @@ -15,7 +15,7 @@ namespace ComSquare::Renderer #include #include #include "Utility/Utility.hpp" -#include "TileRenderer.hpp" +#include "RAMTileRenderer.hpp" #include "PPU/PPU.hpp" namespace ComSquare::Debugger diff --git a/sources/Debugger/TileViewer/TileViewer.hpp b/sources/Debugger/TileViewer/TileViewer.hpp index 52482d3..f01fb86 100644 --- a/sources/Debugger/TileViewer/TileViewer.hpp +++ b/sources/Debugger/TileViewer/TileViewer.hpp @@ -18,7 +18,7 @@ namespace ComSquare::PPU #include "Renderer/QtRenderer/QtSfmlTileRenderer.hpp" #include "../../../ui/ui_tileView.h" #include "Ram/Ram.hpp" -#include "TileRenderer.hpp" +#include "RAMTileRenderer.hpp" namespace ComSquare::Debugger { @@ -37,7 +37,7 @@ namespace ComSquare::Debugger //! @brief the window std::unique_ptr _sfWidget; //! @brief The tile renderer - TileRenderer _tileRenderer; + RAMTileRenderer _tileRenderer; //! @brief Change the bpp from the index given by the ui (QT combo box) void _bppChangeUIHandler(int index); public: diff --git a/sources/PPU/Background.cpp b/sources/PPU/Background.cpp index ecdb64e..38320c0 100644 --- a/sources/PPU/Background.cpp +++ b/sources/PPU/Background.cpp @@ -23,12 +23,13 @@ namespace ComSquare::PPU _tilesetAddress(ppu.getTilesetAddress(backGroundNumber)), _priority(hasPriority), _bgNumber(backGroundNumber), + _tileBuffer({{{0}}}), _vram(ppu.vram), _cgram(ppu.cgram), buffer({{{0}}}) { - this->tileRenderer.setRam(this->_vram); - this->tileRenderer.setCgram(this->_cgram); + this->_tileRenderer.setRam(this->_vram); + this->_tileRenderer.setCgram(this->_cgram); } void Background::renderBackground() @@ -53,7 +54,6 @@ namespace ComSquare::PPU void Background::drawBgTile(uint16_t data, Vector2 pos) { - uint16_t graphicAddress; union TileMapData tileData; tileData.raw = data; @@ -61,18 +61,19 @@ namespace ComSquare::PPU if (tileData.tilePriority != this->_priority) return; + uint16_t graphicAddress; Vector2i tileOffset = {0, 0}; // X horizontal // Y vertical - this->tileRenderer.setPaletteIndex(tileData.palette); + this->_tileRenderer.setPaletteIndex(tileData.palette); for (int i = 0; i < this->_characterNbPixels.y; i += 8) { for (int j = 0; j < this->_characterNbPixels.x; j += 8) { graphicAddress = this->_tilesetAddress + - ((tileData.posY + tileOffset.y) * NbTilePerRow * this->_bpp * TileBaseByteSize) + - ((tileData.posX + tileOffset.x) * this->_bpp * TileBaseByteSize); - this->tileRenderer.render(graphicAddress); - merge2DArray(this->tileBuffer, this->tileRenderer.buffer, {j, i}); + ((tileData.posY + tileOffset.y) * NbTilePerRow * this->_bpp * Tile::BaseByteSize) + + ((tileData.posX + tileOffset.x) * this->_bpp * Tile::BaseByteSize); + this->_tileRenderer.render(graphicAddress); + merge2DArray(this->_tileBuffer, this->_tileRenderer.buffer, {j, i}); tileOffset.x += 1; } tileOffset.x = 0; @@ -81,12 +82,12 @@ namespace ComSquare::PPU // todo check why i need to invert vertical and horizontal flips if (tileData.verticalFlip) - HFlipArray(this->tileBuffer, {this->_characterNbPixels.x, this->_characterNbPixels.y}); + HFlipArray(this->_tileBuffer, {this->_characterNbPixels.x, this->_characterNbPixels.y}); if (tileData.horizontalFlip) - VFlipArray(this->tileBuffer, {this->_characterNbPixels.x, this->_characterNbPixels.y}); + VFlipArray(this->_tileBuffer, {this->_characterNbPixels.x, this->_characterNbPixels.y}); for (int i = 0; i < this->_characterNbPixels.y; i++) { for (int j = 0; j < this->_characterNbPixels.x; j++) { - this->buffer[pos.x][pos.y] = this->tileBuffer[i][j]; + this->buffer[pos.x][pos.y] = this->_tileBuffer[i][j]; pos.x++; } pos.x -= this->_characterNbPixels.x; @@ -203,7 +204,7 @@ namespace ComSquare::PPU this->_bpp = bpp; else this->_bpp = 2; - this->tileRenderer.setBpp(this->_bpp); + this->_tileRenderer.setBpp(this->_bpp); } void Background::setTilemaps(Vector2 tileMaps) diff --git a/sources/PPU/Background.hpp b/sources/PPU/Background.hpp index 9707839..932fb13 100644 --- a/sources/PPU/Background.hpp +++ b/sources/PPU/Background.hpp @@ -17,16 +17,10 @@ namespace ComSquare::PPU class PPU; class Background { private: - TileRenderer tileRenderer; - std::array, 16> tileBuffer = {{{0}}}; - //! @brief The number of character a TileMap has in width static constexpr int NbCharacterWidth = 32; //! @brief The number of character a TileMap has in height static constexpr int NbCharacterHeight = 32; - //! @brief The number of bytes used by a range of pixels (1 pixel per byte) - //! @note Used like: bpp * TileBaseByteSize to get the size of byte of 1 row of pixels - static constexpr unsigned TileBaseByteSize = 8; //! @brief The number of rows in one line of VRAM //! @note If you're lost by this description, open a tile viewer in an emulator, and set the number of tiles in width to 16 graphics static constexpr unsigned NbTilePerRow = 16; @@ -55,6 +49,10 @@ namespace ComSquare::PPU bool _priority; //! @brief The bg number (used to get the corresponding scroll) int _bgNumber; + //! @brief Class that actually render a tile + TileRenderer _tileRenderer; + //! @brief Buffer if we have tiles that are more than 8x8 + std::array, 16> _tileBuffer; //! @brief the access to vram std::shared_ptr _vram; //! @brief The access to cgram diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index b43cdb8..a8fbe0a 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -9,7 +9,7 @@ #include "Exceptions/InvalidAddress.hpp" #include "Ram/Ram.hpp" #include "Models/Vector2.hpp" -#include "Debugger/TileViewer/TileRenderer.hpp" +#include "Debugger/TileViewer/RAMTileRenderer.hpp" #include namespace ComSquare::PPU diff --git a/sources/PPU/PPU.hpp b/sources/PPU/PPU.hpp index a6acb79..7a3be53 100644 --- a/sources/PPU/PPU.hpp +++ b/sources/PPU/PPU.hpp @@ -13,7 +13,7 @@ #include "Models/Vector2.hpp" #include "Background.hpp" #include "PPUUtils.hpp" -#include "Debugger/TileViewer/TileRenderer.hpp" +#include "Debugger/TileViewer/RAMTileRenderer.hpp" #define FALLTHROUGH __attribute__((fallthrough)); diff --git a/sources/PPU/Tile.hpp b/sources/PPU/Tile.hpp index 52025a5..779ce6e 100644 --- a/sources/PPU/Tile.hpp +++ b/sources/PPU/Tile.hpp @@ -13,6 +13,9 @@ namespace ComSquare::PPU static constexpr int NbPixelsWidth = 8; //! @brief The number of pixel a base tile can have in height static constexpr int NbPixelsHeight = 8; + //! @brief A base tile size in byte is 0x8 + //! @note Used like: bpp * BaseByteSize to get the byte size of 1 tile + static constexpr int BaseByteSize = 0x8; }; } \ No newline at end of file diff --git a/sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp index a8c4b55..a3a95a9 100644 --- a/sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp +++ b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp @@ -7,7 +7,7 @@ #include #include #include "QtWidgetSFML.hpp" -#include "Debugger/TileViewer/TileRenderer.hpp" +#include "Debugger/TileViewer/RAMTileRenderer.hpp" namespace ComSquare::Renderer { From a4333e22cbbf4972907116b440ab7fcc51c3ff9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 23 Jun 2021 00:00:27 +0200 Subject: [PATCH 34/35] fixing stupid error --- sources/Debugger/TileViewer/RAMTileRenderer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/Debugger/TileViewer/RAMTileRenderer.cpp b/sources/Debugger/TileViewer/RAMTileRenderer.cpp index c635e6d..96c9a2f 100644 --- a/sources/Debugger/TileViewer/RAMTileRenderer.cpp +++ b/sources/Debugger/TileViewer/RAMTileRenderer.cpp @@ -71,6 +71,7 @@ namespace ComSquare::Debugger void RAMTileRenderer::setBpp(int bpp) { + this->_bpp = bpp; this->_tileRenderer.setBpp(bpp); } From e7ee90c652a4b82f222c16a745673fcaca4d69d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 23 Jun 2021 00:24:28 +0200 Subject: [PATCH 35/35] general fixing (indent unused functions etc) --- CMakeLists.txt | 241 ++++++++++--------- sources/Debugger/TileViewer/TileViewer.cpp | 26 +- sources/Debugger/TileViewer/TileViewer.hpp | 11 +- sources/PPU/Background.cpp | 85 +------ sources/PPU/Background.hpp | 22 +- sources/PPU/PPU.cpp | 14 +- sources/PPU/TileRenderer.hpp | 11 +- sources/Renderer/QtRenderer/QtRenderSfml.cpp | 28 --- sources/Renderer/QtRenderer/QtRenderSfml.hpp | 55 ----- 9 files changed, 169 insertions(+), 324 deletions(-) delete mode 100644 sources/Renderer/QtRenderer/QtRenderSfml.cpp delete mode 100644 sources/Renderer/QtRenderer/QtRenderSfml.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 29b9efc..924bd4f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -125,124 +125,129 @@ set(CMAKE_AUTOUIC ON) # make app add_executable(ComSquare - sources/main.cpp - sources/SNES.cpp - sources/SNES.hpp - sources/Memory/MemoryBus.cpp - sources/Memory/MemoryBus.hpp - sources/Memory/AMemory.hpp - sources/Memory/AMemory.cpp - sources/PPU/PPU.cpp - sources/PPU/PPU.hpp - sources/CPU/CPU.cpp - sources/CPU/CPU.hpp - sources/Cartridge/Cartridge.cpp - sources/Cartridge/Cartridge.hpp - sources/Exceptions/NotImplementedException.hpp - sources/APU/APU.hpp - sources/APU/APU.cpp - sources/Exceptions/InvalidAddress.hpp - sources/Exceptions/InvalidRom.hpp - sources/Models/Int24.hpp - sources/Models/Int24.hpp - sources/Ram/Ram.cpp - sources/Ram/Ram.hpp - sources/Memory/MemoryShadow.cpp - sources/Memory/MemoryShadow.hpp - sources/Memory/ARectangleMemory.cpp - sources/Memory/ARectangleMemory.hpp - sources/APU/DSP/DSP.cpp - sources/APU/DSP/DSP.hpp - sources/Renderer/IRenderer.hpp - sources/Renderer/SFRenderer.hpp - sources/Renderer/SFRenderer.cpp - sources/Exceptions/InvalidAction.hpp - sources/Cartridge/InterruptVectors.hpp - sources/Memory/RectangleShadow.cpp - sources/Memory/RectangleShadow.hpp - sources/Exceptions/InvalidOpcode.hpp - sources/CPU/Instructions/Interrupts.cpp - sources/CPU/Instructions/MathematicalOperations.cpp - sources/APU/Instructions/Standbys.cpp - sources/APU/Instructions/ProgramStatusWord.cpp - sources/APU/Instructions/Bit.cpp - sources/CPU/Instructions/MathematicalOperations.cpp - sources/CPU/Instructions/MemoryInstructions.cpp - sources/CPU/Instructions/InternalInstruction.cpp - sources/Ram/ExtendedRam.cpp - sources/Ram/ExtendedRam.hpp - sources/Debugger/CPU/CPUDebug.cpp - sources/Debugger/CPU/CPUDebug.hpp - sources/Renderer/QtRenderer/QtSFML.cpp - sources/Renderer/QtRenderer/QtSFML.hpp - sources/Renderer/QtRenderer/QtWidgetSFML.cpp - sources/Renderer/QtRenderer/QtWidgetSFML.hpp - ui/cpuView.ui - ui/ramView.ui - ui/cartridgeView.ui - ui/apuView.ui - ui/busView.ui - resources/appResources.qrc - sources/Utility/Utility.hpp - sources/Debugger/MemoryViewer.cpp - sources/Debugger/MemoryViewer.hpp - sources/Utility/Utility.cpp - sources/Debugger/HeaderViewer.cpp - sources/Debugger/HeaderViewer.hpp - sources/CPU/Instructions/BitsInstructions.cpp - sources/Debugger/HeaderViewer.cpp - sources/Debugger/HeaderViewer.hpp - sources/Debugger/APUDebug.hpp - sources/Debugger/APUDebug.cpp - sources/APU/Instructions/Stack.cpp - sources/APU/Instructions/Subroutine.cpp - sources/APU/Instructions/ProgramFlow.cpp - sources/APU/Operand.cpp - sources/APU/Instructions/DecimalCompensation.cpp - sources/APU/Instructions/MultiplicationDivision.cpp - sources/APU/Instructions/16bitArithmetic.cpp - sources/APU/Instructions/16bitDataTransmission.cpp - sources/APU/Instructions/8bitShiftRotation.cpp - sources/APU/Instructions/8bitIncrementDecrement.cpp - sources/APU/Instructions/8bitLogical.cpp - sources/APU/Instructions/8bitArithmetic.cpp - sources/APU/Instructions/8bitDataTransmission.cpp - sources/APU/IPL/IPL.hpp - sources/APU/IPL/IPL.cpp - sources/CPU/Instructions/TransferRegisters.cpp - sources/CPU/AddressingModes.cpp - sources/Debugger/MemoryBusDebug.cpp - sources/Debugger/MemoryBusDebug.hpp - sources/Debugger/ClosableWindow.hpp - sources/Models/Components.hpp - sources/CPU/Instruction.hpp - sources/Exceptions/DebuggableError.hpp - sources/Debugger/CPU/Disassembly.cpp - sources/Models/Components.hpp - sources/Debugger/CGramDebug.cpp - sources/Debugger/CGramDebug.hpp - sources/Models/Vector2.hpp - sources/PPU/Background.cpp - sources/PPU/Background.hpp - sources/CPU/DMA/DMA.cpp - sources/CPU/DMA/DMA.hpp - ui/registersView.ui - sources/Debugger/RegisterViewer.cpp - sources/Debugger/RegisterViewer.hpp - sources/Memory/IMemory.hpp - sources/APU/DSP/Voice.cpp - sources/APU/DSP/Echo.cpp - sources/APU/DSP/Gauss.cpp - sources/APU/DSP/Envelope.cpp - sources/APU/DSP/Timer.cpp - sources/APU/DSP/BRR.cpp - sources/PPU/PPUUtils.cpp - ui/tileView.ui - sources/Renderer/QtRenderer/QtRenderSfml.cpp - sources/Renderer/QtRenderer/QtRenderSfml.hpp - sources/Debugger/TileViewer/TileViewer.cpp - sources/Debugger/TileViewer/TileViewer.hpp - sources/Debugger/TileViewer/RAMTileRenderer.cpp sources/Debugger/TileViewer/RAMTileRenderer.hpp sources/PPU/Tile.hpp sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp sources/PPU/TileRenderer.cpp sources/PPU/TileRenderer.hpp) + sources/main.cpp + sources/SNES.cpp + sources/SNES.hpp + sources/Memory/MemoryBus.cpp + sources/Memory/MemoryBus.hpp + sources/Memory/AMemory.hpp + sources/Memory/AMemory.cpp + sources/PPU/PPU.cpp + sources/PPU/PPU.hpp + sources/CPU/CPU.cpp + sources/CPU/CPU.hpp + sources/Cartridge/Cartridge.cpp + sources/Cartridge/Cartridge.hpp + sources/Exceptions/NotImplementedException.hpp + sources/APU/APU.hpp + sources/APU/APU.cpp + sources/Exceptions/InvalidAddress.hpp + sources/Exceptions/InvalidRom.hpp + sources/Models/Int24.hpp + sources/Models/Int24.hpp + sources/Ram/Ram.cpp + sources/Ram/Ram.hpp + sources/Memory/MemoryShadow.cpp + sources/Memory/MemoryShadow.hpp + sources/Memory/ARectangleMemory.cpp + sources/Memory/ARectangleMemory.hpp + sources/APU/DSP/DSP.cpp + sources/APU/DSP/DSP.hpp + sources/Renderer/IRenderer.hpp + sources/Renderer/SFRenderer.hpp + sources/Renderer/SFRenderer.cpp + sources/Exceptions/InvalidAction.hpp + sources/Cartridge/InterruptVectors.hpp + sources/Memory/RectangleShadow.cpp + sources/Memory/RectangleShadow.hpp + sources/Exceptions/InvalidOpcode.hpp + sources/CPU/Instructions/Interrupts.cpp + sources/CPU/Instructions/MathematicalOperations.cpp + sources/APU/Instructions/Standbys.cpp + sources/APU/Instructions/ProgramStatusWord.cpp + sources/APU/Instructions/Bit.cpp + sources/CPU/Instructions/MathematicalOperations.cpp + sources/CPU/Instructions/MemoryInstructions.cpp + sources/CPU/Instructions/InternalInstruction.cpp + sources/Ram/ExtendedRam.cpp + sources/Ram/ExtendedRam.hpp + sources/Debugger/CPU/CPUDebug.cpp + sources/Debugger/CPU/CPUDebug.hpp + sources/Renderer/QtRenderer/QtSFML.cpp + sources/Renderer/QtRenderer/QtSFML.hpp + sources/Renderer/QtRenderer/QtWidgetSFML.cpp + sources/Renderer/QtRenderer/QtWidgetSFML.hpp + ui/cpuView.ui + ui/ramView.ui + ui/cartridgeView.ui + ui/apuView.ui + ui/busView.ui + resources/appResources.qrc + sources/Utility/Utility.hpp + sources/Debugger/MemoryViewer.cpp + sources/Debugger/MemoryViewer.hpp + sources/Utility/Utility.cpp + sources/Debugger/HeaderViewer.cpp + sources/Debugger/HeaderViewer.hpp + sources/CPU/Instructions/BitsInstructions.cpp + sources/Debugger/HeaderViewer.cpp + sources/Debugger/HeaderViewer.hpp + sources/Debugger/APUDebug.hpp + sources/Debugger/APUDebug.cpp + sources/APU/Instructions/Stack.cpp + sources/APU/Instructions/Subroutine.cpp + sources/APU/Instructions/ProgramFlow.cpp + sources/APU/Operand.cpp + sources/APU/Instructions/DecimalCompensation.cpp + sources/APU/Instructions/MultiplicationDivision.cpp + sources/APU/Instructions/16bitArithmetic.cpp + sources/APU/Instructions/16bitDataTransmission.cpp + sources/APU/Instructions/8bitShiftRotation.cpp + sources/APU/Instructions/8bitIncrementDecrement.cpp + sources/APU/Instructions/8bitLogical.cpp + sources/APU/Instructions/8bitArithmetic.cpp + sources/APU/Instructions/8bitDataTransmission.cpp + sources/APU/IPL/IPL.hpp + sources/APU/IPL/IPL.cpp + sources/CPU/Instructions/TransferRegisters.cpp + sources/CPU/AddressingModes.cpp + sources/Debugger/MemoryBusDebug.cpp + sources/Debugger/MemoryBusDebug.hpp + sources/Debugger/ClosableWindow.hpp + sources/Models/Components.hpp + sources/CPU/Instruction.hpp + sources/Exceptions/DebuggableError.hpp + sources/Debugger/CPU/Disassembly.cpp + sources/Models/Components.hpp + sources/Debugger/CGramDebug.cpp + sources/Debugger/CGramDebug.hpp + sources/Models/Vector2.hpp + sources/PPU/Background.cpp + sources/PPU/Background.hpp + sources/CPU/DMA/DMA.cpp + sources/CPU/DMA/DMA.hpp + ui/registersView.ui + sources/Debugger/RegisterViewer.cpp + sources/Debugger/RegisterViewer.hpp + sources/Memory/IMemory.hpp + sources/APU/DSP/Voice.cpp + sources/APU/DSP/Echo.cpp + sources/APU/DSP/Gauss.cpp + sources/APU/DSP/Envelope.cpp + sources/APU/DSP/Timer.cpp + sources/APU/DSP/BRR.cpp + sources/PPU/PPUUtils.cpp + ui/tileView.ui + sources/Debugger/TileViewer/TileViewer.cpp + sources/Debugger/TileViewer/TileViewer.hpp + sources/Debugger/TileViewer/RAMTileRenderer.cpp + sources/Debugger/TileViewer/RAMTileRenderer.hpp + sources/PPU/Tile.hpp + sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp + sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp + sources/PPU/TileRenderer.cpp + sources/PPU/TileRenderer.hpp + ) include_directories(ComSquare sources) diff --git a/sources/Debugger/TileViewer/TileViewer.cpp b/sources/Debugger/TileViewer/TileViewer.cpp index e74033b..2507892 100644 --- a/sources/Debugger/TileViewer/TileViewer.cpp +++ b/sources/Debugger/TileViewer/TileViewer.cpp @@ -25,10 +25,10 @@ namespace ComSquare::Debugger _snes(snes), _ui(), _ppu(ppu), - _tileRenderer() + _ramTileRenderer() { - this->_tileRenderer.setRam(ppu.vram); - this->_tileRenderer.setCgram(ppu.cgram); + this->_ramTileRenderer.setRam(ppu.vram); + this->_ramTileRenderer.setCgram(ppu.cgram); this->_window->setContextMenuPolicy(Qt::NoContextMenu); this->_window->setAttribute(Qt::WA_QuitOnClose, false); this->_window->setAttribute(Qt::WA_DeleteOnClose); @@ -69,7 +69,7 @@ namespace ComSquare::Debugger void TileViewer::setPaletteIndex(int paletteIndex) { - this->_tileRenderer.setPaletteIndex(paletteIndex); + this->_ramTileRenderer.setPaletteIndex(paletteIndex); this->internalUpdate(); } @@ -92,46 +92,46 @@ namespace ComSquare::Debugger this->_ui.PaletteIndex->setMaximum(63); break; } - this->_tileRenderer.setBpp(bpp); + this->_ramTileRenderer.setBpp(bpp); this->internalUpdate(); } void TileViewer::setNbColumns(int nbColumns) { - this->_tileRenderer.setNbColumns(nbColumns); + this->_ramTileRenderer.setNbColumns(nbColumns); this->internalUpdate(); } void TileViewer::setRenderSize(int size) { - this->_tileRenderer.setRenderSize(size); + this->_ramTileRenderer.setRenderSize(size); this->internalUpdate(); } int TileViewer::getBpp() const { - return this->_tileRenderer.getBpp(); + return this->_ramTileRenderer.getBpp(); } int TileViewer::getPaletteIndex() const { - return this->_tileRenderer.getPaletteIndex(); + return this->_ramTileRenderer.getPaletteIndex(); } int TileViewer::getNbColumns() const { - return this->_tileRenderer.getNbColumns(); + return this->_ramTileRenderer.getNbColumns(); } void TileViewer::internalUpdate() { - this->_tileRenderer.render(); - this->_sfWidget->buffer = this->_tileRenderer.buffer; + this->_ramTileRenderer.render(); + this->_sfWidget->buffer = this->_ramTileRenderer.buffer; } void TileViewer::setRamOffset(int offset) { - this->_tileRenderer.setRamOffset(offset); + this->_ramTileRenderer.setRamOffset(offset); this->internalUpdate(); } diff --git a/sources/Debugger/TileViewer/TileViewer.hpp b/sources/Debugger/TileViewer/TileViewer.hpp index f01fb86..1848899 100644 --- a/sources/Debugger/TileViewer/TileViewer.hpp +++ b/sources/Debugger/TileViewer/TileViewer.hpp @@ -36,18 +36,21 @@ namespace ComSquare::Debugger ComSquare::PPU::PPU &_ppu; //! @brief the window std::unique_ptr _sfWidget; - //! @brief The tile renderer - RAMTileRenderer _tileRenderer; + //! @brief The ram tile renderer + RAMTileRenderer _ramTileRenderer; //! @brief Change the bpp from the index given by the ui (QT combo box) void _bppChangeUIHandler(int index); public: //! @brief Called when the window is closed. Turn off the debugger. void disableViewer(); - public: + //! @brief ctor explicit TileViewer(SNES &snes, ComSquare::PPU::PPU &ppu); + //! @brief copy ctor TileViewer(const TileViewer &) = delete; + //! @brief dtor + ~TileViewer() override = default; + //! @brief assignment operator TileViewer &operator=(const TileViewer &) = delete; - ~TileViewer() = default; //! @brief Read data at the CGRAM address send it to the debugger. //! @param addr The address to read from. diff --git a/sources/PPU/Background.cpp b/sources/PPU/Background.cpp index 38320c0..8e20124 100644 --- a/sources/PPU/Background.cpp +++ b/sources/PPU/Background.cpp @@ -41,7 +41,7 @@ namespace ComSquare::PPU for (int i = 0; i < 4; i++) { if (!(i == 1 && this->_tileMapsConfig.x == 1) && !(i > 1 && this->_tileMapsConfig.y == 1)) { - drawBasicTileMap(vramAddress, offset); + _drawBasicTileMap(vramAddress, offset); } vramAddress += TileMapByteSize; offset.x += NbCharacterWidth * this->_characterNbPixels.x; @@ -52,7 +52,7 @@ namespace ComSquare::PPU } } - void Background::drawBgTile(uint16_t data, Vector2 pos) + void Background::_drawBgTile(uint16_t data, Vector2 pos) { union TileMapData tileData; @@ -67,8 +67,8 @@ namespace ComSquare::PPU // Y vertical this->_tileRenderer.setPaletteIndex(tileData.palette); - for (int i = 0; i < this->_characterNbPixels.y; i += 8) { - for (int j = 0; j < this->_characterNbPixels.x; j += 8) { + for (int i = 0; i < this->_characterNbPixels.y; i += Tile::NbPixelsHeight) { + for (int j = 0; j < this->_characterNbPixels.x; j += Tile::NbPixelsWidth) { graphicAddress = this->_tilesetAddress + ((tileData.posY + tileOffset.y) * NbTilePerRow * this->_bpp * Tile::BaseByteSize) + ((tileData.posX + tileOffset.x) * this->_bpp * Tile::BaseByteSize); @@ -95,74 +95,7 @@ namespace ComSquare::PPU } } - std::vector Background::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); - - switch (this->_ppu.getBgMode()) { - case 0: - addr += (this->_bgNumber - 1) * (4 * 8) * 2; - break; - default: - break; - } - - 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; - } - - uint8_t Background::getPixelReferenceFromTile(uint16_t tileAddress, uint8_t pixelIndex) - { - uint8_t row = pixelIndex / this->_characterNbPixels.x; - uint8_t column = pixelIndex % this->_characterNbPixels.y; - - if (row >= Tile::NbPixelsHeight) { - tileAddress += 0x80 * this->_bpp; - row -= Tile::NbPixelsHeight; - } - if (column >= Tile::NbPixelsWidth) { - tileAddress += 0x8 * this->_bpp; - column -= Tile::NbPixelsWidth; - } - // TODO might not work with 8 bpp must check - tileAddress += 2 * row; - - return this->getPixelReferenceFromTileRow(tileAddress, column); - } - - uint8_t Background::getPixelReferenceFromTileRow(uint16_t tileRowAddress, uint8_t pixelIndex) - { - uint8_t highByte = this->_vram->read(tileRowAddress % VRAMSIZE); - uint8_t lowByte = this->_vram->read((tileRowAddress + 1) % VRAMSIZE); - uint8_t secondHighByte; - uint8_t secondLowByte; - uint16_t result = 0; - uint8_t shift = Tile::NbPixelsWidth - 1U - pixelIndex; - - switch (this->_bpp) { - case 8: - return highByte; - case 4: - secondHighByte = this->_vram->read((tileRowAddress + 16) % VRAMSIZE); - secondLowByte = this->_vram->read((tileRowAddress + 17) % VRAMSIZE); - 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; - } - - void Background::drawBasicTileMap(uint16_t baseAddress, Vector2 offset) + void Background::_drawBasicTileMap(uint16_t baseAddress, Vector2 offset) { uint16_t tileMapValue = 0; Vector2 pos(0, 0); @@ -172,7 +105,8 @@ namespace ComSquare::PPU // TODO function to read 2 bytes (LSB order or bits reversed) tileMapValue = this->_vram->read(vramAddress); tileMapValue += this->_vram->read(vramAddress + 1) << 8U; - drawBgTile(tileMapValue, {(pos.x * this->_characterNbPixels.x) + offset.x, (pos.y * this->_characterNbPixels.y) + offset.y}); + _drawBgTile(tileMapValue, {(pos.x * this->_characterNbPixels.x) + offset.x, + (pos.y * this->_characterNbPixels.y) + offset.y}); vramAddress += 2; if (pos.x % 31 == 0 && pos.x) { pos.y++; @@ -212,11 +146,6 @@ namespace ComSquare::PPU this->_tileMapsConfig = tileMaps; } - void Background::setBgNumber(int bgNumber) - { - this->_bgNumber = bgNumber; - } - int Background::getBgNumber() const { return this->_bgNumber; diff --git a/sources/PPU/Background.hpp b/sources/PPU/Background.hpp index 932fb13..abbc00e 100644 --- a/sources/PPU/Background.hpp +++ b/sources/PPU/Background.hpp @@ -58,25 +58,11 @@ namespace ComSquare::PPU //! @brief The access to cgram std::shared_ptr _cgram; //! @brief Draw a tile on the screen at x y pos - void drawBgTile(uint16_t data, Vector2 pos); - //! @brief Get a palette from the number of the palette - //! @param nbPalette The palette number (0 - 7) - //! @return The array of color of the palette - std::vector getPalette(int nbPalette); - //! @brief Get the color reference of a pixel from the address of the row - //! @param tileRowAddress The address of the line of pixel - //! @param pixelIndex The index of the pixel (0 - 7) - //! @return The color Reference - uint8_t getPixelReferenceFromTileRow(uint16_t tileRowAddress, uint8_t pixelIndex); - //! @brief Get the color pixel reference from the tile address - //! @param tileAddress The starting address of the tile - //! @param pixelIndex The index of the pixel (0 - 255) - //! @return The color reference - uint8_t getPixelReferenceFromTile(uint16_t tileAddress, uint8_t pixelIndex); + void _drawBgTile(uint16_t data, Vector2 pos); //! @brief draw a tileMap 32x32 starting at baseAddress //! @param baseAddress The starting address of the tileMap //! @param offset The rendering offeset in pixels - void drawBasicTileMap(uint16_t baseAddress, Vector2 offset); + void _drawBasicTileMap(uint16_t baseAddress, Vector2 offset); public: //! @brief The size of the background (x, y) Vector2 backgroundSize; @@ -99,9 +85,7 @@ namespace ComSquare::PPU //! @brief setter for private variable _tileMaps //! @param tileMaps The tileMaps to set void setTilemaps(Vector2 tileMaps); - //! @brief set the Background number - //! @param bgNumber the new Background Number - void setBgNumber(int bgNumber); + //! @brief Get the BackGround Number //! @return the current Background number int getBgNumber() const; diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index a8fbe0a..3557ed1 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -44,7 +44,7 @@ namespace ComSquare::PPU this->cgram->write(67, 0x7F); //tiles - int vram_test[] = { +/* int vram_test[] = { 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, @@ -75,17 +75,17 @@ namespace ComSquare::PPU 00,0x03,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x0c,0x00,0x18,0x00,0xf0,0x00,0xe0, 00,0x00,0x00,0x00,0x80,0x00,0xc0,0x00,0xe0,0x00,0xf0,0x00,0xf8,0x00,0xfc,0x00, 00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x07,0x00,0x0f,00,0x1f,00,0x3f,00, -1 - }; - /*int *cgram_test = get_dump_cgram(); + };*/ + int *cgram_test = get_dump_cgram(); for (int i = 0; cgram_test[i] != -1; i++) { this->cgram->write(i, cgram_test[i]); } - int *vram_test = get_dump_vram(); */ + int *vram_test = get_dump_vram(); for (int i = 0; vram_test[i] != -1; i++) { this->vram->write(i, vram_test[i]); } - int vram_test_2[] = {8, 00, 02, 00, 0x0A, 00, 02, 00, 0x0A, 00, 00, 00, 00, 00, 00, -1}; + /* int vram_test_2[] = {8, 00, 02, 00, 0x0A, 00, 02, 00, 0x0A, 00, 00, 00, 00, 00, 00, -1}; for (int i = 0; vram_test_2[i] != -1; i++) { this->vram->write(i + 0x8000, vram_test_2[i]); } @@ -144,8 +144,8 @@ namespace ComSquare::PPU //this->_registers._bgofs[3].raw = 0x03DF; this->_registers._t[0].enableWindowDisplayBg1 = true; this->_registers._t[0].enableWindowDisplayBg2 = true; +*/ -/* //registers aladin this->_registers._bgmode.bgMode = 1; @@ -199,7 +199,7 @@ namespace ComSquare::PPU this->_registers._t[0].enableWindowDisplayBg1 = true; this->_registers._t[0].enableWindowDisplayBg2 = true; this->_registers._t[0].enableWindowDisplayBg3 = true; - */ + } diff --git a/sources/PPU/TileRenderer.hpp b/sources/PPU/TileRenderer.hpp index 7e9a10d..e5808c5 100644 --- a/sources/PPU/TileRenderer.hpp +++ b/sources/PPU/TileRenderer.hpp @@ -35,12 +35,19 @@ namespace ComSquare::PPU int getBpp() const; //! @brief Get the index of the current palette used int getPaletteIndex() const; - //! @brief Gives the reference of pixel using the tileAddress and the pixelIndex + //! @brief Get the color pixel reference from the tile address and pixelIndex + //! @param tileAddress The starting address of the tile + //! @param pixelIndex The index of the pixel (0 - 255) + //! @return The color reference //! @note This function is wrapper of getPixelReferenceFromTileRow uint8_t getPixelReferenceFromTile(uint16_t tileAddress, uint8_t pixelIndex); - //! @brief get the pixel color reference to use in the selected palette + //! @brief Get the color reference of a pixel from the address of the row + //! @param tileRowAddress The address of the line of pixel + //! @param pixelIndex The index of the pixel (0 - 7) + //! @return The color Reference uint8_t getPixelReferenceFromTileRow(uint16_t tileRowAddress, uint8_t pixelIndex); //! @brief Gives the actual selected palette with all of it's colors + //! @return The array of color of the palette //! @warning Values are CGRAM colors use PPU::getRealColor function to get the actual real color std::vector getPalette(int nbPalette); //! @brief read the 2bpp value for a pixel (used multple times for 4bpp and 8bpp) diff --git a/sources/Renderer/QtRenderer/QtRenderSfml.cpp b/sources/Renderer/QtRenderer/QtRenderSfml.cpp deleted file mode 100644 index 4b81096..0000000 --- a/sources/Renderer/QtRenderer/QtRenderSfml.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// -// Created by cbihan on 18/05/2021. -// - -#include "QtRenderSfml.hpp" -#include - -namespace ComSquare::Renderer -{/* - QtRenderSFML::QtRenderSFML(ComSquare::SNES &snes, QWidget *parent, const QPoint &position, const QSize &size, int frameRate) - : QtWidgetSFML(parent, position, size, frameRate), - _snes(snes) - { - } - - void QtRenderSFML::_onUpdate() - { - try { - this->_snes.update(); - } catch (const DebuggableError &e) { - std::cout << "Invalid rom's instruction: " << e.what() << std::endl; - this->_snes.enableCPUDebuggingWithError(e); - } catch (std::exception &e) { - std::cerr << "An error occurred: " << e.what() << std::endl; - QApplication::quit(); - } - }*/ -} \ No newline at end of file diff --git a/sources/Renderer/QtRenderer/QtRenderSfml.hpp b/sources/Renderer/QtRenderer/QtRenderSfml.hpp deleted file mode 100644 index a02bfd5..0000000 --- a/sources/Renderer/QtRenderer/QtRenderSfml.hpp +++ /dev/null @@ -1,55 +0,0 @@ -// -// Created by cbihan on 18/05/2021. -// - -#pragma once - -#include -#include -#include -#include -#include -#include "../IRenderer.hpp" -#include "../SFRenderer.hpp" -#include "QtWidgetSFML.hpp" -#include "QtSFML.hpp" - -namespace ComSquare::Renderer -{ - class QtRenderSFML : public QtWidgetSFML - { - private: - //! @brief The main window that the app reside on. - //QMainWindow _window; - QWidget _window; - //! @brief The SFML widget. - std::unique_ptr _sfWidget = nullptr; - public: - - void setParentWidget(QWidget &widget); - //! @brief Use this function to create the window. - //! @param maxFPS The number of FPS you aim to run on. - void createWindow(SNES &snes, int maxFPS) override; - //! @brief Add a pixel to the buffer to the coordinates x, y with the color rgba. - //! @param X horizontal index. - //! @param Y vertical index. - //! @param rgba The color of the pixel. - void putPixel(unsigned y, unsigned x, uint32_t rgba) override; - //! @brief This function doesn't do anything because QT internally handle drawing to the screen. - void drawScreen() override; - //! @brief Playing all samples from buffer - //! @param samples Buffer containing samples - //! @param sampleCount number of samples inside buffer - void playAudio(std::span samples, uint64_t sampleCount) override; - //! @brief Set a new name to the window, if there is already a name it will be overwrite. - //! @param newWindowName new title for the window. - void setWindowName(std::string &newWindowName) override; - //! @brief Constructor that return a SFML renderer inside a QT window. - //! @param height _height of the window. - //! @param width _width of the window. - QtRenderSFML(SNES &snes, QWidget* parent, const QPoint& position, const QSize& size, int frameRate = 0); - QtRenderSFML(const QtRenderSFML &) = delete; - QtRenderSFML &operator=(const QtRenderSFML &) = delete; - ~QtRenderSFML() override = default; - }; -}