commodore64: add VIC chip savestate code (not connected)

This commit is contained in:
saxxonpike 2012-11-20 03:45:58 +00:00
parent 6bb3f7d39e
commit dab0a0dd38
3 changed files with 243 additions and 0 deletions

View File

@ -108,6 +108,7 @@
<Compile Include="Computers\Commodore64\VicIINewPipeline.cs" />
<Compile Include="Computers\Commodore64\VicIINewVideoProvider.cs" />
<Compile Include="Computers\Commodore64\VicIIRegs.cs" />
<Compile Include="Computers\Commodore64\VicState.cs" />
<Compile Include="Consoles\Atari\2600\Atari2600.cs" />
<Compile Include="Consoles\Atari\2600\Atari2600.Core.cs" />
<Compile Include="Consoles\Atari\2600\Mappers\m3Fe.cs" />

View File

@ -149,6 +149,26 @@ namespace BizHawk.Emulation.Computers.Commodore64
val = this[key] != 0;
}
public void Load(string key, out byte[] val, int length)
{
byte[] result = new byte[length];
for (int i = 0; i < length; i++)
{
result[i] = (byte)(this[key + i.ToString()] & 0xFF);
}
val = result;
}
public void Load(string key, out int[] val, int length)
{
int[] result = new int[length];
for (int i = 0; i < length; i++)
{
result[i] = (int)(this[key + i.ToString()] & 0xFF);
}
val = result;
}
public void Save(string key, byte val)
{
this[key] = (int)val;
@ -163,5 +183,21 @@ namespace BizHawk.Emulation.Computers.Commodore64
{
this[key] = val ? 1 : 0;
}
public void Save(string key, byte[] val, int length)
{
for (int i = 0; i < length; i++)
{
this[key + i.ToString()] = val[i];
}
}
public void Save(string key, int[] val, int length)
{
for (int i = 0; i < length; i++)
{
this[key + i.ToString()] = (int)val[i];
}
}
}
}

View File

