PPU: Mode 7 Ext BG mode
This commit is contained in:
parent
39ae565aa1
commit
19a6663ed9
3 changed files with 39 additions and 13 deletions
33
Core/Ppu.cpp
33
Core/Ppu.cpp
|
@ -352,9 +352,15 @@ void Ppu::RenderMode7()
|
|||
{
|
||||
RenderSprites<3, forMainScreen>();
|
||||
RenderSprites<2, forMainScreen>();
|
||||
if(_mode7.ExtBgEnabled) {
|
||||
RenderTilemapMode7<1, forMainScreen, false, true>();
|
||||
}
|
||||
RenderSprites<1, forMainScreen>();
|
||||
RenderTilemapMode7<0, forMainScreen, false>();
|
||||
RenderTilemapMode7<0, forMainScreen, false, false>();
|
||||
RenderSprites<0, forMainScreen>();
|
||||
if(_mode7.ExtBgEnabled) {
|
||||
RenderTilemapMode7<1, forMainScreen, false, false>();
|
||||
}
|
||||
RenderBgColor<forMainScreen>();
|
||||
}
|
||||
|
||||
|
@ -619,7 +625,7 @@ void Ppu::RenderTilemap()
|
|||
}
|
||||
}
|
||||
|
||||
template<uint8_t layerIndex, bool forMainScreen, bool applyMosaic>
|
||||
template<uint8_t layerIndex, bool forMainScreen, bool applyMosaic, bool processHighPriority>
|
||||
void Ppu::RenderTilemapMode7()
|
||||
{
|
||||
uint16_t realY = _mode7.VerticalMirroring ? (255 - _scanline) : _scanline;
|
||||
|
@ -699,7 +705,18 @@ void Ppu::RenderTilemapMode7()
|
|||
}
|
||||
|
||||
uint8_t tileIndex = _vram[(((yOffset & ~0x07) << 4) | (xOffset >> 3)) << 1] & tileMask;
|
||||
uint16_t paletteRamOffset = (_vram[(((tileIndex << 6) + ((yOffset & 0x07) << 3) + (xOffset & 0x07)) << 1) + 1]) << 1;
|
||||
uint16_t paletteRamOffset;
|
||||
|
||||
if(layerIndex == 1) {
|
||||
uint8_t color = _vram[(((tileIndex << 6) + ((yOffset & 0x07) << 3) + (xOffset & 0x07)) << 1) + 1];
|
||||
if(((uint8_t)processHighPriority << 7) != (color & 0x80)) {
|
||||
//Wrong priority, skip this pixel
|
||||
continue;
|
||||
}
|
||||
paletteRamOffset = (color & 0x7F) << 1;
|
||||
} else {
|
||||
paletteRamOffset = (_vram[(((tileIndex << 6) + ((yOffset & 0x07) << 3) + (xOffset & 0x07)) << 1) + 1]) << 1;
|
||||
}
|
||||
|
||||
if(paletteRamOffset > 0) {
|
||||
if(forMainScreen) {
|
||||
|
@ -1302,6 +1319,16 @@ void Ppu::Write(uint32_t addr, uint8_t value)
|
|||
}
|
||||
break;
|
||||
|
||||
case 0x2133:
|
||||
//SETINI - Screen Mode/Video Select
|
||||
//_externalSync = (value & 0x80) != 0; //NOT USED
|
||||
_mode7.ExtBgEnabled = (value & 0x40) != 0;
|
||||
//_hiresMode = (value & 0x08) != 0; //TODO
|
||||
//_overscanMode = (value & 0x04) != 0; //TODO
|
||||
//_objInterlace = (value & 0x02) != 0; //TODO
|
||||
//_screenInterlace = (value & 0x01) != 0; //TODO
|
||||
break;
|
||||
|
||||
default:
|
||||
MessageManager::DisplayMessage("Debug", "Unimplemented register write: " + HexUtilities::ToHex(addr) + " = " + HexUtilities::ToHex(value));
|
||||
break;
|
||||
|
|
|
@ -164,7 +164,7 @@ private:
|
|||
template<uint8_t layerIndex, uint8_t bpp, bool processHighPriority, bool forMainScreen, bool largeTiles, uint16_t basePaletteOffset, uint8_t activeWindowCount, bool applyMosaic>
|
||||
void RenderTilemap();
|
||||
|
||||
template<uint8_t layerIndex, bool forMainScreen, bool applyMosaic>
|
||||
template<uint8_t layerIndex, bool forMainScreen, bool applyMosaic, bool processHighPriority>
|
||||
void RenderTilemapMode7();
|
||||
|
||||
template<bool applyMosaic>
|
||||
|
|
|
@ -24,21 +24,20 @@ struct LayerConfig
|
|||
|
||||
struct Mode7Config
|
||||
{
|
||||
int16_t Matrix[4];
|
||||
|
||||
int16_t HScroll;
|
||||
int16_t VScroll;
|
||||
|
||||
bool LargeMap;
|
||||
bool FillWithTile0;
|
||||
|
||||
bool HorizontalMirroring;
|
||||
bool VerticalMirroring;
|
||||
|
||||
int16_t CenterX;
|
||||
int16_t CenterY;
|
||||
|
||||
int16_t Matrix[4];
|
||||
|
||||
uint8_t ValueLatch;
|
||||
|
||||
bool LargeMap;
|
||||
bool FillWithTile0;
|
||||
bool HorizontalMirroring;
|
||||
bool VerticalMirroring;
|
||||
bool ExtBgEnabled;
|
||||
};
|
||||
|
||||
struct WindowConfig
|
||||
|
|
Loading…
Add table
Reference in a new issue