1) Resolved the problem with the GSFreeze. Now the states are loaded and reproduced correctly.

2) Put an error message when trying to load old savestates not compatible.
3) Added a clone function for dump. (may be useful later on)


git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4115 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
feal87@gmail.com 2010-12-21 07:29:33 +00:00
parent 402a52bbc6
commit 3038ccafb9
4 changed files with 98 additions and 21 deletions

View File

@ -79,6 +79,16 @@ namespace GSDumpGUI
wrap.GSConfig();
wrap.Unload();
if (GSDXWrapper.DumpTooOld)
{
if (Client != null)
{
TCPMessage msg = new TCPMessage();
msg.MessageType = MessageType.StateOld;
Client.Send(msg);
}
}
if (Client != null)
Client.Disconnect();
}
@ -134,6 +144,12 @@ namespace GSDumpGUI
frmMain.txtRegisters.Text = ((int)Mess.Parameters[6]).ToString();
}), new object[] { null });
break;
case MessageType.StateOld:
frmMain.Invoke(new Action<object>(delegate(object e)
{
MessageBox.Show("Savestate too old to be read. :(", "Warning");
}), new object[] { null });
break;
default:
break;
}

View File

@ -7,12 +7,13 @@ using System.IO;
namespace GSDumpGUI
{
public delegate void GSgifTransfer(IntPtr data, int size);
public delegate void GSgifTransfer1(IntPtr data, int size);
public delegate void GSgifTransfer2(IntPtr data, int size);
public delegate void GSgifTransfer3(IntPtr data, int size);
public delegate void GSVSync(byte field);
public delegate void GSreadFIFO2(IntPtr data, int size);
public delegate void GSsetGameCRC(int crc, int options);
public delegate void GSfreeze(int mode, IntPtr data);
public delegate int GSfreeze(int mode, IntPtr data);
public delegate void GSopen(IntPtr hwnd, String Title, int renderer);
public delegate void GSclose();
public delegate void GSshutdown();
@ -23,9 +24,12 @@ namespace GSDumpGUI
public class GSDXWrapper
{
static public bool DumpTooOld = false;
private GSConfigure gsConfigure;
private PSEgetLibName PsegetLibName;
private GSgifTransfer GSgifTransfer;
private GSgifTransfer1 GSgifTransfer1;
private GSgifTransfer2 GSgifTransfer2;
private GSgifTransfer3 GSgifTransfer3;
private GSVSync GSVSync;
@ -107,6 +111,7 @@ namespace GSDumpGUI
IntPtr funcaddrConfig = NativeMethods.GetProcAddress(hmod, "GSconfigure");
IntPtr funcaddrGIF = NativeMethods.GetProcAddress(hmod, "GSgifTransfer");
IntPtr funcaddrGIF1 = NativeMethods.GetProcAddress(hmod, "GSgifTransfer1");
IntPtr funcaddrGIF2 = NativeMethods.GetProcAddress(hmod, "GSgifTransfer2");
IntPtr funcaddrGIF3 = NativeMethods.GetProcAddress(hmod, "GSgifTransfer3");
IntPtr funcaddrVSync = NativeMethods.GetProcAddress(hmod, "GSvsync");
@ -123,6 +128,7 @@ namespace GSDumpGUI
PsegetLibName = (PSEgetLibName)Marshal.GetDelegateForFunctionPointer(funcaddrLibName, typeof(PSEgetLibName));
this.GSgifTransfer = (GSgifTransfer)Marshal.GetDelegateForFunctionPointer(funcaddrGIF, typeof(GSgifTransfer));
this.GSgifTransfer1 = (GSgifTransfer1)Marshal.GetDelegateForFunctionPointer(funcaddrGIF1, typeof(GSgifTransfer1));
this.GSgifTransfer2 = (GSgifTransfer2)Marshal.GetDelegateForFunctionPointer(funcaddrGIF2, typeof(GSgifTransfer2));
this.GSgifTransfer3 = (GSgifTransfer3)Marshal.GetDelegateForFunctionPointer(funcaddrGIF3, typeof(GSgifTransfer3));
this.GSVSync = (GSVSync)Marshal.GetDelegateForFunctionPointer(funcaddrVSync, typeof(GSVSync));
@ -172,24 +178,37 @@ namespace GSDumpGUI
GSsetGameCRC(dump.CRC, 0);
fixed (byte* freeze = dump.StateData)
{
GSfreeze(0, new IntPtr(freeze));
GSVSync(1);
byte[] GSFreez = new byte[8];
Array.Copy(BitConverter.GetBytes(dump.StateData.Length), 0, GSFreez, 0, 4);
Array.Copy(BitConverter.GetBytes(new IntPtr(freeze).ToInt32()), 0, GSFreez, 4, 4);
while (Running)
fixed (byte* fr = GSFreez)
{
if (!NativeMethods.IsWindowVisible(new IntPtr(HWND)))
int ris = GSfreeze(0, new IntPtr(fr));
if (ris == -1)
{
Running = false;
break;
DumpTooOld = true;
return;
}
foreach (var itm in dump.Data)
{
Step(itm, pointer);
}
}
GSVSync(1);
GSclose();
GSshutdown();
while (Running)
{
if (!NativeMethods.IsWindowVisible(new IntPtr(HWND)))
{
Running = false;
break;
}
foreach (var itm in dump.Data)
{
Step(itm, pointer);
}
}
GSclose();
GSshutdown();
}
}
}
}
@ -203,27 +222,30 @@ namespace GSDumpGUI
switch (((GSTransfer)itm).Path)
{
case GSTransferPath.Path1Old:
fixed (byte* gifdata = itm.data)
byte[] data = new byte[16384];
int addr = 16384 - itm.data.Length;
Array.Copy(itm.data, 0, data, addr, itm.data.Length);
fixed (byte* gifdata = data)
{
GSgifTransfer(new IntPtr(gifdata), (itm.data.Length) / 16);
GSgifTransfer1(new IntPtr(gifdata), addr);
}
break;
case GSTransferPath.Path2:
fixed (byte* gifdata = itm.data)
{
GSgifTransfer2(new IntPtr(gifdata), (itm.data.Length) /16);
GSgifTransfer2(new IntPtr(gifdata), (itm.data.Length) / 16);
}
break;
case GSTransferPath.Path3:
fixed (byte* gifdata = itm.data)
{
GSgifTransfer3(new IntPtr(gifdata), (itm.data.Length) /16);
GSgifTransfer3(new IntPtr(gifdata), (itm.data.Length) / 16);
}
break;
case GSTransferPath.Path1New:
fixed (byte* gifdata = itm.data)
{
GSgifTransfer(new IntPtr(gifdata), (itm.data.Length) /16);
GSgifTransfer(new IntPtr(gifdata), (itm.data.Length) / 16);
}
break;
}

