summaryrefslogtreecommitdiff
path: root/include/PR/gs2dex.h
blob: 7e2b2c6a6abc96754668b3138036d2e66db10118 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
/*---------------------------------------------------------------------
	Copyright (C) 1997, Nintendo.
	
	File		gs2dex.h
	Coded    by	Yoshitaka Yasumoto.	Jul 31, 1997.
	Modified by	
	Comments	Header file for S2DEX ucode.
	
	$Id: gs2dex.h,v 1.15 1997/10/17 08:19:07 yasu Exp $
  ---------------------------------------------------------------------*/

#ifndef	_GS2DEX_H_
#define	_GS2DEX_H_

#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif

/*===========================================================================*
 *	Macro
 *===========================================================================*/
#define	GS_CALC_DXT(line)	(((1<< G_TX_DXT_FRAC)-1)/(line)+1)
#define	GS_PIX2TMEM(pix, siz)	((pix)>>(4-(siz)))
#define	GS_PIX2DXT(pix, siz)	GS_CALC_DXT(GS_PIX2TMEM((pix), (siz)))

/*===========================================================================*
 *	Data structures for S2DEX microcode
 *===========================================================================*/

/*---------------------------------------------------------------------------*
 *	Background
 *---------------------------------------------------------------------------*/
#define	G_BGLT_LOADBLOCK	0x0033
#define	G_BGLT_LOADTILE		0xfff4

#define	G_BG_FLAG_FLIPS		0x01
#define	G_BG_FLAG_FLIPT		0x10

/* Non scalable background plane */
typedef	struct	{
  u16   imageX;		/* The x-coordinate of the upper-left position of the texture.  (u11.5)*/ 
  u16	imageW;		/* The width of the texture.                                    (u10.2)*/
  s16	frameX;		/* The upper-left position of the transferred frame.            (s10.2)*/
  u16	frameW;		/* The width of the transferred frame.                          (u10.2)*/

  u16   imageY; 	/* The y-coordinate of the upper-left position of the texture.  (u11.5)*/ 
  u16	imageH;		/* The height of the texture.                                   (u10.2)*/
  s16	frameY;		/* The upper-left position of the transferred frame.            (s10.2)*/
  u16	frameH;		/* The height of the transferred frame.                         (u10.2)*/

  u64  *imagePtr;	/* The texture source address on DRAM.           */
  u16	imageLoad;	/* Which to use,  LoadBlock or  LoadTile?        */
  u8	imageFmt;	/* The format of the texel.  G_IM_FMT_*          */
  u8	imageSiz;	/* The size of the texel        G_IM_SIZ_*       */
  u16   imagePal; 	/* The pallet number.                            */
  u16	imageFlip;	/* The right & left inversion of the image. Inverted by G_BG_FLAG_FLIPS*/

  /* Because the following are set in the initialization routine guS2DInitBg(), the user doesn't 
     have to set it.*/
  u16	tmemW;		/* The TMEM width and Work size of the frame 1 line. 
                           At LoadBlock, GS_PIX2TMEM(imageW/4,imageSiz)
                           At LoadTile  GS_PIX2TMEM(frameW/4,imageSiz)+1  */
  u16	tmemH;		/* The height of TMEM loadable at a time.  (s13.2) The 4 times value.
			   When the normal texture,   512/tmemW*4
			   When the CI texture,    256/tmemW*4       */
  u16	tmemLoadSH;	/* The SH value
			   At LoadBlock,  tmemSize/2-1
			   At LoadTile,  tmemW*16-1                  */
  u16	tmemLoadTH;	/* The TH value or the Stride value 
			   At LoadBlock,  GS_CALC_DXT(tmemW)
			   At LoadTile,  tmemH-1                     */
  u16	tmemSizeW;	/* The skip value of imagePtr for image 1-line.  
			   At LoadBlock, tmemW*2
                           At LoadTile,  GS_PIX2TMEM(imageW/4,imageSiz)*2 */
  u16	tmemSize;	/* The skip value of  imagePtr for 1-loading.  
			   = tmemSizeW*tmemH                         */
} uObjBg_t;		/* 40 bytes */

