]> Chaos Git - corbenik/ctrulib.git/commitdiff
updated gpu.c to use new convention
authorsmea <smealum@gmail.com>
Sat, 3 Jan 2015 05:14:03 +0000 (21:14 -0800)
committersmea <smealum@gmail.com>
Sat, 3 Jan 2015 05:14:03 +0000 (21:14 -0800)
libctru/include/3ds/gpu/registers.h
libctru/source/gpu/gpu.c

index abbf61ee37f9a413a2e0fe20e0ae19ff823dcc7b..1390a8fc828850c3909f684e1e8054bb6a259c3d 100644 (file)
 #define GPUREG_01FD 0x01FD\r
 #define GPUREG_01FE 0x01FE\r
 #define GPUREG_01FF 0x01FF\r
-#define pipeline 0xGeometry\r
 #define GPUREG_ATTRIBBUFFERS_LOC 0x0200\r
 #define GPUREG_ATTRIBBUFFERS_FORMAT_LOW 0x0201\r
 #define GPUREG_ATTRIBBUFFERS_FORMAT_HIGH 0x0202\r
index b1f3dbbe7286c8f5e095e24ed9035b70db180692..e32265b2a33185ec5127856d8509cc38cbd11095 100644 (file)
@@ -90,11 +90,11 @@ void GPUCMD_Add(u32 header, u32* param, u32 paramlength)
 
 void GPUCMD_Finalize()
 {
-       GPUCMD_AddSingleParam(0x0008025E, 0x00000000);
-       GPUCMD_AddSingleParam(0x000F0111, 0x00000001);
-       GPUCMD_AddSingleParam(0x000F0110, 0x00000001);
-       GPUCMD_AddSingleParam(0x000F0010, 0x12345678);
-       GPUCMD_AddSingleParam(0x000F0010, 0x12345678); //not the cleanest way of guaranteeing 0x10-byte size but whatever good enough for now
+       GPUCMD_AddMaskedWrite(GPUREG_PRIMITIVE_CONFIG, 0x8, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_0111, 0x00000001);
+       GPUCMD_AddWrite(GPUREG_0110, 0x00000001);
+       GPUCMD_AddWrite(GPUREG_FINALIZE, 0x12345678);
+       GPUCMD_AddWrite(GPUREG_FINALIZE, 0x12345678); //not the cleanest way of guaranteeing 0x10-byte size but whatever good enough for now
 }
 
 extern u32 gpuResetSequence[];
@@ -109,55 +109,55 @@ void GPU_Reset(u32* gxbuf, u32* gpuBuf, u32 gpuBufSize)
 
        GPUCMD_SetBuffer(gpuBuf, gpuBufSize, 0);
 
-       GPUCMD_AddSingleParam(0x000D0080, 0x00011000);
+       GPUCMD_AddMaskedWrite(GPUREG_TEXUNITS_CONFIG, 0xD, 0x00011000);
 
-       for(i=0x1;i<0xC;i++)GPUCMD_AddSingleParam(0x000F0080+i, 0x00000000);
-       GPUCMD_AddSingleParam(0x000F008C, 0x00FF0000);
-       GPUCMD_AddSingleParam(0x000F008D, 0x00000000);
-       GPUCMD_AddSingleParam(0x000F008E, 0x00000000);
+       for(i=0x1;i<0xC;i++)GPUCMD_AddWrite(GPUREG_TEXUNITS_CONFIG+i, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_008C, 0x00FF0000);
+       GPUCMD_AddWrite(GPUREG_008D, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_TEXUNIT0_TYPE, 0x00000000);
 
-       for(i=0x0;i<0xF;i++)GPUCMD_AddSingleParam(0x000F0090+i, 0x00000000);
+       for(i=0x0;i<0xF;i++)GPUCMD_AddWrite(GPUREG_0090+i, 0x00000000);
 
-       GPUCMD_AddSingleParam(0x00010245, 0x00000001);
-       GPUCMD_AddSingleParam(0x00010244, 0x00000000);
-       GPUCMD_AddSingleParam(0x00080289, 0x80000000);
-       GPUCMD_AddSingleParam(0x000B0229, 0x00000000);
+       GPUCMD_AddMaskedWrite(GPUREG_0245, 0x1, 0x00000001);
+       GPUCMD_AddMaskedWrite(GPUREG_0244, 0x1, 0x00000000);
+       GPUCMD_AddMaskedWrite(GPUREG_GSH_INPUTBUFFER_CONFIG, 0x8, 0x80000000);
+       GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG, 0xB, 0x00000000);
 
