2024-12-17 01:30:13 +08:00
|
|
|
|
namespace VirtualNes.Core
|
|
|
|
|
{
|
|
|
|
|
public struct REGSTAT : IStateBufferObject
|
|
|
|
|
{
|
|
|
|
|
public CPUSTAT cpureg;
|
|
|
|
|
public PPUSTAT ppureg;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-12-20 17:24:09 +08:00
|
|
|
|
public uint GetSize()
|
2024-12-17 01:30:13 +08:00
|
|
|
|
{
|
|
|
|
|
return cpureg.GetSize() + ppureg.GetSize();
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-20 17:24:09 +08:00
|
|
|
|
public void SaveState(StateBuffer buffer)
|
2024-12-17 01:30:13 +08:00
|
|
|
|
{
|
|
|
|
|
cpureg.SaveState(buffer);
|
|
|
|
|
ppureg.SaveState(buffer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void LoadState(StateReader buffer)
|
|
|
|
|
{
|
|
|
|
|
cpureg.LoadState(buffer);
|
|
|
|
|
ppureg.LoadState(buffer);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public struct CPUSTAT : IStateBufferObject
|
|
|
|
|
{
|
|
|
|
|
public ushort PC;
|
|
|
|
|
public byte A;
|
|
|
|
|
public byte X;
|
|
|
|
|
public byte Y;
|
|
|
|
|
public byte S;
|
|
|
|
|
public byte P;
|
|
|
|
|
public byte I; // Interrupt pending flag
|
|
|
|
|
|
|
|
|
|
public byte FrameIRQ;
|
|
|
|
|
public byte FrameIRQ_occur;
|
|
|
|
|
public byte FrameIRQ_count;
|
|
|
|
|
public byte FrameIRQ_type;
|
|
|
|
|
public int FrameIRQ_cycles;
|
|
|
|
|
public int DMA_cycles;
|
|
|
|
|
|
|
|
|
|
public long emul_cycles;
|
|
|
|
|
public long base_cycles;
|
|
|
|
|
|
2024-12-20 17:24:09 +08:00
|
|
|
|
public uint GetSize()
|
2024-12-17 01:30:13 +08:00
|
|
|
|
{
|
|
|
|
|
return 32;
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-20 17:24:09 +08:00
|
|
|
|
public void SaveState(StateBuffer buffer)
|
2024-12-17 01:30:13 +08:00
|
|
|
|
{
|
|
|
|
|
buffer.Write(PC);
|
|
|
|
|
buffer.Write(A);
|
|
|
|
|
buffer.Write(X);
|
|
|
|
|
buffer.Write(Y);
|
|
|
|
|
buffer.Write(S);
|
|
|
|
|
buffer.Write(P);
|
|
|
|
|
buffer.Write(I);
|
|
|
|
|
buffer.Write(FrameIRQ);
|
|
|
|
|
buffer.Write(FrameIRQ_occur);
|
|
|
|
|
buffer.Write(FrameIRQ_count);
|
|
|
|
|
buffer.Write(FrameIRQ_type);
|
|
|
|
|
buffer.Write(FrameIRQ_cycles);
|
|
|
|
|
buffer.Write(DMA_cycles);
|
|
|
|
|
buffer.Write(emul_cycles);
|
|
|
|
|
buffer.Write(base_cycles);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void LoadState(StateReader buffer)
|
|
|
|
|
{
|
|
|
|
|
PC = buffer.Read_ushort();
|
|
|
|
|
A = buffer.Read_byte();
|
|
|
|
|
X = buffer.Read_byte();
|
|
|
|
|
Y = buffer.Read_byte();
|
|
|
|
|
S = buffer.Read_byte();
|
|
|
|
|
P = buffer.Read_byte();
|
|
|
|
|
I = buffer.Read_byte();
|
|
|
|
|
FrameIRQ = buffer.Read_byte();
|
|
|
|
|
FrameIRQ_occur = buffer.Read_byte();
|
|
|
|
|
FrameIRQ_count = buffer.Read_byte();
|
|
|
|
|
FrameIRQ_type = buffer.Read_byte();
|
|
|
|
|
FrameIRQ_cycles = buffer.Read_int();
|
|
|
|
|
DMA_cycles = buffer.Read_int();
|
|
|
|
|
emul_cycles = buffer.Read_long();
|
|
|
|
|
base_cycles = buffer.Read_long();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public struct PPUSTAT : IStateBufferObject
|
|
|
|
|
{
|
|
|
|
|
public byte reg0;
|
|
|
|
|
public byte reg1;
|
|
|
|
|
public byte reg2;
|
|
|
|
|
public byte reg3;
|
|
|
|
|
public byte reg7;
|
|
|
|
|
public byte toggle56;
|
|
|
|
|
|
|
|
|
|
public ushort loopy_t;
|
|
|
|
|
public ushort loopy_v;
|
|
|
|
|
public ushort loopy_x;
|
|
|
|
|
|
2024-12-20 17:24:09 +08:00
|
|
|
|
public uint GetSize()
|
2024-12-17 01:30:13 +08:00
|
|
|
|
{
|
|
|
|
|
return 12;
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-20 17:24:09 +08:00
|
|
|
|
public void SaveState(StateBuffer buffer)
|
2024-12-17 01:30:13 +08:00
|
|
|
|
{
|
|
|
|
|
buffer.Write(reg0);
|
|
|
|
|
buffer.Write(reg1);
|
|
|
|
|
buffer.Write(reg2);
|
|
|
|
|
buffer.Write(reg3);
|
|
|
|
|
buffer.Write(reg7);
|
|
|
|
|
buffer.Write(toggle56);
|
|
|
|
|
buffer.Write(loopy_t);
|
|
|
|
|
buffer.Write(loopy_v);
|
|
|
|
|
buffer.Write(loopy_x);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void LoadState(StateReader buffer)
|
|
|
|
|
{
|
|
|
|
|
reg0 = buffer.Read_byte();
|
|
|
|
|
reg1 = buffer.Read_byte();
|
|
|
|
|
reg2 = buffer.Read_byte();
|
|
|
|
|
reg3 = buffer.Read_byte();
|
|
|
|
|
reg7 = buffer.Read_byte();
|
|
|
|
|
toggle56 = buffer.Read_byte();
|
|
|
|
|
loopy_t = buffer.Read_ushort();
|
|
|
|
|
loopy_v = buffer.Read_ushort();
|
|
|
|
|
loopy_x = buffer.Read_ushort();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|