mirror of https://github.com/SourMesen/Mesen2
NES: MMC5 - Fixed edge cases in vertical split behavior
Fixes 5200_update_while_in_frame test behavior (glitch pink scanline for values $91-$9F)
This commit is contained in:
parent
a032574a05
commit
c46bc68942
|
|
@ -463,7 +463,6 @@ protected:
|
||||||
bool isNtFetch = addr >= 0x2000 && addr <= 0x2FFF && (addr & 0x3FF) < 0x3C0;
|
bool isNtFetch = addr >= 0x2000 && addr <= 0x2FFF && (addr & 0x3FF) < 0x3C0;
|
||||||
if(isNtFetch) {
|
if(isNtFetch) {
|
||||||
//Nametable data, not an attribute fetch
|
//Nametable data, not an attribute fetch
|
||||||
_splitInSplitRegion = false;
|
|
||||||
_splitTileNumber++;
|
_splitTileNumber++;
|
||||||
|
|
||||||
if(_ppuInFrame) {
|
if(_ppuInFrame) {
|
||||||
|
|
@ -486,15 +485,23 @@ protected:
|
||||||
uint8_t column = (_splitTileNumber + 2) % 42;
|
uint8_t column = (_splitTileNumber + 2) % 42;
|
||||||
if(addr >= 0x2000) {
|
if(addr >= 0x2000) {
|
||||||
if(isNtFetch) {
|
if(isNtFetch) {
|
||||||
if(column <= 32 && ((_verticalSplitRightSide && column >= _verticalSplitDelimiterTile) || (!_verticalSplitRightSide && column < _verticalSplitDelimiterTile))) {
|
if(column == 0) {
|
||||||
//Split region (for next 3 fetches, attribute + 2x tile data)
|
_splitInSplitRegion = !_verticalSplitRightSide;
|
||||||
_splitInSplitRegion = true;
|
}
|
||||||
_splitTile = ((verticalSplitScroll & 0xF8) << 2) | column;
|
|
||||||
return _mapperRam[_splitTile];
|
if(column == _verticalSplitDelimiterTile && _splitTileNumber < 42) {
|
||||||
} else {
|
//Enter/exit split section when the current column matches the column number written to $5200
|
||||||
|
_splitInSplitRegion = !_splitInSplitRegion;
|
||||||
|
} else if(column > 32) {
|
||||||
//Outside of split region (or sprite data), result can get modified by ex ram mode code below
|
//Outside of split region (or sprite data), result can get modified by ex ram mode code below
|
||||||
_splitInSplitRegion = false;
|
_splitInSplitRegion = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(_splitInSplitRegion) {
|
||||||
|
//In vertical split region, override data received by the PPU
|
||||||
|
_splitTile = ((verticalSplitScroll & 0xF8) << 2) | column;
|
||||||
|
return _mapperRam[_splitTile];
|
||||||
|
}
|
||||||
} else if(_splitInSplitRegion) {
|
} else if(_splitInSplitRegion) {
|
||||||
uint8_t shift = ((_splitTile >> 4) & 0x04) | (_splitTile & 0x02);
|
uint8_t shift = ((_splitTile >> 4) & 0x04) | (_splitTile & 0x02);
|
||||||
uint16_t atAddr = 0x3C0 | ((_splitTile & 0x380) >> 4) | ((_splitTile & 0x1F) >> 2);
|
uint16_t atAddr = 0x3C0 | ((_splitTile & 0x380) >> 4) | ((_splitTile & 0x1F) >> 2);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue