Commodore 64: Rudimentary savestates.

This commit is contained in:
saxxonpike 2014-10-03 23:22:17 +00:00
parent 2fb95adb1a
commit 01034eb628
7 changed files with 96 additions and 45 deletions

View File

@ -208,49 +208,49 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64
SaveState.SyncObject(ser, this); SaveState.SyncObject(ser, this);
ser.EndSection(); ser.EndSection();
ser.BeginSection("cartridge"); //ser.BeginSection("cartridge");
cartPort.SyncState(ser); //cartPort.SyncState(ser);
ser.EndSection(); //ser.EndSection();
ser.BeginSection("cassette"); //ser.BeginSection("cassette");
cassPort.SyncState(ser); //cassPort.SyncState(ser);
ser.EndSection(); //ser.EndSection();
ser.BeginSection("cia0"); //ser.BeginSection("cia0");
cia0.SyncState(ser); //cia0.SyncState(ser);
ser.EndSection(); //ser.EndSection();
ser.BeginSection("cia1"); //ser.BeginSection("cia1");
cia1.SyncState(ser); //cia1.SyncState(ser);
ser.EndSection(); //ser.EndSection();
ser.BeginSection("colorram"); //ser.BeginSection("colorram");
colorRam.SyncState(ser); //colorRam.SyncState(ser);
ser.EndSection(); //ser.EndSection();
ser.BeginSection("cpu"); //ser.BeginSection("cpu");
cpu.SyncState(ser); //cpu.SyncState(ser);
ser.EndSection(); //ser.EndSection();
ser.BeginSection("pla"); //ser.BeginSection("pla");
pla.SyncState(ser); //pla.SyncState(ser);
ser.EndSection(); //ser.EndSection();
ser.BeginSection("ram"); //ser.BeginSection("ram");
ram.SyncState(ser); //ram.SyncState(ser);
ser.EndSection(); //ser.EndSection();
ser.BeginSection("sid"); //ser.BeginSection("sid");
sid.SyncState(ser); //sid.SyncState(ser);
ser.EndSection(); //ser.EndSection();
ser.BeginSection("user"); //ser.BeginSection("user");
userPort.SyncState(ser); //userPort.SyncState(ser);
ser.EndSection(); //ser.EndSection();
ser.BeginSection("vic"); //ser.BeginSection("vic");
vic.SyncState(ser); //vic.SyncState(ser);
ser.EndSection(); //ser.EndSection();
} }
} }
} }

View File

@ -152,8 +152,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64
public override void SyncState(Serializer ser) public override void SyncState(Serializer ser)
{ {
base.SyncState(ser); base.SyncState(ser);
ser.Sync("bankMask", ref bankMask);
ser.Sync("bankNumber", ref bankNumber);
if (ser.IsReader) if (ser.IsReader)
BankSet(bankNumber); BankSet(bankNumber);
} }

View File

@ -123,8 +123,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64
public override void SyncState(Serializer ser) public override void SyncState(Serializer ser)
{ {
base.SyncState(ser); base.SyncState(ser);
ser.Sync("bankMask", ref bankMask);
ser.Sync("bankNumber", ref bankNumber);
if (ser.IsReader) if (ser.IsReader)
BankSet(bankNumber); BankSet(bankNumber);
} }

View File

@ -73,7 +73,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64
public override void SyncState(Serializer ser) public override void SyncState(Serializer ser)
{ {
base.SyncState(ser); base.SyncState(ser);
ser.Sync("bankIndex", ref bankIndex);
if (ser.IsReader) if (ser.IsReader)
bankHighSelected = bankHigh[bankIndex]; bankHighSelected = bankHigh[bankIndex];
} }

View File