/* Scalable background plane */
typedef	struct	{
  u16   imageX;		/* The x-coordinate of the upper-left position of the texture.  (u11.5)*/ 
  u16	imageW;		/* The width of the texture.                                    (u10.2)*/
  s16	frameX;		/* The upper-left position of the transferred frame.            (s10.2)*/
  u16	frameW;		/* The width of the transferred frame.                          (u10.2)*/

  u16   imageY; 	/* The y-coordinate of the upper-left position of the texture.  (u11.5)*/ 
  u16	imageH;		/* The height of the texture.                                   (u10.2)*/
  s16	frameY;		/* The upper-left position of the transferred frame.            (s10.2)*/
  u16	frameH;		/* The height of the transferred frame.                         (u10.2)*/

  u64  *imagePtr;	/* The texture source address on DRAM.       */
  u16	imageLoad;	/* Which to use,  LoadBlock or  LoadTile?    */
  u8	imageFmt;	/* The format of the texel.   G_IM_FMT_*     */
  u8	imageSiz;	/* The size of the texel      G_IM_SIZ_*     */
  u16   imagePal; 	/* The pallet number.                        */
  u16	imageFlip;	/* The right & left inversion of the image. Inverted by G_BG_FLAG_FLIPS*/

  u16	scaleW;		/* The scale value of the X-direction.           (u5.10)*/
  u16	scaleH;		/* The scale value of the Y-direction.           (u5.10)*/
  s32	imageYorig;	/* The start point of drawing on the image.      (s20.5)*/
  
  u8	padding[4];
  
} uObjScaleBg_t;	/* 40 bytes */

typedef union {
  uObjBg_t        b;
  uObjScaleBg_t   s;
  long long int   force_structure_alignment;
} uObjBg;

/*---------------------------------------------------------------------------*
 *	2D Objects
 *---------------------------------------------------------------------------*/
#define	G_OBJ_FLAG_FLIPS	1<<0		/* The inversion to the S-direction.  */
#define	G_OBJ_FLAG_FLIPT	1<<4		/* The inversion to the T-direction.  */

typedef struct {
  s16  objX;		/* The x-coordinate of the upper-left end. s10.2 OBJ                */
  u16  scaleW;		/* Scaling of the u5.10 width direction.                            */
  u16  imageW;		/* The width of the u10.5 texture. (The length of the S-direction.) */
  u16  paddingX;	/* Unused.  Always 0.                                               */
  s16  objY;		/* The y-coordinate of the s10.2 OBJ upper-left end.                */
  u16  scaleH;		/* Scaling of the u5.10 height direction.                           */
  u16  imageH;		/* The height of the u10.5 texture. (The length of the T-direction.)*/
  u16  paddingY;	/* Unused.  Always 0.                                               */
  u16  imageStride;	/* The folding width of the texel.        (In units of 64bit word.) */
  u16  imageAdrs;	/* The texture header position in  TMEM.  (In units of 64bit word.) */  
  u8   imageFmt;	/* The format of the texel.   G_IM_FMT_*       */
  u8   imageSiz;	/* The size of the texel.         G_IM_SIZ_*       */
  u8   imagePal;	/*The pallet number.  0-7                        */
  u8   imageFlags;	/* The display flag.    G_OBJ_FLAG_FLIP*            */
} uObjSprite_t;		/* 24 bytes */

typedef union {
  uObjSprite_t      s;
  long long int   force_structure_alignment;
} uObjSprite;

/*---------------------------------------------------------------------------*
 *	2D Matrix
 *---------------------------------------------------------------------------*/
typedef struct {
  s32   A, B, C, D;     /* s15.16 */
  s16   X, Y;           /* s10.2  */
  u16   BaseScaleX;	/* u5.10  */
  u16   BaseScaleY;	/* u5.10  */
} uObjMtx_t;		/* 24 bytes */

typedef union {
  uObjMtx_t	m;
  long long int force_structure_alignment;
} uObjMtx;

