/[pcsx2_0.9.7]/trunk/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFTag.cs
ViewVC logotype

Contents of /trunk/tools/GSDumpGUI/Library/GSDump/GSData/GIFPacket/GIFTag.cs

Parent Directory Parent Directory | Revision Log Revision Log


Revision 313 - (show annotations) (download)
Sun Dec 26 16:21:07 2010 UTC (9 years, 9 months ago) by william
File size: 8492 byte(s)
Auto Commited Import of: pcsx2-0.9.7-DEBUG (upstream: v0.9.7.4151 local: v0.9.7.293-latest) in ./trunk
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace GSDumpGUI
6 {
7 public class GIFTag
8 {
9 public delegate GIFReg Unpack(GIFTag tag, int addr, UInt64 LowData, UInt64 HighData, bool PackedFormat);
10 static public Dictionary<int, Unpack> UnpackReg;
11
12 public Int32 nloop;
13 public Int32 eop;
14 public Int32 _pad1;
15 public Int32 _pad2;
16 public Int32 pre;
17 public GIFPrim prim;
18 public GIFFLG flg;
19 public Int32 nreg;
20 public List<IGifData> regs;
21 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
22
23 static GIFTag()
24 {
25 UnpackReg = new Dictionary<int, Unpack>();
26 UnpackReg.Add((int)GIFRegDescriptor.PRIM, GIFRegPRIM.Unpack);
27 UnpackReg.Add((int)GIFRegDescriptor.RGBAQ, GIFRegRGBAQ.Unpack);
28 UnpackReg.Add((int)GIFRegDescriptor.ST, GIFRegST.Unpack);
29 UnpackReg.Add((int)GIFRegDescriptor.UV, GIFRegUV.Unpack);
30 UnpackReg.Add((int)GIFRegDescriptor.XYZF2, GIFRegXYZF.Unpack);
31 UnpackReg.Add((int)GIFRegDescriptor.XYZ2, GIFRegXYZF.UnpackXYZ);
32 UnpackReg.Add((int)GIFRegDescriptor.TEX0_1, GIFRegTEX0.Unpack);
33 UnpackReg.Add((int)GIFRegDescriptor.TEX0_2, GIFRegTEX0.Unpack);
34 UnpackReg.Add((int)GIFRegDescriptor.CLAMP_1, GIFRegUnimpl.Unpack);
35 UnpackReg.Add((int)GIFRegDescriptor.CLAMP_2, GIFRegUnimpl.Unpack);
36 UnpackReg.Add((int)GIFRegDescriptor.FOG, GIFRegFOG.Unpack);
37 UnpackReg.Add((int)GIFRegDescriptor.XYZF3, GIFRegXYZF.Unpack);
38 UnpackReg.Add((int)GIFRegDescriptor.XYZ3, GIFRegXYZF.UnpackXYZ);
39 UnpackReg.Add((int)GIFRegDescriptor.AD, GIFRegAD.Unpack);
40 UnpackReg.Add((int)GIFRegDescriptor.TEX1_1, GIFRegUnimpl.Unpack);
41 UnpackReg.Add((int)GIFRegDescriptor.TEX1_2, GIFRegUnimpl.Unpack);
42 UnpackReg.Add((int)GIFRegDescriptor.TEX2_1, GIFRegUnimpl.Unpack);
43 UnpackReg.Add((int)GIFRegDescriptor.TEX2_2, GIFRegUnimpl.Unpack);
44 UnpackReg.Add((int)GIFRegDescriptor.XYOFFSET_1, GIFRegUnimpl.Unpack);
45 UnpackReg.Add((int)GIFRegDescriptor.XYOFFSET_2, GIFRegUnimpl.Unpack);
46 UnpackReg.Add((int)GIFRegDescriptor.PRMODECONT, GIFRegUnimpl.Unpack);
47 UnpackReg.Add((int)GIFRegDescriptor.PRMODE, GIFRegUnimpl.Unpack);
48 UnpackReg.Add((int)GIFRegDescriptor.TEXCLUT, GIFRegUnimpl.Unpack);
49 UnpackReg.Add((int)GIFRegDescriptor.SCANMSK, GIFRegUnimpl.Unpack);
50 UnpackReg.Add((int)GIFRegDescriptor.MIPTBP1_1, GIFRegUnimpl.Unpack);
51 UnpackReg.Add((int)GIFRegDescriptor.MIPTBP1_2, GIFRegUnimpl.Unpack);
52 UnpackReg.Add((int)GIFRegDescriptor.MIPTBP2_1, GIFRegUnimpl.Unpack);
53 UnpackReg.Add((int)GIFRegDescriptor.MIPTBP2_2, GIFRegUnimpl.Unpack);
54 UnpackReg.Add((int)GIFRegDescriptor.TEXA, GIFRegUnimpl.Unpack);
55 UnpackReg.Add((int)GIFRegDescriptor.FOGCOL, GIFRegUnimpl.Unpack);
56 UnpackReg.Add((int)GIFRegDescriptor.TEXFLUSH, GIFRegUnimpl.Unpack);
57 UnpackReg.Add((int)GIFRegDescriptor.SCISSOR_1, GIFRegUnimpl.Unpack);
58 UnpackReg.Add((int)GIFRegDescriptor.SCISSOR_2, GIFRegUnimpl.Unpack);
59 UnpackReg.Add((int)GIFRegDescriptor.ALPHA_1, GIFRegUnimpl.Unpack);
60 UnpackReg.Add((int)GIFRegDescriptor.ALPHA_2, GIFRegUnimpl.Unpack);
61 UnpackReg.Add((int)GIFRegDescriptor.DIMX, GIFRegUnimpl.Unpack);
62 UnpackReg.Add((int)GIFRegDescriptor.DTHE, GIFRegUnimpl.Unpack);
63 UnpackReg.Add((int)GIFRegDescriptor.COLCLAMP, GIFRegUnimpl.Unpack);
64 UnpackReg.Add((int)GIFRegDescriptor.TEST_1, GIFRegUnimpl.Unpack);
65 UnpackReg.Add((int)GIFRegDescriptor.TEST_2, GIFRegUnimpl.Unpack);
66 UnpackReg.Add((int)GIFRegDescriptor.PABE, GIFRegUnimpl.Unpack);
67 UnpackReg.Add((int)GIFRegDescriptor.FBA_1, GIFRegUnimpl.Unpack);
68 UnpackReg.Add((int)GIFRegDescriptor.FBA_2, GIFRegUnimpl.Unpack);
69 UnpackReg.Add((int)GIFRegDescriptor.FRAME_1, GIFRegUnimpl.Unpack);
70 UnpackReg.Add((int)GIFRegDescriptor.FRAME_2, GIFRegUnimpl.Unpack);
71 UnpackReg.Add((int)GIFRegDescriptor.ZBUF_1, GIFRegUnimpl.Unpack);
72 UnpackReg.Add((int)GIFRegDescriptor.ZBUF_2, GIFRegUnimpl.Unpack);
73 UnpackReg.Add((int)GIFRegDescriptor.BITBLTBUF, GIFRegUnimpl.Unpack);
74 UnpackReg.Add((int)GIFRegDescriptor.TRXPOS, GIFRegUnimpl.Unpack);
75 UnpackReg.Add((int)GIFRegDescriptor.TRXREG, GIFRegUnimpl.Unpack);
76 UnpackReg.Add((int)GIFRegDescriptor.TRXDIR, GIFRegUnimpl.Unpack);
77 UnpackReg.Add((int)GIFRegDescriptor.HWREG, GIFRegUnimpl.Unpack);
78 UnpackReg.Add((int)GIFRegDescriptor.SIGNAL, GIFRegUnimpl.Unpack);
79 UnpackReg.Add((int)GIFRegDescriptor.FINISH, GIFRegUnimpl.Unpack);
80 UnpackReg.Add((int)GIFRegDescriptor.LABEL, GIFRegUnimpl.Unpack);
81 }
82
83 public static Unpack GetUnpack(int reg)
84 {
85 Unpack ret;
86 if (!UnpackReg.TryGetValue(reg, out ret))
87 return GIFRegNOP.Unpack;
88 return ret;
89 }
90
91 static internal GIFTag ExtractGifTag(byte[] data)
92 {
93 Int16 nloopEOP = 0;
94 Int16 pad1 = 0;
95 Int32 pad2PrePrimFlgNReg = 0;
96 Int64 regs = 0;
97
98 nloopEOP = BitConverter.ToInt16(data, 0);
99 pad1 = BitConverter.ToInt16(data, 2);
100 pad2PrePrimFlgNReg = BitConverter.ToInt32(data, 4);
101 regs = BitConverter.ToInt64(data, 8);
102
103 GIFTag t = new GIFTag();
104 t.Q = 1f;
105 t.nloop = (nloopEOP & 0x7FFF);
106 t.eop = (nloopEOP & 0x8000) >> 15;
107 t._pad1 = pad1;
108 t._pad2 = (pad2PrePrimFlgNReg & 0x00003FFF);
109 t.pre = (pad2PrePrimFlgNReg & 0x00004000) >> 14;
110
111 int prim = (pad2PrePrimFlgNReg & 0x03FF8000) >> 15;
112 GIFPrim primm = GIFPrim.ExtractGIFPrim(prim);
113 t.prim = primm;
114
115 t.flg = (GIFFLG)((pad2PrePrimFlgNReg & 0xC000000) >> 26);
116 t.nreg = (int)(pad2PrePrimFlgNReg & 0xF0000000) >> 28;
117 if (t.nreg == 0)
118 t.nreg = 16;
119
120 int[] registers = new int[t.nreg];
121 Unpack[] regsunpack = new Unpack[t.nreg];
122
123 t.regs = new List<IGifData>();
124 for (int i = 0; i < t.nreg; i++)
125 {
126 int reg = (int)(regs >> (i * 4) & 15);
127 registers[i] = reg;
128 regsunpack[i] = GetUnpack(reg);
129 }
130
131 int p = 16;
132 switch (t.flg)
133 {
134 case GIFFLG.GIF_FLG_PACKED:
135 for (int j = 0; j < t.nloop; j++)
136 for (int i = 0; i < t.nreg; i++)
137 {
138 UInt64 LowData = BitConverter.ToUInt64(data, p);
139 UInt64 HighData = BitConverter.ToUInt64(data, p + 8);
140 t.regs.Add(regsunpack[i](t, registers[i], LowData, HighData, true));
141 p += 16;
142 }
143 break;
144 case GIFFLG.GIF_FLG_REGLIST:
145 for (int j = 0; j < t.nloop; j++)
146 for (int i = 0; i < t.nreg; i++)
147 {
148 UInt64 Data = BitConverter.ToUInt64(data, p);
149 t.regs.Add(regsunpack[i](t, registers[i], Data, 0, false));
150 p += 8;
151 }
152 break;
153 case GIFFLG.GIF_FLG_IMAGE:
154 case GIFFLG.GIF_FLG_IMAGE2:
155 GifImage image = new GifImage();
156 image.Data = new byte[t.nloop * 16];
157 Array.Copy(data, 16, image.Data, 0, t.nloop * 16);
158 t.regs.Add(image);
159 break;
160 default:
161 break;
162 }
163 return t;
164 }
165 }
166
167 public enum GIFFLG
168 {
169 GIF_FLG_PACKED =0,
170 GIF_FLG_REGLIST =1,
171 GIF_FLG_IMAGE = 2,
172 GIF_FLG_IMAGE2 = 3
173 }
174 }

  ViewVC Help
Powered by ViewVC 1.1.22