mirror of https://github.com/zeldaret/mm.git
				
				
				
			
		
			
				
	
	
		
			3839 lines
		
	
	
		
			98 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			3839 lines
		
	
	
		
			98 KiB
		
	
	
	
		
			C
		
	
	
	
/**
 | 
						|
 * gbi.h version 0.3.6
 | 
						|
 * n64 graphics microcode interface library
 | 
						|
 * compatible with fast3d, f3dex, f3dex2, s2dex, and s2dex2
 | 
						|
 *
 | 
						|
 * select a microcode with one of these preprocessor definitions;
 | 
						|
 *   #define F3D_GBI
 | 
						|
 * for fast3d (selected automatically by default), or
 | 
						|
 *   #define F3DEX_GBI
 | 
						|
 * for f3dex/s2dex, or
 | 
						|
 *   #define F3DEX_GBI_2
 | 
						|
 * for f3dex2/s2dex2
 | 
						|
 *
 | 
						|
 * for early versions of fast3d and f3dex, also define the following;
 | 
						|
 *   #define F3D_BETA
 | 
						|
 *
 | 
						|
 * ido incompatibilities;
 | 
						|
 * - use of c99 variadic macros
 | 
						|
 * - use of c99 fixed-width integer types
 | 
						|
 * - use of c99 designated initializers
 | 
						|
 * - use of c99 compound literals
 | 
						|
 * - use of c11 _Alignas
 | 
						|
 * - use of gnu c compound expressions
 | 
						|
 * - use of gnu c __typeof__
 | 
						|
 *
 | 
						|
 * libultra incompatibilities;
 | 
						|
 * - many private, undocumented, or obsolete macros not commonly used by
 | 
						|
 *   programmers are missing
 | 
						|
 * - many different implementation details that will produce matching gbi,
 | 
						|
 *   but not matching code
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef N64_GBI_H
 | 
						|
#define N64_GBI_H
 | 
						|
 | 
						|
#include <stdint.h>
 | 
						|
 | 
						|
/* use fast3d by default */
 | 
						|
#if !defined(F3D_GBI) && !defined(F3DEX_GBI) && !defined(F3DEX_GBI_2)
 | 
						|
# define F3D_GBI
 | 
						|
#endif
 | 
						|
 | 
						|
/* commands for fast3d and f3dex */
 | 
						|
#if defined(F3D_GBI) || defined(F3DEX_GBI)
 | 
						|
# define G_SPNOOP		0x00
 | 
						|
# define G_MTX			0x01
 | 
						|
# define G_MOVEMEM		0x03
 | 
						|
# define G_VTX			0x04
 | 
						|
# define G_DL			0x06
 | 
						|
# if defined(F3D_BETA)
 | 
						|
#  define G_RDPHALF_2		0xB2
 | 
						|
#  define G_RDPHALF_1		0xB3
 | 
						|
#  define G_PERSPNORM		0xB4
 | 
						|
# else
 | 
						|
#  define G_RDPHALF_2		0xB3
 | 
						|
#  define G_RDPHALF_1		0xB4
 | 
						|
# endif
 | 
						|
# define G_LINE3D		0xB5
 | 
						|
# define G_CLEARGEOMETRYMODE	0xB6
 | 
						|
# define G_SETGEOMETRYMODE	0xB7
 | 
						|
# define G_ENDDL		0xB8
 | 
						|
# define G_SETOTHERMODE_L	0xB9
 | 
						|
# define G_SETOTHERMODE_H	0xBA
 | 
						|
# define G_TEXTURE		0xBB
 | 
						|
# define G_MOVEWORD		0xBC
 | 
						|
# define G_POPMTX		0xBD
 | 
						|
# define G_CULLDL		0xBE
 | 
						|
# define G_TRI1			0xBF
 | 
						|
# define G_NOOP			0xC0
 | 
						|
#endif
 | 
						|
 | 
						|
/* commands for f3dex */
 | 
						|
#if defined(F3DEX_GBI)
 | 
						|
# define G_LOAD_UCODE		0xAF
 | 
						|
# define G_BRANCH_Z		0xB0
 | 
						|
# define G_TRI2			0xB1
 | 
						|
# if !defined(F3D_BETA)
 | 
						|
#  define G_MODIFYVTX		0xB2
 | 
						|
# endif
 | 
						|
#endif
 | 
						|
 | 
						|
/* commands for f3dex2 */
 | 
						|
#if defined(F3DEX_GBI_2)
 | 
						|
# define G_NOOP			0x00
 | 
						|
# define G_VTX			0x01
 | 
						|
# define G_MODIFYVTX		0x02
 | 
						|
# define G_CULLDL		0x03
 | 
						|
# define G_BRANCH_Z		0x04
 | 
						|
# define G_TRI1			0x05
 | 
						|
# define G_TRI2			0x06
 | 
						|
# define G_QUAD			0x07
 | 
						|
# define G_LINE3D		0x08
 | 
						|
# define G_SPECIAL_3		0xD3
 | 
						|
# define G_SPECIAL_2		0xD4
 | 
						|
# define G_SPECIAL_1		0xD5
 | 
						|
# define G_DMA_IO		0xD6
 | 
						|
# define G_TEXTURE		0xD7
 | 
						|
# define G_POPMTX		0xD8
 | 
						|
# define G_GEOMETRYMODE		0xD9
 | 
						|
# define G_MTX			0xDA
 | 
						|
# define G_MOVEWORD		0xDB
 | 
						|
# define G_MOVEMEM		0xDC
 | 
						|
# define G_LOAD_UCODE		0xDD
 | 
						|
# define G_DL			0xDE
 | 
						|
# define G_ENDDL		0xDF
 | 
						|
# define G_SPNOOP		0xE0
 | 
						|
# define G_RDPHALF_1		0xE1
 | 
						|
# define G_SETOTHERMODE_L	0xE2
 | 
						|
# define G_SETOTHERMODE_H	0xE3
 | 
						|
# define G_RDPHALF_2		0xF1
 | 
						|
#endif
 | 
						|
 | 
						|
/* rdp commands */
 | 
						|
#define G_TEXRECT		0xE4
 | 
						|
#define G_TEXRECTFLIP		0xE5
 | 
						|
#define G_RDPLOADSYNC		0xE6
 | 
						|
#define G_RDPPIPESYNC		0xE7
 | 
						|
#define G_RDPTILESYNC		0xE8
 | 
						|
#define G_RDPFULLSYNC		0xE9
 | 
						|
#define G_SETKEYGB		0xEA
 | 
						|
#define G_SETKEYR		0xEB
 | 
						|
#define G_SETCONVERT		0xEC
 | 
						|
#define G_SETSCISSOR		0xED
 | 
						|
#define G_SETPRIMDEPTH		0xEE
 | 
						|
#define G_RDPSETOTHERMODE	0xEF
 | 
						|
#define G_LOADTLUT		0xF0
 | 
						|
#define G_SETTILESIZE		0xF2
 | 
						|
#define G_LOADBLOCK		0xF3
 | 
						|
#define G_LOADTILE		0xF4
 | 
						|
#define G_SETTILE		0xF5
 | 
						|
#define G_FILLRECT		0xF6
 | 
						|
#define G_SETFILLCOLOR		0xF7
 | 
						|
#define G_SETFOGCOLOR		0xF8
 | 
						|
#define G_SETBLENDCOLOR		0xF9
 | 
						|
#define G_SETPRIMCOLOR		0xFA
 | 
						|
#define G_SETENVCOLOR		0xFB
 | 
						|
#define G_SETCOMBINE		0xFC
 | 
						|
#define G_SETTIMG		0xFD
 | 
						|
#define G_SETZIMG		0xFE
 | 
						|
#define G_SETCIMG		0xFF
 | 
						|
 | 
						|
/* commands for s2dex */
 | 
						|
#if defined(F3DEX_GBI)
 | 
						|
# 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
 | 
						|
#endif
 | 
						|
 | 
						|
/* commands for s2dex2 */
 | 
						|
#if defined(F3DEX_GBI_2)
 | 
						|
# define G_OBJ_RECTANGLE	0x01
 | 
						|
# define G_OBJ_SPRITE		0x02
 | 
						|
# define G_SELECT_DL		0x04
 | 
						|
# define G_OBJ_LOADTXTR		0x05
 | 
						|
# define G_OBJ_LDTX_SPRITE	0x06
 | 
						|
# define G_OBJ_LDTX_RECT	0x07
 | 
						|
# define G_OBJ_LDTX_RECT_R	0x08
 | 
						|
# define G_BG_1CYC		0x09
 | 
						|
# define G_BG_COPY		0x0A
 | 
						|
# define G_OBJ_RENDERMODE	0x0B
 | 
						|
# define G_OBJ_RECTANGLE_R	0xDA
 | 
						|
# define G_OBJ_MOVEMEM		0xDC
 | 
						|
#endif
 | 
						|
 | 
						|
/* commands for s2dex and s2dex2 */
 | 
						|
#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2)
 | 
						|
# define G_RDPHALF_0		0xE4
 | 
						|
#endif
 | 
						|
 | 
						|
/* image formats */
 | 
						|
#define G_IM_FMT_RGBA		0
 | 
						|
#define G_IM_FMT_YUV		1
 | 
						|
#define G_IM_FMT_CI		2
 | 
						|
#define G_IM_FMT_IA		3
 | 
						|
#define G_IM_FMT_I		4
 | 
						|
#define G_IM_SIZ_4b		0
 | 
						|
#define G_IM_SIZ_8b		1
 | 
						|
#define G_IM_SIZ_16b		2
 | 
						|
#define G_IM_SIZ_32b		3
 | 
						|
 | 
						|
/* texture settings */
 | 
						|
#define G_TX_NOMIRROR		(gI_(0b0) << 0)
 | 
						|
#define G_TX_MIRROR		(gI_(0b1) << 0)
 | 
						|
#define G_TX_WRAP		(gI_(0b0) << 1)
 | 
						|
#define G_TX_CLAMP		(gI_(0b1) << 1)
 | 
						|
#define G_TX_NOMASK		gI_(0)
 | 
						|
#define G_TX_NOLOD		gI_(0)
 | 
						|
#define G_OFF			gI_(0)
 | 
						|
#define G_ON			gI_(1)
 | 
						|
 | 
						|
/* tile indices */
 | 
						|
#define G_TX_LOADTILE		7
 | 
						|
#define G_TX_RENDERTILE		0
 | 
						|
 | 
						|
/* loadblock constants */
 | 
						|
#define G_TX_DXT_FRAC		11
 | 
						|
#define G_TX_LDBLK_MAX_TXL	2047
 | 
						|
 | 
						|
/* geometry mode */
 | 
						|
#define G_ZBUFFER		(gI_(0b1) << 0)
 | 
						|
#define G_SHADE			(gI_(0b1) << 2)
 | 
						|
#define G_CULL_BOTH		(G_CULL_FRONT | G_CULL_BACK)
 | 
						|
#define G_FOG			(gI_(0b1) << 16)
 | 
						|
#define G_LIGHTING		(gI_(0b1) << 17)
 | 
						|
#define G_TEXTURE_GEN		(gI_(0b1) << 18)
 | 
						|
#define G_TEXTURE_GEN_LINEAR	(gI_(0b1) << 19)
 | 
						|
#define G_LOD			(gI_(0b1) << 20)
 | 
						|
 | 
						|
/* geometry mode for fast3d */
 | 
						|
#if defined(F3D_GBI)
 | 
						|
# define G_CLIPPING		(gI_(0b0) << 0)
 | 
						|
#endif
 | 
						|
 | 
						|
/* geometry mode for fast3d and f3dex */
 | 
						|
#if defined(F3D_GBI) || defined(F3DEX_GBI)
 | 
						|
# define G_TEXTURE_ENABLE	(gI_(0b1) << 1)
 | 
						|
# define G_SHADING_SMOOTH	(gI_(0b1) << 9)
 | 
						|
# define G_CULL_FRONT		(gI_(0b1) << 12)
 | 
						|
# define G_CULL_BACK		(gI_(0b1) << 13)
 | 
						|
#endif
 | 
						|
 | 
						|
/* geometry mode for f3dex and f3dex2 */
 | 
						|
#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2)
 | 
						|
# define G_CLIPPING		(gI_(0b1) << 23)
 | 
						|
#endif
 | 
						|
 | 
						|
/* geometry mode for f3dex2 */
 | 
						|
#if defined(F3DEX_GBI_2)
 | 
						|
# define G_TEXTURE_ENABLE	(gI_(0b0) << 0)
 | 
						|
# define G_CULL_FRONT		(gI_(0b1) << 9)
 | 
						|
# define G_CULL_BACK		(gI_(0b1) << 10)
 | 
						|
# define G_SHADING_SMOOTH	(gI_(0b1) << 21)
 | 
						|
#endif
 | 
						|
 | 
						|
/* othermode lo */
 | 
						|
#define G_MDSFT_ALPHACOMPARE	0
 | 
						|
#define G_MDSFT_ZSRCSEL		2
 | 
						|
#define G_MDSFT_RENDERMODE	3
 | 
						|
#define G_MDSFT_BLENDER		16
 | 
						|
#define G_MDSIZ_ALPHACOMPARE	2
 | 
						|
#define G_MDSIZ_ZSRCSEL		1
 | 
						|
#define G_MDSIZ_RENDERMODE	29
 | 
						|
#define G_MDSIZ_BLENDER		13
 | 
						|
 | 
						|
#define G_AC_NONE		(gI_(0b00) << G_MDSFT_ALPHACOMPARE)
 | 
						|
#define G_AC_THRESHOLD		(gI_(0b01) << G_MDSFT_ALPHACOMPARE)
 | 
						|
#define G_AC_DITHER		(gI_(0b11) << G_MDSFT_ALPHACOMPARE)
 | 
						|
#define G_ZS_PIXEL		(gI_(0b0) << G_MDSFT_ZSRCSEL)
 | 
						|
#define G_ZS_PRIM		(gI_(0b1) << G_MDSFT_ZSRCSEL)
 | 
						|
#define AA_EN			(gI_(0b1) << (G_MDSFT_RENDERMODE + 0))
 | 
						|
#define Z_CMP			(gI_(0b1) << (G_MDSFT_RENDERMODE + 1))
 | 
						|
#define Z_UPD			(gI_(0b1) << (G_MDSFT_RENDERMODE + 2))
 | 
						|
#define IM_RD			(gI_(0b1) << (G_MDSFT_RENDERMODE + 3))
 | 
						|
#define CLR_ON_CVG		(gI_(0b1) << (G_MDSFT_RENDERMODE + 4))
 | 
						|
#define CVG_DST_CLAMP		(gI_(0b00) << (G_MDSFT_RENDERMODE + 5))
 | 
						|
#define CVG_DST_WRAP		(gI_(0b01) << (G_MDSFT_RENDERMODE + 5))
 | 
						|
#define CVG_DST_FULL		(gI_(0b10) << (G_MDSFT_RENDERMODE + 5))
 | 
						|
#define CVG_DST_SAVE		(gI_(0b11) << (G_MDSFT_RENDERMODE + 5))
 | 
						|
#define ZMODE_OPA		(gI_(0b00) << (G_MDSFT_RENDERMODE + 7))
 | 
						|
#define ZMODE_INTER		(gI_(0b01) << (G_MDSFT_RENDERMODE + 7))
 | 
						|
#define ZMODE_XLU		(gI_(0b10) << (G_MDSFT_RENDERMODE + 7))
 | 
						|
#define ZMODE_DEC		(gI_(0b11) << (G_MDSFT_RENDERMODE + 7))
 | 
						|
#define CVG_X_ALPHA		(gI_(0b1) << (G_MDSFT_RENDERMODE + 9))
 | 
						|
#define ALPHA_CVG_SEL		(gI_(0b1) << (G_MDSFT_RENDERMODE + 10))
 | 
						|
#define FORCE_BL		(gI_(0b1) << (G_MDSFT_RENDERMODE + 11))
 | 
						|
 | 
						|
#define G_BL_1MA		gI_(0b00)
 | 
						|
#define G_BL_1			gI_(0b10)
 | 
						|
#define G_BL_0			gI_(0b11)
 | 
						|
#define G_BL_CLR_IN		gI_(0b00)
 | 
						|
#define G_BL_CLR_MEM		gI_(0b01)
 | 
						|
#define G_BL_CLR_BL		gI_(0b10)
 | 
						|
#define G_BL_CLR_FOG		gI_(0b11)
 | 
						|
#define G_BL_A_IN		gI_(0b00)
 | 
						|
#define G_BL_A_FOG		gI_(0b01)
 | 
						|
#define G_BL_A_MEM		gI_(0b01)
 | 
						|
#define G_BL_A_SHADE		gI_(0b10)
 | 
						|
 | 
						|
#define GBL_c1(p, a, m, b) \
 | 
						|
	( \
 | 
						|
		gF_(p, 2, 30) | \
 | 
						|
		gF_(a, 2, 26) | \
 | 
						|
		gF_(m, 2, 22) | \
 | 
						|
		gF_(b, 2, 18) \
 | 
						|
	)
 | 
						|
#define GBL_c2(p, a, m, b) \
 | 
						|
	( \
 | 
						|
		gF_(p, 2, 28) | \
 | 
						|
		gF_(a, 2, 24) | \
 | 
						|
		gF_(m, 2, 20) | \
 | 
						|
		gF_(b, 2, 16) \
 | 
						|
	)
 | 
						|
 | 
						|
/* render modes */
 | 
						|
#define G_RM_OPA_SURF \
 | 
						|
	( \
 | 
						|
		CVG_DST_CLAMP | ZMODE_OPA | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
 | 
						|
	)
 | 
						|
#define G_RM_OPA_SURF2 \
 | 
						|
	( \
 | 
						|
		CVG_DST_CLAMP | ZMODE_OPA | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_OPA_SURF \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_OPA_SURF2 \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_RA_OPA_SURF \
 | 
						|
	( \
 | 
						|
		AA_EN | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_RA_OPA_SURF2 \
 | 
						|
	( \
 | 
						|
		AA_EN | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_ZB_OPA_SURF \
 | 
						|
	( \
 | 
						|
		Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_ZB_OPA_SURF2 \
 | 
						|
	( \
 | 
						|
		Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_OPA_SURF \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_OPA_SURF2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_RA_ZB_OPA_SURF \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ZMODE_OPA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_RA_ZB_OPA_SURF2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ZMODE_OPA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_XLU_SURF \
 | 
						|
	( \
 | 
						|
		IM_RD | CVG_DST_FULL | ZMODE_OPA | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_XLU_SURF2 \
 | 
						|
	( \
 | 
						|
		IM_RD | CVG_DST_FULL | ZMODE_OPA | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_XLU_SURF \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_OPA | \
 | 
						|
		FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_XLU_SURF2 \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_OPA | \
 | 
						|
		FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_ZB_XLU_SURF \
 | 
						|
	( \
 | 
						|
		Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_XLU | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_ZB_XLU_SURF2 \
 | 
						|
	( \
 | 
						|
		Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_XLU | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_XLU_SURF \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \
 | 
						|
		ZMODE_XLU | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_XLU_SURF2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \
 | 
						|
		ZMODE_XLU | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_ZB_OPA_DECAL \
 | 
						|
	( \
 | 
						|
		Z_CMP | CVG_DST_FULL | ZMODE_DEC | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_ZB_OPA_DECAL2 \
 | 
						|
	( \
 | 
						|
		Z_CMP | CVG_DST_FULL | ZMODE_DEC | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_OPA_DECAL \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | ZMODE_DEC | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_OPA_DECAL2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | ZMODE_DEC | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_RA_ZB_OPA_DECAL \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | CVG_DST_WRAP | ZMODE_DEC | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_RA_ZB_OPA_DECAL2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | CVG_DST_WRAP | ZMODE_DEC | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_ZB_XLU_DECAL \
 | 
						|
	( \
 | 
						|
		Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_DEC | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_ZB_XLU_DECAL2 \
 | 
						|
	( \
 | 
						|
		Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_DEC | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_XLU_DECAL \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \
 | 
						|
		ZMODE_DEC | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_XLU_DECAL2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \
 | 
						|
		ZMODE_DEC | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_AA_ZB_OPA_INTER \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_INTER | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_OPA_INTER2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_INTER | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_RA_ZB_OPA_INTER \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ZMODE_INTER | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_RA_ZB_OPA_INTER2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ZMODE_INTER | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_AA_ZB_XLU_INTER \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \
 | 
						|
		ZMODE_INTER | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_XLU_INTER2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \
 | 
						|
		ZMODE_INTER | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_AA_XLU_LINE \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
 | 
						|
		ALPHA_CVG_SEL | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_XLU_LINE2 \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
 | 
						|
		ALPHA_CVG_SEL | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_XLU_LINE \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | IM_RD | CVG_DST_CLAMP | ZMODE_XLU | \
 | 
						|
		CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_XLU_LINE2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | IM_RD | CVG_DST_CLAMP | ZMODE_XLU | \
 | 
						|
		CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_AA_DEC_LINE \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA | \
 | 
						|
		ALPHA_CVG_SEL | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_DEC_LINE2 \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA | \
 | 
						|
		ALPHA_CVG_SEL | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_DEC_LINE \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_DEC | \
 | 
						|
		CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_DEC_LINE2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_DEC | \
 | 
						|
		CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
 | 
						|
 | 
						|
#define G_RM_TEX_EDGE \
 | 
						|
	( \
 | 
						|
		AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
 | 
						|
		ALPHA_CVG_SEL | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
 | 
						|
	)
 | 
						|
#define G_RM_TEX_EDGE2 \
 | 
						|
	( \
 | 
						|
		AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
 | 
						|
		ALPHA_CVG_SEL | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_TEX_EDGE \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_TEX_EDGE2 \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_TEX_EDGE \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
 | 
						|
		CVG_X_ALPHA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_TEX_EDGE2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
 | 
						|
		CVG_X_ALPHA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_AA_ZB_TEX_INTER \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_INTER | \
 | 
						|
		CVG_X_ALPHA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_TEX_INTER2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_INTER | \
 | 
						|
		CVG_X_ALPHA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_AA_SUB_SURF \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_SUB_SURF2 \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_SUB_SURF \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_SUB_SURF2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_PCL_SURF \
 | 
						|
	( \
 | 
						|
		G_AC_DITHER | CVG_DST_FULL | ZMODE_OPA | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
 | 
						|
	)
 | 
						|
#define G_RM_PCL_SURF2 \
 | 
						|
	( \
 | 
						|
		G_AC_DITHER | CVG_DST_FULL | ZMODE_OPA | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_PCL_SURF \
 | 
						|
	( \
 | 
						|
		G_AC_DITHER | AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_PCL_SURF2 \
 | 
						|
	( \
 | 
						|
		G_AC_DITHER | AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_ZB_PCL_SURF \
 | 
						|
	( \
 | 
						|
		G_AC_DITHER | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
 | 
						|
	)
 | 
						|
#define G_RM_ZB_PCL_SURF2 \
 | 
						|
	( \
 | 
						|
		G_AC_DITHER | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_PCL_SURF \
 | 
						|
	( \
 | 
						|
		G_AC_DITHER | AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \
 | 
						|
		ZMODE_OPA | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_PCL_SURF2 \
 | 
						|
	( \
 | 
						|
		G_AC_DITHER | AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \
 | 
						|
		ZMODE_OPA | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_AA_OPA_TERR \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_OPA_TERR2 \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_OPA_TERR \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_OPA_TERR2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_AA_TEX_TERR \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_TEX_TERR2 \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_TEX_TERR \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
 | 
						|
		CVG_X_ALPHA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_TEX_TERR2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
 | 
						|
		CVG_X_ALPHA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_AA_SUB_TERR \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_SUB_TERR2 \
 | 
						|
	( \
 | 
						|
		AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_SUB_TERR \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_AA_ZB_SUB_TERR2 \
 | 
						|
	( \
 | 
						|
		AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_CLD_SURF \
 | 
						|
	( \
 | 
						|
		IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_CLD_SURF2 \
 | 
						|
	( \
 | 
						|
		IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_ZB_CLD_SURF \
 | 
						|
	( \
 | 
						|
		Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_XLU | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_ZB_CLD_SURF2 \
 | 
						|
	( \
 | 
						|
		Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_XLU | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_ZB_OVL_SURF \
 | 
						|
	( \
 | 
						|
		Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_DEC | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_ZB_OVL_SURF2 \
 | 
						|
	( \
 | 
						|
		Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_DEC | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_ADD \
 | 
						|
	( \
 | 
						|
		IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_1) \
 | 
						|
	)
 | 
						|
#define G_RM_ADD2 \
 | 
						|
	( \
 | 
						|
		IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_1) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_FOG_SHADE_A \
 | 
						|
	GBL_c1(G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA)
 | 
						|
 | 
						|
#define G_RM_FOG_PRIM_A \
 | 
						|
	GBL_c1(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_IN, G_BL_1MA)
 | 
						|
 | 
						|
#define G_RM_PASS \
 | 
						|
	GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
 | 
						|
 | 
						|
#define G_RM_VISCVG \
 | 
						|
	( \
 | 
						|
		IM_RD | FORCE_BL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
#define G_RM_VISCVG2 \
 | 
						|
	( \
 | 
						|
		IM_RD | FORCE_BL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_OPA_CI \
 | 
						|
	( \
 | 
						|
		CVG_DST_CLAMP | ZMODE_OPA | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
 | 
						|
	)
 | 
						|
#define G_RM_OPA_CI2 \
 | 
						|
	( \
 | 
						|
		CVG_DST_CLAMP | ZMODE_OPA | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
 | 
						|
	)
 | 
						|
 | 
						|
#define G_RM_NOOP		GBL_c1(0, 0, 0, 0)
 | 
						|
#define G_RM_NOOP2		GBL_c2(0, 0, 0, 0)
 | 
						|
 | 
						|
#define G_RM_SPRITE		G_RM_OPA_SURF
 | 
						|
#define G_RM_SPRITE2		G_RM_OPA_SURF2
 | 
						|
#define G_RM_RA_SPRITE \
 | 
						|
	( \
 | 
						|
		AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#define G_RM_RA_SPRITE2 \
 | 
						|
	( \
 | 
						|
		AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
 | 
						|
		ALPHA_CVG_SEL | \
 | 
						|
		GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
 | 
						|
	)
 | 
						|
#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
 | 
						|
 | 
						|
#define G_OBJRM_NOTXCLAMP	(gI_(0b1) << 0)
 | 
						|
#define G_OBJRM_XLU		(gI_(0b1) << 1)
 | 
						|
#define G_OBJRM_ANTIALIAS	(gI_(0b1) << 2)
 | 
						|
#define G_OBJRM_BILERP		(gI_(0b1) << 3)
 | 
						|
#define G_OBJRM_SHRINKSIZE_1	(gI_(0b1) << 4)
 | 
						|
#define G_OBJRM_SHRINKSIZE_2	(gI_(0b1) << 5)
 | 
						|
#define G_OBJRM_WIDEN		(gI_(0b1) << 6)
 | 
						|
 | 
						|
/* othermode hi */
 | 
						|
#define G_MDSFT_ALPHADITHER	4
 | 
						|
#define G_MDSFT_RGBDITHER	6
 | 
						|
#define G_MDSFT_COMBKEY		8
 | 
						|
#define G_MDSFT_TEXTCONV	9
 | 
						|
#define G_MDSFT_TEXTFILT	12
 | 
						|
#define G_MDSFT_TEXTLUT		14
 | 
						|
#define G_MDSFT_TEXTLOD		16
 | 
						|
#define G_MDSFT_TEXTDETAIL	17
 | 
						|
#define G_MDSFT_TEXTPERSP	19
 | 
						|
#define G_MDSFT_CYCLETYPE	20
 | 
						|
#define G_MDSFT_PIPELINE	23
 | 
						|
#define G_MDSIZ_ALPHADITHER	2
 | 
						|
#define G_MDSIZ_RGBDITHER	2
 | 
						|
#define G_MDSIZ_COMBKEY		1
 | 
						|
#define G_MDSIZ_TEXTCONV	3
 | 
						|
#define G_MDSIZ_TEXTFILT	2
 | 
						|
#define G_MDSIZ_TEXTLUT		2
 | 
						|
#define G_MDSIZ_TEXTLOD		1
 | 
						|
#define G_MDSIZ_TEXTDETAIL	2
 | 
						|
#define G_MDSIZ_TEXTPERSP	1
 | 
						|
#define G_MDSIZ_CYCLETYPE	2
 | 
						|
#define G_MDSIZ_PIPELINE	1
 | 
						|
 | 
						|
#define G_AD_PATTERN		(gI_(0b00) << G_MDSFT_ALPHADITHER)
 | 
						|
#define G_AD_NOTPATTERN		(gI_(0b01) << G_MDSFT_ALPHADITHER)
 | 
						|
#define G_AD_NOISE		(gI_(0b10) << G_MDSFT_ALPHADITHER)
 | 
						|
#define G_AD_DISABLE		(gI_(0b11) << G_MDSFT_ALPHADITHER)
 | 
						|
#define G_CD_MAGICSQ		(gI_(0b00) << G_MDSFT_RGBDITHER)
 | 
						|
#define G_CD_BAYER		(gI_(0b01) << G_MDSFT_RGBDITHER)
 | 
						|
#define G_CD_NOISE		(gI_(0b10) << G_MDSFT_RGBDITHER)
 | 
						|
#define G_CD_DISABLE		(gI_(0b11) << G_MDSFT_RGBDITHER)
 | 
						|
#define G_CD_ENABLE		(gI_(0b10) << G_MDSFT_RGBDITHER)
 | 
						|
#define G_CK_NONE		(gI_(0b0) << G_MDSFT_COMBKEY)
 | 
						|
#define G_CK_KEY		(gI_(0b1) << G_MDSFT_COMBKEY)
 | 
						|
#define G_TC_CONV		(gI_(0b000) << G_MDSFT_TEXTCONV)
 | 
						|
#define G_TC_FILTCONV		(gI_(0b101) << G_MDSFT_TEXTCONV)
 | 
						|
#define G_TC_FILT		(gI_(0b110) << G_MDSFT_TEXTCONV)
 | 
						|
#define G_TF_POINT		(gI_(0b00) << G_MDSFT_TEXTFILT)
 | 
						|
#define G_TF_BILERP		(gI_(0b10) << G_MDSFT_TEXTFILT)
 | 
						|
#define G_TF_AVERAGE		(gI_(0b11) << G_MDSFT_TEXTFILT)
 | 
						|
#define G_TT_NONE		(gI_(0b00) << G_MDSFT_TEXTLUT)
 | 
						|
#define G_TT_RGBA16		(gI_(0b10) << G_MDSFT_TEXTLUT)
 | 
						|
#define G_TT_IA16		(gI_(0b11) << G_MDSFT_TEXTLUT)
 | 
						|
#define G_TL_TILE		(gI_(0b0) << G_MDSFT_TEXTLOD)
 | 
						|
#define G_TL_LOD		(gI_(0b1) << G_MDSFT_TEXTLOD)
 | 
						|
#define G_TD_CLAMP		(gI_(0b00) << G_MDSFT_TEXTDETAIL)
 | 
						|
#define G_TD_SHARPEN		(gI_(0b01) << G_MDSFT_TEXTDETAIL)
 | 
						|
#define G_TD_DETAIL		(gI_(0b10) << G_MDSFT_TEXTDETAIL)
 | 
						|
#define G_TP_NONE		(gI_(0b0) << G_MDSFT_TEXTPERSP)
 | 
						|
#define G_TP_PERSP		(gI_(0b1) << G_MDSFT_TEXTPERSP)
 | 
						|
#define G_CYC_1CYCLE		(gI_(0b00) << G_MDSFT_CYCLETYPE)
 | 
						|
#define G_CYC_2CYCLE		(gI_(0b01) << G_MDSFT_CYCLETYPE)
 | 
						|
#define G_CYC_COPY		(gI_(0b10) << G_MDSFT_CYCLETYPE)
 | 
						|
#define G_CYC_FILL		(gI_(0b11) << G_MDSFT_CYCLETYPE)
 | 
						|
#define G_PM_NPRIMITIVE		(gI_(0b0) << G_MDSFT_PIPELINE)
 | 
						|
#define G_PM_1PRIMITIVE		(gI_(0b1) << G_MDSFT_PIPELINE)
 | 
						|
 | 
						|
/* color conversion constants */
 | 
						|
#define G_CV_K0			(175)
 | 
						|
#define G_CV_K1			(-43)
 | 
						|
#define G_CV_K2			(-89)
 | 
						|
#define G_CV_K3			(222)
 | 
						|
#define G_CV_K4			(114)
 | 
						|
#define G_CV_K5			(42)
 | 
						|
 | 
						|
/* color combiner */
 | 
						|
#define G_CCMUX_COMBINED	0
 | 
						|
#define G_CCMUX_TEXEL0		1
 | 
						|
#define G_CCMUX_TEXEL1		2
 | 
						|
#define G_CCMUX_PRIMITIVE	3
 | 
						|
#define G_CCMUX_SHADE		4
 | 
						|
#define G_CCMUX_ENVIRONMENT	5
 | 
						|
#define G_CCMUX_1		6
 | 
						|
#define G_CCMUX_NOISE		7
 | 
						|
#define G_CCMUX_0		31
 | 
						|
#define G_CCMUX_CENTER		6
 | 
						|
#define G_CCMUX_K4		7
 | 
						|
#define G_CCMUX_SCALE		6
 | 
						|
#define G_CCMUX_COMBINED_ALPHA	7
 | 
						|
#define G_CCMUX_TEXEL0_ALPHA	8
 | 
						|
#define G_CCMUX_TEXEL1_ALPHA	9
 | 
						|
#define G_CCMUX_PRIMITIVE_ALPHA	10
 | 
						|
#define G_CCMUX_SHADE_ALPHA	11
 | 
						|
#define G_CCMUX_ENV_ALPHA	12
 | 
						|
#define G_CCMUX_LOD_FRACTION	13
 | 
						|
#define G_CCMUX_PRIM_LOD_FRAC	14
 | 
						|
#define G_CCMUX_K5		15
 | 
						|
#define G_ACMUX_COMBINED	0
 | 
						|
#define G_ACMUX_TEXEL0		1
 | 
						|
#define G_ACMUX_TEXEL1		2
 | 
						|
#define G_ACMUX_PRIMITIVE	3
 | 
						|
#define G_ACMUX_SHADE		4
 | 
						|
#define G_ACMUX_ENVIRONMENT	5
 | 
						|
#define G_ACMUX_1		6
 | 
						|
#define G_ACMUX_0		7
 | 
						|
#define G_ACMUX_LOD_FRACTION	0
 | 
						|
#define G_ACMUX_PRIM_LOD_FRAC	6
 | 
						|
 | 
						|
/*
 | 
						|
 * combine modes
 | 
						|
 *	( A		- B )		* C		+ D
 | 
						|
*/
 | 
						|
#define G_CC_MODULATEI \
 | 
						|
	TEXEL0,		0,		SHADE,		0, \
 | 
						|
	0,		0,		0,		SHADE
 | 
						|
#define G_CC_MODULATEIA \
 | 
						|
	TEXEL0,		0,		SHADE,		0, \
 | 
						|
	TEXEL0,		0,		SHADE,		0
 | 
						|
#define G_CC_MODULATEIDECALA \
 | 
						|
	TEXEL0,		0,		SHADE,		0, \
 | 
						|
	0,		0,		0,		TEXEL0
 | 
						|
#define G_CC_MODULATERGB \
 | 
						|
	G_CC_MODULATEI
 | 
						|
#define G_CC_MODULATERGBA \
 | 
						|
	G_CC_MODULATEIA
 | 
						|
#define G_CC_MODULATERGBDECALA \
 | 
						|
	G_CC_MODULATEIDECALA
 | 
						|
#define G_CC_MODULATEI_PRIM \
 | 
						|
	TEXEL0,		0,		PRIMITIVE,	0, \
 | 
						|
	0,		0,		0,		PRIMITIVE
 | 
						|
#define G_CC_MODULATEIA_PRIM \
 | 
						|
	TEXEL0,		0,		PRIMITIVE,	0, \
 | 
						|
	TEXEL0,		0,		PRIMITIVE,	0
 | 
						|
#define G_CC_MODULATEIDECALA_PRIM \
 | 
						|
	TEXEL0,		0,		PRIMITIVE,	0, \
 | 
						|
	0,		0,		0,		TEXEL0
 | 
						|
#define G_CC_MODULATERGB_PRIM \
 | 
						|
	G_CC_MODULATEI_PRIM
 | 
						|
#define G_CC_MODULATERGBA_PRIM \
 | 
						|
	G_CC_MODULATEIA_PRIM
 | 
						|
#define G_CC_MODULATERGBDECALA_PRIM \
 | 
						|
	G_CC_MODULATEIDECALA_PRIM
 | 
						|
#define G_CC_DECALRGB \
 | 
						|
	0,		0,		0,		TEXEL0, \
 | 
						|
	0,		0,		0,		SHADE
 | 
						|
#define G_CC_DECALRGBA \
 | 
						|
	0,		0,		0,		TEXEL0, \
 | 
						|
	0,		0,		0,		TEXEL0
 | 
						|
#define G_CC_BLENDI \
 | 
						|
	ENVIRONMENT,	SHADE,		TEXEL0,		SHADE, \
 | 
						|
	0,		0,		0,		SHADE
 | 
						|
#define G_CC_BLENDIA \
 | 
						|
	ENVIRONMENT,	SHADE,		TEXEL0,		SHADE, \
 | 
						|
	TEXEL0,		0,		SHADE,		0
 | 
						|
#define G_CC_BLENDIDECALA \
 | 
						|
	ENVIRONMENT,	SHADE,		TEXEL0,		SHADE, \
 | 
						|
	0,		0,		0,		TEXEL0
 | 
						|
#define G_CC_BLENDRGBA \
 | 
						|
	TEXEL0,		SHADE,		TEXEL0_ALPHA,	SHADE, \
 | 
						|
	0,		0,		0,		SHADE
 | 
						|
#define G_CC_BLENDRGBDECALA \
 | 
						|
	TEXEL0,		SHADE,		TEXEL0_ALPHA,	SHADE, \
 | 
						|
	0,		0,		0,		TEXEL0
 | 
						|
#define G_CC_REFLECTRGB \
 | 
						|
	ENVIRONMENT,	0,		TEXEL0,		SHADE, \
 | 
						|
	0,		0,		0,		SHADE
 | 
						|
#define G_CC_REFLECTRGBDECALA \
 | 
						|
	ENVIRONMENT,	0,		TEXEL0,		SHADE, \
 | 
						|
	0,		0,		0,		TEXEL0
 | 
						|
#define G_CC_HILITERGB \
 | 
						|
	PRIMITIVE,	SHADE,		TEXEL0,		SHADE, \
 | 
						|
	0,		0,		0,		SHADE
 | 
						|
#define G_CC_HILITERGBA \
 | 
						|
	PRIMITIVE,	SHADE,		TEXEL0,		SHADE, \
 | 
						|
	PRIMITIVE,	SHADE,		TEXEL0,		SHADE
 | 
						|
#define G_CC_HILITERGBDECALA \
 | 
						|
	PRIMITIVE,	SHADE,		TEXEL0,		SHADE, \
 | 
						|
	0,		0,		0,		TEXEL0
 | 
						|
#define G_CC_1CYUV2RGB \
 | 
						|
	TEXEL0,		K4,		K5,		TEXEL0, \
 | 
						|
	0,		0,		0,		SHADE
 | 
						|
#define G_CC_PRIMITIVE \
 | 
						|
	0,		0,		0,		PRIMITIVE, \
 | 
						|
	0,		0,		0,		PRIMITIVE
 | 
						|
#define G_CC_SHADE \
 | 
						|
	0,		0,		0,		SHADE, \
 | 
						|
	0,		0,		0,		SHADE
 | 
						|
#define G_CC_ADDRGB \
 | 
						|
	1,		0,		TEXEL0,		SHADE, \
 | 
						|
	0,		0,		0,		SHADE
 | 
						|
#define G_CC_ADDRGBDECALA \
 | 
						|
	1,		0,		TEXEL0,		SHADE, \
 | 
						|
	0,		0,		0,		TEXEL0
 | 
						|
#define G_CC_SHADEDECALA \
 | 
						|
	0,		0,		0,		SHADE, \
 | 
						|
	0,		0,		0,		TEXEL0
 | 
						|
#define G_CC_BLENDPE \
 | 
						|
	PRIMITIVE,	ENVIRONMENT,	TEXEL0,		ENVIRONMENT, \
 | 
						|
	TEXEL0,		0,		SHADE,		0
 | 
						|
#define G_CC_BLENDPEDECALA \
 | 
						|
	PRIMITIVE,	ENVIRONMENT,	TEXEL0,		ENVIRONMENT, \
 | 
						|
	0,		0,		0,		TEXEL0
 | 
						|
#define G_CC_TRILERP \
 | 
						|
	TEXEL1,		TEXEL0,		LOD_FRACTION,	TEXEL0, \
 | 
						|
	TEXEL1,		TEXEL0,		LOD_FRACTION,	TEXEL0
 | 
						|
#define G_CC_TEMPLERP \
 | 
						|
	TEXEL1,		TEXEL0,		PRIM_LOD_FRAC,	TEXEL0, \
 | 
						|
	TEXEL1,		TEXEL0,		PRIM_LOD_FRAC,	TEXEL0
 | 
						|
#define G_CC_INTERFERENCE \
 | 
						|
	TEXEL0,		0,		TEXEL1,		0, \
 | 
						|
	TEXEL0,		0,		TEXEL1,		0
 | 
						|
#define _G_CC_BLENDPE \
 | 
						|
	ENVIRONMENT,	PRIMITIVE,	TEXEL0,		PRIMITIVE, \
 | 
						|
	TEXEL0,		0,		SHADE,		0
 | 
						|
#define _G_CC_BLENDPEDECALA \
 | 
						|
	ENVIRONMENT,	PRIMITIVE,	TEXEL0,		PRIMITIVE, \
 | 
						|
	0,		0,		0,		TEXEL0
 | 
						|
#define _G_CC_SPARSEST \
 | 
						|
	PRIMITIVE,	TEXEL0,		LOD_FRACTION,	TEXEL0, \
 | 
						|
	PRIMITIVE,	TEXEL0,		LOD_FRACTION,	TEXEL0
 | 
						|
#define _G_CC_TWOCOLORTEX \
 | 
						|
	PRIMITIVE,	SHADE,		TEXEL0,		SHADE, \
 | 
						|
	0,		0,		0,		SHADE
 | 
						|
#define G_CC_MODULATEI2 \
 | 
						|
	COMBINED,	0,		SHADE,		0, \
 | 
						|
	0,		0,		0,		SHADE
 | 
						|
#define G_CC_MODULATEIA2 \
 | 
						|
	COMBINED,	0,		SHADE,		0, \
 | 
						|
	COMBINED,	0,		SHADE,		0
 | 
						|
#define G_CC_MODULATERGB2 \
 | 
						|
	G_CC_MODULATEI2
 | 
						|
#define G_CC_MODULATERGBA2 \
 | 
						|
	G_CC_MODULATEIA2
 | 
						|
#define G_CC_MODULATEI_PRIM2 \
 | 
						|
	COMBINED,	0,		PRIMITIVE,	0, \
 | 
						|
	0,		0,		0,		PRIMITIVE
 | 
						|
#define G_CC_MODULATEIA_PRIM2 \
 | 
						|
	COMBINED,	0,		PRIMITIVE,	0, \
 | 
						|
	COMBINED,	0,		PRIMITIVE,	0
 | 
						|
#define G_CC_MODULATERGB_PRIM2 \
 | 
						|
	G_CC_MODULATEI_PRIM2
 | 
						|
#define G_CC_MODULATERGBA_PRIM2 \
 | 
						|
	G_CC_MODULATEIA_PRIM2
 | 
						|
#define G_CC_DECALRGB2 \
 | 
						|
	0,		0,		0,		COMBINED, \
 | 
						|
	0,		0,		0,		SHADE
 | 
						|
#define G_CC_BLENDI2 \
 | 
						|
	ENVIRONMENT,	SHADE,		COMBINED,	SHADE, \
 | 
						|
	0,		0,		0,		SHADE
 | 
						|
#define G_CC_BLENDIA2 \
 | 
						|
	ENVIRONMENT,	SHADE,		COMBINED,	SHADE, \
 | 
						|
	COMBINED,	0,		SHADE,		0
 | 
						|
#define G_CC_HILITERGB2 \
 | 
						|
	ENVIRONMENT,	COMBINED,	TEXEL0,		COMBINED, \
 | 
						|
	0,		0,		0,		SHADE
 | 
						|
#define G_CC_HILITERGBA2 \
 | 
						|
	ENVIRONMENT,	COMBINED,	TEXEL0,		COMBINED, \
 | 
						|
	ENVIRONMENT,	COMBINED,	TEXEL0,		COMBINED
 | 
						|
#define G_CC_HILITERGBDECALA2 \
 | 
						|
	ENVIRONMENT,	COMBINED,	TEXEL0,		COMBINED, \
 | 
						|
	0,		0,		0,		TEXEL0
 | 
						|
#define G_CC_HILITERGBPASSA2 \
 | 
						|
	ENVIRONMENT,	COMBINED,	TEXEL0,		COMBINED, \
 | 
						|
	0,		0,		0,		COMBINED
 | 
						|
#define G_CC_CHROMA_KEY2 \
 | 
						|
	TEXEL0,		CENTER,		SCALE,		0, \
 | 
						|
	0,		0,		0,		0
 | 
						|
#define G_CC_YUV2RGB \
 | 
						|
	TEXEL1,		K4,		K5,		TEXEL1, \
 | 
						|
	0,		0,		0,		0
 | 
						|
#define G_CC_PASS2 \
 | 
						|
	0,		0,		0,		COMBINED, \
 | 
						|
	0,		0,		0,		COMBINED
 | 
						|
#define G_CC_LERP(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \
 | 
						|
		a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \
 | 
						|
	( \
 | 
						|
		gFL_(G_CCMUX_##a0, 4, 52) | \
 | 
						|
		gFL_(G_CCMUX_##c0, 5, 47) | \
 | 
						|
		gFL_(G_ACMUX_##Aa0, 3, 44) | \
 | 
						|
		gFL_(G_ACMUX_##Ac0, 3, 41) | \
 | 
						|
		gFL_(G_CCMUX_##a1, 4, 37) | \
 | 
						|
		gFL_(G_CCMUX_##c1, 5, 32) | \
 | 
						|
		gFL_(G_CCMUX_##b0, 4, 28) | \
 | 
						|
		gFL_(G_CCMUX_##b1, 4, 24) | \
 | 
						|
		gFL_(G_ACMUX_##Aa1, 3, 21) | \
 | 
						|
		gFL_(G_ACMUX_##Ac1, 3, 18) | \
 | 
						|
		gFL_(G_CCMUX_##d0, 3, 15) | \
 | 
						|
		gFL_(G_ACMUX_##Ab0, 3, 12) | \
 | 
						|
		gFL_(G_ACMUX_##Ad0, 3, 9) | \
 | 
						|
		gFL_(G_CCMUX_##d1, 3, 6) | \
 | 
						|
		gFL_(G_ACMUX_##Ab1, 3, 3) | \
 | 
						|
		gFL_(G_ACMUX_##Ad1, 3, 0) \
 | 
						|
	)
 | 
						|
#define G_CC_MODE(mode1, mode2)	G_CC_LERP(mode1, mode2)
 | 
						|
 | 
						|
/* scissor modes */
 | 
						|
#define G_SC_NON_INTERLACE	gI_(0b00)
 | 
						|
#define G_SC_EVEN_INTERLACE	gI_(0b10)
 | 
						|
#define G_SC_ODD_INTERLACE	gI_(0b11)
 | 
						|
 | 
						|
/* display list branch flags */
 | 
						|
#define G_DL_PUSH		gI_(0b0)
 | 
						|
#define G_DL_NOPUSH		gI_(0b1)
 | 
						|
 | 
						|
/* conditional branching flags (f3dex and f3dex2) */
 | 
						|
#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2)
 | 
						|
# define G_BZ_PERSP		0
 | 
						|
# define G_BZ_ORTHO		1
 | 
						|
#endif
 | 
						|
 | 
						|
/* matrix params */
 | 
						|
#define G_MTX_MUL		(gI_(0b0) << 1)
 | 
						|
#define G_MTX_LOAD		(gI_(0b1) << 1)
 | 
						|
 | 
						|
/* matrix params for fast3d and f3dex */
 | 
						|
#if defined(F3D_GBI) || defined(F3DEX_GBI)
 | 
						|
# define G_MTX_MODELVIEW	(gI_(0b0) << 0)
 | 
						|
# define G_MTX_PROJECTION	(gI_(0b1) << 0)
 | 
						|
# define G_MTX_NOPUSH		(gI_(0b0) << 2)
 | 
						|
# define G_MTX_PUSH		(gI_(0b1) << 2)
 | 
						|
#endif
 | 
						|
 | 
						|
/* matrix params for f3dex2 */
 | 
						|
#if defined(F3DEX_GBI_2)
 | 
						|
# define G_MTX_NOPUSH		(gI_(0b0) << 0)
 | 
						|
# define G_MTX_PUSH		(gI_(0b1) << 0)
 | 
						|
# define G_MTX_MODELVIEW	(gI_(0b0) << 2)
 | 
						|
# define G_MTX_PROJECTION	(gI_(0b1) << 2)
 | 
						|
#endif
 | 
						|
 | 
						|
/* moveword indices */
 | 
						|
#define G_MW_MATRIX		0
 | 
						|
#define G_MW_NUMLIGHT		2
 | 
						|
#define G_MW_CLIP		4
 | 
						|
#define G_MW_SEGMENT		6
 | 
						|
#define G_MW_FOG		8
 | 
						|
#define G_MW_GENSTAT		8
 | 
						|
#define G_MW_LIGHTCOL		10
 | 
						|
#define G_MW_PERSPNORM		14
 | 
						|
 | 
						|
/* moveword indices for fast3d and f3dex */
 | 
						|
#if defined(F3D_GBI) || defined(F3DEX_GBI)
 | 
						|
# define G_MW_POINTS		12
 | 
						|
#endif
 | 
						|
 | 
						|
/* moveword indices for f3dex2 */
 | 
						|
#if defined(F3DEX_GBI_2)
 | 
						|
# define G_MW_FORCEMTX		12
 | 
						|
#endif
 | 
						|
 | 
						|
/* moveword offsets */
 | 
						|
#define G_MWO_NUMLIGHT		gI_(0x00)
 | 
						|
#define G_MWO_CLIP_RNX		gI_(0x04)
 | 
						|
#define G_MWO_CLIP_RNY		gI_(0x0C)
 | 
						|
#define G_MWO_CLIP_RPX		gI_(0x14)
 | 
						|
#define G_MWO_CLIP_RPY		gI_(0x1C)
 | 
						|
#define G_MWO_SEGMENT_0		gI_(0x00)
 | 
						|
#define G_MWO_SEGMENT_1		gI_(0x04)
 | 
						|
#define G_MWO_SEGMENT_2		gI_(0x08)
 | 
						|
#define G_MWO_SEGMENT_3		gI_(0x0C)
 | 
						|
#define G_MWO_SEGMENT_4		gI_(0x10)
 | 
						|
#define G_MWO_SEGMENT_5		gI_(0x14)
 | 
						|
#define G_MWO_SEGMENT_6		gI_(0x18)
 | 
						|
#define G_MWO_SEGMENT_7		gI_(0x1C)
 | 
						|
#define G_MWO_SEGMENT_8		gI_(0x20)
 | 
						|
#define G_MWO_SEGMENT_9		gI_(0x24)
 | 
						|
#define G_MWO_SEGMENT_A		gI_(0x28)
 | 
						|
#define G_MWO_SEGMENT_B		gI_(0x2C)
 | 
						|
#define G_MWO_SEGMENT_C		gI_(0x30)
 | 
						|
#define G_MWO_SEGMENT_D		gI_(0x34)
 | 
						|
#define G_MWO_SEGMENT_E		gI_(0x38)
 | 
						|
#define G_MWO_SEGMENT_F		gI_(0x3C)
 | 
						|
#define G_MWO_FOG		gI_(0x00)
 | 
						|
#define G_MWO_aLIGHT_1		gI_(0x00)
 | 
						|
#define G_MWO_bLIGHT_1		gI_(0x04)
 | 
						|
#define G_MWO_MATRIX_XX_XY_I	gI_(0x00)
 | 
						|
#define G_MWO_MATRIX_XZ_XW_I	gI_(0x04)
 | 
						|
#define G_MWO_MATRIX_YX_YY_I	gI_(0x08)
 | 
						|
#define G_MWO_MATRIX_YZ_YW_I	gI_(0x0C)
 | 
						|
#define G_MWO_MATRIX_ZX_ZY_I	gI_(0x10)
 | 
						|
#define G_MWO_MATRIX_ZZ_ZW_I	gI_(0x14)
 | 
						|
#define G_MWO_MATRIX_WX_WY_I	gI_(0x18)
 | 
						|
#define G_MWO_MATRIX_WZ_WW_I	gI_(0x1C)
 | 
						|
#define G_MWO_MATRIX_XX_XY_F	gI_(0x20)
 | 
						|
#define G_MWO_MATRIX_XZ_XW_F	gI_(0x24)
 | 
						|
#define G_MWO_MATRIX_YX_YY_F	gI_(0x28)
 | 
						|
#define G_MWO_MATRIX_YZ_YW_F	gI_(0x2C)
 | 
						|
#define G_MWO_MATRIX_ZX_ZY_F	gI_(0x30)
 | 
						|
#define G_MWO_MATRIX_ZZ_ZW_F	gI_(0x34)
 | 
						|
#define G_MWO_MATRIX_WX_WY_F	gI_(0x38)
 | 
						|
#define G_MWO_MATRIX_WZ_WW_F	gI_(0x3C)
 | 
						|
#define G_MWO_POINT_RGBA	gI_(0x10)
 | 
						|
#define G_MWO_POINT_ST		gI_(0x14)
 | 
						|
#define G_MWO_POINT_XYSCREEN	gI_(0x18)
 | 
						|
#define G_MWO_POINT_ZSCREEN	gI_(0x1C)
 | 
						|
 | 
						|
/* moveword offsets for fast3d and f3dex */
 | 
						|
#if defined(F3D_GBI) || defined(F3DEX_GBI)
 | 
						|
# define G_MWO_aLIGHT_2		gI_(0x20)
 | 
						|
# define G_MWO_bLIGHT_2		gI_(0x24)
 | 
						|
# define G_MWO_aLIGHT_3		gI_(0x40)
 | 
						|
# define G_MWO_bLIGHT_3		gI_(0x44)
 | 
						|
# define G_MWO_aLIGHT_4		gI_(0x60)
 | 
						|
# define G_MWO_bLIGHT_4		gI_(0x64)
 | 
						|
# define G_MWO_aLIGHT_5		gI_(0x80)
 | 
						|
# define G_MWO_bLIGHT_5		gI_(0x84)
 | 
						|
# define G_MWO_aLIGHT_6		gI_(0xA0)
 | 
						|
# define G_MWO_bLIGHT_6		gI_(0xA4)
 | 
						|
# define G_MWO_aLIGHT_7		gI_(0xC0)
 | 
						|
# define G_MWO_bLIGHT_7		gI_(0xC4)
 | 
						|
# define G_MWO_aLIGHT_8		gI_(0xE0)
 | 
						|
# define G_MWO_bLIGHT_8		gI_(0xE4)
 | 
						|
#endif
 | 
						|
 | 
						|
/* moveword offsets for f3dex2 */
 | 
						|
#if defined(F3DEX_GBI_2)
 | 
						|
# define G_MWO_aLIGHT_2		gI_(0x18)
 | 
						|
# define G_MWO_bLIGHT_2		gI_(0x1C)
 | 
						|
# define G_MWO_aLIGHT_3		gI_(0x30)
 | 
						|
# define G_MWO_bLIGHT_3		gI_(0x34)
 | 
						|
# define G_MWO_aLIGHT_4		gI_(0x48)
 | 
						|
# define G_MWO_bLIGHT_4		gI_(0x4C)
 | 
						|
# define G_MWO_aLIGHT_5		gI_(0x60)
 | 
						|
# define G_MWO_bLIGHT_5		gI_(0x64)
 | 
						|
# define G_MWO_aLIGHT_6		gI_(0x78)
 | 
						|
# define G_MWO_bLIGHT_6		gI_(0x7C)
 | 
						|
# define G_MWO_aLIGHT_7		gI_(0x90)
 | 
						|
# define G_MWO_bLIGHT_7		gI_(0x94)
 | 
						|
# define G_MWO_aLIGHT_8		gI_(0xA8)
 | 
						|
# define G_MWO_bLIGHT_8		gI_(0xAC)
 | 
						|
#endif
 | 
						|
 | 
						|
/* movemem params for fast3d and f3dex */
 | 
						|
#if defined(F3D_GBI) || defined(F3DEX_GBI)
 | 
						|
# define G_MV_VIEWPORT		128
 | 
						|
# define G_MV_LOOKATY		130
 | 
						|
# define G_MV_LOOKATX		132
 | 
						|
# define G_MV_L0		134
 | 
						|
# define G_MV_L1		136
 | 
						|
# define G_MV_L2		138
 | 
						|
# define G_MV_L3		140
 | 
						|
# define G_MV_L4		142
 | 
						|
# define G_MV_L5		144
 | 
						|
# define G_MV_L6		146
 | 
						|
# define G_MV_L7		148
 | 
						|
# define G_MV_TXTATT		150
 | 
						|
# define G_MV_MATRIX_2		152
 | 
						|
# define G_MV_MATRIX_3		154
 | 
						|
# define G_MV_MATRIX_4		156
 | 
						|
# define G_MV_MATRIX_1		158
 | 
						|
#endif
 | 
						|
 | 
						|
/* movemem params for f3dex2 */
 | 
						|
#if defined(F3DEX_GBI_2)
 | 
						|
# define G_MV_MMTX		2
 | 
						|
# define G_MV_PMTX		6
 | 
						|
# define G_MV_VIEWPORT		8
 | 
						|
# define G_MV_LIGHT		10
 | 
						|
# define G_MV_POINT		12
 | 
						|
# define G_MV_MATRIX		14
 | 
						|
# define G_MVO_LOOKATX		gI_(0 * 0x18)
 | 
						|
# define G_MVO_LOOKATY		gI_(1 * 0x18)
 | 
						|
# define G_MVO_L0		gI_(2 * 0x18)
 | 
						|
# define G_MVO_L1		gI_(3 * 0x18)
 | 
						|
# define G_MVO_L2		gI_(4 * 0x18)
 | 
						|
# define G_MVO_L3		gI_(5 * 0x18)
 | 
						|
# define G_MVO_L4		gI_(6 * 0x18)
 | 
						|
# define G_MVO_L5		gI_(7 * 0x18)
 | 
						|
# define G_MVO_L6		gI_(8 * 0x18)
 | 
						|
# define G_MVO_L7		gI_(9 * 0x18)
 | 
						|
#endif
 | 
						|
 | 
						|
/* frustum ratios */
 | 
						|
#define FRUSTRATIO_1		gI_(1)
 | 
						|
#define FRUSTRATIO_2		gI_(2)
 | 
						|
#define FRUSTRATIO_3		gI_(3)
 | 
						|
#define FRUSTRATIO_4		gI_(4)
 | 
						|
#define FRUSTRATIO_5		gI_(5)
 | 
						|
#define FRUSTRATIO_6		gI_(6)
 | 
						|
 | 
						|
/* light params */
 | 
						|
#define NUMLIGHTS_0		1
 | 
						|
#define NUMLIGHTS_1		1
 | 
						|
#define NUMLIGHTS_2		2
 | 
						|
#define NUMLIGHTS_3		3
 | 
						|
#define NUMLIGHTS_4		4
 | 
						|
#define NUMLIGHTS_5		5
 | 
						|
#define NUMLIGHTS_6		6
 | 
						|
#define NUMLIGHTS_7		7
 | 
						|
#define LIGHT_1			1
 | 
						|
#define LIGHT_2			2
 | 
						|
#define LIGHT_3			3
 | 
						|
#define LIGHT_4			4
 | 
						|
#define LIGHT_5			5
 | 
						|
#define LIGHT_6			6
 | 
						|
#define LIGHT_7			7
 | 
						|
#define LIGHT_8			8
 | 
						|
 | 
						|
/* light params for fast3d and f3dex */
 | 
						|
#if defined(F3D_GBI) || defined(F3DEX_GBI)
 | 
						|
# define NUML(n)		(((n) + 1) * 32 + 0x80000000)
 | 
						|
#endif
 | 
						|
 | 
						|
/* light params for f3dex2 */
 | 
						|
#if defined(F3DEX_GBI_2)
 | 
						|
# define NUML(n)		((n) * 0x18)
 | 
						|
#endif
 | 
						|
 | 
						|
/* background load types */
 | 
						|
#define G_BGLT_LOADBLOCK	gI_(0x0033)
 | 
						|
#define G_BGLT_LOADTILE		gI_(0xFFF4)
 | 
						|
 | 
						|
/* background flags */
 | 
						|
#define G_BG_FLAG_FLIPS		(gI_(0b1) << 0)
 | 
						|
#define G_BG_FLAG_FLIPT		(gI_(0b1) << 1)
 | 
						|
 | 
						|
/* object load types */
 | 
						|
#define G_OBJLT_TXTRBLOCK	gI_(0x00001033)
 | 
						|
#define G_OBJLT_TXTRTILE	gI_(0x00FC1034)
 | 
						|
#define G_OBJLT_TLUT		gI_(0x00000030)
 | 
						|
 | 
						|
/* object flags */
 | 
						|
#define G_OBJ_FLAG_FLIPS	(gI_(0b1) << 0)
 | 
						|
#define G_OBJ_FLAG_FLIPT	(gI_(0b1) << 4)
 | 
						|
 | 
						|
/* color macros */
 | 
						|
#define G_MAXZ			0x03FF
 | 
						|
#define G_MAXFBZ		0x3FFF
 | 
						|
#define GPACK_RGBA5551(r, g, b, a) \
 | 
						|
	( \
 | 
						|
		gF_(r, 5, 11) | \
 | 
						|
		gF_(g, 5, 6) | \
 | 
						|
		gF_(b, 5, 1) | \
 | 
						|
		gF_(a, 1, 0) \
 | 
						|
	)
 | 
						|
#define GPACK_RGBA8888(r, g, b, a) \
 | 
						|
	( \
 | 
						|
		gF_(r, 8, 24) | \
 | 
						|
		gF_(g, 8, 16) | \
 | 
						|
		gF_(b, 8, 8) | \
 | 
						|
		gF_(a, 8, 0) \
 | 
						|
	)
 | 
						|
#define GPACK_RGB24A8(rgb, a)	(gF_(rgb, 24, 8) | gF_(a, 8, 0))
 | 
						|
#define GPACK_ZDZ(z, dz)	(gF_(z, 14, 2) | gF_(dz, 2, 0))
 | 
						|
 | 
						|
/* structure definition macros */
 | 
						|
#define gdSPDefMtx(xx, xy, xz, xw, \
 | 
						|
		yx, yy, yz, yw, \
 | 
						|
		zx, zy, zz, zw, \
 | 
						|
		wx, wy, wz, ww) \
 | 
						|
	( \
 | 
						|
		(Mtx) \
 | 
						|
		{ \
 | 
						|
			.i = \
 | 
						|
			{ \
 | 
						|
				(qs1616(xx) >> 16) & 0xFFFF, \
 | 
						|
				(qs1616(xy) >> 16) & 0xFFFF, \
 | 
						|
				(qs1616(xz) >> 16) & 0xFFFF, \
 | 
						|
				(qs1616(xw) >> 16) & 0xFFFF, \
 | 
						|
				(qs1616(yx) >> 16) & 0xFFFF, \
 | 
						|
				(qs1616(yy) >> 16) & 0xFFFF, \
 | 
						|
				(qs1616(yz) >> 16) & 0xFFFF, \
 | 
						|
				(qs1616(yw) >> 16) & 0xFFFF, \
 | 
						|
				(qs1616(zx) >> 16) & 0xFFFF, \
 | 
						|
				(qs1616(zy) >> 16) & 0xFFFF, \
 | 
						|
				(qs1616(zz) >> 16) & 0xFFFF, \
 | 
						|
				(qs1616(zw) >> 16) & 0xFFFF, \
 | 
						|
				(qs1616(wx) >> 16) & 0xFFFF, \
 | 
						|
				(qs1616(wy) >> 16) & 0xFFFF, \
 | 
						|
				(qs1616(wz) >> 16) & 0xFFFF, \
 | 
						|
				(qs1616(ww) >> 16) & 0xFFFF, \
 | 
						|
			}, \
 | 
						|
			.f = \
 | 
						|
			{ \
 | 
						|
				qs1616(xx) & 0xFFFF, \
 | 
						|
				qs1616(xy) & 0xFFFF, \
 | 
						|
				qs1616(xz) & 0xFFFF, \
 | 
						|
				qs1616(xw) & 0xFFFF, \
 | 
						|
				qs1616(yx) & 0xFFFF, \
 | 
						|
				qs1616(yy) & 0xFFFF, \
 | 
						|
				qs1616(yz) & 0xFFFF, \
 | 
						|
				qs1616(yw) & 0xFFFF, \
 | 
						|
				qs1616(zx) & 0xFFFF, \
 | 
						|
				qs1616(zy) & 0xFFFF, \
 | 
						|
				qs1616(zz) & 0xFFFF, \
 | 
						|
				qs1616(zw) & 0xFFFF, \
 | 
						|
				qs1616(wx) & 0xFFFF, \
 | 
						|
				qs1616(wy) & 0xFFFF, \
 | 
						|
				qs1616(wz) & 0xFFFF, \
 | 
						|
				qs1616(ww) & 0xFFFF, \
 | 
						|
			} \
 | 
						|
		} \
 | 
						|
	)
 | 
						|
#define gdSPDefLookAt(rx, ry, rz, ux, uy, uz) \
 | 
						|
	( \
 | 
						|
		(LookAt) \
 | 
						|
		{ \
 | 
						|
			.l[0].l = \
 | 
						|
			{ \
 | 
						|
				.col = {0, 0, 0}, \
 | 
						|
				.colc = {0, 0, 0}, \
 | 
						|
				.dir = {rx, ry, rz}, \
 | 
						|
			}, \
 | 
						|
			.l[1].l = \
 | 
						|
			{ \
 | 
						|
				.col = {0, 0x80, 0}, \
 | 
						|
				.colc = {0, 0x80, 0}, \
 | 
						|
				.dir = {ux, uy, uz}, \
 | 
						|
			}, \
 | 
						|
		} \
 | 
						|
	)
 | 
						|
#define gdSPDefLights0(ar, ag, ab) \
 | 
						|
	( \
 | 
						|
		(Lights0) \
 | 
						|
		{ \
 | 
						|
			.a.l = \
 | 
						|
			{ \
 | 
						|
				.col = {ar, ag, ab}, \
 | 
						|
				.colc = {ar, ag, ab}, \
 | 
						|
			}, \
 | 
						|
			.l[0].l = \
 | 
						|
			{ \
 | 
						|
			} \
 | 
						|
		} \
 | 
						|
	)
 | 
						|
#define gdSPDefLights1(ar, ag, ab, \
 | 
						|
		r1, g1, b1, x1, y1, z1) \
 | 
						|
	( \
 | 
						|
		(Lights1) \
 | 
						|
		{ \
 | 
						|
			.a.l = \
 | 
						|
			{ \
 | 
						|
				.col = {ar, ag, ab}, \
 | 
						|
				.colc = {ar, ag, ab}, \
 | 
						|
			}, \
 | 
						|
			.l[0].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r1, g1, b1}, \
 | 
						|
				.colc = {r1, g1, b1}, \
 | 
						|
				.dir = {x1, y1, z1}, \
 | 
						|
			} \
 | 
						|
		} \
 | 
						|
	)
 | 
						|
#define gdSPDefLights2(ar, ag, ab, \
 | 
						|
		r1, g1, b1, x1, y1, z1, \
 | 
						|
		r2, g2, b2, x2, y2, z2) \
 | 
						|
	( \
 | 
						|
		(Lights2) \
 | 
						|
		{ \
 | 
						|
			.a.l = \
 | 
						|
			{ \
 | 
						|
				.col = {ar, ag, ab}, \
 | 
						|
				.colc = {ar, ag, ab}, \
 | 
						|
			}, \
 | 
						|
			.l[0].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r1, g1, b1}, \
 | 
						|
				.colc = {r1, g1, b1}, \
 | 
						|
				.dir = {x1, y1, z1}, \
 | 
						|
			} \
 | 
						|
			.l[1].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r2, g2, b2}, \
 | 
						|
				.colc = {r2, g2, b2}, \
 | 
						|
				.dir = {x2, y2, z2}, \
 | 
						|
			} \
 | 
						|
		} \
 | 
						|
	)
 | 
						|
#define gdSPDefLights3(ar, ag, ab, \
 | 
						|
		r1, g1, b1, x1, y1, z1, \
 | 
						|
		r2, g2, b2, x2, y2, z2, \
 | 
						|
		r3, g3, b3, x3, y3, z3) \
 | 
						|
	( \
 | 
						|
		(Lights3) \
 | 
						|
		{ \
 | 
						|
			.a.l = \
 | 
						|
			{ \
 | 
						|
				.col = {ar, ag, ab}, \
 | 
						|
				.colc = {ar, ag, ab}, \
 | 
						|
			}, \
 | 
						|
			.l[0].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r1, g1, b1}, \
 | 
						|
				.colc = {r1, g1, b1}, \
 | 
						|
				.dir = {x1, y1, z1}, \
 | 
						|
			} \
 | 
						|
			.l[1].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r2, g2, b2}, \
 | 
						|
				.colc = {r2, g2, b2}, \
 | 
						|
				.dir = {x2, y2, z2}, \
 | 
						|
			} \
 | 
						|
			.l[2].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r3, g3, b3}, \
 | 
						|
				.colc = {r3, g3, b3}, \
 | 
						|
				.dir = {x3, y3, z3}, \
 | 
						|
			} \
 | 
						|
		} \
 | 
						|
	)
 | 
						|
#define gdSPDefLights4(ar, ag, ab, \
 | 
						|
		r1, g1, b1, x1, y1, z1, \
 | 
						|
		r2, g2, b2, x2, y2, z2, \
 | 
						|
		r3, g3, b3, x3, y3, z3, \
 | 
						|
		r4, g4, b4, x4, y4, z4) \
 | 
						|
	( \
 | 
						|
		(Lights4) \
 | 
						|
		{ \
 | 
						|
			.a.l = \
 | 
						|
			{ \
 | 
						|
				.col = {ar, ag, ab}, \
 | 
						|
				.colc = {ar, ag, ab}, \
 | 
						|
			}, \
 | 
						|
			.l[0].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r1, g1, b1}, \
 | 
						|
				.colc = {r1, g1, b1}, \
 | 
						|
				.dir = {x1, y1, z1}, \
 | 
						|
			} \
 | 
						|
			.l[1].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r2, g2, b2}, \
 | 
						|
				.colc = {r2, g2, b2}, \
 | 
						|
				.dir = {x2, y2, z2}, \
 | 
						|
			} \
 | 
						|
			.l[2].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r3, g3, b3}, \
 | 
						|
				.colc = {r3, g3, b3}, \
 | 
						|
				.dir = {x3, y3, z3}, \
 | 
						|
			} \
 | 
						|
			.l[3].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r4, g4, b4}, \
 | 
						|
				.colc = {r4, g4, b4}, \
 | 
						|
				.dir = {x4, y4, z4}, \
 | 
						|
			} \
 | 
						|
		} \
 | 
						|
	)
 | 
						|
#define gdSPDefLights5(ar, ag, ab, \
 | 
						|
		r1, g1, b1, x1, y1, z1, \
 | 
						|
		r2, g2, b2, x2, y2, z2, \
 | 
						|
		r3, g3, b3, x3, y3, z3, \
 | 
						|
		r4, g4, b4, x4, y4, z4, \
 | 
						|
		r5, g5, b5, x5, y5, z5) \
 | 
						|
	( \
 | 
						|
		(Lights5) \
 | 
						|
		{ \
 | 
						|
			.a.l = \
 | 
						|
			{ \
 | 
						|
				.col = {ar, ag, ab}, \
 | 
						|
				.colc = {ar, ag, ab}, \
 | 
						|
			}, \
 | 
						|
			.l[0].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r1, g1, b1}, \
 | 
						|
				.colc = {r1, g1, b1}, \
 | 
						|
				.dir = {x1, y1, z1}, \
 | 
						|
			} \
 | 
						|
			.l[1].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r2, g2, b2}, \
 | 
						|
				.colc = {r2, g2, b2}, \
 | 
						|
				.dir = {x2, y2, z2}, \
 | 
						|
			} \
 | 
						|
			.l[2].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r3, g3, b3}, \
 | 
						|
				.colc = {r3, g3, b3}, \
 | 
						|
				.dir = {x3, y3, z3}, \
 | 
						|
			} \
 | 
						|
			.l[3].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r4, g4, b4}, \
 | 
						|
				.colc = {r4, g4, b4}, \
 | 
						|
				.dir = {x4, y4, z4}, \
 | 
						|
			} \
 | 
						|
			.l[4].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r5, g5, b5}, \
 | 
						|
				.colc = {r5, g5, b5}, \
 | 
						|
				.dir = {x5, y5, z5}, \
 | 
						|
			} \
 | 
						|
		} \
 | 
						|
	)
 | 
						|
#define gdSPDefLights6(ar, ag, ab, \
 | 
						|
		r1, g1, b1, x1, y1, z1, \
 | 
						|
		r2, g2, b2, x2, y2, z2, \
 | 
						|
		r3, g3, b3, x3, y3, z3, \
 | 
						|
		r4, g4, b4, x4, y4, z4, \
 | 
						|
		r5, g5, b5, x5, y5, z5, \
 | 
						|
		r6, g6, b6, x6, y6, z6)\
 | 
						|
	( \
 | 
						|
		(Lights6) \
 | 
						|
		{ \
 | 
						|
			.a.l = \
 | 
						|
			{ \
 | 
						|
				.col = {ar, ag, ab}, \
 | 
						|
				.colc = {ar, ag, ab}, \
 | 
						|
			}, \
 | 
						|
			.l[0].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r1, g1, b1}, \
 | 
						|
				.colc = {r1, g1, b1}, \
 | 
						|
				.dir = {x1, y1, z1}, \
 | 
						|
			} \
 | 
						|
			.l[1].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r2, g2, b2}, \
 | 
						|
				.colc = {r2, g2, b2}, \
 | 
						|
				.dir = {x2, y2, z2}, \
 | 
						|
			} \
 | 
						|
			.l[2].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r3, g3, b3}, \
 | 
						|
				.colc = {r3, g3, b3}, \
 | 
						|
				.dir = {x3, y3, z3}, \
 | 
						|
			} \
 | 
						|
			.l[3].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r4, g4, b4}, \
 | 
						|
				.colc = {r4, g4, b4}, \
 | 
						|
				.dir = {x4, y4, z4}, \
 | 
						|
			} \
 | 
						|
			.l[4].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r5, g5, b5}, \
 | 
						|
				.colc = {r5, g5, b5}, \
 | 
						|
				.dir = {x5, y5, z5}, \
 | 
						|
			} \
 | 
						|
			.l[5].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r6, g6, b6}, \
 | 
						|
				.colc = {r6, g6, b6}, \
 | 
						|
				.dir = {x6, y6, z6}, \
 | 
						|
			} \
 | 
						|
		} \
 | 
						|
	)
 | 
						|