typedef struct {
  s16   X, Y;           /* s10.2  */
  u16   BaseScaleX;	/* u5.10  */
  u16   BaseScaleY;	/* u5.10  */
} uObjSubMtx_t;		/* 8 bytes */

typedef union {
  uObjSubMtx_t	m;
  long long int force_structure_alignment;
} uObjSubMtx;

/*---------------------------------------------------------------------------*
 *	Loading into TMEM
 *---------------------------------------------------------------------------*/
#define	G_OBJLT_TXTRBLOCK	0x00001033
#define	G_OBJLT_TXTRTILE	0x00fc1034
#define	G_OBJLT_TLUT		0x00000030

#define	GS_TB_TSIZE(pix,siz)	(GS_PIX2TMEM((pix),(siz))-1)
#define	GS_TB_TLINE(pix,siz)	(GS_CALC_DXT(GS_PIX2TMEM((pix),(siz))))

typedef	struct	{
  u32	type;		/* G_OBJLT_TXTRBLOCK divided into types.                                */
  u64	*image;		/* The texture source address on DRAM.                                  */
  u16	tmem;		/* The  transferred TMEM word address.   (8byteWORD)                    */
  u16	tsize;		/* The Texture size.  Specified by the macro  GS_TB_TSIZE().            */
  u16	tline;		/* The width of the Texture 1-line. Specified by the macro GS_TB_TLINE()*/
  u16	sid;		/* STATE ID Multipled by 4.  Either one of  0,4,8 and 12.               */
  u32	flag;		/* STATE flag  */
  u32	mask;		/* STATE mask  */
} uObjTxtrBlock_t;		/* 24 bytes */

#define	GS_TT_TWIDTH(pix,siz)	((GS_PIX2TMEM((pix), (siz))<<2)-1)
#define	GS_TT_THEIGHT(pix,siz)	(((pix)<<2)-1)

typedef	struct	{
  u32	type;		/* G_OBJLT_TXTRTILE divided into types.                             */
  u64	*image;		/* The texture source address on DRAM.                              */
  u16	tmem;		/* The loaded texture source address on DRAM.  (8byteWORD)          */
  u16	twidth;		/* The width of the Texture. Specified by the macro GS_TT_TWIDTH()  */
  u16	theight;	/* The height of the Texture. Specified by the macro GS_TT_THEIGHT()*/
  u16	sid;		/* STATE ID  Multiplied by 4.  Either one of 0,4,8 and 12.          */
  u32	flag;		/* STATE flag  */
  u32	mask;		/* STATE mask  */
} uObjTxtrTile_t;		/* 24 bytes */

#define	GS_PAL_HEAD(head)	((head)+256)
#define	GS_PAL_NUM(num)		((num)-1)

typedef	struct	{
  u32	type;		/* G_OBJLT_TLUT divided into types.                            */
  u64	*image;		/* the texture source address on DRAM.                         */
  u16	phead;		/* The pallet number of the load header.  Between 256 and 511. */
  u16	pnum;		/* The loading pallet number -1.                               */
  u16   zero;		/* Assign 0 all the time.                                      */
  u16	sid;		/* STATE ID  Multiplied by 4.  Either one of 0,4,8 and 12.     */
  u32	flag;		/* STATE flag  */
  u32	mask;		/* STATE mask  */
} uObjTxtrTLUT_t;		/* 24 bytes */

typedef union {
  uObjTxtrBlock_t      block;
  uObjTxtrTile_t       tile;
  uObjTxtrTLUT_t       tlut;
  long long int   force_structure_alignment;
} uObjTxtr;

/*---------------------------------------------------------------------------*
 *	Loading into TMEM & 2D Objects
 *---------------------------------------------------------------------------*/
typedef	struct	{
  uObjTxtr	txtr;
  uObjSprite	sprite;
} uObjTxSprite;		/* 48 bytes */

/*===========================================================================*
 *	GBI Commands for S2DEX microcode
 *===========================================================================*/
