diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index 725a89e..1c8e83a 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -77,7 +77,7 @@ namespace ComSquare::PPU 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_internal(i, cgram_test[i]); } @@ -85,7 +85,7 @@ namespace ComSquare::PPU int *vram_test = get_dump_vram(); for (int i = 0; vram_test[i] != -1; i++) { this->vram->write_internal(i, vram_test[i]); - } + } */ /*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_internal(i + 0x8000, vram_test_2[i]); @@ -114,7 +114,7 @@ namespace ComSquare::PPU //registers - this->_registers._bgmode.bgMode = 1; + /* this->_registers._bgmode.bgMode = 1; this->_backgrounds[0].setBpp(this->getBPP(1)); this->_backgrounds[1].setBpp(this->getBPP(1)); this->_backgrounds[2].setBpp(this->getBPP(2)); @@ -166,12 +166,12 @@ namespace ComSquare::PPU this->_registers._t[0].enableWindowDisplayBg2 = true; this->_registers._t[0].enableWindowDisplayBg3 = true; - +*/ } uint8_t PPU::read(uint24_t addr) { - return 0; + //return 0; switch (addr) { case PpuRegisters::mpyl: return this->_registers._mpy.mpyl; @@ -182,9 +182,25 @@ namespace ComSquare::PPU case PpuRegisters::slhv: return this->_registers._slhv; case PpuRegisters::oamdataread: - case PpuRegisters::vmdatalread: - case PpuRegisters::vmdatahread: return 0; + case PpuRegisters::vmdatalread: { + auto returnValue = static_cast(this->_vramReadBuffer); + if (!this->_registers._vmain.incrementMode) { + this->updateVramReadBuffer(); + // & 0x7FFF; + this->_registers._vmadd.vmadd += this->_registers._incrementAmount; + } + return returnValue; + } + case PpuRegisters::vmdatahread: { + auto returnValue = static_cast(this->_vramReadBuffer >> 8); + if (this->_registers._vmain.incrementMode) { + this->updateVramReadBuffer(); + // & 0x7FFF; + this->_registers._vmadd.vmadd += this->_registers._incrementAmount; + } + return returnValue; + } case PpuRegisters::cgdataread: { return this->cgram->read_internal(this->_registers._cgadd++); } @@ -200,7 +216,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; @@ -277,16 +293,18 @@ namespace ComSquare::PPU break; case PpuRegisters::vmaddl: this->_registers._vmadd.vmaddl = data; + this->updateVramReadBuffer(); break; case PpuRegisters::vmaddh: this->_registers._vmadd.vmaddh = data; + this->updateVramReadBuffer(); break; case PpuRegisters::vmdatal: //throw InvalidAddress("vmdata", addr); //std::cout << "vmdatal" << std::endl; if (!this->_registers._inidisp.fblank) { this->_registers._vmdata.vmdatal = data; - this->vram->write_internal(getVramAddress(), this->_registers._vmdata.vmdatal); + this->vram->write_internal(this->getVramAddress(), this->_registers._vmdata.vmdatal); } if (!this->_registers._vmain.incrementMode) this->_registers._vmadd.vmadd += this->_registers._incrementAmount; @@ -295,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(getVramAddress(), this->_registers._vmdata.vmdatah); + this->vram->write_internal(this->getVramAddress(), this->_registers._vmdata.vmdatah); } if (this->_registers._vmain.incrementMode) this->_registers._vmadd.vmadd += this->_registers._incrementAmount; @@ -760,4 +778,9 @@ namespace ComSquare::PPU { return this->_registers._bgmode.bgMode; } + + void PPU::updateVramReadBuffer() + { + this->_vramReadBuffer = this->vram->read_internal(this->getVramAddress()) + } } \ No newline at end of file diff --git a/sources/PPU/PPU.hpp b/sources/PPU/PPU.hpp index 3d8d3bc..6b21282 100644 --- a/sources/PPU/PPU.hpp +++ b/sources/PPU/PPU.hpp @@ -568,6 +568,8 @@ namespace ComSquare::PPU std::array, 1024> _subScreen; //! @brief Final Screen buffer std::array, 1024> _screen; + //! @brief Used for vram read registers (0x2139 - 0x213A) + uint16_t _vramReadBuffer = 0; public: explicit PPU(Renderer::IRenderer &renderer); @@ -620,6 +622,7 @@ namespace ComSquare::PPU void addToMainSubScreen(Background &bg); //! @brief Get the current background Mode int getBgMode() const; + void updateVramReadBuffer(); }; }