PCE: convert states to Serializer implementation

This commit is contained in:
beirich 2014-04-07 04:53:18 +00:00
parent d02eab8c2d
commit 8363d66f25
10 changed files with 322 additions and 1282 deletions

View File

@ -214,147 +214,35 @@ namespace BizHawk.Emulation.Common.Components
}
}
public void SaveStateText(TextWriter writer)
public void SyncState(Serializer ser)
{
writer.WriteLine("[PSG]");
writer.WriteLine("MainVolumeLeft {0:X2}", MainVolumeLeft);
writer.WriteLine("MainVolumeRight {0:X2}", MainVolumeRight);
writer.WriteLine("VoiceLatch {0}", VoiceLatch);
writer.WriteLine("WaveTableWriteOffset {0:X2}", WaveTableWriteOffset);
writer.WriteLine();
ser.BeginSection("PSG");
ser.Sync("MainVolumeLeft", ref MainVolumeLeft);
ser.Sync("MainVolumeRight", ref MainVolumeRight);
ser.Sync("VoiceLatch", ref VoiceLatch);
ser.Sync("WaveTableWriteOffset", ref WaveTableWriteOffset);
for (int i = 0; i < 6; i++)
{
writer.WriteLine("[Channel{0}]", i + 1);
writer.WriteLine("Frequency {0:X4}", Channels[i].Frequency);
writer.WriteLine("Panning {0:X2}", Channels[i].Panning);
writer.WriteLine("Volume {0:X2}", Channels[i].Volume);
writer.WriteLine("Enabled {0}", Channels[i].Enabled);
ser.BeginSection("Channel"+i);
ser.Sync("Frequency", ref Channels[i].Frequency);
ser.Sync("Panning", ref Channels[i].Panning);
ser.Sync("Volume", ref Channels[i].Volume);
ser.Sync("Enabled", ref Channels[i].Enabled);
if (i.In(4, 5))
{
writer.WriteLine("NoiseChannel {0}", Channels[i].NoiseChannel);
writer.WriteLine("NoiseFreq {0:X4}", Channels[i].NoiseFreq);
ser.Sync("NoiseChannel", ref Channels[i].NoiseChannel);
ser.Sync("NoiseFreq", ref Channels[i].NoiseFreq);
}
writer.WriteLine("DDA {0}", Channels[i].DDA);
writer.WriteLine("DDAValue {0:X4}", Channels[i].DDAValue);
writer.WriteLine("SampleOffset {0}", Channels[i].SampleOffset);
writer.Write("Wave ");
Channels[i].Wave.SaveAsHex(writer);
writer.WriteLine("[/Channel{0}]\n", i + 1);
ser.Sync("DDA", ref Channels[i].DDA);
ser.Sync("DDAValue", ref Channels[i].DDAValue);
ser.Sync("SampleOffset", ref Channels[i].SampleOffset);
ser.Sync("Wave", ref Channels[i].Wave, false);
ser.EndSection();
}
writer.WriteLine("[/PSG]\n");
}
public void LoadStateText(TextReader reader)
{
while (true)
{
string[] args = reader.ReadLine().Split(' ');
if (args[0].Trim() == "") continue;
if (args[0] == "[/PSG]") break;
if (args[0] == "MainVolumeLeft")
MainVolumeLeft = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "MainVolumeRight")
MainVolumeRight = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "VoiceLatch")
VoiceLatch = byte.Parse(args[1]);
else if (args[0] == "WaveTableWriteOffset")
WaveTableWriteOffset = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "[Channel1]")
LoadChannelStateText(reader, 0);
else if (args[0] == "[Channel2]")
LoadChannelStateText(reader, 1);
else if (args[0] == "[Channel3]")
LoadChannelStateText(reader, 2);
else if (args[0] == "[Channel4]")
LoadChannelStateText(reader, 3);
else if (args[0] == "[Channel5]")
LoadChannelStateText(reader, 4);
else if (args[0] == "[Channel6]")
LoadChannelStateText(reader, 5);
else
Console.WriteLine("Skipping unrecognized identifier " + args[0]);
}
}
void LoadChannelStateText(TextReader reader, int channel)
{
while (true)
{
string[] args = reader.ReadLine().Split(' ');
if (args[0].Trim() == "") continue;
if (args[0] == "[/Channel" + (channel + 1) + "]") break;
if (args[0] == "Frequency")
Channels[channel].Frequency = ushort.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "Panning")
Channels[channel].Panning = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "Volume")
Channels[channel].Volume = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "Enabled")
Channels[channel].Enabled = bool.Parse(args[1]);
else if (args[0] == "NoiseChannel")
Channels[channel].NoiseChannel = bool.Parse(args[1]);
else if (args[0] == "NoiseFreq")
Channels[channel].NoiseFreq = ushort.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "DDA")
Channels[channel].DDA = bool.Parse(args[1]);
else if (args[0] == "DDAValue")
Channels[channel].DDAValue = short.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "SampleOffset")
Channels[channel].SampleOffset = float.Parse(args[1]);
else if (args[0] == "Wave")
Channels[channel].Wave.ReadFromHex(args[1]);
else
Console.WriteLine("Skipping unrecognized identifier " + args[0]);
}
}
public void SaveStateBinary(BinaryWriter writer)
{
writer.Write(MainVolumeLeft);
writer.Write(MainVolumeRight);
writer.Write(VoiceLatch);
writer.Write(WaveTableWriteOffset);
for (int i = 0; i < 6; i++)
{
writer.Write(Channels[i].Frequency);
writer.Write(Channels[i].Panning);
writer.Write(Channels[i].Volume);
writer.Write(Channels[i].Enabled);
writer.Write(Channels[i].NoiseChannel);
writer.Write(Channels[i].NoiseFreq);
writer.Write(Channels[i].DDA);
writer.Write(Channels[i].DDAValue);
writer.Write(Channels[i].SampleOffset);
for (int j = 0; j < 32; j++)
writer.Write(Channels[i].Wave[j]);
}
}
public void LoadStateBinary(BinaryReader reader)
{
MainVolumeLeft = reader.ReadByte();
MainVolumeRight = reader.ReadByte();
VoiceLatch = reader.ReadByte();
WaveTableWriteOffset = reader.ReadByte();
for (int i = 0; i < 6; i++)
{
Channels[i].Frequency = reader.ReadUInt16();
Channels[i].Panning = reader.ReadByte();
Channels[i].Volume = reader.ReadByte();
Channels[i].Enabled = reader.ReadBoolean();
Channels[i].NoiseChannel = reader.ReadBoolean();
Channels[i].NoiseFreq = reader.ReadUInt16();
Channels[i].DDA = reader.ReadBoolean();
Channels[i].DDAValue = reader.ReadInt16();
Channels[i].SampleOffset = reader.ReadSingle();
for (int j = 0; j < 32; j++)
Channels[i].Wave[j] = reader.ReadInt16();
}
ser.EndSection();
}
class QueuedCommand

View File