/* GBI Header */
#define	G_BG_1CYC		0x01
#define	G_BG_COPY		0x02
#define	G_OBJ_RECTANGLE		0x03
#define	G_OBJ_SPRITE		0x04
#define	G_OBJ_MOVEMEM		0x05
#define	G_SELECT_DL		0xb0
#define	G_OBJ_RENDERMODE	0xb1
#define	G_OBJ_RECTANGLE_R	0xb2
#define	G_OBJ_LOADTXTR		0xc1
#define	G_OBJ_LDTX_SPRITE	0xc2
#define	G_OBJ_LDTX_RECT		0xc3
#define	G_OBJ_LDTX_RECT_R	0xc4
#define	G_RDPHALF_0		0xe4


/*---------------------------------------------------------------------------*
 *	Background wrapped screen
 *---------------------------------------------------------------------------*/
#define	gSPBgRectangle(pkt, m, mptr)  gDma0p((pkt),(m),(mptr),0)
#define	gsSPBgRectangle(m, mptr)      gsDma0p(     (m),(mptr),0)
#define	gSPBgRectCopy(pkt, mptr)      gSPBgRectangle((pkt), G_BG_COPY, (mptr))
#define	gsSPBgRectCopy(mptr)	      gsSPBgRectangle(      G_BG_COPY, (mptr))
#define	gSPBgRect1Cyc(pkt, mptr)      gSPBgRectangle((pkt), G_BG_1CYC, (mptr))
#define	gsSPBgRect1Cyc(mptr)	      gsSPBgRectangle(      G_BG_1CYC, (mptr))

/*---------------------------------------------------------------------------*
 *	2D Objects
 *---------------------------------------------------------------------------*/
#define	gSPObjSprite(pkt, mptr)       gDma0p((pkt),G_OBJ_SPRITE,     (mptr),0)
#define	gsSPObjSprite(mptr)           gsDma0p(     G_OBJ_SPRITE,     (mptr),0)
#define	gSPObjRectangle(pkt, mptr)    gDma0p((pkt),G_OBJ_RECTANGLE,  (mptr),0)
#define	gsSPObjRectangle(mptr)        gsDma0p(     G_OBJ_RECTANGLE,  (mptr),0)
#define	gSPObjRectangleR(pkt, mptr)   gDma0p((pkt),G_OBJ_RECTANGLE_R,(mptr),0)
#define	gsSPObjRectangleR(mptr)       gsDma0p(     G_OBJ_RECTANGLE_R,(mptr),0)

/*---------------------------------------------------------------------------*
 *	2D Matrix
 *---------------------------------------------------------------------------*/
#define	gSPObjMatrix(pkt, mptr)	      gDma1p((pkt),G_OBJ_MOVEMEM,(mptr),0,23)
#define	gsSPObjMatrix(mptr)           gsDma1p(     G_OBJ_MOVEMEM,(mptr),0,23)
#define	gSPObjSubMatrix(pkt, mptr)    gDma1p((pkt),G_OBJ_MOVEMEM,(mptr),2, 7)
#define	gsSPObjSubMatrix(mptr)        gsDma1p(     G_OBJ_MOVEMEM,(mptr),2, 7)

/*---------------------------------------------------------------------------*
 *	Loading into TMEM
 *---------------------------------------------------------------------------*/
#define	gSPObjLoadTxtr(pkt, tptr)     gDma0p((pkt),G_OBJ_LOADTXTR,   (tptr),23)
#define	gsSPObjLoadTxtr(tptr)         gsDma0p(     G_OBJ_LOADTXTR,   (tptr),23)
#define	gSPObjLoadTxSprite(pkt, tptr) gDma0p((pkt),G_OBJ_LDTX_SPRITE,(tptr),47)
#define	gsSPObjLoadTxSprite(tptr)     gsDma0p(     G_OBJ_LDTX_SPRITE,(tptr),47)
#define	gSPObjLoadTxRect(pkt, tptr)   gDma0p((pkt),G_OBJ_LDTX_RECT,  (tptr),47)
#define	gsSPObjLoadTxRect(tptr)       gsDma0p(     G_OBJ_LDTX_RECT,  (tptr),47)
#define	gSPObjLoadTxRectR(pkt, tptr)  gDma0p((pkt),G_OBJ_LDTX_RECT_R,(tptr),47)
#define	gsSPObjLoadTxRectR(tptr)      gsDma0p(     G_OBJ_LDTX_RECT_R,(tptr),47)

