PPU: Fixed VRAM read behavior
This commit is contained in:
parent
073e7b2bf3
commit
21791170f4
2 changed files with 14 additions and 5 deletions
15
Core/Ppu.cpp
15
Core/Ppu.cpp
|
@ -1036,6 +1036,11 @@ void Ppu::LatchLocationValues()
|
||||||
_locationLatched = true;
|
_locationLatched = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Ppu::UpdateVramReadBuffer()
|
||||||
|
{
|
||||||
|
_vramReadBuffer = _vram[_vramAddress << 1] | (_vram[(_vramAddress << 1) + 1] << 8);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t Ppu::Read(uint16_t addr)
|
uint8_t Ppu::Read(uint16_t addr)
|
||||||
{
|
{
|
||||||
switch(addr) {
|
switch(addr) {
|
||||||
|
@ -1063,9 +1068,9 @@ uint8_t Ppu::Read(uint16_t addr)
|
||||||
|
|
||||||
case 0x2139: {
|
case 0x2139: {
|
||||||
//VMDATALREAD - VRAM Data Read low byte
|
//VMDATALREAD - VRAM Data Read low byte
|
||||||
uint8_t returnValue = _vramReadBuffer;
|
uint8_t returnValue = (uint8_t)_vramReadBuffer;
|
||||||
_vramReadBuffer = _vram[_vramAddress << 1];
|
|
||||||
if(!_vramAddrIncrementOnSecondReg) {
|
if(!_vramAddrIncrementOnSecondReg) {
|
||||||
|
UpdateVramReadBuffer();
|
||||||
_vramAddress = (_vramAddress + _vramIncrementValue) & 0x7FFF;
|
_vramAddress = (_vramAddress + _vramIncrementValue) & 0x7FFF;
|
||||||
}
|
}
|
||||||
return returnValue;
|
return returnValue;
|
||||||
|
@ -1073,9 +1078,9 @@ uint8_t Ppu::Read(uint16_t addr)
|
||||||
|
|
||||||
case 0x213A: {
|
case 0x213A: {
|
||||||
//VMDATAHREAD - VRAM Data Read high byte
|
//VMDATAHREAD - VRAM Data Read high byte
|
||||||
uint8_t returnValue = _vramReadBuffer;
|
uint8_t returnValue = (uint8_t)(_vramReadBuffer >> 8);
|
||||||
_vramReadBuffer = _vram[(_vramAddress << 1) + 1];
|
|
||||||
if(_vramAddrIncrementOnSecondReg) {
|
if(_vramAddrIncrementOnSecondReg) {
|
||||||
|
UpdateVramReadBuffer();
|
||||||
_vramAddress = (_vramAddress + _vramIncrementValue) & 0x7FFF;
|
_vramAddress = (_vramAddress + _vramIncrementValue) & 0x7FFF;
|
||||||
}
|
}
|
||||||
return returnValue;
|
return returnValue;
|
||||||
|
@ -1281,11 +1286,13 @@ void Ppu::Write(uint32_t addr, uint8_t value)
|
||||||
case 0x2116:
|
case 0x2116:
|
||||||
//VMADDL - VRAM Address low byte
|
//VMADDL - VRAM Address low byte
|
||||||
_vramAddress = (_vramAddress & 0x7F00) | value;
|
_vramAddress = (_vramAddress & 0x7F00) | value;
|
||||||
|
UpdateVramReadBuffer();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x2117:
|
case 0x2117:
|
||||||
//VMADDH - VRAM Address high byte
|
//VMADDH - VRAM Address high byte
|
||||||
_vramAddress = (_vramAddress & 0x00FF) | ((value & 0x7F) << 8);
|
_vramAddress = (_vramAddress & 0x00FF) | ((value & 0x7F) << 8);
|
||||||
|
UpdateVramReadBuffer();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x2118:
|
case 0x2118:
|
||||||
|
|
|
@ -70,7 +70,7 @@ private:
|
||||||
uint8_t _vramIncrementValue;
|
uint8_t _vramIncrementValue;
|
||||||
uint8_t _vramAddressRemapping;
|
uint8_t _vramAddressRemapping;
|
||||||
bool _vramAddrIncrementOnSecondReg;
|
bool _vramAddrIncrementOnSecondReg;
|
||||||
uint8_t _vramReadBuffer = 0;
|
uint16_t _vramReadBuffer = 0;
|
||||||
|
|
||||||
uint16_t _cgramAddress;
|
uint16_t _cgramAddress;
|
||||||
uint8_t _cgram[Ppu::CgRamSize];
|
uint8_t _cgram[Ppu::CgRamSize];
|
||||||
|
@ -198,6 +198,8 @@ private:
|
||||||
bool ProcessMaskWindow(uint8_t activeWindowCount, int x);
|
bool ProcessMaskWindow(uint8_t activeWindowCount, int x);
|
||||||
void ProcessWindowMaskSettings(uint8_t value, uint8_t offset);
|
void ProcessWindowMaskSettings(uint8_t value, uint8_t offset);
|
||||||
|
|
||||||
|
void UpdateVramReadBuffer();
|
||||||
|
|
||||||
void SendFrame();
|
void SendFrame();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Add table
Reference in a new issue