From 21791170f4213676febb1b7392a7640485939cbf Mon Sep 17 00:00:00 2001 From: Sour Date: Sun, 24 Feb 2019 09:38:22 -0500 Subject: [PATCH] PPU: Fixed VRAM read behavior --- Core/Ppu.cpp | 15 +++++++++++---- Core/Ppu.h | 4 +++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Core/Ppu.cpp b/Core/Ppu.cpp index 1983bcc..54f1379 100644 --- a/Core/Ppu.cpp +++ b/Core/Ppu.cpp @@ -1036,6 +1036,11 @@ void Ppu::LatchLocationValues() _locationLatched = true; } +void Ppu::UpdateVramReadBuffer() +{ + _vramReadBuffer = _vram[_vramAddress << 1] | (_vram[(_vramAddress << 1) + 1] << 8); +} + uint8_t Ppu::Read(uint16_t addr) { switch(addr) { @@ -1063,9 +1068,9 @@ uint8_t Ppu::Read(uint16_t addr) case 0x2139: { //VMDATALREAD - VRAM Data Read low byte - uint8_t returnValue = _vramReadBuffer; - _vramReadBuffer = _vram[_vramAddress << 1]; + uint8_t returnValue = (uint8_t)_vramReadBuffer; if(!_vramAddrIncrementOnSecondReg) { + UpdateVramReadBuffer(); _vramAddress = (_vramAddress + _vramIncrementValue) & 0x7FFF; } return returnValue; @@ -1073,9 +1078,9 @@ uint8_t Ppu::Read(uint16_t addr) case 0x213A: { //VMDATAHREAD - VRAM Data Read high byte - uint8_t returnValue = _vramReadBuffer; - _vramReadBuffer = _vram[(_vramAddress << 1) + 1]; + uint8_t returnValue = (uint8_t)(_vramReadBuffer >> 8); if(_vramAddrIncrementOnSecondReg) { + UpdateVramReadBuffer(); _vramAddress = (_vramAddress + _vramIncrementValue) & 0x7FFF; } return returnValue; @@ -1281,11 +1286,13 @@ void Ppu::Write(uint32_t addr, uint8_t value) case 0x2116: //VMADDL - VRAM Address low byte _vramAddress = (_vramAddress & 0x7F00) | value; + UpdateVramReadBuffer(); break; case 0x2117: //VMADDH - VRAM Address high byte _vramAddress = (_vramAddress & 0x00FF) | ((value & 0x7F) << 8); + UpdateVramReadBuffer(); break; case 0x2118: diff --git a/Core/Ppu.h b/Core/Ppu.h index 6561542..31f0318 100644 --- a/Core/Ppu.h +++ b/Core/Ppu.h @@ -70,7 +70,7 @@ private: uint8_t _vramIncrementValue; uint8_t _vramAddressRemapping; bool _vramAddrIncrementOnSecondReg; - uint8_t _vramReadBuffer = 0; + uint16_t _vramReadBuffer = 0; uint16_t _cgramAddress; uint8_t _cgram[Ppu::CgRamSize]; @@ -198,6 +198,8 @@ private: bool ProcessMaskWindow(uint8_t activeWindowCount, int x); void ProcessWindowMaskSettings(uint8_t value, uint8_t offset); + void UpdateVramReadBuffer(); + void SendFrame(); public: