Arachnoid GLESv1.1 plugin. Compile and run (a bit glitchy and no frameskip) on the...
[mupen64plus-pandora.git] / source / mupen64plus-video-arachnoid / src / UCodeDefs.h
1 /******************************************************************************
2  * Arachnoid Graphics Plugin for Mupen64Plus
3  * http://bitbucket.org/wahrhaft/mupen64plus-video-arachnoid/
4  *
5  * Copyright (C) 2007 Kristofer Karlsson, Rickard Niklasson
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20  *****************************************************************************/
21
22 #ifndef _UCODE_DEFS_H_
23 #define _UCODE_DEFS_H_
24
25 //*****************************************************************************
26 // Matrices
27 //*****************************************************************************
28
29 //! Add matrix struct used for example ucode F3D
30 struct RSPUCodeAddMatrix0
31 {
32     unsigned int length:16;       //!< Length
33     unsigned int projection:1;    //!< Is this a projection or view matrix?
34     unsigned int load:1;          //!< Replace current matrix or multiply with it?
35     unsigned int push:1;          //!< Save current matrix in stack? 
36     unsigned int :5;              //!< Padding
37     unsigned int cmd:8;           //!< Command
38     unsigned int segmentAddress;  //!< Address to register where there is an RDRAM address used to retrieve matrix
39 };
40
41 //! Add matrix struct used for example ucode F3DEX2
42 #pragma pack(push, 1)
43 struct RSPUCodeAddMatrixF3DEX2 
44 {
45     union 
46     {
47         struct 
48         {
49             unsigned int param:8;         //!< Push?, Load?, Projection?
50             unsigned int len:16;          //!< Length
51         };
52         struct
53         {
54             unsigned int nopush:1;        //!< Save current matrix in stack? 
55             unsigned int load:1;          //!< Replace current matrix or multiply with it?
56             unsigned int projection:1;    //!< Is this a projection or view matrix?
57             unsigned int :5;              //!< Padding
58             unsigned int lenght:16;       //!< Length
59         };
60     };
61     unsigned int cmd:8;           //!< Command
62     unsigned int segmentAddress:32;  //!< Address to register where there is an RDRAM address used to retrieve matrix
63 };
64 #pragma pack(pop)
65 //*****************************************************************************
66 // Vertices
67 //*****************************************************************************
68
69 //! Add vertices struct used for ucode F3D
70 struct RSPUCodeAddVertices0 
71 {
72     unsigned int length:16;      //!< Length
73     unsigned int firstVertex:4;  //!< Index of first vertex
74     unsigned int numVertices:4;  //!< Number of vertices minus one
75     unsigned int cmd:8;          //!< Command
76     unsigned int segmentAddress; //!< Address to register where there is an RDRAM address used to retrieve vertices
77 };
78 //! Add vertices struct used for ucode F3DEX
79 struct RSPUCodeAddVertices1 
80 {
81     unsigned int length:10;      //!< Length
82     unsigned int numVertices:6;  //!< Number of vertices
83     unsigned int :1;             //!< Padding
84     unsigned int firstVertex:7;  //!< Index of first vertex
85     unsigned int cmd:8;          //!< Command
86     unsigned int segmentAddress; //!< Address to register where there is an RDRAM address used to retrieve vertices
87 };
88
89 //! Add vertices struct used for ucode F3DEX2
90 struct RSPUCodeAddVerticesF3DEX2
91 {
92     unsigned int pad0:1;             //!< Padding
93     unsigned int vertexEnd:7;        //!< Index of last vertex
94     unsigned int pad1:4;             //!< Padding
95     unsigned int numVertices:8;      //!< Number of vertices
96     unsigned int pad2:4;             //!< Padding
97     unsigned int cmd:8;              //!< Command
98     unsigned int segmentAddress:32;  //!< Address to register where there is an RDRAM address used to retrieve vertices
99 };
100
101 //! Add vertices struct used for ucode 9 (Perfect Dark)
102 struct RSPUCode9AddColorIndexVertices
103 {
104     unsigned int pad0:16;             //!< Padding
105     unsigned int firstVertexIndex:4;  //!< Index of first vertex (where to place vertices in vertexbuffer)
106     unsigned int numVertices:4;       //!< Add one
107     unsigned int cmd:8;               //!< Command
108     unsigned int segmentAddress:32;   //!< Address to register where there is an RDRAM address used to retrieve vertices
109 };
110
111 //! Add vertices struct used for ucode 4 (Wave Rave 64)
112 struct RSPUCodeAddVerticesWaveRace64
113 {
114     unsigned int pad0:8;                //!< Padding
115     unsigned int pad1:1;                //!< Padding
116     unsigned int numVertices:7;         //!< Number of vertices
117     unsigned int firstVertexIndex:8;    //!< Index of first vertex (where to place vertices in vertexbuffer)(divide by 5)
118     unsigned int cmd:8;                 //!< Command
119     unsigned int segmentAddress:32;     //!< Address to register where there is an RDRAM address used to retrieve vertices
120 };
121
122 //*****************************************************************************
123 // One triangle
124 //*****************************************************************************
125
126 //! Add triangle struct used for ucode F3D (and F3DEX)
127 struct RSPUCodeAddOneTriangleF3D 
128 {
129     unsigned int padding:24; //!< padding
130     unsigned int cmd:8;      //!< Command
131     unsigned int index2:8;   //!< Third vertex index  (divide by 10 in ucode F3D and 2 in F3DEX, 5 for wave race)
132     unsigned int index1:8;   //!< Second vertex index (divide by 10 in ucode F3D and 2 in F3DEX, 5 for wave race)
133     unsigned int index0:8;   //!< First vertex index  (divide by 10 in ucode F3D and 2 in F3DEX, 5 for wave race)
134     unsigned int flag:8;     //!< ???
135 };
136
137 //! Add triangle struct used for example ucode F3DEX
138 struct RSPUCodeAddOneTriangleF3DEX 
139 {
140     unsigned int padding:24; //!< padding
141     unsigned int cmd:8;      //!< Command
142     unsigned int pad0:1;     //!< Padding
143     unsigned int index2:7;   //!< Third vertex index  
144     unsigned int pad1:1;     //!< Padding
145     unsigned int index1:7;   //!< Second vertex index 
146     unsigned int pad2:1;     //!< Padding
147     unsigned int index0:7;   //!< First vertex index  
148     unsigned int pad3:8;     //!< Padding
149 };
150
151 //! Add triangle struct used for ucode F3DEX2
152 struct RSPUCodeAddOneTriangleF3DEX2 
153 {
154     unsigned int index2:8;   //!< Third vertex index  
155     unsigned int index1:8;   //!< Second vertex index 
156     unsigned int index0:8;   //!< First vertex index  
157     unsigned int cmd:8;      //!< Command
158     unsigned int pad:32;     //!< padding
159 };
160
161 //*****************************************************************************
162 // Two triangles
163 //*****************************************************************************
164
165 //! Add triangle struct used for adding two triangles
166 struct RSPUCodeAddTwoTrianglesWaveRace64
167 {
168     unsigned int v2:8;     //!< Third vertex index for first triangle   (divide by 5 for wave race)
169     unsigned int v1:8;     //!< Second vertex index for first triangle  (divide by 5 for wave race)
170     unsigned int v0:8;     //!< First vertex index for first triangle    (divide by 5 for wave race) 
171     unsigned int cmd:8;    //!< Command
172     unsigned int v5:8;     //!< Third vertex index for second triangle  (divide by 5 for wave race)
173     unsigned int v4:8;     //!< Second vertex index for second triangle (divide by 5 for wave race)
174     unsigned int v3:8;     //!< First vertex index for second triangle    (divide by 5 for wave race) 
175     unsigned int flag:8;   //!< ???
176 };
177
178 //! Add triangle struct used for adding two triangles
179 struct RSPUCodeAddTwoTrianglesF3DEX 
180 {
181     unsigned int pad0:1;   //!< Padding
182     unsigned int v2:7;     //!< Third vertex index for first triangle
183     unsigned int pad1:1;   //!< Padding
184     unsigned int v1:7;     //!< Second vertex index for first triangle
185     unsigned int pad2:1;   //!< Padding
186     unsigned int v0:7;     //!< First vertex index for first triangle    
187     unsigned int cmd:8;    //!< Command
188     unsigned int pad3:1;   //!< Padding
189     unsigned int v5:7;     //!< Third vertex index for second triangle
190     unsigned int pad4:1;   //!< Padding
191     unsigned int v4:7;     //!< Second vertex index for second triangle
192     unsigned int pad8:1;   //!< Padding
193     unsigned int v3:7;     //!< First vertex index for second triangle    
194     unsigned int flag:8;   //!< ???
195 };
196
197 //*****************************************************************************
198 // Four triangles
199 //*****************************************************************************
200
201 //! Add triangle struct used for adding four triangles, used by ucode F3D
202 struct RSPUCodeAddFourTrianglesF3D
203 {
204     unsigned int v0:4;
205     unsigned int v3:4;
206     unsigned int v6:4;
207     unsigned int v9:4;
208     unsigned int pad:8;
209     unsigned int cmd:8;
210     unsigned int v1:4;
211     unsigned int v2:4;
212     unsigned int v4:4;
213     unsigned int v5:4;
214     unsigned int v7:4;
215     unsigned int v8:4;
216     unsigned int v10:4;
217     unsigned int v11:4;
218 };
219
220 //*****************************************************************************
221 // One Quad
222 //*****************************************************************************
223
224 //! Add quad struct used for adding a rectangel, used by ucode F3D
225 struct RSPUCodeAddOneQuadF3D
226 {
227     unsigned int pad0:24;  //!< Padding
228     unsigned int cmd:8;    //!< Command 
229     unsigned int index3:8; //!< (divide by 10, 5 for Wave Race)
230     unsigned int index2:8; //!< (divide by 10, 5 for Wave Race)
231     unsigned int index1:8; //!< (divide by 10, 5 for Wave Race)
232     unsigned int index0:8; //!< (divide by 10, 5 for Wave Race)
233 };
234
235 //! Add quad struct used for adding a rectangel, used by ucode F3DEX
236 struct RSPUCodeAddOneQuadF3DEX
237 {
238     unsigned int pad0:24;  //!< Padding
239     unsigned int cmd:8;    //!< Command 
240     unsigned int pad1:1;   //!< Padding
241     unsigned int index3:7; //!< Index of fourth vertex
242     unsigned int pad2:1;   //!< Padding
243     unsigned int index2:7; //!< Index of third vertex
244     unsigned int pad3:1;   //!< Padding
245     unsigned int index1:7; //!< Index of second vertex
246     unsigned int pad4:1;   //!< Padding
247     unsigned int index0:7; //!< Index of first vertex
248 };
249
250 //! Add quad struct used for adding a rectangel, used by ucode F3DEX2
251 struct RSPUCodeAddOneQuadF3DEX2  //aka TwoTriangles
252 {
253     unsigned int v2:8;
254     unsigned int v1:8;
255     unsigned int v0:8;
256     unsigned int cmd:8;
257     unsigned int v5:8;
258     unsigned int v4:8;
259     unsigned int v3:8;
260     unsigned int pad0:8;
261 };
262
263 //*****************************************************************************
264 // Misc
265 //*****************************************************************************
266
267 //! Struct used to set DMA Offsets (Mainly used by Diddy Kong Racing UCode6)
268 struct RSPUCodeSetDMAOffsets
269 {
270     unsigned int addressOffsetMatrix:24;
271     unsigned int cmd:8;
272     unsigned int addressOffsetVertex:24;
273     unsigned int padding:8;
274 };
275
276 //! Struct used to set Vertex Color Base
277 struct RSPUCodeSetVertexColorBase
278 {
279     unsigned int padding:24;       //!< Padding 
280     unsigned int cmd:8;            //!< Command
281     unsigned int rdramAddress:32;  //!< Address to RDRAM where vertex colors are located.
282 };
283
284 //! Struct used to change display list
285 struct RSPUCodeDisplayList 
286 {
287     unsigned int padding:16;         //!< Padding
288     unsigned int param:8;            //!< Push display list or not?
289     unsigned int cmd:8;              //!< Command
290     unsigned int segmentAddress:32;  //!< 
291 };
292
293 //! Struct used when modifying vertex data
294 struct RSPUCodeModifyVertex
295 {
296     unsigned int pad0:1;          //!< Padding
297     unsigned int vertexIndex:15;  //!< Vertex Index (witch vertex to modify
298     unsigned int modifyType:8;    //!< How to modify vertex (set color or texcoords?)
299     unsigned int cmd:8;           //!< Command
300     union
301     {
302         unsigned int value:16;    //!< Input values for vertex
303         struct
304         {
305             unsigned int a:8;         //!< Alpha component of color
306             unsigned int b:8;         //!< Blue component of color
307             unsigned int g:8;         //!< Green component of color
308             unsigned int r:8;         //!< Red component of color
309         };
310         struct
311         {
312             unsigned int t:16;        //!< Second value of texturecoord
313             unsigned int s:16;        //!< First value of texturecoord
314         };
315     };
316 };
317
318 //*****************************************************************************
319 // Move Word
320 //*****************************************************************************
321
322 //! Struct used to extract information in MoveWord instruction for ucode F3D
323 struct RSPUCodeMoveWordF3D
324 {
325     unsigned int type:8;          //!< Type of MoveWord
326     unsigned int offset:16;       //!< Offset
327     unsigned int cmd:8;           //!< Command
328
329     union
330     {
331         unsigned int value:32;    //!< Value
332         struct
333         {
334             unsigned int fo:16;       //!< Fog
335             unsigned int fm:16;       //!< Fog
336         };
337     };
338 };
339
340 //! Struct used to extract information in MoveWord instruction for ucode F3DEX2  
341 struct RSPUCodeMoveWordF3DEX2 
342 {
343     unsigned int offset:16;     //!< Offset
344     unsigned int type:8;        //!< Type of MoveWord
345     unsigned int cmd:8;         //!< Command
346     union
347     {
348         unsigned int value:32;  //!< Value
349         struct
350         {
351             unsigned int fo:16;     //!< Fog
352             unsigned int fm:16;     //!< Fog
353         };
354     };
355 };
356
357 //*****************************************************************************
358 //* Texture
359 //! Struct used when retriving texture information on RSP 
360 //*****************************************************************************
361 struct RSPUCodeTexture
362 {
363     unsigned int    enable_gbi0:1;
364     unsigned int    enable_gbi2:1;
365     unsigned int    :6;
366     unsigned int    tile:3;
367     unsigned int    level:3;
368     unsigned int    :10;
369     unsigned int    cmd:8;
370     unsigned int    scaleT:16;
371     unsigned int    scaleS:16;
372 };
373
374 //*****************************************************************************
375 //* RSPUCodeLoadUCode
376 //! Struct used when changing ucode on RSP 
377 //*****************************************************************************
378 struct RSPUCodeLoadUCode
379 {
380     unsigned int ucodeSize:16;     //!< UCode size, note: Add one
381     unsigned int padding:8;        //!< Padding?
382     unsigned int cmd:8;            //!< Command
383     unsigned int ucodeStart:32;    //!< UCode Start
384 };
385
386
387 //*****************************************************************************
388 // Display List
389 //*****************************************************************************
390
391 //! Struct used to cull displaylist
392 struct RSPUCodeCullDisplayList
393 {
394     unsigned int pad0:1;             //!< Padding
395     unsigned int vertexIndex:15;     //!< First vertex index to vertices to cull
396     unsigned int pad2:8;             //!< Padding
397     unsigned int cmd:8;              //!< Command
398     unsigned int pad3:1;             //!< Padding
399     unsigned int numVerticies:15;    //!< Number of vertices to cull
400     unsigned int pad4:8;             //!< Padding
401 };
402
403 //! Used by instruction branch display list by ucode F3DEX
404 struct RSPUCodeBranchZF3DEX
405 {
406     unsigned int pad0:1;        //!< Padding
407     unsigned int vertex:11;     //!< Vertex to retrive z value from
408     unsigned int pad1:12;       //!< Padding
409     unsigned int cmd:8;         //!< Command
410     unsigned int zvalue:32;     //!< z value used to compare with
411 }; 
412
413 //*****************************************************************************
414 // Others
415 //*****************************************************************************
416
417 //typedef struct {
418 //    union {
419 //        unsigned int w0;
420 //        struct {
421 //            unsigned int arg0:24;
422 //            unsigned int cmd:8;
423 //        };
424 //    };
425 //    unsigned int w1;
426 //} Gwords;
427
428 //! Stuct used to give GBI instructions input data as function argument.
429 typedef union {
430     struct {
431         union {
432             unsigned int w0;
433             struct {
434                 unsigned int arg0:24;
435                 unsigned int cmd:8;
436             };
437         };
438         unsigned int w1;
439     };
440     long long int force_structure_alignment;
441 } MicrocodeArgument; 
442
443 #endif