/*---------------------------------------------------------------------------*
 *	Select Display List
 *---------------------------------------------------------------------------*/
#define	gSPSelectDL(pkt, mptr, sid, flag, mask)	\
{	gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \
	gDma1p((pkt), G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_PUSH); }
#define	gsSPSelectDL(mptr, sid, flag, mask)	\
{	gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \
	gsDma1p(G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_PUSH); }
#define	gSPSelectBranchDL(pkt, mptr, sid, flag, mask)	\
{	gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \
	gDma1p((pkt), G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_NOPUSH); }
#define	gsSPSelectBranchDL(mptr, sid, flag, mask)	\
{	gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \
	gsDma1p(G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_NOPUSH); }

/*---------------------------------------------------------------------------*
 *	Set general status
 *---------------------------------------------------------------------------*/
#define	G_MW_GENSTAT	0x08	/* Note that it is the same value of G_MW_FOG.  */

#define	gSPSetStatus(pkt, sid, val)	\
	gMoveWd((pkt), G_MW_GENSTAT, (sid), (val))
#define	gsSPSetStatus(sid, val)	\
	gsMoveWd(      G_MW_GENSTAT, (sid), (val))

/*---------------------------------------------------------------------------*
 *	Set Object Render Mode
 *---------------------------------------------------------------------------*/
#define	G_OBJRM_NOTXCLAMP	0x01
#define	G_OBJRM_XLU		0x02	/* Ignored */
#define	G_OBJRM_ANTIALIAS	0x04	/* Ignored */
#define	G_OBJRM_BILERP		0x08
#define	G_OBJRM_SHRINKSIZE_1	0x10
#define	G_OBJRM_SHRINKSIZE_2	0x20
#define	G_OBJRM_WIDEN		0x40

#define	gSPObjRenderMode(pkt, mode)   gImmp1((pkt),G_OBJ_RENDERMODE,(mode))
#define	gsSPObjRenderMode(mode)	      gsImmp1(     G_OBJ_RENDERMODE,(mode))

/*===========================================================================*
 *	Render Mode Macro
 *===========================================================================*/
#define RM_RA_SPRITE(clk)                                      \
        AA_EN | CVG_DST_CLAMP |                                \
        CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE |   \
        GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)

#define G_RM_SPRITE		G_RM_OPA_SURF
#define G_RM_SPRITE2		G_RM_OPA_SURF2
#define G_RM_RA_SPRITE  	RM_RA_SPRITE(1)
#define G_RM_RA_SPRITE2		RM_RA_SPRITE(2)
#define G_RM_AA_SPRITE		G_RM_AA_TEX_TERR
#define G_RM_AA_SPRITE2		G_RM_AA_TEX_TERR2
#define G_RM_XLU_SPRITE		G_RM_XLU_SURF
#define G_RM_XLU_SPRITE2	G_RM_XLU_SURF2
#define G_RM_AA_XLU_SPRITE	G_RM_AA_XLU_SURF
#define G_RM_AA_XLU_SPRITE2	G_RM_AA_XLU_SURF2

/*===========================================================================*
 *	External functions 
 *===========================================================================*/
extern	u64	gspS2DEX_fifoTextStart[], gspS2DEX_fifoTextEnd[];
extern	u64	gspS2DEX_fifoDataStart[], gspS2DEX_fifoDataEnd[];
extern	u64	gspS2DEX_fifo_dTextStart[], gspS2DEX_fifo_dTextEnd[];
extern	u64	gspS2DEX_fifo_dDataStart[], gspS2DEX_fifo_dDataEnd[];
extern	void	guS2DInitBg(uObjBg *);
extern	void	guS2DEmuSetScissor(u32, u32, u32, u32, u8);
extern	void	guS2DEmuBgRect1Cyc(Gfx **, uObjBg *);

#ifdef _LANGUAGE_C_PLUS_PLUS
}
#endif
#endif /* _GS2DEX_H_ */

/*======== End of gs2dex.h ========*/