GSDumpGUI: Did a bunch of stuff I don't even remember. Disclaimer: I don't know C#.

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4147 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
sudonim1 2010-12-26 01:00:11 +00:00
parent e89c3cb8cc
commit 050354ff0c
16 changed files with 383 additions and 209 deletions

View File

@ -56,15 +56,17 @@
<DependentUpon>frmMain.cs</DependentUpon> <DependentUpon>frmMain.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFPrim.cs" /> <Compile Include="Library\GSDump\GSData\GIFPacket\GIFPrim.cs" />
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegNOP.cs" />
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegUnimpl.cs" />
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegAD.cs" />
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegTEX0.cs" /> <Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegTEX0.cs" />
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegFOG.cs" /> <Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegFOG.cs" />
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegXYZ.cs" />
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegXYZF.cs" /> <Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegXYZF.cs" />
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegUV.cs" /> <Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegUV.cs" />
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegST.cs" /> <Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegST.cs" />
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFReg.cs" /> <Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFReg.cs" />
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GifImage.cs" /> <Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GifImage.cs" />
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegPrim.cs" /> <Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegPRIM.cs" />
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegRGBAQ.cs" /> <Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\GIFRegRGBAQ.cs" />
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\IGifData.cs" /> <Compile Include="Library\GSDump\GSData\GIFPacket\GIFReg\IGifData.cs" />
<Compile Include="Library\GSDump\GSData\GIFPacket\GIFTag.cs" /> <Compile Include="Library\GSDump\GSData\GIFPacket\GIFTag.cs" />

View File

@ -415,51 +415,7 @@ namespace GSDumpGUI
val += "regs~"; val += "regs~";
foreach (var itm in tag.regs) foreach (var itm in tag.regs)
{ {
if (itm.GetType().IsSubclassOf(typeof(GIFReg))) val += itm.ToString() + "~";
{
if (itm.GetType() == typeof(GIFRegPrim))
{
GIFRegPrim p = (GIFRegPrim)itm;
val += "Packed Primitive@Primitive Type : " + p.PrimitiveType.ToString() + "@IIP : " + p.IIP.ToString() + "@TME : " + p.TME.ToString() + "@FGE : " + p.FGE.ToString()
+ "@ABE : " + p.ABE.ToString() + "@AA1 : " + p.AA1.ToString() + "@FST : " + p.FST.ToString() + "@CTXT : " + p.CTXT.ToString() + "@FIX : " + p.FIX.ToString() + "~";
}
if (itm.GetType() == typeof(GIFRegRGBAQ))
{
GIFRegRGBAQ p = (GIFRegRGBAQ)itm;
val += "Packed RGBAQ@Red : " + p.R.ToString() + "@Green : " + p.G.ToString() + "@Blue : " + p.B.ToString() + "@Alpha : " + p.A.ToString() + "~";
}
if (itm.GetType() == typeof(GIFRegST))
{
GIFRegST p = (GIFRegST)itm;
val += "Packed ST@S : " + p.S.ToString("F8") + "@T : " + p.T.ToString("F8") + "@Q : " + p.Q.ToString("F8") + "~";
}
if (itm.GetType() == typeof(GIFRegUV))
{
GIFRegUV p = (GIFRegUV)itm;
val += "Packed UV@U : " + p.U.ToString("F4") + "@V : " + p.V.ToString("F4") + "~";
}
if (itm.GetType() == typeof(GIFRegXYZF))
{
GIFRegXYZF p = (GIFRegXYZF)itm;
val += "Packed XYZF@X : " + p.X.ToString("F4") + "@Y : " + p.Y.ToString("F4") + "@Z : " + p.Z.ToString() + "@F : " + p.F.ToString() + "@ADC : " + p.ADC.ToString() + "~";
}
if (itm.GetType() == typeof(GIFRegXYZ))
{
GIFRegXYZ p = (GIFRegXYZ)itm;
val += "Packed XYZ@X : " + p.X.ToString("F4") + "@Y : " + p.Y.ToString("F4") + "@Z : " + p.Z.ToString() + "@ADC : " + p.ADC.ToString() + "~";
}
if (itm.GetType() == typeof(GIFRegTEX0))
{
GIFRegTEX0 p = (GIFRegTEX0)itm;
val += "Packed TEX0@TBP0 : " + p.TBP0.ToString() + "@TBW : " + p.TBW.ToString() + "@PSM : " + p.PSM.ToString() + "@TW : " + p.TW.ToString() + "@TH : " + p.TH.ToString()
+ "@TCC : " + p.TCC.ToString() + "@TFX : " + p.TFX.ToString() + "@CBP : " + p.CBP.ToString() + "@CPSM : " + p.CPSM.ToString() + "@CSM : " + p.CSM.ToString()
+ "@CSA : " + p.CSA.ToString() + "@CLD : " + p.CLD.ToString() + "~";
}
}
else
{
}
} }
break; break;
case GSType.VSync: case GSType.VSync:

