move g3imm to src

This commit is contained in:
Seth Barberee
2026-06-23 08:23:21 -07:00
parent 2f71cc84d9
commit dbe51b3466
6 changed files with 880 additions and 43 deletions

View File

@@ -1,42 +0,0 @@
.include "asm/macros.inc"
.include "include/g3imm.inc"
.text
arm_func_start G3_LoadMtx44
G3_LoadMtx44: ; 0x02077770
ldr r1, _02077784 ; =0x04000400
mov r2, #0x16
ldr ip, _02077788 ; =GX_SendFifo64B
str r2, [r1]
bx ip
.align 2, 0
_02077784: .word 0x04000400
_02077788: .word GX_SendFifo64B
arm_func_end G3_LoadMtx44
arm_func_start G3_LoadMtx43
G3_LoadMtx43: ; 0x0207778C
ldr r1, _020777A0 ; =0x04000400
mov r2, #0x17
ldr ip, _020777A4 ; =GX_SendFifo48B
str r2, [r1]
bx ip
.align 2, 0
_020777A0: .word 0x04000400
_020777A4: .word GX_SendFifo48B
arm_func_end G3_LoadMtx43
arm_func_start G3_MultMtx43
G3_MultMtx43: ; 0x020777A8
ldr r1, _020777BC ; =0x04000400
mov r2, #0x19
ldr ip, _020777C0 ; =GX_SendFifo48B
str r2, [r1]
bx ip
.align 2, 0
_020777BC: .word 0x04000400
_020777C0: .word GX_SendFifo48B
arm_func_end G3_MultMtx43

View File

@@ -0,0 +1,62 @@
#include <nitro.h>
void G3_LoadMtx44 (const MtxFx44 *m)
{
SDK_NULL_ASSERT(m);
reg_G3X_GXFIFO = G3OP_MTX_LOAD_4x4;
GX_SendFifo64B(&m->_00, (void *)&reg_G3X_GXFIFO);
}
void G3_LoadMtx43 (const MtxFx43 *m)
{
SDK_NULL_ASSERT(m);
reg_G3X_GXFIFO = G3OP_MTX_LOAD_4x3;
GX_SendFifo48B(&m->_00, (void *)&reg_G3X_GXFIFO);
}
// void G3_MultMtx44 (const MtxFx44 *m)
// {
// SDK_NULL_ASSERT(m);
//
// reg_G3X_GXFIFO = G3OP_MTX_MULT_4x4;
// GX_SendFifo64B(&m->_00, (void *)&reg_G3X_GXFIFO);
//}
void G3_MultMtx43 (const MtxFx43 *m)
{
SDK_NULL_ASSERT(m);
reg_G3X_GXFIFO = G3OP_MTX_MULT_4x3;
GX_SendFifo48B(&m->_00, (void *)&reg_G3X_GXFIFO);
}
// void G3_MultMtx33 (const MtxFx33 *m)
// {
// SDK_NULL_ASSERT(m);
//
// reg_G3X_GXFIFO = G3OP_MTX_MULT_3x3;
// GX_SendFifo36B(&m->_00, (void *)&reg_G3X_GXFIFO);
// }
//
// void G3_Shininess (const u32 *table)
// {
// SDK_NULL_ASSERT(table);
//
// reg_G3X_GXFIFO = G3OP_SHININESS;
// GX_SendFifo128B(&table[0], (void *)&reg_G3X_GXFIFO);
// }
//
// void G3_MultTransMtx33 (const MtxFx33 *mtx, const VecFx32 *trans)
// {
// SDK_NULL_ASSERT(mtx);
// SDK_NULL_ASSERT(trans);
//
// reg_G3X_GXFIFO = G3OP_MTX_MULT_4x3;
// GX_SendFifo36B(&mtx->_00, (void *)&reg_G3X_GXFIFO);
//
// reg_G3X_GXFIFO = (u32)trans->x;
// reg_G3X_GXFIFO = (u32)trans->y;
// reg_G3X_GXFIFO = (u32)trans->z;
// }

View File

@@ -3,5 +3,7 @@
#include <nitro/gx/gxasm.h>
#include <nitro/gx/g2.h>
#include <nitro/gx/g3.h>
#include <nitro/gx/g3imm.h>
#endif //NITRO_GX_H_

498
lib/include/nitro/gx/g3.h Normal file
View File