@ -0,0 +1,206 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Computers.Commodore64
{
public partial class VicIINew : IVideoProvider
{
public StateParameters State
{
get
{
StateParameters result = new StateParameters();
// internal
result.Save("RC", RC);
result.Save("VC", VC);
result.Save("VCBASE", VCBASE);
result.Save("VMLI", VMLI);
// external
result.Save("BMM", BMM);
result.Save("BxC", BxC, BxC.Length);
result.Save("CB", CB);
result.Save("CSEL", CSEL);
result.Save("DEN", DEN);
result.Save("EC", EC);
result.Save("ECM", ECM);
result.Save("ELP", ELP);
result.Save("EMBC", EMBC);
result.Save("EMMC", EMMC);
result.Save("ERST", ERST);
result.Save("ILP", ILP);
result.Save("IMBC", IMBC);
result.Save("IMMC", IMMC);
result.Save("IRQ", IRQ);
result.Save("IRST", IRST);
result.Save("LPX", LPX);
result.Save("LPY", LPY);
result.Save("MCM", MCM);
result.Save("MMx", MMx, MMx.Length);
result.Save("RASTER", RASTER);
result.Save("RES", RES);
result.Save("RSEL", RSEL);
result.Save("VM", VM);
result.Save("XSCROLL", XSCROLL);
result.Save("YSCROLL", YSCROLL);
// state
result.Save("BADLINE", badline);
result.Save("BITMAPCOLUMN", bitmapColumn);
result.Save("BITMAPDATA", bitmapData);
result.Save("BORDERONMAIN", borderOnMain);
result.Save("BORDERONVERTICAL", borderOnVertical);
result.Save("CENTERENABLED", centerEnabled);
result.Save("CHARACTERDATA", characterData);
result.Save("CHARACTERDATABUS", characterDataBus);
result.Save("CHARMEM", characterMemory, characterMemory.Length);
result.Save("COLORDATA", colorData);
result.Save("COLORDATABUS", colorDataBus);
result.Save("COLORMEM", colorMemory, colorMemory.Length);
result.Save("DISPLAYENABLED", displayEnabled);
result.Save("IDLE", idle);
result.Save("PLOTTERBUFFERINDEX", plotterBufferIndex);
result.Save("PLOTTERDATA", plotterData);
result.Save("PLOTTERDATABUFFER", plotterDataBuffer, plotterDataBuffer.Length);
result.Save("PLOTTERDELAY", plotterDelay);
result.Save("PLOTTERPIXEL", plotterPixel);
result.Save("PLOTTERPIXELBUFFER", plotterPixelBuffer, plotterPixelBuffer.Length);
result.Save("RASTERINTERRUPTLINE", rasterInterruptLine);
result.Save("RASTERX", rasterX);
result.Save("REFRESHADDRESS", refreshAddress);
// pipeline
result.Save("CYCLE", cycle);
result.Save("PIPELINEGACCESS", pipelineGAccess);
result.Save("PIPELINEMEMORYBUSY", pipelineMemoryBusy);
// sprites
for (int i = 0; i < 8; i++)
{
string iTag = i.ToString();
result.Save("MC" + iTag, sprites[i].MC);
result.Save("MCBASE" + iTag, sprites[i].MCBASE);
result.Save("MD" + iTag, sprites[i].MD);
result.Save("MDMA" + iTag, sprites[i].MDMA);
result.Save("MPTR" + iTag, sprites[i].MPTR);
result.Save("MSR" + iTag, sprites[i].MSR);
result.Save("MxXEToggle" + iTag, sprites[i].MxXEToggle);
result.Save("MxYEToggle" + iTag, sprites[i].MxYEToggle);
result.Save("MxC" + iTag, sprites[i].MxC);
result.Save("MxD" + iTag, sprites[i].MxD);
result.Save("MxDP" + iTag, sprites[i].MxDP);
result.Save("MxE" + iTag, sprites[i].MxE);
result.Save("MxM" + iTag, sprites[i].MxM);
result.Save("MxMC" + iTag, sprites[i].MxMC);
result.Save("MxX" + iTag, sprites[i].MxX);
result.Save("MxXE" + iTag, sprites[i].MxXE);
result.Save("MxY" + iTag, sprites[i].MxY);
result.Save("MxYE" + iTag, sprites[i].MxYE);
}
return result;
}
set
{
StateParameters result = value;
// internal
result.Load("RC", out RC);
result.Load("VC", out VC);
result.Load("VCBASE", out VCBASE);
result.Load("VMLI", out VMLI);
// external
result.Load("BMM", out BMM);
result.Load("BxC", out BxC, BxC.Length);
result.Load("CB", out CB);
result.Load("CSEL", out CSEL);
result.Load("DEN", out DEN);
result.Load("EC", out EC);
result.Load("ECM", out ECM);
result.Load("ELP", out ELP);
result.Load("EMBC", out EMBC);
result.Load("EMMC", out EMMC);
result.Load("ERST", out ERST);
result.Load("ILP", out ILP);
result.Load("IMBC", out IMBC);
result.Load("IMMC", out IMMC);
result.Load("IRQ", out IRQ);
result.Load("IRST", out IRST);
result.Load("LPX", out LPX);
result.Load("LPY", out LPY);
result.Load("MCM", out MCM);
result.Load("MMx", out MMx, MMx.Length);
result.Load("RASTER", out RASTER);
result.Load("RES", out RES);
result.Load("RSEL", out RSEL);
result.Load("VM", out VM);
result.Load("XSCROLL", out XSCROLL);
result.Load("YSCROLL", out YSCROLL);
// state
result.Load("BADLINE", out badline);
result.Load("BITMAPCOLUMN", out bitmapColumn);
result.Load("BITMAPDATA", out bitmapData);
result.Load("BORDERONMAIN", out borderOnMain);
result.Load("BORDERONVERTICAL", out borderOnVertical);
result.Load("CENTERENABLED", out centerEnabled);
result.Load("CHARACTERDATA", out characterData);
result.Load("CHARACTERDATABUS", out characterDataBus);
result.Load("CHARMEM", out characterMemory, characterMemory.Length);
result.Load("COLORDATA", out colorData);
result.Load("COLORDATABUS", out colorDataBus);
result.Load("COLORMEM", out colorMemory, colorMemory.Length);
result.Load("DISPLAYENABLED", out displayEnabled);
result.Load("IDLE", out idle);
result.Load("PLOTTERBUFFERINDEX", out plotterBufferIndex);
result.Load("PLOTTERDATA", out plotterData);
result.Load("PLOTTERDATABUFFER", out plotterDataBuffer, plotterDataBuffer.Length);
result.Load("PLOTTERDELAY", out plotterDelay);
result.Load("PLOTTERPIXEL", out plotterPixel);
result.Load("PLOTTERPIXELBUFFER", out plotterPixelBuffer, plotterPixelBuffer.Length);
result.Load("RASTERINTERRUPTLINE", out rasterInterruptLine);
result.Load("RASTERX", out rasterX);
result.Load("REFRESHADDRESS", out refreshAddress);
// pipeline
result.Load("CYCLE", out cycle);
result.Load("PIPELINEGACCESS", out pipelineGAccess);
result.Load("PIPELINEMEMORYBUSY", out pipelineMemoryBusy);
// sprites
for (int i = 0; i < 8; i++)
{
string iTag = i.ToString();
result.Load("MC" + iTag, out sprites[i].MC);
result.Load("MCBASE" + iTag, out sprites[i].MCBASE);
result.Load("MD" + iTag, out sprites[i].MD);
result.Load("MDMA" + iTag, out sprites[i].MDMA);
result.Load("MPTR" + iTag, out sprites[i].MPTR);
result.Load("MSR" + iTag, out sprites[i].MSR);
result.Load("MxXEToggle" + iTag, out sprites[i].MxXEToggle);
result.Load("MxYEToggle" + iTag, out sprites[i].MxYEToggle);
result.Load("MxC" + iTag, out sprites[i].MxC);
result.Load("MxD" + iTag, out sprites[i].MxD);
result.Load("MxDP" + iTag, out sprites[i].MxDP);
result.Load("MxE" + iTag, out sprites[i].MxE);
result.Load("MxM" + iTag, out sprites[i].MxM);
result.Load("MxMC" + iTag, out sprites[i].MxMC);
result.Load("MxX" + iTag, out sprites[i].MxX);
result.Load("MxXE" + iTag, out sprites[i].MxXE);
result.Load("MxY" + iTag, out sprites[i].MxY);
result.Load("MxYE" + iTag, out sprites[i].MxYE);
}
UpdateInterrupts();
UpdateBorder();
UpdatePlotter();
}
}
}
}