Skip to content

Commit c46bc68

Browse files
committed
NES: MMC5 - Fixed edge cases in vertical split behavior
Fixes 5200_update_while_in_frame test behavior (glitch pink scanline for values $91-$9F)
1 parent a032574 commit c46bc68

File tree

1 file changed

+14
-7
lines changed
  • Core/NES/Mappers/Nintendo

1 file changed

+14
-7
lines changed

Core/NES/Mappers/Nintendo/MMC5.h

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,6 @@ class MMC5 : public BaseMapper, public IExtModeMapperDebug
463463
bool isNtFetch = addr >= 0x2000 && addr <= 0x2FFF && (addr & 0x3FF) < 0x3C0;
464464
if(isNtFetch) {
465465
//Nametable data, not an attribute fetch
466-
_splitInSplitRegion = false;
467466
_splitTileNumber++;
468467

469468
if(_ppuInFrame) {
@@ -486,15 +485,23 @@ class MMC5 : public BaseMapper, public IExtModeMapperDebug
486485
uint8_t column = (_splitTileNumber + 2) % 42;
487486
if(addr >= 0x2000) {
488487
if(isNtFetch) {
489-
if(column <= 32 && ((_verticalSplitRightSide && column >= _verticalSplitDelimiterTile) || (!_verticalSplitRightSide && column < _verticalSplitDelimiterTile))) {
490-
//Split region (for next 3 fetches, attribute + 2x tile data)
491-
_splitInSplitRegion = true;
492-
_splitTile = ((verticalSplitScroll & 0xF8) << 2) | column;
493-
return _mapperRam[_splitTile];
494-
} else {
488+
if(column == 0) {
489+
_splitInSplitRegion = !_verticalSplitRightSide;
490+
}
491+
492+
if(column == _verticalSplitDelimiterTile && _splitTileNumber < 42) {
493+
//Enter/exit split section when the current column matches the column number written to $5200
494+
_splitInSplitRegion = !_splitInSplitRegion;
495+
} else if(column > 32) {
495496
//Outside of split region (or sprite data), result can get modified by ex ram mode code below
496497
_splitInSplitRegion = false;
497498
}
499+
500+
if(_splitInSplitRegion) {
501+
//In vertical split region, override data received by the PPU
502+
_splitTile = ((verticalSplitScroll & 0xF8) << 2) | column;
503+
return _mapperRam[_splitTile];
504+
}
498505
} else if(_splitInSplitRegion) {
499506
uint8_t shift = ((_splitTile >> 4) & 0x04) | (_splitTile & 0x02);
500507
uint16_t atAddr = 0x3C0 | ((_splitTile & 0x380) >> 4) | ((_splitTile & 0x1F) >> 2);

0 commit comments

Comments
 (0)