@ -68,160 +68,35 @@ namespace BizHawk.Emulation.Cores.Components.H6280
public byte TimerValue;
public bool TimerEnabled;
public void SaveStateText(TextWriter writer)
public void SyncState(Serializer ser)
{
writer.WriteLine("[HuC6280]");
writer.WriteLine("A {0:X2}", A);
writer.WriteLine("X {0:X2}", X);
writer.WriteLine("Y {0:X2}", Y);
writer.WriteLine("P {0:X2}", P);
writer.WriteLine("PC {0:X4}", PC);
writer.WriteLine("S {0:X2}", S);
writer.Write("MPR ");
MPR.SaveAsHex(writer);
writer.WriteLine("LagIFlag {0}", LagIFlag);
writer.WriteLine("IRQ1Assert {0}", IRQ1Assert);
writer.WriteLine("IRQ2Assert {0}", IRQ2Assert);
writer.WriteLine("TimerAssert {0}", TimerAssert);
writer.WriteLine("IRQControlByte {0:X2}", IRQControlByte);
writer.WriteLine("IRQNextControlByte {0:X2}", IRQNextControlByte);
writer.WriteLine("ExecutedCycles {0}", TotalExecutedCycles);
writer.WriteLine("PendingCycles {0}", PendingCycles);
writer.WriteLine("LowSpeed {0}", LowSpeed);
writer.WriteLine("TimerTickCounter {0}", TimerTickCounter);
writer.WriteLine("TimerReloadValue {0}", TimerReloadValue);
writer.WriteLine("TimerValue {0}", TimerValue);
writer.WriteLine("TimerEnabled {0}", TimerEnabled);
writer.WriteLine("InBlockTransfer {0}", InBlockTransfer);
writer.WriteLine("BTFrom {0}", btFrom);
writer.WriteLine("BTTo {0}", btTo);
writer.WriteLine("BTLen {0}", btLen);
writer.WriteLine("BTAlternator {0}", btAlternator);
writer.WriteLine("[/HuC6280]\n");
}
public void LoadStateText(TextReader reader)
{
while (true)
{
string[] args = reader.ReadLine().Split(' ');
if (args[0].Trim() == "") continue;
if (args[0] == "[/HuC6280]") break;
if (args[0] == "A")
A = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "X")
X = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "Y")
Y = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "P")
P = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "PC")
PC = ushort.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "S")
S = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "MPR")
MPR.ReadFromHex(args[1]);
else if (args[0] == "LagIFlag")
LagIFlag = bool.Parse(args[1]);
else if (args[0] == "IRQ1Assert")
IRQ1Assert = bool.Parse(args[1]);
else if (args[0] == "IRQ2Assert")
IRQ2Assert = bool.Parse(args[1]);
else if (args[0] == "TimerAssert")
TimerAssert = bool.Parse(args[1]);
else if (args[0] == "IRQControlByte")
IRQControlByte = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "IRQNextControlByte")
IRQNextControlByte = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "ExecutedCycles")
TotalExecutedCycles = long.Parse(args[1]);
else if (args[0] == "PendingCycles")
PendingCycles = int.Parse(args[1]);
else if (args[0] == "LowSpeed")
LowSpeed = bool.Parse(args[1]);
else if (args[0] == "TimerTickCounter")
TimerTickCounter = int.Parse(args[1]);
else if (args[0] == "TimerReloadValue")
TimerReloadValue = byte.Parse(args[1]);
else if (args[0] == "TimerValue")
TimerValue = byte.Parse(args[1]);
else if (args[0] == "TimerEnabled")
TimerEnabled = bool.Parse(args[1]);
else if (args[0] == "InBlockTransfer")
InBlockTransfer = bool.Parse(args[1]);
else if (args[0] == "BTFrom")
btFrom = ushort.Parse(args[1]);
else if (args[0] == "BTTo")
btTo = ushort.Parse(args[1]);
else if (args[0] == "BTLen")
btLen = ushort.Parse(args[1]);
else if (args[0] == "BTAlternator")
btAlternator = int.Parse(args[1]);
else
Console.WriteLine("Skipping unrecognized identifier " + args[0]);
}
}
public void SaveStateBinary(BinaryWriter writer)
{
writer.Write(A);
writer.Write(X);
writer.Write(Y);
writer.Write(P);
writer.Write(PC);
writer.Write(S);
writer.Write(MPR);
writer.Write(LagIFlag);
writer.Write(IRQ1Assert);
writer.Write(IRQ2Assert);
writer.Write(TimerAssert);
writer.Write(IRQControlByte);
writer.Write(IRQNextControlByte);
writer.Write(TotalExecutedCycles);
writer.Write(PendingCycles);
writer.Write(LowSpeed);
writer.Write(TimerTickCounter);
writer.Write(TimerReloadValue);
writer.Write(TimerValue);
writer.Write(TimerEnabled);
writer.Write(InBlockTransfer);
writer.Write(btFrom);
writer.Write(btTo);
writer.Write(btLen);
writer.Write((byte)btAlternator);
}
public void LoadStateBinary(BinaryReader reader)
{
A = reader.ReadByte();
X = reader.ReadByte();
Y = reader.ReadByte();
P = reader.ReadByte();
PC = reader.ReadUInt16();
S = reader.ReadByte();
MPR = reader.ReadBytes(8);
LagIFlag = reader.ReadBoolean();
IRQ1Assert = reader.ReadBoolean();
IRQ2Assert = reader.ReadBoolean();
TimerAssert = reader.ReadBoolean();
IRQControlByte = reader.ReadByte();
IRQNextControlByte = reader.ReadByte();
TotalExecutedCycles = reader.ReadInt64();
PendingCycles = reader.ReadInt32();
LowSpeed = reader.ReadBoolean();
TimerTickCounter = reader.ReadInt32();
TimerReloadValue = reader.ReadByte();
TimerValue = reader.ReadByte();
TimerEnabled = reader.ReadBoolean();
InBlockTransfer = reader.ReadBoolean();
btFrom = reader.ReadUInt16();
btTo = reader.ReadUInt16();
btLen = reader.ReadUInt16();
btAlternator = reader.ReadByte();
ser.BeginSection("HuC6280");
ser.Sync("A", ref A);
ser.Sync("X", ref X);
ser.Sync("Y", ref Y);
ser.Sync("P", ref P);
ser.Sync("PC", ref PC);
ser.Sync("S", ref S);
ser.Sync("MPR", ref MPR, false);
ser.Sync("LagIFlag", ref LagIFlag);
ser.Sync("IRQ1Assert", ref IRQ1Assert);
ser.Sync("IRQ2Assert", ref IRQ2Assert);
ser.Sync("TimerAssert", ref TimerAssert);
ser.Sync("IRQControlByte", ref IRQControlByte);
ser.Sync("IRQNextControlByte", ref IRQNextControlByte);
ser.Sync("ExecutedCycles", ref TotalExecutedCycles);
ser.Sync("PendingCycles", ref PendingCycles);
ser.Sync("LowSpeed", ref LowSpeed);
ser.Sync("TimerTickCounter", ref TimerTickCounter);
ser.Sync("TimerReloadValue", ref TimerReloadValue);
ser.Sync("TimerValue", ref TimerValue);
ser.Sync("TimerEnabled", ref TimerEnabled);
ser.Sync("InBlockTransfer", ref InBlockTransfer);
ser.Sync("BTFrom", ref btFrom);
ser.Sync("BTTo", ref btTo);
ser.Sync("BTLen", ref btLen);
ser.Sync("BTAlternator", ref btAlternator);
ser.EndSection();
}
// ==== Interrupts ====

View File

@ -28,9 +28,9 @@ namespace BizHawk.Emulation.Cores.PCEngine
// ***************************************************************************
public bool AdpcmIsPlaying { get; private set; }
public bool HalfReached { get; private set; }
public bool EndReached { get; private set; }
public bool AdpcmIsPlaying;
public bool HalfReached;
public bool EndReached;
public bool AdpcmBusyWriting { get { return AdpcmCdDmaRequested; } }
public bool AdpcmBusyReading { get { return ReadPending; } }
public bool AdpcmCdDmaRequested { get { return (Port180B & 3) != 0; } }
@ -321,162 +321,42 @@ namespace BizHawk.Emulation.Cores.PCEngine
// ***************************************************************************
public void SaveStateBinary(BinaryWriter writer)
public void SyncState(Serializer ser)
{
writer.Write(RAM);
writer.Write(IOAddress);
writer.Write(AdpcmLength);
writer.Write(ReadAddress);
writer.Write((byte)ReadTimer);
writer.Write(ReadBuffer);
writer.Write(ReadPending);
writer.Write(WriteAddress);
writer.Write((byte)WriteTimer);
writer.Write(WriteBuffer);
writer.Write(WritePending);
ser.BeginSection("ADPCM");
ser.Sync("RAM", ref RAM, false);
ser.Sync("IOAddress", ref IOAddress);
ser.Sync("AdpcmLength", ref AdpcmLength);
ser.Sync("ReadAddress", ref ReadAddress);
ser.Sync("ReadTimer", ref ReadTimer);
ser.Sync("ReadPending", ref ReadPending);
ser.Sync("WriteAddress", ref WriteAddress);
ser.Sync("WriteTimer", ref WriteTimer);
ser.Sync("WriteBuffer", ref WriteBuffer);
ser.Sync("WritePending", ref WritePending);
writer.Write(Port180B);
writer.Write(Port180D);
writer.Write(Port180E);
ser.Sync("Port180B", ref Port180B);
ser.Sync("Port180D", ref Port180D);
ser.Sync("Port180E", ref port180E);
writer.Write(AdpcmIsPlaying);
writer.Write(HalfReached);
writer.Write(EndReached);
ser.Sync("AdpcmIsPlaying", ref AdpcmIsPlaying);
ser.Sync("HalfReached", ref HalfReached);
ser.Sync("EndReached", ref EndReached);
writer.Write(Playback44khzTimer);
writer.Write((ushort)playingSample);
writer.Write(nextSampleTimer);
writer.Write(nibble);
writer.Write((byte)magnitude);
}
ser.Sync("Playback44khzTimer", ref Playback44khzTimer);
ser.Sync("PlayingSample", ref playingSample);
ser.Sync("NextSampleTimer", ref nextSampleTimer);
ser.Sync("Nibble", ref nibble);
ser.Sync("Magnitude", ref magnitude);
ser.EndSection();
public void LoadStateBinary(BinaryReader reader)
{
RAM = reader.ReadBytes(0x10000);
IOAddress = reader.ReadUInt16();
AdpcmLength = reader.ReadUInt16();
ReadAddress = reader.ReadUInt16();
ReadTimer = reader.ReadByte();
ReadBuffer = reader.ReadByte();
ReadPending = reader.ReadBoolean();
WriteAddress = reader.ReadUInt16();
WriteTimer = reader.ReadByte();
WriteBuffer = reader.ReadByte();
WritePending = reader.ReadBoolean();
Port180B = reader.ReadByte();
Port180D = reader.ReadByte();
Port180E = reader.ReadByte();
AdpcmIsPlaying = reader.ReadBoolean();
HalfReached = reader.ReadBoolean();
EndReached = reader.ReadBoolean();
Playback44khzTimer = reader.ReadSingle();
playingSample = reader.ReadUInt16();
nextSampleTimer = reader.ReadSingle();
nibble = reader.ReadBoolean();
magnitude = reader.ReadByte();
pce.IntADPCM = HalfReached;
pce.IntStop = EndReached;
pce.RefreshIRQ2();
}
public void SaveStateText(TextWriter writer)
{
writer.WriteLine("[ADPCM]");
writer.Write("RAM ");
RAM.SaveAsHex(writer);
writer.WriteLine("IOAddress {0:X4}", IOAddress);
writer.WriteLine("AdpcmLength {0:X4}", AdpcmLength);
writer.WriteLine("ReadAddress {0:X4}", ReadAddress);
writer.WriteLine("ReadTimer {0}", ReadTimer);
writer.WriteLine("ReadBuffer {0:X2}", ReadBuffer);
writer.WriteLine("ReadPending {0}", ReadPending);
writer.WriteLine("WriteAddress {0:X4}", WriteAddress);
writer.WriteLine("WriteTimer {0}", WriteTimer);
writer.WriteLine("WriteBuffer {0:X2}", WriteBuffer);
writer.WriteLine("WritePending {0}", WritePending);
writer.WriteLine("Port180B {0:X2}", Port180B);
writer.WriteLine("Port180D {0:X2}", Port180D);
writer.WriteLine("Port180E {0:X2}", Port180E);
writer.WriteLine("AdpcmIsPlaying {0}", AdpcmIsPlaying);
writer.WriteLine("HalfReached {0}", HalfReached);
writer.WriteLine("EndReached {0}", EndReached);
writer.WriteLine("Playback44khzTimer {0}", Playback44khzTimer);
writer.WriteLine("PlayingSample {0:X4}", playingSample);
writer.WriteLine("NextSampleTimer {0}", nextSampleTimer);
writer.WriteLine("FirstNibble {0}", nibble);
writer.WriteLine("Magnitude {0}", magnitude);
writer.WriteLine("[/ADPCM]\n");
}
public void LoadStateText(TextReader reader)
{
while (true)
if (ser.IsReader)
{
string[] args = reader.ReadLine().Split(' ');
if (args[0].Trim() == "") continue;
if (args[0] == "[/ADPCM]") break;
if (args[0] == "RAM")
RAM.ReadFromHex(args[1]);
else if (args[0] == "IOAddress")
IOAddress = ushort.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "AdpcmLength")
AdpcmLength = ushort.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "ReadAddress")
ReadAddress = ushort.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "ReadTimer")
ReadTimer = int.Parse(args[1]);
else if (args[0] == "ReadBuffer")
ReadBuffer = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "ReadPending")
ReadPending = bool.Parse(args[1]);
else if (args[0] == "WriteAddress")
WriteAddress = ushort.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "WriteTimer")
WriteTimer = int.Parse(args[1]);
else if (args[0] == "WriteBuffer")
WriteBuffer = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "WritePending")
WritePending = bool.Parse(args[1]);
else if (args[0] == "Port180B")
Port180B = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "Port180D")
Port180D = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "Port180E")
Port180E = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "AdpcmIsPlaying")
AdpcmIsPlaying = bool.Parse(args[1]);
else if (args[0] == "HalfReached")
HalfReached = bool.Parse(args[1]);
else if (args[0] == "EndReached")
EndReached = bool.Parse(args[1]);
else if (args[0] == "Playback44khzTimer")
Playback44khzTimer = float.Parse(args[1]);
else if (args[0] == "PlayingSample")
playingSample = ushort.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "NextSampleTimer")
nextSampleTimer = float.Parse(args[1]);
else if (args[0] == "FirstNibble")
nibble = bool.Parse(args[1]);
else if (args[0] == "Magnitude")
magnitude = int.Parse(args[1]);
else
Console.WriteLine("Skipping unrecognized identifier " + args[0]);
Port180E = port180E;
pce.IntADPCM = HalfReached;
pce.IntStop = EndReached;
pce.RefreshIRQ2();
}
pce.IntADPCM = HalfReached;
pce.IntStop = EndReached;
pce.RefreshIRQ2();
}
}
}

View File

@ -135,82 +135,27 @@ namespace BizHawk.Emulation.Cores.PCEngine
return 0xFF;
}
void SaveArcadeCardBinary(BinaryWriter writer)
public void ArcadeCardSyncState(Serializer ser)
{
writer.Write(ShiftRegister);
writer.Write(ShiftAmount);
writer.Write(RotateAmount);
ser.BeginSection("ArcadeCard");
ser.Sync("ShiftRegister", ref ShiftRegister);
ser.Sync("ShiftAmount", ref ShiftAmount);
ser.Sync("RotateAmount", ref RotateAmount);
if (ArcadeCardRewindHack == false || ser.IsText)
ser.Sync("ArcadeRAM", ref ArcadeRam, false);
for (int i = 0; i < 4; i++)
{
writer.Write(ArcadePage[i].Control);
writer.Write(ArcadePage[i].Base);
writer.Write(ArcadePage[i].Offset);
writer.Write(ArcadePage[i].IncrementValue);
}
if (ArcadeCardRewindHack == false)
writer.Write(ArcadeRam);
}
ser.BeginSection("Page" + i);
void LoadArcadeCardBinary(BinaryReader reader)
{
ShiftRegister = reader.ReadInt32();
ShiftAmount = reader.ReadByte();
RotateAmount = reader.ReadByte();
for (int i = 0; i < 4; i++)
{
ArcadePage[i].Control = reader.ReadByte();
ArcadePage[i].Base = reader.ReadInt32();
ArcadePage[i].Offset = reader.ReadUInt16();
ArcadePage[i].IncrementValue = reader.ReadUInt16();
}
if (ArcadeCardRewindHack == false)
ArcadeRam = reader.ReadBytes(0x200000);
}
void SaveArcadeCardText(TextWriter writer)
{
writer.WriteLine("[ArcadeCard]");
writer.WriteLine("ShiftRegister {0} ", ShiftRegister);
writer.WriteLine("RotateAmount {0} ", ShiftAmount);
writer.WriteLine("RotateAmount {0} ", RotateAmount);
for (int i = 0; i < 4; i++)
{
writer.WriteLine("Control {0} {1:X2}", i, ArcadePage[i].Control);
writer.WriteLine("Base {0} {1:X6}", i, ArcadePage[i].Base);
writer.WriteLine("Offset {0} {1:X4}", i, ArcadePage[i].Offset);
writer.WriteLine("Increment {0} {1:X4}", i, ArcadePage[i].IncrementValue);
}
writer.Write("RAM "); ArcadeRam.SaveAsHex(writer);
writer.WriteLine("[/ArcadeCard]");
writer.WriteLine();
}
public void LoadArcadeCardText(TextReader reader)
{
while (true)
{
string[] args = reader.ReadLine().Split(' ');
if (args[0].Trim() == "") continue;
if (args[0] == "[/ArcadeCard]") break;
if (args[0] == "ShiftRegister")
ShiftRegister = int.Parse(args[1]);
else if (args[0] == "ShiftAmount")
ShiftAmount = byte.Parse(args[1]);
else if (args[0] == "RotateAmount")
RotateAmount = byte.Parse(args[1]);
else if (args[0] == "RAM")
ArcadeRam.ReadFromHex(args[1]);
else if (args[0] == "Control")
ArcadePage[int.Parse(args[1])].Control = byte.Parse(args[2], NumberStyles.HexNumber);
else if (args[0] == "Base")
ArcadePage[int.Parse(args[1])].Base = int.Parse(args[2], NumberStyles.HexNumber);
else if (args[0] == "Offset")
ArcadePage[int.Parse(args[1])].Offset = ushort.Parse(args[2], NumberStyles.HexNumber);
else if (args[0] == "Increment")
ArcadePage[int.Parse(args[1])].IncrementValue = ushort.Parse(args[2], NumberStyles.HexNumber);
else
Console.WriteLine("Skipping unrecognized identifier " + args[0]);
ser.Sync("Control", ref ArcadePage[i].Control);
ser.Sync("Base", ref ArcadePage[i].Base);
ser.Sync("Offset", ref ArcadePage[i].Offset);
ser.Sync("IncrementValue", ref ArcadePage[i].IncrementValue);
ser.EndSection();
}
ser.EndSection();
}
}
}

View File

