From 40f843da7563fa45afc9fbd3bfc9ffd1eae36894 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Tue, 24 Mar 2020 21:06:54 +0100 Subject: [PATCH] Adding filters --- CMakeLists.txt | 4 +- sources/APU/APU.cpp | 18 ++++- sources/APU/APU.hpp | 3 + sources/APU/DSP/DSP.cpp | 5 ++ sources/APU/DSP/DSP.hpp | 3 + sources/APU/Instructions/Subroutine.cpp | 5 -- sources/CPU/CPU.cpp | 10 +++ sources/CPU/CPU.hpp | 4 + .../CPU/Instructions/InternalInstruction.cpp | 5 -- sources/Cartridge/Cartridge.cpp | 2 +- sources/Debugger/MemoryBusDebug.cpp | 80 ++++++++++++++++++- sources/Debugger/MemoryBusDebug.hpp | 6 +- sources/Memory/AMemory.hpp | 3 + sources/Memory/MemoryShadow.cpp | 5 ++ sources/Memory/MemoryShadow.hpp | 2 + sources/Memory/RectangleShadow.cpp | 5 ++ sources/Memory/RectangleShadow.hpp | 2 + sources/PPU/PPU.cpp | 5 ++ sources/PPU/PPU.hpp | 2 + sources/Ram/Ram.cpp | 8 +- sources/Ram/Ram.hpp | 7 +- sources/SNES.cpp | 4 +- 22 files changed, 160 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c9aa11d..9589780 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,7 +79,7 @@ add_executable(unit_tests sources/CPU/Instructions/TransferRegisters.cpp tests/CPU/TransferRegisters.cpp sources/CPU/AddressingModes.cpp -) + sources/Models/Components.hpp) # include criterion & coverage target_link_libraries(unit_tests criterion -lgcov) @@ -174,7 +174,7 @@ add_executable(ComSquare sources/Debugger/MemoryBusDebug.cpp sources/Debugger/MemoryBusDebug.hpp sources/Debugger/ClosableWindow.hpp -) + sources/Models/Components.hpp) target_compile_definitions(ComSquare PUBLIC DEBUGGER_ENABLED) diff --git a/sources/APU/APU.cpp b/sources/APU/APU.cpp index 9b97357..c12542c 100644 --- a/sources/APU/APU.cpp +++ b/sources/APU/APU.cpp @@ -23,6 +23,16 @@ namespace ComSquare::APU return false; } + std::string APU::getName() + { + return "APU"; + } + + Component APU::getComponent() + { + return Apu; + } + uint8_t APU::_internalRead(uint24_t addr) { switch (addr) { case 0x0000 ... 0x00EF: @@ -359,10 +369,10 @@ namespace ComSquare::APU } MemoryMap::MemoryMap() : - Page0(0x00F0, "APU's Page 0"), - Page1(0x0100, "APU's Page 1"), - Memory(0xFDC0, "APU's Ram"), - IPL(0x0040, "IPL Rom") + Page0(0x00F0, Apu, "APU's Page 0"), + Page1(0x0100, Apu, "APU's Page 1"), + Memory(0xFDC0, Apu, "APU's Ram"), + IPL(0x0040, Apu, "IPL Rom") { } diff --git a/sources/APU/APU.hpp b/sources/APU/APU.hpp index 0e58ad3..1d22ec3 100644 --- a/sources/APU/APU.hpp +++ b/sources/APU/APU.hpp @@ -158,6 +158,9 @@ namespace ComSquare::APU //! @brief Get the name of this accessor (used for debug purpose) std::string getName() override; + //! @brief Get the component of this accessor (used for debug purpose) + Component getComponent() override; + //! @brief Current state of APU CPU StateMode _state = Running; diff --git a/sources/APU/DSP/DSP.cpp b/sources/APU/DSP/DSP.cpp index 1b895c7..421826e 100644 --- a/sources/APU/DSP/DSP.cpp +++ b/sources/APU/DSP/DSP.cpp @@ -593,4 +593,9 @@ namespace ComSquare::APU::DSP { return "DSP"; } + + Component DSP::getComponent() + { + return Apu; + } } \ No newline at end of file diff --git a/sources/APU/DSP/DSP.hpp b/sources/APU/DSP/DSP.hpp index 9e25c6a..1676cd5 100644 --- a/sources/APU/DSP/DSP.hpp +++ b/sources/APU/DSP/DSP.hpp @@ -143,6 +143,9 @@ namespace ComSquare::APU::DSP //! @brief Get the name of this accessor (used for debug purpose) std::string getName() override; + + //! @brief Get the component of this accessor (used for debug purpose) + Component getComponent() override; }; } diff --git a/sources/APU/Instructions/Subroutine.cpp b/sources/APU/Instructions/Subroutine.cpp index 3dcf2c3..34eb031 100644 --- a/sources/APU/Instructions/Subroutine.cpp +++ b/sources/APU/Instructions/Subroutine.cpp @@ -52,9 +52,4 @@ namespace ComSquare::APU this->RET(); return 6; } - - std::string APU::getName() - { - return "APU"; - } } \ No newline at end of file diff --git a/sources/CPU/CPU.cpp b/sources/CPU/CPU.cpp index e4efc02..cfce0c8 100644 --- a/sources/CPU/CPU.cpp +++ b/sources/CPU/CPU.cpp @@ -413,4 +413,14 @@ namespace ComSquare::CPU { return this->_bus->read(++this->_registers.s) + (this->_bus->read(++this->_registers.s) << 8u); } + + std::string CPU::getName() + { + return "CPU"; + } + + Component CPU::getComponent() + { + return Cpu; + } } \ No newline at end of file diff --git a/sources/CPU/CPU.hpp b/sources/CPU/CPU.hpp index cdecf8b..84d613f 100644 --- a/sources/CPU/CPU.hpp +++ b/sources/CPU/CPU.hpp @@ -9,6 +9,7 @@ #include "../Memory/MemoryBus.hpp" #include "../Models/Int24.hpp" #include "../Cartridge/Cartridge.hpp" +#include "../Memory/AMemory.hpp" namespace ComSquare::CPU { @@ -573,6 +574,9 @@ namespace ComSquare::CPU //! @brief Get the name of this accessor (used for debug purpose) std::string getName() override; + //! @brief Get the component of this accessor (used for debug purpose) + Component getComponent() override; + //! @brief Reset interrupt - Called on boot and when the reset button is pressed. virtual void RESB(); diff --git a/sources/CPU/Instructions/InternalInstruction.cpp b/sources/CPU/Instructions/InternalInstruction.cpp index 3b3d5f6..6c16c0c 100644 --- a/sources/CPU/Instructions/InternalInstruction.cpp +++ b/sources/CPU/Instructions/InternalInstruction.cpp @@ -307,9 +307,4 @@ namespace ComSquare::CPU { this->_registers.pac = value; } - - std::string CPU::getName() - { - return "CPU"; - } } \ No newline at end of file diff --git a/sources/Cartridge/Cartridge.cpp b/sources/Cartridge/Cartridge.cpp index 61ce1e0..227903a 100644 --- a/sources/Cartridge/Cartridge.cpp +++ b/sources/Cartridge/Cartridge.cpp @@ -13,7 +13,7 @@ namespace ComSquare::Cartridge { Cartridge::Cartridge(const std::string &romPath) - : Ram::Ram(0, "Cartridge") + : Ram::Ram(0, Rom, "Cartridge") { try { if (romPath.empty()) diff --git a/sources/Debugger/MemoryBusDebug.cpp b/sources/Debugger/MemoryBusDebug.cpp index 18bad54..d4065c8 100644 --- a/sources/Debugger/MemoryBusDebug.cpp +++ b/sources/Debugger/MemoryBusDebug.cpp @@ -30,6 +30,60 @@ namespace ComSquare::Debugger this->_ui.log->horizontalHeader()->setSectionsMovable(true); for (int i = 0; i < this->_model.column; i++) this->_ui.log->setColumnWidth(i, this->_ui.log->width()); + + QMainWindow::connect(this->_ui.fromAPU, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[0].apu = checked; + }); + QMainWindow::connect(this->_ui.fromCPU, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[0].cpu = checked; + }); + QMainWindow::connect(this->_ui.fromOAM, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[0].oamram = checked; + }); + QMainWindow::connect(this->_ui.fromPPU, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[0].ppu = checked; + }); + QMainWindow::connect(this->_ui.fromROM, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[0].rom = checked; + }); + QMainWindow::connect(this->_ui.fromSRAM, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[0].sram = checked; + }); + QMainWindow::connect(this->_ui.fromVRAM, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[0].vram = checked; + }); + QMainWindow::connect(this->_ui.fromWRAM, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[0].wram = checked; + }); + QMainWindow::connect(this->_ui.fromCG, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[0].cgram = checked; + }); + + QMainWindow::connect(this->_ui.toAPU, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[1].apu = checked; + }); + QMainWindow::connect(this->_ui.toCPU, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[1].cpu = checked; + }); + QMainWindow::connect(this->_ui.toOAM, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[1].oamram = checked; + }); + QMainWindow::connect(this->_ui.toPPU, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[1].ppu = checked; + }); + QMainWindow::connect(this->_ui.toSRAM, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[1].sram = checked; + }); + QMainWindow::connect(this->_ui.toVRAM, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[1].vram = checked; + }); + QMainWindow::connect(this->_ui.toWRAM, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[1].wram = checked; + }); + QMainWindow::connect(this->_ui.toCG, &QCheckBox::toggled, [this](bool checked) { + this->_proxy.filters[1].cgram = checked; + }); + this->_window->show(); } @@ -153,7 +207,27 @@ bool BusLoggerProxy::filterAcceptsRow(int sourceRow, const QModelIndex &sourcePa { ComSquare::Debugger::BusLog log = this->_parent.getLogAt(sourceRow); -// if (log.accessor && log.accessor->getName() == "Cartridge") -// return false; - return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); + if (!log.accessor) + return true; + ComSquare::Component component = log.accessor->getComponent(); + switch (component) { + case ComSquare::Component::Cpu: + return this->filters[log.write].cpu; + case ComSquare::Component::Ppu: + return this->filters[log.write].ppu; + case ComSquare::Component::Apu: + return this->filters[log.write].apu; + case ComSquare::Component::Rom: + return this->filters[log.write].rom; + case ComSquare::Component::WRam: + return this->filters[log.write].wram; + case ComSquare::Component::VRam: + return this->filters[log.write].vram; + case ComSquare::Component::CGRam: + return this->filters[log.write].cgram; + case ComSquare::Component::OAMRam: + return this->filters[log.write].oamram; + case ComSquare::Component::SRam: + return this->filters[log.write].sram; + } } diff --git a/sources/Debugger/MemoryBusDebug.hpp b/sources/Debugger/MemoryBusDebug.hpp index 61a74d9..55c993d 100644 --- a/sources/Debugger/MemoryBusDebug.hpp +++ b/sources/Debugger/MemoryBusDebug.hpp @@ -81,10 +81,8 @@ protected: //! @brief Function that filter logs. bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; public: - //! @brief Currently enabled read filters - ComSquare::Debugger::BusLoggerFilters readFilters = ComSquare::Debugger::BusLoggerFilters(); - //! @brief Currently enabled write filters - ComSquare::Debugger::BusLoggerFilters writeFilters = ComSquare::Debugger::BusLoggerFilters(); + //! @brief Currently enabled filters, index 0 is for reads, index 1 for writes. + ComSquare::Debugger::BusLoggerFilters filters[2] = {ComSquare::Debugger::BusLoggerFilters(), ComSquare::Debugger::BusLoggerFilters()}; BusLoggerProxy(BusLogModel &parent); BusLoggerProxy(const BusLoggerProxy &) = delete; diff --git a/sources/Memory/AMemory.hpp b/sources/Memory/AMemory.hpp index ab2fd7b..5215436 100644 --- a/sources/Memory/AMemory.hpp +++ b/sources/Memory/AMemory.hpp @@ -10,6 +10,7 @@ #include #include #include "../Models/Int24.hpp" +#include "../Models/Components.hpp" namespace ComSquare::Memory { @@ -48,6 +49,8 @@ namespace ComSquare::Memory virtual bool isMirror(); //! @brief Get the name of this accessor (used for debug purpose) virtual std::string getName() = 0; + //! @brief Get the component of this accessor (used for debug purpose) + virtual Component getComponent() = 0; //! @brief Get the name of the data at the address //! @param addr The address (in local space) virtual std::string getValueName(uint24_t addr); diff --git a/sources/Memory/MemoryShadow.cpp b/sources/Memory/MemoryShadow.cpp index 246e7c6..ecc4b4f 100644 --- a/sources/Memory/MemoryShadow.cpp +++ b/sources/Memory/MemoryShadow.cpp @@ -38,4 +38,9 @@ namespace ComSquare::Memory { return this->_initial->getName(); } + + Component MemoryShadow::getComponent() + { + return this->_initial->getComponent(); + } } \ No newline at end of file diff --git a/sources/Memory/MemoryShadow.hpp b/sources/Memory/MemoryShadow.hpp index 673eaf3..7c33c43 100644 --- a/sources/Memory/MemoryShadow.hpp +++ b/sources/Memory/MemoryShadow.hpp @@ -36,6 +36,8 @@ namespace ComSquare::Memory bool isMirror() override; //! @brief Get the name of this accessor (used for debug purpose) std::string getName() override; + //! @brief Get the component of this accessor (used for debug purpose) + Component getComponent() override; //! @brief Return the memory accessor this accessor mirror if any //! @return nullptr if isMirror is false, the source otherwise. std::shared_ptr getMirrored() override; diff --git a/sources/Memory/RectangleShadow.cpp b/sources/Memory/RectangleShadow.cpp index f798389..9d924d4 100644 --- a/sources/Memory/RectangleShadow.cpp +++ b/sources/Memory/RectangleShadow.cpp @@ -47,4 +47,9 @@ namespace ComSquare::Memory { return this->_initial->getName(); } + + Component RectangleShadow::getComponent() + { + return this->_initial->getComponent(); + } } \ No newline at end of file diff --git a/sources/Memory/RectangleShadow.hpp b/sources/Memory/RectangleShadow.hpp index 756ab0d..d3130d9 100644 --- a/sources/Memory/RectangleShadow.hpp +++ b/sources/Memory/RectangleShadow.hpp @@ -39,6 +39,8 @@ namespace ComSquare::Memory bool isMirror() override; //! @brief Get the name of this accessor (used for debug purpose) std::string getName() override; + //! @brief Get the component of this accessor (used for debug purpose) + Component getComponent() override; //! @brief Return the memory accessor this accessor mirror if any //! @return nullptr if isMirror is false, the source otherwise. std::shared_ptr getMirrored() override; diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index 9fd377e..5cc3aa8 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -249,4 +249,9 @@ namespace ComSquare::PPU { return "PPU"; } + + Component PPU::getComponent() + { + return Ppu; + } } \ No newline at end of file diff --git a/sources/PPU/PPU.hpp b/sources/PPU/PPU.hpp index ec0d8d4..0c64f3c 100644 --- a/sources/PPU/PPU.hpp +++ b/sources/PPU/PPU.hpp @@ -566,6 +566,8 @@ namespace ComSquare::PPU void write(uint24_t addr, uint8_t data) override; //! @brief Get the name of this accessor (used for debug purpose) std::string getName() override; + //! @brief Get the component of this accessor (used for debug purpose) + Component getComponent() override; //! @brief Update the PPU of n cycles. //! @param The number of cycles to update. diff --git a/sources/Ram/Ram.cpp b/sources/Ram/Ram.cpp index 320834e..100901d 100644 --- a/sources/Ram/Ram.cpp +++ b/sources/Ram/Ram.cpp @@ -9,8 +9,9 @@ namespace ComSquare::Ram { - Ram::Ram(size_t size, std::string ramName) + Ram::Ram(size_t size, Component type, std::string ramName) : _size(size), + _ramType(type), _ramName(std::move(ramName)) { if (size == 0) @@ -58,4 +59,9 @@ namespace ComSquare::Ram { return this->_ramName; } + + Component Ram::getComponent() + { + return this->_ramType; + } } diff --git a/sources/Ram/Ram.hpp b/sources/Ram/Ram.hpp index 24b7f88..d9297e7 100644 --- a/sources/Ram/Ram.hpp +++ b/sources/Ram/Ram.hpp @@ -15,11 +15,13 @@ namespace ComSquare::Ram uint8_t *_data; //! @brief The size of the ram (iny bytes). size_t _size; + //! @brief An id identifying the type of memory this is (for the debugger) + Component _ramType; //! @brief The name of this ram. std::string _ramName; public: //! @brief Create a ram of a given size in bytes. - explicit Ram(size_t size, std::string ramName); + explicit Ram(size_t size, Component, std::string ramName); //! @brief The ram can't be copied. Ram(const Ram &) = delete; //! @brief The ram can't be assigned. @@ -46,6 +48,9 @@ namespace ComSquare::Ram //! @brief Get the name of this accessor (used for debug purpose) std::string getName() override; + //! @brief Get the component of this accessor (used for debug purpose) + Component getComponent() override; + //! @brief Get the size of the ram in bytes. size_t getSize(); }; diff --git a/sources/SNES.cpp b/sources/SNES.cpp index 5cc42a8..3dc9674 100644 --- a/sources/SNES.cpp +++ b/sources/SNES.cpp @@ -17,8 +17,8 @@ namespace ComSquare SNES::SNES(const std::string &romPath, Renderer::IRenderer &renderer) : _bus(std::make_shared()), cartridge(new Cartridge::Cartridge(romPath)), - wram(new Ram::Ram(16384, "WRam")), - sram(new Ram::Ram(this->cartridge->header.sramSize, "SRam")), + wram(new Ram::Ram(16384, WRam, "WRam")), + sram(new Ram::Ram(this->cartridge->header.sramSize, SRam, "SRam")), apuRam(new APU::MemoryMap()), cpu(new CPU::CPU(this->_bus, cartridge->header)), ppu(new PPU::PPU(renderer)),