#define gdSPDefLights7(ar, ag, ab, \
 | 
						|
		r1, g1, b1, x1, y1, z1, \
 | 
						|
		r2, g2, b2, x2, y2, z2, \
 | 
						|
		r3, g3, b3, x3, y3, z3, \
 | 
						|
		r4, g4, b4, x4, y4, z4, \
 | 
						|
		r5, g5, b5, x5, y5, z5, \
 | 
						|
		r6, g6, b6, x6, y6, z6, \
 | 
						|
		r7, g7, b7, x7, y7, z7) \
 | 
						|
	( \
 | 
						|
		(Lights7) \
 | 
						|
		{ \
 | 
						|
			.a.l = \
 | 
						|
			{ \
 | 
						|
				.col = {ar, ag, ab}, \
 | 
						|
				.colc = {ar, ag, ab}, \
 | 
						|
			}, \
 | 
						|
			.l[0].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r1, g1, b1}, \
 | 
						|
				.colc = {r1, g1, b1}, \
 | 
						|
				.dir = {x1, y1, z1}, \
 | 
						|
			} \
 | 
						|
			.l[1].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r2, g2, b2}, \
 | 
						|
				.colc = {r2, g2, b2}, \
 | 
						|
				.dir = {x2, y2, z2}, \
 | 
						|
			} \
 | 
						|
			.l[2].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r3, g3, b3}, \
 | 
						|
				.colc = {r3, g3, b3}, \
 | 
						|
				.dir = {x3, y3, z3}, \
 | 
						|
			} \
 | 
						|
			.l[3].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r4, g4, b4}, \
 | 
						|
				.colc = {r4, g4, b4}, \
 | 
						|
				.dir = {x4, y4, z4}, \
 | 
						|
			} \
 | 
						|
			.l[4].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r5, g5, b5}, \
 | 
						|
				.colc = {r5, g5, b5}, \
 | 
						|
				.dir = {x5, y5, z5}, \
 | 
						|
			} \
 | 
						|
			.l[5].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r6, g6, b6}, \
 | 
						|
				.colc = {r6, g6, b6}, \
 | 
						|
				.dir = {x6, y6, z6}, \
 | 
						|
			} \
 | 
						|
			.l[6].l = \
 | 
						|
			{ \
 | 
						|
				.col = {r7, g7, b7}, \
 | 
						|
				.colc = {r7, g7, b7}, \
 | 
						|
				.dir = {x7, y7, z7}, \
 | 
						|
			} \
 | 
						|
		} \
 | 
						|
	)
 | 
						|