@ -271,22 +271,22 @@ namespace BizHawk.Emulation.Cores.PCEngine
Cpu.ResetPC();
SetupMemoryDomains();
SetupStateBuff();
}
int _lagcount = 0;
int lagCount;
int frame;
bool lagged = true;
bool islag = false;
public int Frame { get; set; }
public int LagCount { get { return _lagcount; } set { _lagcount = value; } }
public bool IsLagFrame { get { return islag; } }
bool isLag = false;
public int Frame { get { return frame; } set { frame = value; } }
public int LagCount { get { return lagCount; } set { lagCount = value; } }
public bool IsLagFrame { get { return isLag; } }
public void ResetCounters()
{
// this should just be a public setter instead of a new method.
Frame = 0;
_lagcount = 0;
islag = false;
lagCount = 0;
isLag = false;
}
public void FrameAdvance(bool render, bool rendersound)
@ -310,11 +310,11 @@ namespace BizHawk.Emulation.Cores.PCEngine
if (lagged)
{
_lagcount++;
islag = true;
lagCount++;
isLag = true;
}
else
islag = false;
isLag = false;
}
void CheckSpriteLimit()
@ -364,238 +364,79 @@ namespace BizHawk.Emulation.Cores.PCEngine
}
public bool SaveRamModified { get; set; }
public void SaveStateText(TextWriter writer)
public bool BinarySaveStatesPreferred { get { return false; } }
public void SaveStateBinary(BinaryWriter bw) { SyncState(Serializer.CreateBinaryWriter(bw)); }
public void LoadStateBinary(BinaryReader br) { SyncState(Serializer.CreateBinaryReader(br)); }
public void SaveStateText(TextWriter tw) { SyncState(Serializer.CreateTextWriter(tw)); }
public void LoadStateText(TextReader tr) { SyncState(Serializer.CreateTextReader(tr)); }
void SyncState(Serializer ser)
{
writer.WriteLine("[PCEngine]");
writer.Write("RAM ");
Ram.SaveAsHex(writer);
if (PopulousRAM != null)
{
writer.Write("PopulousRAM ");
PopulousRAM.SaveAsHex(writer);
}
if (BRAM != null)
{
writer.Write("BRAM ");
BRAM.SaveAsHex(writer);
}
writer.WriteLine("Frame {0}", Frame);
writer.WriteLine("Lag {0}", _lagcount);
writer.WriteLine("IsLag {0}", islag);
if (Cpu.ReadMemory21 == ReadMemorySF2)
writer.WriteLine("SF2MapperLatch " + SF2MapperLatch);
writer.WriteLine("IOBuffer {0:X2}", IOBuffer);
writer.Write("CdIoPorts "); CdIoPorts.SaveAsHex(writer);
writer.WriteLine("BramLocked {0}", BramLocked);
writer.WriteLine();
ser.BeginSection("PCEngine");
Cpu.SyncState(ser);
VCE.SyncState(ser);
VDC1.SyncState(ser, 1);
PSG.SyncState(ser);
if (SuperGrafx)
{
Cpu.SaveStateText(writer);
VPC.SaveStateText(writer);
VCE.SaveStateText(writer);
VDC1.SaveStateText(writer, 1);
VDC2.SaveStateText(writer, 2);
PSG.SaveStateText(writer);
}
else
{
Cpu.SaveStateText(writer);
VCE.SaveStateText(writer);
VDC1.SaveStateText(writer, 1);
PSG.SaveStateText(writer);
VPC.SyncState(ser);
VDC2.SyncState(ser, 2);
}
if (TurboCD)
{
writer.Write("CDRAM "); CDRam.SaveAsHex(writer);
ADPCM.SyncState(ser);
CDAudio.SyncState(ser);
SCSI.SyncState(ser);
ser.Sync("CDRAM", ref CDRam, false);
if (SuperRam != null)
{ writer.Write("SuperRAM "); SuperRam.SaveAsHex(writer); }
writer.WriteLine();
SCSI.SaveStateText(writer);
CDAudio.SaveStateText(writer);
ADPCM.SaveStateText(writer);
}
if (ArcadeCard)
SaveArcadeCardText(writer);
writer.WriteLine("[/PCEngine]");
}
public void LoadStateText(TextReader reader)
{
while (true)
{
string[] args = reader.ReadLine().Split(' ');
if (args[0].Trim() == "") continue;
if (args[0] == "[PCEngine]") continue;
if (args[0] == "[/PCEngine]") break;
if (args[0] == "Frame")
Frame = int.Parse(args[1]);
else if (args[0] == "Lag")
_lagcount = int.Parse(args[1]);
else if (args[0] == "IsLag")
islag = bool.Parse(args[1]);
else if (args[0] == "SF2MapperLatch")
SF2MapperLatch = byte.Parse(args[1]);
else if (args[0] == "IOBuffer")
IOBuffer = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "CdIoPorts")
{ CdIoPorts.ReadFromHex(args[1]); RefreshIRQ2(); }
else if (args[0] == "BramLocked")
BramLocked = bool.Parse(args[1]);
else if (args[0] == "RAM")
Ram.ReadFromHex(args[1]);
else if (args[0] == "BRAM")
BRAM.ReadFromHex(args[1]);
else if (args[0] == "CDRAM")
CDRam.ReadFromHex(args[1]);
else if (args[0] == "SuperRAM")
SuperRam.ReadFromHex(args[1]);
else if (args[0] == "PopulousRAM" && PopulousRAM != null)
PopulousRAM.ReadFromHex(args[1]);
else if (args[0] == "[HuC6280]")
Cpu.LoadStateText(reader);
else if (args[0] == "[PSG]")
PSG.LoadStateText(reader);
else if (args[0] == "[VCE]")
VCE.LoadStateText(reader);
else if (args[0] == "[VPC]")
VPC.LoadStateText(reader);
else if (args[0] == "[VDC1]")
VDC1.LoadStateText(reader, 1);
else if (args[0] == "[VDC2]")
VDC2.LoadStateText(reader, 2);
else if (args[0] == "[SCSI]")
SCSI.LoadStateText(reader);
else if (args[0] == "[CDAudio]")
CDAudio.LoadStateText(reader);
else if (args[0] == "[ADPCM]")
ADPCM.LoadStateText(reader);
else if (args[0] == "[ArcadeCard]")
LoadArcadeCardText(reader);
else
Console.WriteLine("Skipping unrecognized identifier " + args[0]);
}
}
public void SaveStateBinary(BinaryWriter writer)
{
if (SuperGrafx == false)
{
writer.Write(Ram);
writer.Write(CdIoPorts);
writer.Write(BramLocked);
if (BRAM != null)
writer.Write(BRAM);
if (PopulousRAM != null)
writer.Write(PopulousRAM);
if (SuperRam != null)
writer.Write(SuperRam);
if (TurboCD)
{
writer.Write(CDRam);
ADPCM.SaveStateBinary(writer);
CDAudio.SaveStateBinary(writer);
SCSI.SaveStateBinary(writer);
}
ser.Sync("SuperRAM", ref SuperRam, false);
if (ArcadeCard)
SaveArcadeCardBinary(writer);
writer.Write(Frame);
writer.Write(_lagcount);
writer.Write(SF2MapperLatch);
writer.Write(IOBuffer);
Cpu.SaveStateBinary(writer);
VCE.SaveStateBinary(writer);
VDC1.SaveStateBinary(writer);
PSG.SaveStateBinary(writer);
}
else
{
writer.Write(Ram);
writer.Write(Frame);
writer.Write(_lagcount);
writer.Write(IOBuffer);
Cpu.SaveStateBinary(writer);
VCE.SaveStateBinary(writer);
VPC.SaveStateBinary(writer);
VDC1.SaveStateBinary(writer);
VDC2.SaveStateBinary(writer);
PSG.SaveStateBinary(writer);
ArcadeCardSyncState(ser);
}
ser.Sync("RAM", ref Ram, false);
ser.Sync("IOBuffer", ref IOBuffer);
ser.Sync("CdIoPorts", ref CdIoPorts, false);
ser.Sync("BramLocked", ref BramLocked);
ser.Sync("Frame", ref frame);
ser.Sync("Lag", ref lagCount);
ser.Sync("IsLag", ref isLag);
if (Cpu.ReadMemory21 == ReadMemorySF2)
ser.Sync("SF2MapperLatch", ref SF2MapperLatch);
if (PopulousRAM != null)
ser.Sync("PopulousRAM", ref PopulousRAM, false);
if (BRAM != null)
ser.Sync("BRAM", ref BRAM, false);
ser.EndSection();
}
public void LoadStateBinary(BinaryReader reader)
{
if (SuperGrafx == false)
{
Ram = reader.ReadBytes(0x2000);
CdIoPorts = reader.ReadBytes(16); RefreshIRQ2();
BramLocked = reader.ReadBoolean();
if (BRAM != null)
BRAM = reader.ReadBytes(0x800);
if (PopulousRAM != null)
PopulousRAM = reader.ReadBytes(0x8000);
if (SuperRam != null)
SuperRam = reader.ReadBytes(0x30000);
if (TurboCD)
{
CDRam = reader.ReadBytes(0x10000);
ADPCM.LoadStateBinary(reader);
CDAudio.LoadStateBinary(reader);
SCSI.LoadStateBinary(reader);
}
if (ArcadeCard)
LoadArcadeCardBinary(reader);
Frame = reader.ReadInt32();
_lagcount = reader.ReadInt32();
SF2MapperLatch = reader.ReadByte();
IOBuffer = reader.ReadByte();
Cpu.LoadStateBinary(reader);
VCE.LoadStateBinary(reader);
VDC1.LoadStateBinary(reader);
PSG.LoadStateBinary(reader);
}
else
{
Ram = reader.ReadBytes(0x8000);
Frame = reader.ReadInt32();
_lagcount = reader.ReadInt32();
IOBuffer = reader.ReadByte();
Cpu.LoadStateBinary(reader);
VCE.LoadStateBinary(reader);
VPC.LoadStateBinary(reader);
VDC1.LoadStateBinary(reader);
VDC2.LoadStateBinary(reader);
PSG.LoadStateBinary(reader);
}
}
byte[] SaveStateBinaryBuff;
void SetupStateBuff()
{
int buflen = 75908;
if (SuperGrafx) buflen += 90700;
if (BramEnabled) buflen += 2048;
if (PopulousRAM != null) buflen += 0x8000;
if (SuperRam != null) buflen += 0x30000;
if (TurboCD) buflen += 0x20000 + 2165;
if (ArcadeCard) buflen += 42;
if (ArcadeCard && !ArcadeCardRewindHack) buflen += 0x200000;
SaveStateBinaryBuff = new byte[buflen];
Console.WriteLine("PCE: Internal savestate buff of {0} allocated", buflen);
}
byte[] stateBuffer;
public byte[] SaveStateBinary()
{
var stream = new MemoryStream(SaveStateBinaryBuff);
var writer = new BinaryWriter(stream);
SaveStateBinary(writer);
writer.Close();
return SaveStateBinaryBuff;
}
public bool BinarySaveStatesPreferred { get { return false; } }
if (stateBuffer == null)
{
var stream = new MemoryStream();
var writer = new BinaryWriter(stream);
SaveStateBinary(writer);
stateBuffer = stream.ToArray();
writer.Close();
return stateBuffer;
}
else
{
var stream = new MemoryStream(stateBuffer);
var writer = new BinaryWriter(stream);
SaveStateBinary(writer);
writer.Close();
return stateBuffer;
}
}
void SetupMemoryDomains()
{

View File

@ -113,21 +113,18 @@ namespace BizHawk.Emulation.Cores.PCEngine
rst = value;
}
}
public byte DataBits { get; set; } // data bits
public byte DataBits;
enum BusPhase
{
BusFree,
Command,
DataIn,
DataOut,
MessageIn,
MessageOut,
Status
}
const byte BusPhase_BusFree = 0;
const byte BusPhase_Command = 1;
const byte BusPhase_DataIn = 2;
const byte BusPhase_DataOut = 3;
const byte BusPhase_MessageIn = 4;
const byte BusPhase_MessageOut = 5;
const byte BusPhase_Status = 6;
bool busPhaseChanged;
BusPhase Phase = BusPhase.BusFree;
byte Phase = BusPhase_BusFree;
bool MessageCompleted;
bool StatusCompleted;
@ -196,7 +193,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
DataReadInProgress = false;
DataTransferWasDone = true;
}
SetPhase(BusPhase.DataIn);
SetPhase(BusPhase_DataIn);
}
}
@ -207,20 +204,20 @@ namespace BizHawk.Emulation.Cores.PCEngine
if (SEL && !BSY)
{
SetPhase(BusPhase.Command);
SetPhase(BusPhase_Command);
}
else if (ATN && !REQ && !ACK)
{
SetPhase(BusPhase.MessageOut);
SetPhase(BusPhase_MessageOut);
}
else switch (Phase)
{
case BusPhase.Command: ThinkCommandPhase(); break;
case BusPhase.DataIn: ThinkDataInPhase(); break;
case BusPhase.DataOut: ThinkDataOutPhase(); break;
case BusPhase.MessageIn: ThinkMessageInPhase(); break;
case BusPhase.MessageOut: ThinkMessageOutPhase(); break;
case BusPhase.Status: ThinkStatusPhase(); break;
case BusPhase_Command: ThinkCommandPhase(); break;
case BusPhase_DataIn: ThinkDataInPhase(); break;
case BusPhase_DataOut: ThinkDataOutPhase(); break;
case BusPhase_MessageIn: ThinkMessageInPhase(); break;
case BusPhase_MessageOut: ThinkMessageOutPhase(); break;
case BusPhase_Status: ThinkStatusPhase(); break;
default: break;
}
} while (signalsChanged || busPhaseChanged);
@ -235,7 +232,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
ACK = false;
ATN = false;
DataBits = 0;
Phase = BusPhase.BusFree;
Phase = BusPhase_BusFree;
CommandBuffer.Clear();
DataIn.Clear();
@ -298,7 +295,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
void ThinkDataOutPhase()
{
Console.WriteLine("*********** DATA OUT PHASE, DOES THIS HAPPEN? ****************");
SetPhase(BusPhase.BusFree);
SetPhase(BusPhase_BusFree);
}
void ThinkMessageInPhase()
@ -312,14 +309,14 @@ namespace BizHawk.Emulation.Cores.PCEngine
if (!REQ && !ACK && MessageCompleted)
{
MessageCompleted = false;
SetPhase(BusPhase.BusFree);
SetPhase(BusPhase_BusFree);
}
}
void ThinkMessageOutPhase()
{
Console.WriteLine("******* IN MESSAGE OUT PHASE. DOES THIS EVER HAPPEN? ********");
SetPhase(BusPhase.BusFree);
SetPhase(BusPhase_BusFree);
}
void ThinkStatusPhase()
@ -333,7 +330,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
{
StatusCompleted = false;
DataBits = MessageValue;
SetPhase(BusPhase.MessageIn);
SetPhase(BusPhase_MessageIn);
}
}
@ -470,17 +467,17 @@ namespace BizHawk.Emulation.Cores.PCEngine
case 1: // play in loop mode. I guess this constitues A-B looping
pce.CDAudio.PlayStartingAtLba(audioStartLBA);
pce.CDAudio.EndLBA = audioEndLBA;
pce.CDAudio.PlayMode = CDAudio.PlaybackMode.LoopOnCompletion;
pce.CDAudio.PlayMode = CDAudio.PlaybackMode_LoopOnCompletion;
break;
case 2: // Play audio, fire IRQ2 when end position reached, maybe
pce.CDAudio.PlayStartingAtLba(audioStartLBA);
pce.CDAudio.EndLBA = audioEndLBA;
pce.CDAudio.PlayMode = CDAudio.PlaybackMode.CallbackOnCompletion;
pce.CDAudio.PlayMode = CDAudio.PlaybackMode_CallbackOnCompletion;
break;
case 3: // Play normal
pce.CDAudio.PlayStartingAtLba(audioStartLBA);
pce.CDAudio.EndLBA = audioEndLBA;
pce.CDAudio.PlayMode = CDAudio.PlaybackMode.StopOnCompletion;
pce.CDAudio.PlayMode = CDAudio.PlaybackMode_StopOnCompletion;
break;
}
SetStatusMessage(STATUS_GOOD, 0);
@ -494,16 +491,16 @@ namespace BizHawk.Emulation.Cores.PCEngine
void CommandReadSubcodeQ()
{
bool playing = pce.CDAudio.Mode != CDAudio.CDAudioMode.Stopped;
bool playing = pce.CDAudio.Mode != CDAudio.CDAudioMode_Stopped;
var sectorEntry = disc.ReadLBA_SectorEntry(playing ? pce.CDAudio.CurrentSector : CurrentReadingSector);
DataIn.Clear();
switch (pce.CDAudio.Mode)
{
case CDAudio.CDAudioMode.Playing: DataIn.Enqueue(0); break;
case CDAudio.CDAudioMode.Paused: DataIn.Enqueue(2); break;
case CDAudio.CDAudioMode.Stopped: DataIn.Enqueue(3); break;
case CDAudio.CDAudioMode_Playing: DataIn.Enqueue(0); break;
case CDAudio.CDAudioMode_Paused: DataIn.Enqueue(2); break;
case CDAudio.CDAudioMode_Stopped: DataIn.Enqueue(3); break;
}
DataIn.Enqueue(sectorEntry.q_status); // I do not know what status is
@ -516,7 +513,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
DataIn.Enqueue(sectorEntry.q_asec.BCDValue); // S(abs)
DataIn.Enqueue(sectorEntry.q_aframe.BCDValue); // F(abs)
SetPhase(BusPhase.DataIn);
SetPhase(BusPhase_DataIn);
}
void CommandReadTOC()
@ -528,7 +525,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
DataIn.Clear();
DataIn.Enqueue(0x01);
DataIn.Enqueue(((byte)disc.TOC.Sessions[0].Tracks.Count).BinToBCD());
SetPhase(BusPhase.DataIn);
SetPhase(BusPhase_DataIn);
break;
}
case 1: // return total disc length in minutes/seconds/frames
@ -542,7 +539,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
DataIn.Enqueue(m.BinToBCD());
DataIn.Enqueue(s.BinToBCD());
DataIn.Enqueue(f.BinToBCD());
SetPhase(BusPhase.DataIn);
SetPhase(BusPhase_DataIn);
break;
}
case 2: // Return starting position of specified track in MSF format
@ -574,7 +571,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
DataIn.Enqueue(0);
else
DataIn.Enqueue(4);
SetPhase(BusPhase.DataIn);
SetPhase(BusPhase_DataIn);
break;
}
default:
@ -589,10 +586,10 @@ namespace BizHawk.Emulation.Cores.PCEngine
StatusCompleted = false;
MessageCompleted = false;
DataBits = status == STATUS_GOOD ? (byte)0x00 : (byte)0x01;
SetPhase(BusPhase.Status);
SetPhase(BusPhase_Status);
}
void SetPhase(BusPhase phase)
void SetPhase(byte phase)
{
if (Phase == phase)
return;
@ -602,7 +599,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
switch (phase)
{
case BusPhase.BusFree:
case BusPhase_BusFree:
BSY = false;
MSG = false;
CD = false;
@ -610,42 +607,42 @@ namespace BizHawk.Emulation.Cores.PCEngine
REQ = false;
pce.IntDataTransferComplete = false;
break;
case BusPhase.Command:
case BusPhase_Command:
BSY = true;
MSG = false;
CD = true;
IO = false;
REQ = true;
break;
case BusPhase.DataIn:
case BusPhase_DataIn:
BSY = true;
MSG = false;
CD = false;
IO = true;
REQ = false;
break;
case BusPhase.DataOut:
case BusPhase_DataOut:
BSY = true;
MSG = false;
CD = false;
IO = false;
REQ = true;
break;
case BusPhase.MessageIn:
case BusPhase_MessageIn:
BSY = true;
MSG = true;
CD = true;
IO = true;
REQ = true;
break;
case BusPhase.MessageOut:
case BusPhase_MessageOut:
BSY = true;
MSG = true;
CD = true;
IO = false;
REQ = true;
break;
case BusPhase.Status:
case BusPhase_Status:
BSY = true;
MSG = false;
CD = true;
@ -657,191 +654,43 @@ namespace BizHawk.Emulation.Cores.PCEngine
// ***************************************************************************
public void SaveStateBinary(BinaryWriter writer)
public void SyncState(Serializer ser)
{
writer.Write(BSY);
writer.Write(SEL);
writer.Write(CD);
writer.Write(IO);
writer.Write(MSG);
writer.Write(REQ);
writer.Write(ACK);
writer.Write(ATN);
writer.Write(RST);
writer.Write(DataBits);
writer.Write((byte)Phase);
ser.BeginSection("SCSI");
ser.Sync("BSY", ref bsy);
ser.Sync("SEL", ref sel);
ser.Sync("CD", ref cd);
ser.Sync("IO", ref io);
ser.Sync("MSG", ref msg);
ser.Sync("REQ", ref req);
ser.Sync("ACK", ref ack);
ser.Sync("ATN", ref atn);
ser.Sync("RST", ref rst);
ser.Sync("DataBits", ref DataBits);
ser.Sync("Phase", ref Phase);
writer.Write(MessageCompleted);
writer.Write(StatusCompleted);
writer.Write(MessageValue);
ser.Sync("MessageCompleted", ref MessageCompleted);
ser.Sync("StatusCompleted", ref StatusCompleted);
ser.Sync("MessageValue", ref MessageValue);
writer.Write(DataReadWaitTimer);
writer.Write(DataReadInProgress);
writer.Write(DataTransferWasDone);
writer.Write(DataTransferInProgress);
writer.Write(CurrentReadingSector);
writer.Write((byte)SectorsLeftToRead);
ser.Sync("DataReadWaitTimer", ref DataReadWaitTimer);
ser.Sync("DataReadInProgress", ref DataReadInProgress);
ser.Sync("DataTransferWasDone", ref DataTransferWasDone);
ser.Sync("DataTransferInProgress", ref DataTransferInProgress);
ser.Sync("CurrentReadingSector", ref CurrentReadingSector);
ser.Sync("SectorsLeftToRead", ref SectorsLeftToRead);
writer.Write(CommandBuffer.buffer);
writer.Write((byte)CommandBuffer.Position);
ser.Sync("CommandBuffer", ref CommandBuffer.buffer, false);
ser.Sync("CommandBufferPosition", ref CommandBuffer.Position);
writer.Write(DataIn.buffer);
writer.Write((short)DataIn.head);
writer.Write((short)DataIn.tail);
writer.Write((short)DataIn.size);
ser.Sync("DataInBuffer", ref DataIn.buffer, false);
ser.Sync("DataInHead", ref DataIn.head);
ser.Sync("DataInTail", ref DataIn.tail);
ser.Sync("DataInSize", ref DataIn.size);
writer.Write(audioStartLBA);
writer.Write(audioEndLBA);
}
public void LoadStateBinary(BinaryReader reader)
{
BSY = reader.ReadBoolean();
SEL = reader.ReadBoolean();
CD = reader.ReadBoolean();
IO = reader.ReadBoolean();
MSG = reader.ReadBoolean();
REQ = reader.ReadBoolean();
ACK = reader.ReadBoolean();
ATN = reader.ReadBoolean();
RST = reader.ReadBoolean();
DataBits = reader.ReadByte();
Phase = (BusPhase)Enum.ToObject(typeof(BusPhase), reader.ReadByte());
MessageCompleted = reader.ReadBoolean();
StatusCompleted = reader.ReadBoolean();
MessageValue = reader.ReadByte();
DataReadWaitTimer = reader.ReadInt64();
DataReadInProgress = reader.ReadBoolean();
DataTransferWasDone = reader.ReadBoolean();
DataTransferInProgress = reader.ReadBoolean();
CurrentReadingSector = reader.ReadInt32();
SectorsLeftToRead = reader.ReadByte();
CommandBuffer.buffer = reader.ReadBytes(10);
CommandBuffer.Position = reader.ReadByte();
DataIn.buffer = reader.ReadBytes(2048);
DataIn.head = reader.ReadInt16();
DataIn.tail = reader.ReadInt16();
DataIn.size = reader.ReadInt16();
audioStartLBA = reader.ReadInt32();
audioEndLBA = reader.ReadInt32();
}
public void SaveStateText(TextWriter writer)
{
writer.WriteLine("[SCSI]");
writer.WriteLine("BSY {0}", BSY);
writer.WriteLine("SEL {0}", SEL);
writer.WriteLine("CD {0}", CD);
writer.WriteLine("IO {0}", IO);
writer.WriteLine("MSG {0}", MSG);
writer.WriteLine("REQ {0}", REQ);
writer.WriteLine("ACK {0}", ACK);
writer.WriteLine("ATN {0}", ATN);
writer.WriteLine("RST {0}", RST);
writer.WriteLine("DataBits {0:X2}", DataBits);
writer.WriteLine("BusPhase " + Enum.GetName(typeof(BusPhase), Phase));
writer.WriteLine();
writer.WriteLine("MessageCompleted {0}", MessageCompleted);
writer.WriteLine("StatusCompleted {0}", StatusCompleted);
writer.WriteLine("MessageValue {0}", MessageValue);
writer.WriteLine();
writer.WriteLine("DataReadWaitTimer {0}", DataReadWaitTimer);
writer.WriteLine("DataReadInProgress {0}", DataReadInProgress);
writer.WriteLine("DataTransferWasDone {0}", DataTransferWasDone);
writer.WriteLine("DataTransferInProgress {0}", DataTransferInProgress);
writer.WriteLine("CurrentReadingSector {0}", CurrentReadingSector);
writer.WriteLine("SectorsLeftToRead {0}", SectorsLeftToRead);
writer.WriteLine();
writer.WriteLine("AudioStartLBA {0}", audioStartLBA);
writer.WriteLine("AudioEndLBA {0}", audioEndLBA);
writer.WriteLine();
writer.Write("CommandBuffer "); CommandBuffer.buffer.SaveAsHex(writer);
writer.WriteLine("CommandBufferPosition {0}", CommandBuffer.Position);
writer.WriteLine();
writer.Write("DataInBuffer "); DataIn.buffer.SaveAsHex(writer);
writer.WriteLine("DataInHead {0}", DataIn.head);
writer.WriteLine("DataInTail {0}", DataIn.tail);
writer.WriteLine("DataInSize {0}", DataIn.size);
writer.WriteLine("[/SCSI]\n");
}
public void LoadStateText(TextReader reader)
{
while (true)
{
string[] args = reader.ReadLine().Split(' ');
if (args[0].Trim() == "") continue;
if (args[0] == "[/SCSI]") break;
if (args[0] == "BSY")
BSY = bool.Parse(args[1]);
else if (args[0] == "SEL")
SEL = bool.Parse(args[1]);
else if (args[0] == "CD")
CD = bool.Parse(args[1]);
else if (args[0] == "IO")
IO = bool.Parse(args[1]);
else if (args[0] == "MSG")
MSG = bool.Parse(args[1]);
else if (args[0] == "REQ")
REQ = bool.Parse(args[1]);
else if (args[0] == "ACK")
ACK = bool.Parse(args[1]);
else if (args[0] == "ATN")
ATN = bool.Parse(args[1]);
else if (args[0] == "RST")
RST = bool.Parse(args[1]);
else if (args[0] == "DataBits")
DataBits = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "BusPhase")
Phase = (BusPhase)Enum.Parse(typeof(BusPhase), args[1]);
else if (args[0] == "MessageCompleted")
MessageCompleted = bool.Parse(args[1]);
else if (args[0] == "StatusCompleted")
StatusCompleted = bool.Parse(args[1]);
else if (args[0] == "MessageValue")
MessageValue = byte.Parse(args[1]);
else if (args[0] == "DataReadWaitTimer")
DataReadWaitTimer = long.Parse(args[1]);
else if (args[0] == "DataReadInProgress")
DataReadInProgress = bool.Parse(args[1]);
else if (args[0] == "DataTransferWasDone")
DataTransferWasDone = bool.Parse(args[1]);
else if (args[0] == "DataTransferInProgress")
DataTransferInProgress = bool.Parse(args[1]);
else if (args[0] == "CurrentReadingSector")
CurrentReadingSector = int.Parse(args[1]);
else if (args[0] == "SectorsLeftToRead")
SectorsLeftToRead = int.Parse(args[1]);
else if (args[0] == "AudioStartLBA")
audioStartLBA = int.Parse(args[1]);
else if (args[0] == "AudioEndLBA")
audioEndLBA = int.Parse(args[1]);
else if (args[0] == "CommandBuffer")
CommandBuffer.buffer.ReadFromHex(args[1]);
else if (args[0] == "CommandBufferPosition")
CommandBuffer.Position = int.Parse(args[1]);
else if (args[0] == "DataInBuffer")
DataIn.buffer.ReadFromHex(args[1]);
else if (args[0] == "DataInHead")
DataIn.head = int.Parse(args[1]);
else if (args[0] == "DataInTail")
DataIn.tail = int.Parse(args[1]);
else if (args[0] == "DataInSize")
DataIn.size = int.Parse(args[1]);
else
Console.WriteLine("Skipping unrecognized identifier " + args[0]);
}
ser.Sync("AudioStartLBA", ref audioStartLBA);
ser.Sync("AudioEndLBA", ref audioEndLBA);
ser.EndSection();
}
}
}

