bsnes/higan/ws/ppu/latch.cpp

49 lines
1.6 KiB
C++

auto PPU::latchRegisters() -> void {
l.backColor = r.backColor;
l.screenOneEnable = r.screenOneEnable;
l.screenOneMapBase = r.screenOneMapBase;
l.scrollOneX = r.scrollOneX;
l.scrollOneY = r.scrollOneY;
l.screenTwoEnable = r.screenTwoEnable;
l.screenTwoMapBase = r.screenTwoMapBase;
l.scrollTwoX = r.scrollTwoX;
l.scrollTwoY = r.scrollTwoY;
l.screenTwoWindowEnable = r.screenTwoWindowEnable;
l.screenTwoWindowInvert = r.screenTwoWindowInvert;
l.screenTwoWindowX0 = r.screenTwoWindowX0;
l.screenTwoWindowY0 = r.screenTwoWindowY0;
l.screenTwoWindowX1 = r.screenTwoWindowX1;
l.screenTwoWindowY1 = r.screenTwoWindowY1;
l.spriteEnable = r.spriteEnable;
l.spriteWindowEnable = r.spriteWindowEnable;
l.spriteWindowX0 = r.spriteWindowX0;
l.spriteWindowY0 = r.spriteWindowY0;
l.spriteWindowX1 = r.spriteWindowX1;
l.spriteWindowY1 = r.spriteWindowY1;
}
auto PPU::latchSprites() -> void {
l.spriteCount = 0;
if(!l.spriteEnable) return;
for(auto index : range(l.oamCount)) {
uint32 attributes = l.oam[!s.field][index];
if((uint8)(s.vclk - attributes.bits(16,23)) > 7) continue;
l.sprite[l.spriteCount] = attributes;
if(++l.spriteCount >= 32) break;
}
}
//note: this implicitly latches spriteBase, spriteFirst, spriteCount
auto PPU::latchOAM() -> void {
uint7 spriteIndex = r.spriteFirst;
uint8 spriteCount = min(128, (uint)r.spriteCount);
uint16 spriteBase = r.spriteBase.bits(0, 4 + system.depth()) << 9;
l.oamCount = spriteCount;
for(auto index : range(spriteCount)) {
l.oam[s.field][index] = iram.read(spriteBase + (spriteIndex++ << 2), Long);
}
}