-       GPUCMD_AddSingleParam(0x000F0252, 0x00000000);
-       GPUCMD_AddSingleParam(0x000F0251, 0x00000000);
-       GPUCMD_AddSingleParam(0x000F0254, 0x00000000);
-       GPUCMD_AddSingleParam(0x00010253, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_0252, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_0251, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_0254, 0x00000000);
+       GPUCMD_AddMaskedWrite(GPUREG_0253, 0x1, 0x00000000);
 
-       GPUCMD_AddSingleParam(0x000F0242, 0x00000000);
-       GPUCMD_AddSingleParam(0x000F024A, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_0242, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_024A, 0x00000000);
 
-       GPUCMD_AddSingleParam(0x0005025E, 0x00000000);
+       GPUCMD_AddMaskedWrite(GPUREG_PRIMITIVE_CONFIG, 0x5, 0x00000000);
 
-       GPUCMD_Add(0x800F0101, zero, 0x00000007);
+       GPUCMD_AddIncrementalWrites(GPUREG_BLEND_CONFIG, zero, 0x00000007);
 
-       GPUCMD_AddSingleParam(0x000F011F, 0x00010140);
-       GPUCMD_AddSingleParam(0x000F0100, 0x00E40100);
-       GPUCMD_AddSingleParam(0x000F0101, 0x01010000);
-       GPUCMD_AddSingleParam(0x000F0107, 0x00001F40);
-       GPUCMD_AddSingleParam(0x000F0105, 0xFF00FF10);
+       GPUCMD_AddWrite(GPUREG_011F, 0x00010140);
+       GPUCMD_AddWrite(GPUREG_COLOROUTPUT_CONFIG, 0x00E40100);
+       GPUCMD_AddWrite(GPUREG_BLEND_CONFIG, 0x01010000);
+       GPUCMD_AddWrite(GPUREG_DEPTHTEST_CONFIG, 0x00001F40);
+       GPUCMD_AddWrite(GPUREG_STENCILTEST_CONFIG, 0xFF00FF10);
 
-       GPUCMD_AddSingleParam(0x00010061, 0x00000003);
-       GPUCMD_AddSingleParam(0x00010062, 0x00000000);
+       GPUCMD_AddMaskedWrite(GPUREG_0061, 0x1, 0x00000003);
+       GPUCMD_AddMaskedWrite(GPUREG_0062, 0x1, 0x00000000);
 
-       GPUCMD_AddSingleParam(0x000F0065, 0x00000000);
-       GPUCMD_AddSingleParam(0x000F0066, 0x00000000);
-       GPUCMD_AddSingleParam(0x000F0067, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_SCISSORTEST_MODE, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_SCISSORTEST_POS, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_SCISSORTEST_DIM, 0x00000000);
 
-       GPUCMD_AddSingleParam(0x00010118, 0x00000000);
-       GPUCMD_AddSingleParam(0x000F011B, 0x00000000);
+       GPUCMD_AddMaskedWrite(GPUREG_0118, 0x1, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_011B, 0x00000000);
 
-       GPUCMD_AddSingleParam(0x0007006A, 0x00FFFFFF);
+       GPUCMD_AddMaskedWrite(GPUREG_006A, 0x7, 0x00FFFFFF);
 
-       GPUCMD_AddSingleParam(0x000F0102, 0x00000003);
+       GPUCMD_AddWrite(GPUREG_COLORLOGICOP_CONFIG, 0x00000003);
 
-       GPUCMD_AddSingleParam(0x00080126, 0x03000000);
+       GPUCMD_AddMaskedWrite(GPUREG_0126, 0x8, 0x03000000);
 
-       GPUCMD_Add(0x800F0040, zero, 0x00000010);
+       GPUCMD_AddIncrementalWrites(GPUREG_FACECULLING_CONFIG, zero, 0x00000010);
 
        param[0x0]=0x1F1F1F1F;
        param[0x1]=0x1F1F1F1F;
@@ -166,54 +166,51 @@ void GPU_Reset(u32* gxbuf, u32* gpuBuf, u32 gpuBufSize)
        param[0x4]=0x1F1F1F1F;
        param[0x5]=0x1F1F1F1F;
        param[0x6]=0x1F1F1F1F;
