rt64/include/rt64_extended_gbi.h
Wiseguy eb981eb47b
Add egbi command to bypass the segment table for K0 CPU addresses to allow extending rdram (#54)
* Add egbi command to bypass the segment table for K0 CPU addresses to allow extending rdram

* Fix capitalization of RDRAM for consistency
2024-07-05 22:13:53 -03:00

519 lines
17 KiB
C

//
// RT64
//
#ifndef RT64_EXTENDED_GBI
#define RT64_EXTENDED_GBI
// G_SPNOOP on F3D and F3DEX2.
#ifdef F3DEX_GBI_2
# define RT64_HOOK_OPCODE 0xE0
#else
# define RT64_HOOK_OPCODE 0x00
#endif
#define RT64_HOOK_OP_GETVERSION 0x0
#define RT64_HOOK_OP_ENABLE 0x1
#define RT64_HOOK_OP_DISABLE 0x2
#define RT64_HOOK_OP_DL 0x3
#define RT64_HOOK_OP_BRANCH 0x4
// 0x5254 for ASCII "RT" followed by 0x64.
#define RT64_HOOK_MAGIC_NUMBER 0x525464
#ifndef RT64_EXTENDED_OPCODE
// TODO: Define defaults here based on the GBI.
# define RT64_EXTENDED_OPCODE 0x64
#endif
#define G_EX_VERSION 0x1
#define G_EX_NOOP 0x000000
#define G_EX_PRINT 0x000001
#define G_EX_TEXRECT_V1 0x000002
#define G_EX_FILLRECT_V1 0x000003
#define G_EX_SETVIEWPORT_V1 0x000004
#define G_EX_SETSCISSOR_V1 0x000005
#define G_EX_SETRECTALIGN_V1 0x000006
#define G_EX_SETVIEWPORTALIGN_V1 0x000007
#define G_EX_SETSCISSORALIGN_V1 0x000008
#define G_EX_SETREFRESHRATE_V1 0x000009
#define G_EX_VERTEXZTEST_V1 0x00000A
#define G_EX_ENDVERTEXZTEST_V1 0x00000B
#define G_EX_MATRIXGROUP_V1 0x00000C
#define G_EX_POPMATRIXGROUP_V1 0x00000D
#define G_EX_FORCEUPSCALE2D_V1 0x00000E
#define G_EX_FORCETRUEBILERP_V1 0x00000F
#define G_EX_FORCESCALELOD_V1 0x000010
#define G_EX_FORCEBRANCH_V1 0x000011
#define G_EX_SETRENDERTORAM_V1 0x000012
#define G_EX_EDITGROUPBYADDRESS_V1 0x000013
#define G_EX_VERTEX_V1 0x000014
#define G_EX_PUSHVIEWPORT_V1 0x000015
#define G_EX_POPVIEWPORT_V1 0x000016
#define G_EX_PUSHSCISSOR_V1 0x000017
#define G_EX_POPSCISSOR_V1 0x000018
#define G_EX_PUSHOTHERMODE_V1 0x000019
#define G_EX_POPOTHERMODE_V1 0x00001A
#define G_EX_PUSHCOMBINE_V1 0x00001B
#define G_EX_POPCOMBINE_V1 0x00001C
#define G_EX_PUSHPROJMATRIX_V1 0x00001D
#define G_EX_POPPROJMATRIX_V1 0x00001E
#define G_EX_PUSHENVCOLOR_V1 0x00001F
#define G_EX_POPENVCOLOR_V1 0x000020
#define G_EX_PUSHBLENDCOLOR_V1 0x000021
#define G_EX_POPBLENDCOLOR_V1 0x000022
#define G_EX_PUSHFOGCOLOR_V1 0x000023
#define G_EX_POPFOGCOLOR_V1 0x000024
#define G_EX_PUSHFILLCOLOR_V1 0x000025
#define G_EX_POPFILLCOLOR_V1 0x000026
#define G_EX_PUSHPRIMCOLOR_V1 0x000027
#define G_EX_POPPRIMCOLOR_V1 0x000028
#define G_EX_PUSHGEOMETRYMODE_V1 0x000029
#define G_EX_POPGEOMETRYMODE_V1 0x00002A
#define G_EX_SETDITHERNOISESTRENGTH_V1 0x00002B
#define G_EX_SETRDRAMEXTENDED_V1 0x00002C
#define G_EX_MAX 0x00002D
#define G_EX_ORIGIN_NONE 0x800
#define G_EX_ORIGIN_LEFT 0x0
#define G_EX_ORIGIN_CENTER 0x200
#define G_EX_ORIGIN_RIGHT 0x400
#define G_EX_NOPUSH 0x0
#define G_EX_PUSH 0x1
#define G_EX_ID_IGNORE 0x0
#define G_EX_ID_AUTO 0xFFFFFFFF
#define G_EX_COMPONENT_SKIP 0x0
#define G_EX_COMPONENT_INTERPOLATE 0x1
#define G_EX_COMPONENT_AUTO 0x2
#define G_EX_INTERPOLATE_SIMPLE 0x0
#define G_EX_INTERPOLATE_DECOMPOSE 0x1
#define G_EX_ORDER_LINEAR 0x0
#define G_EX_ORDER_AUTO 0x1
#define G_EX_EDIT_NONE 0x0
#define G_EX_EDIT_ALLOW 0x1
#define G_EX_BILERP_NONE 0x0
#define G_EX_BILERP_ONLY 0x1
#define G_EX_BILERP_ALL 0x2
// Represents the 8-byte commands in the F3D microcode family
typedef union {
struct {
unsigned word0;
unsigned word1;
} values;
unsigned long long dummy; // Force to 8-byte alignment
} GfxCommand;
typedef struct {
short ob[3];
unsigned short flag;
short tc[2];
unsigned char cn[4];
short obp[3];
} VertexEXColor;
typedef struct {
short ob[3];
unsigned short flag;
short tc[2];
signed char n[3];
unsigned char a;
short obp[3];
} VertexEXNormal;
typedef union {
VertexEXColor v;
VertexEXNormal n;
long long alignment[3];
} VertexEX;
#define PARAM(value, bits, shift) \
((unsigned) (((unsigned)(value) & ((1U << (bits)) - 1U)) << (shift)))
#define DOWHILE(code) \
do { code } while (0)
#define G_EX_WRITECOMMAND(cmd, _word0, _word1) \
{ \
cmd->values.word0 = _word0; \
cmd->values.word1 = _word1; \
}
#define G_EX_COMMAND1(cmd, _word0, _word1) \
DOWHILE( \
GfxCommand *_cmd = (GfxCommand*)(cmd); \
G_EX_WRITECOMMAND((_cmd + 0), _word0, _word1) \
)
#define G_EX_COMMAND2(cmd, _word0, _word1, _word2, _word3) \
DOWHILE( \
GfxCommand *_cmd = (GfxCommand*)(cmd); \
(void)(cmd); \
G_EX_WRITECOMMAND((_cmd + 0), _word0, _word1) \
G_EX_WRITECOMMAND((_cmd + 1), _word2, _word3) \
)
#define G_EX_COMMAND3(cmd, _word0, _word1, _word2, _word3, _word4, _word5) \
DOWHILE( \
GfxCommand *_cmd = (GfxCommand*)(cmd); \
(void)(cmd); \
(void)(cmd); \
G_EX_WRITECOMMAND((_cmd + 0), _word0, _word1) \
G_EX_WRITECOMMAND((_cmd + 1), _word2, _word3) \
G_EX_WRITECOMMAND((_cmd + 2), _word4, _word5) \
)
#define G_EX_COMMAND4(cmd, _word0, _word1, _word2, _word3, _word4, _word5, _word6, _word7) \
DOWHILE( \
GfxCommand *_cmd = (GfxCommand*)(cmd); \
(void)(cmd); \
(void)(cmd); \
(void)(cmd); \
G_EX_WRITECOMMAND(cmd_, _word0, _word1) \
G_EX_WRITECOMMAND(cmd_, _word2, _word3) \
G_EX_WRITECOMMAND(cmd_, _word4, _word5) \
G_EX_WRITECOMMAND(cmd_, _word6, _word7) \
)
#define gEXGetVersion(cmd, ret) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_HOOK_OPCODE, 8, 24) | PARAM(RT64_HOOK_MAGIC_NUMBER, 24, 0), \
PARAM(RT64_HOOK_OP_GETVERSION, 4, 28) | PARAM(ret, 28, 0))
#define gEXEnable(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_HOOK_OPCODE, 8, 24) | PARAM(RT64_HOOK_MAGIC_NUMBER, 24, 0), \
PARAM(RT64_HOOK_OP_ENABLE, 4, 28) | PARAM(RT64_EXTENDED_OPCODE, 8, 0))
#define gEXDisable(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_HOOK_OPCODE, 8, 24) | PARAM(RT64_HOOK_MAGIC_NUMBER, 24, 0), \
PARAM(RT64_HOOK_OP_DISABLE, 4, 28))
#define gEXBranchList(cmd, dlist) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_HOOK_OPCODE, 8, 24) | PARAM(RT64_HOOK_MAGIC_NUMBER, 24, 0), \
PARAM(RT64_HOOK_OP_BRANCH, 4, 28) | PARAM(dlist, 28, 0))
#define gEXDisplayList(cmd, dlist) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_HOOK_OPCODE, 8, 24) | PARAM(RT64_HOOK_MAGIC_NUMBER, 24, 0), \
PARAM(RT64_HOOK_OP_DL, 4, 28) | PARAM(dlist, 28, 0))
#define gEXNoOp(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_NOOP, 24, 0), \
0)
#define gEXPrint(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PRINT, 24, 0), \
0)
#define gEXTextureRectangle(cmd, lorigin, rorigin, ulx, uly, lrx, lry, tile, s, t, dsdx, dtdy) \
G_EX_COMMAND3(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_TEXRECT_V1, 24, 0), \
PARAM(tile, 3, 0) | PARAM(lorigin, 12, 3) | PARAM(rorigin, 12, 15) | PARAM(0, 5, 27), \
\
PARAM(ulx, 16, 16) | PARAM(uly, 16, 0), \
PARAM(lrx, 16, 16) | PARAM(lry, 16, 0), \
\
PARAM(s, 16, 16) | PARAM(t, 16, 0), \
PARAM(dsdx, 16, 16) | PARAM(dtdy, 16, 0) \
)
#define gEXViewport(cmd, origin, vp) \
G_EX_COMMAND2(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETVIEWPORT_V1, 24, 0), \
PARAM(origin, 12, 0), \
\
0, \
(unsigned)vp \
)
#define gEXSetScissor(cmd, mode, lorigin, rorigin, ulx, uly, lrx, lry) \
G_EX_COMMAND2(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETSCISSOR_V1, 24, 0), \
PARAM(mode, 2, 0) | PARAM(lorigin, 12, 2) | PARAM(rorigin, 12, 14), \
\
PARAM((ulx) * 4, 16, 16) | PARAM((uly) * 4, 16, 0), \
PARAM((lrx) * 4, 16, 16) | PARAM((lry) * 4, 16, 0) \
)
#define gEXSetRectAlign(cmd, lorigin, rorigin, ulxOffset, ulyOffset, lrxOffset, lryOffset) \
G_EX_COMMAND2(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETRECTALIGN_V1, 24, 0), \
PARAM(lorigin, 12, 0) | PARAM(rorigin, 12, 12), \
\
PARAM((ulxOffset), 16, 16) | PARAM((ulyOffset), 16, 0), \
PARAM((lrxOffset), 16, 16) | PARAM((lryOffset), 16, 0) \
)
#define gEXSetViewportAlign(cmd, origin, xOffset, yOffset) \
G_EX_COMMAND2(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETVIEWPORTALIGN_V1, 24, 0), \
PARAM(origin, 12, 0), \
\
PARAM((xOffset), 16, 16) | PARAM((yOffset), 16, 0), \
0 \
)
#define gEXSetScissorAlign(cmd, lorigin, rorigin, ulxOffset, ulyOffset, lrxOffset, lryOffset, ulxBound, ulyBound, lrxBound, lryBound) \
G_EX_COMMAND3(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETSCISSORALIGN_V1, 24, 0), \
PARAM(lorigin, 12, 0) | PARAM(rorigin, 12, 12), \
\
PARAM((ulxOffset) * 4, 16, 16) | PARAM((ulyOffset) * 4, 16, 0), \
PARAM((lrxOffset) * 4, 16, 16) | PARAM((lryOffset) * 4, 16, 0), \
\
PARAM((ulxBound) * 4, 16, 16) | PARAM((ulyBound) * 4, 16, 0), \
PARAM((lrxBound) * 4, 16, 16) | PARAM((lryBound) * 4, 16, 0) \
)
#define gEXSetRefreshRate(cmd, refresh_rate) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETREFRESHRATE_V1, 24, 0), \
PARAM(refresh_rate, 16, 0) \
)
#define gEXVertexZTest(cmd, vertex_index) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_VERTEXZTEST_V1, 24, 0), \
PARAM(vertex_index, 8, 0) \
)
#define gEXEndVertexZTest(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_ENDVERTEXZTEST_V1, 24, 0), \
0 \
)
#define gEXMatrixGroup(cmd, id, mode, push, proj, pos, rot, scale, skew, persp, vert, tile, order, edit) \
G_EX_COMMAND2(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_MATRIXGROUP_V1, 24, 0), \
id, \
PARAM(push, 1, 0) | PARAM((proj) != 0, 1, 1) | PARAM(mode, 1, 2) | PARAM(pos, 2, 3) | PARAM(rot, 2, 5) | PARAM(scale, 2, 7) | PARAM(skew, 2, 9) | PARAM(persp, 2, 11) | PARAM(vert, 2, 13) | PARAM(tile, 2, 15) | PARAM(order, 2, 17) | PARAM(edit, 1, 19), \
0 \
)
#define gEXMatrixGroupSimple(cmd, id, push, proj, pos, rot, persp, vert, tile, order, edit) \
gEXMatrixGroup(cmd, id, G_EX_INTERPOLATE_SIMPLE, push, proj, pos, rot, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, persp, vert, tile, order, edit)
#define gEXMatrixGroupDecomposed(cmd, id, push, proj, pos, rot, scale, skew, persp, vert, tile, order, edit) \
gEXMatrixGroup(cmd, id, G_EX_INTERPOLATE_DECOMPOSE, push, proj, pos, rot, scale, skew, persp, vert, tile, order, edit)
#define gEXMatrixGroupNoInterpolate(cmd, push, proj, edit) \
gEXMatrixGroup(cmd, G_EX_ID_IGNORE, G_EX_INTERPOLATE_SIMPLE, push, proj, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_ORDER_LINEAR, edit)
#define gEXPopMatrixGroup(cmd, proj) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPMATRIXGROUP_V1, 24, 0), \
PARAM(1, 8, 0) | PARAM(proj, 1, 8) \
)
#define gEXPopMatrixGroupN(cmd, proj, count) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPMATRIXGROUP_V1, 24, 0), \
PARAM(count, 8, 0) | PARAM(proj, 1, 8) \
)
#define gEXForceUpscale2D(cmd, force) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_FORCEUPSCALE2D_V1, 24, 0), \
PARAM(force, 1, 0) \
)
#define gEXForceTrueBilerp(cmd, mode) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_FORCETRUEBILERP_V1, 24, 0), \
PARAM(mode, 2, 0) \
)
#define gEXForceScaleLOD(cmd, force) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_FORCESCALELOD_V1, 24, 0), \
PARAM(force, 1, 0) \
)
#define gEXForceBranch(cmd, force) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_FORCEBRANCH_V1, 24, 0), \
PARAM(force, 1, 0) \
)
#define gEXSetRenderToRAM(cmd, render) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETRENDERTORAM_V1, 24, 0), \
PARAM(render, 1, 0) \
)
#define gEXEditGroupByAddress(cmd, address, mode, push, proj, pos, rot, scale, skew, persp, vert, tile, order) \
G_EX_COMMAND2(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_EDITGROUPBYADDRESS_V1, 24, 0), \
(unsigned)(address), \
PARAM(push, 1, 0) | PARAM((proj) != 0, 1, 1) | PARAM(mode, 1, 2) | PARAM(pos, 2, 3) | PARAM(rot, 2, 5) | PARAM(scale, 2, 7) | PARAM(skew, 2, 9) | PARAM(persp, 2, 11) | PARAM(vert, 2, 13) | PARAM(tile, 2, 15) | PARAM(order, 2, 17) | PARAM(G_EX_EDIT_ALLOW, 1, 18), \
0 \
)
#define gEXVertexV1(cmd, vtx, count, v0) \
G_EX_COMMAND2(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_VERTEX_V1, 24, 0), \
PARAM((v0)+(n), 7, 1) | PARAM(n, 8, 12), \
0, \
(unsigned)(vtx) \
)
#define gEXPushViewport(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHVIEWPORT_V1, 24, 0), \
0 \
)
#define gEXPopViewport(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPVIEWPORT_V1, 24, 0), \
0 \
)
#define gEXPushScissor(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHSCISSOR_V1, 24, 0), \
0 \
)
#define gEXPopScissor(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPSCISSOR_V1, 24, 0), \
0 \
)
#define gEXPushOtherMode(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHOTHERMODE_V1, 24, 0), \
0 \
)
#define gEXPopOtherMode(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPOTHERMODE_V1, 24, 0), \
0 \
)
#define gEXPushCombineMode(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHCOMBINE_V1, 24, 0), \
0 \
)
#define gEXPopCombineMode(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPCOMBINE_V1, 24, 0), \
0 \
)
#define gEXPushProjectionMatrix(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHPROJMATRIX_V1, 24, 0), \
0 \
)
#define gEXPopProjectionMatrix(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPPROJMATRIX_V1, 24, 0), \
0 \
)
#define gEXPushEnvColor(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHENVCOLOR_V1, 24, 0), \
0 \
)
#define gEXPopEnvColor(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPENVCOLOR_V1, 24, 0), \
0 \
)
#define gEXPushBlendColor(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHBLENDCOLOR_V1, 24, 0), \
0 \
)
#define gEXPopBlendColor(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPBLENDCOLOR_V1, 24, 0), \
0 \
)
#define gEXPushFogColor(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHFOGCOLOR_V1, 24, 0), \
0 \
)
#define gEXPopFogColor(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPFOGCOLOR_V1, 24, 0), \
0 \
)
#define gEXPushFillColor(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHFILLCOLOR_V1, 24, 0), \
0 \
)
#define gEXPopFillColor(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPFILLCOLOR_V1, 24, 0), \
0 \
)
#define gEXPushPrimColor(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHPRIMCOLOR_V1, 24, 0), \
0 \
)
#define gEXPopPrimColor(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPPRIMCOLOR_V1, 24, 0), \
0 \
)
#define gEXPushGeometryMode(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHGEOMETRYMODE_V1, 24, 0), \
0 \
)
#define gEXPopGeometryMode(cmd) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPGEOMETRYMODE_V1, 24, 0), \
0 \
)
#define gEXSetDitherNoiseStrength(cmd, value) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETDITHERNOISESTRENGTH_V1, 24, 0), \
PARAM((value) * 1024, 16, 0) \
)
#define gEXSetRDRAMExtended(cmd, isExtended) \
G_EX_COMMAND1(cmd, \
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETRDRAMEXTENDED_V1, 24, 0), \
PARAM(isExtended, 1, 0) \
)
#endif // RT64_EXTENDED_GBI