BizHawk/EMU7800/Core/Machine2600.cs

113 lines
3.0 KiB
C#

/*
* Machine2600.cs
*
* The realization of a 2600 machine.
*
* Copyright © 2003, 2004 Mike Murphy
*
*/
namespace EMU7800.Core
{
public class Machine2600 : MachineBase
{
#region Fields
protected TIA TIA { get; set; }
#endregion
public override void Reset()
{
base.Reset();
TIA.Reset();
PIA.Reset();
CPU.Reset();
}
public override void ComputeNextFrame(FrameBuffer frameBuffer)
{
base.ComputeNextFrame(frameBuffer);
TIA.StartFrame();
CPU.RunClocks = (FrameBuffer.Scanlines + 3) * 76;
while (CPU.RunClocks > 0 && !CPU.Jammed)
{
if (TIA.WSYNCDelayClocks > 0)
{
CPU.Clock += (ulong)TIA.WSYNCDelayClocks / 3;
CPU.RunClocks -= TIA.WSYNCDelayClocks / 3;
TIA.WSYNCDelayClocks = 0;
}
if (TIA.EndOfFrame)
{
break;
}
CPU.Execute();
}
TIA.EndFrame();
}
public Machine2600(Cart cart, ILogger logger, int slines, int startl, int fHZ, int sRate, int[] p)
: base(logger, slines, startl, fHZ, sRate, p, 160)
{
Mem = new AddressSpace(this, 13, 6); // 2600: 13bit, 64byte pages
CPU = new M6502(this, 1);
TIA = new TIA(this);
for (ushort i = 0; i < 0x1000; i += 0x100)
{
Mem.Map(i, 0x0080, TIA);
}
PIA = new PIA(this);
for (ushort i = 0x0080; i < 0x1000; i += 0x100)
{
Mem.Map(i, 0x0080, PIA);
}
Cart = cart;
Mem.Map(0x1000, 0x1000, Cart);
}
#region Serialization Members
public Machine2600(DeserializationContext input, int[] palette) : base(input, palette)
{
input.CheckVersion(1);
Mem = input.ReadAddressSpace(this, 13, 6); // 2600: 13bit, 64byte pages
CPU = input.ReadM6502(this, 1);
TIA = input.ReadTIA(this);
for (ushort i = 0; i < 0x1000; i += 0x100)
{
Mem.Map(i, 0x0080, TIA);
}
PIA = input.ReadPIA(this);
for (ushort i = 0x0080; i < 0x1000; i += 0x100)
{
Mem.Map(i, 0x0080, PIA);
}
Cart = input.ReadCart(this);
Mem.Map(0x1000, 0x1000, Cart);
}
public override void GetObjectData(SerializationContext output)
{
base.GetObjectData(output);
output.WriteVersion(1);
output.Write(Mem);
output.Write(CPU);
output.Write(TIA);
output.Write(PIA);
output.Write(Cart);
}
#endregion
}
}