-       GPUCMD_Add(0x800F0050, param, 0x00000007);
-
-       GPUCMD_AddSingleParam(0x000F0058, 0x00000100);
-       GPUCMD_AddSingleParam(0x000F004C, 0x00000001);
-       GPUCMD_AddSingleParam(0x000F006F, 0x00000000);
-
-       GPUCMD_AddSingleParam(0x00020060, 0x00000000);
-       GPUCMD_AddSingleParam(0x000C0069, 0x00020000);
-
-       GPUCMD_AddSingleParam(0x000F0113, 0x0000000F);
-       GPUCMD_AddSingleParam(0x000F0112, 0x0000000F);
-       GPUCMD_AddSingleParam(0x000F0114, 0x00000003);
-       GPUCMD_AddSingleParam(0x000F0115, 0x00000003);
-
-       GPUCMD_AddSingleParam(0x000F01C5, 0x00000000);
-       for(i=0;i<32;i++)GPUCMD_Add(0x800F01C8, zero, 0x00000008);
-       GPUCMD_AddSingleParam(0x000F01C5, 0x00000100);
-       for(i=0;i<32;i++)GPUCMD_Add(0x800F01C8, zero, 0x00000008);
-       GPUCMD_AddSingleParam(0x000F01C5, 0x00000200);
-       for(i=0;i<32;i++)GPUCMD_Add(0x800F01C8, zero, 0x00000008);
-       GPUCMD_AddSingleParam(0x000F01C5, 0x00000300);
-       for(i=0;i<32;i++)GPUCMD_Add(0x800F01C8, zero, 0x00000008);
-       GPUCMD_AddSingleParam(0x000F01C5, 0x00000400);
-       for(i=0;i<32;i++)GPUCMD_Add(0x800F01C8, zero, 0x00000008);
-       GPUCMD_AddSingleParam(0x000F01C5, 0x00000500);
-       for(i=0;i<32;i++)GPUCMD_Add(0x800F01C8, zero, 0x00000008);
-       GPUCMD_AddSingleParam(0x000F01C5, 0x00000600);
-       for(i=0;i<32;i++)GPUCMD_Add(0x800F01C8, zero, 0x00000008);
+       GPUCMD_AddIncrementalWrites(GPUREG_SH_OUTMAP_O0, param, 0x00000007);
+
+       GPUCMD_AddWrite(GPUREG_0058, 0x00000100);
+       GPUCMD_AddWrite(GPUREG_004C, 0x00000001);
+       GPUCMD_AddWrite(GPUREG_006F, 0x00000000);
+
+       GPUCMD_AddMaskedWrite(GPUREG_0060, 0x2, 0x00000000);
+       GPUCMD_AddMaskedWrite(GPUREG_0069, 0xC, 0x00020000);
+
+       GPUCMD_AddWrite(GPUREG_0113, 0x0000000F);
+       GPUCMD_AddWrite(GPUREG_0112, 0x0000000F);
+       GPUCMD_AddWrite(GPUREG_0114, 0x00000003);
+       GPUCMD_AddWrite(GPUREG_0115, 0x00000003);
+
+       GPUCMD_AddWrite(GPUREG_01C5, 0x00000000);
+       for(i=0;i<32;i++)GPUCMD_AddIncrementalWrites(GPUREG_01C8, zero, 0x00000008);
+       GPUCMD_AddWrite(GPUREG_01C5, 0x00000100);
+       for(i=0;i<32;i++)GPUCMD_AddIncrementalWrites(GPUREG_01C8, zero, 0x00000008);
+       GPUCMD_AddWrite(GPUREG_01C5, 0x00000200);
+       for(i=0;i<32;i++)GPUCMD_AddIncrementalWrites(GPUREG_01C8, zero, 0x00000008);
+       GPUCMD_AddWrite(GPUREG_01C5, 0x00000300);
+       for(i=0;i<32;i++)GPUCMD_AddIncrementalWrites(GPUREG_01C8, zero, 0x00000008);
+       GPUCMD_AddWrite(GPUREG_01C5, 0x00000400);
+       for(i=0;i<32;i++)GPUCMD_AddIncrementalWrites(GPUREG_01C8, zero, 0x00000008);
+       GPUCMD_AddWrite(GPUREG_01C5, 0x00000500);
+       for(i=0;i<32;i++)GPUCMD_AddIncrementalWrites(GPUREG_01C8, zero, 0x00000008);
+       GPUCMD_AddWrite(GPUREG_01C5, 0x00000600);
+       for(i=0;i<32;i++)GPUCMD_AddIncrementalWrites(GPUREG_01C8, zero, 0x00000008);
                
