very preliminary genesis savestate support

This commit is contained in:
beirich 2012-05-22 02:25:41 +00:00
parent 2aef2b8606
commit db1bfcfdfc
2 changed files with 91 additions and 11 deletions

View File

@ -1,4 +1,6 @@
using System;
using System.IO;
using System.Globalization;
namespace BizHawk.Emulation.Consoles.Sega
{
@ -137,7 +139,7 @@ namespace BizHawk.Emulation.Consoles.Sega
VdpDataAddr += Registers[0x0F];
break;
default:
Console.WriteLine("VDP DATA WRITE WITH UNHANDLED CODE!!!");
//Console.WriteLine("VDP DATA WRITE WITH UNHANDLED CODE!!!");
break;
}
}
@ -326,5 +328,51 @@ namespace BizHawk.Emulation.Consoles.Sega
{
get { return Palette[Registers[7] & 0x3F]; }
}
public void SaveStateText(TextWriter writer)
{
writer.WriteLine("[VDP]");
writer.Write("VRAM ");
VRAM.SaveAsHex(writer);
writer.Write("CRAM ");
CRAM.SaveAsHex(writer);
writer.Write("VSRAM ");
VSRAM.SaveAsHex(writer);
writer.Write("Registers ");
Registers.SaveAsHex(writer);
writer.WriteLine("ControlWordPending {0}", ControlWordPending);
writer.WriteLine("DmaFillModePending {0}", DmaFillModePending);
writer.WriteLine("VdpDataAddr {0:X4}", VdpDataAddr);
writer.WriteLine("VdpDataCode {0}", VdpDataCode);
writer.WriteLine("[/VDP]");
}
public void LoadStateText(TextReader reader)
{
while (true)
{
string[] args = reader.ReadLine().Split(' ');
if (args[0].Trim() == "") continue;
if (args[0] == "[/VDP]") break;
else if (args[0] == "VRAM") VRAM.ReadFromHex(args[1]);
else if (args[0] == "CRAM") CRAM.ReadFromHex(args[1]);
else if (args[0] == "VSRAM") VSRAM.ReadFromHex(args[1]);
else if (args[0] == "Registers") Registers.ReadFromHex(args[1]);
else if (args[0] == "ControlWordPending") ControlWordPending = bool.Parse(args[1]);
else if (args[0] == "DmaFillModePending") DmaFillModePending = bool.Parse(args[1]);
else if (args[0] == "VdpDataAddr") VdpDataAddr = ushort.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "VdpDataCode") VdpDataCode = byte.Parse(args[1]);
else
Console.WriteLine("Skipping unrecognized identifier " + args[0]);
}
for (int i = 0; i < CRAM.Length; i++)
ProcessPalette(i);
for (int i = 0; i < VRAM.Length; i++)
UpdatePatternBuffer(i);
}
}
}

View File

@ -174,24 +174,56 @@ namespace BizHawk.Emulation.Consoles.Sega
}
}
public void SaveStateText(TextWriter writer)
{
throw new NotImplementedException();
}
public void SaveStateText(TextWriter writer)
{
writer.WriteLine("[MegaDrive]");
MainCPU.SaveStateText(writer, "Main68K");
SoundCPU.SaveStateText(writer);
PSG.SaveStateText(writer);
VDP.SaveStateText(writer);
public void LoadStateText(TextReader reader)
{
throw new NotImplementedException();
}
writer.Write("MainRAM ");
Ram.SaveAsHex(writer);
writer.Write("Z80RAM ");
Z80Ram.SaveAsHex(writer);
writer.WriteLine("[/MegaDrive]");
}
public void LoadStateText(TextReader reader)
{
while (true)
{
string[] args = reader.ReadLine().Split(' ');
if (args[0].Trim() == "") continue;
if (args[0] == "[MegaDrive]") continue;
if (args[0] == "[/MegaDrive]") break;
if (args[0] == "MainRAM")
Ram.ReadFromHex(args[1]);
else if (args[0] == "Z80RAM")
Z80Ram.ReadFromHex(args[1]);
else if (args[0] == "[Main68K]")
MainCPU.LoadStateText(reader, "Main68K");
else if (args[0] == "[Z80]")
SoundCPU.LoadStateText(reader);
else if (args[0] == "[PSG]")
PSG.LoadStateText(reader);
else if (args[0] == "[VDP]")
VDP.LoadStateText(reader);
else
Console.WriteLine("Skipping unrecognized identifier " + args[0]);
}
}
public void SaveStateBinary(BinaryWriter writer)
{
throw new NotImplementedException();
//throw new NotImplementedException();
}
public void LoadStateBinary(BinaryReader reader)
{
throw new NotImplementedException();
//throw new NotImplementedException();
}
public byte[] SaveStateBinary()