#define gdSPDefVtx(x, y, z, s, t) \
 | 
						|
	( \
 | 
						|
		(Vtx) \
 | 
						|
		{ \
 | 
						|
			.v = \
 | 
						|
			{ \
 | 
						|
				.ob = {x, y, z}, \
 | 
						|
				.tc = {qs105(s), qs105(t)}, \
 | 
						|
			} \
 | 
						|
		} \
 | 
						|
	)
 | 
						|
#define gdSPDefVtxC(x, y, z, s, t, cr, cg, cb, ca) \
 | 
						|
	( \
 | 
						|
		(Vtx) \
 | 
						|
		{ \
 | 
						|
			.v = \
 | 
						|
			{ \
 | 
						|
				.ob = {x, y, z}, \
 | 
						|
				.tc = {qs105(s), qs105(t)}, \
 | 
						|
				.cn = {cr, cg, cb, ca}, \
 | 
						|
			} \
 | 
						|
		} \
 | 
						|
	)
 | 
						|
#define gdSPDefVtxN(x, y, z, s, t, nx, ny, nz, ca) \
 | 
						|
	( \
 | 
						|
		(Vtx) \
 | 
						|
		{ \
 | 
						|
			.n = \
 | 
						|
			{ \
 | 
						|
				.ob = {x, y, z}, \
 | 
						|
				.tc = {qs105(s), qs105(t)}, \
 | 
						|
				.n = {nx, ny, nz}, \
 | 
						|
				.a = ca \
 | 
						|
			} \
 | 
						|
		} \
 | 
						|
	)
 | 
						|
 | 
						|
/* instruction macros */
 | 
						|
 | 
						|
#define gsDPFillRectangle(ulx, uly, lrx, lry) \
 | 
						|
	gO_( \
 | 
						|
		G_FILLRECT, \
 | 
						|
		gF_(lrx, 10, 14) | \
 | 
						|
		gF_(lry, 10, 2), \
 | 
						|
		gF_(ulx, 10, 14) | \
 | 
						|
		gF_(uly, 10, 2))
 | 
						|
 | 
						|
#define gsDPScisFillRectangle(ulx, uly, lrx, lry) \
 | 
						|
	gsDPFillRectangle(gScC_(ulx), gScC_(uly), gScC_(lrx), gScC_(lry))
 | 
						|
 | 
						|
#define gsDPFullSync() \
 | 
						|
	gO_(G_RDPFULLSYNC, 0, 0)
 | 
						|
 | 
						|
#define gsDPLoadSync() \
 | 
						|
	gO_(G_RDPLOADSYNC, 0, 0)
 | 
						|
 | 
						|
#define gsDPTileSync() \
 | 
						|
	gO_(G_RDPTILESYNC, 0, 0)
 | 
						|
 | 
						|
#define gsDPPipeSync() \
 | 
						|
	gO_(G_RDPPIPESYNC, 0, 0)
 | 
						|
 | 
						|
#define gsDPLoadTLUT_pal16(pal, dram) \
 | 
						|
	gsDPLoadTLUT(16, 256 + (gI_(pal) & 0xF) * 16, dram)
 | 
						|
 | 
						|
#define gsDPLoadTLUT_pal256(dram) \
 | 
						|
	gsDPLoadTLUT(256, 256, dram)
 | 
						|
 | 
						|
#define gLTB_(timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		dxt, tmem, rt, line) \
 | 
						|
	gsDPSetTextureImage(fmt, G_SIZ_LDSIZ(siz), 1, timg), \
 | 
						|
	gsDPSetTile( \
 | 
						|
		fmt, G_SIZ_LDSIZ(siz), 0, tmem, G_TX_LOADTILE, 0, \
 | 
						|
		cmt, maskt, shiftt, \
 | 
						|
		cms, masks, shifts), \
 | 
						|
	gsDPLoadSync(), \
 | 
						|
	gsDPLoadBlock( \
 | 
						|
		G_TX_LOADTILE, 0, 0, \
 | 
						|
		G_LTB_LRS(width, height, siz), \
 | 
						|
		dxt), \
 | 
						|
	gsDPPipeSync(), \
 | 
						|
	gsDPSetTile( \
 | 
						|
		fmt, siz, line, tmem, rt, pal, \
 | 
						|
		cmt, maskt, shiftt, \
 | 
						|
		cms, masks, shifts), \
 | 
						|
	gsDPSetTileSize(rt, 0, 0, qu102((width) - 1), qu102((height) - 1))
 | 
						|
 | 
						|
#define gsDPLoadTextureBlock(timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		G_DXT(siz, width), 0x0, G_TX_RENDERTILE, \
 | 
						|
		((width) * G_SIZ_LDBITS(siz) + 63) / 64)
 | 
						|
 | 
						|
#define gsDPLoadTextureBlockS(timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		0, 0x0, G_TX_RENDERTILE, \
 | 
						|
		((width) * G_SIZ_LDBITS(siz) + 63) / 64)
 | 
						|
 | 
						|
#define gsDPLoadTextureBlock_4b(timg, fmt, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, G_IM_SIZ_4b, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		G_DXT(G_IM_SIZ_4b, width), 0x0, G_TX_RENDERTILE, \
 | 
						|
		((width) * 4 + 63) / 64)
 | 
						|
 | 
						|
#define gsDPLoadTextureBlock_4bS(timg, fmt, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, G_IM_SIZ_4b, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		0, 0x0, G_TX_RENDERTILE, \
 | 
						|
		((width) * 4 + 63) / 64)
 | 
						|
 | 
						|
#define gsDPLoadTextureBlockYuv(timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		G_DXT(siz, width), 0x0, G_TX_RENDERTILE, \
 | 
						|
		((width) + 7) / 8)
 | 
						|
 | 
						|
#define gsDPLoadTextureBlockYuvS(timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		0, 0x0, G_TX_RENDERTILE, \
 | 
						|
		((width) + 7) / 8)
 | 
						|
 | 
						|
#define _gsDPLoadTextureBlock(timg, tmem, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		G_DXT(siz, width), tmem, G_TX_RENDERTILE, \
 | 
						|
		((width) * G_SIZ_LDBITS(siz) + 63) / 64)
 | 
						|
 | 
						|
#define _gsDPLoadTextureBlockS(timg, tmem, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		0, tmem, G_TX_RENDERTILE, \
 | 
						|
		((width) * G_SIZ_LDBITS(siz) + 63) / 64)
 | 
						|
 | 
						|
#define _gsDPLoadTextureBlock_4b(timg, tmem, fmt, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, G_IM_SIZ_4b, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		G_DXT(G_IM_SIZ_4b, width), tmem, G_TX_RENDERTILE, \
 | 
						|
		((width) * 4 + 63) / 64)
 | 
						|
 | 
						|
#define _gsDPLoadTextureBlock_4bS(timg, tmem, fmt, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, G_IM_SIZ_4b, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		0, tmem, G_TX_RENDERTILE, \
 | 
						|
		((width) * 4 + 63) / 64)
 | 
						|
 | 
						|
#define _gsDPLoadTextureBlockYuv(timg, tmem, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		G_DXT(siz, width), tmem, G_TX_RENDERTILE, \
 | 
						|
		((width) + 7) / 8)
 | 
						|
 | 
						|
#define _gsDPLoadTextureBlockYuvS(timg, tmem, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		0, tmem, G_TX_RENDERTILE, \
 | 
						|
		((width) + 7) / 8)
 | 
						|
 | 
						|
#define gsDPLoadMultiBlock(timg, tmem, rt, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		G_DXT(siz, width), tmem, rt, \
 | 
						|
		((width) * G_SIZ_LDBITS(siz) + 63) / 64)
 | 
						|
 | 
						|
#define gsDPLoadMultiBlockS(timg, tmem, rt, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		0, tmem, rt, \
 | 
						|
		((width) * G_SIZ_LDBITS(siz) + 63) / 64)
 | 
						|
 | 
						|
#define gsDPLoadMultiBlock_4b(timg, tmem, rt, fmt, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, G_IM_SIZ_4b, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		G_DXT(G_IM_SIZ_4b, width), tmem, rt, \
 | 
						|
		((width) * 4 + 63) / 64)
 | 
						|
 | 
						|
#define gsDPLoadMultiBlock_4bS(timg, tmem, rt, fmt, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, G_IM_SIZ_4b, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		0, tmem, rt, \
 | 
						|
		((width) * 4 + 63) / 64)
 | 
						|
 | 
						|
#define gsDPLoadMultiBlockYuv(timg, tmem, rt, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		G_DXT(siz, width), tmem, rt, \
 | 
						|
		((width) + 7) / 8)
 | 
						|
 | 
						|
#define gsDPLoadMultiBlockYuvS(timg, tmem, rt, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTB_( \
 | 
						|
		timg, fmt, siz, width, height, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		0, tmem, rt, \
 | 
						|
		((width) + 7) / 8)
 | 
						|
 | 
						|
#define gLTT_(timg, fmt, siz, width, height, uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		tmem, rt, line) \
 | 
						|
	gsDPSetTextureImage(fmt, siz, width, timg), \
 | 
						|
	gsDPSetTile( \
 | 
						|
		fmt, siz, line, tmem, \
 | 
						|
		G_TX_LOADTILE, 0, \
 | 
						|
		cmt, maskt, shiftt, \
 | 
						|
		cms, masks, shifts), \
 | 
						|
	gsDPLoadSync(), \
 | 
						|
	gsDPLoadTile( \
 | 
						|
		G_TX_LOADTILE, \
 | 
						|
		qu102(uls), qu102(ult), \
 | 
						|
		qu102(lrs), qu102(lrt)), \
 | 
						|
	gsDPPipeSync(), \
 | 
						|
	gsDPSetTile( \
 | 
						|
		fmt, siz, line, \
 | 
						|
		tmem, rt, pal, \
 | 
						|
		cmt, maskt, shiftt, \
 | 
						|
		cms, masks, shifts), \
 | 
						|
	gsDPSetTileSize( \
 | 
						|
		rt, \
 | 
						|
		qu102(uls), qu102(ult), \
 | 
						|
		qu102(lrs), qu102(lrt))
 | 
						|
 | 
						|
#define gLTT4_(timg, fmt, width, height, uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		tmem, rt) \
 | 
						|
	gsDPSetTextureImage(fmt, G_IM_SIZ_8b, (width) / 2, timg), \
 | 
						|
	gsDPSetTile( \
 | 
						|
		fmt, G_IM_SIZ_8b, \
 | 
						|
		(((lrs) - (uls) + 1) / 2 + 7) / 8, \
 | 
						|
		tmem, G_TX_LOADTILE, 0, \
 | 
						|
		cmt, maskt, shiftt, \
 | 
						|
		cms, masks, shifts), \
 | 
						|
	gsDPLoadSync(), \
 | 
						|
	gsDPLoadTile( \
 | 
						|
		G_TX_LOADTILE, \
 | 
						|
		qu102(uls) / 2, qu102(ult), \
 | 
						|
		qu102(lrs) / 2, qu102(lrt)), \
 | 
						|
	gsDPPipeSync(), \
 | 
						|
	gsDPSetTile( \
 | 
						|
		fmt, G_IM_SIZ_4b, \
 | 
						|
		(((lrs) - (uls) + 1) / 2 + 7) / 8, \
 | 
						|
		tmem, rt, pal, \
 | 
						|
		cmt, maskt, shiftt, \
 | 
						|
		cms, masks, shifts), \
 | 
						|
	gsDPSetTileSize( \
 | 
						|
		rt, \
 | 
						|
		qu102(uls), qu102(ult), \
 | 
						|
		qu102(lrs), qu102(lrt))
 | 
						|
 | 
						|
#define gsDPLoadTextureTile(timg, fmt, siz, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTT_( \
 | 
						|
		timg, fmt, siz, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		0x0, G_TX_RENDERTILE, \
 | 
						|
		(((lrs) - (uls) + 1) * G_SIZ_LDBITS(siz) + 63) / 64)
 | 
						|
 | 
						|
#define gsDPLoadTextureTile_4b(timg, fmt, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTT4_( \
 | 
						|
		timg, fmt, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		0x0, G_TX_RENDERTILE)
 | 
						|
 | 
						|
