void RDP_SetCombine( u32 w0, u32 w1 ) { gDPSetCombine( _SHIFTR( w0, 0, 24 ), // muxs0 w1 ); // muxs1 }
void RDP_SetPrimDepth( u32 w0, u32 w1 ) { gDPSetPrimDepth( _SHIFTR( w1, 16, 16 ), // z _SHIFTR( w1, 0, 16 ) ); // dz }
void RDP_SetKeyR( u32 w0, u32 w1 ) { gDPSetKeyR( _SHIFTR( w1, 8, 8 ), // cR _SHIFTR( w1, 0, 8 ), // sR _SHIFTR( w1, 16, 12 ) ); // wR }
void F3DEX_Tri1( uint32_t w0, uint32_t w1 ) { gln64gSP1Triangle( _SHIFTR( w1, 17, 7 ), _SHIFTR( w1, 9, 7 ), _SHIFTR( w1, 1, 7 ), 0); }
void F3D_Tri1( u32 w0, u32 w1 ) { gSP1Triangle( _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, _SHIFTR( w1, 0, 8 ) / 10); }
void F3DWRUS_Tri2( u32 w0, u32 w1 ) { gSP2Triangles( _SHIFTR( w0, 16, 8 ) / 5, _SHIFTR( w0, 8, 8 ) / 5, _SHIFTR( w0, 0, 8 ) / 5, 0, _SHIFTR( w1, 16, 8 ) / 5, _SHIFTR( w1, 8, 8 ) / 5, _SHIFTR( w1, 0, 8 ) / 5, 0); }
void RSP_ProcessDList() { VI_UpdateSize(); OGL_UpdateScale(); TextureCache_ActivateNoise(2); RSP.PC[0] = *(u32*)&DMEM[0x0FF0]; RSP.PCi = 0; RSP.count = 0; RSP.halt = FALSE; RSP.busy = TRUE; #ifdef __TRIBUFFER_OPT __indexmap_clear(); #endif gSP.matrix.stackSize = min( 32, *(u32*)&DMEM[0x0FE4] >> 6 ); gSP.matrix.modelViewi = 0; gSP.changed |= CHANGED_MATRIX; for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) gSP.matrix.modelView[0][i][j] = 0.0f; gSP.matrix.modelView[0][0][0] = 1.0f; gSP.matrix.modelView[0][1][1] = 1.0f; gSP.matrix.modelView[0][2][2] = 1.0f; gSP.matrix.modelView[0][3][3] = 1.0f; u32 uc_start = *(u32*)&DMEM[0x0FD0]; u32 uc_dstart = *(u32*)&DMEM[0x0FD8]; u32 uc_dsize = *(u32*)&DMEM[0x0FDC]; if ((uc_start != RSP.uc_start) || (uc_dstart != RSP.uc_dstart)) gSPLoadUcodeEx( uc_start, uc_dstart, uc_dsize ); gDPSetAlphaCompare(G_AC_NONE); gDPSetDepthSource(G_ZS_PIXEL); gDPSetRenderMode(0, 0); gDPSetAlphaDither(G_AD_DISABLE); gDPSetColorDither(G_CD_DISABLE); gDPSetCombineKey(G_CK_NONE); gDPSetTextureConvert(G_TC_FILT); gDPSetTextureFilter(G_TF_POINT); gDPSetTextureLUT(G_TT_NONE); gDPSetTextureLOD(G_TL_TILE); gDPSetTextureDetail(G_TD_CLAMP); gDPSetTexturePersp(G_TP_PERSP); gDPSetCycleType(G_CYC_1CYCLE); gDPPipelineMode(G_PM_NPRIMITIVE); #ifdef PRINT_DISPLAYLIST if ((RSP.DList%PRINT_DISPLAYLIST_NUM) == 0) LOG(LOG_VERBOSE, "BEGIN DISPLAY LIST %i \n", RSP.DList); #endif while (!RSP.halt) { u32 pc = RSP.PC[RSP.PCi]; if ((pc + 8) > RDRAMSize) { #ifdef DEBUG DebugMsg( DEBUG_LOW | DEBUG_ERROR, "ATTEMPTING TO EXECUTE RSP COMMAND AT INVALID RDRAM LOCATION\n" ); #endif break; } u32 w0 = *(u32*)&RDRAM[pc]; u32 w1 = *(u32*)&RDRAM[pc+4]; RSP.nextCmd = _SHIFTR( *(u32*)&RDRAM[pc+8], 24, 8 ); RSP.cmd = _SHIFTR( w0, 24, 8 ); RSP.PC[RSP.PCi] += 8; #ifdef PROFILE_GBI GBI_ProfileBegin(RSP.cmd); #endif #ifdef PRINT_DISPLAYLIST if ((RSP.DList%PRINT_DISPLAYLIST_NUM) == 0) LOG(LOG_VERBOSE, "%s: w0=0x%x w1=0x%x\n", GBI_GetFuncName(GBI.current->type, RSP.cmd), w0, w1); #endif GBI.cmd[RSP.cmd]( w0, w1 ); #ifdef PROFILE_GBI GBI_ProfileEnd(RSP.cmd); #endif } #ifdef PRINT_DISPLAYLIST if ((RSP.DList%PRINT_DISPLAYLIST_NUM) == 0) LOG(LOG_VERBOSE, "END DISPLAY LIST %i \n", RSP.DList); #endif RSP.busy = FALSE; RSP.DList++; gSP.changed |= CHANGED_COLORBUFFER; }
void F3D_Vtx( u32 w0, u32 w1 ) { gSPVertex( w1, _SHIFTR( w0, 20, 4 ) + 1, _SHIFTR( w0, 16, 4 ) ); }
void F3DDKR_DMA_Tri( u32 w0, u32 w1 ) { gSPDMATriangles( w1, _SHIFTR( w0, 4, 12 ) ); gSP.vertexi = 0; }
void F3D_Quad( u32 w0, u32 w1 ) { gSP1Quadrangle( _SHIFTR( w1, 24, 8 ) / 10, _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, _SHIFTR( w1, 0, 8 ) / 10 ); }
void F3D_Tri4( u32 w0, u32 w1 ) { gSP4Triangles( _SHIFTR( w1, 28, 4 ), _SHIFTR( w0, 12, 4 ), _SHIFTR( w1, 24, 4 ), _SHIFTR( w1, 20, 4 ), _SHIFTR( w0, 8, 4 ), _SHIFTR( w1, 16, 4 ), _SHIFTR( w1, 12, 4 ), _SHIFTR( w0, 4, 4 ), _SHIFTR( w1, 8, 4 ), _SHIFTR( w1, 4, 4 ), _SHIFTR( w0, 0, 4 ), _SHIFTR( w1, 0, 4 ) ); }
void F3D_SetOtherMode_L( u32 w0, u32 w1 ) { const u32 length = _SHIFTR(w0, 0, 8); const u32 shift = _SHIFTR(w0, 8, 8); gSPSetOtherMode_L(length, shift, w1); }
void F3D_MoveWord( u32 w0, u32 w1 ) { switch (_SHIFTR( w0, 0, 8 )) { case G_MW_MATRIX: gSPInsertMatrix( _SHIFTR( w0, 8, 16 ), w1 ); break; case G_MW_NUMLIGHT: gSPNumLights( ((w1 - 0x80000000) >> 5) - 1 ); break; case G_MW_CLIP: gSPClipRatio( w1 ); break; case G_MW_SEGMENT: gSPSegment( _SHIFTR( w0, 10, 4 ), w1 & 0x00FFFFFF ); break; case G_MW_FOG: gSPFogFactor( (s16)_SHIFTR( w1, 16, 16 ), (s16)_SHIFTR( w1, 0, 16 ) ); break; case G_MW_LIGHTCOL: switch (_SHIFTR( w0, 8, 16 )) { case F3D_MWO_aLIGHT_1: gSPLightColor( LIGHT_1, w1 ); break; case F3D_MWO_aLIGHT_2: gSPLightColor( LIGHT_2, w1 ); break; case F3D_MWO_aLIGHT_3: gSPLightColor( LIGHT_3, w1 ); break; case F3D_MWO_aLIGHT_4: gSPLightColor( LIGHT_4, w1 ); break; case F3D_MWO_aLIGHT_5: gSPLightColor( LIGHT_5, w1 ); break; case F3D_MWO_aLIGHT_6: gSPLightColor( LIGHT_6, w1 ); break; case F3D_MWO_aLIGHT_7: gSPLightColor( LIGHT_7, w1 ); break; case F3D_MWO_aLIGHT_8: gSPLightColor( LIGHT_8, w1 ); break; } break; case G_MW_POINTS: { const u32 val = _SHIFTR(w0, 8, 16); gSPModifyVertex(val / 40, val % 40, w1); } break; case G_MW_PERSPNORM: gSPPerspNormalize( w1 ); break; } }
void F3D_CullDL( u32 w0, u32 w1 ) { gSPCullDisplayList( _SHIFTR( w0, 0, 24 ) / 40, (w1 / 40) - 1 ); }
void RDP_SetTile( u32 w0, u32 w1 ) { gDPSetTile( _SHIFTR( w0, 21, 3 ), // fmt _SHIFTR( w0, 19, 2 ), // siz _SHIFTR( w0, 9, 9 ), // line _SHIFTR( w0, 0, 9 ), // tmem _SHIFTR( w1, 24, 3 ), // tile _SHIFTR( w1, 20, 4 ), // palette _SHIFTR( w1, 18, 2 ), // cmt _SHIFTR( w1, 8, 2 ), // cms _SHIFTR( w1, 14, 4 ), // maskt _SHIFTR( w1, 4, 4 ), // masks _SHIFTR( w1, 10, 4 ), // shiftt _SHIFTR( w1, 0, 4 ) ); // shifts }
void F3DDKR_DMA_DList( u32 w0, u32 w1 ) { gSPDMADisplayList( w1, _SHIFTR( w0, 16, 8 ) ); }
void F3DWRUS_Vtx( u32 w0, u32 w1 ) { gSPVertex( w1, _SHIFTR( w0, 9, 7 ), _SHIFTR( w0, 16, 8 ) / 5 ); }
void F3DDKR_DMA_Offsets( u32 w0, u32 w1 ) { gSPSetDMAOffsets( _SHIFTR( w0, 0, 24 ), _SHIFTR( w1, 0, 24 ) ); }
void F3DWRUS_Quad( u32 w0, u32 w1 ) { gSP1Quadrangle( _SHIFTR( w1, 24, 8 ) / 5, _SHIFTR( w1, 16, 8 ) / 5, _SHIFTR( w1, 8, 8 ) / 5, _SHIFTR( w1, 0, 8 ) / 5 ); }
void RSP_ProcessDList() { VI_UpdateSize(); RSP.PC[0] = *(u32*)&DMEM[0x0FF0]; RSP.PCi = 0; RSP.count = 0; RSP.halt = FALSE; RSP.busy = TRUE; gSPAligned.matrix.stackSize = min( 32, *(u32*)&DMEM[0x0FE4] >> 6 ); gSPAligned.matrix.modelViewi = 0; gSP.changed |= CHANGED_MATRIX; for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) gSPAligned.matrix.modelView[0][i][j] = 0.0f; gSPAligned.matrix.modelView[0][0][0] = 1.0f; gSPAligned.matrix.modelView[0][1][1] = 1.0f; gSPAligned.matrix.modelView[0][2][2] = 1.0f; gSPAligned.matrix.modelView[0][3][3] = 1.0f; u32 uc_start = *(u32*)&DMEM[0x0FD0]; u32 uc_dstart = *(u32*)&DMEM[0x0FD8]; u32 uc_dsize = *(u32*)&DMEM[0x0FDC]; if ((uc_start != RSP.uc_start) || (uc_dstart != RSP.uc_dstart)) gSPLoadUcodeEx( uc_start, uc_dstart, uc_dsize ); gDPSetAlphaCompare( G_AC_NONE ); gDPSetDepthSource( G_ZS_PIXEL ); gDPSetRenderMode( 0, 0 ); gDPSetAlphaDither( G_AD_DISABLE ); gDPSetColorDither( G_CD_DISABLE ); gDPSetCombineKey( G_CK_NONE ); gDPSetTextureConvert( G_TC_FILT ); gDPSetTextureFilter( G_TF_POINT ); gDPSetTextureLUT( G_TT_NONE ); gDPSetTextureLOD( G_TL_TILE ); gDPSetTextureDetail( G_TD_CLAMP ); gDPSetTexturePersp( G_TP_PERSP ); gDPSetCycleType( G_CYC_1CYCLE ); gDPPipelineMode( G_PM_NPRIMITIVE ); #ifdef __GX__ OGL_GXinitDlist(); #endif //__GX__ while (!RSP.halt) { if ((RSP.PC[RSP.PCi] + 8) > RDRAMSize) { #ifdef DEBUG DebugMsg( DEBUG_MEDIUM | DEBUG_ERROR, "Attempting to execute RSP command at invalid RDRAM location\n" ); #endif break; } // printf( "!!!!!! RDRAM = 0x%8.8x\n", RDRAM );//RSP.PC[RSP.PCi] ); /* { static u8 *lastRDRAM = 0; if (lastRDRAM == 0) lastRDRAM = RDRAM; if (RDRAM != lastRDRAM) { __asm__( "int $3" ); } }*/ u32 w0 = *(u32*)&RDRAM[RSP.PC[RSP.PCi]]; u32 w1 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4]; RSP.cmd = _SHIFTR( w0, 24, 8 ); #ifdef DEBUG DebugRSPState( RSP.PCi, RSP.PC[RSP.PCi], _SHIFTR( w0, 24, 8 ), w0, w1 ); DebugMsg( DEBUG_LOW | DEBUG_HANDLED, "0x%08lX: CMD=0x%02lX W0=0x%08lX W1=0x%08lX\n", RSP.PC[RSP.PCi], _SHIFTR( w0, 24, 8 ), w0, w1 ); #endif RSP.PC[RSP.PCi] += 8; RSP.nextCmd = _SHIFTR( *(u32*)&RDRAM[RSP.PC[RSP.PCi]], 24, 8 ); GBI.cmd[RSP.cmd]( w0, w1 ); } /* if (OGL.frameBufferTextures && gDP.colorImage.changed) { FrameBuffer_SaveBuffer( gDP.colorImage.address, gDP.colorImage.size, gDP.colorImage.width, gDP.colorImage.height ); gDP.colorImage.changed = FALSE; }*/ RSP.busy = FALSE; RSP.DList++; gSP.changed |= CHANGED_COLORBUFFER; }
void F3DEX_Vtx( uint32_t w0, uint32_t w1 ) { gln64gSPVertex( w1, _SHIFTR( w0, 10, 6 ), _SHIFTR( w0, 17, 7 ) ); }
void RDP_SetOtherMode( u32 w0, u32 w1 ) { gDPSetOtherMode( _SHIFTR( w0, 0, 24 ), // mode0 w1 ); // mode1 }
void F3DEX_CullDL( uint32_t w0, uint32_t w1 ) { gln64gSPCullDisplayList( _SHIFTR( w0, 1, 15 ), _SHIFTR( w1, 1, 15 ) ); }
void F3DDKR_DMA_DList( u32 w0, u32 w1 ) { gSPDlistCount(_SHIFTR(w0, 16, 8), w1); }