PPU: Implement OAM reading and fixed OAM-related bugs (based on blargg's oam tests)
This commit is contained in:
parent
b5fe44a037
commit
384a5a2c99
1 changed files with 18 additions and 2 deletions
18
Core/Ppu.cpp
18
Core/Ppu.cpp
|
@ -70,7 +70,9 @@ void Ppu::Exec()
|
||||||
RenderScanline();
|
RenderScanline();
|
||||||
} else if(_scanline == 225) {
|
} else if(_scanline == 225) {
|
||||||
//Reset OAM address at the start of vblank?
|
//Reset OAM address at the start of vblank?
|
||||||
|
if(!_forcedVblank) {
|
||||||
_internalOamAddress = (_oamRamAddress << 1);
|
_internalOamAddress = (_oamRamAddress << 1);
|
||||||
|
}
|
||||||
|
|
||||||
_frameCount++;
|
_frameCount++;
|
||||||
_console->GetSpc()->ProcessEndFrame();
|
_console->GetSpc()->ProcessEndFrame();
|
||||||
|
@ -483,6 +485,17 @@ uint8_t* Ppu::GetSpriteRam()
|
||||||
uint8_t Ppu::Read(uint16_t addr)
|
uint8_t Ppu::Read(uint16_t addr)
|
||||||
{
|
{
|
||||||
switch(addr) {
|
switch(addr) {
|
||||||
|
case 0x2138: {
|
||||||
|
uint8_t value;
|
||||||
|
if(_internalOamAddress < 512) {
|
||||||
|
value = _oamRam[_internalOamAddress];
|
||||||
|
} else {
|
||||||
|
value = _oamRam[0x200 | (_internalOamAddress & 0x1F)];
|
||||||
|
}
|
||||||
|
_internalOamAddress = (_internalOamAddress + 1) & 0x3FF;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
case 0x213E:
|
case 0x213E:
|
||||||
//TODO open bus on bit 4
|
//TODO open bus on bit 4
|
||||||
return (
|
return (
|
||||||
|
@ -536,8 +549,11 @@ void Ppu::Write(uint32_t addr, uint8_t value)
|
||||||
} else {
|
} else {
|
||||||
_oamWriteBuffer = value;
|
_oamWriteBuffer = value;
|
||||||
}
|
}
|
||||||
} else if(_internalOamAddress >= 512) {
|
} else {
|
||||||
uint16_t address = 0x200 | (_internalOamAddress & 0x1F);
|
uint16_t address = 0x200 | (_internalOamAddress & 0x1F);
|
||||||
|
if((_internalOamAddress & 0x01) == 0) {
|
||||||
|
_oamWriteBuffer = value;
|
||||||
|
}
|
||||||
_oamRam[address] = value;
|
_oamRam[address] = value;
|
||||||
}
|
}
|
||||||
_internalOamAddress = (_internalOamAddress + 1) & 0x3FF;
|
_internalOamAddress = (_internalOamAddress + 1) & 0x3FF;
|
||||||
|
|
Loading…
Add table
Reference in a new issue