View File

@ -8,6 +8,7 @@ namespace GSDumpGUI
public class GSDump
{
public Int32 CRC;
public byte[] GSFreeze;
public byte[] StateData;
public byte[] Registers; // 8192 bytes
@ -34,14 +35,51 @@ namespace GSDumpGUI
Data = new List<GSData>();
}
public GSDump Clone()
{
GSDump newDump = new GSDump();
newDump.CRC = this.CRC;
byte[] state = new byte[StateData.Length];
Array.Copy(StateData,state, StateData.Length);
newDump.StateData = state;
newDump.Registers = new byte[8192];
Array.Copy(this.Registers, newDump.Registers, 8192);
foreach (var itm in this.Data)
{
if (itm.GetType().IsInstanceOfType(typeof(GSTransfer)))
{
GSTransfer gt = new GSTransfer();
gt.id = itm.id;
gt.Path = ((GSTransfer)itm).Path;
gt.data = new byte[itm.data.Length];
Array.Copy(itm.data, gt.data, itm.data.Length);
newDump.Data.Add(gt);
}
else
{
GSData gt = new GSData();
gt.id = itm.id;
gt.data = new byte[itm.data.Length];
Array.Copy(itm.data, gt.data, itm.data.Length);
newDump.Data.Add(gt);
}
}
return newDump;
}
static public GSDump LoadDump(String FileName)
{
GSDump dmp = new GSDump();
BinaryReader br = new BinaryReader(System.IO.File.Open(FileName, FileMode.Open));
dmp.CRC = br.ReadInt32();
Int32 ss = br.ReadInt32();
dmp.StateData = br.ReadBytes(ss);
dmp.StateData = br.ReadBytes(ss);
dmp.Registers = br.ReadBytes(8192);
while (br.PeekChar() != -1)

View File

@ -110,6 +110,7 @@ namespace TCPLibrary.MessageBased.Core
Connect,
MaxUsers,
SizeDump,
Statistics
Statistics,
StateOld
}
}