#define gsDPLoadTextureTileYuv(timg, fmt, siz, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTT_( \
 | 
						|
		timg, fmt, siz, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		0x0, G_TX_RENDERTILE, \
 | 
						|
		(((lrs) - (uls) + 1) + 7) / 8)
 | 
						|
 | 
						|
#define _gsDPLoadTextureTile(timg, tmem, fmt, siz, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTT_( \
 | 
						|
		timg, fmt, siz, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		tmem, G_TX_RENDERTILE, \
 | 
						|
		(((lrs) - (uls) + 1) * G_SIZ_LDBITS(siz) + 63) / 64)
 | 
						|
 | 
						|
#define _gsDPLoadTextureTile_4b(timg, tmem, fmt, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTT4_( \
 | 
						|
		timg, fmt, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		tmem, G_TX_RENDERTILE)
 | 
						|
 | 
						|
#define _gsDPLoadTextureTileYuv(timg, tmem, fmt, siz, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, cms, cmt, \
 | 
						|
		masks, maskt, shifts, shiftt) \
 | 
						|
	gLTT_( \
 | 
						|
		timg, fmt, siz, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		tmem, G_TX_RENDERTILE, \
 | 
						|
		(((lrs) - (uls) + 1) + 7) / 8)
 | 
						|
 | 
						|
#define gsDPLoadMultiTile(timg, tmem, rt, fmt, siz, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTT_( \
 | 
						|
		timg, fmt, siz, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		tmem, rt, \
 | 
						|
		(((lrs) - (uls) + 1) * G_SIZ_LDBITS(siz) + 63) / 64)
 | 
						|
 | 
						|
#define gsDPLoadMultiTile_4b(timg, tmem, rt, fmt, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTT4_( \
 | 
						|
		timg, fmt, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		tmem, rt)
 | 
						|
 | 
						|
#define gsDPLoadMultiTileYuv(timg, tmem, rt, fmt, siz, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt) \
 | 
						|
	gLTT_( \
 | 
						|
		timg, fmt, siz, width, height, \
 | 
						|
		uls, ult, lrs, lrt, pal, \
 | 
						|
		cms, cmt, masks, maskt, shifts, shiftt, \
 | 
						|
		tmem, rt, \
 | 
						|
		(((lrs) - (uls) + 1) + 7) / 8)
 | 
						|
 | 
						|
#define gsDPLoadBlock(tile, uls, ult, lrs, dxt) \
 | 
						|
	gO_( \
 | 
						|
		G_LOADBLOCK, \
 | 
						|
		gF_(uls, 12, 12) | \
 | 
						|
		gF_(ult, 12, 0), \
 | 
						|
		gF_(tile, 3, 24) | \
 | 
						|
		gF_(G_LDBLK_TXL(lrs), 12, 12) | \
 | 
						|
		gF_(dxt, 12, 0))
 | 
						|
 | 
						|
#define gsDPNoOp() \
 | 
						|
	gsDPNoOpTag(0)
 | 
						|
 | 
						|
#define gsDPNoOpTag(tag) \
 | 
						|
	gO_(G_NOOP, 0, tag)
 | 
						|
 | 
						|
#define gsDPPipelineMode(mode) \
 | 
						|
	gsSPSetOtherModeHi(G_MDSFT_PIPELINE, G_MDSIZ_PIPELINE, mode)
 | 
						|
 | 
						|
#define gsDPSetBlendColor(r, g, b, a) \
 | 
						|
	gO_( \
 | 
						|
		G_SETBLENDCOLOR, \
 | 
						|
		0, \
 | 
						|
		gF_(r, 8, 24) | \
 | 
						|
		gF_(g, 8, 16) | \
 | 
						|
		gF_(b, 8, 8) | \
 | 
						|
		gF_(a, 8, 0))
 | 
						|
 | 
						|
#define gsDPSetEnvColor(r, g, b, a) \
 | 
						|
	gO_( \
 | 
						|
		G_SETENVCOLOR, \
 | 
						|
		0, \
 | 
						|
		gF_(r, 8, 24) | \
 | 
						|
		gF_(g, 8, 16) | \
 | 
						|
		gF_(b, 8, 8) | \
 | 
						|
		gF_(a, 8, 0))
 | 
						|
 | 
						|
#define gsDPSetFillColor(c) \
 | 
						|
	gO_(G_SETFILLCOLOR, 0, c)
 | 
						|
 | 
						|
#define gsDPSetFogColor(r, g, b, a) \
 | 
						|
	gO_( \
 | 
						|
		G_SETFOGCOLOR, 0, \
 | 
						|
		gF_(r, 8, 24) | \
 | 
						|
		gF_(g, 8, 16) | \
 | 
						|
		gF_(b, 8, 8) | \
 | 
						|
		gF_(a, 8, 0))
 | 
						|
 | 
						|
#define gsDPSetPrimColor(m, l, r, g, b, a) \
 | 
						|
	gO_( \
 | 
						|
		G_SETPRIMCOLOR, \
 | 
						|
		gF_(m, 8, 8) | \
 | 
						|
		gF_(l, 8, 0), \
 | 
						|
		gF_(r, 8, 24) | \
 | 
						|
		gF_(g, 8, 16) | \
 | 
						|
		gF_(b, 8, 8) | \
 | 
						|
		gF_(a, 8, 0))
 | 
						|
 | 
						|
#define gsDPSetColorImage(fmt, siz, width, img) \
 | 
						|
	gO_( \
 | 
						|
		G_SETCIMG, \
 | 
						|
		gF_(fmt, 3, 21) | \
 | 
						|
		gF_(siz, 2, 19) | \
 | 
						|
		gF_((width) - 1, 12, 0), \
 | 
						|
		img)
 | 
						|
 | 
						|
#define gsDPSetDepthImage(img) \
 | 
						|
	gO_(G_SETZIMG, 0, img)
 | 
						|
 | 
						|
#define gsDPSetTextureImage(fmt, siz, width, img) \
 | 
						|
	gO_( \
 | 
						|
		G_SETTIMG, \
 | 
						|
		gF_(fmt, 3, 21) | \
 | 
						|
		gF_(siz, 2, 19) | \
 | 
						|
		gF_((width) - 1, 12, 0), \
 | 
						|
		img)
 | 
						|
 | 
						|
#define gsDPSetHilite1Tile(tile, hilite, width, height) \
 | 
						|
	gsDPSetTileSize( \
 | 
						|
		tile, \
 | 
						|
		((Hilite *)(hilite))->h.x1 & 0xFFF, \
 | 
						|
		((Hilite *)(hilite))->h.y1 & 0xFFF, \
 | 
						|
		(((width) - 1) * 4 + ((Hilite *)(hilite))->h.x1) & 0xFFF, \
 | 
						|
		(((height) - 1) * 4 + ((Hilite *)(hilite))->h.y1) & 0xFFF)
 | 
						|
 | 
						|
#define gsDPSetHilite2Tile(tile, hilite, width, height) \
 | 
						|
	gsDPSetTileSize( \
 | 
						|
		tile, \
 | 
						|
		((Hilite *)(hilite))->h.x2 & 0xFFF, \
 | 
						|
		((Hilite *)(hilite))->h.y2 & 0xFFF, \
 | 
						|
		(((width) - 1) * 4 + ((Hilite *)(hilite))->h.x2) & 0xFFF, \
 | 
						|
		(((height) - 1) * 4 + ((Hilite *)(hilite))->h.y2) & 0xFFF)
 | 
						|
 | 
						|
#define gsDPSetAlphaCompare(mode) \
 | 
						|
	gsSPSetOtherModeLo(G_MDSFT_ALPHACOMPARE, G_MDSIZ_ALPHACOMPARE, mode)
 | 
						|
 | 
						|
#define gsDPSetAlphaDither(type) \
 | 
						|
	gsSPSetOtherModeHi(G_MDSFT_ALPHADITHER, G_MDSIZ_ALPHADITHER, type)
 | 
						|
 | 
						|
#define gsDPSetColorDither(type) \
 | 
						|
	gsSPSetOtherModeHi(G_MDSFT_RGBDITHER, G_MDSIZ_RGBDITHER, type)
 | 
						|
 | 
						|
#define gsDPSetCombineMode(mode1, mode2) \
 | 
						|
	gsDPSetCombineLERP(mode1, mode2)
 | 
						|
 | 
						|
