BizHawk/BizHawk.Emulation/Computers/Commodore64/C64.cs

183 lines
5.2 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace BizHawk.Emulation.Computers.Commodore64
{
public partial class C64 : IEmulator
{
2012-11-01 17:56:48 +00:00
public C64(GameInfo game, byte[] rom, string romextension)
{
2012-11-03 06:03:58 +00:00
inputFile = rom;
SetupMemoryDomains();
CoreOutputComm = new CoreOutputComm();
CoreInputComm = new CoreInputComm();
HardReset();
videoProvider = new MyVideoProvider(vic);
}
public string SystemId { get { return "C64"; } }
public GameInfo game;
public CoreInputComm CoreInputComm { get; set; }
public CoreOutputComm CoreOutputComm { get; private set; }
private IList<MemoryDomain> memoryDomains;
public IList<MemoryDomain> MemoryDomains { get { return memoryDomains; } }
public MemoryDomain MainMemory { get { return memoryDomains[0]; } }
public int Frame { get { return _frame; } set { _frame = value; } }
public int LagCount { get { return _lagcount; } set { _lagcount = value; } }
public bool IsLagFrame { get { return _islag; } }
private bool _islag = true;
private int _lagcount = 0;
private int _frame = 0;
public byte[] ReadSaveRam() { return null; }
public void StoreSaveRam(byte[] data) { }
public void ClearSaveRam() { }
public bool SaveRamModified { get; set; }
public void Dispose() { }
public IVideoProvider VideoProvider { get { return videoProvider; } }
public ISoundProvider SoundProvider { get { return soundProvider; } }
public void ResetFrameCounter()
{
_frame = 0;
}
/*TODO*/
public ISyncSoundProvider SyncSoundProvider { get { return null; } } //TODO
public bool StartAsyncSound() { return true; } //TODO
public void EndAsyncSound() { } //TODO
public bool DeterministicEmulation { get; set; } //TODO
public void SaveStateText(TextWriter writer) { } //TODO
public void LoadStateText(TextReader reader) { } //TODO
public void SaveStateBinary(BinaryWriter bw) { } //TODO
public void LoadStateBinary(BinaryReader br) { } //TODO
public ControllerDefinition ControllerDefinition { get { return Atari7800ControllerDefinition; } }
public IController Controller { get; set; }
public static readonly ControllerDefinition Atari7800ControllerDefinition = new ControllerDefinition
{
2012-11-03 06:03:58 +00:00
Name = "Commodore 64 Controller", //TODO
BoolButtons =
{
2012-11-03 06:03:58 +00:00
"P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 Button",
"P2 Up", "P2 Down", "P2 Left", "P2 Right", "P2 Button"
}
};
class MySoundProvider : ISoundProvider
{
Atari7800 emu;
public MySoundProvider(Atari7800 emu)
{
this.emu = emu;
}
public int MaxVolume { get { return 0; } set { } }
public void DiscardSamples()
{
}
public void GetSamples(short[] samples)
{
}
}
public void FrameAdvance(bool render, bool rendersound)
{
_frame++;
_islag = true;
2012-11-03 06:03:58 +00:00
int cyclesPerSecond = (14318181 / 14 / 60);
for (int i = 0; i < cyclesPerSecond; i++)
{
if (vicSignal.Interrupt || cia1.interrupt || cia2.interrupt)
2012-11-03 06:03:58 +00:00
{
cpu.IRQ = true;
}
if (vicSignal.AllowCpu)
{
cpu.ExecuteOne();
}
vic.PerformCycle();
sid.PerformCycle();
cia1.PerformCycle();
cia2.PerformCycle();
}
if (_islag)
{
LagCount++;
}
videoProvider.FillFrameBuffer();
}
/*******************************/
private MySoundProvider soundProvider;
private MyVideoProvider videoProvider;
2012-11-03 06:03:58 +00:00
class MyVideoProvider : IVideoProvider
{
2012-11-03 06:03:58 +00:00
public int top;
public int bottom;
public int left;
public int right;
2012-11-03 06:03:58 +00:00
VicII vic;
public MyVideoProvider(VicII vic)
{
2012-11-03 06:03:58 +00:00
this.vic = vic;
buffer = new int[vic.visibleWidth * vic.visibleHeight];
2012-11-03 06:03:58 +00:00
top = 0;
bottom = vic.visibleHeight - 1;
2012-11-03 06:03:58 +00:00
left = 0;
right = vic.visibleWidth - 1;
}
2012-11-03 06:03:58 +00:00
int[] buffer;
public void FillFrameBuffer()
{
2012-11-03 06:03:58 +00:00
Array.Copy(vic.buffer, buffer, buffer.Length);
}
public int[] GetVideoBuffer()
{
return buffer;
}
public int VirtualWidth { get { return BufferWidth; } }
public int BufferWidth { get { return right - left + 1; } }
public int BufferHeight { get { return bottom - top + 1; } }
public int BackgroundColor { get { return 0; } }
}
private void SetupMemoryDomains()
{
var domains = new List<MemoryDomain>(1);
2012-11-03 06:03:58 +00:00
domains.Add(new MemoryDomain("RAM", 0x10000, Endian.Little, new Func<int, byte>(PeekMemoryInt), new Action<int,byte>(PokeMemoryInt))); //TODO
memoryDomains = domains.AsReadOnly();
}
public byte[] SaveStateBinary()
{
MemoryStream ms = new MemoryStream();
BinaryWriter bw = new BinaryWriter(ms);
SaveStateBinary(bw);
bw.Flush();
return ms.ToArray();
}
void SyncState(Serializer ser) //TODO
{
ser.Sync("Lag", ref _lagcount);
ser.Sync("Frame", ref _frame);
ser.Sync("IsLag", ref _islag);
}
}
}