View File

@ -10,7 +10,12 @@ namespace GSDumpGUI
static public UInt64 GetBit(UInt64 value, byte lower, byte count) static public UInt64 GetBit(UInt64 value, byte lower, byte count)
{ {
return (value >> lower) & (ulong)((Math.Pow(2, count)) - 1); return (value >> lower) & (ulong)((1 << count) - 1);
}
public override string ToString()
{
return Descriptor.ToString();
} }
} }
@ -27,11 +32,51 @@ namespace GSDumpGUI
CLAMP_1 = 0x08, CLAMP_1 = 0x08,
CLAMP_2 = 0x09, CLAMP_2 = 0x09,
FOG = 0x0a, FOG = 0x0a,
Reserved = 0x0b,
XYZF3 = 0x0c, XYZF3 = 0x0c,
XYZ3 = 0x0d, XYZ3 = 0x0d,
AD = 0x0e, AD = 0x0e,
NOP = 0x0f NOP = 0x0f, // actually, 0xf is the standard GIF NOP and 0x7f is the standard GS NOP, but all unregistered addresses act as NOPs... probably
TEX1_1 = 0x14,
TEX1_2 = 0x15,
TEX2_1 = 0x16,
TEX2_2 = 0x17,
XYOFFSET_1 = 0x18,
XYOFFSET_2 = 0x19,
PRMODECONT = 0x1a,
PRMODE = 0x1b,
TEXCLUT = 0x1c,
SCANMSK = 0x22,
MIPTBP1_1 = 0x34,
MIPTBP1_2 = 0x35,
MIPTBP2_1 = 0x36,
MIPTBP2_2 = 0x37,
TEXA = 0x3b,
FOGCOL = 0x3d,
TEXFLUSH = 0x3f,
SCISSOR_1 = 0x40,
SCISSOR_2 = 0x41,
ALPHA_1 = 0x42,
ALPHA_2 = 0x43,
DIMX = 0x44,
DTHE = 0x45,
COLCLAMP = 0x46,
TEST_1 = 0x47,
TEST_2 = 0x48,
PABE = 0x49,
FBA_1 = 0x4a,
FBA_2 = 0x4b,
FRAME_1 = 0x4c,
FRAME_2 = 0x4d,
ZBUF_1 = 0x4e,
ZBUF_2 = 0x4f,
BITBLTBUF = 0x50,
TRXPOS = 0x51,
TRXREG = 0x52,
TRXDIR = 0x53,
HWREG = 0x54,
SIGNAL = 0x60,
FINISH = 0x61,
LABEL = 0x62,
} }
} }

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace GSDumpGUI
{
public class GIFRegAD : GIFReg
{
static public GIFReg Unpack(GIFTag tag, int addr, UInt64 LowData, UInt64 HighData, bool PackedFormat)
{
int reg = (int)GetBit(HighData, 0, 8);
if (reg == (int)GIFRegDescriptor.AD)
return GIFRegNOP.Unpack(tag, reg, LowData, HighData, PackedFormat);
return GIFTag.GetUnpack(reg)(tag, reg, LowData, 0, false);
}
}
}

View File

@ -8,11 +8,14 @@ namespace GSDumpGUI
{ {
public double F; public double F;
static public GIFReg Unpack(UInt64 LowData, UInt64 HighData, bool PlainFormat) static public GIFReg Unpack(GIFTag tag, int addr, UInt64 LowData, UInt64 HighData, bool PackedFormat)
{ {
GIFRegFOG u = new GIFRegFOG(); GIFRegFOG u = new GIFRegFOG();
u.Descriptor = GIFRegDescriptor.FOG; u.Descriptor = (GIFRegDescriptor)addr;
u.F = (UInt16)(GIFReg.GetBit(HighData, 36, 8)); if (PackedFormat)
u.F = (UInt16)(GetBit(HighData, 36, 8));
else
u.F = GetBit(LowData, 56, 8);
return u; return u;
} }
} }

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace GSDumpGUI
{
public class GIFRegNOP : GIFReg
{
static public GIFReg Unpack(GIFTag tag, int addr, UInt64 LowData, UInt64 HighData, bool PackedFormat)
{
GIFRegNOP nop = new GIFRegNOP();
nop.Descriptor = GIFRegDescriptor.NOP;
return nop;
}
}
}