#define gsDPSetCombineLERP(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \
 | 
						|
		a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \
 | 
						|
	gO_( \
 | 
						|
		G_SETCOMBINE, \
 | 
						|
		gF_(G_CCMUX_##a0, 4, 20) | \
 | 
						|
		gF_(G_CCMUX_##c0, 5, 15) | \
 | 
						|
		gF_(G_ACMUX_##Aa0, 3, 12) | \
 | 
						|
		gF_(G_ACMUX_##Ac0, 3, 9) | \
 | 
						|
		gF_(G_CCMUX_##a1, 4, 5) | \
 | 
						|
		gF_(G_CCMUX_##c1, 5, 0), \
 | 
						|
		gF_(G_CCMUX_##b0, 4, 28) | \
 | 
						|
		gF_(G_CCMUX_##b1, 4, 24) | \
 | 
						|
		gF_(G_ACMUX_##Aa1, 3, 21) | \
 | 
						|
		gF_(G_ACMUX_##Ac1, 3, 18) | \
 | 
						|
		gF_(G_CCMUX_##d0, 3, 15) | \
 | 
						|
		gF_(G_ACMUX_##Ab0, 3, 12) | \
 | 
						|
		gF_(G_ACMUX_##Ad0, 3, 9) | \
 | 
						|
		gF_(G_CCMUX_##d1, 3, 6) | \
 | 
						|
		gF_(G_ACMUX_##Ab1, 3, 3) | \
 | 
						|
		gF_(G_ACMUX_##Ad1, 3, 0))
 | 
						|
 | 
						|
#define gsDPSetConvert(k0, k1, k2, k3, k4, k5) \
 | 
						|
	gO_( \
 | 
						|
		G_SETCONVERT, \
 | 
						|
		gF_(k0, 9, 13) | \
 | 
						|
		gF_(k1, 9, 4) | \
 | 
						|
		gF_(gI_(k2) >> 5, 4, 0), \
 | 
						|
		gF_(k2, 5, 27) | \
 | 
						|
		gF_(k3, 9, 18) | \
 | 
						|
		gF_(k4, 9, 9) | \
 | 
						|
		gF_(k5, 9, 0))
 | 
						|
 | 
						|
#define gsDPSetTextureConvert(type) \
 | 
						|
	gsSPSetOtherModeHi(G_MDSFT_TEXTCONV, G_MDSIZ_TEXTCONV, type)
 | 
						|
 | 
						|
#define gsDPSetCycleType(type) \
 | 
						|
	gsSPSetOtherModeHi(G_MDSFT_CYCLETYPE, G_MDSIZ_CYCLETYPE, type)
 | 
						|
 | 
						|
#define gsDPSetDepthSource(source) \
 | 
						|
	gsSPSetOtherModeLo(G_MDSFT_ZSRCSEL, G_MDSIZ_ZSRCSEL, source)
 | 
						|
 | 
						|
#define gsDPSetCombineKey(type) \
 | 
						|
	gsSPSetOtherModeHi(G_MDSFT_COMBKEY, G_MDSIZ_COMBKEY, type)
 | 
						|
 | 
						|
#define gsDPSetKeyGB(cG, sG, wG, cB, sB, wB) \
 | 
						|
	gO_( \
 | 
						|
		G_SETKEYGB, \
 | 
						|
		gF_(wG, 12, 12) | \
 | 
						|
		gF_(wB, 12, 0), \
 | 
						|
		gF_(cG, 8, 24) | \
 | 
						|
		gF_(sG, 8, 16) | \
 | 
						|
		gF_(cB, 8, 8) | \
 | 
						|
		gF_(sB, 8, 0))
 | 
						|
 | 
						|
#define gsDPSetKeyR(cR, sR, wR) \
 | 
						|
	gO_( \
 | 
						|
		G_SETKEYR, 0, \
 | 
						|
		gF_(wR, 12, 16) | \
 | 
						|
		gF_(cR, 8, 8) | \
 | 
						|
		gF_(sR, 8, 0))
 | 
						|
 | 
						|
#define gsDPSetPrimDepth(z, dz) \
 | 
						|
	gO_( \
 | 
						|
		G_SETPRIMDEPTH, \
 | 
						|
		0, \
 | 
						|
		gF_(z, 16, 16) | \
 | 
						|
		gF_(dz, 16, 0))
 | 
						|
 | 
						|
#define gsDPSetRenderMode(mode1, mode2) \
 | 
						|
	gsSPSetOtherModeLo( \
 | 
						|
		G_MDSFT_RENDERMODE, \
 | 
						|
		G_MDSIZ_RENDERMODE, \
 | 
						|
		gI_(mode1) | \
 | 
						|
		gI_(mode2))
 | 
						|
 | 
						|
#define gsDPSetScissor(mode, ulx, uly, lrx, lry) \
 | 
						|
	gsDPSetScissorFrac( \
 | 
						|
		mode, \
 | 
						|
		qu102(gI_(ulx)), \
 | 
						|
		qu102(gI_(uly)), \
 | 
						|
		qu102(gI_(lrx)), \
 | 
						|
		qu102(gI_(lry)))
 | 
						|
 | 
						|
#define gsDPSetScissorFrac(mode, ulx, uly, lrx, lry) \
 | 
						|
	gO_( \
 | 
						|
		G_SETSCISSOR, \
 | 
						|
		gF_(ulx, 12, 12) | \
 | 
						|
		gF_(uly, 12, 0), \
 | 
						|
		gF_(mode, 2, 24) | \
 | 
						|
		gF_(lrx, 12, 12) | \
 | 
						|
		gF_(lry, 12, 0))
 | 
						|
 | 
						|
#define gsDPSetTextureDetail(type) \
 | 
						|
	gsSPSetOtherModeHi(G_MDSFT_TEXTDETAIL, G_MDSIZ_TEXTDETAIL, type)
 | 
						|
 | 
						|
#define gsDPSetTextureFilter(mode) \
 | 
						|
	gsSPSetOtherModeHi(G_MDSFT_TEXTFILT, G_MDSIZ_TEXTFILT, mode)
 | 
						|
 | 
						|
#define gsDPSetTextureLOD(mode) \
 | 
						|
	gsSPSetOtherModeHi(G_MDSFT_TEXTLOD, G_MDSIZ_TEXTLOD, mode)
 | 
						|
 | 
						|
#define gsDPSetTextureLUT(mode) \
 | 
						|
	gsSPSetOtherModeHi(G_MDSFT_TEXTLUT, G_MDSIZ_TEXTLUT, mode)
 | 
						|
 | 
						|
#define gsDPSetTexturePersp(enable) \
 | 
						|
	gsSPSetOtherModeHi(G_MDSFT_TEXTPERSP, G_MDSIZ_TEXTPERSP, enable)
 | 
						|
 | 
						|
#define gsDPSetTile(fmt, siz, line, tmem, tile, palette, \
 | 
						|
		cmt, maskt, shiftt, cms, masks, shifts) \
 | 
						|
	gO_( \
 | 
						|
		G_SETTILE, \
 | 
						|
		gF_(fmt, 3, 21) | \
 | 
						|
		gF_(siz, 2, 19) | \
 | 
						|
		gF_(line, 9, 9) | \
 | 
						|
		gF_(tmem, 9, 0), \
 | 
						|
		gF_(tile, 3, 24) | \
 | 
						|
		gF_(palette, 4, 20) | \
 | 
						|
		gF_(cmt, 2, 18) | \
 | 
						|
		gF_(maskt, 4, 14) | \
 | 
						|
		gF_(shiftt, 4, 10) | \
 | 
						|
		gF_(cms, 2, 8) | \
 | 
						|
		gF_(masks, 4, 4) | \
 | 
						|
		gF_(shifts, 4, 0))
 | 
						|
 | 
						|
#define gsDPSetTileSize(tile, uls, ult, lrs, lrt) \
 | 
						|
	gO_( \
 | 
						|
		G_SETTILESIZE, \
 | 
						|
		gF_(uls, 12, 12) | \
 | 
						|
		gF_(ult, 12, 0), \
 | 
						|
		gF_(tile, 3, 24) | \
 | 
						|
		gF_(lrs, 12, 12) | \
 | 
						|
		gF_(lrt, 12, 0))
 | 
						|
 | 
						|
#define gsSPBranchList(dl) \
 | 
						|
	gsDisplayList(dl, 1)
 | 
						|
 | 
						|
#define gsSPClipRatio(r) \
 | 
						|
	gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNX, (uint16_t)(r)), \
 | 
						|
	gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNY, (uint16_t)(r)), \
 | 
						|
	gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPX, (uint16_t)-(r)), \
 | 
						|
	gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPY, (uint16_t)-(r))
 | 
						|
 | 
						|
#define gsSPDisplayList(dl) \
 | 
						|
	gsDisplayList(dl, 0)
 | 
						|
 | 
						|
#define gsSPEndDisplayList() \
 | 
						|
	gO_(G_ENDDL, 0, 0)
 | 
						|
 | 
						|
#define gsSPFogFactor(fm, fo) \
 | 
						|
	gsMoveWd( \
 | 
						|
		G_MW_FOG, \
 | 
						|
		G_MWO_FOG, \
 | 
						|
		gF_(fm, 16, 16) | \
 | 
						|
		gF_(fo, 16, 0))
 | 
						|
 | 
						|
#define gsSPFogPosition(min, max) \
 | 
						|
	gsSPFogFactor( \
 | 
						|
		(500 * 0x100) / ((max) - (min)), \
 | 
						|
		(500 - (min)) * 0x100 / ((max) - (min)))
 | 
						|
 | 
						|
#define gsSPLine3D(v0, v1, flag) \
 | 
						|
	gsSPLineW3D(v0, v1, 0, flag)
 | 
						|
 | 
						|
#define gsSPLookAt(l) \
 | 
						|
	gsSPLookAtX(l), \
 | 
						|
	gsSPLookAtY(gI_(l) + 0x10)
 | 
						|
 | 
						|
#define gsSPSegment(seg, base) \
 | 
						|
	gsMoveWd(G_MW_SEGMENT, (seg) * 4, base)
 | 
						|
 | 
						|
#define gsSPSetLights0(lites) \
 | 
						|
	gsSPNumLights(NUMLIGHTS_0), \
 | 
						|
	gsSPLight(&(lites).l[0], 1), \
 | 
						|
	gsSPLight(&(lites).a, 2)
 | 
						|
 | 
						|
#define gsSPSetLights1(lites) \
 | 
						|
	gsSPNumLights(NUMLIGHTS_1), \
 | 
						|
	gsSPLight(&(lites).l[0], 1), \
 | 
						|
	gsSPLight(&(lites).a, 2)
 | 
						|
 | 
						|
#define gsSPSetLights2(lites) \
 | 
						|
	gsSPNumLights(NUMLIGHTS_2), \
 | 
						|
	gsSPLight(&(lites).l[0], 1), \
 | 
						|
	gsSPLight(&(lites).l[1], 2), \
 | 
						|
	gsSPLight(&(lites).a, 3)
 | 
						|
 | 
						|
#define gsSPSetLights3(lites) \
 | 
						|
	gsSPNumLights(NUMLIGHTS_3), \
 | 
						|
	gsSPLight(&(lites).l[0], 1), \
 | 
						|
	gsSPLight(&(lites).l[1], 2), \
 | 
						|
	gsSPLight(&(lites).l[2], 3), \
 | 
						|
	gsSPLight(&(lites).a, 4)
 | 
						|
 | 
						|
#define gsSPSetLights4(lites) \
 | 
						|
	gsSPNumLights(NUMLIGHTS_4), \
 | 
						|
	gsSPLight(&(lites).l[0], 1), \
 | 
						|
	gsSPLight(&(lites).l[1], 2), \
 | 
						|
	gsSPLight(&(lites).l[2], 3), \
 | 
						|
	gsSPLight(&(lites).l[3], 4), \
 | 
						|
	gsSPLight(&(lites).a, 5)
 | 
						|
 | 
						|
#define gsSPSetLights5(lites) \
 | 
						|
	gsSPNumLights(NUMLIGHTS_5), \
 | 
						|
	gsSPLight(&(lites).l[0], 1), \
 | 
						|
	gsSPLight(&(lites).l[1], 2), \
 | 
						|
	gsSPLight(&(lites).l[2], 3), \
 | 
						|
	gsSPLight(&(lites).l[3], 4), \
 | 
						|
	gsSPLight(&(lites).l[4], 5), \
 | 
						|
	gsSPLight(&(lites).a, 6)
 | 
						|
 | 
						|
#define gsSPSetLights6(lites) \
 | 
						|
	gsSPNumLights(NUMLIGHTS_6), \
 | 
						|
	gsSPLight(&(lites).l[0], 1), \
 | 
						|
	gsSPLight(&(lites).l[1], 2), \
 | 
						|
	gsSPLight(&(lites).l[2], 3), \
 | 
						|
	gsSPLight(&(lites).l[3], 4), \
 | 
						|
	gsSPLight(&(lites).l[4], 5), \
 | 
						|
	gsSPLight(&(lites).l[5], 6), \
 | 
						|
	gsSPLight(&(lites).a, 7)
 | 
						|
 | 
						|
#define gsSPSetLights7(lites) \
 | 
						|
	gsSPNumLights(NUMLIGHTS_7), \
 | 
						|
	gsSPLight(&(lites).l[0], 1), \
 | 
						|
	gsSPLight(&(lites).l[1], 2), \
 | 
						|
	gsSPLight(&(lites).l[2], 3), \
 | 
						|
	gsSPLight(&(lites).l[3], 4), \
 | 
						|
	gsSPLight(&(lites).l[4], 5), \
 | 
						|
	gsSPLight(&(lites).l[5], 6), \
 | 
						|
	gsSPLight(&(lites).l[6], 7), \
 | 
						|
	gsSPLight(&(lites).a, 8)
 | 
						|
 | 
						|
#define gsSPSetStatus(sid, val) \
 | 
						|
	gsMoveWd(G_MW_GENSTAT, sid, val)
 | 
						|
 | 
						|
#define gsSPNumLights(n) \
 | 
						|
	gsMoveWd(G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n))
 | 
						|
 | 
						|
#define gsSPLightColor(Lightnum, packedcolor) \
 | 
						|
	gsMoveWd(G_MW_LIGHTCOL, G_MWO_a##Lightnum, packedcolor), \
 | 
						|
	gsMoveWd(G_MW_LIGHTCOL, G_MWO_b##Lightnum, packedcolor)
 | 
						|
 | 
						|
#define gsSPTextureRectangle(ulx, uly, lrx, lry, tile, s, t, dsdx, dtdy) \
 | 
						|
	gsTexRect(ulx, uly, lrx, lry, tile), \
 | 
						|
	gsDPHalf1(gF_(s, 16, 16) | gF_(t, 16, 0)), \
 | 
						|
	gsDPHalf2(gF_(dsdx, 16, 16) | gF_(dtdy, 16, 0))
 | 
						|
 | 
						|
#define gsSPScisTextureRectangle(ulx, uly, lrx, lry, tile, s, t, dsdx, dtdy) \
 | 
						|
	gsTexRect(gScC_(ulx), gScC_(uly), gScC_(lrx), gScC_(lry), tile), \
 | 
						|
	gsDPHalf1( \
 | 
						|
		gF_(gScD_(s, ulx, dsdx), 16, 16) | \
 | 
						|
		gF_(gScD_(t, uly, dtdy), 16, 0)), \
 | 
						|
	gsDPHalf2(gF_(dsdx, 16, 16) | gF_(dtdy, 16, 0))
 | 
						|
 | 
						|
#define gsSPTextureRectangleFlip(ulx, uly, lrx, lry, tile, s, t, dsdx, dtdy) \
 | 
						|
	gsTexRectFlip(ulx, uly, lrx, lry, tile), \
 | 
						|
	gsDPHalf1(gF_(s, 16, 16) | gF_(t, 16, 0)), \
 | 
						|
	gsDPHalf2(gF_(dsdx, 16, 16) | gF_(dtdy, 16, 0))
 | 
						|
 | 
						|
#define gsSPScisTextureRectangleFlip( \
 | 
						|
		ulx, uly, lrx, lry, tile, s, t, dsdx, dtdy) \
 | 
						|
	gsTexRectFlip(gScC_(ulx), gScC_(uly), gScC_(lrx), gScC_(lry), tile), \
 | 
						|
	gsDPHalf1( \
 | 
						|
		gF_(gScD_(s, ulx, dsdx), 16, 16) | \
 | 
						|
		gF_(gScD_(t, uly, dtdy), 16, 0)), \
 | 
						|
		gsDPHalf2(gF_(dsdx, 16, 16) | gF_(dtdy, 16, 0))
 | 
						|
 | 
						|
#define gsSPBgRectCopy(bg) \
 | 
						|
	gO_(G_BG_COPY, 0, bg)
 | 
						|
 | 
						|
#define gsSPBgRect1Cyc(bg) \
 | 
						|
	gO_(G_BG_1CYC, 0, bg)
 | 
						|
 | 
						|
#define gsSPObjRectangle(sp) \
 | 
						|
	gO_(G_OBJ_RECTANGLE, 0, sp)
 | 
						|
 | 
						|
#define gsSPObjRectangleR(sp) \
 | 
						|
	gO_(G_OBJ_RECTANGLE_R, 0, sp)
 | 
						|
 | 
						|
#define gsSPObjSprite(sp) \
 | 
						|
	gO_(G_OBJ_SPRITE, 0, sp)
 | 
						|
 | 
						|
#define gsSPObjMatrix(mtx) \
 | 
						|
	gO_( \
 | 
						|
		G_OBJ_MOVEMEM, \
 | 
						|
		gF_(sizeof(uObjMtx) - 1, 8, 16), \
 | 
						|
		mtx)
 | 
						|
 | 
						|
#define gsSPObjSubMatrix(mtx) \
 | 
						|
	gO_( \
 | 
						|
		G_OBJ_MOVEMEM, \
 | 
						|
		gF_(sizeof(uObjSubMtx) - 1, 8, 16) | \
 | 
						|
		gF_(2, 16, 0), \
 | 
						|
		mtx)
 | 
						|
 | 
						|
#define gsSPObjRenderMode(mode) \
 | 
						|
	gO_(G_OBJ_RENDERMODE, 0, mode)
 | 
						|
 | 
						|
#define gsSPObjLoadTxtr(tx) \
 | 
						|
	gO_(G_OBJ_LOADTXTR, 23, tx)
 | 
						|
 | 
						|
#define gsSPObjLoadTxRect(txsp) \
 | 
						|
	gO_(G_OBJ_LDTX_RECT, 47, txsp)
 | 
						|
 | 
						|
#define gsSPObjLoadTxRectR(txsp) \
 | 
						|
	gO_(G_OBJ_LDTX_RECT_R, 47, txsp)
 | 
						|
 | 
						|
#define gsSPObjLoadTxSprite(txsp) \
 | 
						|
	gO_(G_OBJ_LDTX_SPRITE, 47, txsp)
 | 
						|
 | 
						|
#define gsSPSelectDL(ldl, sid, flag, mask) \
 | 
						|
	gO_( \
 | 
						|
		G_RDPHALF_0, \
 | 
						|
		gF_(sid, 8, 16) | \
 | 
						|
		gF_(ldl, 16, 0), \
 | 
						|
		flag), \
 | 
						|
	gO_( \
 | 
						|
		G_SELECT_DL, \
 | 
						|
		gF_(0x00, 8, 16) | \
 | 
						|
		gF_(gI_(ldl) >> 16, 16, 0), \
 | 
						|
		mask)
 | 
						|
 | 
						|
#define gsSPSelectBranchDL(bdl, sid, flag, mask) \
 | 
						|
	gO_( \
 | 
						|
		G_RDPHALF_0, \
 | 
						|
		gF_(sid, 8, 16) | \
 | 
						|
		gF_(bdl, 16, 0), \
 | 
						|
		flag), \
 | 
						|
	gO_( \
 | 
						|
		G_SELECT_DL, \
 | 
						|
		gF_(0x01, 8, 16) | \
 | 
						|
		gF_(gI_(bdl) >> 16, 16, 0), \
 | 
						|
		mask)
 | 
						|
 | 
						|
/* unlisted instructions */
 | 
						|
 | 
						|
#define gsDPLoadTLUTCmd(tile, count) \
 | 
						|
	gO_( \
 | 
						|
		G_LOADTLUT, \
 | 
						|
		0, \
 | 
						|
		gF_(tile, 3, 24) | \
 | 
						|
		gF_(count, 10, 14))
 | 
						|
 | 
						|
#define gsDPLoadTLUT(count, tmem, dram) \
 | 
						|
	gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), \
 | 
						|
	gsDPTileSync(), \
 | 
						|
	gsDPSetTile(0, 0, 0, tmem, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0), \
 | 
						|
	gsDPLoadSync(), \
 | 
						|
	gsDPLoadTLUTCmd(G_TX_LOADTILE, (count) - 1), \
 | 
						|
	gsDPPipeSync()
 | 
						|
 | 
						|
#define gsDisplayList(dl, branch) \
 | 
						|
	gO_(G_DL, gF_(branch, 8, 16), dl)
 | 
						|
 | 
						|
#define gsDPLoadTile(tile, uls, ult, lrs, lrt) \
 | 
						|
	gO_( \
 | 
						|
		G_LOADTILE, \
 | 
						|
		gF_(uls, 12, 12) | \
 | 
						|
		gF_(ult, 12, 0), \
 | 
						|
		gF_(tile, 3, 24) | \
 | 
						|
		gF_(lrs, 12, 12) | \
 | 
						|
		gF_(lrt, 12, 0))
 | 
						|
 | 
						|
#define gsDPSetCombine(c) \
 | 
						|
	gO_( \
 | 
						|
		G_SETCOMBINE, \
 | 
						|
		(gL_(c) >> 32) & 0xFFFFFFFF, \
 | 
						|
		(gL_(c) >> 0) & 0xFFFFFFFF)
 | 
						|
 | 
						|
#define gsSPSetOtherModeLo(shift, length, data) \
 | 
						|
	gsSPSetOtherMode(G_SETOTHERMODE_L, shift, length, data)
 | 
						|
 | 
						|
#define gsSPSetOtherModeHi(shift, length, data) \
 | 
						|
	gsSPSetOtherMode(G_SETOTHERMODE_H, shift, length, data)
 | 
						|
 | 
						|
#define gsDPSetOtherMode(mode0, mode1) \
 | 
						|
	gO_(G_RDPSETOTHERMODE, gF_(mode0, 24, 0), mode1)
 | 
						|
 | 
						|
#define gsTexRect(ulx, uly, lrx, lry, tile) \
 | 
						|
	gO_( \
 | 
						|
		G_TEXRECT, \
 | 
						|
		gF_(lrx, 12, 12) | \
 | 
						|
		gF_(lry, 12, 0), \
 | 
						|
		gF_(tile, 3, 24) | \
 | 
						|
		gF_(ulx, 12, 12) | \
 | 
						|
		gF_(uly, 12, 0))
 | 
						|
 | 
						|
#define gsTexRectFlip(ulx, uly, lrx, lry, tile) \
 | 
						|
	gO_( \
 | 
						|
		G_TEXRECTFLIP, \
 | 
						|
		gF_(lrx, 12, 12) | \
 | 
						|
		gF_(lry, 12, 0), \
 | 
						|
		gF_(tile, 3, 24) | \
 | 
						|
		gF_(ulx, 12, 12) | \
 | 
						|
		gF_(uly, 12, 0))
 | 
						|
 | 
						|
#define gsSPNoOp() \
 | 
						|
	gO_(G_SPNOOP, 0, 0)
 | 
						|
 | 
						|
#define gsDPHalf1(wordhi) \
 | 
						|
	gO_(G_RDPHALF_1, 0, wordhi)
 | 
						|
 | 
						|
#define gsDPHalf2(wordlo) \
 | 
						|
	gO_(G_RDPHALF_2, 0, wordlo)
 | 
						|
 | 
						|
#define gsDPWord(wordhi, wordlo) \
 | 
						|
	gsDPHalf1(wordhi), \
 | 
						|
	gsDPHalf2(wordlo)
 | 
						|
 | 
						|
/* instruction macros for fast3d */
 | 
						|
 | 
						|
#if defined(F3D_GBI)
 | 
						|
 | 
						|
# define gsSP1Triangle(v0, v1, v2, flag) \
 | 
						|
	gO_( \
 | 
						|
		G_TRI1, \
 | 
						|
		0, \
 | 
						|
		gF_(flag, 8, 24) | \
 | 
						|
		gF_(gI_(v0) * 10, 8, 16) | \
 | 
						|
		gF_(gI_(v1) * 10, 8, 8) | \
 | 
						|
		gF_(gI_(v2) * 10, 8, 0))
 | 
						|
 | 
						|
# define gsSPCullDisplayList(v0, vn) \
 | 
						|
	gO_( \
 | 
						|
		G_CULLDL, \
 | 
						|
		(gI_(v0) & 0xF) * 40, \
 | 
						|
		gI_((vn) + 1) & 0xF) * 40)
 | 
						|
 | 
						|
# define gsSPLineW3D(v0, v1, wd, flag) \
 | 
						|
	gO_( \
 | 
						|
		G_LINE3D, \
 | 
						|
		0, \
 | 
						|
		gF_(flag, 8, 24) | \
 | 
						|
		gF_(gI_(v0) * 10, 8, 16) | \
 | 
						|
		gF_(gI_(v1) * 10, 8, 8) | \
 | 
						|
		gF_(wd, 8, 0))
 | 
						|
 | 
						|
# define gsSPVertex(v, n, v0) \
 | 
						|
	gO_( \
 | 
						|
		G_VTX, \
 | 
						|
		gF_((n) - 1, 4, 20) | \
 | 
						|
		gF_(v0, 4, 16) | \
 | 
						|
		gF_(sizeof(Vtx) * (n), 16, 0), \
 | 
						|
		v)
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
/* instruction macros for fast3d and beta f3dex */
 | 
						|
#if defined(F3D_GBI) || (defined(F3D_BETA) && defined(F3DEX_GBI))
 | 
						|
 | 
						|
# define gsSPModifyVertex(vtx, where, val) \
 | 
						|
	gsMoveWd(G_MW_POINTS, (vtx) * 40 + (where), val)
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
/* instruction macros for fast3d and f3dex */
 | 
						|
 | 
						|
#if defined(F3D_GBI) || defined(F3DEX_GBI)
 | 
						|
 | 
						|
# define gsSPForceMatrix(mptr) \
 | 
						|
	gsMoveMem(16, G_MV_MATRIX_1, (char *)(mptr)), \
 | 
						|
	gsMoveMem(16, G_MV_MATRIX_2, (char *)(mptr) + 16), \
 | 
						|
	gsMoveMem(16, G_MV_MATRIX_3, (char *)(mptr) + 32), \
 | 
						|
	gsMoveMem(16, G_MV_MATRIX_4, (char *)(mptr) + 48)
 | 
						|
 | 
						|
# define gsSPSetGeometryMode(mode) \
 | 
						|
	gO_(G_SETGEOMETRYMODE, 0, gI_(mode))
 | 
						|
 | 
						|
# define gsSPClearGeometryMode(mode) \
 | 
						|
	gO_(G_CLEARGEOMETRYMODE, 0, gI_(mode))
 | 
						|
 | 
						|
# define gsSPLoadGeometryMode(mode) \
 | 
						|
	gsSPClearGeometryMode(~gI_(0)), \
 | 
						|
	gsSPSetGeometryMode(mode)
 | 
						|
 | 
						|
# define gsSPInsertMatrix(where, num) \
 | 
						|
	gsMoveWd(G_MW_MATRIX, where, num)
 | 
						|
 | 
						|
# define gsSPLookAtX(l) \
 | 
						|
	gsMoveMem(sizeof(Light), G_MV_LOOKATX, l)
 | 
						|
 | 
						|
# define gsSPLookAtY(l) \
 | 
						|
	gsMoveMem(sizeof(Light), G_MV_LOOKATY, l)
 | 
						|
 | 
						|
# define gsSPMatrix(matrix, param) \
 | 
						|
	gO_( \
 | 
						|
		G_MTX, \
 | 
						|
		gF_(param, 8, 16) | \
 | 
						|
		gF_(sizeof(Mtx), 16, 0), \
 | 
						|
		matrix)
 | 
						|
 | 
						|
# define gsSPPopMatrix(param) \
 | 
						|
	gO_(G_POPMTX, 0, param)
 | 
						|
 | 
						|
# define gsSPLight(l, n) \
 | 
						|
	gsMoveMem(sizeof(Light), G_MV_L0 + ((n) - 1) * 2, l)
 | 
						|
 | 
						|
# define gsSPTexture(sc, tc, level, tile, on) \
 | 
						|
	gO_( \
 | 
						|
		G_TEXTURE, \
 | 
						|
		gF_(level, 3, 11) | \
 | 
						|
		gF_(tile, 3, 8) | \
 | 
						|
		gF_(on, 8, 0), \
 | 
						|
		gF_(sc, 16, 16) | \
 | 
						|
		gF_(tc, 16, 0))
 | 
						|
 | 
						|
# define gsSPViewport(v) \
 | 
						|
	gsMoveMem(sizeof(Vp), G_MV_VIEWPORT, v)
 | 
						|
 | 
						|
# define gsSPSetOtherMode(opc, shift, length, data) \
 | 
						|
	gO_( \
 | 
						|
		opc, \
 | 
						|
		gF_(shift, 8, 8) | \
 | 
						|
		gF_(length, 8, 0), \
 | 
						|
		data)
 | 
						|
 | 
						|
# define gsMoveWd(index, offset, data) \
 | 
						|
	gO_( \
 | 
						|
		G_MOVEWORD, \
 | 
						|
		gF_(offset, 16, 8) | \
 | 
						|
		gF_(index, 8, 0), \
 | 
						|
		data)
 | 
						|
 | 
						|
# define gsMoveMem(size, index, address) \
 | 
						|
	gO_( \
 | 
						|
		G_MOVEMEM, \
 | 
						|
		gF_(index, 8, 16) | \
 | 
						|
		gF_(size, 16, 0), \
 | 
						|
		address)
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
/* instruction macros for f3dex */
 | 
						|
 | 
						|
#if defined(F3DEX_GBI)
 | 
						|
 | 
						|
# define gsSP1Triangle(v0, v1, v2, flag) \
 | 
						|
	gO_( \
 | 
						|
		G_TRI1, \
 | 
						|
		0, \
 | 
						|
		gF_(gV3_(v0, v1, v2, flag) * 2, 8, 16) | \
 | 
						|
		gF_(gV3_(v1, v2, v0, flag) * 2, 8, 8) | \
 | 
						|
		gF_(gV3_(v2, v0, v1, flag) * 2, 8, 0))
 | 
						|
 | 
						|
# define gsSP1Quadrangle(v0, v1, v2, v3, flag) \
 | 
						|
	gO_( \
 | 
						|
		G_TRI2, \
 | 
						|
		gF_(gV4_(v0, v1, v2, v3, flag) * 2, 8, 16) | \
 | 
						|
		gF_(gV4_(v1, v2, v3, v0, flag) * 2, 8, 8) | \
 | 
						|
		gF_(gV4_(v2, v3, v0, v1, flag) * 2, 8, 0), \
 | 
						|
		gF_(gV4_(v0, v1, v2, v3, flag) * 2, 8, 16) | \
 | 
						|
		gF_(gV4_(v2, v3, v0, v1, flag) * 2, 8, 8) | \
 | 
						|
		gF_(gV4_(v3, v0, v1, v2, flag) * 2, 8, 0))
 | 
						|
 | 
						|
# define gsSPLineW3D(v0, v1, wd, flag) \
 | 
						|
	gO_( \
 | 
						|
		G_LINE3D, \
 | 
						|
		0, \
 | 
						|
		gF_(gV2_(v0, v1, flag) * 2, 8, 16) | \
 | 
						|
		gF_(gV2_(v1, v0, flag) * 2, 8, 8) | \
 | 
						|
		gF_(wd, 8, 0))
 | 
						|
 | 
						|
# define gsSPVertex(v, n, v0) \
 | 
						|
	gO_( \
 | 
						|
		G_VTX, \
 | 
						|
		gF_((v0) * 2, 8, 16) | \
 | 
						|
		gF_(n, 6, 10) | \
 | 
						|
		gF_(sizeof(Vtx) * (n) - 1, 10, 0), \
 | 
						|
		v)
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
/* instruction macros for f3dex and f3dex2 */
 | 
						|
 | 
						|
#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2)
 | 
						|
 | 
						|
# define gsSP2Triangles(v00, v01, v02, flag0, v10, v11, v12, flag1) \
 | 
						|
	gO_( \
 | 
						|
		G_TRI2, \
 | 
						|
		gF_(gV3_(v00, v01, v02, flag0) * 2, 8, 16) | \
 | 
						|
		gF_(gV3_(v01, v02, v00, flag0) * 2, 8, 8) | \
 | 
						|
		gF_(gV3_(v02, v00, v01, flag0) * 2, 8, 0), \
 | 
						|
		gF_(gV3_(v10, v11, v12, flag1) * 2, 8, 16) | \
 | 
						|
		gF_(gV3_(v11, v12, v10, flag1) * 2, 8, 8) | \
 | 
						|
		gF_(gV3_(v12, v10, v11, flag1) * 2, 8, 0))
 | 
						|
 | 
						|
# define gsSPBranchLessZ(branchdl, vtx, zval, near, far, flag) \
 | 
						|
	gsSPBranchLessZrg(branchdl, vtx, zval, near, far, flag, 0, G_MAXZ)
 | 
						|
 | 
						|
# define gsSPBranchLessZrg(branchdl, vtx, zval, near, far, flag, zmin, zmax) \
 | 
						|
	gsSPBranchLessZraw(branchdl, vtx, \
 | 
						|
		G_DEPTOZSrg(zval, near, far, flag, zmin, zmax))
 | 
						|
 | 
						|
# define gsSPBranchLessZraw(branchdl, vtx, zval) \
 | 
						|
	gsDPHalf1(branchdl), \
 | 
						|
	gsBranchZ(vtx, zval)
 | 
						|
 | 
						|
# define gsSPCullDisplayList(v0, vn) \
 | 
						|
	gO_( \
 | 
						|
		G_CULLDL, \
 | 
						|
		gF_((v0) * 2, 16, 0), \
 | 
						|
		gF_((vn) * 2, 16, 0))
 | 
						|
 | 
						|
# define gsSPLoadUcode(uc_start, uc_dstart) \
 | 
						|
	gsSPLoadUcodeEx(uc_start, uc_dstart, 0x800)
 | 
						|
 | 
						|
# define gsSPLoadUcodeL(ucode) \
 | 
						|
	gsSPLoadUcode( \
 | 
						|
		gI_(&ucode##TextStart) & 0x1FFFFFFF, \
 | 
						|
		gI_(&ucode##DataStart) & 0x1FFFFFFF)
 | 
						|
 | 
						|
# if !(defined(F3D_BETA) && defined(F3DEX_GBI))
 | 
						|
#  define gsSPModifyVertex(vtx, where, val) \
 | 
						|
	gO_( \
 | 
						|
		G_MODIFYVTX, \
 | 
						|
		gF_(where, 8, 16) | \
 | 
						|
		gF_((vtx) * 2, 16, 0), \
 | 
						|
		val)
 | 
						|
# endif
 | 
						|
 | 
						|
# define gsBranchZ(vtx, zval) \
 | 
						|
	gO_( \
 | 
						|
		G_BRANCH_Z, \
 | 
						|
		gF_((vtx) * 5, 12, 12) | \
 | 
						|
		gF_((vtx) * 2, 12, 0), \
 | 
						|
		zval)
 | 
						|
 | 
						|
# define gsLoadUcode(uc_start, uc_dsize) \
 | 
						|
	gO_( \
 | 
						|
		G_LOAD_UCODE, \
 | 
						|
		gF_((uc_dsize) - 1, 16, 0), \
 | 
						|
		uc_start)
 | 
						|
 | 
						|
# define gsSPLoadUcodeEx(uc_start, uc_dstart, uc_dsize) \
 | 
						|
	gsDPHalf1(uc_dstart), \
 | 
						|
	gsLoadUcode(uc_start, uc_dsize)
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
/* instruction macros for f3dex2 */
 | 
						|
 | 
						|
#if defined(F3DEX_GBI_2)
 | 
						|
 | 
						|
# define gsSP1Triangle(v0, v1, v2, flag) \
 | 
						|
	gO_( \
 | 
						|
		G_TRI1, \
 | 
						|
		gF_(gV3_(v0, v1, v2, flag) * 2, 8, 16) | \
 | 
						|
		gF_(gV3_(v1, v2, v0, flag) * 2, 8, 8) | \
 | 
						|
		gF_(gV3_(v2, v0, v1, flag) * 2, 8, 0), \
 | 
						|
		0)
 | 
						|
 | 
						|
# define gsSP1Quadrangle(v0, v1, v2, v3, flag) \
 | 
						|
	gO_( \
 | 
						|
		G_QUAD, \
 | 
						|
		gF_(gV4_(v0, v1, v2, v3, flag) * 2, 8, 16) | \
 | 
						|
		gF_(gV4_(v1, v2, v3, v0, flag) * 2, 8, 8) | \
 | 
						|
		gF_(gV4_(v2, v3, v0, v1, flag) * 2, 8, 0), \
 | 
						|
		gF_(gV4_(v0, v1, v2, v3, flag) * 2, 8, 16) | \
 | 
						|
		gF_(gV4_(v2, v3, v0, v1, flag) * 2, 8, 8) | \
 | 
						|
		gF_(gV4_(v3, v0, v1, v2, flag) * 2, 8, 0))
 | 
						|
 | 
						|
# define gsSPForceMatrix(mptr) \
 | 
						|
	gsMoveMem(sizeof(Mtx), G_MV_MATRIX, 0, mptr), \
 | 
						|
	gsMoveWd(G_MW_FORCEMTX, 0, 0x10000)
 | 
						|
 | 
						|
# define gsSPSetGeometryMode(mode) \
 | 
						|
	gsSPGeometryMode(0, mode)
 | 
						|
 | 
						|
# define gsSPClearGeometryMode(mode) \
 | 
						|
	gsSPGeometryMode(mode, 0)
 | 
						|
 | 
						|
# define gsSPLoadGeometryMode(mode) \
 | 
						|
	gsSPGeometryMode(~gI_(0), mode)
 | 
						|
 | 
						|
# define gsSPLineW3D(v0, v1, wd, flag) \
 | 
						|
	gO_( \
 | 
						|
		G_LINE3D, \
 | 
						|
		gF_(gV2_(v0, v1, flag) * 2, 8, 16) | \
 | 
						|
		gF_(gV2_(v1, v0, flag) * 2, 8, 8) | \
 | 
						|
		gF_(wd, 8, 0), \
 | 
						|
		0)
 | 
						|
 | 
						|
# define gsSPLookAtX(l) \
 | 
						|
	gsMoveMem(sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATX, l)
 | 
						|
 | 
						|
# define gsSPLookAtY(l) \
 | 
						|
	gsMoveMem(sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATY, l)
 | 
						|
 | 
						|
# define gsSPMatrix(matrix, param) \
 | 
						|
	gO_( \
 | 
						|
		G_MTX, \
 | 
						|
		gF_((sizeof(Mtx) - 1) / 8, 5, 19) | \
 | 
						|
		gF_(gI_(param) ^ G_MTX_PUSH, 8, 0), \
 | 
						|
		matrix)
 | 
						|
 | 
						|
# define gsSPPopMatrix(param) \
 | 
						|
		gsSPPopMatrixN(param, 1)
 | 
						|
 | 
						|
# define gsSPPopMatrixN(param, n) \
 | 
						|
	gO_( \
 | 
						|
		G_POPMTX, \
 | 
						|
		gF_((sizeof(Mtx) - 1) / 8, 5, 19) | \
 | 
						|
		gF_(2, 8, 0), \
 | 
						|
		sizeof(Mtx) * (n))
 | 
						|
 | 
						|
# define gsSPLight(l, n) \
 | 
						|
	gsMoveMem(sizeof(Light), G_MV_LIGHT, ((n) + 1) * 0x18, l)
 | 
						|
 | 
						|
# define gsSPTexture(sc, tc, level, tile, on) \
 | 
						|
	gO_( \
 | 
						|
		G_TEXTURE, \
 | 
						|
		gF_(level, 3, 11) | \
 | 
						|
		gF_(tile, 3, 8) | \
 | 
						|
		gF_(on, 7, 1), \
 | 
						|
		gF_(sc, 16, 16) | \
 | 
						|
		gF_(tc, 16, 0))
 | 
						|
 | 
						|
# define gsSPVertex(v, n, v0) \
 | 
						|
	gO_( \
 | 
						|
		G_VTX, \
 | 
						|
		gF_(n, 8, 12) | \
 | 
						|
		gF_((v0) + (n), 7, 1), \
 | 
						|
		v)
 | 
						|
 | 
						|
# define gsSPViewport(v) \
 | 
						|
	gsMoveMem(sizeof(Vp), G_MV_VIEWPORT, 0, v)
 | 
						|
 | 
						|
# define gsSPGeometryMode(clearbits, setbits) \
 | 
						|
	gO_( \
 | 
						|
		G_GEOMETRYMODE, \
 | 
						|
		gF_(~gI_(clearbits), 24, 0), \
 | 
						|
		setbits)
 | 
						|
 | 
						|
# define gsSPSetOtherMode(opc, shift, length, data) \
 | 
						|
	gO_( \
 | 
						|
		opc, \
 | 
						|
		gF_(32 - (shift) - (length), 8, 8) | \
 | 
						|
		gF_((length) - 1, 8, 0), \
 | 
						|
		data)
 | 
						|
 | 
						|
# define gsMoveWd(index, offset, data) \
 | 
						|
	gO_( \
 | 
						|
		G_MOVEWORD, \
 | 
						|
		gF_(index, 8, 16) | \
 | 
						|
		gF_(offset, 16, 0), \
 | 
						|
		data)
 | 
						|
 | 
						|
# define gsMoveMem(size, index, offset, address) \
 | 
						|
	gO_( \
 | 
						|
		G_MOVEMEM, \
 | 
						|
		gF_((size - 1) / 8, 5, 19) | \
 | 
						|
		gF_((offset) / 8, 8, 8) | \
 | 
						|
		gF_(index, 8, 0), \
 | 
						|
		address)
 | 
						|
 | 
						|
# define gsSPDma_io(flag, dmem, dram, size) \
 | 
						|
	gO_( \
 | 
						|
		G_DMA_IO, \
 | 
						|
		gF_(flag, 1, 23) | \
 | 
						|
		gF_((dmem) / 8, 10, 13) | \
 | 
						|
		gF_((size) - 1, 12, 0), \
 | 
						|
		dram)
 | 
						|
 | 
						|
# define gsSPDmaRead(dmem, dram, size) \
 | 
						|
	gsSPDma_io(0, dmem, dram, size)
 | 
						|
 | 
						|
# define gsSPDmaWrite(dmem, dram, size) \
 | 
						|
	gsSPDma_io(1, dmem, dram, size)
 | 
						|
 | 
						|
# define gsSpecial3(hi, lo) \
 | 
						|
	gO_(G_SPECIAL_3, hi, lo)
 | 
						|
 | 
						|
# define gsSpecial2(hi, lo) \
 | 
						|
	gO_(G_SPECIAL_2, hi, lo)
 | 
						|
 | 
						|
# define gsSpecial1(hi, lo) \
 | 
						|
	gO_(G_SPECIAL_1, hi, lo)
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
/* instruction macros for beta fast3d and f3dex */
 | 
						|
 | 
						|
#if defined(F3D_BETA) && (defined(F3D_GBI) || defined(F3DEX_GBI))
 | 
						|
 | 
						|
# define gsSPPerspNormalize(scale) \
 | 
						|
	gO_(G_PERSPNORM, 0, scale)
 | 
						|
 | 
						|
#else
 | 
						|
 | 
						|
# define gsSPPerspNormalize(scale) \
 | 
						|
	gsMoveWd(G_MW_PERSPNORM, 0, scale)
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
/* dynamic instruction macros */
 | 
						|
 | 
						|
#define gDisplayListPut(gdl, ...) \
 | 
						|
	({ \
 | 
						|
		Gfx Gd_[] = {__VA_ARGS__}; \
 | 
						|
		for(size_t Gi_ = 0; Gi_ < sizeof(Gd_) / sizeof(Gfx); Gi_++) \
 | 
						|
		{ \
 | 
						|
			*(Gfx *)(gdl) = Gd_[Gi_]; \
 | 
						|
		} \
 | 
						|
		(void)0; \
 | 
						|
	})
 | 
						|
#define gDisplayListAppend(pgdl, ...) \
 | 
						|
	({ \
 | 
						|
		Gfx Gd_[] = {__VA_ARGS__}; \
 | 
						|
		for(size_t Gi_ = 0; Gi_ < sizeof(Gd_) / sizeof(Gfx); Gi_++) \
 | 
						|
		{ \
 | 
						|
			*(*(Gfx **)(pgdl))++ = Gd_[Gi_]; \
 | 
						|
		} \
 | 
						|
		(void)0; \
 | 
						|
	})
 | 
						|
#define gDisplayListData(pgdl, d) \
 | 
						|
	({ \
 | 
						|
		Gfx **Gp_ = (void *)(pgdl); \
 | 
						|
		struct \
 | 
						|
		{ \
 | 
						|
			__typeof__(d) v; \
 | 
						|
		} *Gd_, *Gs_; \
 | 
						|
		*Gp_ -= (sizeof(*Gd_) + sizeof(Gfx) - 1) / sizeof(Gfx); \
 | 
						|
		Gd_ = (void *)*Gp_; \
 | 
						|
		Gs_ = (void *)&(d); \
 | 
						|
		*Gd_ = *Gs_; \
 | 
						|
		&Gd_->v; \
 | 
						|
	})
 | 
						|
#define gDisplayListAlloc(pgdl, s) \
 | 
						|
	({ \
 | 
						|
		Gfx **Gp_ = (void *)(pgdl); \
 | 
						|
		*Gp_ -= ((s) + sizeof(Gfx) - 1) / sizeof(Gfx); \
 | 
						|
		(void *)*Gp_; \
 | 
						|
	})
 | 
						|
 | 
						|
#define gDPFillRectangle(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPFillRectangle, __VA_ARGS__)
 | 
						|
#define gDPScisFillRectangle(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPScisFillRectangle, __VA_ARGS__)
 | 
						|
#define gDPFullSync(gdl) \
 | 
						|
	gDisplayListPut(gdl, gsDPFullSync())
 | 
						|
#define gDPLoadSync(gdl) \
 | 
						|
	gDisplayListPut(gdl, gsDPLoadSync())
 | 
						|
#define gDPTileSync(gdl) \
 | 
						|
	gDisplayListPut(gdl, gsDPTileSync())
 | 
						|
#define gDPPipeSync(gdl) \
 | 
						|
	gDisplayListPut(gdl, gsDPPipeSync())
 | 
						|
#define gDPLoadTLUT_pal16(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadTLUT_pal16, __VA_ARGS__)
 | 
						|
#define gDPLoadTLUT_pal256(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadTLUT_pal256, __VA_ARGS__)
 | 
						|
#define gDPLoadTextureBlock(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadTextureBlock, __VA_ARGS__)
 | 
						|
#define gDPLoadTextureBlockS(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadTextureBlockS, __VA_ARGS__)
 | 
						|
#define gDPLoadTextureBlock_4b(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadTextureBlock_4b, __VA_ARGS__)
 | 
						|
#define gDPLoadTextureBlock_4bS(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadTextureBlock_4bS, __VA_ARGS__)
 | 
						|
#define gDPLoadTextureBlockYuv(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadTextureBlockYuv, __VA_ARGS__)
 | 
						|
#define gDPLoadTextureBlockYuvS(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadTextureBlockYuvS, __VA_ARGS__)
 | 
						|
#define _gDPLoadTextureBlock(gdl, ...) \
 | 
						|
	gD_(gdl, _gsDPLoadTextureBlock, __VA_ARGS__)
 | 
						|
#define _gDPLoadTextureBlockS(gdl, ...) \
 | 
						|
	gD_(gdl, _gsDPLoadTextureBlockS, __VA_ARGS__)
 | 
						|
#define _gDPLoadTextureBlock_4b(gdl, ...) \
 | 
						|
	gD_(gdl, _gsDPLoadTextureBlock_4b, __VA_ARGS__)
 | 
						|
#define _gDPLoadTextureBlock_4bS(gdl, ...) \
 | 
						|
	gD_(gdl, _gsDPLoadTextureBlock_4bS, __VA_ARGS__)
 | 
						|
#define _gDPLoadTextureBlockYuv(gdl, ...) \
 | 
						|
	gD_(gdl, _gsDPLoadTextureBlockYuv, __VA_ARGS__)
 | 
						|
#define _gDPLoadTextureBlockYuvS(gdl, ...) \
 | 
						|
	gD_(gdl, _gsDPLoadTextureBlockYuvS, __VA_ARGS__)
 | 
						|
#define gDPLoadMultiBlock(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadMultiBlock, __VA_ARGS__)
 | 
						|
#define gDPLoadMultiBlockS(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadMultiBlockS, __VA_ARGS__)
 | 
						|
#define gDPLoadMultiBlock_4b(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadMultiBlock_4b, __VA_ARGS__)
 | 
						|
#define gDPLoadMultiBlock_4bS(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadMultiBlock_4bS, __VA_ARGS__)
 | 
						|
#define gDPLoadMultiBlockYuv(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadMultiBlockYuv, __VA_ARGS__)
 | 
						|
#define gDPLoadMultiBlockYuvS(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadMultiBlockYuvS, __VA_ARGS__)
 | 
						|
#define gDPLoadTextureTile(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadTextureTile, __VA_ARGS__)
 | 
						|
#define gDPLoadTextureTile_4b(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadTextureTile_4b, __VA_ARGS__)
 | 
						|
#define gDPLoadTextureTileYuv(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadTextureTileYuv, __VA_ARGS__)
 | 
						|
#define _gDPLoadTextureTile(gdl, ...) \
 | 
						|
	gD_(gdl, _gsDPLoadTextureTile, __VA_ARGS__)
 | 
						|
#define _gDPLoadTextureTile_4b(gdl, ...) \
 | 
						|
	gD_(gdl, _gsDPLoadTextureTile_4b, __VA_ARGS__)
 | 
						|
#define _gDPLoadTextureTileYuv(gdl, ...) \
 | 
						|
	gD_(gdl, _gsDPLoadTextureTileYuv, __VA_ARGS__)
 | 
						|
#define gDPLoadMultiTile(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadMultiTile, __VA_ARGS__)
 | 
						|
#define gDPLoadMultiTile_4b(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadMultiTile_4b, __VA_ARGS__)
 | 
						|
#define gDPLoadMultiTileYuv(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadMultiTileYuv, __VA_ARGS__)
 | 
						|
#define gDPLoadBlock(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadBlock, __VA_ARGS__)
 | 
						|
#define gDPNoOp(gdl) \
 | 
						|
	gDisplayListPut(gdl, gsDPNoOp())
 | 
						|
#define gDPNoOpTag(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPNoOpTag, __VA_ARGS__)
 | 
						|
#define gDPPipelineMode(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPPipelineMode, __VA_ARGS__)
 | 
						|
#define gDPSetBlendColor(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetBlendColor, __VA_ARGS__)
 | 
						|
#define gDPSetEnvColor(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetEnvColor, __VA_ARGS__)
 | 
						|
#define gDPSetFillColor(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetFillColor, __VA_ARGS__)
 | 
						|
#define gDPSetFogColor(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetFogColor, __VA_ARGS__)
 | 
						|
#define gDPSetPrimColor(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetPrimColor, __VA_ARGS__)
 | 
						|
#define gDPSetColorImage(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetColorImage, __VA_ARGS__)
 | 
						|
#define gDPSetDepthImage(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetDepthImage, __VA_ARGS__)
 | 
						|
#define gDPSetTextureImage(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetTextureImage, __VA_ARGS__)
 | 
						|
#define gDPSetHilite1Tile(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetHilite1Tile, __VA_ARGS__)
 | 
						|
#define gDPSetHilite2Tile(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetHilite2Tile, __VA_ARGS__)
 | 
						|
#define gDPSetAlphaCompare(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetAlphaCompare, __VA_ARGS__)
 | 
						|
#define gDPSetAlphaDither(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetAlphaDither, __VA_ARGS__)
 | 
						|
#define gDPSetColorDither(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetColorDither, __VA_ARGS__)
 | 
						|
#define gDPSetCombineMode(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetCombineLERP, __VA_ARGS__)
 | 
						|
#define gDPSetCombineLERP(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetCombineLERP, __VA_ARGS__)
 | 
						|
#define gDPSetConvert(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetConvert, __VA_ARGS__)
 | 
						|
#define gDPSetTextureConvert(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetTextureConvert, __VA_ARGS__)
 | 
						|
#define gDPSetCycleType(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetCycleType, __VA_ARGS__)
 | 
						|
#define gDPSetDepthSource(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetDepthSource, __VA_ARGS__)
 | 
						|
#define gDPSetCombineKey(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetCombineKey, __VA_ARGS__)
 | 
						|
#define gDPSetKeyGB(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetKeyGB, __VA_ARGS__)
 | 
						|
#define gDPSetKeyR(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetKeyR, __VA_ARGS__)
 | 
						|
#define gDPSetPrimDepth(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetPrimDepth, __VA_ARGS__)
 | 
						|
#define gDPSetRenderMode(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetRenderMode, __VA_ARGS__)
 | 
						|
#define gDPSetScissor(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetScissor, __VA_ARGS__)
 | 
						|
#define gDPSetScissorFrac(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetScissorFrac, __VA_ARGS__)
 | 
						|
#define gDPSetTextureDetail(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetTextureDetail, __VA_ARGS__)
 | 
						|
#define gDPSetTextureFilter(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetTextureFilter, __VA_ARGS__)
 | 
						|
#define gDPSetTextureLOD(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetTextureLOD, __VA_ARGS__)
 | 
						|
#define gDPSetTextureLUT(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetTextureLUT, __VA_ARGS__)
 | 
						|
#define gDPSetTexturePersp(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetTexturePersp, __VA_ARGS__)
 | 
						|
#define gDPSetTile(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetTile, __VA_ARGS__)
 | 
						|
#define gDPSetTileSize(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetTileSize, __VA_ARGS__)
 | 
						|
#define gSP1Triangle(gdl, ...) \
 | 
						|
	gD_(gdl, gsSP1Triangle, __VA_ARGS__)
 | 
						|
#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2)
 | 
						|
# define gSP2Triangles(gdl, ...) \
 | 
						|
	gD_(gdl, gsSP2Triangles, __VA_ARGS__)
 | 
						|
# define gSP1Quadrangle(gdl, ...) \
 | 
						|
	gD_(gdl, gsSP1Quadrangle, __VA_ARGS__)
 | 
						|
# define gSPBranchLessZ(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPBranchLessZ, __VA_ARGS__)
 | 
						|
# define gSPBranchLessZrg(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPBranchLessZrg, __VA_ARGS__)
 | 
						|
# define gSPBranchLessZraw(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPBranchLessZraw, __VA_ARGS__)
 | 
						|
#endif
 | 
						|
#define gSPBranchList(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPBranchList, __VA_ARGS__)
 | 
						|
#define gSPClipRatio(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPClipRatio, __VA_ARGS__)
 | 
						|
#define gSPCullDisplayList(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPCullDisplayList, __VA_ARGS__)
 | 
						|
#define gSPDisplayList(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPDisplayList, __VA_ARGS__)
 | 
						|
#define gSPEndDisplayList(gdl) \
 | 
						|
	gDisplayListPut(gdl, gsSPEndDisplayList())
 | 
						|
#define gSPFogFactor(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPFogFactor, __VA_ARGS__)
 | 
						|
#define gSPFogPosition(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPFogPosition, __VA_ARGS__)
 | 
						|
#define gSPForceMatrix(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPForceMatrix, __VA_ARGS__)
 | 
						|
#define gSPSetGeometryMode(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSetGeometryMode, __VA_ARGS__)
 | 
						|
#define gSPClearGeometryMode(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPClearGeometryMode, __VA_ARGS__)
 | 
						|
#define gSPLoadGeometryMode(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPLoadGeometryMode, __VA_ARGS__)
 | 
						|
#if defined(F3D_GBI) || defined(F3DEX_GBI)
 | 
						|
# define gSPInsertMatrix(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPInsertMatrix, __VA_ARGS__)
 | 
						|
#endif
 | 
						|
#define gSPLine3D(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPLine3D, __VA_ARGS__)
 | 
						|
#define gSPLineW3D(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPLineW3D, __VA_ARGS__)
 | 
						|
#define gSPLoadUcode(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPLoadUcode, __VA_ARGS__)
 | 
						|
#define gSPLoadUcodeL(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPLoadUcodeL, __VA_ARGS__)
 | 
						|
#define gSPLookAtX(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPLookAtX, __VA_ARGS__)
 | 
						|
#define gSPLookAtY(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPLookAtY, __VA_ARGS__)
 | 
						|
#define gSPLookAt(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPLookAt, __VA_ARGS__)
 | 
						|
#define gSPMatrix(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPMatrix, __VA_ARGS__)
 | 
						|
#define gSPModifyVertex(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPModifyVertex, __VA_ARGS__)
 | 
						|
#define gSPPerspNormalize(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPPerspNormalize, __VA_ARGS__)
 | 
						|
#define gSPPopMatrix(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPPopMatrix, __VA_ARGS__)
 | 
						|
#if defined(F3DEX_GBI_2)
 | 
						|
# define gSPPopMatrixN(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPPopMatrixN, __VA_ARGS__)
 | 
						|
#endif
 | 
						|
#define gSPSegment(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSegment, __VA_ARGS__)
 | 
						|
#define gSPSetLights0(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSetLights0, __VA_ARGS__)
 | 
						|
#define gSPSetLights1(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSetLights1, __VA_ARGS__)
 | 
						|
#define gSPSetLights2(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSetLights2, __VA_ARGS__)
 | 
						|
#define gSPSetLights3(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSetLights3, __VA_ARGS__)
 | 
						|
#define gSPSetLights4(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSetLights4, __VA_ARGS__)
 | 
						|
#define gSPSetLights5(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSetLights5, __VA_ARGS__)
 | 
						|
#define gSPSetLights6(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSetLights6, __VA_ARGS__)
 | 
						|
#define gSPSetLights7(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSetLights7, __VA_ARGS__)
 | 
						|
#define gSPSetStatus(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSetStatus, __VA_ARGS__)
 | 
						|
#define gSPNumLights(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPNumLights, __VA_ARGS__)
 | 
						|
#define gSPLight(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPLight, __VA_ARGS__)
 | 
						|
#define gSPLightColor(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPLightColor, __VA_ARGS__)
 | 
						|
#define gSPTexture(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPTexture, __VA_ARGS__)
 | 
						|
#define gSPTextureRectangle(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPTextureRectangle, __VA_ARGS__)
 | 
						|
#define gSPScisTextureRectangle(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPScisTextureRectangle, __VA_ARGS__)
 | 
						|
#define gSPTextureRectangleFlip(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPTextureRectangleFlip, __VA_ARGS__)
 | 
						|
#define gSPScisTextureRectangleFlip(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPScisTextureRectangleFlip, __VA_ARGS__)
 | 
						|
#define gSPVertex(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPVertex, __VA_ARGS__)
 | 
						|
#define gSPViewport(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPViewport, __VA_ARGS__)
 | 
						|
#define gSPBgRectCopy(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPBgRectCopy, __VA_ARGS__)
 | 
						|
#define gSPBgRect1Cyc(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPBgRect1Cyc, __VA_ARGS__)
 | 
						|
#define gSPObjRectangle(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPObjRectangle, __VA_ARGS__)
 | 
						|
#define gSPObjRectangleR(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPObjRectangleR, __VA_ARGS__)
 | 
						|
#define gSPObjSprite(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPObjSprite, __VA_ARGS__)
 | 
						|
#define gSPObjMatrix(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPObjMatrix, __VA_ARGS__)
 | 
						|
#define gSPObjSubMatrix(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPObjSubMatrix, __VA_ARGS__)
 | 
						|
#define gSPObjRenderMode(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPObjRenderMode, __VA_ARGS__)
 | 
						|
#define gSPObjLoadTxtr(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPObjLoadTxtr, __VA_ARGS__)
 | 
						|
#define gSPObjLoadTxRect(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPObjLoadTxRect, __VA_ARGS__)
 | 
						|
#define gSPObjLoadTxRectR(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPObjLoadTxRectR, __VA_ARGS__)
 | 
						|
#define gSPObjLoadTxSprite(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPObjLoadTxSprite, __VA_ARGS__)
 | 
						|
#define gSPSelectDL(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSelectDL, __VA_ARGS__)
 | 
						|
#define gSPSelectBranchDL(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSelectBranchDL, __VA_ARGS__)
 | 
						|
#define gDPLoadTLUTCmd(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadTLUTCmd, __VA_ARGS__)
 | 
						|
#define gDPLoadTLUT(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadTLUT, __VA_ARGS__)
 | 
						|
#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2)
 | 
						|
# define gBranchZ(gdl, ...) \
 | 
						|
	gD_(gdl, gsBranchZ, __VA_ARGS__)
 | 
						|
#endif
 | 
						|
#define gDisplayList(gdl, ...) \
 | 
						|
	gD_(gdl, gsDisplayList, __VA_ARGS__)
 | 
						|
#define gDPHalf1(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPHalf1, __VA_ARGS__)
 | 
						|
#define gDPHalf2(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPHalf2, __VA_ARGS__)
 | 
						|
#define gDPLoadTile(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPLoadTile, __VA_ARGS__)
 | 
						|
#define gDPSetCombine(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetCombine, __VA_ARGS__)
 | 
						|
#if defined(F3DEX_GBI_2)
 | 
						|
# define gSPGeometryMode(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPGeometryMode, __VA_ARGS__)
 | 
						|
#endif
 | 
						|
#define gSPSetOtherMode(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSetOtherMode, __VA_ARGS__)
 | 
						|
#define gSPSetOtherModeLo(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSetOtherModeLo, __VA_ARGS__)
 | 
						|
#define gSPSetOtherModeHi(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPSetOtherModeHi, __VA_ARGS__)
 | 
						|
#define gDPSetOtherMode(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPSetOtherMode, __VA_ARGS__)
 | 
						|
#define gMoveWd(gdl, ...) \
 | 
						|
	gD_(gdl, gsMoveWd, __VA_ARGS__)
 | 
						|
#define gMoveMem(gdl, ...) \
 | 
						|
	gD_(gdl, gsMoveMem, __VA_ARGS__)
 | 
						|
#if defined(F3DEX_GBI_2)
 | 
						|
# define gSPDma_io(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPDma_io, __VA_ARGS__)
 | 
						|
# define gSPDmaRead(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPDmaRead, __VA_ARGS__)
 | 
						|
# define gSPDmaWrite(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPDmaWrite, __VA_ARGS__)
 | 
						|
#endif
 | 
						|
#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2)
 | 
						|
# define gLoadUcode(gdl, ...) \
 | 
						|
	gD_(gdl, gsLoadUcode, __VA_ARGS__)
 | 
						|
# define gSPLoadUcodeEx(gdl, ...) \
 | 
						|
	gD_(gdl, gsSPLoadUcodeEx, __VA_ARGS__)
 | 
						|
#endif
 | 
						|
#define gTexRect(gdl, ...) \
 | 
						|
	gD_(gdl, gsTexRect, __VA_ARGS__)
 | 
						|
#define gTexRectFlip(gdl, ...) \
 | 
						|
	gD_(gdl, gsTexRectFlip, __VA_ARGS__)
 | 
						|
#define gSPNoOp(gdl) \
 | 
						|
	gDisplayListPut(gdl, gsSPNoOp())
 | 
						|
#define gDPWord(gdl, ...) \
 | 
						|
	gD_(gdl, gsDPWord, __VA_ARGS__)
 | 
						|
#if defined(F3DEX_GBI_2)
 | 
						|
# define gSpecial3(gdl, ...) \
 | 
						|
	gD_(gdl, gsSpecial3, __VA_ARGS__)
 | 
						|
# define gSpecial2(gdl, ...) \
 | 
						|
	gD_(gdl, gsSpecial2, __VA_ARGS__)
 | 
						|
# define gSpecial1(gdl, ...) \
 | 
						|
	gD_(gdl, gsSpecial1, __VA_ARGS__)
 | 
						|
#endif
 | 
						|
 | 
						|
/* data types and structures */
 | 
						|
typedef uint8_t		qu08_t;
 | 
						|
typedef uint16_t	qu016_t;
 | 
						|
typedef int16_t		qs48_t;
 | 
						|
typedef int16_t		qs510_t;
 | 
						|
typedef uint16_t	qu510_t;
 | 
						|
typedef int16_t		qs102_t;
 | 
						|
typedef uint16_t	qu102_t;
 | 
						|
typedef int16_t		qs105_t;
 | 
						|
typedef uint16_t	qu105_t;
 | 
						|
typedef int16_t		qs132_t;
 | 
						|
typedef int16_t		qs142_t;
 | 
						|
typedef int32_t		qs1516_t;
 | 
						|
typedef int32_t		qs1616_t;
 | 
						|
typedef int32_t		qs205_t;
 | 
						|
 | 
						|
typedef uint16_t	g_bglt_t;
 | 
						|
typedef uint8_t		g_ifmt_t;
 | 
						|
typedef uint8_t		g_isiz_t;
 | 
						|
typedef uint16_t	g_bgf_t;
 | 
						|
typedef uint8_t		g_objf_t;
 | 
						|
typedef uint32_t	g_objlt_t;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	_Alignas(8)
 | 
						|
	uint32_t	hi;
 | 
						|
	uint32_t	lo;
 | 
						|
} Gfx;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	int32_t		x1;
 | 
						|
	int32_t		y1;
 | 
						|
	int32_t		x2;
 | 
						|
	int32_t		y2;
 | 
						|
} Hilite_t;
 | 
						|
 | 
						|
typedef union
 | 
						|
{
 | 
						|
	_Alignas(8)
 | 
						|
	Hilite_t	h;
 | 
						|
} Hilite;
 | 
						|
 | 
						|
typedef int32_t Mtx_t[4][4];
 | 
						|
 | 
						|
typedef union
 | 
						|
{
 | 
						|
	_Alignas(8)
 | 
						|
	Mtx_t		m;
 | 
						|
	int32_t		l[16];
 | 
						|
	struct
 | 
						|
	{
 | 
						|
		int16_t		i[16];
 | 
						|
		uint16_t	f[16];
 | 
						|
	};
 | 
						|
} Mtx;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	uint8_t		col[3];
 | 
						|
	char		pad1;
 | 
						|
	uint8_t		colc[3];
 | 
						|
	char		pad2;
 | 
						|
	int8_t		dir[3];
 | 
						|
	char		pad3;
 | 
						|
} Light_t;
 | 
						|
 | 
						|
typedef union
 | 
						|
{
 | 
						|
	_Alignas(8)
 | 
						|
	Light_t		l;
 | 
						|
} Light;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	Light		l[2];
 | 
						|
} LookAt;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	uint8_t		col[3];
 | 
						|
	char		pad1;
 | 
						|
	uint8_t		colc[3];
 | 
						|
	char		pad2;
 | 
						|
} Ambient_t;
 | 
						|
 | 
						|
typedef union
 | 
						|
{
 | 
						|
	_Alignas(8)
 | 
						|
	Ambient_t	l;
 | 
						|
} Ambient;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	Ambient		a;
 | 
						|
	Light		l[1];
 | 
						|
} Lights0, Lights1;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	Ambient		a;
 | 
						|
	Light		l[2];
 | 
						|
} Lights2;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	Ambient		a;
 | 
						|
	Light		l[3];
 | 
						|
} Lights3;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	Ambient		a;
 | 
						|
	Light		l[4];
 | 
						|
} Lights4;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	Ambient		a;
 | 
						|
	Light		l[5];
 | 
						|
} Lights5;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	Ambient		a;
 | 
						|
	Light		l[6];
 | 
						|
} Lights6;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	Ambient		a;
 | 
						|
	Light		l[7];
 | 
						|
} Lightsn, Lights7;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	int16_t		ob[3];
 | 
						|
	uint16_t	flag;
 | 
						|
	qs105_t		tc[2];
 | 
						|
	uint8_t		cn[4];
 | 
						|
} Vtx_t;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	int16_t		ob[3];
 | 
						|
	uint16_t	flag;
 | 
						|
	qs105_t		tc[2];
 | 
						|
	int8_t		n[3];
 | 
						|
	uint8_t		a;
 | 
						|
} Vtx_tn;
 | 
						|
 | 
						|