-       GPUCMD_AddSingleParam(0x000F0290, 0x80000000);
-       for(i=0;i<48;i++)GPUCMD_Add(0x800F0291, zero, 0x00000008);
-       GPUCMD_AddSingleParam(0x000F02CB, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_GSH_FLOATUNIFORM_CONFIG, 0x80000000);
+       for(i=0;i<48;i++)GPUCMD_AddIncrementalWrites(GPUREG_GSH_FLOATUNIFORM_DATA, zero, 0x00000008);
+       GPUCMD_AddWrite(GPUREG_VSH_CODETRANSFER_CONFIG, 0x00000000);
        for(i=0;i<4;i++)GPUCMD_Add(0x000F02CC, zero, 0x00000080);
-       GPUCMD_AddSingleParam(0x000F029B, 0x00000200);
+       GPUCMD_AddWrite(GPUREG_GSH_CODETRANSFER_CONFIG, 0x00000200);
 
        for(i=0;i<28;i++)GPUCMD_Add(0x000F029C, zero, 0x00000080);
+       GPUCMD_AddWrite(GPUREG_VSH_CODETRANSFER_END, 0x00000000);
 
-       GPUCMD_AddSingleParam(0x000F02BF, 0x00000000);
-       GPUCMD_AddSingleParam(0x000F02B1, 0x00000000);
-       GPUCMD_AddSingleParam(0x000F02B2, 0x00000000);
-       GPUCMD_AddSingleParam(0x000F02B3, 0x00000000);
-       GPUCMD_AddSingleParam(0x000F02B4, 0x00000000);
+       GPUCMD_AddIncrementalWrites(GPUREG_VSH_INTUNIFORM_I0, zero, 4);
 
        param[0x0]=0xFFFFFFFF;
        param[0x1]=0xFFFFFFFF;
-       GPUCMD_Add(0x800F028B, param, 0x00000002);
+       GPUCMD_AddIncrementalWrites(GPUREG_GSH_ATTRIBUTES_PERMUTATION_LOW, param, 0x00000002);
 
-       GPUCMD_Add(0x800F0205, zero, 0x00000024);
+       GPUCMD_AddIncrementalWrites(GPUREG_ATTRIBBUFFER0_CONFIG2, zero, 0x00000024);
 
        for(i=0;i<gpuResetSequenceLength;i++)GPUCMD_AddSingleParam(gpuResetSequence[i*2],gpuResetSequence[i*2+1]);
 
@@ -225,8 +222,8 @@ void GPU_SetUniform(u32 startreg, u32* data, u32 numreg)
 {
        if(!data)return;
 
-       GPUCMD_AddSingleParam(0x000F02C0, 0x80000000|startreg);
-       GPUCMD_Add(0x000F02C1, data, numreg*4);
+       GPUCMD_AddWrite(GPUREG_VSH_FLOATUNIFORM_CONFIG, 0x80000000|startreg);
+       GPUCMD_AddWrites(GPUREG_VSH_FLOATUNIFORM_DATA, data, numreg*4);
 }
 
 //TODO : fix
