mirror of
https://github.com/libretro/pcsx2.git
synced 2024-12-20 00:40:47 +00:00
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:
parent
402a52bbc6
commit
3038ccafb9
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -110,6 +110,7 @@ namespace TCPLibrary.MessageBased.Core
|
||||
Connect,
|
||||
MaxUsers,
|
||||
SizeDump,
|
||||
Statistics
|
||||
Statistics,
|
||||
StateOld
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user