View File

@ -15,23 +15,6 @@ namespace BizHawk.Emulation.Cores.PCEngine
public byte CR;
public int NumberOfScanlines { get { return ((CR & 4) != 0) ? 263 : 262; } }
public int DotClock
{
get
{
int clock = CR & 3;
if (clock == 3)
clock = 2;
return clock;
}
}
// guess the dot clock affects wait states in combination with the dot with regs.
// We dont currently emulate wait states, probably will have to eventually...
// Note: To keep the VCE class from needing a reference to the CPU, the 1-cycle access
// penalty for the VCE is handled by the memory mappers.
// One day I guess I could create an ICpu with a StealCycles method...
public void WriteVCE(int port, byte value)
{
@ -91,54 +74,17 @@ namespace BizHawk.Emulation.Cores.PCEngine
Palette[slot] = Colors.ARGB(r, g, b);
}
public void SaveStateText(TextWriter writer)
public void SyncState(Serializer ser)
{
writer.WriteLine("[VCE]");
writer.WriteLine("VceAddress {0:X4}", VceAddress);
writer.WriteLine("CR {0}", CR);
writer.Write("VceData ");
VceData.SaveAsHex(writer);
writer.WriteLine("[/VCE]\n");
}
ser.BeginSection("VCE");
ser.Sync("VceAddress", ref VceAddress);
ser.Sync("CR", ref CR);
ser.Sync("VceData", ref VceData, false);
ser.EndSection();
public void LoadStateText(TextReader reader)
{
while (true)
{
string[] args = reader.ReadLine().Split(' ');
if (args[0].Trim() == "") continue;
if (args[0] == "[/VCE]") break;
if (args[0] == "VceAddress")
VceAddress = ushort.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "CR")
CR = byte.Parse(args[1]);
else if (args[0] == "VceData")
VceData.ReadFromHex(args[1]);
else
Console.WriteLine("Skipping unrecognized identifier " + args[0]);
}
for (int i = 0; i < VceData.Length; i++)
PrecomputePalette(i);
}
public void SaveStateBinary(BinaryWriter writer)
{
writer.Write(VceAddress);
writer.Write(CR);
for (int i = 0; i < VceData.Length; i++)
writer.Write(VceData[i]);
}
public void LoadStateBinary(BinaryReader reader)
{
VceAddress = reader.ReadUInt16();
CR = reader.ReadByte();
for (int i = 0; i < VceData.Length; i++)
{
VceData[i] = reader.ReadUInt16();
PrecomputePalette(i);
}
if (ser.IsReader)
for (int i = 0; i < VceData.Length; i++)
PrecomputePalette(i);
}
}
}
}