@@ -272,40 +269,40 @@ void GPU_SetViewport(u32* depthBuffer, u32* colorBuffer, u32 x, u32 y, u32 w, u3
        float fw=(float)w;
        float fh=(float)h;
 
-       GPUCMD_AddSingleParam(0x000F0111, 0x00000001);
-       GPUCMD_AddSingleParam(0x000F0110, 0x00000001);
+       GPUCMD_AddWrite(GPUREG_0111, 0x00000001);
+       GPUCMD_AddWrite(GPUREG_0110, 0x00000001);
 
        u32 f116e=0x01000000|(((h-1)&0xFFF)<<12)|(w&0xFFF);
 
        param[0x0]=((u32)depthBuffer)>>3;
        param[0x1]=((u32)colorBuffer)>>3;
        param[0x2]=f116e;
-       GPUCMD_Add(0x800F011C, param, 0x00000003);
+       GPUCMD_AddIncrementalWrites(GPUREG_DEPTHBUFFER_LOC, param, 0x00000003);
 
-       GPUCMD_AddSingleParam(0x000F006E, f116e);
-       GPUCMD_AddSingleParam(0x000F0116, 0x00000003); //depth buffer format
-       GPUCMD_AddSingleParam(0x000F0117, 0x00000002); //color buffer format
-       GPUCMD_AddSingleParam(0x000F011B, 0x00000000); //?
+       GPUCMD_AddWrite(GPUREG_006E, f116e);
+       GPUCMD_AddWrite(GPUREG_DEPTHBUFFER_FORMAT, 0x00000003); //depth buffer format
+       GPUCMD_AddWrite(GPUREG_COLORBUFFER_FORMAT, 0x00000002); //color buffer format
+       GPUCMD_AddWrite(GPUREG_011B, 0x00000000); //?
 
        param[0x0]=f32tof24(fw/2);
        param[0x1]=computeInvValue(fw);
        param[0x2]=f32tof24(fh/2);
        param[0x3]=computeInvValue(fh);
-       GPUCMD_Add(0x800F0041, param, 0x00000004);
+       GPUCMD_AddIncrementalWrites(GPUREG_0041, param, 0x00000004);
 
-       GPUCMD_AddSingleParam(0x000F0068, (y<<16)|(x&0xFFFF));
+       GPUCMD_AddWrite(GPUREG_0068, (y<<16)|(x&0xFFFF));
 
        param[0x0]=0x00000000;
        param[0x1]=0x00000000;
        param[0x2]=((h-1)<<16)|((w-1)&0xFFFF);
-       GPUCMD_Add(0x800F0065, param, 0x00000003);
+       GPUCMD_AddIncrementalWrites(GPUREG_SCISSORTEST_MODE, param, 0x00000003);
 
        //enable depth buffer
        param[0x0]=0x0000000F;
        param[0x1]=0x0000000F;
        param[0x2]=0x00000002;
        param[0x3]=0x00000002;
-       GPUCMD_Add(0x800F0112, param, 0x00000004);
+       GPUCMD_AddIncrementalWrites(GPUREG_0112, param, 0x00000004);
 }
 
 void GPU_SetScissorTest(GPU_SCISSORMODE mode, u32 x, u32 y, u32 w, u32 h)
@@ -315,59 +312,59 @@ void GPU_SetScissorTest(GPU_SCISSORMODE mode, u32 x, u32 y, u32 w, u32 h)
        param[0x0] = mode;
        param[0x1] = (y<<16)|(x&0xFFFF);
        param[0x2] = ((h-1)<<16)|((w-1)&0xFFFF);