@ -118,9 +118,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64
public override void SyncState(Serializer ser) public override void SyncState(Serializer ser)
{ {
base.SyncState(ser); base.SyncState(ser);
ser.Sync("bankMask", ref bankMask);
ser.Sync("bankNumber", ref bankNumber);
ser.Sync("romEnable", ref romEnable);
if (ser.IsReader) if (ser.IsReader)
BankSet(bankNumber | (romEnable ? 0x00 : 0x80)); BankSet(bankNumber | (romEnable ? 0x00 : 0x80));
} }

View File

@ -81,7 +81,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
public void SyncState(Serializer ser) public void SyncState(Serializer ser)
{ {
SaveState.SyncObject(ser, this); SaveState.SyncObject(ser, this);
cart.SyncState(ser);
} }
} }
} }

View File

@ -1,6 +1,7 @@
using System; using System;
using System.Drawing; using System.Drawing;
using System.Reflection; using System.Reflection;
using System.Text;
using BizHawk.Common; using BizHawk.Common;
@ -8,6 +9,8 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64
{ {
static class SaveState static class SaveState
{ {
static private Encoding encoding = Encoding.Unicode;
static public void SyncObject(Serializer ser, object obj) static public void SyncObject(Serializer ser, object obj)
{ {
BindingFlags defaultFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy; BindingFlags defaultFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy;
@ -67,6 +70,22 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64
ser.Sync(member.Name, ref refBool); ser.Sync(member.Name, ref refBool);
currentValue = refBool; currentValue = refBool;
break; break;
case "Boolean[]":
{
bool[] source = (bool[])currentValue;
refIntBuffer = new IntBuffer(source.Length);
for (int i = 0; i < source.Length; i++)
{
refIntBuffer[i] = source[i] ? -1 : 0;
}
ser.Sync(member.Name, ref refIntBuffer);
for (int i = 0; i < source.Length; i++)
{
source[i] = refIntBuffer[i] != 0;
}
currentValue = source;
}
break;
case "Byte": case "Byte":
refByte = (Byte)currentValue; refByte = (Byte)currentValue;
ser.Sync(member.Name, ref refByte); ser.Sync(member.Name, ref refByte);
@ -82,6 +101,8 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64
ser.Sync(member.Name, ref refByteBuffer); ser.Sync(member.Name, ref refByteBuffer);
currentValue = refByteBuffer; currentValue = refByteBuffer;
break; break;
case "Func`1":
break;
case "Int16": case "Int16":
refInt16 = (Int16)currentValue; refInt16 = (Int16)currentValue;
ser.Sync(member.Name, ref refInt16); ser.Sync(member.Name, ref refInt16);
@ -125,6 +146,14 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64
ser.Sync(member.Name, ref refSByte); ser.Sync(member.Name, ref refSByte);
currentValue = refSByte; currentValue = refSByte;
break; break;
case "String":
{
var refString = (String)currentValue;
var refVal = new ByteBuffer(encoding.GetBytes(refString));
ser.Sync(member.Name, ref refVal);
currentValue = encoding.GetString(refVal.Arr);
}
break;
case "UInt16": case "UInt16":
refUInt16 = (UInt16)currentValue; refUInt16 = (UInt16)currentValue;
ser.Sync(member.Name, ref refUInt16); ser.Sync(member.Name, ref refUInt16);
@ -135,9 +164,40 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64
ser.Sync(member.Name, ref refUInt32); ser.Sync(member.Name, ref refUInt32);
currentValue = refUInt32; currentValue = refUInt32;
break; break;
default: default:
fail = true; {
break; Type t = currentValue.GetType();
if (t.IsEnum)
{
refInt32 = (Int32)currentValue;
ser.Sync(member.Name, ref refInt32);
currentValue = refInt32;
}
else if (t.IsValueType)
{
fail = true;
}
else if (t.IsClass)
{
fail = true;
foreach (var method in t.GetMethods())
{
if (method.Name == "SyncState")
{
ser.BeginSection(fieldInfo.Name);
method.Invoke(currentValue, new object[] {(Serializer)ser});
ser.EndSection();
fail = false;
break;
}
}
}
else
{
fail = true;
}
}
break;
} }
} }