View File

@ -300,131 +300,37 @@ namespace BizHawk.Emulation.Cores.PCEngine
}
}
public void SaveStateText(TextWriter writer, int vdcNo)
public void SyncState(Serializer ser, int vdcNo)
{
writer.WriteLine("[VDC" + vdcNo + "]");
writer.Write("VRAM ");
VRAM.SaveAsHex(writer);
writer.Write("SAT ");
SpriteAttributeTable.SaveAsHex(writer);
writer.Write("Registers ");
Registers.SaveAsHex(writer);
ser.BeginSection("VDC"+vdcNo);
ser.Sync("VRAM", ref VRAM, false);
ser.Sync("SAT", ref SpriteAttributeTable, false);
ser.Sync("Registers", ref Registers, false);
ser.Sync("RegisterLatch", ref RegisterLatch);
ser.Sync("ReadBuffer", ref ReadBuffer);
ser.Sync("StatusByte", ref StatusByte);
writer.WriteLine("RegisterLatch {0:X2}", RegisterLatch);
writer.WriteLine("ReadBuffer {0:X4}", ReadBuffer);
writer.WriteLine("StatusByte {0:X2}", StatusByte);
ser.Sync("DmaRequested", ref DmaRequested);
ser.Sync("SatDmaRequested", ref SatDmaRequested);
ser.Sync("SatDmaPerformed", ref SatDmaPerformed);
writer.WriteLine("DmaRequested {0}", DmaRequested);
writer.WriteLine("SatDmaRequested {0}", SatDmaRequested);
writer.WriteLine("SatDmaPerformed {0}", SatDmaPerformed);
ser.Sync("ScanLine", ref ScanLine);
ser.Sync("BackgroundY", ref BackgroundY);
ser.Sync("RCRCounter", ref RCRCounter);
ser.Sync("ActiveLine", ref ActiveLine);
ser.EndSection();
writer.WriteLine("ScanLine {0}", ScanLine);
writer.WriteLine("BackgroundY {0}", BackgroundY);
writer.WriteLine("RCRCounter {0}", RCRCounter);
writer.WriteLine("ActiveLine {0}", ActiveLine);
writer.WriteLine("[/VDC" + vdcNo + "]\n");
}
public void LoadStateText(TextReader reader, int vdcNo)
{
while (true)
if (ser.IsReader)
{
string[] args = reader.ReadLine().Split(' ');
if (args[0].Trim() == "") continue;
if (args[0] == "[/VDC" + vdcNo + "]") break;
if (args[0] == "VRAM")
VRAM.ReadFromHex(args[1]);
else if (args[0] == "SAT")
SpriteAttributeTable.ReadFromHex(args[1]);
else if (args[0] == "Registers")
Registers.ReadFromHex(args[1]);
else if (args[0] == "RegisterLatch")
RegisterLatch = byte.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "ReadBuffer")
ReadBuffer = ushort.Parse(args[1], NumberStyles.HexNumber);
else if (args[0] == "StatusByte")
StatusByte = byte.Parse(args[1], NumberStyles.HexNumber);
for (ushort i = 0; i < VRAM.Length; i++)
{
UpdatePatternData(i);
UpdateSpriteData(i);
}
else if (args[0] == "DmaRequested")
DmaRequested = bool.Parse(args[1]);
else if (args[0] == "SatDmaRequested")
SatDmaRequested = bool.Parse(args[1]);
else if (args[0] == "SatDmaPerformed")
SatDmaPerformed = bool.Parse(args[1]);
else if (args[0] == "ScanLine")
ScanLine = int.Parse(args[1]);
else if (args[0] == "BackgroundY")
BackgroundY = int.Parse(args[1]);
else if (args[0] == "RCRCounter")
RCRCounter = int.Parse(args[1]);
else if (args[0] == "ActiveLine")
ActiveLine = int.Parse(args[1]);
else
Console.WriteLine("Skipping unrecognized identifier " + args[0]);
CompleteMSBWrite(HDR);
CompleteMSBWrite(VDW);
}
for (ushort i = 0; i < VRAM.Length; i++)
{
UpdatePatternData(i);
UpdateSpriteData(i);
}
CompleteMSBWrite(HDR);
CompleteMSBWrite(VDW);
}
public void SaveStateBinary(BinaryWriter writer)
{
for (int i = 0; i < VRAM.Length; i++)
writer.Write(VRAM[i]);
for (int i = 0; i < SpriteAttributeTable.Length; i++)
writer.Write(SpriteAttributeTable[i]);
for (int i = 0; i < Registers.Length; i++)
writer.Write(Registers[i]);
writer.Write(RegisterLatch);
writer.Write(ReadBuffer);
writer.Write(StatusByte);
writer.Write(DmaRequested);
writer.Write(SatDmaRequested);
writer.Write(SatDmaPerformed);
writer.Write(ScanLine);
writer.Write(BackgroundY);
writer.Write(RCRCounter);
writer.Write(ActiveLine);
}
public void LoadStateBinary(BinaryReader reader)
{
for (ushort i = 0; i < VRAM.Length; i++)
{
VRAM[i] = reader.ReadUInt16();
UpdatePatternData(i);
UpdateSpriteData(i);
}
for (int i = 0; i < SpriteAttributeTable.Length; i++)
SpriteAttributeTable[i] = reader.ReadUInt16();
for (int i = 0; i < Registers.Length; i++)
Registers[i] = reader.ReadUInt16();
RegisterLatch = reader.ReadByte();
ReadBuffer = reader.ReadUInt16();
StatusByte = reader.ReadByte();
DmaRequested = reader.ReadBoolean();
SatDmaRequested = reader.ReadBoolean();
SatDmaPerformed = reader.ReadBoolean();
ScanLine = reader.ReadInt32();
BackgroundY = reader.ReadInt32();
RCRCounter = reader.ReadInt32();
ActiveLine = reader.ReadInt32();
CompleteMSBWrite(HDR);
CompleteMSBWrite(VDW);
}
}
}