@@ -0,0 +1,498 @@
#ifndef NITRO_G3_H_
#define NITRO_G3_H_
#include <nitro/gx/gxcommon.h>
#include <nitro/hw/ARM9/io_reg.h>
#ifdef __cplusplus
extern "C" {
#endif
#define G3OP_NOP 0x00
#define G3OP_MTX_MODE 0x10
#define G3OP_MTX_PUSH 0x11
#define G3OP_MTX_POP 0x12
#define G3OP_MTX_STORE 0x13
#define G3OP_MTX_RESTORE 0x14
#define G3OP_MTX_IDENTITY 0x15
#define G3OP_MTX_LOAD_4x4 0x16
#define G3OP_MTX_LOAD_4x3 0x17
#define G3OP_MTX_MULT_4x4 0x18
#define G3OP_MTX_MULT_4x3 0x19
#define G3OP_MTX_MULT_3x3 0x1a
#define G3OP_MTX_SCALE 0x1b
#define G3OP_MTX_TRANS 0x1c
#define G3OP_COLOR 0x20
#define G3OP_NORMAL 0x21
#define G3OP_TEXCOORD 0x22
#define G3OP_VTX_16 0x23
#define G3OP_VTX_10 0x24
#define G3OP_VTX_XY 0x25
#define G3OP_VTX_XZ 0x26
#define G3OP_VTX_YZ 0x27
#define G3OP_VTX_DIFF 0x28
#define G3OP_POLYGON_ATTR 0x29
#define G3OP_TEXIMAGE_PARAM 0x2a
#define G3OP_TEXPLTT_BASE 0x2b
#define G3OP_DIF_AMB 0x30
#define G3OP_SPE_EMI 0x31
#define G3OP_LIGHT_VECTOR 0x32
#define G3OP_LIGHT_COLOR 0x33
#define G3OP_SHININESS 0x34
#define G3OP_BEGIN 0x40
#define G3OP_END 0x41
#define G3OP_SWAP_BUFFERS 0x50
#define G3OP_VIEWPORT 0x60
#define G3OP_BOX_TEST 0x70
#define G3OP_POS_TEST 0x71
#define G3OP_VEC_TEST 0x72
#define G3OP_DUMMY_COMMAND 0xFF
#define G3OP_NOP_NPARAMS 0
#define G3OP_MTX_MODE_NPARAMS 1
#define G3OP_MTX_PUSH_NPARAMS 0
#define G3OP_MTX_POP_NPARAMS 1
#define G3OP_MTX_STORE_NPARAMS 1
#define G3OP_MTX_RESTORE_NPARAMS 1
#define G3OP_MTX_IDENTITY_NPARAMS 0
#define G3OP_MTX_LOAD_4x4_NPARAMS 16
#define G3OP_MTX_LOAD_4x3_NPARAMS 12
#define G3OP_MTX_MULT_4x4_NPARAMS 16
#define G3OP_MTX_MULT_4x3_NPARAMS 12
#define G3OP_MTX_MULT_3x3_NPARAMS 9
#define G3OP_MTX_SCALE_NPARAMS 3
#define G3OP_MTX_TRANS_NPARAMS 3
#define G3OP_COLOR_NPARAMS 1
#define G3OP_NORMAL_NPARAMS 1
#define G3OP_TEXCOORD_NPARAMS 1
#define G3OP_VTX_16_NPARAMS 2
#define G3OP_VTX_10_NPARAMS 1
#define G3OP_VTX_XY_NPARAMS 1
#define G3OP_VTX_XZ_NPARAMS 1
#define G3OP_VTX_YZ_NPARAMS 1
#define G3OP_VTX_DIFF_NPARAMS 1
#define G3OP_POLYGON_ATTR_NPARAMS 1
#define G3OP_TEXIMAGE_PARAM_NPARAMS 1
#define G3OP_TEXPLTT_BASE_NPARAMS 1
#define G3OP_DIF_AMB_NPARAMS 1
#define G3OP_SPE_EMI_NPARAMS 1
#define G3OP_LIGHT_VECTOR_NPARAMS 1
#define G3OP_LIGHT_COLOR_NPARAMS 1
#define G3OP_SHININESS_NPARAMS 32
#define G3OP_BEGIN_NPARAMS 1
#define G3OP_END_NPARAMS 0
#define G3OP_SWAP_BUFFERS_NPARAMS 1
#define G3OP_VIEWPORT_NPARAMS 1
#define G3OP_BOX_TEST_NPARAMS 3
#define G3OP_POS_TEST_NPARAMS 2
#define G3OP_VEC_TEST_NPARAMS 1
#define GX_VALID_OPCODE_ASSERT(x) SDK_ASSERT((x == 0xFF) || ((x >= 0) && (x <= 0x72)))
typedef enum {
GX_MTXMODE_PROJECTION = 0,
GX_MTXMODE_POSITION = 1,
GX_MTXMODE_POSITION_VECTOR = 2,
GX_MTXMODE_TEXTURE = 3
} GXMtxMode;
#define GX_MTXMODE_ASSERT(x) \
SDK_MINMAX_ASSERT(x, GX_MTXMODE_PROJECTION, GX_MTXMODE_TEXTURE)
#define GX_MTX_POP_NUM_ASSERT(x) SDK_MINMAX_ASSERT(x, -30, 31)
#define GX_MTX_STORE_NUM_ASSERT(x) SDK_MINMAX_ASSERT(x, 0, 30)
#define GX_MTX_RESTORE_NUM_ASSERT(x) SDK_MINMAX_ASSERT(x, 0, 30)
typedef enum {
GX_BEGIN_TRIANGLES = 0,
GX_BEGIN_QUADS = 1,
GX_BEGIN_TRIANGLE_STRIP = 2,
GX_BEGIN_QUAD_STRIP = 3
} GXBegin;
#define GX_BEGIN_ASSERT(x) \
SDK_MINMAX_ASSERT(x, GX_BEGIN_TRIANGLES, GX_BEGIN_QUAD_STRIP)
typedef enum {
GX_SORTMODE_AUTO = 0,
GX_SORTMODE_MANUAL = 1
} GXSortMode;
#define GX_SORTMODE_ASSERT(x) \
SDK_MINMAX_ASSERT(x, GX_SORTMODE_AUTO, GX_SORTMODE_MANUAL)
typedef enum {
GX_BUFFERMODE_Z = 0,
GX_BUFFERMODE_W = 1
} GXBufferMode;
#define GX_BUFFERMODE_ASSERT(x) \
SDK_MINMAX_ASSERT(x, GX_BUFFERMODE_Z, GX_BUFFERMODE_W)
#define GX_VIEWPORT_ASSERT(x1, y1, x2, y2) \
SDK_ASSERT((x1) < (x2) && (y1) < (y2) && \
(x1) >= 0 && (x2) < 256 && \
(y1) >= 0 && (y2) < 192)
#define GX_POLYGON_ATTR_POLYGONID_ASSERT(x) GX_POLYGONID_ASSERT(x)
#define GX_POLYGON_ATTR_ALPHA_ASSERT(x) GX_ALPHA_ASSERT(x)
typedef enum {
GX_LIGHTMASK_NONE = 0,
GX_LIGHTMASK_0 = 1,
GX_LIGHTMASK_1 = 2,
GX_LIGHTMASK_01 = 3,
GX_LIGHTMASK_2 = 4,
GX_LIGHTMASK_02 = 5,
GX_LIGHTMASK_12 = 6,
GX_LIGHTMASK_012 = 7,
GX_LIGHTMASK_3 = 8,
GX_LIGHTMASK_03 = 9,
GX_LIGHTMASK_13 = 10,
GX_LIGHTMASK_013 = 11,
GX_LIGHTMASK_23 = 12,
GX_LIGHTMASK_023 = 13,
GX_LIGHTMASK_123 = 14,
GX_LIGHTMASK_0123 = 15
} GXLightMask;
#define GX_LIGHTMASK_ASSERT(x) SDK_MINMAX_ASSERT(x, 0, 15)
typedef enum {
GX_POLYGONMODE_MODULATE = 0,
GX_POLYGONMODE_DECAL = 1,
GX_POLYGONMODE_TOON = 2,
GX_POLYGONMODE_SHADOW = 3
} GXPolygonMode;
#define GX_POLYGONMODE_ASSERT(x) \
SDK_MINMAX_ASSERT(x, GX_POLYGONMODE_MODULATE, GX_POLYGONMODE_SHADOW)
typedef enum {
GX_CULL_ALL = 0,
GX_CULL_FRONT = 1,
GX_CULL_BACK = 2,
GX_CULL_NONE = 3
} GXCull;
#define GX_CULL_ASSERT(x) \
SDK_MINMAX_ASSERT(x, GX_CULL_ALL, GX_CULL_NONE)
typedef enum {
GX_POLYGON_ATTR_MISC_NONE = 0,
GX_POLYGON_ATTR_MISC_XLU_DEPTH_UPDATE = 1 << REG_G3_POLYGON_ATTR_XL_SHIFT,
GX_POLYGON_ATTR_MISC_FAR_CLIPPING = 1 << REG_G3_POLYGON_ATTR_FC_SHIFT,
GX_POLYGON_ATTR_MISC_DISP_1DOT = 1 << REG_G3_POLYGON_ATTR_D1_SHIFT,
GX_POLYGON_ATTR_MISC_DEPTHTEST_DECAL = 1 << REG_G3_POLYGON_ATTR_DT_SHIFT,
GX_POLYGON_ATTR_MISC_FOG = 1 << REG_G3_POLYGON_ATTR_FE_SHIFT
} GXPolygonAttrMisc;
typedef enum {
GX_TEXREPEAT_NONE = 0,
GX_TEXREPEAT_S = 1,
GX_TEXREPEAT_T = 2,
GX_TEXREPEAT_ST = 3
} GXTexRepeat;
#define GX_TEXREPEAT_ASSERT(x) \
SDK_MINMAX_ASSERT(x, GX_TEXREPEAT_NONE, GX_TEXREPEAT_ST)
typedef enum {
GX_TEXFLIP_NONE = 0,
GX_TEXFLIP_S = 1,
GX_TEXFLIP_T = 2,
GX_TEXFLIP_ST = 3
} GXTexFlip;
#define GX_TEXFLIP_ASSERT(x) \
SDK_MINMAX_ASSERT(x, GX_TEXFLIP_NONE, GX_TEXFLIP_ST)
typedef enum {
GX_TEXSIZE_S8 = 0,
GX_TEXSIZE_S16 = 1,
GX_TEXSIZE_S32 = 2,
GX_TEXSIZE_S64 = 3,
GX_TEXSIZE_S128 = 4,
GX_TEXSIZE_S256 = 5,
GX_TEXSIZE_S512 = 6,
GX_TEXSIZE_S1024 = 7
} GXTexSizeS;
#define GX_TEXSIZE_S_ASSERT(x) \
SDK_MINMAX_ASSERT(x, GX_TEXSIZE_S8, GX_TEXSIZE_S1024)
typedef enum {
GX_TEXSIZE_T8 = 0,
GX_TEXSIZE_T16 = 1,
GX_TEXSIZE_T32 = 2,
GX_TEXSIZE_T64 = 3,
GX_TEXSIZE_T128 = 4,
GX_TEXSIZE_T256 = 5,
GX_TEXSIZE_T512 = 6,
GX_TEXSIZE_T1024 = 7
} GXTexSizeT;
#define GX_TEXSIZE_T_ASSERT(x) \
SDK_MINMAX_ASSERT(x, GX_TEXSIZE_T8, GX_TEXSIZE_T1024)
typedef enum {
GX_TEXFMT_NONE = 0,
GX_TEXFMT_A3I5 = 1,
GX_TEXFMT_PLTT4 = 2,
GX_TEXFMT_PLTT16 = 3,
GX_TEXFMT_PLTT256 = 4,
GX_TEXFMT_COMP4x4 = 5,
GX_TEXFMT_A5I3 = 6,
GX_TEXFMT_DIRECT = 7
} GXTexFmt;
#define GX_TEXFMT_ALPHA ((GXTexFmt)GX_TEXFMT_A5I3)
#define GX_TEXFMT_ASSERT(x) \
SDK_MINMAX_ASSERT(x, GX_TEXFMT_NONE, GX_TEXFMT_DIRECT)
typedef enum {
GX_TEXPLTTCOLOR0_USE = 0,
GX_TEXPLTTCOLOR0_TRNS = 1
} GXTexPlttColor0;
#define GX_TEXPLTTCOLOR0_ASSERT(x) \
SDK_MINMAX_ASSERT(x, GX_TEXPLTTCOLOR0_USE, GX_TEXPLTTCOLOR0_TRNS)
typedef enum {
GX_TEXGEN_NONE = 0,
GX_TEXGEN_TEXCOORD = 1,
GX_TEXGEN_NORMAL = 2,
GX_TEXGEN_VERTEX = 3
} GXTexGen;
#define GX_TEXGEN_ASSERT(x) \
SDK_MINMAX_ASSERT(x, GX_TEXGEN_NONE, GX_TEXGEN_VERTEX)
#define GX_TEXIMAGE_PARAM_ADDR_ASSERT(addr) \
SDK_ASSERT(((addr) & 0x7) == 0 && (addr) >= 0 && (addr) < 0x80000)
typedef enum {
GX_LIGHTID_0 = 0,
GX_LIGHTID_1 = 1,
GX_LIGHTID_2 = 2,
GX_LIGHTID_3 = 3
} GXLightId;
#define GX_LIGHTID_ASSERT(x) \
SDK_MINMAX_ASSERT(x, GX_LIGHTID_0, GX_LIGHTID_3)
#ifdef SDK_ADS
typedef struct {
u32 val[3];
} GXBoxTestParam;
#else
typedef union {
u32 val[3];
struct {
fx16 x;
fx16 y;
fx16 z;
fx16 width;
fx16 height;
fx16 depth;
};
} GXBoxTestParam;
#endif
typedef struct {
u8 * curr_cmd;
u32 * curr_param;
u32 * bottom;
u32 length;
BOOL param0_cmd_flg;
} GXDLInfo;
typedef u32 GXSt;
typedef u32 GXTexPlttBaseParam;
#define GX_TEXPLTTBASEPARAM_ASSERT(x) SDK_ASSERT((x) < 0xe000)
typedef u32 VecVtx10;
#define GX_VTX10_SHIFT 6
#define GX_VTX10_INT_SIZE 3
#define GX_VTX10_DEC_SIZE 6
#define GX_VTX10_INT_MASK 0x01c0
#define GX_VTX10_DEC_MASK 0x003f
#define GX_VTX10_SIGN_MASK 0x0200
#define GX_VTX10_MASK (GX_VTX10_INT_MASK | GX_VTX10_DEC_MASK | GX_VTX10_SIGN_MASK)
#define GX_VTX10_MAX ((fx32)(0x00007fc0))
#define GX_VTX10_MIN ((fx32)(0xffff8000))
#define GX_VEC_VTX10_X_SHIFT 0
#define GX_VEC_VTX10_Y_SHIFT 10
#define GX_VEC_VTX10_Z_SHIFT 20
#define GX_FX16PAIR(a, b) ((u32)((u32)(u16)(a) | ((u32)(u16)(b) << 16)))
#define GX_VECVTX10(x, y, z) \
((VecVtx10) (((((x) >> (FX32_DEC_SIZE - GX_VTX10_DEC_SIZE)) & GX_VTX10_MASK) << GX_VEC_VTX10_X_SHIFT) | \
((((y) >> (FX32_DEC_SIZE - GX_VTX10_DEC_SIZE)) & GX_VTX10_MASK) << GX_VEC_VTX10_Y_SHIFT) | \
((((z) >> (FX32_DEC_SIZE - GX_VTX10_DEC_SIZE)) & GX_VTX10_MASK) << GX_VEC_VTX10_Z_SHIFT)))
typedef u32 VecVtxDiff;
#define GX_VTXDIFF_MASK 0x03ff
#define GX_VTXDIFF_MAX ((fx32)(0x000001ff))
#define GX_VTXDIFF_MIN ((fx32)(0xfffffe00))
#define GX_VEC_VTXDIFF_X_SHIFT 0
#define GX_VEC_VTXDIFF_Y_SHIFT 10
#define GX_VEC_VTXDIFF_Z_SHIFT 20
#define GX_VECVTXDIFF(x, y, z) \
((VecVtxDiff) ((((x) & GX_VTXDIFF_MASK) << GX_VEC_VTXDIFF_X_SHIFT) | \
(((y) & GX_VTXDIFF_MASK) << GX_VEC_VTXDIFF_Y_SHIFT) | \
(((z) & GX_VTXDIFF_MASK) << GX_VEC_VTXDIFF_Z_SHIFT)))
#define GX_FX16ST(x) ((s16)((x) >> 8))
#define GX_ST(s, t) ((GXSt)((u16)GX_FX16ST(s) | ((u16)GX_FX16ST(t) << 16)))
#define GX_COMP4x4_PLTT_IDX(image) \
((u32)(0x20000 + (((image) & 0x1ffff) >> 1) + (((image) & 0x40000) >> 2)))
#define GX_PACK_OP(op1, op2, op3, op4) \
((u32)((op1) | ((op2) << 8) | ((op3) << 16) | ((op4) << 24)))
#define GX_PACK_SWAPBUFFERS_PARAM(am, zw) \
((u32) (((am) << REG_G3_SWAP_BUFFERS_XS_SHIFT) | \
((zw) << REG_G3_SWAP_BUFFERS_DP_SHIFT)))
#define GX_PACK_MTXMODE_PARAM(mode) ((u32) ((mode) << REG_G3_MTX_MODE_M_SHIFT))
#define GX_PACK_POPMTX_PARAM(num) ((u32) (num))
#define GX_PACK_STOREMTX_PARAM(num) ((u32) (num))
#define GX_PACK_RESTOREMTX_PARAM(num) ((u32) (num))
#define GX_PACK_LIGHTVECTOR_PARAM(lightID, x, y, z) \
((u32)GX_VECFX10((x), (y), (z)) | \
((u32)(lightID) << REG_G3_LIGHT_VECTOR_LNUM_SHIFT))
#define GX_PACK_LIGHTCOLOR_PARAM(lightID, rgb) \
((u32)((rgb) | \
((u32)(lightID) << REG_G3_LIGHT_COLOR_LNUM_SHIFT)))
#define GX_PACK_DIFFAMB_PARAM(diffuse, ambient, IsSetVtxColor) \
((u32)((diffuse) | \
((ambient) << REG_G3_DIF_AMB_AMBIENT_RED_SHIFT) | \
(((IsSetVtxColor) != FALSE) << REG_G3_DIF_AMB_C_SHIFT)))
#define GX_PACK_SPECEMI_PARAM(specular, emission, IsShininess) \
((u32)((specular) | \
((emission) << REG_G3_SPE_EMI_EMISSION_RED_SHIFT) | \
(((IsShininess) != FALSE) << REG_G3_SPE_EMI_S_SHIFT)))
#define GX_PACK_POLYGONATTR_PARAM(light, polyMode, cullMode, polygonID, alpha, misc) \
((u32)(((light) << REG_G3_POLYGON_ATTR_LE_SHIFT) | \
((polyMode) << REG_G3_POLYGON_ATTR_PM_SHIFT) | \
((cullMode) << REG_G3_POLYGON_ATTR_BK_SHIFT) | \
(misc) | \
((polygonID) << REG_G3_POLYGON_ATTR_ID_SHIFT) | \
((alpha) << REG_G3_POLYGON_ATTR_ALPHA_SHIFT)))
#define GX_PACK_BEGIN_PARAM(primitive) \
((u32)((primitive) << REG_G3_BEGIN_VTXS_TYPE_SHIFT))
#define GX_PACK_COLOR_PARAM(rgb) ((u32)(rgb))
#define GX_PACK_NORMAL_PARAM(x, y, z) ((u32)GX_VECFX10((x), (y), (z)))
#define GX_PACK_VTX10_PARAM(x, y, z) ((u32)GX_VECVTX10((x), (y), (z)))
#define GX_PACK_VTXXY_PARAM(x, y) (GX_FX16PAIR((x), (y)))
#define GX_PACK_VTXXZ_PARAM(x, z) (GX_FX16PAIR((x), (z)))
#define GX_PACK_VTXYZ_PARAM(y, z) (GX_FX16PAIR((y), (z)))
#define GX_PACK_VTXDIFF_PARAM(x, y, z) (GX_VECVTXDIFF((x), (y), (z)))
#define GX_PACK_TEXCOORD_PARAM(s, t) (GX_ST((s), (t)))
#define GX_PACK_TEXIMAGE_PARAM(texFmt, texGen, s, t, repeat, flip, pltt0, addr) \
((u32)(((addr) >> 3) | \
((texFmt) << REG_G3_TEXIMAGE_PARAM_TEXFMT_SHIFT) | \
((texGen) << REG_G3_TEXIMAGE_PARAM_TGEN_SHIFT) | \
((s) << REG_G3_TEXIMAGE_PARAM_V_SIZE_SHIFT) | \
((t) << REG_G3_TEXIMAGE_PARAM_T_SIZE_SHIFT) | \
((repeat) << REG_G3_TEXIMAGE_PARAM_RS_SHIFT) | \
((flip) << REG_G3_TEXIMAGE_PARAM_FS_SHIFT) | \
((pltt0) << REG_G3_TEXIMAGE_PARAM_TR_SHIFT)))
#define GX_PACK_TEXPLTTBASE_PARAM(addr, texFmt) \
((u32)((addr) >> (4 - ((texFmt) == GX_TEXFMT_PLTT4))))
#define GX_PACK_VIEWPORT_PARAM(x1, y1, x2, y2) \
((u32)((x1) | ((y1) << 8) | ((x2) << 16) | ((y2) << 24)))
#define GX_PACK_VECTORTEST_PARAM(x, y, z) ((u32)GX_VECFX10((x), (y), (z)))
#if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL))
void G3_BeginMakeDL(GXDLInfo * info, void * ptr, u32 length);
u32 G3_EndMakeDL(GXDLInfo * info);
static void * G3_GetDLStart(const GXDLInfo * info);
static u32 G3_GetDLLength(const GXDLInfo * info);
static u32 G3_GetDLSize(const GXDLInfo * info);
static GXTexPlttBaseParam G3_MakeTexPlttBaseParam(u32 plttBaseAddr, GXTexFmt texfmt);
static inline void * G3_GetDLStart (const GXDLInfo * info)
{
return (void *)info->bottom;
}
static inline u32 G3_GetDLLength (const GXDLInfo * info)
{
return info->length;
}
static inline u32 G3_GetDLSize (const GXDLInfo * info)
{
SDK_ASSERT((u32)info->bottom < (u32)info->curr_param);
if ((u32)info->curr_cmd & 3) {
return (u32)((u32)info->curr_param - (u32)info->bottom);
} else {
return (u32)((u32)info->curr_cmd - (u32)info->bottom);
}
}
static inline GXTexPlttBaseParam G3_MakeTexPlttBaseParam (u32 plttBaseAddr, GXTexFmt texfmt)
{
SDK_ASSERT(GX_TEXFMT_NONE != texfmt);
if (GX_TEXFMT_PLTT4 == texfmt) {
SDK_ASSERT((plttBaseAddr & 0x7) == 0);
return (GXTexPlttBaseParam)(plttBaseAddr >> 3);
} else {
SDK_ASSERT((plttBaseAddr & 0xf) == 0);
return (GXTexPlttBaseParam)(plttBaseAddr >> 4);
}
}
#endif
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,317 @@
#ifndef NITRO_G3IMM_H_
#define NITRO_G3IMM_H_
#include <nitro/hw/ARM9/io_reg.h>
#include <nitro/gx/g3.h>
//#include <nitro/fx/fx_const.h>
#ifdef __cplusplus
extern "C" {
#endif
static void G3_Direct0(int op);
static void G3_Direct1(int op, u32 param0);
static void G3_Direct2(int op, u32 param0, u32 param1);
static void G3_Direct3(int op, u32 param0, u32 param1, u32 param2);
static void G3_MtxMode(GXMtxMode mode);
static void G3_PushMtx(void);
static void G3_PopMtx(int num);
static void G3_StoreMtx(int num);
static void G3_RestoreMtx(int num);
static void G3_Identity(void);
void G3_LoadMtx44(const MtxFx44 * m);
void G3_LoadMtx43(const MtxFx43 * m);
void G3_MultMtx44(const MtxFx44 * m);
void G3_MultMtx43(const MtxFx43 * m);
void G3_MultMtx33(const MtxFx33 * m);
void G3_MultTransMtx33(const MtxFx33 * mtx, const VecFx32 * trans);
static void G3_Scale(fx32 x, fx32 y, fx32 z);
static void G3_Translate(fx32 x, fx32 y, fx32 z);
static void G3_Color(GXRgb rgb);
static void G3_Normal(fx16 x, fx16 y, fx16 z);
static void G3_TexCoord(fx32 s, fx32 t);
static void G3_Vtx(fx16 x, fx16 y, fx16 z);
static void G3_Vtx10(fx16 x, fx16 y, fx16 z);
static void G3_VtxXY(fx16 x, fx16 y);
static void G3_VtxXZ(fx16 x, fx16 z);
static void G3_VtxYZ(fx16 y, fx16 z);
static void G3_VtxDiff(fx16 x, fx16 y, fx16 z);
static void G3_PolygonAttr(int light, GXPolygonMode polyMode, GXCull cullMode, int polygonID, int alpha, int misc);
static void G3_TexImageParam(GXTexFmt texFmt,
GXTexGen texGen,
GXTexSizeS s,
GXTexSizeT t,
GXTexRepeat repeat, GXTexFlip flip, GXTexPlttColor0 pltt0, u32 addr);
static void G3_TexPlttBase(u32 addr, GXTexFmt texfmt);
static void G3_MaterialColorDiffAmb(GXRgb diffuse, GXRgb ambient, BOOL IsSetVtxColor);
static void G3_MaterialColorSpecEmi(GXRgb specular, GXRgb emission, BOOL IsShininess);
static void G3_LightVector(GXLightId lightID, fx16 x, fx16 y, fx16 z);
static void G3_LightColor(GXLightId lightID, GXRgb rgb);
void G3_Shininess(const u32 * table);
static void G3_Begin(GXBegin primitive);
static void G3_End(void);
static void G3_SwapBuffers(GXSortMode am, GXBufferMode zw);
static void G3_ViewPort(int x1, int y1, int x2, int y2);
static void G3_BoxTest(const GXBoxTestParam * box);
static void G3_PositionTest(fx16 x, fx16 y, fx16 z);
static void G3_VectorTest(fx16 x, fx16 y, fx16 z);
static inline void G3_Direct0 (int op)
{
*(REGType32v *)(REG_MTX_MODE_ADDR + ((op - G3OP_MTX_MODE) * 4)) = 0;
}
static inline void G3_Direct1 (int op, u32 param0)
{
*(REGType32v *)(REG_MTX_MODE_ADDR + ((op - G3OP_MTX_MODE) * 4)) = param0;
}
static inline void G3_Direct2 (int op, u32 param0, u32 param1)
{
*(REGType32v *)(REG_MTX_MODE_ADDR + ((op - G3OP_MTX_MODE) * 4)) = param0;
*(REGType32v *)(REG_MTX_MODE_ADDR + ((op - G3OP_MTX_MODE) * 4)) = param1;
}
static inline void G3_Direct3 (int op, u32 param0, u32 param1, u32 param2)
{
*(REGType32v *)(REG_MTX_MODE_ADDR + ((op - G3OP_MTX_MODE) * 4)) = param0;
*(REGType32v *)(REG_MTX_MODE_ADDR + ((op - G3OP_MTX_MODE) * 4)) = param1;
*(REGType32v *)(REG_MTX_MODE_ADDR + ((op - G3OP_MTX_MODE) * 4)) = param2;
}
static inline void G3_MtxMode (GXMtxMode mode)
{
GX_MTXMODE_ASSERT(mode);
reg_G3_MTX_MODE = GX_PACK_MTXMODE_PARAM(mode);
}
static inline void G3_PushMtx ()
{
reg_G3_MTX_PUSH = 0;
}
static inline void G3_PopMtx (int num)
{
GX_MTX_POP_NUM_ASSERT(num);
reg_G3_MTX_POP = GX_PACK_POPMTX_PARAM(num);
}
static inline void G3_StoreMtx (int num)
{
GX_MTX_STORE_NUM_ASSERT(num);
reg_G3_MTX_STORE = GX_PACK_STOREMTX_PARAM(num);
}
static inline void G3_RestoreMtx (int num)
{
GX_MTX_RESTORE_NUM_ASSERT(num);
reg_G3_MTX_RESTORE = GX_PACK_RESTOREMTX_PARAM(num);
}
static inline void G3_Identity ()
{
reg_G3_MTX_IDENTITY = 0;
}
static inline void G3_Scale (fx32 x, fx32 y, fx32 z)
{
reg_G3_MTX_SCALE = (u32)x;
reg_G3_MTX_SCALE = (u32)y;
reg_G3_MTX_SCALE = (u32)z;
}
static inline void G3_Translate (fx32 x, fx32 y, fx32 z)
{
reg_G3_MTX_TRANS = (u32)x;
reg_G3_MTX_TRANS = (u32)y;
reg_G3_MTX_TRANS = (u32)z;
}
static inline void G3_Color (GXRgb rgb)
{
GXRGB_ASSERT(rgb);
reg_G3_COLOR = GX_PACK_COLOR_PARAM(rgb);
}
static inline void G3_Normal (fx16 x, fx16 y, fx16 z)
{
SDK_MINMAX_ASSERT(x, -FX16_ONE, FX16_ONE - 1);
SDK_MINMAX_ASSERT(y, -FX16_ONE, FX16_ONE - 1);
SDK_MINMAX_ASSERT(z, -FX16_ONE, FX16_ONE - 1);
reg_G3_NORMAL = GX_PACK_NORMAL_PARAM(x, y, z);
}
static inline void G3_TexCoord (fx32 s, fx32 t)
{
SDK_MINMAX_ASSERT(s, -2048 * FX32_ONE, 2048 * FX32_ONE - 1);
SDK_MINMAX_ASSERT(t, -2048 * FX32_ONE, 2048 * FX32_ONE - 1);
reg_G3_TEXCOORD = GX_PACK_TEXCOORD_PARAM(s, t);
}
static inline void G3_Vtx (fx16 x, fx16 y, fx16 z)
{
reg_G3_VTX_16 = GX_FX16PAIR(x, y);
reg_G3_VTX_16 = (u32)(u16)z;
}
static inline void G3_Vtx10 (fx16 x, fx16 y, fx16 z)
{
reg_G3_VTX_10 = GX_PACK_VTX10_PARAM(x, y, z);
}
static inline void G3_VtxXY (fx16 x, fx16 y)
{
reg_G3_VTX_XY = GX_PACK_VTXXY_PARAM(x, y);
}
static inline void G3_VtxXZ (fx16 x, fx16 z)
{
reg_G3_VTX_XZ = GX_PACK_VTXXZ_PARAM(x, z);
}
static inline void G3_VtxYZ (fx16 y, fx16 z)
{
reg_G3_VTX_YZ = GX_PACK_VTXYZ_PARAM(y, z);
}
static inline void G3_VtxDiff (fx16 x, fx16 y, fx16 z)
{
SDK_MINMAX_ASSERT(x, (fx16)0xfe00, (fx16)0x1ff);
SDK_MINMAX_ASSERT(y, (fx16)0xfe00, (fx16)0x1ff);
SDK_MINMAX_ASSERT(z, (fx16)0xfe00, (fx16)0x1ff);
reg_G3_VTX_DIFF = GX_PACK_VTXDIFF_PARAM(x, y, z);
}
static inline void G3_PolygonAttr (int light, GXPolygonMode polyMode, GXCull cullMode, int polygonID, int alpha, int misc
)
{
GX_LIGHTMASK_ASSERT(light);
GX_POLYGONMODE_ASSERT(polyMode);
GX_CULL_ASSERT(cullMode);
GX_POLYGON_ATTR_POLYGONID_ASSERT(polygonID);
GX_POLYGON_ATTR_ALPHA_ASSERT(alpha);
reg_G3_POLYGON_ATTR = GX_PACK_POLYGONATTR_PARAM(light,
polyMode, cullMode, polygonID, alpha, misc);
}
static inline void G3_TexImageParam (GXTexFmt texFmt,
GXTexGen texGen,
GXTexSizeS s,
GXTexSizeT t,
GXTexRepeat repeat,
GXTexFlip flip, GXTexPlttColor0 pltt0, u32 addr)
{
GX_TEXREPEAT_ASSERT(repeat);
GX_TEXFLIP_ASSERT(flip);
GX_TEXSIZE_S_ASSERT(s);
GX_TEXSIZE_T_ASSERT(t);
GX_TEXFMT_ASSERT(texFmt);
GX_TEXPLTTCOLOR0_ASSERT(pltt0);
GX_TEXGEN_ASSERT(texGen);
GX_TEXIMAGE_PARAM_ADDR_ASSERT(addr);
reg_G3_TEXIMAGE_PARAM = GX_PACK_TEXIMAGE_PARAM(texFmt, texGen, s, t, repeat, flip, pltt0, addr);
}
static inline void G3_TexPlttBase (u32 addr, GXTexFmt texfmt)
{
u32 param = GX_PACK_TEXPLTTBASE_PARAM(addr, texfmt);
GX_TEXPLTTBASEPARAM_ASSERT(param);
reg_G3_TEXPLTT_BASE = param;
}
static inline void G3_MaterialColorDiffAmb (GXRgb diffuse, GXRgb ambient, BOOL IsSetVtxColor)
{
GXRGB_ASSERT(diffuse);
GXRGB_ASSERT(ambient);
reg_G3_DIF_AMB = GX_PACK_DIFFAMB_PARAM(diffuse, ambient, IsSetVtxColor);
}
static inline void G3_MaterialColorSpecEmi (GXRgb specular, GXRgb emission, BOOL IsShininess)
{
GXRGB_ASSERT(specular);
GXRGB_ASSERT(emission);
reg_G3_SPE_EMI = GX_PACK_SPECEMI_PARAM(specular, emission, IsShininess);
}
static inline void G3_LightVector (GXLightId lightID, fx16 x, fx16 y, fx16 z)
{
GX_LIGHTID_ASSERT(lightID);
SDK_MINMAX_ASSERT(x, -FX16_ONE, FX16_ONE - 1);
SDK_MINMAX_ASSERT(y, -FX16_ONE, FX16_ONE - 1);
SDK_MINMAX_ASSERT(z, -FX16_ONE, FX16_ONE - 1);
reg_G3_LIGHT_VECTOR = GX_PACK_LIGHTVECTOR_PARAM(lightID, x, y, z);
}
static inline void G3_LightColor (GXLightId lightID, GXRgb rgb)
{
GX_LIGHTID_ASSERT(lightID);
GXRGB_ASSERT(rgb);
reg_G3_LIGHT_COLOR = GX_PACK_LIGHTCOLOR_PARAM(lightID, rgb);
}
static inline void G3_Begin (GXBegin primitive)
{
GX_BEGIN_ASSERT(primitive);
reg_G3_BEGIN_VTXS = GX_PACK_BEGIN_PARAM(primitive);
}
static inline void G3_End (void)
{
reg_G3_END_VTXS = 0;
}
static inline void G3_SwapBuffers (GXSortMode am, GXBufferMode zw)
{
GX_SORTMODE_ASSERT(am);
GX_BUFFERMODE_ASSERT(zw);
reg_G3_SWAP_BUFFERS = GX_PACK_SWAPBUFFERS_PARAM(am, zw);
}
static inline void G3_ViewPort (int x1, int y1, int x2, int y2)
{
GX_VIEWPORT_ASSERT(x1, y1, x2, y2);
reg_G3_VIEWPORT = GX_PACK_VIEWPORT_PARAM(x1, y1, x2, y2);
}
static inline void G3_BoxTest (const GXBoxTestParam * box)
{
reg_G3_BOX_TEST = box->val[0];
reg_G3_BOX_TEST = box->val[1];
reg_G3_BOX_TEST = box->val[2];
}
static inline void G3_PositionTest (fx16 x, fx16 y, fx16 z)
{
reg_G3_POS_TEST = GX_FX16PAIR(x, y);
reg_G3_POS_TEST = (u32)(u16)z;
}
static inline void G3_VectorTest (fx16 x, fx16 y, fx16 z)
{
SDK_MINMAX_ASSERT(x, -FX16_ONE, FX16_ONE - 1);
SDK_MINMAX_ASSERT(y, -FX16_ONE, FX16_ONE - 1);
SDK_MINMAX_ASSERT(z, -FX16_ONE, FX16_ONE - 1);
reg_G3_VEC_TEST = GX_PACK_VECTORTEST_PARAM(x, y, z);
}
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -232,7 +232,7 @@ Static main
Object lib/NitroSDK/asm/gx_vramcnt.o
Object lib/NitroSDK/asm/gx_bgcnt.o
Object lib/NitroSDK/src/gx/g2.o
Object lib/NitroSDK/asm/g3imm.o
Object lib/NitroSDK/src/gx/g3imm.o
Object lib/NitroSDK/asm/g3x.o
Object lib/NitroSDK/asm/g3_util.o
Object lib/NitroSDK/asm/gx_load2d.o