@@ -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