C64: Reuse some local memory in the sprite renderer.

This commit is contained in:
SaxxonPike 2019-07-04 12:47:09 -05:00
parent 55145ff7ba
commit 5c9445fb96
1 changed files with 30 additions and 31 deletions

View File

@ -9,6 +9,7 @@
private int _pixelCounter;
private int _pixelData;
private int _pixelOwner;
private Sprite _spr;
private int _sprData;
private int _sprIndex;
private int _sprPixel;
@ -43,8 +44,8 @@
_hblank = true;
_renderEnabled = !_hblank && !_vblank;
_pixelCounter = -1;
while (_pixelCounter++ < 3)
_pixelCounter = 4;
while (--_pixelCounter >= 0)
{
if ((_srColorSync & SrColorMask) != 0)
@ -173,53 +174,53 @@
#region SPRITES
// render sprites
_pixelOwner = -1;
_sprIndex = 0;
foreach (var spr in _sprites)
for (_sprIndex = 0; _sprIndex < 8; _sprIndex++)
{
_spr = _sprites[_sprIndex];
_sprData = 0;
_sprPixel = _pixel;
if (spr.X == _rasterX)
if (_spr.X == _rasterX)
{
spr.ShiftEnable = spr.Display;
spr.XCrunch = !spr.XExpand;
spr.MulticolorCrunch = false;
_spr.ShiftEnable = _spr.Display;
_spr.XCrunch = !_spr.XExpand;
_spr.MulticolorCrunch = false;
}
else
{
spr.XCrunch |= !spr.XExpand;
_spr.XCrunch |= !_spr.XExpand;
}
if (spr.ShiftEnable) // sprite rule 6
if (_spr.ShiftEnable) // sprite rule 6
{
if (spr.Multicolor)
if (_spr.Multicolor)
{
_sprData = spr.Sr & SrSpriteMaskMc;
if (spr.MulticolorCrunch && spr.XCrunch && !_rasterXHold)
_sprData = _spr.Sr & SrSpriteMaskMc;
if (_spr.MulticolorCrunch && _spr.XCrunch && !_rasterXHold)
{
if (spr.Loaded == 0)
if (_spr.Loaded == 0)
{
spr.ShiftEnable = false;
_spr.ShiftEnable = false;
}
spr.Sr <<= 2;
spr.Loaded >>= 2;
_spr.Sr <<= 2;
_spr.Loaded >>= 2;
}
spr.MulticolorCrunch ^= spr.XCrunch;
_spr.MulticolorCrunch ^= _spr.XCrunch;
}
else
{
_sprData = spr.Sr & SrSpriteMask;
if (spr.XCrunch && !_rasterXHold)
_sprData = _spr.Sr & SrSpriteMask;
if (_spr.XCrunch && !_rasterXHold)
{
if (spr.Loaded == 0)
if (_spr.Loaded == 0)
{
spr.ShiftEnable = false;
_spr.ShiftEnable = false;
}
spr.Sr <<= 1;
spr.Loaded >>= 1;
_spr.Sr <<= 1;
_spr.Loaded >>= 1;
}
}
spr.XCrunch ^= spr.XExpand;
_spr.XCrunch ^= _spr.XExpand;
if (_sprData != 0)
{
@ -232,7 +233,7 @@
_sprPixel = _spriteMulticolor0;
break;
case SrSpriteMask2:
_sprPixel = spr.Color;
_sprPixel = _spr.Color;
break;
case SrSpriteMask3:
_sprPixel = _spriteMulticolor1;
@ -244,7 +245,7 @@
{
if (!_borderOnVertical)
{
spr.CollideSprite = true;
_spr.CollideSprite = true;
_sprites[_pixelOwner].CollideSprite = true;
}
}
@ -252,11 +253,11 @@
// sprite-data collision
if (!_borderOnVertical && (_pixelData >= SrMask2))
{
spr.CollideData = true;
_spr.CollideData = true;
}
// sprite priority logic
if (spr.Priority)
if (_spr.Priority)
{
_pixel = _pixelData >= SrMask2 ? _pixel : _sprPixel;
}
@ -266,8 +267,6 @@
}
}
}
_sprIndex++;
}
#endregion