-       GPUCMD_Add(0x800F0065, param, 0x00000003);
+       GPUCMD_AddIncrementalWrites(GPUREG_SCISSORTEST_MODE, param, 0x00000003);
 }
 
 void GPU_DepthRange(float nearVal, float farVal)
 {
-       GPUCMD_AddSingleParam(0x000F006D, 0x00000001); //?
-       GPUCMD_AddSingleParam(0x000F004D, f32tof24(nearVal));
-       GPUCMD_AddSingleParam(0x000F004E, f32tof24(farVal));
+       GPUCMD_AddWrite(GPUREG_006D, 0x00000001); //?
+       GPUCMD_AddWrite(GPUREG_DEPTHRANGE_NEAR, f32tof24(nearVal));
+       GPUCMD_AddWrite(GPUREG_DEPTHRANGE_FAR, f32tof24(farVal));
 }
 
 void GPU_SetAlphaTest(bool enable, GPU_TESTFUNC function, u8 ref)
 {
-       GPUCMD_AddSingleParam(0x000F0104, (enable&1)|((function&7)<<4)|(ref<<8));
+       GPUCMD_AddWrite(GPUREG_ALPHATEST_CONFIG, (enable&1)|((function&7)<<4)|(ref<<8));
 }
 
 void GPU_SetStencilTest(bool enable, GPU_TESTFUNC function, u8 ref, u8 mask, u8 replace)
 {
-       GPUCMD_AddSingleParam(0x000F0105, (enable&1)|((function&7)<<4)|(replace<<8)|(ref<<16)|(mask<<24));
+       GPUCMD_AddWrite(GPUREG_STENCILTEST_CONFIG, (enable&1)|((function&7)<<4)|(replace<<8)|(ref<<16)|(mask<<24));
 }
 
 void GPU_SetStencilOp(GPU_STENCILOP sfail, GPU_STENCILOP dfail, GPU_STENCILOP pass)
 {
-       GPUCMD_AddSingleParam(0x000F0106, sfail | (dfail << 4) | (pass << 8));
+       GPUCMD_AddWrite(GPUREG_STENCILOP_CONFIG, sfail | (dfail << 4) | (pass << 8));
 }
 
 void GPU_SetDepthTestAndWriteMask(bool enable, GPU_TESTFUNC function, GPU_WRITEMASK writemask)
 {
-       GPUCMD_AddSingleParam(0x000F0107, (enable&1)|((function&7)<<4)|(writemask<<8));
+       GPUCMD_AddWrite(GPUREG_DEPTHTEST_CONFIG, (enable&1)|((function&7)<<4)|(writemask<<8));
 }
 
 void GPU_SetAlphaBlending(GPU_BLENDEQUATION colorEquation, GPU_BLENDEQUATION alphaEquation, 
        GPU_BLENDFACTOR colorSrc, GPU_BLENDFACTOR colorDst, 
        GPU_BLENDFACTOR alphaSrc, GPU_BLENDFACTOR alphaDst)
 {
-       GPUCMD_AddSingleParam(0x000F0101, colorEquation | (alphaEquation<<8) | (colorSrc<<16) | (colorDst<<20) | (alphaSrc<<24) | (alphaDst<<28));
-       GPUCMD_AddSingleParam(0x00020100, 0x00000100);
+       GPUCMD_AddWrite(GPUREG_BLEND_CONFIG, colorEquation | (alphaEquation<<8) | (colorSrc<<16) | (colorDst<<20) | (alphaSrc<<24) | (alphaDst<<28));
+       GPUCMD_AddMaskedWrite(GPUREG_COLOROUTPUT_CONFIG, 0x2, 0x00000100);
 }
 
 void GPU_SetColorLogicOp(GPU_LOGICOP op)
 {
-       GPUCMD_AddSingleParam(0x000F0102, op);
-       GPUCMD_AddSingleParam(0x00020100, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_COLORLOGICOP_CONFIG, op);
+       GPUCMD_AddMaskedWrite(GPUREG_COLOROUTPUT_CONFIG, 0x2, 0x00000000);
 }
 
 void GPU_SetBlendingColor(u8 r, u8 g, u8 b, u8 a)
 {
-       GPUCMD_AddSingleParam(0x000F0103, r | (g << 8) | (b << 16) | (a << 24));
+       GPUCMD_AddWrite(GPUREG_BLEND_COLOR, r | (g << 8) | (b << 16) | (a << 24));
 }
 
 void GPU_SetTextureEnable(GPU_TEXUNIT units)
 {
-       GPUCMD_AddSingleParam(0x0002006F, units<<8);                    // enables texcoord outputs
-       GPUCMD_AddSingleParam(0x000F0080, 0x00011000|units);    // enables texture units
+       GPUCMD_AddMaskedWrite(GPUREG_006F, 0x2, units<<8);                      // enables texcoord outputs
+       GPUCMD_AddWrite(GPUREG_TEXUNITS_CONFIG, 0x00011000|units);      // enables texture units
 }
 
 void GPU_SetTexture(GPU_TEXUNIT unit, u32* data, u16 width, u16 height, u32 param, GPU_TEXCOLOR colorType)
