sm64

A Super Mario 64 decompilation
Log | Files | Refs | README | LICENSE

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 ========*/