View File

@ -4,7 +4,7 @@ using System.Text;
namespace GSDumpGUI namespace GSDumpGUI
{ {
public class GIFRegPrim : GIFReg public class GIFRegPRIM : GIFReg
{ {
public GS_PRIM PrimitiveType; public GS_PRIM PrimitiveType;
public GSIIP IIP; public GSIIP IIP;
@ -16,21 +16,27 @@ namespace GSDumpGUI
public GSCTXT CTXT; public GSCTXT CTXT;
public GSFIX FIX; public GSFIX FIX;
static public GIFReg Unpack(UInt64 LowData, UInt64 HighData, bool PlainFormat) static public GIFReg Unpack(GIFTag tag, int addr, UInt64 LowData, UInt64 HighData, bool PackedFormat)
{ {
GIFRegPrim pr = new GIFRegPrim(); GIFRegPRIM pr = new GIFRegPRIM();
pr.Descriptor = GIFRegDescriptor.PRIM; pr.Descriptor = (GIFRegDescriptor)addr;
pr.PrimitiveType = (GS_PRIM)GIFReg.GetBit(LowData, 0, 3); pr.PrimitiveType = (GS_PRIM)GetBit(LowData, 0, 3);
pr.IIP = (GSIIP)GIFReg.GetBit(LowData, 3, 1); pr.IIP = (GSIIP)GetBit(LowData, 3, 1);
pr.TME = Convert.ToBoolean(GIFReg.GetBit(LowData, 4, 1)); pr.TME = Convert.ToBoolean(GetBit(LowData, 4, 1));
pr.FGE = Convert.ToBoolean(GIFReg.GetBit(LowData, 5, 1)); pr.FGE = Convert.ToBoolean(GetBit(LowData, 5, 1));
pr.ABE = Convert.ToBoolean(GIFReg.GetBit(LowData, 6, 1)); pr.ABE = Convert.ToBoolean(GetBit(LowData, 6, 1));
pr.AA1 = Convert.ToBoolean(GIFReg.GetBit(LowData, 7, 1)); pr.AA1 = Convert.ToBoolean(GetBit(LowData, 7, 1));
pr.FST = (GSFST)(GIFReg.GetBit(LowData, 8, 1)); pr.FST = (GSFST)(GetBit(LowData, 8, 1));
pr.CTXT = (GSCTXT)(GIFReg.GetBit(LowData, 9, 1)); pr.CTXT = (GSCTXT)(GetBit(LowData, 9, 1));
pr.FIX = (GSFIX)(GIFReg.GetBit(LowData, 10, 1)); pr.FIX = (GSFIX)(GetBit(LowData, 10, 1));
return pr; return pr;
} }
public override string ToString()
{
return Descriptor.ToString() + "@Primitive Type : " + PrimitiveType.ToString() + "@IIP : " + IIP.ToString() + "@TME : " + TME.ToString() + "@FGE : " + FGE.ToString()
+ "@ABE : " + ABE.ToString() + "@AA1 : " + AA1.ToString() + "@FST : " + FST.ToString() + "@CTXT : " + CTXT.ToString() + "@FIX : " + FIX.ToString();
}
} }
public enum GSIIP public enum GSIIP

View File

@ -10,16 +10,34 @@ namespace GSDumpGUI
public int G; public int G;
public int B; public int B;
public int A; public int A;
public float Q;
static public GIFReg Unpack(UInt64 LowData, UInt64 HighData, bool PlainFormat) static public GIFReg Unpack(GIFTag tag, int addr, UInt64 LowData, UInt64 HighData, bool PackedFormat)
{ {
GIFRegRGBAQ r = new GIFRegRGBAQ(); GIFRegRGBAQ r = new GIFRegRGBAQ();
r.Descriptor = GIFRegDescriptor.RGBAQ; r.Descriptor = (GIFRegDescriptor)addr;
r.R = (int)GIFReg.GetBit(LowData, 0, 8); if (PackedFormat)
r.G = (int)GIFReg.GetBit(LowData, 32, 8); {
r.B = (int)GIFReg.GetBit(HighData, 0, 8); r.R = (int)GetBit(LowData, 0, 8);
r.A = (int)GIFReg.GetBit(HighData, 32, 8); r.G = (int)GetBit(LowData, 32, 8);
r.B = (int)GetBit(HighData, 0, 8);
r.A = (int)GetBit(HighData, 32, 8);
r.Q = tag.Q;
}
else
{
r.R = (int)GetBit(LowData, 0, 8);
r.G = (int)GetBit(LowData, 8, 8);
r.B = (int)GetBit(LowData, 16, 8);
r.A = (int)GetBit(LowData, 24, 8);
r.Q = BitConverter.ToSingle(BitConverter.GetBytes(LowData), 4);
}
return r; return r;
} }
public override string ToString()
{
return Descriptor.ToString() + "@Red : " + R.ToString() + "@Green : " + G.ToString() + "@Blue : " + B.ToString() + "@Alpha : " + A.ToString();
}
} }
} }

