From 212a3b392283235a45d5c360fbf3d8021e9cf121 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Mon, 1 Feb 2021 23:45:43 +0100 Subject: [PATCH] adding tests and fixing VMDATA(L-H) and adding read registers for vram --- CMakeLists.txt | 2 +- sources/PPU/PPU.cpp | 9 +++--- sources/PPU/PPU.hpp | 1 + tests/PPU/testPpuRead.cpp | 45 +++++++++++++++++++++++++++++ tests/PPU/testPpuWriteFromVmain.cpp | 13 +++++++++ 5 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 tests/PPU/testPpuRead.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index a76c362..d272a78 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -102,7 +102,7 @@ add_executable(unit_tests sources/PPU/Background.hpp sources/PPU/PPUUtils.cpp tests/PPU/testBackground.cpp - ) + tests/PPU/testPpuRead.cpp) # include criterion & coverage target_link_libraries(unit_tests criterion -lgcov) diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index 1c8e83a..6588833 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -304,7 +304,7 @@ namespace ComSquare::PPU //std::cout << "vmdatal" << std::endl; if (!this->_registers._inidisp.fblank) { this->_registers._vmdata.vmdatal = data; - this->vram->write_internal(this->getVramAddress(), this->_registers._vmdata.vmdatal); + this->vram->write_internal(this->getVramAddress(), data); } if (!this->_registers._vmain.incrementMode) this->_registers._vmadd.vmadd += this->_registers._incrementAmount; @@ -313,7 +313,7 @@ namespace ComSquare::PPU //std::cout << "vmdatah" << std::endl; if (!this->_registers._inidisp.fblank) { this->_registers._vmdata.vmdatah = data; - this->vram->write_internal(this->getVramAddress(), this->_registers._vmdata.vmdatah); + this->vram->write_internal(this->getVramAddress() + 1, data); } if (this->_registers._vmain.incrementMode) this->_registers._vmadd.vmadd += this->_registers._incrementAmount; @@ -401,7 +401,7 @@ namespace ComSquare::PPU uint16_t PPU::getVramAddress() const { - uint16_t vanillaAddress = this->_registers._vmadd.vmadd; + uint16_t vanillaAddress = this->_registers._vmadd.vmadd * 2; switch (this->_registers._vmain.addressRemapping) { case 0b00: @@ -781,6 +781,7 @@ namespace ComSquare::PPU void PPU::updateVramReadBuffer() { - this->_vramReadBuffer = this->vram->read_internal(this->getVramAddress()) + this->_vramReadBuffer = this->vram->read_internal(this->getVramAddress()); + this->_vramReadBuffer += this->vram->read_internal(this->getVramAddress() + 1) << 8; } } \ No newline at end of file diff --git a/sources/PPU/PPU.hpp b/sources/PPU/PPU.hpp index 6b21282..a155804 100644 --- a/sources/PPU/PPU.hpp +++ b/sources/PPU/PPU.hpp @@ -622,6 +622,7 @@ namespace ComSquare::PPU void addToMainSubScreen(Background &bg); //! @brief Get the current background Mode int getBgMode() const; + //! @brief update the Vram buffer void updateVramReadBuffer(); }; diff --git a/tests/PPU/testPpuRead.cpp b/tests/PPU/testPpuRead.cpp new file mode 100644 index 0000000..375e66b --- /dev/null +++ b/tests/PPU/testPpuRead.cpp @@ -0,0 +1,45 @@ +// +// Created by cbihan on 2/1/21. +// + +#include +#include +#include "../tests.hpp" +#include "../../sources/SNES.hpp" +#include "../../sources/Memory/MemoryBus.hpp" +#include "../../sources/PPU/PPU.hpp" + +using namespace ComSquare; + +Test(PPU_read_1, vram_data_read_full) +{ + Init() + snes._bus->write(0x2115, 0b10000000); + snes._bus->write(0x2116, 0); + snes._bus->write(0x2117, 0); + snes.ppu->vram->write_internal(0, 0b11111111); + snes.ppu->vram->write_internal(1, 0b11111111); + + snes._bus->write(0x2116, 0); + snes._bus->write(0x2117, 0); + uint8_t tmp = snes._bus->read(0x2139); + cr_expect(tmp == 0b11111111, "Got %X expected 0xFF", tmp); + tmp = snes._bus->read(0x213a); + cr_expect(tmp == 0b11111111, "Got %X expected 0xFF", tmp); +} + +Test(PPU_read_1, vram_data_read_half) +{ + Init() + snes._bus->write(0x2116, 0); + snes._bus->write(0x2117, 0); + snes.ppu->vram->write_internal(0, 0b01101001); + snes.ppu->vram->write_internal(1, 0b11111111); + + snes._bus->write(0x2116, 0); + snes._bus->write(0x2117, 0); + uint8_t tmp = snes._bus->read(0x2139); + cr_expect(tmp == 0b01101001, "Got %X expected 0x69", tmp); + tmp = snes._bus->read(0x213a); + cr_expect(tmp == 0b11111111, "Got %X expected 0xFF", tmp); +} \ No newline at end of file diff --git a/tests/PPU/testPpuWriteFromVmain.cpp b/tests/PPU/testPpuWriteFromVmain.cpp index df4f295..7066e9a 100644 --- a/tests/PPU/testPpuWriteFromVmain.cpp +++ b/tests/PPU/testPpuWriteFromVmain.cpp @@ -55,6 +55,19 @@ Test(PPU_write_2, vmadd_full_data) cr_assert_eq(snes.ppu->_registers._vmadd.vmadd, 0b1111111111111111); } +Test(PPU_write_2, vmadd_full_data_check_ram) +{ + Init() + snes._bus->write(0x2115, 0b10000000); + snes._bus->write(0x2116, 2); + snes._bus->write(0x2117, 0); + snes._bus->write(0x2118, 0xFF); + snes._bus->write(0x2119, 0xFF); + cr_assert(snes.ppu->_registers._vmadd.vmadd == 3, "Got %d but expected 3", snes.ppu->_registers._vmadd.vmadd); + cr_assert(snes.ppu->vram->read_internal(4) == 0xFF, "Got %X but expected 0xFF", snes.ppu->vram->read_internal(4)); + cr_assert(snes.ppu->vram->read_internal(5) == 0xFF, "Got %X but expected 0xFF", snes.ppu->vram->read_internal(5)); +} + Test(PPU_write_2, vmadd_full_high_byte_null) { Init()