VIC: Resolve background color registers separately to color matrix memory
This commit is contained in:
parent
9f733d3e7a
commit
89fa153477
|
@ -46,6 +46,8 @@
|
||||||
private int _parsePixelDataIndex;
|
private int _parsePixelDataIndex;
|
||||||
private int _parseSrData0;
|
private int _parseSrData0;
|
||||||
private int _parseSrData1;
|
private int _parseSrData1;
|
||||||
|
private int _parseSrShift;
|
||||||
|
private bool _parseSrColorEnable;
|
||||||
|
|
||||||
private void ParseCycle()
|
private void ParseCycle()
|
||||||
{
|
{
|
||||||
|
@ -106,8 +108,9 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
// graphics data shift register
|
// graphics data shift register
|
||||||
_srData1 &= ~(0xFF << (7 - _xScroll));
|
_parseSrShift = 7 - _xScroll;
|
||||||
_srActive |= 0xFF << (7 - _xScroll);
|
_srData1 &= ~(0xFF << _parseSrShift);
|
||||||
|
_srActive |= 0xFF << _parseSrShift;
|
||||||
|
|
||||||
if (_multicolorMode && (_bitmapMode || (_dataC & 0x800) != 0))
|
if (_multicolorMode && (_bitmapMode || (_dataC & 0x800) != 0))
|
||||||
{
|
{
|
||||||
|
@ -119,13 +122,13 @@
|
||||||
_parseSrData0 = _bitmapMode ? 0 : _dataG;
|
_parseSrData0 = _bitmapMode ? 0 : _dataG;
|
||||||
_parseSrData1 = _dataG;
|
_parseSrData1 = _dataG;
|
||||||
}
|
}
|
||||||
_srData1 |= _parseSrData1 << (7 - _xScroll);
|
_srData1 |= _parseSrData1 << _parseSrShift;
|
||||||
|
|
||||||
// graphics color shift register
|
// graphics color shift register
|
||||||
_srColor0 &= ~(0xFF << (7 - _xScroll));
|
_srColor0 &= ~(0xFF << _parseSrShift);
|
||||||
_srColor1 &= ~(0xFF << (7 - _xScroll));
|
_srColor1 &= ~(0xFF << _parseSrShift);
|
||||||
_srColor2 &= ~(0xFF << (7 - _xScroll));
|
_srColor2 &= ~(0xFF << _parseSrShift);
|
||||||
_srColor3 &= ~(0xFF << (7 - _xScroll));
|
_srColor3 &= ~(0xFF << _parseSrShift);
|
||||||
for (_parsePixelDataIndex = 7; _parsePixelDataIndex >= 0; _parsePixelDataIndex--)
|
for (_parsePixelDataIndex = 7; _parsePixelDataIndex >= 0; _parsePixelDataIndex--)
|
||||||
{
|
{
|
||||||
_parsePixelData = ((_parseSrData0 & 0x80) >> 7) | ((_parseSrData1 & 0x80) >> 6);
|
_parsePixelData = ((_parseSrData0 & 0x80) >> 7) | ((_parseSrData1 & 0x80) >> 6);
|
||||||
|
@ -133,24 +136,20 @@
|
||||||
{
|
{
|
||||||
case VideoMode000:
|
case VideoMode000:
|
||||||
case VideoMode001:
|
case VideoMode001:
|
||||||
switch (_parsePixelData)
|
if (_parsePixelData == 3)
|
||||||
{
|
{
|
||||||
case 0:
|
_pixel = _idle ? 0 : (_multicolorMode ? _dataC & 0x700 : _dataC) >> 8;
|
||||||
_pixel = _backgroundColor0;
|
_parseSrColorEnable = true;
|
||||||
break;
|
}
|
||||||
case 1:
|
else
|
||||||
_pixel = _idle ? 0 : _backgroundColor1;
|
{
|
||||||
break;
|
_pixel = _parsePixelData;
|
||||||
case 2:
|
_parseSrColorEnable = false;
|
||||||
_pixel = _idle ? 0 :_backgroundColor2;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
_pixel = _idle ? 0 : (_multicolorMode ? _dataC & 0x700 : _dataC) >> 8;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VideoMode010:
|
case VideoMode010:
|
||||||
case VideoMode011:
|
case VideoMode011:
|
||||||
|
_parseSrColorEnable = _parsePixelData != 0;
|
||||||
switch (_parsePixelData)
|
switch (_parsePixelData)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -171,25 +170,12 @@
|
||||||
if (_parsePixelData != 0)
|
if (_parsePixelData != 0)
|
||||||
{
|
{
|
||||||
_pixel = _idle ? 0 : _dataC >> 8;
|
_pixel = _idle ? 0 : _dataC >> 8;
|
||||||
|
_parseSrColorEnable = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_pixel = (_dataC & 0xC0) >> 6;
|
_pixel = (_dataC & 0xC0) >> 6;
|
||||||
switch (_pixel)
|
_parseSrColorEnable = false;
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
_pixel = _backgroundColor0;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
_pixel = _idle ? 0 : _backgroundColor1;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
_pixel = _idle ? 0 : _backgroundColor2;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
_pixel = _idle ? 0 : _backgroundColor3;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -200,10 +186,11 @@
|
||||||
|
|
||||||
_parseSrData0 <<= 1;
|
_parseSrData0 <<= 1;
|
||||||
_parseSrData1 <<= 1;
|
_parseSrData1 <<= 1;
|
||||||
_srColor0 |= (_pixel & 1) << (7 - _xScroll + _parsePixelDataIndex);
|
_srColor0 |= (_pixel & 1) << (_parseSrShift + _parsePixelDataIndex);
|
||||||
_srColor1 |= ((_pixel >> 1) & 1) << (7 - _xScroll + _parsePixelDataIndex);
|
_srColor1 |= ((_pixel >> 1) & 1) << (_parseSrShift + _parsePixelDataIndex);
|
||||||
_srColor2 |= ((_pixel >> 2) & 1) << (7 - _xScroll + _parsePixelDataIndex);
|
_srColor2 |= ((_pixel >> 2) & 1) << (_parseSrShift + _parsePixelDataIndex);
|
||||||
_srColor3 |= ((_pixel >> 3) & 1) << (7 - _xScroll + _parsePixelDataIndex);
|
_srColor3 |= ((_pixel >> 3) & 1) << (_parseSrShift + _parsePixelDataIndex);
|
||||||
|
_srColorEnable |= (_parseSrColorEnable ? 1 : 0) << (_parseSrShift + _parsePixelDataIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
private int _srColor3;
|
private int _srColor3;
|
||||||
private int _srData1;
|
private int _srData1;
|
||||||
private int _srActive;
|
private int _srActive;
|
||||||
|
private int _srColorEnable;
|
||||||
private int _videoMode;
|
private int _videoMode;
|
||||||
private int _borderOnShiftReg;
|
private int _borderOnShiftReg;
|
||||||
|
|
||||||
|
@ -65,12 +66,31 @@
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
// render graphics
|
// render graphics
|
||||||
_pixel = (_srActive & SrMask1) != 0
|
if ((_srColorEnable & SrMask1) != 0)
|
||||||
? ((_srColor0 & SrMask1) >> 18) |
|
{
|
||||||
((_srColor1 & SrMask1) >> 17) |
|
_pixel = ((_srColor0 & SrMask1) >> 18) |
|
||||||
((_srColor2 & SrMask1) >> 16) |
|
((_srColor1 & SrMask1) >> 17) |
|
||||||
((_srColor3 & SrMask1) >> 15)
|
((_srColor2 & SrMask1) >> 16) |
|
||||||
: _backgroundColor0;
|
((_srColor3 & SrMask1) >> 15);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (((_srColor0 & SrMask1) >> 18) | ((_srColor1 & SrMask1) >> 17))
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
_pixel = _backgroundColor1;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
_pixel = _backgroundColor2;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
_pixel = _backgroundColor3;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
_pixel = _backgroundColor0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// render sprites
|
// render sprites
|
||||||
_pixelOwner = -1;
|
_pixelOwner = -1;
|
||||||
|
@ -203,6 +223,7 @@
|
||||||
_srColor3 <<= 1;
|
_srColor3 <<= 1;
|
||||||
_srData1 <<= 1;
|
_srData1 <<= 1;
|
||||||
_srActive <<= 1;
|
_srActive <<= 1;
|
||||||
|
_srColorEnable <<= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_pixBufferBorderIndex >= PixBorderBufferSize)
|
if (_pixBufferBorderIndex >= PixBorderBufferSize)
|
||||||
|
|
|
@ -51,6 +51,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
|
||||||
private int _rasterInterruptLine;
|
private int _rasterInterruptLine;
|
||||||
private bool _rasterInterruptTriggered;
|
private bool _rasterInterruptTriggered;
|
||||||
private int _rasterLine;
|
private int _rasterLine;
|
||||||
|
private int _rasterLineInterruptCompare;
|
||||||
private int _rasterX;
|
private int _rasterX;
|
||||||
private bool _rasterXHold;
|
private bool _rasterXHold;
|
||||||
private int _rc;
|
private int _rc;
|
||||||
|
|
Loading…
Reference in New Issue