Arachnoid GLESv1.1 plugin. Compile and run (a bit glitchy and no frameskip) on the...
[mupen64plus-pandora.git] / source / mupen64plus-video-arachnoid / src / ucodes / UCode0.cpp
CommitLineData
22726e4d 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 "UCode0.h"
23#include "GBI.h"
24#include "RSP.h"
25#include "RDP.h"
26#include "Memory.h"
27#include "UCodeDefs.h"
28#include "GBIDefs.h"
29#include "Logger.h"
30#include "DisplayListParser.h"
31
32//-----------------------------------------------------------------------------
33// Static Variables
34//-----------------------------------------------------------------------------
35RSP* UCode0::m_rsp = 0; //!< Pointer to Reality Signal Processor
36RDP* UCode0::m_rdp = 0; //!< Pointer to Reality Drawing Processor
37DisplayListParser* UCode0::m_displayListParser = 0;
38Memory* UCode0::m_memory = 0;
39
40//-----------------------------------------------------------------------------
41//! Constructor
42//-----------------------------------------------------------------------------
43UCode0::UCode0()
44{
45}
46
47//-----------------------------------------------------------------------------
48//! Destructor
49//-----------------------------------------------------------------------------
50UCode0::~UCode0()
51{
52}
53
54//-----------------------------------------------------------------------------
55// Initialize
56//-----------------------------------------------------------------------------
57void UCode0::initialize(RSP* rsp, RDP* rdp, Memory* memory, DisplayListParser* dlp)
58{
59 m_rsp = rsp;
60 m_rdp = rdp;
61 m_memory = memory;
62 m_displayListParser = dlp;
63}
64
65//-----------------------------------------------------------------------------
66//* Initialize GBI
67//! Assigns functions to the GBI
68//-----------------------------------------------------------------------------
69void UCode0::initializeGBI(GBI* gbi)
70{
71 // Set GeometryMode flags
72 GBI_InitFlags( F3D );
73
74 //GBI Command Command Value Target Command Function
75 GBI_SetGBI( GBI::G_SPNOOP, F3D_SPNOOP, gbi->m_cmds, F3D_SPNoOp );
76 GBI_SetGBI( GBI::G_MTX, F3D_MTX, gbi->m_cmds, F3D_Mtx );
77 GBI_SetGBI( GBI::G_RESERVED0, F3D_RESERVED0, gbi->m_cmds, F3D_Reserved0 );
78 GBI_SetGBI( GBI::G_MOVEMEM, F3D_MOVEMEM, gbi->m_cmds, F3D_MoveMem );
79 GBI_SetGBI( GBI::G_VTX, F3D_VTX, gbi->m_cmds, F3D_Vtx );
80 GBI_SetGBI( GBI::G_RESERVED1, F3D_RESERVED1, gbi->m_cmds, F3D_Reserved1 );
81 GBI_SetGBI( GBI::G_DL, F3D_DL, gbi->m_cmds, F3D_DList );
82 GBI_SetGBI( GBI::G_RESERVED2, F3D_RESERVED2, gbi->m_cmds, F3D_Reserved2 );
83 GBI_SetGBI( GBI::G_RESERVED3, F3D_RESERVED3, gbi->m_cmds, F3D_Reserved3 );
84 GBI_SetGBI( GBI::G_SPRITE2D_BASE, F3D_SPRITE2D_BASE, gbi->m_cmds, F3D_Sprite2D_Base );
85 GBI_SetGBI( GBI::G_MOVEWORD, F3D_MOVEWORD, gbi->m_cmds, F3D_MoveWord );
86 GBI_SetGBI( GBI::G_TRI1, F3D_TRI1, gbi->m_cmds, F3D_Tri1 );
87 GBI_SetGBI( GBI::G_CULLDL, F3D_CULLDL, gbi->m_cmds, F3D_CullDL );
88 GBI_SetGBI( GBI::G_POPMTX, F3D_POPMTX, gbi->m_cmds, F3D_PopMtx );
89 GBI_SetGBI( GBI::G_TEXTURE, F3D_TEXTURE, gbi->m_cmds, F3D_Texture );
90 GBI_SetGBI( GBI::G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, gbi->m_cmds, F3D_SetOtherMode_H );
91 GBI_SetGBI( GBI::G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, gbi->m_cmds, F3D_SetOtherMode_L );
92 GBI_SetGBI( GBI::G_ENDDL, F3D_ENDDL, gbi->m_cmds, F3D_EndDL );
93 GBI_SetGBI( GBI::G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, gbi->m_cmds, F3D_SetGeometryMode );
94 GBI_SetGBI( GBI::G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE,gbi->m_cmds, F3D_ClearGeometryMode );
95 GBI_SetGBI( GBI::G_QUAD, F3D_QUAD, gbi->m_cmds, F3D_Quad );
96 GBI_SetGBI( GBI::G_RDPHALF_1, F3D_RDPHALF_1, gbi->m_cmds, F3D_RDPHalf_1 );
97 GBI_SetGBI( GBI::G_RDPHALF_2, F3D_RDPHALF_2, gbi->m_cmds, F3D_RDPHalf_2 );
98 GBI_SetGBI( GBI::G_RDPHALF_CONT, F3D_RDPHALF_CONT, gbi->m_cmds, F3D_RDPHalf_Cont );
99 GBI_SetGBI( GBI::G_TRI4, F3D_TRI4, gbi->m_cmds, F3D_Tri4 );
100}
101
102//*****************************************************************************
103// Matrix Functions
104//*****************************************************************************
105
106//-----------------------------------------------------------------------------
107//* Add Matrix
108//! @param ucode instruction from displaylist with input data
109//-----------------------------------------------------------------------------
110void UCode0::F3D_Mtx(MicrocodeArgument* ucode)
111{
112 Logger::getSingleton().printMsg("F3D_Mtx", M64MSG_VERBOSE);
113 RSPUCodeAddMatrix0* temp = (RSPUCodeAddMatrix0*)ucode;
114
115 //Add matrix
116 m_rsp->RSP_Matrix( temp->segmentAddress, //Segment adress
117 temp->projection, //Projection or view matrix?
118 temp->push, //Save Current Matrix?
119 temp->load ); //Replace aka Load or Mult
120}
121
122//-----------------------------------------------------------------------------
123//* Pop Matrix
124//! @param ucode instruction from displaylist with input data
125//-----------------------------------------------------------------------------
126void UCode0::F3D_PopMtx(MicrocodeArgument* ucode)
127{
128 Logger::getSingleton().printMsg("F3D_PopMtx", M64MSG_VERBOSE);
129
130 //Pop Matrix
131 m_rsp->RSP_PopMatrix();
132}
133
134//*****************************************************************************
135// Vertex Functions
136//*****************************************************************************
137
138//-----------------------------------------------------------------------------
139//* Add Vertex
140//! @param ucode instruction from displaylist with input data
141//-----------------------------------------------------------------------------
142void UCode0::F3D_Vtx(MicrocodeArgument* ucode)
143{
144 Logger::getSingleton().printMsg("F3D_Vtx", M64MSG_VERBOSE);
145 RSPUCodeAddVertices0* temp = (RSPUCodeAddVertices0*)ucode;
146
147 //Add vertex
148 m_rsp->RSP_Vertex(temp->segmentAddress, temp->numVertices + 1, temp->firstVertex);
149}
150
151//-----------------------------------------------------------------------------
152//* F3D Render 1 Triangle
153//! @param ucode instruction from displaylist with input data
154//! @todo Triangle flag?
155//-----------------------------------------------------------------------------
156void UCode0::F3D_Tri1(MicrocodeArgument* ucode)
157{
158 Logger::getSingleton().printMsg("F3D_Tri1", M64MSG_VERBOSE);
159 RSPUCodeAddOneTriangleF3D* temp = (RSPUCodeAddOneTriangleF3D*)ucode;
160
161 //Add one triangle //TODO Flag?
162 m_rsp->RSP_1Triangle(temp->index0 / 10, temp->index1 / 10, temp->index2 / 10);
163}
164
165//-----------------------------------------------------------------------------
166//* F3D Render 4 Triangles
167//! @param ucode instruction from displaylist with input data
168//-----------------------------------------------------------------------------
169void UCode0::F3D_Tri4(MicrocodeArgument* ucode)
170{
171 Logger::getSingleton().printMsg("F3D_Tri4", M64MSG_VERBOSE);
172 RSPUCodeAddFourTrianglesF3D* temp = (RSPUCodeAddFourTrianglesF3D*)ucode;
173
174 //Add four triangles
175 m_rsp->RSP_4Triangles( temp->v0, temp->v1, temp->v2,
176 temp->v3, temp->v4, temp->v5,
177 temp->v6, temp->v7, temp->v8,
178 temp->v9, temp->v10, temp->v11);
179}
180
181//-----------------------------------------------------------------------------
182//* F3D Render 1 Quad
183//! @param ucode instruction from displaylist with input data
184//-----------------------------------------------------------------------------
185void UCode0::F3D_Quad(MicrocodeArgument* ucode)
186{
187 Logger::getSingleton().printMsg("F3D_Quad", M64MSG_VERBOSE);
188 RSPUCodeAddOneQuadF3D* temp = (RSPUCodeAddOneQuadF3D*)ucode;
189
190 //Add one Quad
191 m_rsp->RSP_1Quadrangle(temp->index0 / 10, temp->index1 / 10, temp->index2 / 10, temp->index3 / 10);
192}
193
194//*****************************************************************************
195// Display List Functions
196//*****************************************************************************
197
198//-----------------------------------------------------------------------------
199//* Display List
200//! @param ucode instruction from displaylist with input data
201//-----------------------------------------------------------------------------
202void UCode0::F3D_DList(MicrocodeArgument* ucode)
203{
204 Logger::getSingleton().printMsg("F3D_DList", M64MSG_VERBOSE);
205 RSPUCodeDisplayList* temp = (RSPUCodeDisplayList*)ucode;
206
207 switch ( temp->param )
208 {
209 case G_DL_PUSH : m_rsp->RSP_DisplayList( temp->segmentAddress ); break;
210 case G_DL_NOPUSH : m_rsp->RSP_BranchList( temp->segmentAddress ); break;
211 }
212}
213
214//-----------------------------------------------------------------------------
215//* End Display List
216//! @param ucode instruction from displaylist with input data
217//-----------------------------------------------------------------------------
218void UCode0::F3D_EndDL(MicrocodeArgument* ucode)
219{
220 Logger::getSingleton().printMsg("F3D_EndDL", M64MSG_VERBOSE);
221
222 //End Display List
223 m_rsp->RSP_EndDisplayList();
224}
225
226//-----------------------------------------------------------------------------
227// Cull Display List
228//! @todo Cull Display List
229//-----------------------------------------------------------------------------
230void UCode0::F3D_CullDL(MicrocodeArgument* ucode)
231{
232 Logger::getSingleton().printMsg("F3D_CullDL", M64MSG_VERBOSE);
233 //TODO
234}
235
236//*****************************************************************************
237// Texturing
238//*****************************************************************************
239
240//-----------------------------------------------------------------------------
241// Texture
242//-----------------------------------------------------------------------------
243void UCode0::F3D_Texture(MicrocodeArgument* ucode)
244{
245 Logger::getSingleton().printMsg("F3D_Texture", M64MSG_VERBOSE);
246 RSPUCodeTexture* temp = (RSPUCodeTexture*)ucode;
247
248 float scaleS = _FIXED2FLOAT( _SHIFTR( ucode->w1, 16, 16 ), 16 );
249 float scaleT = _FIXED2FLOAT( _SHIFTR( ucode->w1, 0, 16 ), 16 );
250 int on = _SHIFTR( ucode->w0, 0, 8 );
251
252 m_rsp->RSP_Texture(scaleS, scaleT, (int)temp->level, (int)temp->tile, on);
253}
254
255//*****************************************************************************
256// Half
257//*****************************************************************************
258
259//-----------------------------------------------------------------------------
260//* Half 1
261//! @param ucode instruction from displaylist with input data
262//-----------------------------------------------------------------------------
263void UCode0::F3D_RDPHalf_1(MicrocodeArgument* ucode)
264{
265 Logger::getSingleton().printMsg("F3D_RDPHalf_1", M64MSG_VERBOSE);
266 m_rdp->setHalf1( ucode->w1 );
267}
268
269//-----------------------------------------------------------------------------
270//* Half 2
271//! @param ucode instruction from displaylist with input data
272//-----------------------------------------------------------------------------
273void UCode0::F3D_RDPHalf_2(MicrocodeArgument* ucode)
274{
275 Logger::getSingleton().printMsg("F3D_RDPHalf_2", M64MSG_VERBOSE);
276 m_rdp->setHalf2( ucode->w1 );
277}
278//-----------------------------------------------------------------------------
279// Half Cont
280//-----------------------------------------------------------------------------
281void UCode0::F3D_RDPHalf_Cont(MicrocodeArgument* ucode)
282{
283 Logger::getSingleton().printMsg("F3D_RDPHalf_Cont", M64MSG_VERBOSE);
284 //Ignore
285}
286
287//*****************************************************************************
288// Geometry Mode
289//*****************************************************************************
290
291//-----------------------------------------------------------------------------
292// Set Geometry Mode
293//-----------------------------------------------------------------------------
294void UCode0::F3D_SetGeometryMode(MicrocodeArgument* ucode)
295{
296 Logger::getSingleton().printMsg("F3D_SetGeometryMode", M64MSG_VERBOSE);
297 m_rsp->RSP_SetGeometryMode(ucode->w1);
298}
299
300//-----------------------------------------------------------------------------
301// Clear Geometry Mode
302//-----------------------------------------------------------------------------
303void UCode0::F3D_ClearGeometryMode(MicrocodeArgument* ucode)
304{
305 Logger::getSingleton().printMsg("F3D_ClearGeometryMode", M64MSG_VERBOSE);
306 m_rsp->RSP_ClearGeometryMode(ucode->w1);
307}
308
309//*****************************************************************************
310// Set Other Modes
311//*****************************************************************************
312
313//-----------------------------------------------------------------------------
314// Set Other Mode H
315//-----------------------------------------------------------------------------
316void UCode0::F3D_SetOtherMode_H(MicrocodeArgument* ucode)
317{
318 Logger::getSingleton().printMsg("F3D_SetOtherMode_H", M64MSG_VERBOSE);
319
320 unsigned int otherModeType = _SHIFTR(ucode->w0, 8, 8);
321 unsigned int w1 = ucode->w1;
322
323 switch ( otherModeType )
324 {
325 case G_MDSFT_PIPELINE:
326 //gDPPipelineMode( w1 >> G_MDSFT_PIPELINE );
327 break;
328 case G_MDSFT_CYCLETYPE:
329 m_rdp->setCycleType( G_CYCLE_TYPE(w1 >> G_MDSFT_CYCLETYPE) );
330 break;
331
332 case G_MDSFT_TEXTPERSP:
333 //gDPSetTexturePersp( w1 >> G_MDSFT_TEXTPERSP );
334 break;
335 case G_MDSFT_TEXTDETAIL:
336 //gDPSetTextureDetail( w1 >> G_MDSFT_TEXTDETAIL );
337 break;
338 case G_MDSFT_TEXTLOD:
339 //gDPSetTextureLOD( w1 >> G_MDSFT_TEXTLOD );
340 break;
341 case G_MDSFT_TEXTLUT:
342 m_rdp->setTextureLUT( w1 >> G_MDSFT_TEXTLUT );
343 break;
344 case G_MDSFT_TEXTFILT:
345 m_rdp->setTextureFiltering(w1 >> G_MDSFT_TEXTFILT);
346 break;
347 case G_MDSFT_TEXTCONV:
348 //gDPSetTextureConvert( w1 >> G_MDSFT_TEXTCONV );
349 break;
350 case G_MDSFT_COMBKEY:
351 //gDPSetCombineKey( w1 >> G_MDSFT_COMBKEY );
352 break;
353 case G_MDSFT_RGBDITHER:
354 //gDPSetColorDither( w1 >> G_MDSFT_RGBDITHER );
355 break;
356 case G_MDSFT_ALPHADITHER:
357 //gDPSetAlphaDither( w1 >> G_MDSFT_ALPHADITHER );
358 break;
359 default:
360 unsigned int shift = _SHIFTR( ucode->w0, 8, 8 );
361 unsigned int length = _SHIFTR( ucode->w0, 0, 8 );
362 unsigned int mask = ((1 << length) - 1) << shift;
363 m_rdp->m_otherMode.h &= ~mask;
364 m_rdp->m_otherMode.h |= w1 & mask;
365 m_rdp->setUpdateCombiner(true);
366 break;
367 }
368}
369
370//-----------------------------------------------------------------------------
371// Set Other Mode L
372//-----------------------------------------------------------------------------
373void UCode0::F3D_SetOtherMode_L(MicrocodeArgument* ucode)
374{
375 Logger::getSingleton().printMsg("F3D_SetOtherMode_L", M64MSG_VERBOSE);
376
377 switch (_SHIFTR( ucode->w0, 8, 8 ))
378 {
379 case G_MDSFT_ALPHACOMPARE:
380 m_rdp->setAlphaCompareMode(ucode->w1 >> G_MDSFT_ALPHACOMPARE);
381 break;
382 case G_MDSFT_ZSRCSEL:
383 m_rdp->setDepthSource( ucode->w1 >> G_MDSFT_ZSRCSEL );
384 break;
385 case G_MDSFT_RENDERMODE:
386 m_rdp->setRenderMode(ucode->w1);
387 break;
388 default:
389 unsigned int shift = _SHIFTR( ucode->w0, 8, 8 );
390 unsigned int length = _SHIFTR( ucode->w0, 0, 8 );
391 unsigned int mask = ((1 << length) - 1) << shift;
392
393 m_rdp->m_otherMode.l &= ~mask;
394 m_rdp->m_otherMode.l |= ucode->w1 & mask;
395 break;
396 }
397}
398
399
400//*****************************************************************************
401// Other
402//*****************************************************************************
403
404//-----------------------------------------------------------------------------
405//* Move Mem
406//! @todo Add more case in switch, Like Force Matrix
407//-----------------------------------------------------------------------------
408void UCode0::F3D_MoveMem(MicrocodeArgument* ucode)
409{
410 Logger::getSingleton().printMsg("F3D_MoveMem", M64MSG_VERBOSE);
411
412 unsigned int type = ((ucode->w0)>>16)&0xFF;
413 unsigned int segmentAddress = ucode->w1;
414
415 switch (type)
416 {
417 //Viewport
418 case F3D_MV_VIEWPORT:
419 m_rsp->moveMemViewport(segmentAddress);
420 break;
421
422 case G_MV_MATRIX_1:
423 m_rsp->RSP_ForceMatrix(segmentAddress);
424 m_displayListParser->increasePC(24); //// force matrix takes four commands
425 break;
426
427 //Lights
428 case G_MV_L0: m_rsp->RSP_Light(0, segmentAddress); break;
429 case G_MV_L1: m_rsp->RSP_Light(1, segmentAddress); break;
430 case G_MV_L2: m_rsp->RSP_Light(2, segmentAddress); break;
431 case G_MV_L3: m_rsp->RSP_Light(3, segmentAddress); break;
432 case G_MV_L4: m_rsp->RSP_Light(4, segmentAddress); break;
433 case G_MV_L5: m_rsp->RSP_Light(5, segmentAddress); break;
434 case G_MV_L6: m_rsp->RSP_Light(6, segmentAddress); break;
435 case G_MV_L7: m_rsp->RSP_Light(7, segmentAddress); break;
436
437 //Look at
438 case G_MV_LOOKATX:
439 //IGNORE
440 break;
441 //Look at
442 case G_MV_LOOKATY:
443 //IGNORE
444 break;
445
446 //case RSP_GBI1_MV_MEM_LOOKATY:
447 // //IGNORE
448 // break;
449 //case RSP_GBI1_MV_MEM_LOOKATX:
450 // //IGNORE
451 // break;
452
453 //TODO?
454 //case RSP_GBI1_MV_MEM_TXTATT: break;
455 //case RSP_GBI1_MV_MEM_MATRIX_1:
456 // RSP_GFX_Force_Matrix(addr);
457 // break;
458 //case RSP_GBI1_MV_MEM_MATRIX_2: break;
459 //case RSP_GBI1_MV_MEM_MATRIX_3: break;
460 //case RSP_GBI1_MV_MEM_MATRIX_4: break;
461
462 default:
463 Logger::getSingleton().printMsg("F3D_MoveMem: Unknown type", M64MSG_WARNING);
464 break;
465 }
466}
467
468//-----------------------------------------------------------------------------
469//* F3D Sprite2D Base
470//! @todo F3D Sprite2D Base
471//-----------------------------------------------------------------------------
472void UCode0::F3D_Sprite2D_Base(MicrocodeArgument* ucode)
473{
474 Logger::getSingleton().printMsg("F3D_Sprite2D_Base - Unimplemented", M64MSG_WARNING);
475 //TODO
476}
477
478//-----------------------------------------------------------------------------
479// Move Word
480//-----------------------------------------------------------------------------
481void UCode0::F3D_MoveWord(MicrocodeArgument* ucode)
482{
483 Logger::getSingleton().printMsg("F3D_MoveWord");
484 RSPUCodeMoveWordF3D* temp = (RSPUCodeMoveWordF3D*)ucode;
485
486 switch ( temp->type )
487 {
488 case G_MW_MATRIX:
489 m_rsp->RSP_InsertMatrix(temp->offset, temp->value);
490 break;
491
492 case G_MW_FOG:
493 m_rsp->RSP_FogFactor( (short)temp->fm, (short)temp->fo );
494 break;
495
496 case G_MW_NUMLIGHT:
497 m_rsp->RSP_NumLights( (unsigned int)(((ucode->w1 - 0x80000000) >> 5) - 1) );
498 break;
499
500 case G_MW_SEGMENT:
501 m_rsp->moveSegment((temp->offset >> 2) & 0xF, temp->value);
502 break;
503
504 case G_MW_LIGHTCOL:
505 if ( (temp->offset & 0x7) == 0 )
506 {
507 m_rsp->RSP_LightColor(temp->offset / 0x20, temp->value);
508 }
509 break;
510
511 case G_MW_POINTS:
512 m_rsp->RSP_ModifyVertex( _SHIFTR( ucode->w0, 8, 16 ) / 40, _SHIFTR( ucode->w0, 0, 8 ) % 40, ucode->w1);
513 break;
514
515 case G_MW_CLIP:
516 //gSPClipRatio( w1 );
517 break;
518
519 case G_MW_PERSPNORM:
520 //gSPPerspNormalize( w1 );
521 break;
522 }
523}
524
525//*****************************************************************************
526// Non important functions
527//*****************************************************************************
528
529void UCode0::F3D_SPNoOp(MicrocodeArgument* ucode){
530 Logger::getSingleton().printMsg("F3D_SPNoOp", M64MSG_VERBOSE);
531
532 //If next command is a no-operation then skip displaylist for some ucodes.
533 //if( (ucode+1)->words.cmd == 0x00 && gRSP.ucode >= 17 )
534 //{
535 // m_rsp->RSP_EndDisplayList();
536 //}
537}
538
539void UCode0::F3D_Reserved0(MicrocodeArgument* ucode) {
540 Logger::getSingleton().printMsg("F3D_Reserved0", M64MSG_VERBOSE);
541}
542
543void UCode0::F3D_Reserved1(MicrocodeArgument* ucode){
544 Logger::getSingleton().printMsg("F3D_Reserved1", M64MSG_VERBOSE);
545}
546
547void UCode0::F3D_Reserved2(MicrocodeArgument* ucode){
548 Logger::getSingleton().printMsg("F3D_Reserved2", M64MSG_VERBOSE);
549}
550
551void UCode0::F3D_Reserved3(MicrocodeArgument* ucode){
552 Logger::getSingleton().printMsg("F3D_Reserved3", M64MSG_VERBOSE);
553}