Modified the TIA to be cycle based. Improved the rendering of pitfall in the process.

This commit is contained in:
pjgat09 2012-03-10 04:53:23 +00:00
parent a69ec16c03
commit 0079d6ade5
3 changed files with 101 additions and 32 deletions

View File

@ -124,7 +124,17 @@ namespace BizHawk
{
Frame++;
//cpu.Execute(228);
cpu.Execute(2000);
//cpu.Execute(2000);
tia.frameComplete = false;
while (tia.frameComplete == false)
{
tia.execute(1);
tia.execute(1);
tia.execute(1);
cpu.Execute(1);
}
//clear the framebuffer (hack code)
if (render == false) return;
/*

View File

@ -8,7 +8,7 @@ namespace BizHawk
{
public string SystemId { get { return "A26"; } }
private int[] frameBuffer = new int[320 * 192];
private int[] frameBuffer = new int[320 * 262];
public CoreInputComm CoreInputComm { get; set; }
public CoreOutputComm CoreOutputComm { get; private set; }
public IVideoProvider VideoProvider { get { return this; } }
@ -69,7 +69,7 @@ namespace BizHawk
}
public int[] GetVideoBuffer() { return frameBuffer; }
public int BufferWidth { get { return 320; } }
public int BufferHeight { get { return 192; } }
public int BufferHeight { get { return 262; } }
public int BackgroundColor { get { return 0; } }
public void GetSamples(short[] samples) { }
public void DiscardSamples() { }

View File

@ -2,18 +2,27 @@
using System.Globalization;
using System.IO;
using BizHawk.Emulation.CPUs.M6502;
using System.Collections.Generic;
namespace BizHawk.Emulation.Consoles.Atari
{
// Emulates the M6532 RIOT Chip
// Emulates the TIA
public partial class TIA
{
MOS6502 Cpu;
UInt32 PF; // PlayField data
byte background;
byte scanline;
UInt32 BKcolor, PFcolor;
int[] frameBuffer;
public bool frameComplete;
List<uint[]> scanlinesBuffer = new List<uint[]> ();
uint[] scanline = new uint[160];
int scanlinePos;
int drawClocksStart;
int drawLastUpdate;
UInt32[] palette = new UInt32[]{
0x000000, 0, 0x4a4a4a, 0, 0x6f6f6f, 0, 0x8e8e8e, 0,
0xaaaaaa, 0, 0xc0c0c0, 0, 0xd6d6d6, 0, 0xececec, 0,
@ -52,9 +61,75 @@ namespace BizHawk.Emulation.Consoles.Atari
public TIA(MOS6502 cpu, int[] frameBuffer)
{
Cpu = cpu;
scanline = 0;
BKcolor = 0x00;
this.frameBuffer = frameBuffer;
scanlinePos = 0;
frameComplete = false;
}
public void execute(int cycles)
{
// Ignore cycles for now, just do one cycle (three color counts/pixels)
if (scanlinePos < 68)
{
scanlinePos ++;
// HBLANK
return;
}
UInt32 PFmask;
int pixelPos = scanlinePos - 68;
// First half of screen
if (pixelPos < 80)
{
PFmask = (UInt32)(1 << ((20-1) - (byte)((pixelPos % 80) / 4)));
}
// Second half
else
{
PFmask = (UInt32)(1 << ((byte)((pixelPos % 80) / 4)));
}
UInt32 color;
if ((PF & PFmask) != 0)
{
color = palette[PFcolor];
}
else
{
color = palette[BKcolor];
}
scanline[pixelPos] = color;
scanlinePos++;
if (scanlinePos >= 228)
{
scanlinesBuffer.Add(scanline);
scanline = new uint[160];
}
scanlinePos %= 228;
}
public void outputFrame()
{
for (int row = 0; row < 262; row++)
{
for (int col = 0; col < 320; col++)
{
if (scanlinesBuffer.Count != null && scanlinesBuffer.Count > row)
{
frameBuffer[row * 320 + col] = (int)(scanlinesBuffer[row][col / 2]);
}
else
{
frameBuffer[row * 320 + col] = 0x000000;
}
}
}
}
public byte ReadMemory(ushort addr)
@ -75,6 +150,11 @@ namespace BizHawk.Emulation.Consoles.Atari
if ((value & 0x02) != 0)
{
Console.WriteLine("TIA VSYNC On");
// Frame is complete, output to buffer
outputFrame();
scanlinesBuffer.Clear();
frameComplete = true;
scanlinePos = 0;
}
else
{
@ -86,41 +166,20 @@ namespace BizHawk.Emulation.Consoles.Atari
if ((value & 0x02) != 0)
{
Console.WriteLine("TIA Vblank On");
scanline = 0;
}
else
{
// With this, the electon beam will turn back on and scan lines will start again
Console.WriteLine("TIA Vblank Off");
}
}
else if (maskedAddr == 0x02) // WSYNC
{
for (int i = 0; i < 320; i++)
{
UInt32 PFmask;
if (i < 160)
{
PFmask = (UInt32)(1 << (20 - (byte)((i % 160) / 8)));
}
else
{
PFmask = (UInt32)(1 << ((byte)((i % 160) / 8)));
}
UInt32 color;
if ((PF & PFmask) != 0)
{
color = palette[PFcolor];
}
else
{
color = palette[BKcolor];
}
frameBuffer[scanline * 320 + i] = (int)color;
}
scanline++;
if (scanline >= 192) { scanline = 0; }
Console.WriteLine("TIA WSYNC");
while (scanlinePos > 0)
{
execute(1);
}
}
else if (maskedAddr == 0x0D) // PF0
{