PPU: Mosaic "start" scanline should not be reset when writing to the mosaic register while mosaic is already enabled
(Fixes FF3 battle mosaic)
This commit is contained in:
parent
c6f8ab4276
commit
f40b9527af
1 changed files with 7 additions and 4 deletions
11
Core/Ppu.cpp
11
Core/Ppu.cpp
|
@ -1786,15 +1786,18 @@ void Ppu::Write(uint32_t addr, uint8_t value)
|
|||
_layerConfig[3].LargeTiles = (value & 0x80) != 0;
|
||||
break;
|
||||
|
||||
case 0x2106:
|
||||
case 0x2106: {
|
||||
//MOSAIC - Screen Pixelation
|
||||
_mosaicSize = ((value & 0xF0) >> 4) + 1;
|
||||
_mosaicEnabled = value & 0x0F;
|
||||
if(_mosaicEnabled) {
|
||||
uint8_t mosaicEnabled = value & 0x0F;
|
||||
if(!_mosaicEnabled && mosaicEnabled) {
|
||||
//"If this register is set during the frame, the <20>starting scanline is the current scanline, otherwise it is the first visible scanline of the frame."
|
||||
//This is only done when mosaic is turned on from an off state (FF3 mosaic effect looks wrong otherwise)
|
||||
_mosaicStartScanline = _scanline;
|
||||
}
|
||||
_mosaicEnabled = mosaicEnabled;
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x2107: case 0x2108: case 0x2109: case 0x210A:
|
||||
//BG 1-4 Tilemap Address and Size (BG1SC, BG2SC, BG3SC, BG4SC)
|
||||
|
@ -2157,7 +2160,7 @@ void Ppu::RenderTilemap()
|
|||
template<uint8_t layerIndex, bool forMainScreen, bool processHighPriority>
|
||||
void Ppu::RenderTilemapMode7()
|
||||
{
|
||||
bool applyMosaic = forMainScreen && ((_mosaicEnabled >> layerIndex) & 0x01) != 0;
|
||||
bool applyMosaic = ((_mosaicEnabled >> layerIndex) & 0x01) != 0;
|
||||
|
||||
if(applyMosaic) {
|
||||
RenderTilemapMode7<layerIndex, forMainScreen, processHighPriority, true>();
|
||||
|
|
Loading…
Add table
Reference in a new issue