typedef union
 | 
						|
{
 | 
						|
	_Alignas(8)
 | 
						|
	Vtx_t		v;
 | 
						|
	Vtx_tn		n;
 | 
						|
} Vtx;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	qs142_t		vscale[4];
 | 
						|
	qs142_t		vtrans[4];
 | 
						|
} Vp_t;
 | 
						|
 | 
						|
typedef union
 | 
						|
{
 | 
						|
	_Alignas(8)
 | 
						|
	Vp_t		vp;
 | 
						|
} Vp;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	qs1516_t	A;
 | 
						|
	qs1516_t	B;
 | 
						|
	qs1516_t	C;
 | 
						|
	qs1516_t	D;
 | 
						|
	qs102_t		X;
 | 
						|
	qs102_t		Y;
 | 
						|
	qu510_t		BaseScaleX;
 | 
						|
	qu510_t		BaseScaleY;
 | 
						|
} uObjMtx_t;
 | 
						|
 | 
						|
typedef union
 | 
						|
{
 | 
						|
	_Alignas(8)
 | 
						|
	uObjMtx_t	m;
 | 
						|
} uObjMtx;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	qs102_t		X;
 | 
						|
	qs102_t		Y;
 | 
						|
	qu510_t		BaseScaleX;
 | 
						|
	qu510_t		BaseScaleY;
 | 
						|
} uObjSubMtx_t;
 | 
						|
 | 
						|
