/*---------------------------------------------------------------------1Copyright (C) 1997, Nintendo.23File gs2dex.h4Coded by Yoshitaka Yasumoto. Jul 31, 1997.5Modified by6Comments Header file for S2DEX ucode.78$Id: gs2dex.h,v 1.21 1998/05/28 00:14:49 has Exp $9---------------------------------------------------------------------*/1011#ifndef _GS2DEX_H_12#define _GS2DEX_H_1314#ifdef _LANGUAGE_C_PLUS_PLUS15extern "C" {16#endif1718#include <PR/ultratypes.h>1920/*===========================================================================*21* Macro22*===========================================================================*/23#define GS_CALC_DXT(line) (((1<< G_TX_DXT_FRAC)-1)/(line)+1)24#define GS_PIX2TMEM(pix, siz) ((pix)>>(4-(siz)))25#define GS_PIX2DXT(pix, siz) GS_CALC_DXT(GS_PIX2TMEM((pix), (siz)))2627/*===========================================================================*28* Data structures for S2DEX microcode29*===========================================================================*/3031/*---------------------------------------------------------------------------*32* Background33*---------------------------------------------------------------------------*/34#define G_BGLT_LOADBLOCK 0x003335#define G_BGLT_LOADTILE 0xfff43637#define G_BG_FLAG_FLIPS 0x0138#define G_BG_FLAG_FLIPT 0x103940/* Non scalable background plane */41typedef struct {42u16 imageX; /* x-coordinate of upper-left position of texture (u10.5) */43u16 imageW; /* width of the texture (u10.2) */44s16 frameX; /* upper-left position of transferred frame (s10.2) */45u16 frameW; /* width of transferred frame (u10.2) */4647u16 imageY; /* y-coordinate of upper-left position of texture (u10.5) */48u16 imageH; /* height of the texture (u10.2) */49s16 frameY; /* upper-left position of transferred frame (s10.2) */50u16 frameH; /* height of transferred frame (u10.2) */5152u64 *imagePtr; /* texture source address on DRAM */53u16 imageLoad; /* which to use, LoadBlock or LoadTile */54u8 imageFmt; /* format of texel - G_IM_FMT_* */55u8 imageSiz; /* size of texel - G_IM_SIZ_* */56u16 imagePal; /* pallet number */57u16 imageFlip; /* right & left image inversion (Inverted by G_BG_FLAG_FLIPS) */5859/* The following is set in the initialization routine guS2DInitBg(). There is no need for the user to set it. */60u16 tmemW; /* TMEM width and Word size of frame 1 line.61At LoadBlock, GS_PIX2TMEM(imageW/4,imageSiz)62At LoadTile GS_PIX2TMEM(frameW/4,imageSiz)+1 */63u16 tmemH; /* height of TMEM loadable at a time (s13.2) 4 times value64When the normal texture, 512/tmemW*465When the CI texture, 256/tmemW*4 */66u16 tmemLoadSH; /* SH value67At LoadBlock, tmemSize/2-168At LoadTile, tmemW*16-1 */69u16 tmemLoadTH; /* TH value or Stride value70At LoadBlock, GS_CALC_DXT(tmemW)71At LoadTile, tmemH-1 */72u16 tmemSizeW; /* skip value of imagePtr for image 1-line73At LoadBlock, tmemW*274At LoadTile, GS_PIX2TMEM(imageW/4,imageSiz)*2 */75u16 tmemSize; /* skip value of imagePtr for 1-loading76= tmemSizeW*tmemH */77} uObjBg_t; /* 40 bytes */7879/* Scalable background plane */80typedef struct {81u16 imageX; /* x-coordinate of upper-left position of texture (u10.5) */82u16 imageW; /* width of texture (u10.2) */83s16 frameX; /* upper-left position of transferred frame (s10.2) */84u16 frameW; /* width of transferred frame (u10.2) */8586u16 imageY; /* y-coordinate of upper-left position of texture (u10.5) */87u16 imageH; /* height of texture (u10.2) */88s16 frameY; /* upper-left position of transferred frame (s10.2) */89u16 frameH; /* height of transferred frame (u10.2) */9091u64 *imagePtr; /* texture source address on DRAM */92u16 imageLoad; /* Which to use, LoadBlock or LoadTile? */93u8 imageFmt; /* format of texel - G_IM_FMT_* */94u8 imageSiz; /* size of texel - G_IM_SIZ_* */95u16 imagePal; /* pallet number */96u16 imageFlip; /* right & left image inversion (Inverted by G_BG_FLAG_FLIPS) */9798u16 scaleW; /* scale value of X-direction (u5.10) */99u16 scaleH; /* scale value of Y-direction (u5.10) */100s32 imageYorig; /* start point of drawing on image (s20.5) */101102u8 padding[4];103104} uObjScaleBg_t; /* 40 bytes */105106typedef union {107uObjBg_t b;108uObjScaleBg_t s;109long long int force_structure_alignment;110} uObjBg;111112/*---------------------------------------------------------------------------*113* 2D Objects114*---------------------------------------------------------------------------*/115#define G_OBJ_FLAG_FLIPS 1<<0 /* inversion to S-direction */116#define G_OBJ_FLAG_FLIPT 1<<4 /* nversion to T-direction */117118typedef struct {119s16 objX; /* s10.2 OBJ x-coordinate of upper-left end */120u16 scaleW; /* u5.10 Scaling of u5.10 width direction */121u16 imageW; /* u10.5 width of u10.5 texture (length of S-direction) */122u16 paddingX; /* Unused - Always 0 */123s16 objY; /* s10.2 OBJ y-coordinate of s10.2 OBJ upper-left end */124u16 scaleH; /* u5.10 Scaling of u5.10 height direction */125u16 imageH; /* u10.5 height of u10.5 texture (length of T-direction) */126u16 paddingY; /* Unused - Always 0 */127u16 imageStride; /* folding width of texel (In units of 64bit word) */128u16 imageAdrs; /* texture header position in TMEM (In units of 64bit word) */129u8 imageFmt; /* format of texel - G_IM_FMT_* */130u8 imageSiz; /* size of texel - G_IM_SIZ_* */131u8 imagePal; /* pallet number (0-7) */132u8 imageFlags; /* The display flag - G_OBJ_FLAG_FLIP* */133} uObjSprite_t; /* 24 bytes */134135typedef union {136uObjSprite_t s;137long long int force_structure_alignment;138} uObjSprite;139140/*---------------------------------------------------------------------------*141* 2D Matrix142*---------------------------------------------------------------------------*/143typedef struct {144s32 A, B, C, D; /* s15.16 */145s16 X, Y; /* s10.2 */146u16 BaseScaleX; /* u5.10 */147u16 BaseScaleY; /* u5.10 */148} uObjMtx_t; /* 24 bytes */149150typedef union {151uObjMtx_t m;152long long int force_structure_alignment;153} uObjMtx;154155typedef struct {156s16 X, Y; /* s10.2 */157u16 BaseScaleX; /* u5.10 */158u16 BaseScaleY; /* u5.10 */159} uObjSubMtx_t; /* 8 bytes */160161typedef union {162uObjSubMtx_t m;163long long int force_structure_alignment;164} uObjSubMtx;165166/*---------------------------------------------------------------------------*167* Loading into TMEM168*---------------------------------------------------------------------------*/169#define G_OBJLT_TXTRBLOCK 0x00001033170#define G_OBJLT_TXTRTILE 0x00fc1034171#define G_OBJLT_TLUT 0x00000030172173#define GS_TB_TSIZE(pix,siz) (GS_PIX2TMEM((pix),(siz))-1)174#define GS_TB_TLINE(pix,siz) (GS_CALC_DXT(GS_PIX2TMEM((pix),(siz))))175176typedef struct {177u32 type; /* G_OBJLT_TXTRBLOCK divided into types */178u64 *image; /* texture source address on DRAM */179u16 tmem; /* loaded TMEM word address (8byteWORD) */180u16 tsize; /* Texture size, Specified by macro GS_TB_TSIZE() */181u16 tline; /* width of Texture 1-line, Specified by macro GS_TB_TLINE() */182u16 sid; /* STATE ID Multipled by 4 (Either one of 0, 4, 8 and 12) */183u32 flag; /* STATE flag */184u32 mask; /* STATE mask */185} uObjTxtrBlock_t; /* 24 bytes */186187#define GS_TT_TWIDTH(pix,siz) ((GS_PIX2TMEM((pix), (siz))<<2)-1)188#define GS_TT_THEIGHT(pix,siz) (((pix)<<2)-1)189190typedef struct {191u32 type; /* G_OBJLT_TXTRTILE divided into types */192u64 *image; /* texture source address on DRAM */193u16 tmem; /* loaded TMEM word address (8byteWORD)*/194u16 twidth; /* width of Texture (Specified by macro GS_TT_TWIDTH()) */195u16 theight; /* height of Texture (Specified by macro GS_TT_THEIGHT()) */196u16 sid; /* STATE ID Multipled by 4 (Either one of 0, 4, 8 and 12) */197u32 flag; /* STATE flag */198u32 mask; /* STATE mask */199} uObjTxtrTile_t; /* 24 bytes */200201#define GS_PAL_HEAD(head) ((head)+256)202#define GS_PAL_NUM(num) ((num)-1)203204typedef struct {205u32 type; /* G_OBJLT_TLUT divided into types */206u64 *image; /* texture source address on DRAM */207u16 phead; /* pallet number of load header (Between 256 and 511) */208u16 pnum; /* loading pallet number -1 */209u16 zero; /* Assign 0 all the time */210u16 sid; /* STATE ID Multipled by 4 (Either one of 0, 4, 8 and 12)*/211u32 flag; /* STATE flag */212u32 mask; /* STATE mask */213} uObjTxtrTLUT_t; /* 24 bytes */214215typedef union {216uObjTxtrBlock_t block;217uObjTxtrTile_t tile;218uObjTxtrTLUT_t tlut;219long long int force_structure_alignment;220} uObjTxtr;221222/*---------------------------------------------------------------------------*223* Loading into TMEM & 2D Objects224*---------------------------------------------------------------------------*/225typedef struct {226uObjTxtr txtr;227uObjSprite sprite;228} uObjTxSprite; /* 48 bytes */229230/*===========================================================================*231* GBI Commands for S2DEX microcode232*===========================================================================*/233/* GBI Header */234#ifdef F3DEX_GBI_2235#define G_OBJ_RECTANGLE_R 0xda236#define G_OBJ_MOVEMEM 0xdc237#define G_RDPHALF_0 0xe4238#define G_OBJ_RECTANGLE 0x01239#define G_OBJ_SPRITE 0x02240#define G_SELECT_DL 0x04241#define G_OBJ_LOADTXTR 0x05242#define G_OBJ_LDTX_SPRITE 0x06243#define G_OBJ_LDTX_RECT 0x07244#define G_OBJ_LDTX_RECT_R 0x08245#define G_BG_1CYC 0x09246#define G_BG_COPY 0x0a247#define G_OBJ_RENDERMODE 0x0b248#else249#define G_BG_1CYC 0x01250#define G_BG_COPY 0x02251#define G_OBJ_RECTANGLE 0x03252#define G_OBJ_SPRITE 0x04253#define G_OBJ_MOVEMEM 0x05254#define G_SELECT_DL 0xb0255#define G_OBJ_RENDERMODE 0xb1256#define G_OBJ_RECTANGLE_R 0xb2257#define G_OBJ_LOADTXTR 0xc1258#define G_OBJ_LDTX_SPRITE 0xc2259#define G_OBJ_LDTX_RECT 0xc3260#define G_OBJ_LDTX_RECT_R 0xc4261#define G_RDPHALF_0 0xe4262#endif263264/*---------------------------------------------------------------------------*265* Background wrapped screen266*---------------------------------------------------------------------------*/267#define gSPBgRectangle(pkt, m, mptr) gDma0p((pkt),(m),(mptr),0)268#define gsSPBgRectangle(m, mptr) gsDma0p( (m),(mptr),0)269#define gSPBgRectCopy(pkt, mptr) gSPBgRectangle((pkt), G_BG_COPY, (mptr))270#define gsSPBgRectCopy(mptr) gsSPBgRectangle( G_BG_COPY, (mptr))271#define gSPBgRect1Cyc(pkt, mptr) gSPBgRectangle((pkt), G_BG_1CYC, (mptr))272#define gsSPBgRect1Cyc(mptr) gsSPBgRectangle( G_BG_1CYC, (mptr))273274/*---------------------------------------------------------------------------*275* 2D Objects276*---------------------------------------------------------------------------*/277#define gSPObjSprite(pkt, mptr) gDma0p((pkt),G_OBJ_SPRITE, (mptr),0)278#define gsSPObjSprite(mptr) gsDma0p( G_OBJ_SPRITE, (mptr),0)279#define gSPObjRectangle(pkt, mptr) gDma0p((pkt),G_OBJ_RECTANGLE, (mptr),0)280#define gsSPObjRectangle(mptr) gsDma0p( G_OBJ_RECTANGLE, (mptr),0)281#define gSPObjRectangleR(pkt, mptr) gDma0p((pkt),G_OBJ_RECTANGLE_R,(mptr),0)282#define gsSPObjRectangleR(mptr) gsDma0p( G_OBJ_RECTANGLE_R,(mptr),0)283284/*---------------------------------------------------------------------------*285* 2D Matrix286*---------------------------------------------------------------------------*/287#define gSPObjMatrix(pkt, mptr) gDma1p((pkt),G_OBJ_MOVEMEM,(mptr),0,23)288#define gsSPObjMatrix(mptr) gsDma1p( G_OBJ_MOVEMEM,(mptr),0,23)289#define gSPObjSubMatrix(pkt, mptr) gDma1p((pkt),G_OBJ_MOVEMEM,(mptr),2, 7)290#define gsSPObjSubMatrix(mptr) gsDma1p( G_OBJ_MOVEMEM,(mptr),2, 7)291292/*---------------------------------------------------------------------------*293* Loading into TMEM294*---------------------------------------------------------------------------*/295#define gSPObjLoadTxtr(pkt, tptr) gDma0p((pkt),G_OBJ_LOADTXTR, (tptr),23)296#define gsSPObjLoadTxtr(tptr) gsDma0p( G_OBJ_LOADTXTR, (tptr),23)297#define gSPObjLoadTxSprite(pkt, tptr) gDma0p((pkt),G_OBJ_LDTX_SPRITE,(tptr),47)298#define gsSPObjLoadTxSprite(tptr) gsDma0p( G_OBJ_LDTX_SPRITE,(tptr),47)299#define gSPObjLoadTxRect(pkt, tptr) gDma0p((pkt),G_OBJ_LDTX_RECT, (tptr),47)300#define gsSPObjLoadTxRect(tptr) gsDma0p( G_OBJ_LDTX_RECT, (tptr),47)301#define gSPObjLoadTxRectR(pkt, tptr) gDma0p((pkt),G_OBJ_LDTX_RECT_R,(tptr),47)302#define gsSPObjLoadTxRectR(tptr) gsDma0p( G_OBJ_LDTX_RECT_R,(tptr),47)303304/*---------------------------------------------------------------------------*305* Select Display List306*---------------------------------------------------------------------------*/307#define gSPSelectDL(pkt, mptr, sid, flag, mask) \308{ gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \309gDma1p((pkt), G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_PUSH); }310#define gsSPSelectDL(mptr, sid, flag, mask) \311{ gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \312gsDma1p(G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_PUSH); }313#define gSPSelectBranchDL(pkt, mptr, sid, flag, mask) \314{ gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \315gDma1p((pkt), G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_NOPUSH); }316#define gsSPSelectBranchDL(mptr, sid, flag, mask) \317{ gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \318gsDma1p(G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_NOPUSH); }319320/*---------------------------------------------------------------------------*321* Set general status322*---------------------------------------------------------------------------*/323#define G_MW_GENSTAT 0x08 /* Note that it is the same value of G_MW_FOG */324325#define gSPSetStatus(pkt, sid, val) \326gMoveWd((pkt), G_MW_GENSTAT, (sid), (val))327#define gsSPSetStatus(sid, val) \328gsMoveWd( G_MW_GENSTAT, (sid), (val))329330/*---------------------------------------------------------------------------*331* Set Object Render Mode332*---------------------------------------------------------------------------*/333#define G_OBJRM_NOTXCLAMP 0x01334#define G_OBJRM_XLU 0x02 /* Ignored */335#define G_OBJRM_ANTIALIAS 0x04 /* Ignored */336#define G_OBJRM_BILERP 0x08337#define G_OBJRM_SHRINKSIZE_1 0x10338#define G_OBJRM_SHRINKSIZE_2 0x20339#define G_OBJRM_WIDEN 0x40340341#define gSPObjRenderMode(pkt, mode) gImmp1((pkt),G_OBJ_RENDERMODE,(mode))342#define gsSPObjRenderMode(mode) gsImmp1( G_OBJ_RENDERMODE,(mode))343344/*===========================================================================*345* Render Mode Macro346*===========================================================================*/347#define RM_RA_SPRITE(clk) \348AA_EN | CVG_DST_CLAMP | \349CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \350GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)351352#define G_RM_SPRITE G_RM_OPA_SURF353#define G_RM_SPRITE2 G_RM_OPA_SURF2354#define G_RM_RA_SPRITE RM_RA_SPRITE(1)355#define G_RM_RA_SPRITE2 RM_RA_SPRITE(2)356#define G_RM_AA_SPRITE G_RM_AA_TEX_TERR357#define G_RM_AA_SPRITE2 G_RM_AA_TEX_TERR2358#define G_RM_XLU_SPRITE G_RM_XLU_SURF359#define G_RM_XLU_SPRITE2 G_RM_XLU_SURF2360#define G_RM_AA_XLU_SPRITE G_RM_AA_XLU_SURF361#define G_RM_AA_XLU_SPRITE2 G_RM_AA_XLU_SURF2362363/*===========================================================================*364* External functions365*===========================================================================*/366extern u64 gspS2DEX_fifoTextStart[], gspS2DEX_fifoTextEnd[];367extern u64 gspS2DEX_fifoDataStart[], gspS2DEX_fifoDataEnd[];368extern u64 gspS2DEX_fifo_dTextStart[], gspS2DEX_fifo_dTextEnd[];369extern u64 gspS2DEX_fifo_dDataStart[], gspS2DEX_fifo_dDataEnd[];370extern u64 gspS2DEX2_fifoTextStart[], gspS2DEX2_fifoTextEnd[];371extern u64 gspS2DEX2_fifoDataStart[], gspS2DEX2_fifoDataEnd[];372extern u64 gspS2DEX2_xbusTextStart[], gspS2DEX2_xbusTextEnd[];373extern u64 gspS2DEX2_xbusDataStart[], gspS2DEX2_xbusDataEnd[];374extern void guS2DInitBg(uObjBg *);375376#ifdef F3DEX_GBI_2377# define guS2DEmuBgRect1Cyc guS2D2EmuBgRect1Cyc /*Wrapper*/378# define guS2DEmuSetScissor guS2D2EmuSetScissor /*Wrapper*/379extern void guS2D2EmuSetScissor(u32, u32, u32, u32, u8);380extern void guS2D2EmuBgRect1Cyc(Gfx **, uObjBg *);381#else382extern void guS2DEmuSetScissor(u32, u32, u32, u32, u8);383extern void guS2DEmuBgRect1Cyc(Gfx **, uObjBg *);384#endif385386#ifdef _LANGUAGE_C_PLUS_PLUS387}388#endif389#endif /* _GS2DEX_H_ */390391/*======== End of gs2dex.h ========*/392393394