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