typedef union
 | 
						|
{
 | 
						|
	_Alignas(8)
 | 
						|
	uObjSubMtx_t	m;
 | 
						|
} uObjSubMtx;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	qu105_t		imageX;
 | 
						|
	qu102_t		imageW;
 | 
						|
	qs102_t		frameX;
 | 
						|
	qu102_t		frameW;
 | 
						|
	qu105_t		imageY;
 | 
						|
	qu102_t		imageH;
 | 
						|
	qs102_t		frameY;
 | 
						|
	qu102_t		frameH;
 | 
						|
	uint64_t *	imagePtr;
 | 
						|
	g_bglt_t	imageLoad;
 | 
						|
	g_ifmt_t	imageFmt;
 | 
						|
	g_isiz_t	imageSiz;
 | 
						|
	uint16_t	imagePal;
 | 
						|
	g_bgf_t		imageFlip;
 | 
						|
	uint16_t	tmemW;
 | 
						|
	qs132_t		tmemH;
 | 
						|
	uint16_t	tmemLoadSH;
 | 
						|
	uint16_t	tmemLoadTH;
 | 
						|
	uint16_t	tmemSizeW;
 | 
						|
	uint16_t	tmemSize;
 | 
						|
} uObjBg_t;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	qu105_t		imageX;
 | 
						|
	qu102_t		imageW;
 | 
						|
	qs102_t		frameX;
 | 
						|
	qu102_t		frameW;
 | 
						|
	qu105_t		imageY;
 | 
						|
	qu102_t		imageH;
 | 
						|
	qs102_t		frameY;
 | 
						|
	qu102_t		frameH;
 | 
						|
	uint64_t *	imagePtr;
 | 
						|
	g_bglt_t	imageLoad;
 | 
						|
	g_ifmt_t	imageFmt;
 | 
						|
	g_isiz_t	imageSiz;
 | 
						|
	uint16_t	imagePal;
 | 
						|
	g_bgf_t		imageFlip;
 | 
						|
	qu510_t		scaleW;
 | 
						|
	qu510_t		scaleH;
 | 
						|
	qs205_t		imageYorig;
 | 
						|
	char		padding[4];
 | 
						|
} uObjScaleBg_t;
 | 
						|
 | 
						|
typedef union
 | 
						|
{
 | 
						|
	_Alignas(8)
 | 
						|
	uObjBg_t	b;
 | 
						|
	uObjScaleBg_t	s;
 | 
						|
} uObjBg;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	qs102_t		objX;
 | 
						|
	qu510_t		scaleW;
 | 
						|
	qu105_t		imageW;
 | 
						|
	uint16_t	paddingX;
 | 
						|
	qs102_t		objY;
 | 
						|
	qu510_t		scaleH;
 | 
						|
	qu105_t		imageH;
 | 
						|
	uint16_t	paddingY;
 | 
						|
	uint16_t	imageStride;
 | 
						|
	uint16_t	imageAdrs;
 | 
						|
	g_ifmt_t	imageFmt;
 | 
						|
	g_isiz_t	imageSiz;
 | 
						|
	uint16_t	imagePal;
 | 
						|
	g_objf_t	imageFlags;
 | 
						|
} uObjSprite_t;
 | 
						|
 | 
						|
typedef union
 | 
						|
{
 | 
						|
	_Alignas(8)
 | 
						|
	uObjSprite_t	s;
 | 
						|
} uObjSprite;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	g_objlt_t	type;
 | 
						|
	uint64_t *	image;
 | 
						|
	uint16_t	tmem;
 | 
						|
	uint16_t	tsize;
 | 
						|
	uint16_t	tline;
 | 
						|
	uint16_t	sid;
 | 
						|
	uint32_t	flag;
 | 
						|
	uint32_t	mask;
 | 
						|
} uObjTxtrBlock_t;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	g_objlt_t	type;
 | 
						|
	uint64_t *	image;
 | 
						|
	uint16_t	tmem;
 | 
						|
	uint16_t	twidth;
 | 
						|
	uint16_t	theight;
 | 
						|
	uint16_t	sid;
 | 
						|
	uint32_t	flag;
 | 
						|
	uint32_t	mask;
 | 
						|
} uObjTxtrTile_t;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	g_objlt_t	type;
 | 
						|
	uint64_t *	image;
 | 
						|
	uint16_t	phead;
 | 
						|
	uint16_t	pnum;
 | 
						|
	uint16_t	zero;
 | 
						|
	uint16_t	sid;
 | 
						|
	uint32_t	flag;
 | 
						|
	uint32_t	mask;
 | 
						|
} uObjTxtrTLUT_t;
 | 
						|
 | 
						|
typedef union
 | 
						|
{
 | 
						|
	_Alignas(8)
 | 
						|
	uObjTxtrBlock_t	block;
 | 
						|
	uObjTxtrTile_t	tile;
 | 
						|
	uObjTxtrTLUT_t	tlut;
 | 
						|
} uObjTxtr;
 | 
						|
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	uObjTxtr	txtr;
 | 
						|
	uObjSprite	sprite;
 | 
						|
} uObjTxSprite;
 | 
						|
 | 
						|
/* rectangle scissoring macros */
 | 
						|
#define gScC_(c) ((c) < 0 ? 0 : (c))
 | 
						|
#define gScD_(t, c, d) \
 | 
						|
	( \
 | 
						|
		(c) < 0 ? \
 | 
						|
		( \
 | 
						|
			(d) < 0 ? \
 | 
						|
				(t) + (c) * (d) / 0x80 : \
 | 
						|
				(t) - (c) * (d) / 0x80 \
 | 
						|
		) : \
 | 
						|
		(t) \
 | 
						|
	)
 | 
						|
 | 
						|
/* texture loading helper macros */
 | 
						|
#define G_SIZ_LDSIZ(siz)	((siz) < G_IM_SIZ_16b ? G_IM_SIZ_16b : (siz))
 | 
						|
#define G_SIZ_BITS(siz)		(4 << gI_(siz))
 | 
						|
#define G_SIZ_LDBITS(siz)	((siz) < G_IM_SIZ_16b ? G_SIZ_BITS(siz) : 16)
 | 
						|
#define G_DXT(siz, width) \
 | 
						|
	( \
 | 
						|
		(width) * G_SIZ_BITS(siz) > 64 ? \
 | 
						|
			((1 << 11) + (width) * G_SIZ_BITS(siz) / 64 - 1) / \
 | 
						|
			((width) * G_SIZ_BITS(siz) / 64) : \
 | 
						|
			(1 << 11) \
 | 
						|
	)
 | 
						|
#define G_LTB_LRS(width, height, siz) \
 | 
						|
	( \
 | 
						|
		(((width) * (height) + 1) * G_SIZ_BITS(siz) - 1) / \
 | 
						|
		G_SIZ_BITS(G_SIZ_LDSIZ(siz)) - 1 \
 | 
						|
	)
 | 
						|
#define G_LDBLK_TXL(txl) \
 | 
						|
	( \
 | 
						|
		(txl) > G_TX_LDBLK_MAX_TXL ? \
 | 
						|
			G_TX_LDBLK_MAX_TXL : \
 | 
						|
			(txl) \
 | 
						|
	)
 | 
						|
 | 
						|
/* depth value macros */
 | 
						|
#define gZp_(zval, near, far) \
 | 
						|
	( \
 | 
						|
		(1.f - (float)(near) / (float)(zval)) / \
 | 
						|
		(1.f - (float)(near) / (float)(far)) \
 | 
						|
	)
 | 
						|
#define gZo_(zval, near, far) \
 | 
						|
	( \
 | 
						|
		((float)(zval) - (float)(near)) / \
 | 
						|
		((float)(far) - (float)(near)) \
 | 
						|
	)
 | 
						|
#define gZf_(zval, near, far, flag) \
 | 
						|
	qs1616 \
 | 
						|
	( \
 | 
						|
		(flag) == G_BZ_PERSP ? \
 | 
						|
			gZp_(zval, near, far) : \
 | 
						|
			gZo_(zval, near, far) \
 | 
						|
	)
 | 
						|
#define G_DEPTOZSrg(zval, near, far, flag, zmin, zmax) \
 | 
						|
	( \
 | 
						|
		gZf_(zval, near, far, flag) * \
 | 
						|
		((int32_t)((zmax) - (zmin)) & ~(int32_t)1) + \
 | 
						|
		qs1616(zmin) \
 | 
						|
	)
 | 
						|
#define G_DEPTOZS(zval, near, far, flag) \
 | 
						|
	G_DEPTOZSrg(zval, near, far, flag, 0, G_MAXZ)
 | 
						|
 | 
						|
/* vertex ordering macros */
 | 
						|
#define gV2_(v0, v1, flag) \
 | 
						|
	( \
 | 
						|
		(flag) == 0 ? gI_(v0) : \
 | 
						|
		gI_(v1) \
 | 
						|
	)
 | 
						|
#define gV3_(v0, v1, v2, flag) \
 | 
						|
	( \
 | 
						|
		(flag) == 0 ? gI_(v0) : \
 | 
						|
		(flag) == 1 ? gI_(v1) : \
 | 
						|
		gI_(v2) \
 | 
						|
	)
 | 
						|
#define gV4_(v0, v1, v2, v3, flag) \
 | 
						|
	( \
 | 
						|
		(flag) == 0 ? gI_(v0) : \
 | 
						|
		(flag) == 1 ? gI_(v1) : \
 | 
						|
		(flag) == 2 ? gI_(v2) : \
 | 
						|
		gI_(v3) \
 | 
						|
	)
 | 
						|
 | 
						|
/* sprite texture parameter macros */
 | 
						|
#define GS_PIX2TMEM(pix, siz)	((pix) * G_SIZ_BITS(siz) / 64)
 | 
						|
#define GS_TB_TSIZE(pix, siz)	(GS_PIX2TMEM(pix, siz) - 1)
 | 
						|
#define GS_TB_TLINE(pix, siz)	(((1 << 11) - 1) / GS_PIX2TMEM(pix, siz) + 1)
 | 
						|
#define GS_TT_TWIDTH(pix, siz)	(GS_PIX2TMEM(pix, siz) * 4 - 1)
 | 
						|
#define GS_TT_THEIGHT(pix, siz)	((pix) * 4 - 1)
 | 
						|
#define GS_PAL_HEAD(head)	((head) + 256)
 | 
						|
#define GS_PAL_NUM(num)		((num) - 1)
 | 
						|
 | 
						|
/* fixed-point conversion macros */
 | 
						|
#define qu08(n)			((qu08_t)((n) * 0x100))
 | 
						|
#define qu016(n)		((qu016_t)((n) * 0x10000))
 | 
						|
#define qs48(n)			((qs48_t)((n) * 0x0100))
 | 
						|
#define qs510(n)		((qs510_t)((n) * 0x0400))
 | 
						|
#define qu510(n)		((qu510_t)((n) * 0x0400))
 | 
						|
#define qs102(n)		((qs102_t)((n) * 0x0004))
 | 
						|
#define qu102(n)		((qu102_t)((n) * 0x0004))
 | 
						|
#define qs105(n)		((qs105_t)((n) * 0x0020))
 | 
						|
#define qu105(n)		((qu105_t)((n) * 0x0020))
 | 
						|
#define qs132(n)		((qs132_t)((n) * 0x0004))
 | 
						|
#define qs142(n)		((qs142_t)((n) * 0x0004))
 | 
						|
#define qs1516(n)		((qs1516_t)((n) * 0x00010000))
 | 
						|
#define qs1616(n)		((qs1616_t)((n) * 0x00010000))
 | 
						|
#define qs205(n)		((qs205_t)((n) * 0x00000020))
 | 
						|
 | 
						|
/* private helper macros */
 | 
						|
#define gI_(i)			((uint32_t)(i))
 | 
						|
#define gL_(l)			((uint64_t)(l))
 | 
						|
#define gF_(i, n, s)		((gI_(i) & ((gI_(1) << (n)) - 1)) << (s))
 | 
						|
#define gFL_(l, n, s)		((gL_(l) & ((gL_(1) << (n)) - 1)) << (s))
 | 
						|
#define gO_(opc, hi, lo)	((Gfx){gF_(opc, 8, 24) | gI_(hi), gI_(lo)})
 | 
						|
#define gD_(gdl, m, ...)	gDisplayListPut(gdl, m(__VA_ARGS__))
 | 
						|
 | 
						|
#endif
 |