@@ -375,24 +372,24 @@ void GPU_SetTexture(GPU_TEXUNIT unit, u32* data, u16 width, u16 height, u32 para
        switch (unit)
        {
        case GPU_TEXUNIT0:
-               GPUCMD_AddSingleParam(0x000F008E, colorType);
-               GPUCMD_AddSingleParam(0x000F0085, ((u32)data)>>3);
-               GPUCMD_AddSingleParam(0x000F0082, (width)|(height<<16));
-               GPUCMD_AddSingleParam(0x000F0083, param);
+               GPUCMD_AddWrite(GPUREG_TEXUNIT0_TYPE, colorType);
+               GPUCMD_AddWrite(GPUREG_TEXUNIT0_LOC, ((u32)data)>>3);
+               GPUCMD_AddWrite(GPUREG_TEXUNIT0_DIM, (width)|(height<<16));
+               GPUCMD_AddWrite(GPUREG_TEXUNIT0_PARAM, param);
                break;
                
        case GPU_TEXUNIT1:
-               GPUCMD_AddSingleParam(0x000F0096, colorType);
-               GPUCMD_AddSingleParam(0x000F0095, ((u32)data)>>3);
-               GPUCMD_AddSingleParam(0x000F0092, (width)|(height<<16));
-               GPUCMD_AddSingleParam(0x000F0093, param);
+               GPUCMD_AddWrite(GPUREG_TEXUNIT1_TYPE, colorType);
+               GPUCMD_AddWrite(GPUREG_TEXUNIT1_LOC, ((u32)data)>>3);
+               GPUCMD_AddWrite(GPUREG_TEXUNIT1_DIM, (width)|(height<<16));
+               GPUCMD_AddWrite(GPUREG_TEXUNIT1_PARAM, param);
                break;
                
        case GPU_TEXUNIT2:
-               GPUCMD_AddSingleParam(0x000F009E, colorType);
-               GPUCMD_AddSingleParam(0x000F009D, ((u32)data)>>3);
-               GPUCMD_AddSingleParam(0x000F009A, (width)|(height<<16));
-               GPUCMD_AddSingleParam(0x000F009B, param);
+               GPUCMD_AddWrite(GPUREG_TEXUNIT2_TYPE, colorType);
+               GPUCMD_AddWrite(GPUREG_TEXUNIT2_LOC, ((u32)data)>>3);
+               GPUCMD_AddWrite(GPUREG_TEXUNIT2_DIM, (width)|(height<<16));
+               GPUCMD_AddWrite(GPUREG_TEXUNIT2_PARAM, param);
                break;
        }
 }
@@ -427,23 +424,22 @@ void GPU_SetAttributeBuffers(u8 totalAttributes, u32* baseAddress, u64 attribute
                param[3*(i+1)+2]=(bufferNumAttributes[i]<<28)|((stride&0xFFF)<<16)|((bufferPermutations[i]>>32)&0xFFFF);
        }
 
-       GPUCMD_Add(0x800F0200, param, 0x00000027);
+       GPUCMD_AddIncrementalWrites(GPUREG_ATTRIBBUFFERS_LOC, param, 0x00000027);
 
-       GPUCMD_AddSingleParam(0x000B02B9, 0xA0000000|(totalAttributes-1));
-       GPUCMD_AddSingleParam(0x000F0242, (totalAttributes-1));
+       GPUCMD_AddMaskedWrite(GPUREG_VSH_INPUTBUFFER_CONFIG, 0xB, 0xA0000000|(totalAttributes-1));
+       GPUCMD_AddWrite(GPUREG_0242, (totalAttributes-1));
 
-       GPUCMD_AddSingleParam(0x000F02BB, attributePermutation&0xFFFFFFFF);
-       GPUCMD_AddSingleParam(0x000F02BC, (attributePermutation>>32)&0xFFFF);
+       GPUCMD_AddIncrementalWrites(GPUREG_VSH_ATTRIBUTES_PERMUTATION_LOW, ((u32[]){attributePermutation&0xFFFFFFFF, (attributePermutation>>32)&0xFFFF}), 2);
 }
 
 void GPU_SetAttributeBuffersAddress(u32* baseAddress)
 {
-       GPUCMD_AddSingleParam(0x000F0200, ((u32)baseAddress)>>3);
+       GPUCMD_AddWrite(GPUREG_ATTRIBBUFFERS_LOC, ((u32)baseAddress)>>3);
 }
 
 void GPU_SetFaceCulling(GPU_CULLMODE mode)
 {
-       GPUCMD_AddSingleParam(0x000F0040, mode&0x3); 
+       GPUCMD_AddWrite(GPUREG_FACECULLING_CONFIG, mode&0x3); 
 }
 
 const u8 GPU_TEVID[]={0xC0,0xC8,0xD0,0xD8,0xF0,0xF8};
