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
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 "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//-----------------------------------------------------------------------------
100RSP* UCode5::m_rsp = 0; //!< Pointer to Reality Signal Processor
101RDP* UCode5::m_rdp = 0; //!< Pointer to Reality Drawing Processor
102Memory* UCode5::m_memory = 0;
103GBI* UCode5::m_gbi = 0;
104DisplayListParser* UCode5::m_displayListParser = 0;
105
106//-----------------------------------------------------------------------------
107//! Constructor
108//-----------------------------------------------------------------------------
109UCode5::UCode5()
110{
111}
112
113//-----------------------------------------------------------------------------
114//! Destructor
115//-----------------------------------------------------------------------------
116UCode5::~UCode5()
117{
118}
119
120//-----------------------------------------------------------------------------
121//! Initialize
122//-----------------------------------------------------------------------------
123void 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//-----------------------------------------------------------------------------
135void 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//-----------------------------------------------------------------------------
179void 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//-----------------------------------------------------------------------------
204void 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//-----------------------------------------------------------------------------
218void 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//-----------------------------------------------------------------------------
238void 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//-----------------------------------------------------------------------------
251void 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//-----------------------------------------------------------------------------
263void 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//-----------------------------------------------------------------------------
276void 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//-----------------------------------------------------------------------------
289void 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//-----------------------------------------------------------------------------
359void 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//-----------------------------------------------------------------------------
406void 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//-----------------------------------------------------------------------------
417void 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//-----------------------------------------------------------------------------
463void 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
492void UCode5::F3DEX2_DMAIO( MicrocodeArgument* ucode ) {
493 Logger::getSingleton().printMsg("F3DEX2_DMAIO", M64MSG_VERBOSE);
494 //Ignore?
495}
496void UCode5::F3DEX2_Special_1( MicrocodeArgument* ucode ) {
497 Logger::getSingleton().printMsg("F3DEX2_Special_1", M64MSG_VERBOSE);
498 //Ignore?
499}
500void UCode5::F3DEX2_Special_2( MicrocodeArgument* ucode ) {
501 Logger::getSingleton().printMsg("F3DEX2_Special_2", M64MSG_VERBOSE);
502 //Ignore?
503}
504void UCode5::F3DEX2_Special_3( MicrocodeArgument* ucode ) {
505 Logger::getSingleton().printMsg("F3DEX2_Special_3", M64MSG_VERBOSE);
506 //Ignore?
507}
508
509//*****************************************************************************
510// Unimportant Functions
511//*****************************************************************************
512void UCode5::F3DEX2_Reserved1(MicrocodeArgument* ucode) {
513 Logger::getSingleton().printMsg("F3DEX2_Reserved1", M64MSG_VERBOSE);
514 //Ignore
515}