Intellivision implement BG delays

This commit is contained in:
alyosha-tas 2016-11-13 21:13:01 -05:00 committed by GitHub
parent 889feeeeba
commit c00d68d93f
1 changed files with 24 additions and 13 deletions

View File

@ -20,7 +20,7 @@ namespace BizHawk.Emulation.Cores.Intellivision
public Func<ushort, ushort, bool> WriteMemory; public Func<ushort, ushort, bool> WriteMemory;
public int[] BGBuffer = new int[159 * 96]; public int[] BGBuffer = new int[159 * 96];
public int[] FrameBuffer = new int[159 * 192]; public int[] FrameBuffer = new int[167 * 210];
public ushort[,] Collision = new ushort[167,210]; public ushort[,] Collision = new ushort[167,210];
public int[] GetVideoBuffer() public int[] GetVideoBuffer()
@ -29,10 +29,10 @@ namespace BizHawk.Emulation.Cores.Intellivision
return FrameBuffer; return FrameBuffer;
} }
public int VirtualWidth { get { return 159; } } public int VirtualWidth { get { return 167; } }
public int BufferWidth { get { return 159; } } public int BufferWidth { get { return 167; } }
public int VirtualHeight { get { return 192; } } public int VirtualHeight { get { return 210; } }
public int BufferHeight { get { return 192; } } public int BufferHeight { get { return 210; } }
public int BackgroundColor { get { return 0; } } public int BackgroundColor { get { return 0; } }
public void Reset() public void Reset()
@ -231,6 +231,12 @@ namespace BizHawk.Emulation.Cores.Intellivision
public void Background() public void Background()
{ {
// here we will also need to apply the 'delay' register values.
// this shifts the background portion of the screen relative to the mobs
int x_delay = Register[0x30];
int y_delay = Register[0x31];
// The background is a 20x12 grid of "cards". // The background is a 20x12 grid of "cards".
for (int card_row = 0; card_row < 12; card_row++) for (int card_row = 0; card_row < 12; card_row++)
{ {
@ -355,8 +361,11 @@ namespace BizHawk.Emulation.Cores.Intellivision
// The pixels go right as the bits get less significant. // The pixels go right as the bits get less significant.
BGBuffer[pixel] = ColorToRGBA(fg); BGBuffer[pixel] = ColorToRGBA(fg);
// also if the pixel is on set it in the collision matrix // also if the pixel is on set it in the collision matrix
Collision[card_col * 8 + pict_col , (card_row * 8 + pict_row) * 2] = 1<<8; if ((card_col * 8 + pict_col + (8 - x_delay)) < 167)
Collision[card_col * 8 + pict_col , (card_row * 8 + pict_row) * 2+1] = 1<<8; {
Collision[card_col * 8 + pict_col + (8 - x_delay), (card_row * 8 + pict_row) * 2 + (16 - y_delay * 2)] = 1 << 8;
Collision[card_col * 8 + pict_col + (8 - x_delay), (card_row * 8 + pict_row) * 2 + (16 - y_delay * 2) + 1] = 1 << 8;
}
} }
else else
{ {
@ -369,12 +378,14 @@ namespace BizHawk.Emulation.Cores.Intellivision
} }
// now that we have the cards in BGbuffer, we can double vertical resolution to get Frame buffer // now that we have the cards in BGbuffer, we can double vertical resolution to get Frame buffer
for (int j=0;j<96;j++) for (int j=0;j<96;j++)
{ {
for (int i = 0; i < 159; i++) for (int i = 0; i < 159; i++)
{ {
FrameBuffer[(j * 2) * 159 + i] = BGBuffer[j * 159 + i]; FrameBuffer[(j * 2 + (16 - y_delay*2)) * 167 + i + (8-x_delay)] = BGBuffer[j * 159 + i];
FrameBuffer[(j * 2+1) * 159 + i] = BGBuffer[j * 159 + i]; FrameBuffer[(j * 2 + (16 - y_delay*2) + 1) * 167 + i + (8 - x_delay)] = BGBuffer[j * 159 + i];
} }
} }
@ -554,10 +565,10 @@ namespace BizHawk.Emulation.Cores.Intellivision
{ {
bool pixel = mobs[j].Bit(7 - k); bool pixel = mobs[j].Bit(7 - k);
if ((loc_x + k) < 159 && (loc_y*2 + j) < 192 && pixel) if ((loc_x + k) < 167 && (loc_y*2 + j) < 210 && pixel)
{ {
if (vis) if (vis)
FrameBuffer[(loc_y*2 + j) * 159 + loc_x + k] = ColorToRGBA(loc_color); FrameBuffer[(loc_y*2 + j) * 167 + loc_x + k] = ColorToRGBA(loc_color);
//a MOB does not need to be visible for it to be interracting //a MOB does not need to be visible for it to be interracting
if (intr) if (intr)
@ -574,10 +585,10 @@ namespace BizHawk.Emulation.Cores.Intellivision
{ {
bool pixel = y_mobs[j].Bit(7 - k); bool pixel = y_mobs[j].Bit(7 - k);
if ((loc_x + k) < 159 && ((loc_y+4)*2 + j) < 192 && pixel) if ((loc_x + k) < 167 && ((loc_y+4)*2 + j) < 210 && pixel)
{ {
if (vis) if (vis)
FrameBuffer[((loc_y+4)*2 + j) * 159 + loc_x + k] = ColorToRGBA(loc_color); FrameBuffer[((loc_y+4)*2 + j) * 167 + loc_x + k] = ColorToRGBA(loc_color);
//a MOB does not need to be visible for it to be interracting //a MOB does not need to be visible for it to be interracting
if (intr) if (intr)