@@ -460,54 +456,54 @@ void GPU_SetTexEnv(u8 id, u16 rgbSources, u16 alphaSources, u16 rgbOperands, u16
        param[0x3]=constantColor;
        param[0x4]=0x00000000; // ?
 
-       GPUCMD_Add(0x800F0000|GPU_TEVID[id], param, 0x00000005);
+       GPUCMD_AddIncrementalWrites(GPUREG_0000|GPU_TEVID[id], param, 0x00000005);
 }
 
 void GPU_DrawArray(GPU_Primitive_t primitive, u32 n)
 {
        //set primitive type
-       GPUCMD_AddSingleParam(0x0002025E, primitive);
-       GPUCMD_AddSingleParam(0x0002025F, 0x00000001);
+       GPUCMD_AddMaskedWrite(GPUREG_PRIMITIVE_CONFIG, 0x2, primitive);
+       GPUCMD_AddMaskedWrite(GPUREG_025F, 0x2, 0x00000001);
        //index buffer address register should be cleared (except bit 31) before drawing
-       GPUCMD_AddSingleParam(0x000F0227, 0x80000000);
+       GPUCMD_AddWrite(GPUREG_INDEXBUFFER_CONFIG, 0x80000000);
        //pass number of vertices
-       GPUCMD_AddSingleParam(0x000F0228, n);
+       GPUCMD_AddWrite(GPUREG_NUMVERTICES, n);
 
        //all the following except 0x000F022E might be useless
-       GPUCMD_AddSingleParam(0x00010253, 0x00000001);
-       GPUCMD_AddSingleParam(0x00010245, 0x00000000);
-       GPUCMD_AddSingleParam(0x000F022E, 0x00000001);
-       GPUCMD_AddSingleParam(0x00010245, 0x00000001);
-       GPUCMD_AddSingleParam(0x000F0231, 0x00000001);
-       GPUCMD_AddSingleParam(0x000F0111, 0x00000001);
+       GPUCMD_AddMaskedWrite(GPUREG_0253, 0x1, 0x00000001);
+       GPUCMD_AddMaskedWrite(GPUREG_0245, 0x1, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_DRAWARRAYS, 0x00000001);
+       GPUCMD_AddMaskedWrite(GPUREG_0245, 0x1, 0x00000001);
+       GPUCMD_AddWrite(GPUREG_0231, 0x00000001);
+       GPUCMD_AddWrite(GPUREG_0111, 0x00000001);
 }
 
 void GPU_DrawElements(GPU_Primitive_t primitive, u32* indexArray, u32 n)
 {
        //set primitive type
-       GPUCMD_AddSingleParam(0x0002025E, primitive);
-       GPUCMD_AddSingleParam(0x0002025F, 0x00000001);
+       GPUCMD_AddMaskedWrite(GPUREG_PRIMITIVE_CONFIG, 0x2, primitive);
+       GPUCMD_AddMaskedWrite(GPUREG_025F, 0x2, 0x00000001);
        //index buffer (TODO : support multiple types)
-       GPUCMD_AddSingleParam(0x000F0227, 0x80000000|((u32)indexArray));
+       GPUCMD_AddWrite(GPUREG_INDEXBUFFER_CONFIG, 0x80000000|((u32)indexArray));
        //pass number of vertices
-       GPUCMD_AddSingleParam(0x000F0228, n);
+       GPUCMD_AddWrite(GPUREG_NUMVERTICES, n);
 
-       GPUCMD_AddSingleParam(0x00020229, 0x00000100);
-       GPUCMD_AddSingleParam(0x00020253, 0x00000100);
+       GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG, 0x2, 0x00000100);
+       GPUCMD_AddMaskedWrite(GPUREG_0253, 0x2, 0x00000100);
 
-       GPUCMD_AddSingleParam(0x00010245, 0x00000000);
-       GPUCMD_AddSingleParam(0x000F022F, 0x00000001);
-       GPUCMD_AddSingleParam(0x00010245, 0x00000001);
-       GPUCMD_AddSingleParam(0x000F0231, 0x00000001);
+       GPUCMD_AddMaskedWrite(GPUREG_0245, 0x1, 0x00000000);
+       GPUCMD_AddWrite(GPUREG_DRAWELEMENTS, 0x00000001);
+       GPUCMD_AddMaskedWrite(GPUREG_0245, 0x1, 0x00000001);
+       GPUCMD_AddWrite(GPUREG_0231, 0x00000001);
        
        // CHECKME: does this one also require command 0x0111 at the end?
 }
 
 void GPU_FinishDrawing()
 {
-       GPUCMD_AddSingleParam(0x000F0111, 0x00000001);
-       GPUCMD_AddSingleParam(0x000F0110, 0x00000001); 
-       GPUCMD_AddSingleParam(0x000F0063, 0x00000001);
+       GPUCMD_AddWrite(GPUREG_0111, 0x00000001);
+       GPUCMD_AddWrite(GPUREG_0110, 0x00000001); 
+       GPUCMD_AddWrite(GPUREG_0063, 0x00000001);
 }
 
 void GPU_SetShaderOutmap(u32 outmapData[8])