diff --git a/Core/Ppu.cpp b/Core/Ppu.cpp index bf881e7..1a6ff04 100644 --- a/Core/Ppu.cpp +++ b/Core/Ppu.cpp @@ -16,6 +16,8 @@ Ppu::Ppu(shared_ptr console) _outputBuffers[0] = new uint16_t[512 * 478]; _outputBuffers[1] = new uint16_t[512 * 478]; + memset(_outputBuffers[0], 0, 512 * 478); + memset(_outputBuffers[1], 0, 512 * 478); _currentBuffer = _outputBuffers[0]; @@ -351,6 +353,7 @@ void Ppu::RenderScanline() if(_forcedVblank) { RenderBgColor(); + RenderBgColor(); ApplyHiResMode(); return; } @@ -473,67 +476,7 @@ void Ppu::RenderSprites() } } -template -void Ppu::RenderTilemap() -{ - if(_directColorMode) { - RenderTilemap(); - } else { - RenderTilemap(); - } -} - -template -void Ppu::RenderTilemap() -{ - bool applyMosaic = forMainScreen && ((_mosaicEnabled >> layerIndex) & 0x01) != 0; - - if(applyMosaic) { - RenderTilemap(); - } else { - RenderTilemap(); - } -} - -template -void Ppu::RenderTilemap() -{ - uint8_t activeWindowCount = 0; - if((forMainScreen && _windowMaskMain[layerIndex]) || (!forMainScreen && _windowMaskSub[layerIndex])) { - activeWindowCount = (uint8_t)_window[0].ActiveLayers[layerIndex] + (uint8_t)_window[1].ActiveLayers[layerIndex]; - } - - if(activeWindowCount == 0) { - RenderTilemap(); - } else if(activeWindowCount == 1) { - RenderTilemap(); - } else { - RenderTilemap(); - } -} - -template -void Ppu::RenderTilemap() -{ - bool largeTileWidth = _layerConfig[layerIndex].LargeTiles || _bgMode == 5; - bool largeTileHeight = _layerConfig[layerIndex].LargeTiles; - - if(largeTileWidth) { - if(largeTileHeight) { - RenderTilemap(); - } else { - RenderTilemap(); - } - } else { - if(largeTileHeight) { - RenderTilemap(); - } else { - RenderTilemap(); - } - } -} - -template +template void Ppu::RenderTilemap() { if(!IsRenderRequired(layerIndex)) { @@ -573,7 +516,7 @@ void Ppu::RenderTilemap() for(int x = 0; x < 256; x++) { /* The current pixel x position (normally 0-255, but 0-511 in hi-res mode - even on subscreen, odd on main screen) */ uint16_t realX; - if(largeTileWidth && !largeTileHeight) { + if(hiResMode) { realX = (x << 1) + (forMainScreen ? 1 : 0); } else { realX = x; @@ -706,28 +649,6 @@ uint16_t Ppu::GetTilePixelColor(const uint16_t pixelStart, const uint8_t shift) return color; } -template -void Ppu::RenderTilemapMode7() -{ - bool applyMosaic = forMainScreen && ((_mosaicEnabled >> layerIndex) & 0x01) != 0; - - if(applyMosaic) { - RenderTilemapMode7(); - } else { - RenderTilemapMode7(); - } -} - -template -void Ppu::RenderTilemapMode7() -{ - if(_directColorMode) { - RenderTilemapMode7(); - } else { - RenderTilemapMode7(); - } -} - template void Ppu::RenderTilemapMode7() { @@ -957,7 +878,7 @@ void Ppu::ApplyHiResMode() { uint32_t screenY = _screenInterlace ? ((_frameCount & 0x01) ? ((_scanline << 1) + 1) : (_scanline << 1)) : _scanline; - if(_hiresMode || _bgMode == 5 || _bgMode == 6) { + if(_hiResMode || _bgMode == 5 || _bgMode == 6) { ApplyBrightness(); for(int i = 0; i < 512; i += 2) { _currentBuffer[(screenY << 9) + i] = _subScreenBuffer[i >> 1]; @@ -1007,7 +928,7 @@ void Ppu::SendFrame() uint16_t width; uint16_t height; - if(_hiresMode || _bgMode == 5 || _bgMode == 6) { + if(_hiResMode || _bgMode == 5 || _bgMode == 6) { width = 512; } else { width = 256; @@ -1466,7 +1387,7 @@ void Ppu::Write(uint32_t addr, uint8_t value) //SETINI - Screen Mode/Video Select //_externalSync = (value & 0x80) != 0; //NOT USED _mode7.ExtBgEnabled = (value & 0x40) != 0; - _hiresMode = (value & 0x08) != 0; + _hiResMode = (value & 0x08) != 0; _overscanMode = (value & 0x04) != 0; //_objInterlace = (value & 0x02) != 0; //TODO _screenInterlace = (value & 0x01) != 0; @@ -1477,3 +1398,96 @@ void Ppu::Write(uint32_t addr, uint8_t value) break; } } + +/* Everything below this point is used to select the proper arguments for templates */ +template +void Ppu::RenderTilemap() +{ + if(_directColorMode) { + RenderTilemap(); + } else { + RenderTilemap(); + } +} + +template +void Ppu::RenderTilemap() +{ + bool applyMosaic = forMainScreen && ((_mosaicEnabled >> layerIndex) & 0x01) != 0; + + if(applyMosaic) { + RenderTilemap(); + } else { + RenderTilemap(); + } +} + +template +void Ppu::RenderTilemap() +{ + uint8_t activeWindowCount = 0; + if((forMainScreen && _windowMaskMain[layerIndex]) || (!forMainScreen && _windowMaskSub[layerIndex])) { + activeWindowCount = (uint8_t)_window[0].ActiveLayers[layerIndex] + (uint8_t)_window[1].ActiveLayers[layerIndex]; + } + + if(activeWindowCount == 0) { + RenderTilemap(); + } else if(activeWindowCount == 1) { + RenderTilemap(); + } else { + RenderTilemap(); + } +} + +template +void Ppu::RenderTilemap() +{ + bool largeTileWidth = _layerConfig[layerIndex].LargeTiles | hiResMode; + bool largeTileHeight = _layerConfig[layerIndex].LargeTiles; + + if(largeTileWidth) { + if(largeTileHeight) { + RenderTilemap(); + } else { + RenderTilemap(); + } + } else { + if(largeTileHeight) { + RenderTilemap(); + } else { + RenderTilemap(); + } + } +} + +template +void Ppu::RenderTilemap() +{ + if(_hiResMode || _bgMode == 5 || _bgMode == 6) { + RenderTilemap(); + } else { + RenderTilemap(); + } +} + +template +void Ppu::RenderTilemapMode7() +{ + bool applyMosaic = forMainScreen && ((_mosaicEnabled >> layerIndex) & 0x01) != 0; + + if(applyMosaic) { + RenderTilemapMode7(); + } else { + RenderTilemapMode7(); + } +} + +template +void Ppu::RenderTilemapMode7() +{ + if(_directColorMode) { + RenderTilemapMode7(); + } else { + RenderTilemapMode7(); + } +} diff --git a/Core/Ppu.h b/Core/Ppu.h index 920ae1a..7a75bf5 100644 --- a/Core/Ppu.h +++ b/Core/Ppu.h @@ -112,7 +112,7 @@ private: bool _timeOver = false; bool _rangeOver = false; - bool _hiresMode = false; + bool _hiResMode = false; bool _screenInterlace = false; bool _overscanMode = false; bool _directColorMode = false; @@ -155,17 +155,20 @@ private: template __forceinline void RenderTilemap(); - - template + + template __forceinline void RenderTilemap(); - template + template __forceinline void RenderTilemap(); - template + template __forceinline void RenderTilemap(); - template + template + __forceinline void RenderTilemap(); + + template void RenderTilemap(); template