commodore64: sprite priority fixed and collision detection added
This commit is contained in:
parent
66c1fc68f6
commit
cd7ab3b6f0
|
@ -859,9 +859,10 @@ namespace BizHawk.Emulation.Computers.Commodore64
|
||||||
|
|
||||||
private void PerformCycleRender()
|
private void PerformCycleRender()
|
||||||
{
|
{
|
||||||
int spritePixel;
|
|
||||||
int inputPixel;
|
int inputPixel;
|
||||||
int outputPixel;
|
int outputPixel;
|
||||||
|
int spriteBits;
|
||||||
|
int spritePixel;
|
||||||
int spritePixelOwner;
|
int spritePixelOwner;
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
|
@ -902,98 +903,93 @@ namespace BizHawk.Emulation.Computers.Commodore64
|
||||||
|
|
||||||
// render plotter
|
// render plotter
|
||||||
if (idle)
|
if (idle)
|
||||||
{
|
|
||||||
inputPixel = regs.BxC[0];
|
inputPixel = regs.BxC[0];
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
inputPixel = Plotter();
|
inputPixel = Plotter();
|
||||||
}
|
|
||||||
|
|
||||||
// render sprites
|
// render sprites
|
||||||
outputPixel = pixelBuffer[pixelBufferIndex];
|
outputPixel = pixelBuffer[pixelBufferIndex];
|
||||||
|
|
||||||
for (int j = 0; j < 8; j++)
|
for (int j = 0; j < 8; j++)
|
||||||
{
|
{
|
||||||
int spriteBits;
|
if (regs.MD[j])
|
||||||
if (regs.MxX[j] == rasterOffsetX)
|
|
||||||
{
|
{
|
||||||
regs.MSRA[j] = true;
|
if (regs.MxX[j] == rasterOffsetX)
|
||||||
regs.MSRC[j] = 24;
|
|
||||||
}
|
|
||||||
if (regs.MD[j] && regs.MSRA[j])
|
|
||||||
{
|
|
||||||
// multicolor consumes two bits per pixel
|
|
||||||
if (regs.MxMC[j])
|
|
||||||
{
|
{
|
||||||
spriteBits = (int)((regs.MSR[j] >> 30) & 0x3);
|
regs.MSRA[j] = true;
|
||||||
if ((regs.MxXE[j] == false) || (rasterOffsetX & 0x1) != (regs.MxX[j] & 0x1))
|
regs.MSRC[j] = 25;
|
||||||
{
|
|
||||||
regs.MSR[j] <<= 2;
|
|
||||||
regs.MSRC[j]--;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
if (regs.MSRA[j])
|
||||||
{
|
{
|
||||||
spriteBits = (int)((regs.MSR[j] >> 30) & 0x2);
|
// multicolor consumes two bits per pixel and is forced wide
|
||||||
//
|
if (regs.MxMC[j])
|
||||||
if ((regs.MxXE[j] == false) || (rasterOffsetX & 0x1) != (regs.MxX[j] & 0x1))
|
|
||||||
{
|
{
|
||||||
regs.MSR[j] <<= 1;
|
spriteBits = (int)((regs.MSR[j] >> 30) & 0x3);
|
||||||
regs.MSRC[j]--;
|
if ((rasterOffsetX & 0x1) != (regs.MxX[j] & 0x1))
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if not transparent, process collisions and color
|
|
||||||
if (spriteBits != 0)
|
|
||||||
{
|
|
||||||
switch (spriteBits)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
spritePixel = regs.MMx[0];
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
spritePixel = regs.MxC[j];
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
spritePixel = regs.MMx[1];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// this should never happen but VS needs this
|
|
||||||
spritePixel = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// process collisions if the border is off
|
|
||||||
if (!borderOnVertical)
|
|
||||||
{
|
|
||||||
if (spritePixelOwner == -1)
|
|
||||||
{
|
{
|
||||||
spritePixelOwner = j;
|
regs.MSR[j] <<= 2;
|
||||||
if (regs.MxDP[j] || (!regs.MxDP[j] && !pixelBufferForeground[pixelBufferIndex]))
|
regs.MSRC[j]--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
spriteBits = (int)((regs.MSR[j] >> 30) & 0x2);
|
||||||
|
if ((!regs.MxXE[j]) || (rasterOffsetX & 0x1) != (regs.MxX[j] & 0x1))
|
||||||
|
{
|
||||||
|
regs.MSR[j] <<= 1;
|
||||||
|
regs.MSRC[j]--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if not transparent, process collisions and color
|
||||||
|
if (spriteBits != 0)
|
||||||
|
{
|
||||||
|
switch (spriteBits)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
spritePixel = regs.MMx[0];
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
spritePixel = regs.MxC[j];
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
spritePixel = regs.MMx[1];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// this should never happen but VS needs this
|
||||||
|
spritePixel = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// process collisions if the border is off
|
||||||
|
if (!borderOnVertical)
|
||||||
|
{
|
||||||
|
if (spritePixelOwner == -1)
|
||||||
{
|
{
|
||||||
outputPixel = spritePixel;
|
spritePixelOwner = j;
|
||||||
|
if (!regs.MxDP[j] || (!pixelBufferForeground[pixelBufferIndex]))
|
||||||
|
{
|
||||||
|
outputPixel = spritePixel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// a sprite already occupies this space
|
||||||
|
regs.MxM[spritePixelOwner] = true;
|
||||||
|
regs.MxM[j] = true;
|
||||||
|
regs.IMMC = true;
|
||||||
|
}
|
||||||
|
if (dataForeground)
|
||||||
|
{
|
||||||
|
regs.MxD[j] = true;
|
||||||
|
regs.IMBC = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// a sprite already occupies this space
|
|
||||||
//regs.MxM[spritePixelOwner] = true;
|
|
||||||
//regs.MxM[j] = true;
|
|
||||||
//regs.IMMC = true;
|
|
||||||
}
|
|
||||||
if (dataForeground)
|
|
||||||
{
|
|
||||||
//regs.MxD[j] = true;
|
|
||||||
//regs.IMBC = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (regs.MSRC[j] == 0)
|
||||||
|
regs.MSRA[j] = false;
|
||||||
}
|
}
|
||||||
if (regs.MSRC[j] == 0)
|
|
||||||
regs.MSRA[j] = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// send pixel to bitmap
|
// send pixel to bitmap
|
||||||
|
|
Loading…
Reference in New Issue