From 6012e3f84033609281f2cb6e75c00ff1d476e024 Mon Sep 17 00:00:00 2001 From: Sour Date: Mon, 8 Apr 2019 15:15:13 -0400 Subject: [PATCH] PPU: Fixed draw logic when turning hires modes on/off during a scanline --- Core/Ppu.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Core/Ppu.cpp b/Core/Ppu.cpp index 652355f..e8cd3d3 100644 --- a/Core/Ppu.cpp +++ b/Core/Ppu.cpp @@ -1088,19 +1088,24 @@ void Ppu::ApplyHiResMode() if(IsDoubleWidth()) { ApplyBrightness(); - for(int i = 0; i < 512; i += 2) { - _currentBuffer[baseAddr + i] = _subScreenBuffer[i >> 1]; - _currentBuffer[baseAddr + i + 1] = _mainScreenBuffer[i >> 1]; + for(int x = _drawStartX; x <= _drawEndX; x++) { + _currentBuffer[baseAddr + (x << 1)] = _subScreenBuffer[x]; + _currentBuffer[baseAddr + (x << 1) + 1] = _mainScreenBuffer[x]; } } else { - for(int i = 0; i < 512; i += 2) { - _currentBuffer[baseAddr + i] = _mainScreenBuffer[i >> 1]; - _currentBuffer[baseAddr + i + 1] = _mainScreenBuffer[i >> 1]; + for(int x = _drawStartX; x <= _drawEndX; x++) { + _currentBuffer[baseAddr + (x << 1)] = _mainScreenBuffer[x]; + _currentBuffer[baseAddr + (x << 1) + 1] = _mainScreenBuffer[x]; } } if(!IsDoubleHeight()) { - memcpy(_currentBuffer + baseAddr + 512, _currentBuffer + baseAddr, 512 * 2); + //Copy this line's content to the next line (between the current start & end bounds) + memcpy( + _currentBuffer + baseAddr + 512 + (_drawStartX << 1), + _currentBuffer + baseAddr + (_drawStartX << 1), + (_drawEndX - _drawStartX + 1) << 2 + ); } } @@ -1364,7 +1369,7 @@ uint8_t Ppu::Read(uint16_t addr) void Ppu::Write(uint32_t addr, uint8_t value) { - if(_scanline < (_overscanMode ? 239 : 224) && _scanline > 0 && _cycle >= 22 && _cycle <= 277) { + if(_scanline <= (_overscanMode ? 239 : 224) && _scanline > 0 && _cycle >= 22 && _cycle <= 277) { RenderScanline(); }