gs2dex.h (16460B)
1 /*--------------------------------------------------------------------- 2 Copyright (C) 1997, Nintendo. 3 4 File gs2dex.h 5 Coded by Yoshitaka Yasumoto. Jul 31, 1997. 6 Modified by 7 Comments Header file for S2DEX ucode. 8 9 $Id: gs2dex.h,v 1.21 1998/05/28 00:14:49 has Exp $ 10 ---------------------------------------------------------------------*/ 11 12 #ifndef _GS2DEX_H_ 13 #define _GS2DEX_H_ 14 15 #ifdef _LANGUAGE_C_PLUS_PLUS 16 extern "C" { 17 #endif 18 19 #include <PR/ultratypes.h> 20 21 /*===========================================================================* 22 * Macro 23 *===========================================================================*/ 24 #define GS_CALC_DXT(line) (((1<< G_TX_DXT_FRAC)-1)/(line)+1) 25 #define GS_PIX2TMEM(pix, siz) ((pix)>>(4-(siz))) 26 #define GS_PIX2DXT(pix, siz) GS_CALC_DXT(GS_PIX2TMEM((pix), (siz))) 27 28 /*===========================================================================* 29 * Data structures for S2DEX microcode 30 *===========================================================================*/ 31 32 /*---------------------------------------------------------------------------* 33 * Background 34 *---------------------------------------------------------------------------*/ 35 #define G_BGLT_LOADBLOCK 0x0033 36 #define G_BGLT_LOADTILE 0xfff4 37 38 #define G_BG_FLAG_FLIPS 0x01 39 #define G_BG_FLAG_FLIPT 0x10 40 41 /* Non scalable background plane */ 42 typedef struct { 43 u16 imageX; /* x-coordinate of upper-left position of texture (u10.5) */ 44 u16 imageW; /* width of the texture (u10.2) */ 45 s16 frameX; /* upper-left position of transferred frame (s10.2) */ 46 u16 frameW; /* width of transferred frame (u10.2) */ 47 48 u16 imageY; /* y-coordinate of upper-left position of texture (u10.5) */ 49 u16 imageH; /* height of the texture (u10.2) */ 50 s16 frameY; /* upper-left position of transferred frame (s10.2) */ 51 u16 frameH; /* height of transferred frame (u10.2) */ 52 53 u64 *imagePtr; /* texture source address on DRAM */ 54 u16 imageLoad; /* which to use, LoadBlock or LoadTile */ 55 u8 imageFmt; /* format of texel - G_IM_FMT_* */ 56 u8 imageSiz; /* size of texel - G_IM_SIZ_* */ 57 u16 imagePal; /* pallet number */ 58 u16 imageFlip; /* right & left image inversion (Inverted by G_BG_FLAG_FLIPS) */ 59 60 /* The following is set in the initialization routine guS2DInitBg(). There is no need for the user to set it. */ 61 u16 tmemW; /* TMEM width and Word size of frame 1 line. 62 At LoadBlock, GS_PIX2TMEM(imageW/4,imageSiz) 63 At LoadTile GS_PIX2TMEM(frameW/4,imageSiz)+1 */ 64 u16 tmemH; /* height of TMEM loadable at a time (s13.2) 4 times value 65 When the normal texture, 512/tmemW*4 66 When the CI texture, 256/tmemW*4 */ 67 u16 tmemLoadSH; /* SH value 68 At LoadBlock, tmemSize/2-1 69 At LoadTile, tmemW*16-1 */ 70 u16 tmemLoadTH; /* TH value or Stride value 71 At LoadBlock, GS_CALC_DXT(tmemW) 72 At LoadTile, tmemH-1 */ 73 u16 tmemSizeW; /* skip value of imagePtr for image 1-line 74 At LoadBlock, tmemW*2 75 At LoadTile, GS_PIX2TMEM(imageW/4,imageSiz)*2 */ 76 u16 tmemSize; /* skip value of imagePtr for 1-loading 77 = tmemSizeW*tmemH */ 78 } uObjBg_t; /* 40 bytes */ 79 80 /* Scalable background plane */ 81 typedef struct { 82 u16 imageX; /* x-coordinate of upper-left position of texture (u10.5) */ 83 u16 imageW; /* width of texture (u10.2) */ 84 s16 frameX; /* upper-left position of transferred frame (s10.2) */ 85 u16 frameW; /* width of transferred frame (u10.2) */ 86 87 u16 imageY; /* y-coordinate of upper-left position of texture (u10.5) */ 88 u16 imageH; /* height of texture (u10.2) */ 89 s16 frameY; /* upper-left position of transferred frame (s10.2) */ 90 u16 frameH; /* height of transferred frame (u10.2) */ 91 92 u64 *imagePtr; /* texture source address on DRAM */ 93 u16 imageLoad; /* Which to use, LoadBlock or LoadTile? */ 94 u8 imageFmt; /* format of texel - G_IM_FMT_* */ 95 u8 imageSiz; /* size of texel - G_IM_SIZ_* */ 96 u16 imagePal; /* pallet number */ 97 u16 imageFlip; /* right & left image inversion (Inverted by G_BG_FLAG_FLIPS) */ 98 99 u16 scaleW; /* scale value of X-direction (u5.10) */ 100 u16 scaleH; /* scale value of Y-direction (u5.10) */ 101 s32 imageYorig; /* start point of drawing on image (s20.5) */ 102 103 u8 padding[4]; 104 105 } uObjScaleBg_t; /* 40 bytes */ 106 107 typedef union { 108 uObjBg_t b; 109 uObjScaleBg_t s; 110 long long int force_structure_alignment; 111 } uObjBg; 112 113 /*---------------------------------------------------------------------------* 114 * 2D Objects 115 *---------------------------------------------------------------------------*/ 116 #define G_OBJ_FLAG_FLIPS 1<<0 /* inversion to S-direction */ 117 #define G_OBJ_FLAG_FLIPT 1<<4 /* nversion to T-direction */ 118 119 typedef struct { 120 s16 objX; /* s10.2 OBJ x-coordinate of upper-left end */ 121 u16 scaleW; /* u5.10 Scaling of u5.10 width direction */ 122 u16 imageW; /* u10.5 width of u10.5 texture (length of S-direction) */ 123 u16 paddingX; /* Unused - Always 0 */ 124 s16 objY; /* s10.2 OBJ y-coordinate of s10.2 OBJ upper-left end */ 125 u16 scaleH; /* u5.10 Scaling of u5.10 height direction */ 126 u16 imageH; /* u10.5 height of u10.5 texture (length of T-direction) */ 127 u16 paddingY; /* Unused - Always 0 */ 128 u16 imageStride; /* folding width of texel (In units of 64bit word) */ 129 u16 imageAdrs; /* texture header position in TMEM (In units of 64bit word) */ 130 u8 imageFmt; /* format of texel - G_IM_FMT_* */ 131 u8 imageSiz; /* size of texel - G_IM_SIZ_* */ 132 u8 imagePal; /* pallet number (0-7) */ 133 u8 imageFlags; /* The display flag - G_OBJ_FLAG_FLIP* */ 134 } uObjSprite_t; /* 24 bytes */ 135 136 typedef union { 137 uObjSprite_t s; 138 long long int force_structure_alignment; 139 } uObjSprite; 140 141 /*---------------------------------------------------------------------------* 142 * 2D Matrix 143 *---------------------------------------------------------------------------*/ 144 typedef struct { 145 s32 A, B, C, D; /* s15.16 */ 146 s16 X, Y; /* s10.2 */ 147 u16 BaseScaleX; /* u5.10 */ 148 u16 BaseScaleY; /* u5.10 */ 149 } uObjMtx_t; /* 24 bytes */ 150 151 typedef union { 152 uObjMtx_t m; 153 long long int force_structure_alignment; 154 } uObjMtx; 155 156 typedef struct { 157 s16 X, Y; /* s10.2 */ 158 u16 BaseScaleX; /* u5.10 */ 159 u16 BaseScaleY; /* u5.10 */ 160 } uObjSubMtx_t; /* 8 bytes */ 161 162 typedef union { 163 uObjSubMtx_t m; 164 long long int force_structure_alignment; 165 } uObjSubMtx; 166 167 /*---------------------------------------------------------------------------* 168 * Loading into TMEM 169 *---------------------------------------------------------------------------*/ 170 #define G_OBJLT_TXTRBLOCK 0x00001033 171 #define G_OBJLT_TXTRTILE 0x00fc1034 172 #define G_OBJLT_TLUT 0x00000030 173 174 #define GS_TB_TSIZE(pix,siz) (GS_PIX2TMEM((pix),(siz))-1) 175 #define GS_TB_TLINE(pix,siz) (GS_CALC_DXT(GS_PIX2TMEM((pix),(siz)))) 176 177 typedef struct { 178 u32 type; /* G_OBJLT_TXTRBLOCK divided into types */ 179 u64 *image; /* texture source address on DRAM */ 180 u16 tmem; /* loaded TMEM word address (8byteWORD) */ 181 u16 tsize; /* Texture size, Specified by macro GS_TB_TSIZE() */ 182 u16 tline; /* width of Texture 1-line, Specified by macro GS_TB_TLINE() */ 183 u16 sid; /* STATE ID Multipled by 4 (Either one of 0, 4, 8 and 12) */ 184 u32 flag; /* STATE flag */ 185 u32 mask; /* STATE mask */ 186 } uObjTxtrBlock_t; /* 24 bytes */ 187 188 #define GS_TT_TWIDTH(pix,siz) ((GS_PIX2TMEM((pix), (siz))<<2)-1) 189 #define GS_TT_THEIGHT(pix,siz) (((pix)<<2)-1) 190 191 typedef struct { 192 u32 type; /* G_OBJLT_TXTRTILE divided into types */ 193 u64 *image; /* texture source address on DRAM */ 194 u16 tmem; /* loaded TMEM word address (8byteWORD)*/ 195 u16 twidth; /* width of Texture (Specified by macro GS_TT_TWIDTH()) */ 196 u16 theight; /* height of Texture (Specified by macro GS_TT_THEIGHT()) */ 197 u16 sid; /* STATE ID Multipled by 4 (Either one of 0, 4, 8 and 12) */ 198 u32 flag; /* STATE flag */ 199 u32 mask; /* STATE mask */ 200 } uObjTxtrTile_t; /* 24 bytes */ 201 202 #define GS_PAL_HEAD(head) ((head)+256) 203 #define GS_PAL_NUM(num) ((num)-1) 204 205 typedef struct { 206 u32 type; /* G_OBJLT_TLUT divided into types */ 207 u64 *image; /* texture source address on DRAM */ 208 u16 phead; /* pallet number of load header (Between 256 and 511) */ 209 u16 pnum; /* loading pallet number -1 */ 210 u16 zero; /* Assign 0 all the time */ 211 u16 sid; /* STATE ID Multipled by 4 (Either one of 0, 4, 8 and 12)*/ 212 u32 flag; /* STATE flag */ 213 u32 mask; /* STATE mask */ 214 } uObjTxtrTLUT_t; /* 24 bytes */ 215 216 typedef union { 217 uObjTxtrBlock_t block; 218 uObjTxtrTile_t tile; 219 uObjTxtrTLUT_t tlut; 220 long long int force_structure_alignment; 221 } uObjTxtr; 222 223 /*---------------------------------------------------------------------------* 224 * Loading into TMEM & 2D Objects 225 *---------------------------------------------------------------------------*/ 226 typedef struct { 227 uObjTxtr txtr; 228 uObjSprite sprite; 229 } uObjTxSprite; /* 48 bytes */ 230 231 /*===========================================================================* 232 * GBI Commands for S2DEX microcode 233 *===========================================================================*/ 234 /* GBI Header */ 235 #ifdef F3DEX_GBI_2 236 #define G_OBJ_RECTANGLE_R 0xda 237 #define G_OBJ_MOVEMEM 0xdc 238 #define G_RDPHALF_0 0xe4 239 #define G_OBJ_RECTANGLE 0x01 240 #define G_OBJ_SPRITE 0x02 241 #define G_SELECT_DL 0x04 242 #define G_OBJ_LOADTXTR 0x05 243 #define G_OBJ_LDTX_SPRITE 0x06 244 #define G_OBJ_LDTX_RECT 0x07 245 #define G_OBJ_LDTX_RECT_R 0x08 246 #define G_BG_1CYC 0x09 247 #define G_BG_COPY 0x0a 248 #define G_OBJ_RENDERMODE 0x0b 249 #else 250 #define G_BG_1CYC 0x01 251 #define G_BG_COPY 0x02 252 #define G_OBJ_RECTANGLE 0x03 253 #define G_OBJ_SPRITE 0x04 254 #define G_OBJ_MOVEMEM 0x05 255 #define G_SELECT_DL 0xb0 256 #define G_OBJ_RENDERMODE 0xb1 257 #define G_OBJ_RECTANGLE_R 0xb2 258 #define G_OBJ_LOADTXTR 0xc1 259 #define G_OBJ_LDTX_SPRITE 0xc2 260 #define G_OBJ_LDTX_RECT 0xc3 261 #define G_OBJ_LDTX_RECT_R 0xc4 262 #define G_RDPHALF_0 0xe4 263 #endif 264 265 /*---------------------------------------------------------------------------* 266 * Background wrapped screen 267 *---------------------------------------------------------------------------*/ 268 #define gSPBgRectangle(pkt, m, mptr) gDma0p((pkt),(m),(mptr),0) 269 #define gsSPBgRectangle(m, mptr) gsDma0p( (m),(mptr),0) 270 #define gSPBgRectCopy(pkt, mptr) gSPBgRectangle((pkt), G_BG_COPY, (mptr)) 271 #define gsSPBgRectCopy(mptr) gsSPBgRectangle( G_BG_COPY, (mptr)) 272 #define gSPBgRect1Cyc(pkt, mptr) gSPBgRectangle((pkt), G_BG_1CYC, (mptr)) 273 #define gsSPBgRect1Cyc(mptr) gsSPBgRectangle( G_BG_1CYC, (mptr)) 274 275 /*---------------------------------------------------------------------------* 276 * 2D Objects 277 *---------------------------------------------------------------------------*/ 278 #define gSPObjSprite(pkt, mptr) gDma0p((pkt),G_OBJ_SPRITE, (mptr),0) 279 #define gsSPObjSprite(mptr) gsDma0p( G_OBJ_SPRITE, (mptr),0) 280 #define gSPObjRectangle(pkt, mptr) gDma0p((pkt),G_OBJ_RECTANGLE, (mptr),0) 281 #define gsSPObjRectangle(mptr) gsDma0p( G_OBJ_RECTANGLE, (mptr),0) 282 #define gSPObjRectangleR(pkt, mptr) gDma0p((pkt),G_OBJ_RECTANGLE_R,(mptr),0) 283 #define gsSPObjRectangleR(mptr) gsDma0p( G_OBJ_RECTANGLE_R,(mptr),0) 284 285 /*---------------------------------------------------------------------------* 286 * 2D Matrix 287 *---------------------------------------------------------------------------*/ 288 #define gSPObjMatrix(pkt, mptr) gDma1p((pkt),G_OBJ_MOVEMEM,(mptr),0,23) 289 #define gsSPObjMatrix(mptr) gsDma1p( G_OBJ_MOVEMEM,(mptr),0,23) 290 #define gSPObjSubMatrix(pkt, mptr) gDma1p((pkt),G_OBJ_MOVEMEM,(mptr),2, 7) 291 #define gsSPObjSubMatrix(mptr) gsDma1p( G_OBJ_MOVEMEM,(mptr),2, 7) 292 293 /*---------------------------------------------------------------------------* 294 * Loading into TMEM 295 *---------------------------------------------------------------------------*/ 296 #define gSPObjLoadTxtr(pkt, tptr) gDma0p((pkt),G_OBJ_LOADTXTR, (tptr),23) 297 #define gsSPObjLoadTxtr(tptr) gsDma0p( G_OBJ_LOADTXTR, (tptr),23) 298 #define gSPObjLoadTxSprite(pkt, tptr) gDma0p((pkt),G_OBJ_LDTX_SPRITE,(tptr),47) 299 #define gsSPObjLoadTxSprite(tptr) gsDma0p( G_OBJ_LDTX_SPRITE,(tptr),47) 300 #define gSPObjLoadTxRect(pkt, tptr) gDma0p((pkt),G_OBJ_LDTX_RECT, (tptr),47) 301 #define gsSPObjLoadTxRect(tptr) gsDma0p( G_OBJ_LDTX_RECT, (tptr),47) 302 #define gSPObjLoadTxRectR(pkt, tptr) gDma0p((pkt),G_OBJ_LDTX_RECT_R,(tptr),47) 303 #define gsSPObjLoadTxRectR(tptr) gsDma0p( G_OBJ_LDTX_RECT_R,(tptr),47) 304 305 /*---------------------------------------------------------------------------* 306 * Select Display List 307 *---------------------------------------------------------------------------*/ 308 #define gSPSelectDL(pkt, mptr, sid, flag, mask) \ 309 { gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ 310 gDma1p((pkt), G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_PUSH); } 311 #define gsSPSelectDL(mptr, sid, flag, mask) \ 312 { gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ 313 gsDma1p(G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_PUSH); } 314 #define gSPSelectBranchDL(pkt, mptr, sid, flag, mask) \ 315 { gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ 316 gDma1p((pkt), G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_NOPUSH); } 317 #define gsSPSelectBranchDL(mptr, sid, flag, mask) \ 318 { gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ 319 gsDma1p(G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_NOPUSH); } 320 321 /*---------------------------------------------------------------------------* 322 * Set general status 323 *---------------------------------------------------------------------------*/ 324 #define G_MW_GENSTAT 0x08 /* Note that it is the same value of G_MW_FOG */ 325 326 #define gSPSetStatus(pkt, sid, val) \ 327 gMoveWd((pkt), G_MW_GENSTAT, (sid), (val)) 328 #define gsSPSetStatus(sid, val) \ 329 gsMoveWd( G_MW_GENSTAT, (sid), (val)) 330 331 /*---------------------------------------------------------------------------* 332 * Set Object Render Mode 333 *---------------------------------------------------------------------------*/ 334 #define G_OBJRM_NOTXCLAMP 0x01 335 #define G_OBJRM_XLU 0x02 /* Ignored */ 336 #define G_OBJRM_ANTIALIAS 0x04 /* Ignored */ 337 #define G_OBJRM_BILERP 0x08 338 #define G_OBJRM_SHRINKSIZE_1 0x10 339 #define G_OBJRM_SHRINKSIZE_2 0x20 340 #define G_OBJRM_WIDEN 0x40 341 342 #define gSPObjRenderMode(pkt, mode) gImmp1((pkt),G_OBJ_RENDERMODE,(mode)) 343 #define gsSPObjRenderMode(mode) gsImmp1( G_OBJ_RENDERMODE,(mode)) 344 345 /*===========================================================================* 346 * Render Mode Macro 347 *===========================================================================*/ 348 #define RM_RA_SPRITE(clk) \ 349 AA_EN | CVG_DST_CLAMP | \ 350 CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ 351 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) 352 353 #define G_RM_SPRITE G_RM_OPA_SURF 354 #define G_RM_SPRITE2 G_RM_OPA_SURF2 355 #define G_RM_RA_SPRITE RM_RA_SPRITE(1) 356 #define G_RM_RA_SPRITE2 RM_RA_SPRITE(2) 357 #define G_RM_AA_SPRITE G_RM_AA_TEX_TERR 358 #define G_RM_AA_SPRITE2 G_RM_AA_TEX_TERR2 359 #define G_RM_XLU_SPRITE G_RM_XLU_SURF 360 #define G_RM_XLU_SPRITE2 G_RM_XLU_SURF2 361 #define G_RM_AA_XLU_SPRITE G_RM_AA_XLU_SURF 362 #define G_RM_AA_XLU_SPRITE2 G_RM_AA_XLU_SURF2 363 364 /*===========================================================================* 365 * External functions 366 *===========================================================================*/ 367 extern u64 gspS2DEX_fifoTextStart[], gspS2DEX_fifoTextEnd[]; 368 extern u64 gspS2DEX_fifoDataStart[], gspS2DEX_fifoDataEnd[]; 369 extern u64 gspS2DEX_fifo_dTextStart[], gspS2DEX_fifo_dTextEnd[]; 370 extern u64 gspS2DEX_fifo_dDataStart[], gspS2DEX_fifo_dDataEnd[]; 371 extern u64 gspS2DEX2_fifoTextStart[], gspS2DEX2_fifoTextEnd[]; 372 extern u64 gspS2DEX2_fifoDataStart[], gspS2DEX2_fifoDataEnd[]; 373 extern u64 gspS2DEX2_xbusTextStart[], gspS2DEX2_xbusTextEnd[]; 374 extern u64 gspS2DEX2_xbusDataStart[], gspS2DEX2_xbusDataEnd[]; 375 extern void guS2DInitBg(uObjBg *); 376 377 #ifdef F3DEX_GBI_2 378 # define guS2DEmuBgRect1Cyc guS2D2EmuBgRect1Cyc /*Wrapper*/ 379 # define guS2DEmuSetScissor guS2D2EmuSetScissor /*Wrapper*/ 380 extern void guS2D2EmuSetScissor(u32, u32, u32, u32, u8); 381 extern void guS2D2EmuBgRect1Cyc(Gfx **, uObjBg *); 382 #else 383 extern void guS2DEmuSetScissor(u32, u32, u32, u32, u8); 384 extern void guS2DEmuBgRect1Cyc(Gfx **, uObjBg *); 385 #endif 386 387 #ifdef _LANGUAGE_C_PLUS_PLUS 388 } 389 #endif 390 #endif /* _GS2DEX_H_ */ 391 392 /*======== End of gs2dex.h ========*/