Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/include/PR/gs2dex.h
7858 views
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 ========*/
393
394