pureikyubu/SRC/DolwinVideo/GPRegs.h
2020-04-26 14:41:34 +03:00

866 lines
30 KiB
C

// all gfx registers definitions here
#pragma once
typedef void (*GXDrawDoneCallback)();
typedef void (*GXDrawTokenCallback)(uint16_t tokenValue);
extern GXDrawDoneCallback GxDrawDone;
extern GXDrawTokenCallback GxDrawToken;
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// register names
// ---------------------------------------------------------------------------
// CP Memory Space
// ---------------------------------------------------------------------------
#define CP_MATIDX_A 0x30 // Pos / Texture Matrix Index 0-3
#define CP_MATIDX_B 0x40 // Texture Matrix Index 4-7
#define CP_VCD_LO 0x50 // Vertex Descriptor (VCD) low
#define CP_VCD_HI 0x60 // Vertex Descriptor (VCD) high
#define CP_VAT0_A 0x70 // Vertex Attribute Table (VAT) group A
#define CP_VAT1_A 0x71
#define CP_VAT2_A 0x72
#define CP_VAT3_A 0x73
#define CP_VAT4_A 0x74
#define CP_VAT5_A 0x75
#define CP_VAT6_A 0x76
#define CP_VAT7_A 0x77
#define CP_VAT0_B 0x80 // Vertex Attribute Table (VAT) group B
#define CP_VAT1_B 0x81
#define CP_VAT2_B 0x82
#define CP_VAT3_B 0x83
#define CP_VAT4_B 0x84
#define CP_VAT5_B 0x85
#define CP_VAT6_B 0x86
#define CP_VAT7_B 0x87
#define CP_VAT0_C 0x90 // Vertex Attribute Table (VAT) group C
#define CP_VAT1_C 0x91
#define CP_VAT2_C 0x92
#define CP_VAT3_C 0x93
#define CP_VAT4_C 0x94
#define CP_VAT5_C 0x95
#define CP_VAT6_C 0x96
#define CP_VAT7_C 0x97
#define CP_ARRAY_BASE 0xA0
#define CP_ARRAY_STRIDE 0xB0
#define CP_NUMCOL 0xB2 // number of colors attributes
#define CP_NUMTEX 0xB4 // number of texcoord attributes
// vertex attribute types (from VCD register)
enum
{
VCD_NONE = 0, // attribute stage disabled
VCD_DIRECT, // direct data
VCD_INDX8, // 8-bit indexed data
VCD_INDX16 // 16-bit indexed data (rare)
};
// vertex attribute "cnt" (from VAT register)
enum
{
VCNT_POS_XY = 0,
VCNT_POS_XYZ = 1,
VCNT_NRM_XYZ = 0,
VCNT_NRM_NBT = 1, // index is NBT
VCNT_NRM_NBT3 = 2, // index is one from N/B/T
VCNT_CLR_RGB = 0,
VCNT_CLR_RGBA = 1,
VCNT_TEX_S = 0,
VCNT_TEX_ST = 1
};
// vertex attribute "fmt" (from VAT register)
enum
{
VFMT_U8 = 0,
VFMT_S8 = 1,
VFMT_U16 = 2,
VFMT_S16 = 3,
VFMT_F32 = 4,
VFMT_RGB565 = 0,
VFMT_RGB8 = 1,
VFMT_RGBX8 = 2,
VFMT_RGBA4 = 3,
VFMT_RGBA6 = 4,
VFMT_RGBA8 = 5
};
// ---------------------------------------------------------------------------
// BP Memory Space
// ---------------------------------------------------------------------------
#define BP_GEN_MODE 0x00
#define BP_SU_SCIS0 0x20
#define BP_SU_SCIS1 0x21
#define SU_SSIZE_0 0x30 // s/t coord scale
#define SU_TSIZE_0 0x31
#define SU_SSIZE_1 0x32
#define SU_TSIZE_1 0x33
#define SU_SSIZE_2 0x34
#define SU_TSIZE_2 0x35
#define SU_SSIZE_3 0x36
#define SU_TSIZE_3 0x37
#define SU_SSIZE_4 0x38
#define SU_TSIZE_4 0x39
#define SU_SSIZE_5 0x3A
#define SU_TSIZE_5 0x3B
#define SU_SSIZE_6 0x3C
#define SU_TSIZE_6 0x3D
#define SU_SSIZE_7 0x3E
#define SU_TSIZE_7 0x3F
#define PE_ZMODE_ID 0x40
#define PE_CMODE0 0x41
#define PE_CMODE1 0x42
#define PE_DONE 0x45
#define PE_TOKEN 0x47
#define PE_TOKEN_INT 0x48
#define PE_COPY_CLEAR_AR 0x4F
#define PE_COPY_CLEAR_GB 0x50
#define PE_COPY_CLEAR_Z 0x51
#define TX_LOADTLUT0 0x64 // tlut base in memory
#define TX_LOADTLUT1 0x65 // tmem ofs and size
#define TX_SETMODE_0_0 0x80 // wrap (mode)
#define TX_SETMODE_0_1 0x81
#define TX_SETMODE_0_2 0x82
#define TX_SETMODE_0_3 0x83
#define TX_SETMODE_0_4 0xA0
#define TX_SETMODE_0_5 0xA1
#define TX_SETMODE_0_6 0xA2
#define TX_SETMODE_0_7 0xA3
#define TX_SETIMAGE_0_0 0x88 // texture width, height, format
#define TX_SETIMAGE_0_1 0x89
#define TX_SETIMAGE_0_2 0x8A
#define TX_SETIMAGE_0_3 0x8B
#define TX_SETIMAGE_0_4 0xA8
#define TX_SETIMAGE_0_5 0xA9
#define TX_SETIMAGE_0_6 0xAA
#define TX_SETIMAGE_0_7 0xAB
#define TX_SETIMAGE_3_0 0x94 // texture_map >> 5, physical address
#define TX_SETIMAGE_3_1 0x95
#define TX_SETIMAGE_3_2 0x96
#define TX_SETIMAGE_3_3 0x97
#define TX_SETIMAGE_3_4 0xB4
#define TX_SETIMAGE_3_5 0xB5
#define TX_SETIMAGE_3_6 0xB6
#define TX_SETIMAGE_3_7 0xB7
#define TX_SETTLUT_0 0x98 // bind tlut with texture
#define TX_SETTLUT_1 0x99
#define TX_SETTLUT_2 0x9A
#define TX_SETTLUT_3 0x9B
#define TX_SETTLUT_4 0xB8
#define TX_SETTLUT_5 0xB9
#define TX_SETTLUT_6 0xBA
#define TX_SETTLUT_7 0xBB
enum
{
TLUT_16 = 1,
TLUT_32 = 2,
TLUT_64 = 4,
TLUT_128 = 8,
TLUT_256 = 16,
TLUT_512 = 32,
TLUT_1024 = 64,
TLUT_2048 = 128,
TLUT_4096 = 256,
TLUT_8192 = 512,
TLUT_16384 = 1024
};
// ---------------------------------------------------------------------------
// XF Memory Space
// ---------------------------------------------------------------------------
// 0x0000...0x03FF - Matrix memory.
// This block is formed by the matrix memory.
// Its address range is 0 to 1 k, but only 256 entries are used.
// This memory is organized in a 64 entry by four 32b words
// 0x0400...0x04FF - Normal matrix memory.
// This block of memory is the normal matrix memory.
// It is organized as 32 rows of 3 words
// 0x0500...0x05FF - Texture post-transform matrix memory.
// This block of memory holds the dual texture transform matrices.
// The format is identical to the first block of matrix memory.
// There are also 64 rows of 4 words for these matrices
// Light parameter registers.
// LIGHT 0 DATA
#define XF_LIGHT0 0x0600 // reserved
#define XF_0x0601 0x0601 // reserved
#define XF_0x0602 0x0602 // reserved
#define XF_LIGHT0_RGBA 0x0603 // RGBA (8b/comp)
#define XF_LIGHT0_A0 0x0604 // cos atten a0
#define XF_LIGHT0_A1 0x0605 // cos atten a1
#define XF_LIGHT0_A2 0x0606 // cos atten a2
#define XF_LIGHT0_K0 0x0607 // dist atten k0
#define XF_LIGHT0_K1 0x0608 // dist atten k1
#define XF_LIGHT0_K2 0x0609 // dist atten k2
#define XF_LIGHT0_LPX 0x060A // x light pos, or inf 1dir x
#define XF_LIGHT0_LPY 0x060B // y light pos, or inf 1dir y
#define XF_LIGHT0_LPZ 0x060C // z light pos, or inf 1dir z
#define XF_LIGHT0_DHX 0x060D // light dir x, or 1/2 angle x
#define XF_LIGHT0_DHY 0x060E // light dir y, or 1/2 angle y
#define XF_LIGHT0_DHZ 0x060F // light dir z, or 1/2 angle z
// LIGHT 1 DATA
#define XF_LIGHT1 0x0610 // reserved
#define XF_0x0611 0x0611 // reserved
#define XF_0x0612 0x0612 // reserved
#define XF_LIGHT1_RGBA 0x0613 // RGBA (8b/comp)
#define XF_LIGHT1_A0 0x0614 // cos atten a0
#define XF_LIGHT1_A1 0x0615 // cos atten a1
#define XF_LIGHT1_A2 0x0616 // cos atten a2
#define XF_LIGHT1_K0 0x0617 // dist atten k0
#define XF_LIGHT1_K1 0x0618 // dist atten k1
#define XF_LIGHT1_K2 0x0619 // dist atten k2
#define XF_LIGHT1_LPX 0x061A // x light pos, or inf 1dir x
#define XF_LIGHT1_LPY 0x061B // y light pos, or inf 1dir y
#define XF_LIGHT1_LPZ 0x061C // z light pos, or inf 1dir z
#define XF_LIGHT1_DHX 0x061D // light dir x, or 1/2 angle x
#define XF_LIGHT1_DHY 0x061E // light dir y, or 1/2 angle y
#define XF_LIGHT1_DHZ 0x061F // light dir z, or 1/2 angle z
// LIGHT 2 DATA
#define XF_LIGHT2 0x0620 // reserved
#define XF_0x0621 0x0621 // reserved
#define XF_0x0622 0x0622 // reserved
#define XF_LIGHT2_RGBA 0x0623 // RGBA (8b/comp)
#define XF_LIGHT2_A0 0x0624 // cos atten a0
#define XF_LIGHT2_A1 0x0625 // cos atten a1
#define XF_LIGHT2_A2 0x0626 // cos atten a2
#define XF_LIGHT2_K0 0x0627 // dist atten k0
#define XF_LIGHT2_K1 0x0628 // dist atten k1
#define XF_LIGHT2_K2 0x0629 // dist atten k2
#define XF_LIGHT2_LPX 0x062A // x light pos, or inf 1dir x
#define XF_LIGHT2_LPY 0x062B // y light pos, or inf 1dir y
#define XF_LIGHT2_LPZ 0x062C // z light pos, or inf 1dir z
#define XF_LIGHT2_DHX 0x062D // light dir x, or 1/2 angle x
#define XF_LIGHT2_DHY 0x062E // light dir y, or 1/2 angle y
#define XF_LIGHT2_DHZ 0x062F // light dir z, or 1/2 angle z
// LIGHT 3 DATA
#define XF_LIGHT3 0x0630 // reserved
#define XF_0x0631 0x0631 // reserved
#define XF_0x0632 0x0632 // reserved
#define XF_LIGHT3_RGBA 0x0633 // RGBA (8b/comp)
#define XF_LIGHT3_A0 0x0634 // cos atten a0
#define XF_LIGHT3_A1 0x0635 // cos atten a1
#define XF_LIGHT3_A2 0x0636 // cos atten a2
#define XF_LIGHT3_K0 0x0637 // dist atten k0
#define XF_LIGHT3_K1 0x0638 // dist atten k1
#define XF_LIGHT3_K2 0x0639 // dist atten k2
#define XF_LIGHT3_LPX 0x063A // x light pos, or inf 1dir x
#define XF_LIGHT3_LPY 0x063B // y light pos, or inf 1dir y
#define XF_LIGHT3_LPZ 0x063C // z light pos, or inf 1dir z
#define XF_LIGHT3_DHX 0x063D // light dir x, or 1/2 angle x
#define XF_LIGHT3_DHY 0x063E // light dir y, or 1/2 angle y
#define XF_LIGHT3_DHZ 0x063F // light dir z, or 1/2 angle z
// LIGHT 4 DATA
#define XF_LIGHT4 0x0640 // reserved
#define XF_0x0641 0x0641 // reserved
#define XF_0x0642 0x0642 // reserved
#define XF_LIGHT4_RGBA 0x0643 // RGBA (8b/comp)
#define XF_LIGHT4_A0 0x0644 // cos atten a0
#define XF_LIGHT4_A1 0x0645 // cos atten a1
#define XF_LIGHT4_A2 0x0646 // cos atten a2
#define XF_LIGHT4_K0 0x0647 // dist atten k0
#define XF_LIGHT4_K1 0x0648 // dist atten k1
#define XF_LIGHT4_K2 0x0649 // dist atten k2
#define XF_LIGHT4_LPX 0x064A // x light pos, or inf 1dir x
#define XF_LIGHT4_LPY 0x064B // y light pos, or inf 1dir y
#define XF_LIGHT4_LPZ 0x064C // z light pos, or inf 1dir z
#define XF_LIGHT4_DHX 0x064D // light dir x, or 1/2 angle x
#define XF_LIGHT4_DHY 0x064E // light dir y, or 1/2 angle y
#define XF_LIGHT4_DHZ 0x064F // light dir z, or 1/2 angle z
// LIGHT 5 DATA
#define XF_LIGHT5 0x0650 // reserved
#define XF_0x0651 0x0651 // reserved
#define XF_0x0652 0x0652 // reserved
#define XF_LIGHT5_RGBA 0x0653 // RGBA (8b/comp)
#define XF_LIGHT5_A0 0x0654 // cos atten a0
#define XF_LIGHT5_A1 0x0655 // cos atten a1
#define XF_LIGHT5_A2 0x0656 // cos atten a2
#define XF_LIGHT5_K0 0x0657 // dist atten k0
#define XF_LIGHT5_K1 0x0658 // dist atten k1
#define XF_LIGHT5_K2 0x0659 // dist atten k2
#define XF_LIGHT5_LPX 0x065A // x light pos, or inf 1dir x
#define XF_LIGHT5_LPY 0x065B // y light pos, or inf 1dir y
#define XF_LIGHT5_LPZ 0x065C // z light pos, or inf 1dir z
#define XF_LIGHT5_DHX 0x065D // light dir x, or 1/2 angle x
#define XF_LIGHT5_DHY 0x065E // light dir y, or 1/2 angle y
#define XF_LIGHT5_DHZ 0x065F // light dir z, or 1/2 angle z
// LIGHT 6 DATA
#define XF_LIGHT6 0x0660 // reserved
#define XF_0x0661 0x0661 // reserved
#define XF_0x0662 0x0662 // reserved
#define XF_LIGHT6_RGBA 0x0663 // RGBA (8b/comp)
#define XF_LIGHT6_A0 0x0664 // cos atten a0
#define XF_LIGHT6_A1 0x0665 // cos atten a1
#define XF_LIGHT6_A2 0x0666 // cos atten a2
#define XF_LIGHT6_K0 0x0667 // dist atten k0
#define XF_LIGHT6_K1 0x0668 // dist atten k1
#define XF_LIGHT6_K2 0x0669 // dist atten k2
#define XF_LIGHT6_LPX 0x066A // x light pos, or inf 1dir x
#define XF_LIGHT6_LPY 0x066B // y light pos, or inf 1dir y
#define XF_LIGHT6_LPZ 0x066C // z light pos, or inf 1dir z
#define XF_LIGHT6_DHX 0x066D // light dir x, or 1/2 angle x
#define XF_LIGHT6_DHY 0x066E // light dir y, or 1/2 angle y
#define XF_LIGHT6_DHZ 0x066F // light dir z, or 1/2 angle z
// LIGHT 7 DATA
#define XF_LIGHT7 0x0670 // reserved
#define XF_0x0671 0x0671 // reserved
#define XF_0x0672 0x0672 // reserved
#define XF_LIGHT7_RGBA 0x0673 // RGBA (8b/comp)
#define XF_LIGHT7_A0 0x0674 // cos atten a0
#define XF_LIGHT7_A1 0x0675 // cos atten a1
#define XF_LIGHT7_A2 0x0676 // cos atten a2
#define XF_LIGHT7_K0 0x0677 // dist atten k0
#define XF_LIGHT7_K1 0x0678 // dist atten k1
#define XF_LIGHT7_K2 0x0679 // dist atten k2
#define XF_LIGHT7_LPX 0x067A // x light pos, or inf 1dir x
#define XF_LIGHT7_LPY 0x067B // y light pos, or inf 1dir y
#define XF_LIGHT7_LPZ 0x067C // z light pos, or inf 1dir z
#define XF_LIGHT7_DHX 0x067D // light dir x, or 1/2 angle x
#define XF_LIGHT7_DHY 0x067E // light dir y, or 1/2 angle y
#define XF_LIGHT7_DHZ 0x067F // light dir z, or 1/2 angle z
// XF 0x0680...0x07FF reserved
// Color channel registers.
#define XF_NUMCOLS 0x1009 // Selects the number of output colors
#define XF_AMBIENT0 0x100A // RGBA (8b/comp) ambient color 0
#define XF_AMBIENT1 0x100B // RGBA (8b/comp) ambient color 1
#define XF_MATERIAL0 0x100C // RGBA (8b/comp) material color 0
#define XF_MATERIAL1 0x100D // RGBA (8b/comp) material color 1
#define XF_COLOR0CNTL 0x100E // COLOR0 channel control
#define XF_COLOR1CNTL 0x100F // COLOR1 channel control
#define XF_ALPHA0CNTL 0x1010 // ALPHA0 channel control
#define XF_ALPHA1CNTL 0x1011 // ALPHA1 channel control
#define XF_DUALTEX 0x1012 // enable tex post-transform
#define XF_MATINDEX_A 0x1018 // Position / Tex coord 0-3 mat index
#define XF_MATINDEX_B 0x1019 // Tex coord 4-7 mat index
#define XF_VIEWPORT 0x101A
#define XF_VIEWPORT_SCALE_X (XF_VIEWPORT + 0)
#define XF_VIEWPORT_SCALE_Y (XF_VIEWPORT + 1)
#define XF_VIEWPORT_SCALE_Z (XF_VIEWPORT + 2)
#define XF_VIEWPORT_OFFSET_X (XF_VIEWPORT + 3)
#define XF_VIEWPORT_OFFSET_Y (XF_VIEWPORT + 4)
#define XF_VIEWPORT_OFFSET_Z (XF_VIEWPORT + 5)
#define XF_PROJECTION 0x1020 // Projection data (not matrix)
#define XF_NUMTEX 0x103F // active texgens
#define XF_TEXGEN0 0x1040
#define XF_TEXGEN1 0x1041
#define XF_TEXGEN2 0x1042
#define XF_TEXGEN3 0x1043
#define XF_TEXGEN4 0x1044
#define XF_TEXGEN5 0x1045
#define XF_TEXGEN6 0x1046
#define XF_TEXGEN7 0x1047
#define XF_DUALGEN0 0x1050 // dual texgen setup
#define XF_DUALGEN1 0x1051
#define XF_DUALGEN2 0x1052
#define XF_DUALGEN3 0x1053
#define XF_DUALGEN4 0x1054
#define XF_DUALGEN5 0x1055
#define XF_DUALGEN6 0x1056
#define XF_DUALGEN7 0x1057
// texgen inrow enum
enum
{
XF_TEXGEN_GEOM_INROW = 0,
XF_TEXGEN_NORMAL_INROW,
XF_TEXGEN_COLORS_INROW,
XF_TEXGEN_BINORMAL_T_INROW,
XF_TEXGEN_BINORMAL_B_INROW,
XF_TEXGEN_TEX0_INROW,
XF_TEXGEN_TEX1_INROW,
XF_TEXGEN_TEX2_INROW,
XF_TEXGEN_TEX3_INROW,
XF_TEXGEN_TEX4_INROW,
XF_TEXGEN_TEX5_INROW,
XF_TEXGEN_TEX6_INROW,
XF_TEXGEN_TEX7_INROW
// other reserved for future
};
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// helpful structures
// VCD_LO register layout
typedef union
{
struct
{
unsigned pmidx : 1;
unsigned t0midx : 1;
unsigned t1midx : 1;
unsigned t2midx : 1;
unsigned t3midx : 1;
unsigned t4midx : 1;
unsigned t5midx : 1;
unsigned t6midx : 1;
unsigned t7midx : 1;
unsigned pos : 2;
unsigned nrm : 2;
unsigned col0 : 2;
unsigned col1 : 2;
unsigned rsrv : 15;
};
uint32_t vcdlo;
} VCD_LO;
// VCD_HI register layout
typedef union
{
struct
{
unsigned tex0 : 2;
unsigned tex1 : 2;
unsigned tex2 : 2;
unsigned tex3 : 2;
unsigned tex4 : 2;
unsigned tex5 : 2;
unsigned tex6 : 2;
unsigned tex7 : 2;
unsigned rsrv : 16;
};
uint32_t vcdhi;
} VCD_HI;
// VAT_A register layout
typedef union
{
struct
{
unsigned poscnt : 1;
unsigned posfmt : 3;
unsigned posshft : 5;
unsigned nrmcnt : 1;
unsigned nrmfmt : 3;
unsigned col0cnt : 1;
unsigned col0fmt : 3;
unsigned col1cnt : 1;
unsigned col1fmt : 3;
unsigned tex0cnt : 1;
unsigned tex0fmt : 3;
unsigned tex0shft : 5;
unsigned bytedeq : 1; // always 1
unsigned nrmidx3 : 1;
};
uint32_t vata;
} VAT_A;
// VAT_B register layout
typedef union
{
struct
{
unsigned tex1cnt : 1;
unsigned tex1fmt : 3;
unsigned tex1shft : 5;
unsigned tex2cnt : 1;
unsigned tex2fmt : 3;
unsigned tex2shft : 5;
unsigned tex3cnt : 1;
unsigned tex3fmt : 3;
unsigned tex3shft : 5;
unsigned tex4cnt : 1;
unsigned tex4fmt : 3;
unsigned vcache : 1; // always 1
};
uint32_t vatb;
} VAT_B;
// VAT_C register layout
typedef union
{
struct
{
unsigned tex4shft : 5;
unsigned tex5cnt : 1;
unsigned tex5fmt : 3;
unsigned tex5shft : 5;
unsigned tex6cnt : 1;
unsigned tex6fmt : 3;
unsigned tex6shft : 5;
unsigned tex7cnt : 1;
unsigned tex7fmt : 3;
unsigned tex7shft : 5;
};
uint32_t vatc;
} VAT_C;
// texture params
typedef union
{
struct
{
unsigned width : 10;
unsigned height : 10;
unsigned fmt : 4;
unsigned op : 8;
};
uint32_t hex;
} TEXIMAGE0;
// texture location
typedef union
{
struct
{
unsigned base : 24;
unsigned op : 8;
};
uint32_t hex;
} TEXIMAGE3;
// gen mode
typedef union
{
struct
{
unsigned ntex : 4;
unsigned ncol : 5;
unsigned msen : 1;
unsigned ntev : 4;
unsigned cull : 2;
unsigned nbmp : 3;
unsigned zfreeze : 5;
unsigned rid : 8; // reserved
};
uint32_t hex;
} GenMode;
// texture generator setup
typedef union
{
struct
{
unsigned rsrv : 1;
unsigned pojection : 1; // 0:st (2x4), 1:stq (3x4)
unsigned in_form : 2; // 0:(a,b,1,1), 1:(a,b,c,1)
unsigned type : 3; // 0:regular, 1:bump, 2,3: toon
unsigned src_row : 5; // see INROW
unsigned emboss_src : 3;
unsigned emboss_light : 3;
unsigned rid : 14;
};
uint32_t hex;
} TexGen;
// texture mode 0
typedef union
{
struct
{
unsigned wrap_s : 2;
unsigned wrap_t : 2;
unsigned mag : 1;
unsigned min : 3;
unsigned diaglod : 1;
unsigned lodbias : 10;
unsigned maxaniso : 2;
unsigned lodclamp : 3;
unsigned rid : 8;
};
uint32_t hex;
} TexMode0;
typedef union
{
struct
{
unsigned dualidx : 6; // index in texture memory
unsigned unused : 2;
unsigned norm : 1; // normalize result
unsigned rsrv : 23;
};
uint32_t hex;
} DualTex;
// 0x64
typedef union
{
struct
{
unsigned base : 20;
};
uint32_t hex;
} LoadTlut0;
// 0x65
typedef union
{
struct
{
unsigned tmem : 10;
unsigned count : 10;
};
uint32_t hex;
} LoadTlut1;
typedef union
{
struct
{
unsigned tmem : 10;
unsigned fmt : 2;
};
uint32_t hex;
} SetTlut;
// 0x20
typedef union
{
struct
{
unsigned suy : 12;
unsigned sux : 12;
unsigned rid : 8;
};
uint32_t scis0;
} SU_SCIS0;
// 0x21
typedef union
{
struct
{
unsigned suh : 12;
unsigned suw : 12;
unsigned rid : 8;
};
uint32_t scis1;
} SU_SCIS1;
// 0x3n
typedef union
{
struct
{
unsigned ssize : 16;
unsigned dontcare : 16;
};
uint32_t hex;
} SU_TS0;
typedef union
{
struct
{
unsigned tsize : 16;
unsigned dontcare : 16;
};
uint32_t hex;
} SU_TS1;
// 0x40
typedef union
{
struct
{
unsigned enable : 1;
unsigned func : 3;
unsigned mask : 1;
};
uint32_t hex;
} PE_ZMODE;
// 0x41
typedef union
{
struct
{
unsigned blend_en : 1;
unsigned logop_en : 1;
unsigned dither_en : 1;
unsigned col_mask : 1;
unsigned alpha_mask : 1;
unsigned dfactor : 3;
unsigned sfactor : 3;
unsigned blebdop : 1;
unsigned logop : 12;
unsigned rsrv : 8;
};
uint32_t hex;
} ColMode0;
// 0x42
typedef union
{
struct
{
unsigned const_alpha_en : 1;
unsigned rsrv : 7;
unsigned const_alpha : 8;
unsigned rid : 16;
};
uint32_t hex;
} ColMode1;
// local light descriptor
typedef struct
{
uint32_t rsrv[3]; // reserved, dont use !
Color color; // light source color
float a[3], k[3]; // attenuation constants
float pos[3], dir[3]; // light position / direction
} LightObj;
// color channel descriptor
typedef union
{
struct
{
unsigned MatSrc : 1; // 0: use register, 1: use vertex color
unsigned LightFunc : 1; // 0: Use 1.0, 1: Use Illum0
unsigned Light0 : 1; // 1: use light
unsigned Light1 : 1; // 1: use light
unsigned Light2 : 1; // 1: use light
unsigned Light3 : 1; // 1: use light
unsigned AmbSrc : 1; // 0: use register, 1: use vertex color
unsigned DiffuseAtten : 2; // 0: Use 1.0, 1: N.L signed, 2: N.L clamped
unsigned Atten : 1; // 1: atten enable
unsigned AttenSelect : 1; // 0: specular, 1: spotlight
unsigned Light4 : 1; // 1: use light
unsigned Light5 : 1; // 1: use light
unsigned Light6 : 1; // 1: use light
unsigned Light7 : 1; // 1: use light
unsigned rsrv : 17;
};
uint32_t Chan;
} ColorChan;
// matrix index A
typedef union
{
struct
{
unsigned pos : 6;
unsigned tex0 : 6;
unsigned tex1 : 6;
unsigned tex2 : 6;
unsigned tex3 : 6;
unsigned rsrv : 2;
};
uint32_t matidx;
} MATIDX_A;
// matrix index B
typedef union
{
struct
{
unsigned tex4 : 6;
unsigned tex5 : 6;
unsigned tex6 : 6;
unsigned tex7 : 6;
unsigned rsrv : 8;
};
uint32_t matidx;
} MATIDX_B;
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// register memory space description
typedef struct
{
MATIDX_A matidxA; // 0x20
MATIDX_B matidxB; // 0x30
unsigned posidx, texidx[8]; // pos / tex index
VCD_LO vcdLo; // 0x50
VCD_HI vcdHi; // 0x60
VAT_A vatA[8]; // 0x70...0x77
VAT_B vatB[8]; // 0x80...0x87
VAT_C vatC[8]; // 0x90...0x97
uint8_t *arbase[VTX_MAX_ATTR]; // 0xA0...0xAB
uint32_t arstride[VTX_MAX_ATTR]; // 0xB0...0xBB
} CPMemory;
typedef struct
{
GenMode genmode; // 0x00
SU_SCIS0 scis0; // 0x20
SU_SCIS1 scis1; // 0x21
SU_TS0 ssize[8]; // 0x3n
SU_TS1 tsize[8]; // 0x3n
PE_ZMODE zmode; // 0x40
ColMode0 cmode0; // 0x41
ColMode1 cmode1; // 0x42
uint16_t tokint; // 0x48
LoadTlut0 loadtlut0; // 0x64
LoadTlut1 loadtlut1; // 0x65
TexMode0 texmode0[8]; // 0x80-0x83, 0xA0-0xA3
TEXIMAGE0 teximg0[8]; // 0x88-0x8B, 0xA8-0xAB
TEXIMAGE3 teximg3[8]; // 0x94-0x97, 0xB4-0xB7
SetTlut settlut[8]; // 0x98-0x9B, 0xB8-0xBB
BOOL valid[4][8];
} BPMemory;
typedef struct
{
float posmtx[64][4]; // 0x0000...0x03FF
float nrmmtx[32][3]; // 0x0400...0x04FF
float postmtx[32][3]; // 0x0500...0x05FF
unsigned posidx, texidx[8]; // pos index, tex index
LightObj light[8]; // 0x0600...0x07FF
uint32_t numcol; // 0x1009
Color ambient[2]; // 0x100A, 0x100B
Color material[2]; // 0x100C, 0x100D
ColorChan color[2]; // 0x100E, 0x100F
BOOL colmask[8][2]; // light color mask
ColorChan alpha[2]; // 0x1010, 0x1011
BOOL amask[8][2]; // light alpha mask
uint32_t dualtex; // 0x1012
MATIDX_A matidxA; // 0x1018
MATIDX_B matidxB; // 0x1019
float vp_scale[3], vp_offs[3];// 0x101A...0x101F
uint32_t numtex; // 0x103F
TexGen texgen[8]; // 0x1040...0x1047
DualTex dual[8]; // 0x1050...0x1057
} XFMemory;
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// interface to application
// export register tables
extern CPMemory cpRegs;
extern BPMemory bpRegs;
extern XFMemory xfRegs;
extern uint8_t *RAM;
#define RAMMASK 0x03FFFFFF
// registers loading (using fifo writes)
void loadCPReg(size_t index, uint32_t value);
void loadBPReg(size_t index, uint32_t value);
void loadXFRegs(size_t startIndex, size_t amount, GX::FifoProcessor* fifo);
extern uint32_t cpLoads, bpLoads, xfLoads;