View File

@ -10,26 +10,30 @@ namespace GSDumpGUI
public float T; public float T;
public float Q; public float Q;
static public GIFReg Unpack(UInt64 LowData, UInt64 HighData, bool PlainFormat) public bool isSTQ;
static public GIFReg Unpack(GIFTag tag, int addr, UInt64 LowData, UInt64 HighData, bool PackedFormat)
{ {
unsafe GIFRegST st = new GIFRegST();
st.Descriptor = (GIFRegDescriptor)addr;
st.S = BitConverter.ToSingle(BitConverter.GetBytes(LowData), 0);
st.T = BitConverter.ToSingle(BitConverter.GetBytes(LowData), 4);
if (PackedFormat)
{ {
GIFRegST st = new GIFRegST(); st.Q = BitConverter.ToSingle(BitConverter.GetBytes(HighData), 0);
st.Descriptor = GIFRegDescriptor.ST; tag.Q = st.Q;
st.isSTQ = true;
ulong pt = GIFReg.GetBit(LowData, 0, 32);
void* ptt = &pt;
st.S = *(float*)ptt;
pt = GIFReg.GetBit(LowData, 32, 32);
ptt = &pt;
st.T = *(float*)ptt;
pt = GIFReg.GetBit(HighData, 0, 32);
ptt = &pt;
st.Q = *(float*)ptt;
return st;
} }
else
st.isSTQ = false;
return st;
}
public override string ToString()
{
return Descriptor.ToString() + "@S : " + S.ToString("F8") + "@T : " + T.ToString("F8") + (isSTQ ? "@Q : " + Q.ToString("F8") : "");
} }
} }
} }

View File

@ -19,23 +19,30 @@ namespace GSDumpGUI
public int CSA; public int CSA;
public int CLD; public int CLD;
static public GIFReg Unpack(UInt64 LowData, UInt64 HighData, bool PlainFormat) static public GIFReg Unpack(GIFTag tag, int addr, UInt64 LowData, UInt64 HighData, bool PackedFormat)
{ {
GIFRegTEX0 r = new GIFRegTEX0(); GIFRegTEX0 tex0 = new GIFRegTEX0();
r.Descriptor = GIFRegDescriptor.TEX0_1; tex0.Descriptor = (GIFRegDescriptor)addr;
r.TBP0 = (int)GetBit(LowData, 0, 14); tex0.TBP0 = (int)GetBit(LowData, 0, 14);
r.TBW = (int)GetBit(LowData, 14, 6); tex0.TBW = (int)GetBit(LowData, 14, 6);
r.PSM = (TEXPSM)(int)GetBit(LowData, 20, 6); tex0.PSM = (TEXPSM)(int)GetBit(LowData, 20, 6);
r.TW = (int)GetBit(LowData, 26, 4); tex0.TW = (int)GetBit(LowData, 26, 4);
r.TH = (int)GetBit(LowData, 30, 4); tex0.TH = (int)GetBit(LowData, 30, 4);
r.TCC = (TEXTCC)(int)GetBit(LowData, 34, 1); tex0.TCC = (TEXTCC)(int)GetBit(LowData, 34, 1);
r.TFX = (TEXTFX)(int)GetBit(LowData, 35, 2); tex0.TFX = (TEXTFX)(int)GetBit(LowData, 35, 2);
r.CBP = (int)GetBit(LowData, 37, 14); tex0.CBP = (int)GetBit(LowData, 37, 14);
r.CPSM = (TEXCPSM)(int)GetBit(LowData, 51, 4); tex0.CPSM = (TEXCPSM)(int)GetBit(LowData, 51, 4);
r.CSM = (TEXCSM)(int)GetBit(LowData, 55, 1); tex0.CSM = (TEXCSM)(int)GetBit(LowData, 55, 1);
r.CSA = (int)GetBit(LowData, 56, 5); tex0.CSA = (int)GetBit(LowData, 56, 5);
r.CLD = (int)GetBit(LowData, 61, 3); tex0.CLD = (int)GetBit(LowData, 61, 3);
return r; return tex0;
}
public override string ToString()
{
return Descriptor.ToString() + "@TBP0 : " + TBP0.ToString() + "@TBW : " + TBW.ToString() + "@PSM : " + PSM.ToString() + "@TW : " + TW.ToString() + "@TH : " + TH.ToString()
+ "@TCC : " + TCC.ToString() + "@TFX : " + TFX.ToString() + "@CBP : " + CBP.ToString() + "@CPSM : " + CPSM.ToString() + "@CSM : " + CSM.ToString()
+ "@CSA : " + CSA.ToString() + "@CLD : " + CLD.ToString();
} }
} }

