Arachnoid GLESv1.1 plugin. Compile and run (a bit glitchy and no frameskip) on the...
[mupen64plus-pandora.git] / source / mupen64plus-video-arachnoid / src / ucodes / UCode5.cpp
1 /******************************************************************************
2  * Arachnoid Graphics Plugin for Mupen64Plus
3  * http://bitbucket.org/wahrhaft/mupen64plus-video-arachnoid/
4  *
5  * Copyright (C) 2007 Kristofer Karlsson, Rickard Niklasson
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20  *****************************************************************************/
21
22 #include "UCode5.h"
23 #include "UCode0.h"
24 #include "GBI.h"
25 #include "RSP.h"
26 #include "RDP.h"
27 #include "Memory.h"
28 #include "UCodeDefs.h"
29 #include "GBIDefs.h"
30 #include "Logger.h"
31 #include "DisplayListParser.h"
32
33
34 #define F3DEX2_MTX_STACKSIZE       18
35
36 #define F3DEX2_MTX_MODELVIEW       0x00
37 #define F3DEX2_MTX_PROJECTION      0x04
38 #define F3DEX2_MTX_MUL             0x00
39 #define F3DEX2_MTX_LOAD            0x02
40 #define F3DEX2_MTX_NOPUSH          0x00
41 #define F3DEX2_MTX_PUSH            0x01
42
43 #define F3DEX2_TEXTURE_ENABLE      0x00000000
44 #define F3DEX2_SHADING_SMOOTH      0x00200000
45 #define F3DEX2_CULL_FRONT          0x00000200
46 #define F3DEX2_CULL_BACK           0x00000400
47 #define F3DEX2_CULL_BOTH           0x00000600
48 #define F3DEX2_CLIPPING            0x00800000
49
50 #define F3DEX2_MV_VIEWPORT         8
51
52 #define F3DEX2_MWO_aLIGHT_1        0x00
53 #define F3DEX2_MWO_bLIGHT_1        0x04
54 #define F3DEX2_MWO_aLIGHT_2        0x18
55 #define F3DEX2_MWO_bLIGHT_2        0x1c
56 #define F3DEX2_MWO_aLIGHT_3        0x30
57 #define F3DEX2_MWO_bLIGHT_3        0x34
58 #define F3DEX2_MWO_aLIGHT_4        0x48
59 #define F3DEX2_MWO_bLIGHT_4        0x4c
60 #define F3DEX2_MWO_aLIGHT_5        0x60
61 #define F3DEX2_MWO_bLIGHT_5        0x64
62 #define F3DEX2_MWO_aLIGHT_6        0x78
63 #define F3DEX2_MWO_bLIGHT_6        0x7c
64 #define F3DEX2_MWO_aLIGHT_7        0x90
65 #define F3DEX2_MWO_bLIGHT_7        0x94
66 #define F3DEX2_MWO_aLIGHT_8        0xa8
67 #define F3DEX2_MWO_bLIGHT_8        0xac
68
69
70 #define    F3DEX2_RDPHALF_2        0xF1
71 #define    F3DEX2_SETOTHERMODE_H   0xE3
72 #define    F3DEX2_SETOTHERMODE_L   0xE2
73 #define    F3DEX2_RDPHALF_1        0xE1
74 #define    F3DEX2_SPNOOP           0xE0
75 #define    F3DEX2_ENDDL            0xDF
76 #define    F3DEX2_DL               0xDE
77 #define    F3DEX2_LOAD_UCODE       0xDD
78 #define    F3DEX2_MTX              0xDA
79 #define F3DEX2_GEOMETRYMODE        0xD9
80 #define    F3DEX2_POPMTX           0xD8
81 #define    F3DEX2_TEXTURE          0xD7
82 #define    F3DEX2_DMA_IO           0xD6
83 #define    F3DEX2_SPECIAL_1        0xD5
84 #define    F3DEX2_SPECIAL_2        0xD4
85 #define    F3DEX2_SPECIAL_3        0xD3
86
87 #define    F3DEX2_VTX              0x01
88 #define    F3DEX2_MODIFYVTX        0x02
89 #define    F3DEX2_CULLDL           0x03
90 #define    F3DEX2_BRANCH_Z         0x04
91 #define    F3DEX2_TRI1             0x05
92 #define F3DEX2_TRI2                0x06
93 #define F3DEX2_QUAD                0x07
94 #define F3DEX2_LINE3D              0x08
95
96
97 //-----------------------------------------------------------------------------
98 // Static Variables
99 //-----------------------------------------------------------------------------
100 RSP*    UCode5::m_rsp    = 0;   //!< Pointer to Reality Signal Processor 
101 RDP*    UCode5::m_rdp    = 0;   //!< Pointer to Reality Drawing Processor 
102 Memory* UCode5::m_memory = 0;
103 GBI*    UCode5::m_gbi    = 0;
104 DisplayListParser* UCode5::m_displayListParser = 0;
105
106 //-----------------------------------------------------------------------------
107 //! Constructor
108 //-----------------------------------------------------------------------------
109 UCode5::UCode5()
110 {
111 }
112
113 //-----------------------------------------------------------------------------
114 //! Destructor
115 //-----------------------------------------------------------------------------
116 UCode5::~UCode5()
117 {
118 }
119
120 //-----------------------------------------------------------------------------
121 //! Initialize
122 //-----------------------------------------------------------------------------
123 void UCode5::initialize(GBI* gbi, RSP* rsp, RDP* rdp, Memory* memory, DisplayListParser* dlp)
124 {
125     m_gbi = gbi;
126     m_rsp = rsp;
127     m_rdp = rdp;
128     m_memory = memory;
129     m_displayListParser = dlp;
130 }
131
132 //-----------------------------------------------------------------------------
133 //! Initialize GBI
134 //-----------------------------------------------------------------------------
135 void UCode5::initializeGBI()
136 {
137     //Set flags
138     GBI_InitFlags( F3DEX2 );
139
140
141     // GBI Command                        Command Value                Command Function
142     GBI_SetGBI( GBI::G_RDPHALF_2,         F3DEX2_RDPHALF_2,            m_gbi->m_cmds,    UCode0::F3D_RDPHalf_2 );
143     GBI_SetGBI( GBI::G_SETOTHERMODE_H,    F3DEX2_SETOTHERMODE_H,       m_gbi->m_cmds,    F3DEX2_SetOtherMode_H );
144     GBI_SetGBI( GBI::G_SETOTHERMODE_L,    F3DEX2_SETOTHERMODE_L,       m_gbi->m_cmds,    F3DEX2_SetOtherMode_L );
145     GBI_SetGBI( GBI::G_RDPHALF_1,         F3DEX2_RDPHALF_1,            m_gbi->m_cmds,    UCode0::F3D_RDPHalf_1 );
146     GBI_SetGBI( GBI::G_SPNOOP,            F3DEX2_SPNOOP,               m_gbi->m_cmds,    UCode0::F3D_SPNoOp );
147     GBI_SetGBI( GBI::G_ENDDL,             F3DEX2_ENDDL,                m_gbi->m_cmds,    UCode0::F3D_EndDL );
148     GBI_SetGBI( GBI::G_DL,                F3DEX2_DL,                   m_gbi->m_cmds,    UCode0::F3D_DList );
149     GBI_SetGBI( GBI::G_LOAD_UCODE,        F3DEX2_LOAD_UCODE,           m_gbi->m_cmds,    UCode1::F3DEX_Load_uCode );
150     GBI_SetGBI( GBI::G_MOVEMEM,           F3DEX2_MOVEMEM,              m_gbi->m_cmds,    F3DEX2_MoveMem );
151     GBI_SetGBI( GBI::G_MOVEWORD,          F3DEX2_MOVEWORD,             m_gbi->m_cmds,    F3DEX2_MoveWord );
152     GBI_SetGBI( GBI::G_MTX,               F3DEX2_MTX,                  m_gbi->m_cmds,    F3DEX2_Mtx );
153     GBI_SetGBI( GBI::G_GEOMETRYMODE,      F3DEX2_GEOMETRYMODE,         m_gbi->m_cmds,    F3DEX2_GeometryMode );
154     GBI_SetGBI( GBI::G_POPMTX,            F3DEX2_POPMTX,               m_gbi->m_cmds,    F3DEX2_PopMtx );
155     GBI_SetGBI( GBI::G_TEXTURE,           F3DEX2_TEXTURE,              m_gbi->m_cmds,    F3DEX2_Texture );
156     GBI_SetGBI( GBI::G_DMA_IO,            F3DEX2_DMA_IO,               m_gbi->m_cmds,    F3DEX2_DMAIO );
157     GBI_SetGBI( GBI::G_SPECIAL_1,         F3DEX2_SPECIAL_1,            m_gbi->m_cmds,    F3DEX2_Special_1 );
158     GBI_SetGBI( GBI::G_SPECIAL_2,         F3DEX2_SPECIAL_2,            m_gbi->m_cmds,    F3DEX2_Special_2 );
159     GBI_SetGBI( GBI::G_SPECIAL_3,         F3DEX2_SPECIAL_3,            m_gbi->m_cmds,    F3DEX2_Special_3 );
160     GBI_SetGBI( GBI::G_VTX,               F3DEX2_VTX,                  m_gbi->m_cmds,    F3DEX2_Vtx );
161     GBI_SetGBI( GBI::G_MODIFYVTX,         F3DEX2_MODIFYVTX,            m_gbi->m_cmds,    UCode1::F3DEX_ModifyVtx );
162     GBI_SetGBI(    GBI::G_CULLDL,         F3DEX2_CULLDL,               m_gbi->m_cmds,    UCode1::F3DEX_CullDL );
163     GBI_SetGBI( GBI::G_BRANCH_Z,          F3DEX2_BRANCH_Z,             m_gbi->m_cmds,    UCode1::F3DEX_Branch_Z );
164     GBI_SetGBI( GBI::G_TRI1,              F3DEX2_TRI1,                 m_gbi->m_cmds,    F3DEX2_Tri1 );
165     GBI_SetGBI( GBI::G_TRI2,              F3DEX2_TRI2,                 m_gbi->m_cmds,    UCode1::F3DEX_Tri2 );
166     GBI_SetGBI( GBI::G_QUAD,              F3DEX2_QUAD,                 m_gbi->m_cmds,    F3DEX2_Quad );
167     GBI_SetGBI( GBI::G_LINE3D,            F3DEX2_LINE3D,               m_gbi->m_cmds,    F3DEX2_Line3D );
168 }
169
170 //*****************************************************************************
171 // Matrices
172 //*****************************************************************************
173
174 //-----------------------------------------------------------------------------
175 //! Add Matrix
176 //! @todo Bomberman2 hack
177 //! @todo South park rally hack
178 //-----------------------------------------------------------------------------
179 void UCode5::F3DEX2_Mtx( MicrocodeArgument* ucode ) 
180 {
181     Logger::getSingleton().printMsg("F3DEX2_Mtx", M64MSG_VERBOSE);
182     RSPUCodeAddMatrixF3DEX2* temp = (RSPUCodeAddMatrixF3DEX2*)ucode;
183
184     //TODO Bomberman2 hack
185     if( temp->param == 0 && temp->lenght == 0 )
186     {
187         //Bomberman2TextRect(ucode);
188         Logger::getSingleton().printMsg("F3DEX2_Mtx - Bomberman2TextRect - Unimplemented", M64MSG_WARNING);
189         return;
190     }
191
192     //Add Matrix
193     m_rsp->RSP_Matrix( temp->segmentAddress, temp->projection, !temp->nopush, temp->load );
194
195     //For Conker Bad Fur Day
196     m_rsp->getVertexMgr()->setConkerAddress(0);
197
198     //TODO South park rally hack
199 }
200
201 //-----------------------------------------------------------------------------
202 //! Pop Matrix
203 //-----------------------------------------------------------------------------
204 void UCode5::F3DEX2_PopMtx( MicrocodeArgument* ucode ) 
205 {
206     Logger::getSingleton().printMsg("F3DEX2_PopMtx", M64MSG_VERBOSE);
207
208     m_rsp->RSP_PopMatrixN( ucode->w1 >> 6 );
209 }
210
211 //*****************************************************************************
212 //Textures
213 //*****************************************************************************
214
215 //-----------------------------------------------------------------------------
216 //! Set Texture
217 //-----------------------------------------------------------------------------
218 void UCode5::F3DEX2_Texture( MicrocodeArgument* ucode ) 
219 {
220     Logger::getSingleton().printMsg("F3DEX2_Texture", M64MSG_VERBOSE);
221
222     float scaleS  = _FIXED2FLOAT( _SHIFTR( ucode->w1, 16, 16 ), 16 ); 
223     float scaleT  = _FIXED2FLOAT( _SHIFTR( ucode->w1, 0, 16 ), 16 ); 
224     int level    = _SHIFTR( ucode->w0, 11, 3 );
225     int tile     = _SHIFTR( ucode->w0, 8, 3 );
226     int on       = _SHIFTR( ucode->w0, 1, 7 );
227
228     m_rsp->RSP_Texture(scaleS, scaleT, level, tile, on);
229 }
230
231 //*****************************************************************************
232 // Vertices and indices
233 //*****************************************************************************
234
235 //-----------------------------------------------------------------------------
236 // Vertices
237 //-----------------------------------------------------------------------------
238 void UCode5::F3DEX2_Vtx( MicrocodeArgument* ucode ) 
239 {
240     Logger::getSingleton().printMsg("F3DEX2_Vtx", M64MSG_VERBOSE);
241     RSPUCodeAddVerticesF3DEX2* temp = (RSPUCodeAddVerticesF3DEX2*)ucode;
242
243     //Add Vertices
244     m_rsp->RSP_Vertex(temp->segmentAddress, temp->numVertices, temp->vertexEnd - temp->numVertices);
245 }
246
247 //-----------------------------------------------------------------------------
248 // Add 1 Triangle
249 //! @todo Add triangle flag
250 //-----------------------------------------------------------------------------
251 void UCode5::F3DEX2_Tri1( MicrocodeArgument* ucode ) 
252 {
253     Logger::getSingleton().printMsg("F3DEX2_Tri1", M64MSG_VERBOSE);
254     RSPUCodeAddOneTriangleF3DEX2* temp = (RSPUCodeAddOneTriangleF3DEX2*)ucode;
255
256     //Add one triangle
257     m_rsp->RSP_1Triangle( temp->index0 / 2, temp->index1 / 2, temp->index2 / 2); //TODO flag
258 }
259
260 //-----------------------------------------------------------------------------
261 // Add 1 Quad
262 //-----------------------------------------------------------------------------
263 void UCode5::F3DEX2_Quad( MicrocodeArgument* ucode ) 
264 {
265     Logger::getSingleton().printMsg("F3DEX2_Quad", M64MSG_VERBOSE);
266     RSPUCodeAddOneQuadF3DEX2* temp = (RSPUCodeAddOneQuadF3DEX2*)ucode;
267
268     //Add two triangles
269     m_rsp->RSP_2Triangles( temp->v0 / 2, temp->v1 / 2, temp->v2 / 2, 0,
270                            temp->v3 / 2, temp->v4 / 2, temp->v5 / 2, 0 );
271 }
272
273 //-----------------------------------------------------------------------------
274 // Render Line 3D
275 //-----------------------------------------------------------------------------
276 void UCode5::F3DEX2_Line3D( MicrocodeArgument* ucode ) 
277 {
278     Logger::getSingleton().printMsg("F3DEX2_Line3D - Unimplemented", M64MSG_WARNING);
279 }
280
281
282 //*****************************************************************************
283 // Misc
284 //*****************************************************************************
285
286 //-----------------------------------------------------------------------------
287 // MoveMem
288 //-----------------------------------------------------------------------------
289 void UCode5::F3DEX2_MoveMem( MicrocodeArgument* ucode ) 
290 {
291     Logger::getSingleton().printMsg("F3DEX2_MoveMem", M64MSG_VERBOSE);
292
293     switch (_SHIFTR( ucode->w0, 0, 8 ))
294     {
295         case F3DEX2_MV_VIEWPORT:
296             m_rsp->moveMemViewport( ucode->w1 );
297             break;
298         case G_MV_MATRIX:
299             m_rsp->RSP_ForceMatrix( ucode->w1 );
300             m_displayListParser->increasePC(8);        // force matrix takes two commands
301             break;
302         case G_MV_LIGHT:
303             /*
304             unsigned int dwOffset2 = ((ucode->w0) >> 5) & 0x3FFF;
305
306             switch (dwOffset2)
307             {
308             case 0x00:
309             {
310                 s8 * pcBase = g_pRDRAMs8 + addr;
311                 LOG_UCODE("    RSP_GBI1_MV_MEM_LOOKATX %f %f %f",
312                     (float)pcBase[8 ^ 0x3],
313                     (float)pcBase[9 ^ 0x3],
314                     (float)pcBase[10 ^ 0x3]);
315
316             }
317             break;
318             case 0x18:
319                 {
320                     s8 * pcBase = g_pRDRAMs8 + addr;
321                     LOG_UCODE("    RSP_GBI1_MV_MEM_LOOKATY %f %f %f",
322                         (float)pcBase[8 ^ 0x3],
323                         (float)pcBase[9 ^ 0x3],
324                         (float)pcBase[10 ^ 0x3]);
325                 }
326                 break;
327             default:        //0x30/48/60
328                 {
329                     uint32 dwLight = (dwOffset2 - 0x30)/0x18;
330                     LOG_UCODE("    Light %d:", dwLight);
331                         RSP_MoveMemLight(dwLight, addr);
332                 }
333                 break;
334             }
335             break;
336             */
337             unsigned int offset = _SHIFTR( ucode->w0, 8, 8 ) << 3;
338
339             if (offset >= 48)
340             {
341                 m_rsp->RSP_Light( ((offset - 24) / 24) - 1, ucode->w1);
342             }
343             else
344             {
345                 static bool warned = false;
346                 if ( !warned ) {
347                     Logger::getSingleton().printMsg("F3DEX2_MoveMem - Light - Unimplemented", M64MSG_WARNING);
348                     warned = true;
349                 }
350             }
351             
352             break;
353     }
354 }
355
356 //-----------------------------------------------------------------------------
357 // Move Word
358 //-----------------------------------------------------------------------------
359 void UCode5::F3DEX2_MoveWord(MicrocodeArgument* ucode) 
360 {
361     Logger::getSingleton().printMsg("F3DEX2_MoveWord", M64MSG_VERBOSE);
362     RSPUCodeMoveWordF3DEX2* temp = (RSPUCodeMoveWordF3DEX2*)ucode;
363
364     switch ( temp->type )
365     {
366         case G_MW_FORCEMTX:
367             Logger::getSingleton().printMsg("ForceMatrix - Unimplemented", M64MSG_WARNING);  // Handled in movemem???            
368             break;
369
370         case G_MW_MATRIX:
371             m_rsp->RSP_InsertMatrix( _SHIFTR( ucode->w0, 0, 16 ), ucode->w1 );            
372             break;
373
374         case G_MW_NUMLIGHT: 
375             m_rsp->RSP_NumLights(temp->value / 24); 
376             break;
377     
378         case G_MW_SEGMENT:
379             m_rsp->moveSegment(temp->offset>>2, temp->value & 0x00FFFFFF);
380             break;
381
382         case G_MW_CLIP:
383             //gSPClipRatio( ucode->w1 );
384             break;
385
386         case G_MW_FOG:
387             m_rsp->RSP_FogFactor(  (short)temp->fm, (short)temp->fo);
388             break;
389
390         case G_MW_PERSPNORM:
391             //gSPPerspNormalize( w1 );
392             break;
393
394         case G_MW_LIGHTCOL:
395             if ( (temp->offset & 0x7) == 0 )
396             {
397                 m_rsp->RSP_LightColor(temp->offset / 0x18, temp->value);
398             }
399             break;
400     }
401 }
402
403 //-----------------------------------------------------------------------------
404 // Geometry Mode
405 //-----------------------------------------------------------------------------
406 void UCode5::F3DEX2_GeometryMode( MicrocodeArgument* ucode ) 
407 {
408     Logger::getSingleton().printMsg("F3DEX2_GeometryMode", M64MSG_VERBOSE);
409                              //clear                              set
410     m_rsp->RSP_GeometryMode( ~_SHIFTR( ucode->w0, 0, 24 ), ucode->w1 );
411 }
412
413 //-----------------------------------------------------------------------------
414 //* Set Other Mode H
415 //! @todo more case in switch
416 //-----------------------------------------------------------------------------
417 void UCode5::F3DEX2_SetOtherMode_H( MicrocodeArgument* ucode ) 
418 {
419     Logger::getSingleton().printMsg("F3DEX2_SetOtherMode_H", M64MSG_VERBOSE);
420
421     switch (32 - _SHIFTR( ucode->w0, 8, 8 ) - (_SHIFTR( ucode->w0, 0, 8 ) + 1))
422     {
423         case G_MDSFT_CYCLETYPE:  m_rdp->setCycleType( ucode->w1 >> G_MDSFT_CYCLETYPE );    break;
424         case G_MDSFT_TEXTLUT:    m_rdp->setTextureLUT( ucode->w1 >> G_MDSFT_TEXTLUT );     break;
425
426         //TODO
427         case G_MDSFT_PIPELINE:     //m_rdp->setPiplineMode( w1 >> G_MDSFT_PIPELINE ); 
428             break;
429         case G_MDSFT_TEXTPERSP:    //m_rdp->setTexturePerspective( w1 >> G_MDSFT_TEXTPERSP );
430             break;
431         case G_MDSFT_TEXTDETAIL:   //m_rdp->setTextureDetail( w1 >> G_MDSFT_TEXTDETAIL );
432             break;
433         case G_MDSFT_TEXTLOD:      //gDPSetTextureLOD( w1 >> G_MDSFT_TEXTLOD );
434             break;        
435         case G_MDSFT_TEXTFILT:     //gDPSetTextureFilter( w1 >> G_MDSFT_TEXTFILT );
436             break;
437         case G_MDSFT_TEXTCONV:     //gDPSetTextureConvert( w1 >> G_MDSFT_TEXTCONV );
438             break;
439         case G_MDSFT_COMBKEY:      //gDPSetCombineKey( w1 >> G_MDSFT_COMBKEY );
440             break;
441         case G_MDSFT_RGBDITHER:    //gDPSetColorDither( w1 >> G_MDSFT_RGBDITHER );
442             break;
443         case G_MDSFT_ALPHADITHER:  //gDPSetAlphaDither( w1 >> G_MDSFT_ALPHADITHER );
444             break;
445         default:
446             Logger::getSingleton().printMsg("F3DEX2_SetOtherMode_L - Unknown type", M64MSG_WARNING);
447
448             unsigned int length = _SHIFTR( ucode->w0, 0, 8 ) + 1;
449             unsigned int shift = 32 - _SHIFTR( ucode->w0, 8, 8 ) - length;
450             unsigned int mask = ((1 << length) - 1) << shift;
451
452             m_rdp->m_otherMode.h &= ~mask;
453             m_rdp->m_otherMode.h |= ucode->w1 & mask;
454
455             m_rdp->setUpdateCombiner(true);
456             break;
457     }
458 }
459
460 //-----------------------------------------------------------------------------
461 // Set Other Mode L
462 //-----------------------------------------------------------------------------
463 void UCode5::F3DEX2_SetOtherMode_L( MicrocodeArgument* ucode ) 
464 {
465     Logger::getSingleton().printMsg("F3DEX2_SetOtherMode_L", M64MSG_VERBOSE);
466
467     switch (32 - _SHIFTR( ucode->w0, 8, 8 ) - (_SHIFTR( ucode->w0, 0, 8 ) + 1))
468     {
469         case G_MDSFT_ALPHACOMPARE:
470             m_rdp->setAlphaCompareMode(ucode->w1 >> G_MDSFT_ALPHACOMPARE);
471             break;
472         case G_MDSFT_ZSRCSEL:
473             m_rdp->setDepthSource( ucode->w1 >> G_MDSFT_ZSRCSEL );
474             break;
475         case G_MDSFT_RENDERMODE:
476             m_rdp->setRenderMode(  ucode->w1 );
477             break;
478         default:
479             unsigned int length = _SHIFTR( ucode->w0, 0, 8 ) + 1;
480             unsigned int shift = 32 - _SHIFTR( ucode->w0, 8, 8 ) - length;
481             unsigned int mask = ((1 << length) - 1) << shift;
482             m_rdp->m_otherMode.l &= ~mask;
483             m_rdp->m_otherMode.l |= ucode->w1 & mask;
484             break;
485     }
486 }
487
488 //*****************************************************************************
489 // Other
490 //*****************************************************************************
491
492 void UCode5::F3DEX2_DMAIO( MicrocodeArgument* ucode ) {
493     Logger::getSingleton().printMsg("F3DEX2_DMAIO", M64MSG_VERBOSE);
494     //Ignore?
495 }
496 void UCode5::F3DEX2_Special_1( MicrocodeArgument* ucode ) {
497     Logger::getSingleton().printMsg("F3DEX2_Special_1", M64MSG_VERBOSE);
498     //Ignore?
499 }
500 void UCode5::F3DEX2_Special_2( MicrocodeArgument* ucode ) {
501     Logger::getSingleton().printMsg("F3DEX2_Special_2", M64MSG_VERBOSE);
502     //Ignore?
503 }
504 void UCode5::F3DEX2_Special_3( MicrocodeArgument* ucode ) {
505     Logger::getSingleton().printMsg("F3DEX2_Special_3", M64MSG_VERBOSE);
506     //Ignore?
507 }
508
509 //*****************************************************************************
510 // Unimportant Functions
511 //*****************************************************************************
512 void UCode5::F3DEX2_Reserved1(MicrocodeArgument* ucode) {
513     Logger::getSingleton().printMsg("F3DEX2_Reserved1", M64MSG_VERBOSE);
514     //Ignore
515 }