Basic implementation of player 0 graphics

This commit is contained in:
pjgat09 2012-03-10 08:34:04 +00:00
parent 5493904312
commit 8a73d50e0b
1 changed files with 98 additions and 46 deletions

View File

@ -11,8 +11,12 @@ namespace BizHawk.Emulation.Consoles.Atari
{ {
MOS6502 Cpu; MOS6502 Cpu;
UInt32 PF; // PlayField data UInt32 PF; // PlayField data
byte background; byte BKcolor, PFcolor, P0color;
UInt32 BKcolor, PFcolor; byte grp0;
byte resetP0 = 0;
bool PFpriority = false;
bool P0Reflect = false;
int[] frameBuffer; int[] frameBuffer;
public bool frameComplete; public bool frameComplete;
@ -20,9 +24,6 @@ namespace BizHawk.Emulation.Consoles.Atari
uint[] scanline = new uint[160]; uint[] scanline = new uint[160];
int scanlinePos; int scanlinePos;
int drawClocksStart;
int drawLastUpdate;
UInt32[] palette = new UInt32[]{ UInt32[] palette = new UInt32[]{
0x000000, 0, 0x4a4a4a, 0, 0x6f6f6f, 0, 0x8e8e8e, 0, 0x000000, 0, 0x4a4a4a, 0, 0x6f6f6f, 0, 0x8e8e8e, 0,
0xaaaaaa, 0, 0xc0c0c0, 0, 0xd6d6d6, 0, 0xececec, 0, 0xaaaaaa, 0, 0xc0c0c0, 0, 0xd6d6d6, 0, 0xececec, 0,
@ -94,14 +95,32 @@ namespace BizHawk.Emulation.Consoles.Atari
} }
UInt32 color; UInt32 color;
color = palette[BKcolor];
if ((PF & PFmask) != 0) if ((PF & PFmask) != 0)
{ {
color = palette[PFcolor]; color = palette[PFcolor];
} }
else
// Player 1
if (pixelPos >= resetP0 && pixelPos < (resetP0 + 8))
{ {
color = palette[BKcolor]; byte mask = (byte)(0x80 >> (pixelPos - resetP0));
if (P0Reflect)
{
mask = reverseBits(mask);
} }
if ((grp0 & mask) != 0)
{
color = palette[P0color];
}
}
if ((PF & PFmask) != 0 && PFpriority == true)
{
color = palette[PFcolor];
}
scanline[pixelPos] = color; scanline[pixelPos] = color;
scanlinePos++; scanlinePos++;
@ -120,7 +139,7 @@ namespace BizHawk.Emulation.Consoles.Atari
{ {
for (int col = 0; col < 320; col++) for (int col = 0; col < 320; col++)
{ {
if (scanlinesBuffer.Count != null && scanlinesBuffer.Count > row) if (scanlinesBuffer.Count > row)
{ {
frameBuffer[row * 320 + col] = (int)(scanlinesBuffer[row][col / 2]); frameBuffer[row * 320 + col] = (int)(scanlinesBuffer[row][col / 2]);
} }
@ -181,6 +200,40 @@ namespace BizHawk.Emulation.Consoles.Atari
execute(1); execute(1);
} }
} }
else if (maskedAddr == 0x06) // COLUP0
{
P0color = value;
}
else if (maskedAddr == 0x08) // COLUPF
{
PFcolor = value;
}
else if (maskedAddr == 0x09) // COLUBK
{
BKcolor = value;
}
else if (maskedAddr == 0x0A) // CTRLPF
{
if ((value & 0x04) != 0)
{
PFpriority = true;
}
else
{
PFpriority = false;
}
}
else if (maskedAddr == 0x0B) // REFP0
{
if ((value & 0x04) != 0)
{
P0Reflect = true;
}
else
{
P0Reflect = false;
}
}
else if (maskedAddr == 0x0D) // PF0 else if (maskedAddr == 0x0D) // PF0
{ {
PF = (UInt32)((PF & 0x0FFFF) + ((reverseBits(value) & 0x0F) << 16)); PF = (UInt32)((PF & 0x0FFFF) + ((reverseBits(value) & 0x0F) << 16));
@ -193,15 +246,14 @@ namespace BizHawk.Emulation.Consoles.Atari
{ {
PF = (UInt32)((PF & 0xFFF00) + reverseBits(value)); PF = (UInt32)((PF & 0xFFF00) + reverseBits(value));
} }
else if (maskedAddr == 0x08) // COLUPF else if (maskedAddr == 0x10) // RESP0
{ {
PFcolor = (UInt32)(value); resetP0 = (byte)(scanlinePos - 68);
} }
else if (maskedAddr == 0x09) // COLUBK else if (maskedAddr == 0x1B) // GRP0
{ {
BKcolor = (UInt32)(value); grp0 = value;
} }
} }
public byte reverseBits(byte value) public byte reverseBits(byte value)