View File

@ -9,13 +9,26 @@ namespace GSDumpGUI
public double U; public double U;
public double V; public double V;
static public GIFReg Unpack(UInt64 LowData, UInt64 HighData, bool PlainFormat) static public GIFReg Unpack(GIFTag tag, int addr, UInt64 LowData, UInt64 HighData, bool PackedFormat)
{ {
GIFRegUV u = new GIFRegUV(); GIFRegUV uv = new GIFRegUV();
u.Descriptor = GIFRegDescriptor.UV; uv.Descriptor = (GIFRegDescriptor)addr;
u.U = GIFReg.GetBit(LowData, 0, 14) / 16d; if (PackedFormat)
u.V = GIFReg.GetBit(LowData, 32, 14) / 16d; {
return u; uv.U = GetBit(LowData, 0, 14) / 16d;
uv.V = GetBit(LowData, 32, 14) / 16d;
}
else
{
uv.U = GetBit(LowData, 0, 14) / 16d;
uv.V = GetBit(LowData, 16, 14) / 16d;
}
return uv;
}
public override string ToString()
{
return Descriptor.ToString() + "@U : " + U.ToString("F4") + "@V : " + V.ToString("F4");
} }
} }
} }

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace GSDumpGUI
{
public class GIFRegUnimpl : GIFReg
{
static public GIFReg Unpack(GIFTag tag, int addr, UInt64 LowData, UInt64 HighData, bool PackedFormat)
{
GIFRegUnimpl u = new GIFRegUnimpl();
u.Descriptor = (GIFRegDescriptor)addr;
return u;
}
}
}

View File

@ -1,25 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace GSDumpGUI
{
public class GIFRegXYZ : GIFReg
{
public double X;
public double Y;
public UInt32 Z;
public bool ADC;
static public GIFReg Unpack(UInt64 LowData, UInt64 HighData, bool PlainFormat)
{
GIFRegXYZ xf = new GIFRegXYZ();
xf.ADC = GIFReg.GetBit(HighData, 47, 1) == 1;
xf.Descriptor = (xf.ADC == true ? GIFRegDescriptor.XYZ3 : GIFRegDescriptor.XYZ2);
xf.X = GIFReg.GetBit(LowData, 0, 16) / 16d;
xf.Y = GIFReg.GetBit(LowData, 32, 16) / 16d;
xf.Z = (UInt32)(GIFReg.GetBit(HighData, 4, 24));
return xf;
}
}
}

View File