View File

@ -80,38 +80,14 @@ namespace BizHawk.Emulation.Cores.PCEngine
}
}
public void SaveStateBinary(BinaryWriter writer)
public void SyncState(Serializer ser)
{
writer.Write(Registers);
}
ser.BeginSection("VPC");
ser.Sync("Registers", ref Registers, false);
ser.EndSection();
public void LoadStateBinary(BinaryReader reader)
{
Registers = reader.ReadBytes(7);
WriteVPC(0x0E, Registers[6]);
}
public void SaveStateText(TextWriter writer)
{
writer.WriteLine("[VPC]");
writer.Write("Registers ");
Registers.SaveAsHex(writer);
writer.WriteLine("[/VPC]\n");
}
public void LoadStateText(TextReader reader)
{
while (true)
{
string[] args = reader.ReadLine().Split(' ');
if (args[0].Trim() == "") continue;
if (args[0] == "[/VPC]") break;
if (args[0] == "Registers")
Registers.ReadFromHex(args[1]);
else
Console.WriteLine("Skipping unrecognized identifier " + args[0]);
}
WriteVPC(0x0E, Registers[6]);
if (ser.IsReader)
WriteVPC(0x0E, Registers[6]);
}
// We use a single priority mode for the whole frame.

View File

@ -1,6 +1,6 @@
using System;
using System.IO;
using BizHawk.Common;
using BizHawk.Emulation.Common;
// The state of the cd player is quantized to the frame level.
@ -12,26 +12,20 @@ namespace BizHawk.Emulation.DiscSystem
{
public sealed class CDAudio : ISoundProvider
{
public enum CDAudioMode
{
Stopped,
Playing,
Paused
}
public const byte CDAudioMode_Stopped = 0;
public const byte CDAudioMode_Playing = 1;
public const byte CDAudioMode_Paused = 2;
public enum PlaybackMode
{
StopOnCompletion,
NextTrackOnCompletion,
LoopOnCompletion,
CallbackOnCompletion
}
public const byte PlaybackMode_StopOnCompletion = 0;
public const byte PlaybackMode_NextTrackOnCompletion = 1;
public const byte PlaybackMode_LoopOnCompletion = 2;
public const byte PlaybackMode_CallbackOnCompletion = 3;
public Action CallbackAction = delegate { };
public Disc Disc;
public CDAudioMode Mode = CDAudioMode.Stopped;
public PlaybackMode PlayMode = PlaybackMode.LoopOnCompletion;
public byte Mode = CDAudioMode_Stopped;
public byte PlayMode = PlaybackMode_LoopOnCompletion;
public int MaxVolume { get; set; }
public int LogicalVolume = 100;
@ -62,7 +56,7 @@ namespace BizHawk.Emulation.DiscSystem
PlayingTrack = track;
CurrentSector = StartLBA;
SectorOffset = 0;
Mode = CDAudioMode.Playing;
Mode = CDAudioMode_Playing;
FadeOutOverFrames = 0;
FadeOutFramesRemaining = 0;
LogicalVolume = 100;
@ -79,7 +73,7 @@ namespace BizHawk.Emulation.DiscSystem
CurrentSector = StartLBA;
SectorOffset = 0;
Mode = CDAudioMode.Playing;
Mode = CDAudioMode_Playing;
FadeOutOverFrames = 0;
FadeOutFramesRemaining = 0;
LogicalVolume = 100;
@ -87,7 +81,7 @@ namespace BizHawk.Emulation.DiscSystem
public void Stop()
{
Mode = CDAudioMode.Stopped;
Mode = CDAudioMode_Stopped;
FadeOutOverFrames = 0;
FadeOutFramesRemaining = 0;
LogicalVolume = 100;
@ -95,9 +89,9 @@ namespace BizHawk.Emulation.DiscSystem
public void Pause()
{
if (Mode != CDAudioMode.Playing)
if (Mode != CDAudioMode_Playing)
return;
Mode = CDAudioMode.Paused;
Mode = CDAudioMode_Paused;
FadeOutOverFrames = 0;
FadeOutFramesRemaining = 0;
LogicalVolume = 100;
@ -105,16 +99,16 @@ namespace BizHawk.Emulation.DiscSystem
public void Resume()
{
if (Mode != CDAudioMode.Paused)
if (Mode != CDAudioMode_Paused)
return;
Mode = CDAudioMode.Playing;
Mode = CDAudioMode_Playing;
}
public void PauseResume()
{
if (Mode == CDAudioMode.Playing) Mode = CDAudioMode.Paused;
else if (Mode == CDAudioMode.Paused) Mode = CDAudioMode.Playing;
else if (Mode == CDAudioMode.Stopped) return;
if (Mode == CDAudioMode_Playing) Mode = CDAudioMode_Paused;
else if (Mode == CDAudioMode_Paused) Mode = CDAudioMode_Playing;
else if (Mode == CDAudioMode_Stopped) return;
}
public void FadeOut(int frames)
@ -137,7 +131,7 @@ namespace BizHawk.Emulation.DiscSystem
public void GetSamples(short[] samples)
{
if (Mode != CDAudioMode.Playing)
if (Mode != CDAudioMode_Playing)
return;
if (FadeOutFramesRemaining > 0)
@ -169,21 +163,21 @@ namespace BizHawk.Emulation.DiscSystem
{
switch (PlayMode)
{
case PlaybackMode.NextTrackOnCompletion:
case PlaybackMode_NextTrackOnCompletion:
PlayTrack(PlayingTrack + 1);
break;
case PlaybackMode.StopOnCompletion:
case PlaybackMode_StopOnCompletion:
Stop();
return;
case PlaybackMode.LoopOnCompletion:
case PlaybackMode_LoopOnCompletion:
CurrentSector = StartLBA;
break;
case PlaybackMode.CallbackOnCompletion:
case PlaybackMode_CallbackOnCompletion:
CallbackAction();
if (Mode != CDAudioMode.Playing)
if (Mode != CDAudioMode_Playing)
return;
break;
}
@ -198,7 +192,7 @@ namespace BizHawk.Emulation.DiscSystem
{
get
{
if (Mode != CDAudioMode.Playing)
if (Mode != CDAudioMode_Playing)
return 0;
int offset = SectorOffset * 4;
@ -211,7 +205,7 @@ namespace BizHawk.Emulation.DiscSystem
{
get
{
if (Mode != CDAudioMode.Playing)
if (Mode != CDAudioMode_Playing)
return 0;
int offset = SectorOffset * 4;
@ -222,83 +216,23 @@ namespace BizHawk.Emulation.DiscSystem
public void DiscardSamples() { }
public void SaveStateText(TextWriter writer)
public void SyncState(Serializer ser)
{
writer.WriteLine("[CDAudio]");
writer.WriteLine("Mode " + Enum.GetName(typeof(CDAudioMode), Mode));
writer.WriteLine("PlayMode " + Enum.GetName(typeof(PlaybackMode), PlayMode));
writer.WriteLine("LogicalVolume {0}", LogicalVolume);
writer.WriteLine("StartLBA {0}", StartLBA);
writer.WriteLine("EndLBA {0}", EndLBA);
writer.WriteLine("PlayingTrack {0}", PlayingTrack);
writer.WriteLine("CurrentSector {0}", CurrentSector);
writer.WriteLine("SectorOffset {0}", SectorOffset);
writer.WriteLine("FadeOutOverFrames {0}", FadeOutOverFrames);
writer.WriteLine("FadeOutFramesRemaining {0}", FadeOutFramesRemaining);
writer.WriteLine("[/CDAudio]");
writer.WriteLine();
}
ser.BeginSection("CDAudio");
ser.Sync("Mode", ref Mode);
ser.Sync("PlayMode", ref PlayMode);
ser.Sync("LogicalVolume", ref LogicalVolume);
ser.Sync("StartLBA", ref StartLBA);
ser.Sync("EndLBA", ref EndLBA);
ser.Sync("PlayingTrack", ref PlayingTrack);
ser.Sync("CurrentSector", ref CurrentSector);
ser.Sync("SectorOffset", ref SectorOffset);
ser.Sync("FadeOutOverFrames", ref FadeOutOverFrames);
ser.Sync("FadeOutFramesRemaining", ref FadeOutFramesRemaining);
ser.EndSection();
public void LoadStateText(TextReader reader)
{
while (true)
{
string[] args = reader.ReadLine().Split(' ');
if (args[0].Trim() == "") continue;
if (args[0] == "[/CDAudio]") break;
if (args[0] == "Mode")
Mode = (CDAudioMode)Enum.Parse(typeof(CDAudioMode), args[1]);
else if (args[0] == "PlayMode")
PlayMode = (PlaybackMode)Enum.Parse(typeof(PlaybackMode), args[1]);
else if (args[0] == "LogicalVolume")
LogicalVolume = int.Parse(args[1]);
else if (args[0] == "StartLBA")
StartLBA = int.Parse(args[1]);
else if (args[0] == "EndLBA")
EndLBA = int.Parse(args[1]);
else if (args[0] == "PlayingTrack")
PlayingTrack = int.Parse(args[1]);
else if (args[0] == "CurrentSector")
CurrentSector = int.Parse(args[1]);
else if (args[0] == "SectorOffset")
SectorOffset = int.Parse(args[1]);
else if (args[0] == "FadeOutOverFrames")
FadeOutOverFrames = int.Parse(args[1]);
else if (args[0] == "FadeOutFramesRemaining")
FadeOutFramesRemaining = int.Parse(args[1]);
else
Console.WriteLine("Skipping unrecognized identifier " + args[0]);
}
EnsureSector();
}
public void SaveStateBinary(BinaryWriter writer)
{
writer.Write((byte)Mode);
writer.Write((byte)PlayMode);
writer.Write(LogicalVolume);
writer.Write(CurrentSector);
writer.Write(SectorOffset);
writer.Write(StartLBA);
writer.Write(EndLBA);
writer.Write(PlayingTrack);
writer.Write((short)FadeOutOverFrames);
writer.Write((short)FadeOutFramesRemaining);
}
public void LoadStateBinary(BinaryReader reader)
{
Mode = (CDAudioMode)reader.ReadByte();
PlayMode = (PlaybackMode)reader.ReadByte();
LogicalVolume = reader.ReadInt32();
CurrentSector = reader.ReadInt32();
SectorOffset = reader.ReadInt32();
StartLBA = reader.ReadInt32();
EndLBA = reader.ReadInt32();
PlayingTrack = reader.ReadInt32();
FadeOutOverFrames = reader.ReadInt16();
FadeOutFramesRemaining = reader.ReadInt16();
if (ser.IsReader)
EnsureSector();
}
}
}