1 #ifndef GBI_H
2 #define GBI_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include <stdio.h>
9 #include <stdint.h>
10 
11 // Microcode Types
12 #define F3D         0
13 #define F3DEX       1
14 #define F3DEX2      2
15 #define L3D         3
16 #define L3DEX       4
17 #define L3DEX2      5
18 #define S2DEX       6
19 #define S2DEX2      7
20 #define F3DPD       8
21 #define F3DDKR      9
22 #define F3DJFG		  10
23 #define F3DSWSE     11
24 #define F3DWRUS		12
25 #define F3DEX2CBFD	13
26 #define Turbo3D		14
27 #define ZSortp		15
28 #define NONE		16
29 
30 #define F3DCBFD_MV_VIEWPORT     8
31 #define F3DCBFD_MV_LIGHT        10
32 #define F3DCBFD_MV_NORMAL       14
33 
34 static const int numMicrocodeTypes = 11;
35 
36 // Fixed point conversion factors
37 #define FIXED2FLOATRECIP1   0.5f
38 #define FIXED2FLOATRECIP2   0.25f
39 #define FIXED2FLOATRECIP3   0.125f
40 #define FIXED2FLOATRECIP4   0.0625f
41 #define FIXED2FLOATRECIP5   0.03125f
42 #define FIXED2FLOATRECIP6   0.015625f
43 #define FIXED2FLOATRECIP7   0.0078125f
44 #define FIXED2FLOATRECIP8   0.00390625f
45 #define FIXED2FLOATRECIP9   0.001953125f
46 #define FIXED2FLOATRECIP10  0.0009765625f
47 #define FIXED2FLOATRECIP11  0.00048828125f
48 #define FIXED2FLOATRECIP12  0.00024414063f
49 #define FIXED2FLOATRECIP13  0.00012207031f
50 #define FIXED2FLOATRECIP14  6.1035156e-05f
51 #define FIXED2FLOATRECIP15  3.0517578e-05f
52 #define FIXED2FLOATRECIP16  1.5258789e-05f
53 
54 #define _FIXED2FLOAT( v, b ) ((float)v * FIXED2FLOATRECIP##b)
55 
56 // Useful macros for decoding GBI command's parameters
57 #define _SHIFTL( v, s, w )  (((uint32_t)v & ((0x01 << w) - 1)) << s)
58 #define _SHIFTR( v, s, w )  (((uint32_t)v >> s) & ((0x01 << w) - 1))
59 
60 // BG flags
61 #define G_BGLT_LOADBLOCK    0x0033
62 #define G_BGLT_LOADTILE     0xfff4
63 
64 #define G_BG_FLAG_FLIPS     0x01
65 #define G_BG_FLAG_FLIPT     0x10
66 
67 // Sprite object render modes
68 #define G_OBJRM_NOTXCLAMP       0x01
69 #define G_OBJRM_XLU             0x02    /* Ignored */
70 #define G_OBJRM_ANTIALIAS       0x04    /* Ignored */
71 #define G_OBJRM_BILERP          0x08
72 #define G_OBJRM_SHRINKSIZE_1    0x10
73 #define G_OBJRM_SHRINKSIZE_2    0x20
74 #define G_OBJRM_WIDEN           0x40
75 
76 // Sprite texture loading types
77 #define G_OBJLT_TXTRBLOCK   0x00001033
78 #define G_OBJLT_TXTRTILE    0x00fc1034
79 #define G_OBJLT_TLUT        0x00000030
80 
81 
82 // These are all the constant flags
83 #define G_ZBUFFER               0x00000001
84 #define G_SHADE                 0x00000004
85 #define G_FOG                   0x00010000
86 #define G_LIGHTING              0x00020000
87 #define G_TEXTURE_GEN           0x00040000
88 #define G_TEXTURE_GEN_LINEAR    0x00080000
89 #define G_LOD                   0x00100000
90 #define G_POINT_LIGHTING		  0x00400000
91 
92 #define G_MV_MMTX       2
93 #define G_MV_PMTX       6
94 #define G_MV_LIGHT      10
95 #define G_MV_POINT      12
96 #define G_MV_MATRIX     14
97 #define G_MV_NORMALES	14
98 
99 #define G_MVO_LOOKATX   0
100 #define G_MVO_LOOKATY   24
101 #define G_MVO_L0        48
102 #define G_MVO_L1        72
103 #define G_MVO_L2        96
104 #define G_MVO_L3        120
105 #define G_MVO_L4        144
106 #define G_MVO_L5        168
107 #define G_MVO_L6        192
108 #define G_MVO_L7        216
109 
110 #define G_MV_LOOKATY    0x82
111 #define G_MV_LOOKATX    0x84
112 #define G_MV_L0         0x86
113 #define G_MV_L1         0x88
114 #define G_MV_L2         0x8a
115 #define G_MV_L3         0x8c
116 #define G_MV_L4         0x8e
117 #define G_MV_L5         0x90
118 #define G_MV_L6         0x92
119 #define G_MV_L7         0x94
120 #define G_MV_TXTATT     0x96
121 #define G_MV_MATRIX_1   0x9E
122 #define G_MV_MATRIX_2   0x98
123 #define G_MV_MATRIX_3   0x9A
124 #define G_MV_MATRIX_4   0x9C
125 
126 #define G_MW_MATRIX         0x00
127 #define G_MW_NUMLIGHT       0x02
128 #define G_MW_CLIP           0x04
129 #define G_MW_SEGMENT        0x06
130 #define G_MW_FOG            0x08
131 #define G_MW_LIGHTCOL       0x0A
132 #define G_MW_FORCEMTX       0x0C
133 #define G_MW_POINTS         0x0C
134 #define G_MW_PERSPNORM      0x0E
135 #define G_MV_COORDMOD       0x10    //Conker Bad Fur Day
136 
137 #define G_MWO_NUMLIGHT      0x00
138 #define G_MWO_CLIP_RNX      0x04
139 #define G_MWO_CLIP_RNY      0x0c
140 #define G_MWO_CLIP_RPX      0x14
141 #define G_MWO_CLIP_RPY      0x1c
142 #define G_MWO_SEGMENT_0     0x00
143 #define G_MWO_SEGMENT_1     0x01
144 #define G_MWO_SEGMENT_2     0x02
145 #define G_MWO_SEGMENT_3     0x03
146 #define G_MWO_SEGMENT_4     0x04
147 #define G_MWO_SEGMENT_5     0x05
148 #define G_MWO_SEGMENT_6     0x06
149 #define G_MWO_SEGMENT_7     0x07
150 #define G_MWO_SEGMENT_8     0x08
151 #define G_MWO_SEGMENT_9     0x09
152 #define G_MWO_SEGMENT_A     0x0a
153 #define G_MWO_SEGMENT_B     0x0b
154 #define G_MWO_SEGMENT_C     0x0c
155 #define G_MWO_SEGMENT_D     0x0d
156 #define G_MWO_SEGMENT_E     0x0e
157 #define G_MWO_SEGMENT_F     0x0f
158 #define G_MWO_FOG           0x00
159 
160 #define G_MWO_MATRIX_XX_XY_I    0x00
161 #define G_MWO_MATRIX_XZ_XW_I    0x04
162 #define G_MWO_MATRIX_YX_YY_I    0x08
163 #define G_MWO_MATRIX_YZ_YW_I    0x0C
164 #define G_MWO_MATRIX_ZX_ZY_I    0x10
165 #define G_MWO_MATRIX_ZZ_ZW_I    0x14
166 #define G_MWO_MATRIX_WX_WY_I    0x18
167 #define G_MWO_MATRIX_WZ_WW_I    0x1C
168 #define G_MWO_MATRIX_XX_XY_F    0x20
169 #define G_MWO_MATRIX_XZ_XW_F    0x24
170 #define G_MWO_MATRIX_YX_YY_F    0x28
171 #define G_MWO_MATRIX_YZ_YW_F    0x2C
172 #define G_MWO_MATRIX_ZX_ZY_F    0x30
173 #define G_MWO_MATRIX_ZZ_ZW_F    0x34
174 #define G_MWO_MATRIX_WX_WY_F    0x38
175 #define G_MWO_MATRIX_WZ_WW_F    0x3C
176 #define G_MWO_POINT_RGBA        0x10
177 #define G_MWO_POINT_ST          0x14
178 #define G_MWO_POINT_XYSCREEN    0x18
179 #define G_MWO_POINT_ZSCREEN     0x1C
180 
181 #ifdef DEBUG
182 static const char *MWOPointText[] =
183 {
184     "G_MWO_POINT_RGBA",
185     "G_MWO_POINT_ST",
186     "G_MWO_POINT_XYSCREEN",
187     "G_MWO_POINT_ZSCREEN"
188 };
189 
190 static const char *MWOMatrixText[] =
191 {
192     "G_MWO_MATRIX_XX_XY_I", "G_MWO_MATRIX_XZ_XW_I", "G_MWO_MATRIX_YX_YY_I", "G_MWO_MATRIX_YZ_YW_I",
193     "G_MWO_MATRIX_ZX_ZY_I", "G_MWO_MATRIX_ZZ_ZW_I", "G_MWO_MATRIX_WX_WY_I", "G_MWO_MATRIX_WZ_WW_I",
194     "G_MWO_MATRIX_XX_XY_F", "G_MWO_MATRIX_XZ_XW_F", "G_MWO_MATRIX_YX_YY_F", "G_MWO_MATRIX_YZ_YW_F",
195     "G_MWO_MATRIX_ZX_ZY_F", "G_MWO_MATRIX_ZZ_ZW_F", "G_MWO_MATRIX_WX_WY_F", "G_MWO_MATRIX_WZ_WW_F"
196 };
197 #endif
198 
199 // These flags change between ucodes
200 extern uint32_t G_MTX_STACKSIZE;
201 
202 extern uint32_t G_MTX_MODELVIEW;
203 extern uint32_t G_MTX_PROJECTION;
204 extern uint32_t G_MTX_MUL;
205 extern uint32_t G_MTX_LOAD;
206 extern uint32_t G_MTX_NOPUSH;
207 extern uint32_t G_MTX_PUSH;
208 
209 extern uint32_t G_TEXTURE_ENABLE;
210 extern uint32_t G_SHADING_SMOOTH;
211 extern uint32_t G_CULL_FRONT;
212 extern uint32_t G_CULL_BACK;
213 extern uint32_t G_CULL_BOTH;
214 extern uint32_t G_CLIPPING;
215 
216 extern uint32_t G_MV_VIEWPORT;
217 
218 extern uint32_t G_MWO_aLIGHT_1, G_MWO_bLIGHT_1;
219 extern uint32_t G_MWO_aLIGHT_2, G_MWO_bLIGHT_2;
220 extern uint32_t G_MWO_aLIGHT_3, G_MWO_bLIGHT_3;
221 extern uint32_t G_MWO_aLIGHT_4, G_MWO_bLIGHT_4;
222 extern uint32_t G_MWO_aLIGHT_5, G_MWO_bLIGHT_5;
223 extern uint32_t G_MWO_aLIGHT_6, G_MWO_bLIGHT_6;
224 extern uint32_t G_MWO_aLIGHT_7, G_MWO_bLIGHT_7;
225 extern uint32_t G_MWO_aLIGHT_8, G_MWO_bLIGHT_8;
226 
227 // Image formats
228 #define G_IM_FMT_RGBA   0
229 #define G_IM_FMT_YUV    1
230 #define G_IM_FMT_CI     2
231 #define G_IM_FMT_IA     3
232 #define G_IM_FMT_I      4
233 #define G_IM_FMT_CI_IA  5   //not real
234 
235 // Image sizes
236 #define G_IM_SIZ_4b     0
237 #define G_IM_SIZ_8b     1
238 #define G_IM_SIZ_16b    2
239 #define G_IM_SIZ_32b    3
240 #define G_IM_SIZ_DD     5
241 
242 #define G_TX_MIRROR     0x1
243 #define G_TX_CLAMP      0x2
244 
245 #ifdef DEBUG
246 static const char *ImageFormatText[] =
247 {
248     "G_IM_FMT_RGBA",
249     "G_IM_FMT_YUV",
250     "G_IM_FMT_CI",
251     "G_IM_FMT_IA",
252     "G_IM_FMT_I",
253     "G_IM_FMT_INVALID",
254     "G_IM_FMT_INVALID",
255     "G_IM_FMT_INVALID"
256 };
257 
258 static const char *ImageSizeText[] =
259 {
260     "G_IM_SIZ_4b",
261     "G_IM_SIZ_8b",
262     "G_IM_SIZ_16b",
263     "G_IM_SIZ_32b"
264 };
265 
266 static const char *SegmentText[] =
267 {
268     "G_MWO_SEGMENT_0", "G_MWO_SEGMENT_1", "G_MWO_SEGMENT_2", "G_MWO_SEGMENT_3",
269     "G_MWO_SEGMENT_4", "G_MWO_SEGMENT_5", "G_MWO_SEGMENT_6", "G_MWO_SEGMENT_7",
270     "G_MWO_SEGMENT_8", "G_MWO_SEGMENT_9", "G_MWO_SEGMENT_A", "G_MWO_SEGMENT_B",
271     "G_MWO_SEGMENT_C", "G_MWO_SEGMENT_D", "G_MWO_SEGMENT_E", "G_MWO_SEGMENT_F"
272 };
273 #endif
274 
275 #define G_NOOP                  0x00
276 
277 #define G_IMMFIRST              -65
278 
279 // These GBI commands are common to all ucodes
280 #define G_SETCIMG               0xFF    /*  -1 */
281 #define G_SETZIMG               0xFE    /*  -2 */
282 #define G_SETTIMG               0xFD    /*  -3 */
283 #define G_SETCOMBINE            0xFC    /*  -4 */
284 #define G_SETENVCOLOR           0xFB    /*  -5 */
285 #define G_SETPRIMCOLOR          0xFA    /*  -6 */
286 #define G_SETBLENDCOLOR         0xF9    /*  -7 */
287 #define G_SETFOGCOLOR           0xF8    /*  -8 */
288 #define G_SETFILLCOLOR          0xF7    /*  -9 */
289 #define G_FILLRECT              0xF6    /* -10 */
290 #define G_SETTILE               0xF5    /* -11 */
291 #define G_LOADTILE              0xF4    /* -12 */
292 #define G_LOADBLOCK             0xF3    /* -13 */
293 #define G_SETTILESIZE           0xF2    /* -14 */
294 #define G_LOADTLUT              0xF0    /* -16 */
295 #define G_RDPSETOTHERMODE       0xEF    /* -17 */
296 #define G_SETPRIMDEPTH          0xEE    /* -18 */
297 #define G_SETSCISSOR            0xED    /* -19 */
298 #define G_SETCONVERT            0xEC    /* -20 */
299 #define G_SETKEYR               0xEB    /* -21 */
300 #define G_SETKEYGB              0xEA    /* -22 */
301 #define G_RDPFULLSYNC           0xE9    /* -23 */
302 #define G_RDPTILESYNC           0xE8    /* -24 */
303 #define G_RDPPIPESYNC           0xE7    /* -25 */
304 #define G_RDPLOADSYNC           0xE6    /* -26 */
305 #define G_TEXRECTFLIP           0xE5    /* -27 */
306 #define G_TEXRECT               0xE4    /* -28 */
307 
308 #define G_RDPNOOP               0xC0
309 
310 #define G_TRI_FILL              0xC8    /* fill triangle:            11001000 */
311 #define G_TRI_FILL_ZBUFF        0xC9    /* fill, zbuff triangle:     11001001 */
312 #define G_TRI_TXTR              0xCA    /* texture triangle:         11001010 */
313 #define G_TRI_TXTR_ZBUFF        0xCB    /* texture, zbuff triangle:  11001011 */
314 #define G_TRI_SHADE             0xCC    /* shade triangle:           11001100 */
315 #define G_TRI_SHADE_ZBUFF       0xCD    /* shade, zbuff triangle:    11001101 */
316 #define G_TRI_SHADE_TXTR        0xCE    /* shade, texture triangle:  11001110 */
317 #define G_TRI_SHADE_TXTR_ZBUFF  0xCF    /* shade, txtr, zbuff trngl: 11001111 */
318 
319 /*
320  * G_SETOTHERMODE_L sft: shift count
321  */
322 #define G_MDSFT_ALPHACOMPARE    0
323 #define G_MDSFT_ZSRCSEL         2
324 #define G_MDSFT_RENDERMODE      3
325 #define G_MDSFT_BLENDER         16
326 
327 /*
328  * G_SETOTHERMODE_H sft: shift count
329  */
330 #define G_MDSFT_BLENDMASK       0   /* unsupported */
331 #define G_MDSFT_ALPHADITHER     4
332 #define G_MDSFT_RGBDITHER       6
333 
334 #define G_MDSFT_COMBKEY         8
335 #define G_MDSFT_TEXTCONV        9
336 #define G_MDSFT_TEXTFILT        12
337 #define G_MDSFT_TEXTLUT         14
338 #define G_MDSFT_TEXTLOD         16
339 #define G_MDSFT_TEXTDETAIL      17
340 #define G_MDSFT_TEXTPERSP       19
341 #define G_MDSFT_CYCLETYPE       20
342 #define G_MDSFT_COLORDITHER     22  /* unsupported in HW 2.0 */
343 #define G_MDSFT_PIPELINE        23
344 
345 /* G_SETOTHERMODE_H gPipelineMode */
346 #define G_PM_1PRIMITIVE         1
347 #define G_PM_NPRIMITIVE         0
348 
349 /* G_SETOTHERMODE_H gSetCycleType */
350 #define G_CYC_1CYCLE            0
351 #define G_CYC_2CYCLE            1
352 #define G_CYC_COPY              2
353 #define G_CYC_FILL              3
354 
355 /* G_SETOTHERMODE_H gSetTexturePersp */
356 #define G_TP_NONE               0
357 #define G_TP_PERSP              1
358 
359 /* G_SETOTHERMODE_H gSetTextureDetail */
360 #define G_TD_CLAMP              0
361 #define G_TD_SHARPEN            1
362 #define G_TD_DETAIL             2
363 
364 /* G_SETOTHERMODE_H gSetTextureLOD */
365 #define G_TL_TILE               0
366 #define G_TL_LOD                1
367 
368 /* G_SETOTHERMODE_H gSetTextureLUT */
369 #define G_TT_NONE               0
370 #define G_TT_RGBA16             2
371 #define G_TT_IA16               3
372 
373 /* G_SETOTHERMODE_H gSetTextureFilter */
374 #define G_TF_POINT              0
375 #define G_TF_AVERAGE            3
376 #define G_TF_BILERP             2
377 
378 /* G_SETOTHERMODE_H gSetTextureConvert */
379 #define G_TC_CONV               0
380 #define G_TC_FILTCONV           5
381 #define G_TC_FILT               6
382 
383 /* G_SETOTHERMODE_H gSetCombineKey */
384 #define G_CK_NONE               0
385 #define G_CK_KEY                1
386 
387 /* G_SETOTHERMODE_H gSetColorDither */
388 #define G_CD_MAGICSQ            0
389 #define G_CD_BAYER              1
390 #define G_CD_NOISE              2
391 
392 #define G_CD_DISABLE            3
393 #define G_CD_ENABLE             G_CD_NOISE  /* HW 1.0 compatibility mode */
394 
395 /* G_SETOTHERMODE_H gSetAlphaDither */
396 #define G_AD_PATTERN            0
397 #define G_AD_NOTPATTERN         1
398 #define G_AD_NOISE              2
399 #define G_AD_DISABLE            3
400 
401 /* G_SETOTHERMODE_L gSetAlphaCompare */
402 #define G_AC_NONE               0
403 #define G_AC_THRESHOLD          1
404 #define G_AC_DITHER             3
405 
406 /* G_SETOTHERMODE_L gSetDepthSource */
407 #define G_ZS_PIXEL              0
408 #define G_ZS_PRIM               1
409 
410 /* G_SETOTHERMODE_L gSetRenderMode */
411 #define AA_EN                   1
412 #define Z_CMP                   1
413 #define Z_UPD                   1
414 #define IM_RD                   1
415 #define CLR_ON_CVG              1
416 #define CVG_DST_CLAMP           0
417 #define CVG_DST_WRAP            1
418 #define CVG_DST_FULL            2
419 #define CVG_DST_SAVE            3
420 #define ZMODE_OPA               0
421 #define ZMODE_INTER             1
422 #define ZMODE_XLU               2
423 #define ZMODE_DEC               3
424 #define CVG_X_ALPHA             1
425 #define ALPHA_CVG_SEL           1
426 #define FORCE_BL                1
427 #define TEX_EDGE                0 // not used
428 
429 #define G_SC_NON_INTERLACE      0
430 #define G_SC_EVEN_INTERLACE     2
431 #define G_SC_ODD_INTERLACE      3
432 
433 #ifdef DEBUG
434 static const char *AAEnableText = "AA_EN";
435 static const char *DepthCompareText = "Z_CMP";
436 static const char *DepthUpdateText = "Z_UPD";
437 static const char *ClearOnCvgText = "CLR_ON_CVG";
438 static const char *CvgXAlphaText = "CVG_X_ALPHA";
439 static const char *AlphaCvgSelText = "ALPHA_CVG_SEL";
440 static const char *ForceBlenderText = "FORCE_BL";
441 
442 static const char *AlphaCompareText[] =
443 {
444     "G_AC_NONE", "G_AC_THRESHOLD", "G_AC_INVALID", "G_AC_DITHER"
445 };
446 
447 static const char *DepthSourceText[] =
448 {
449     "G_ZS_PIXEL", "G_ZS_PRIM"
450 };
451 
452 static const char *AlphaDitherText[] =
453 {
454     "G_AD_PATTERN", "G_AD_NOTPATTERN", "G_AD_NOISE", "G_AD_DISABLE"
455 };
456 
457 static const char *ColorDitherText[] =
458 {
459     "G_CD_MAGICSQ", "G_CD_BAYER", "G_CD_NOISE", "G_CD_DISABLE"
460 };
461 
462 static const char *CombineKeyText[] =
463 {
464     "G_CK_NONE", "G_CK_KEY"
465 };
466 
467 static const char *TextureConvertText[] =
468 {
469     "G_TC_CONV", "G_TC_INVALID", "G_TC_INVALID", "G_TC_INVALID", "G_TC_INVALID", "G_TC_FILTCONV", "G_TC_FILT", "G_TC_INVALID"
470 };
471 
472 static const char *TextureFilterText[] =
473 {
474     "G_TF_POINT", "G_TF_INVALID", "G_TF_BILERP", "G_TF_AVERAGE"
475 };
476 
477 static const char *TextureLUTText[] =
478 {
479     "G_TT_NONE", "G_TT_INVALID", "G_TT_RGBA16", "G_TT_IA16"
480 };
481 
482 static const char *TextureLODText[] =
483 {
484     "G_TL_TILE", "G_TL_LOD"
485 };
486 
487 static const char *TextureDetailText[] =
488 {
489     "G_TD_CLAMP", "G_TD_SHARPEN", "G_TD_DETAIL"
490 };
491 
492 static const char *TexturePerspText[] =
493 {
494     "G_TP_NONE", "G_TP_PERSP"
495 };
496 
497 static const char *CycleTypeText[] =
498 {
499     "G_CYC_1CYCLE", "G_CYC_2CYCLE", "G_CYC_COPY", "G_CYC_FILL"
500 };
501 
502 static const char *PipelineModeText[] =
503 {
504     "G_PM_NPRIMITIVE", "G_PM_1PRIMITIVE"
505 };
506 
507 static const char *CvgDestText[] =
508 {
509     "CVG_DST_CLAMP", "CVG_DST_WRAP", "CVG_DST_FULL", "CVG_DST_SAVE"
510 };
511 
512 static const char *DepthModeText[] =
513 {
514     "ZMODE_OPA", "ZMODE_INTER", "ZMODE_XLU", "ZMODE_DEC"
515 };
516 
517 static const char *ScissorModeText[] =
518 {
519     "G_SC_NON_INTERLACE", "G_SC_INVALID", "G_SC_EVEN_INTERLACE", "G_SC_ODD_INTERLACE"
520 };
521 #endif
522 
523 /* Color combiner constants: */
524 #define G_CCMUX_COMBINED        0
525 #define G_CCMUX_TEXEL0          1
526 #define G_CCMUX_TEXEL1          2
527 #define G_CCMUX_PRIMITIVE       3
528 #define G_CCMUX_SHADE           4
529 #define G_CCMUX_ENVIRONMENT     5
530 #define G_CCMUX_CENTER          6
531 #define G_CCMUX_SCALE           6
532 #define G_CCMUX_COMBINED_ALPHA  7
533 #define G_CCMUX_TEXEL0_ALPHA    8
534 #define G_CCMUX_TEXEL1_ALPHA    9
535 #define G_CCMUX_PRIMITIVE_ALPHA 10
536 #define G_CCMUX_SHADE_ALPHA     11
537 #define G_CCMUX_ENV_ALPHA       12
538 #define G_CCMUX_LOD_FRACTION    13
539 #define G_CCMUX_PRIM_LOD_FRAC   14
540 #define G_CCMUX_NOISE           7
541 #define G_CCMUX_K4              7
542 #define G_CCMUX_K5              15
543 #define G_CCMUX_1               6
544 #define G_CCMUX_0               31
545 
546 /* Alpha combiner constants: */
547 #define G_ACMUX_COMBINED        0
548 #define G_ACMUX_TEXEL0          1
549 #define G_ACMUX_TEXEL1          2
550 #define G_ACMUX_PRIMITIVE       3
551 #define G_ACMUX_SHADE           4
552 #define G_ACMUX_ENVIRONMENT     5
553 #define G_ACMUX_LOD_FRACTION    0
554 #define G_ACMUX_PRIM_LOD_FRAC   6
555 #define G_ACMUX_1               6
556 #define G_ACMUX_0               7
557 
558 #ifdef DEBUG
559 static const char *saRGBText[] =
560 {
561     "COMBINED",         "TEXEL0",           "TEXEL1",           "PRIMITIVE",
562     "SHADE",            "ENVIRONMENT",      "NOISE",            "1",
563     "0",                "0",                "0",                "0",
564     "0",                "0",                "0",                "0"
565 };
566 
567 static const char *sbRGBText[] =
568 {
569     "COMBINED",         "TEXEL0",           "TEXEL1",           "PRIMITIVE",
570     "SHADE",            "ENVIRONMENT",      "CENTER",           "K4",
571     "0",                "0",                "0",                "0",
572     "0",                "0",                "0",                "0"
573 };
574 
575 static const char *mRGBText[] =
576 {
577     "COMBINED",         "TEXEL0",           "TEXEL1",           "PRIMITIVE",
578     "SHADE",            "ENVIRONMENT",      "SCALE",            "COMBINED_ALPHA",
579     "TEXEL0_ALPHA",     "TEXEL1_ALPHA",     "PRIMITIVE_ALPHA",  "SHADE_ALPHA",
580     "ENV_ALPHA",        "LOD_FRACTION",     "PRIM_LOD_FRAC",    "K5",
581     "0",                "0",                "0",                "0",
582     "0",                "0",                "0",                "0",
583     "0",                "0",                "0",                "0",
584     "0",                "0",                "0",                "0"
585 };
586 
587 static const char *aRGBText[] =
588 {
589     "COMBINED",         "TEXEL0",           "TEXEL1",           "PRIMITIVE",
590     "SHADE",            "ENVIRONMENT",      "1",                "0",
591 };
592 
593 static const char *saAText[] =
594 {
595     "COMBINED",         "TEXEL0",           "TEXEL1",           "PRIMITIVE",
596     "SHADE",            "ENVIRONMENT",      "1",                "0",
597 };
598 
599 static const char *sbAText[] =
600 {
601     "COMBINED",         "TEXEL0",           "TEXEL1",           "PRIMITIVE",
602     "SHADE",            "ENVIRONMENT",      "1",                "0",
603 };
604 
605 static const char *mAText[] =
606 {
607     "LOD_FRACTION",     "TEXEL0",           "TEXEL1",           "PRIMITIVE",
608     "SHADE",            "ENVIRONMENT",      "PRIM_LOD_FRAC",    "0",
609 };
610 
611 static const char *aAText[] =
612 {
613     "COMBINED",         "TEXEL0",           "TEXEL1",           "PRIMITIVE",
614     "SHADE",            "ENVIRONMENT",      "1",                "0",
615 };
616 #endif
617 
618 extern uint32_t G_RDPHALF_1, G_RDPHALF_2, G_RDPHALF_CONT;
619 extern uint32_t G_SPNOOP;
620 extern uint32_t G_SETOTHERMODE_H, G_SETOTHERMODE_L;
621 extern uint32_t G_DL, G_ENDDL, G_CULLDL, G_BRANCH_Z;
622 extern uint32_t G_LOAD_UCODE;
623 extern uint32_t G_MOVEMEM, G_MOVEWORD;
624 extern uint32_t G_MTX, G_POPMTX;
625 extern uint32_t G_GEOMETRYMODE, G_SETGEOMETRYMODE, G_CLEARGEOMETRYMODE;
626 extern uint32_t G_TEXTURE;
627 extern uint32_t G_DMA_IO, G_DMA_DL, G_DMA_TRI, G_DMA_MTX, G_DMA_VTX, G_DMA_TEX_OFFSET, G_DMA_OFFSETS;
628 extern uint32_t G_SPECIAL_1, G_SPECIAL_2, G_SPECIAL_3;
629 extern uint32_t G_VTX, G_MODIFYVTX, G_VTXCOLORBASE;
630 extern uint32_t G_TRI1, G_TRI2, G_TRI4;
631 extern uint32_t G_QUAD, G_LINE3D;
632 extern uint32_t G_RESERVED0, G_RESERVED1, G_RESERVED2, G_RESERVED3;
633 extern uint32_t G_SPRITE2D_BASE;
634 extern uint32_t G_BG_1CYC, G_BG_COPY;
635 extern uint32_t G_OBJ_RECTANGLE, G_OBJ_SPRITE, G_OBJ_MOVEMEM;
636 extern uint32_t G_SELECT_DL, G_OBJ_RENDERMODE, G_OBJ_RECTANGLE_R;
637 extern uint32_t G_OBJ_LOADTXTR, G_OBJ_LDTX_SPRITE, G_OBJ_LDTX_RECT, G_OBJ_LDTX_RECT_R;
638 extern uint32_t G_RDPHALF_0, G_TRI_UNKNOWN;
639 
640 #define LIGHT_1 1
641 #define LIGHT_2 2
642 #define LIGHT_3 3
643 #define LIGHT_4 4
644 #define LIGHT_5 5
645 #define LIGHT_6 6
646 #define LIGHT_7 7
647 #define LIGHT_8 8
648 
649 #define G_DL_PUSH       0x00
650 #define G_DL_NOPUSH     0x01
651 
652 typedef struct
653 {
654     int16_t y;
655     int16_t x;
656 
657     uint16_t flag;
658     int16_t z;
659 
660     int16_t t;
661     int16_t s;
662 
663     union {
664         struct
665         {
666             uint8_t a;
667             uint8_t b;
668             uint8_t g;
669             uint8_t r;
670         } color;
671         struct
672         {
673             int8_t a;
674             int8_t z;   // b
675             int8_t y;   //g
676             int8_t x;   //r
677         } normal;
678     };
679 } Vertex;
680 
681 typedef struct
682 {
683     int16_t y, x;
684     uint16_t ci;
685     int16_t z;
686     int16_t t, s;
687 } PDVertex;
688 
689 
690 typedef struct
691 {
692     uint8_t      v2, v1, v0, flag;
693     int16_t     t0, s0;
694     int16_t     t1, s1;
695     int16_t     t2, s2;
696 } DKRTriangle;
697 
698 typedef struct
699 {
700     uint8_t pad0, b, g, r;
701     uint8_t pad1, b2, g2, r2;
702     int8_t pad2, z, y, x;
703 } Light;
704 
705 // GBI commands
706 typedef void (*GBIFunc)( uint32_t w0, uint32_t w1 );
707 
708 
709 typedef struct
710 {
711     uint32_t type;
712     uint32_t NoN;
713     uint32_t crc;
714     const char *text;
715 } SpecialMicrocodeInfo;
716 
717 typedef struct MicrocodeInfo
718 {
719     uint32_t address, dataAddress;
720     uint16_t dataSize;
721     uint32_t type;
722     uint32_t NoN;
723     uint32_t crc;
724     uint32_t *text;
725 
726     struct MicrocodeInfo *higher, *lower;
727 } MicrocodeInfo;
728 
729 typedef struct
730 {
731     GBIFunc cmd[256];
732 
733     uint32_t PCStackSize, numMicrocodes;
734     MicrocodeInfo *current, *top, *bottom;
735 } GBIInfo;
736 
737 extern GBIInfo GBI;
738 
739 uint32_t GBI_GetCurrentMicrocodeType(void);
740 void GBI_MakeCurrent( MicrocodeInfo *current );
741 MicrocodeInfo *GBI_DetectMicrocode( uint32_t uc_start, uint32_t uc_dstart, uint16_t uc_dsize );
742 extern uint32_t last_good_ucode;
743 void GBI_Init(void);
744 void GBI_Destroy(void);
745 
746 // Allows easier setting of GBI commands
747 #define GBI_SetGBI( command, value, function ) \
748     command = value; \
749     GBI.cmd[command] = function
750 
751 #define GBI_InitFlags( ucode ) \
752     G_MTX_STACKSIZE     = ucode##_MTX_STACKSIZE; \
753     G_MTX_MODELVIEW     = ucode##_MTX_MODELVIEW; \
754     G_MTX_PROJECTION    = ucode##_MTX_PROJECTION; \
755     G_MTX_MUL           = ucode##_MTX_MUL; \
756     G_MTX_LOAD          = ucode##_MTX_LOAD; \
757     G_MTX_NOPUSH        = ucode##_MTX_NOPUSH; \
758     G_MTX_PUSH          = ucode##_MTX_PUSH; \
759 \
760     G_TEXTURE_ENABLE    = ucode##_TEXTURE_ENABLE; \
761     G_SHADING_SMOOTH    = ucode##_SHADING_SMOOTH; \
762     G_CULL_FRONT        = ucode##_CULL_FRONT; \
763     G_CULL_BACK         = ucode##_CULL_BACK; \
764     G_CULL_BOTH         = ucode##_CULL_BOTH; \
765     G_CLIPPING          = ucode##_CLIPPING; \
766 \
767     G_MV_VIEWPORT       = ucode##_MV_VIEWPORT; \
768 \
769     G_MWO_aLIGHT_1      = ucode##_MWO_aLIGHT_1; \
770     G_MWO_bLIGHT_1      = ucode##_MWO_bLIGHT_1; \
771     G_MWO_aLIGHT_2      = ucode##_MWO_aLIGHT_2; \
772     G_MWO_bLIGHT_2      = ucode##_MWO_bLIGHT_2; \
773     G_MWO_aLIGHT_3      = ucode##_MWO_aLIGHT_3; \
774     G_MWO_bLIGHT_3      = ucode##_MWO_bLIGHT_3; \
775     G_MWO_aLIGHT_4      = ucode##_MWO_aLIGHT_4; \
776     G_MWO_bLIGHT_4      = ucode##_MWO_bLIGHT_4; \
777     G_MWO_aLIGHT_5      = ucode##_MWO_aLIGHT_5; \
778     G_MWO_bLIGHT_5      = ucode##_MWO_bLIGHT_5; \
779     G_MWO_aLIGHT_6      = ucode##_MWO_aLIGHT_6; \
780     G_MWO_bLIGHT_6      = ucode##_MWO_bLIGHT_6; \
781     G_MWO_aLIGHT_7      = ucode##_MWO_aLIGHT_7; \
782     G_MWO_bLIGHT_7      = ucode##_MWO_bLIGHT_7; \
783     G_MWO_aLIGHT_8      = ucode##_MWO_aLIGHT_8; \
784     G_MWO_bLIGHT_8      = ucode##_MWO_bLIGHT_8;
785 
786 #ifdef __cplusplus
787 }
788 #endif
789 
790 #endif
791 
792