From 499e2f4fa791fb2b63b1b13e06458c0d1348681c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Fri, 5 Feb 2021 16:39:11 +0100 Subject: [PATCH] starting to implement registers of ppu in debugger --- sources/Debugger/RegisterViewer.cpp | 51 ++++++++++++++++++++++++++++- sources/Debugger/RegisterViewer.hpp | 4 ++- sources/PPU/PPU.cpp | 7 +++- sources/PPU/PPU.hpp | 2 ++ ui/registersView.ui | 6 ++-- 5 files changed, 64 insertions(+), 6 deletions(-) diff --git a/sources/Debugger/RegisterViewer.cpp b/sources/Debugger/RegisterViewer.cpp index 5797773..c011285 100644 --- a/sources/Debugger/RegisterViewer.cpp +++ b/sources/Debugger/RegisterViewer.cpp @@ -36,8 +36,9 @@ namespace ComSquare::Debugger this->_ui.dmaChannel7, this->_ui.dmaChannel8 }; + RegistersViewerModel *model; for (int i = 0; i < 8; i++) { - RegistersViewerModel *model = new RegistersViewerModel(this->_snes); + model = new RegistersViewerModel(this->_snes); model->addRegister(Register(0x420B, std::string(":") + std::to_string(i), "Enabled", [i](SNES &snes) { return snes.cpu->_dmaChannels[i].enabled; }, nullptr, Boolean)); @@ -65,6 +66,52 @@ namespace ComSquare::Debugger channels[i]->setModel(model); this->_models.push_back(model); } + + // ppuRegisters + model = new RegistersViewerModel(this->_snes); + const PPU::Registers &ppuRegisters = this->_snes.ppu->getWriteRegisters(); + + //INIDISP 0X2100 + model->addRegister(Register(0x2100, "", "INIDISP", [ppuRegisters](SNES &) { + return ppuRegisters._inidisp.raw; + }, nullptr, EightBits)); + model->addRegister(Register(0x2100, ":0-3", "Screen brightness", [ppuRegisters](SNES &) { + return ppuRegisters._inidisp.brightness; + }, nullptr, Integer)); + model->addRegister(Register(0x2100, ":7", "F-Blank", [ppuRegisters](SNES &) { + return ppuRegisters._inidisp.fblank; + }, nullptr, Boolean)); + + //OBSEL 0x2101 + model->addRegister(Register(0x2101, "", "OBSEL", [ppuRegisters](SNES &) { + return ppuRegisters._obsel.raw; + }, nullptr, EightBits)); + model->addRegister(Register(0x2101, ":0-2", "Name base select", [ppuRegisters](SNES &) { + return ppuRegisters._obsel.nameBaseSelect; + }, nullptr, EightBits)); + model->addRegister(Register(0x2101, ":3-4", "Name select", [ppuRegisters](SNES &) { + return ppuRegisters._obsel.nameSelect; + }, nullptr, EightBits)); + model->addRegister(Register(0x2101, ":5-7", "Object Size", [ppuRegisters](SNES &) { + return ppuRegisters._obsel.objectSize; + }, nullptr, EightBits)); + + //BGMODE 0x2105 + model->addRegister(Register(0x2105, "", "BGMODE", [ppuRegisters](SNES &) { + return ppuRegisters._bgmode.raw; + }, nullptr, EightBits)); + model->addRegister(Register(0x2105, ":0-2", "BG Mode", [ppuRegisters](SNES &) { + return ppuRegisters._bgmode.bgMode; + }, nullptr, Integer)); + model->addRegister(Register(0x2105, ":3", "BG3 Priority Bit", [ppuRegisters](SNES &) { + return ppuRegisters._bgmode.mode1Bg3PriorityBit; + }, nullptr, Boolean)); + for (int i = 0; i < 4; i++) { + model->addRegister(Register(0x2105, ":" + std::to_string(i + 4), "BG"+ std::to_string(i + 1) + " 16x16 Tiles", [ppuRegisters, i](SNES &) { + return (ppuRegisters._bgmode.raw >> (i + 4)) & 1; + }, nullptr, Boolean)); + } + this->_ui.ppuRegisters->setModel(model); } void RegisterViewer::focus() @@ -141,6 +188,8 @@ QVariant RegistersViewerModel::data(const QModelIndex &index, int role) const switch (reg.type) { case Boolean: return QString(reg.get(this->_snes) ? "True" : "False"); + case Integer: + return QString::number(reg.get(this->_snes)); case EightBits: return QString(Utility::to_hex(static_cast(reg.get(this->_snes))).c_str()); case SixteenBits: diff --git a/sources/Debugger/RegisterViewer.hpp b/sources/Debugger/RegisterViewer.hpp index b232c10..ee206e4 100644 --- a/sources/Debugger/RegisterViewer.hpp +++ b/sources/Debugger/RegisterViewer.hpp @@ -87,7 +87,9 @@ namespace ComSquare //! @brief A 16 bits hexadecimal value. SixteenBits, //! @brief A 24 bits hexadecimal value. - TwentyFourBits + TwentyFourBits, + //! @brief Just like printf(%d, myVar); + Integer }; //! @brief Struct containing information about a register. diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index 2d585bd..00dc8d5 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -266,7 +266,7 @@ namespace ComSquare::PPU case PpuRegisters::oamdata: this->_registers._oamdata = data; //throw InvalidAddress("oamdata", addr); - std::cout << "oamdata" << std::endl; + //std::cout << "oamdata" << std::endl; // the oamAddress have to be calculated if fblank or not (not implemented) oamram->write(this->_registers._oamadd.oamAddress, this->_registers._oamdata); this->_registers._oamadd.oamAddress++; @@ -839,4 +839,9 @@ namespace ComSquare::PPU { return Vector2(this->_registers._bgofs[(bgNumber - 1) * 2].offsetBg, this->_registers._bgofs[(bgNumber - 1) * 2 + 1].offsetBg); } + + const Registers &PPU::getWriteRegisters() const + { + return this->_registers; + } } \ No newline at end of file diff --git a/sources/PPU/PPU.hpp b/sources/PPU/PPU.hpp index c5bdc07..a743258 100644 --- a/sources/PPU/PPU.hpp +++ b/sources/PPU/PPU.hpp @@ -631,6 +631,8 @@ namespace ComSquare::PPU void updateVramReadBuffer(); //! @brief update the Vram buffer Vector2 getBgScroll(int bgNumber) const; + //! @brief Allow to look the value of each write register (used by Register debugger) + const Registers &getWriteRegisters() const; }; } diff --git a/ui/registersView.ui b/ui/registersView.ui index 4dd129a..c226092 100644 --- a/ui/registersView.ui +++ b/ui/registersView.ui @@ -22,7 +22,7 @@ - 0 + 2 false @@ -51,7 +51,7 @@ - 0 + 6 @@ -143,7 +143,7 @@ - +