@ -10,18 +10,64 @@ namespace GSDumpGUI
public double Y; public double Y;
public UInt32 Z; public UInt32 Z;
public UInt16 F; public UInt16 F;
public bool ADC;
static public GIFReg Unpack(UInt64 LowData, UInt64 HighData, bool PlainFormat) public bool IsXYZF;
static public GIFReg UnpackXYZ(GIFTag tag, int addr, UInt64 LowData, UInt64 HighData, bool PackedFormat)
{ {
GIFRegXYZF xf2 = new GIFRegXYZF(); GIFRegXYZF xyzf = new GIFRegXYZF();
xf2.ADC = GIFReg.GetBit(HighData, 47, 1) == 1;
xf2.Descriptor = (xf2.ADC == true ? GIFRegDescriptor.XYZF3 : GIFRegDescriptor.XYZF2); xyzf.IsXYZF = false;
xf2.X = GIFReg.GetBit(LowData, 0, 16) / 16d; if (PackedFormat && addr == (int)GIFRegDescriptor.XYZ2 && GetBit(HighData, 47, 1) == 1)
xf2.Y = GIFReg.GetBit(LowData, 32, 16) / 16d; xyzf.Descriptor = GIFRegDescriptor.XYZ3;
xf2.Z = (UInt32)(GIFReg.GetBit(HighData, 4, 24)); else
xf2.F = (UInt16)(GIFReg.GetBit(HighData, 36, 8)); xyzf.Descriptor = (GIFRegDescriptor)addr;
return xf2;
if (PackedFormat)
{
xyzf.X = GetBit(LowData, 0, 16) / 16d;
xyzf.Y = GetBit(LowData, 32, 16) / 16d;
xyzf.Z = (UInt32)(GetBit(HighData, 0, 32));
}
else
{
xyzf.X = GetBit(LowData, 0, 16) / 16d;
xyzf.Y = GetBit(LowData, 16, 16) / 16d;
xyzf.Z = (UInt32)(GetBit(LowData, 32, 32));
}
return xyzf;
}
static public GIFReg Unpack(GIFTag tag, int addr, UInt64 LowData, UInt64 HighData, bool PackedFormat)
{
GIFRegXYZF xyzf = new GIFRegXYZF();
xyzf.IsXYZF = true;
if (PackedFormat && addr == (int)GIFRegDescriptor.XYZF2 && GetBit(HighData, 47, 1) == 1)
xyzf.Descriptor = GIFRegDescriptor.XYZF3;
else
xyzf.Descriptor = (GIFRegDescriptor)addr;
if (PackedFormat)
{
xyzf.X = GetBit(LowData, 0, 16) / 16d;
xyzf.Y = GetBit(LowData, 32, 16) / 16d;
xyzf.Z = (UInt32)(GetBit(HighData, 4, 24));
xyzf.F = (UInt16)(GetBit(HighData, 36, 8));
}
else
{
xyzf.X = GetBit(LowData, 0, 16) / 16d;
xyzf.Y = GetBit(LowData, 16, 16) / 16d;
xyzf.Z = (UInt32)(GetBit(LowData, 32, 24));
xyzf.F = (UInt16)(GetBit(LowData, 56, 8));
}
return xyzf;
}
public override string ToString()
{
return Descriptor.ToString() + "@X : " + X.ToString("F4") + "@Y : " + Y.ToString("F4") + "@Z : " + Z.ToString() + (IsXYZF ? "@F : " + F.ToString() : "");
} }
} }
} }

View File

@ -6,7 +6,6 @@ namespace GSDumpGUI
{ {
public class GifImage : IGifData public class GifImage : IGifData
{ {
public byte[] LowData; public byte[] Data;
public byte[] HighData;
} }
} }

View File

@ -6,8 +6,8 @@ namespace GSDumpGUI
{ {
public class GIFTag public class GIFTag
{ {
public delegate GIFReg Unpack(UInt64 LowData, UInt64 HighData, bool PlainFormat); public delegate GIFReg Unpack(GIFTag tag, int addr, UInt64 LowData, UInt64 HighData, bool PackedFormat);
static public Dictionary<int, Unpack> Registers; static public Dictionary<int, Unpack> UnpackReg;
public Int32 nloop; public Int32 nloop;
public Int32 eop; public Int32 eop;
@ -18,22 +18,78 @@ namespace GSDumpGUI
public GIFFLG flg; public GIFFLG flg;
public Int32 nreg; public Int32 nreg;
public List<IGifData> regs; public List<IGifData> regs;
public float Q; // GIF has an internal Q register which is reset to 1.0 at the tag and updated on packed ST(Q) for output at next RGBAQ
static internal unsafe GIFTag ExtractGifTag(byte[] data)
static GIFTag()
{ {
Registers = new Dictionary<int, Unpack>(); UnpackReg = new Dictionary<int, Unpack>();
Registers.Add((int)GIFRegDescriptor.PRIM, new Unpack(GIFRegPrim.Unpack)); UnpackReg.Add((int)GIFRegDescriptor.PRIM, GIFRegPRIM.Unpack);
Registers.Add((int)GIFRegDescriptor.ST, new Unpack(GIFRegST.Unpack)); UnpackReg.Add((int)GIFRegDescriptor.RGBAQ, GIFRegRGBAQ.Unpack);
Registers.Add((int)GIFRegDescriptor.TEX0_1, new Unpack(GIFRegTEX0.Unpack)); UnpackReg.Add((int)GIFRegDescriptor.ST, GIFRegST.Unpack);
Registers.Add((int)GIFRegDescriptor.TEX0_2, new Unpack(GIFRegTEX0.Unpack)); UnpackReg.Add((int)GIFRegDescriptor.UV, GIFRegUV.Unpack);
Registers.Add((int)GIFRegDescriptor.XYZ2, new Unpack(GIFRegXYZ.Unpack)); UnpackReg.Add((int)GIFRegDescriptor.XYZF2, GIFRegXYZF.Unpack);
Registers.Add((int)GIFRegDescriptor.XYZ3, new Unpack(GIFRegXYZ.Unpack)); UnpackReg.Add((int)GIFRegDescriptor.XYZ2, GIFRegXYZF.UnpackXYZ);
Registers.Add((int)GIFRegDescriptor.XYZF2, new Unpack(GIFRegXYZF.Unpack)); UnpackReg.Add((int)GIFRegDescriptor.TEX0_1, GIFRegTEX0.Unpack);
Registers.Add((int)GIFRegDescriptor.XYZF3, new Unpack(GIFRegXYZF.Unpack)); UnpackReg.Add((int)GIFRegDescriptor.TEX0_2, GIFRegTEX0.Unpack);
Registers.Add((int)GIFRegDescriptor.FOG, new Unpack(GIFRegFOG.Unpack)); UnpackReg.Add((int)GIFRegDescriptor.CLAMP_1, GIFRegUnimpl.Unpack);
Registers.Add((int)GIFRegDescriptor.UV, new Unpack(GIFRegUV.Unpack)); UnpackReg.Add((int)GIFRegDescriptor.CLAMP_2, GIFRegUnimpl.Unpack);
Registers.Add((int)GIFRegDescriptor.RGBAQ, new Unpack(GIFRegRGBAQ.Unpack)); UnpackReg.Add((int)GIFRegDescriptor.FOG, GIFRegFOG.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.XYZF3, GIFRegXYZF.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.XYZ3, GIFRegXYZF.UnpackXYZ);
UnpackReg.Add((int)GIFRegDescriptor.AD, GIFRegAD.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.TEX1_1, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.TEX1_2, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.TEX2_1, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.TEX2_2, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.XYOFFSET_1, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.XYOFFSET_2, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.PRMODECONT, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.PRMODE, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.TEXCLUT, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.SCANMSK, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.MIPTBP1_1, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.MIPTBP1_2, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.MIPTBP2_1, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.MIPTBP2_2, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.TEXA, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.FOGCOL, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.TEXFLUSH, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.SCISSOR_1, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.SCISSOR_2, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.ALPHA_1, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.ALPHA_2, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.DIMX, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.DTHE, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.COLCLAMP, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.TEST_1, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.TEST_2, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.PABE, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.FBA_1, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.FBA_2, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.FRAME_1, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.FRAME_2, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.ZBUF_1, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.ZBUF_2, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.BITBLTBUF, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.TRXPOS, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.TRXREG, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.TRXDIR, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.HWREG, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.SIGNAL, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.FINISH, GIFRegUnimpl.Unpack);
UnpackReg.Add((int)GIFRegDescriptor.LABEL, GIFRegUnimpl.Unpack);
}
public static Unpack GetUnpack(int reg)
{
Unpack ret;
if (!UnpackReg.TryGetValue(reg, out ret))
return GIFRegNOP.Unpack;
return ret;
}
static internal GIFTag ExtractGifTag(byte[] data)
{
Int16 nloopEOP = 0; Int16 nloopEOP = 0;
Int16 pad1 = 0; Int16 pad1 = 0;
Int32 pad2PrePrimFlgNReg = 0; Int32 pad2PrePrimFlgNReg = 0;
@ -45,6 +101,7 @@ namespace GSDumpGUI
regs = BitConverter.ToInt64(data, 8); regs = BitConverter.ToInt64(data, 8);
GIFTag t = new GIFTag(); GIFTag t = new GIFTag();
t.Q = 1f;
t.nloop = (nloopEOP & 0x7FFF); t.nloop = (nloopEOP & 0x7FFF);
t.eop = (nloopEOP & 0x8000) >> 15; t.eop = (nloopEOP & 0x8000) >> 15;
t._pad1 = pad1; t._pad1 = pad1;
@ -57,57 +114,51 @@ namespace GSDumpGUI
t.flg = (GIFFLG)((pad2PrePrimFlgNReg & 0xC000000) >> 26); t.flg = (GIFFLG)((pad2PrePrimFlgNReg & 0xC000000) >> 26);
t.nreg = (int)(pad2PrePrimFlgNReg & 0xF0000000) >> 28; t.nreg = (int)(pad2PrePrimFlgNReg & 0xF0000000) >> 28;
if (t.nreg == 0)
t.nreg = 16;
List<GIFRegDescriptor> registers = new List<GIFRegDescriptor>(); int[] registers = new int[t.nreg];
Unpack[] regsunpack = new Unpack[t.nreg];
t.regs = new List<IGifData>(); t.regs = new List<IGifData>();
for (int i = 0; i < t.nreg; i++) for (int i = 0; i < t.nreg; i++)
registers.Add((GIFRegDescriptor)((regs & (Convert.ToInt32(Math.Pow(16, i + 1)) - 1)) >> i * 4));
for (int j = 0; j < t.nloop; j++)
{ {
for (int i = 0; i < registers.Count; i++) int reg = (int)(regs >> (i * 4) & 15);
{ registers[i] = reg;
UInt64 LowData = BitConverter.ToUInt64(data, (16 + (i * 16) + (j * 16 * registers.Count))); regsunpack[i] = GetUnpack(reg);
UInt64 HighData = BitConverter.ToUInt64(data, (16 + (i * 16) + 8 + (j * 16 * registers.Count))); }
switch (t.flg) int p = 16;
{ switch (t.flg)
case GIFFLG.GIF_FLG_PACKED: {
try case GIFFLG.GIF_FLG_PACKED:
{ for (int j = 0; j < t.nloop; j++)
if (registers[i] == GIFRegDescriptor.AD) for (int i = 0; i < t.nreg; i++)
{ {
int destaddr = (int)(HighData & 0xF); UInt64 LowData = BitConverter.ToUInt64(data, p);
t.regs.Add(Registers[destaddr].Invoke(LowData, HighData, false)); UInt64 HighData = BitConverter.ToUInt64(data, p + 8);
} t.regs.Add(regsunpack[i](t, registers[i], LowData, HighData, true));
else p += 16;
t.regs.Add(Registers[(int)registers[i]].Invoke(LowData, HighData, false)); }
} break;
catch (Exception) case GIFFLG.GIF_FLG_REGLIST:
{ for (int j = 0; j < t.nloop; j++)
// For now till we get all regs implemented for (int i = 0; i < t.nreg; i++)
} {
break; UInt64 Data = BitConverter.ToUInt64(data, p);
case GIFFLG.GIF_FLG_REGLIST: t.regs.Add(regsunpack[i](t, registers[i], Data, 0, false));
t.regs.Add(Registers[(int)registers[i]].Invoke(LowData, HighData, true)); p += 8;
break; }
case GIFFLG.GIF_FLG_IMAGE: break;
GifImage image = new GifImage(); case GIFFLG.GIF_FLG_IMAGE:
image.LowData = BitConverter.GetBytes(LowData); case GIFFLG.GIF_FLG_IMAGE2:
image.HighData = BitConverter.GetBytes(HighData); GifImage image = new GifImage();
t.regs.Add(image); image.Data = new byte[t.nloop * 16];
break; Array.Copy(data, 16, image.Data, 0, t.nloop * 16);
case GIFFLG.GIF_FLG_IMAGE2: t.regs.Add(image);
GifImage image2 = new GifImage(); break;
image2.LowData = BitConverter.GetBytes(LowData); default:
image2.HighData = BitConverter.GetBytes(HighData); break;
t.regs.Add(image2);
break;
default:
break;
}
}
} }
return t; return t;
} }