1 /******************************************************************************
2 * Arachnoid Graphics Plugin for Mupen64Plus
3 * http://bitbucket.org/wahrhaft/mupen64plus-video-arachnoid/
5 * Copyright (C) 2007 Kristofer Karlsson, Rickard Niklasson
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.
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.
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 *****************************************************************************/
26 #include "UCodeDefs.h"
33 class DisplayListParser;
36 #define F3D_MTX_STACKSIZE 10
38 #define F3D_MTX_MODELVIEW 0x00
39 #define F3D_MTX_PROJECTION 0x01
40 #define F3D_MTX_MUL 0x00
41 #define F3D_MTX_LOAD 0x02
42 #define F3D_MTX_NOPUSH 0x00
43 #define F3D_MTX_PUSH 0x04
45 #define F3D_TEXTURE_ENABLE 0x00000002
46 #define F3D_SHADING_SMOOTH 0x00000200
47 #define F3D_CULL_FRONT 0x00001000
48 #define F3D_CULL_BACK 0x00002000
49 #define F3D_CULL_BOTH 0x00003000
50 #define F3D_CLIPPING 0x00000000
52 #define F3D_MV_VIEWPORT 0x80
54 #define F3D_MWO_aLIGHT_1 0x00
55 #define F3D_MWO_bLIGHT_1 0x04
56 #define F3D_MWO_aLIGHT_2 0x20
57 #define F3D_MWO_bLIGHT_2 0x24
58 #define F3D_MWO_aLIGHT_3 0x40
59 #define F3D_MWO_bLIGHT_3 0x44
60 #define F3D_MWO_aLIGHT_4 0x60
61 #define F3D_MWO_bLIGHT_4 0x64
62 #define F3D_MWO_aLIGHT_5 0x80
63 #define F3D_MWO_bLIGHT_5 0x84
64 #define F3D_MWO_aLIGHT_6 0xa0
65 #define F3D_MWO_bLIGHT_6 0xa4
66 #define F3D_MWO_aLIGHT_7 0xc0
67 #define F3D_MWO_bLIGHT_7 0xc4
68 #define F3D_MWO_aLIGHT_8 0xe0
69 #define F3D_MWO_bLIGHT_8 0xe4
72 #define F3D_SPNOOP 0x00
74 #define F3D_RESERVED0 0x02
75 #define F3D_MOVEMEM 0x03
77 #define F3D_RESERVED1 0x05
79 #define F3D_RESERVED2 0x07
80 #define F3D_RESERVED3 0x08
81 #define F3D_SPRITE2D_BASE 0x09
84 #define F3D_CULLDL 0xBE
85 #define F3D_POPMTX 0xBD
86 #define F3D_MOVEWORD 0xBC
87 #define F3D_TEXTURE 0xBB
88 #define F3D_SETOTHERMODE_H 0xBA
89 #define F3D_SETOTHERMODE_L 0xB9
90 #define F3D_ENDDL 0xB8
91 #define F3D_SETGEOMETRYMODE 0xB7
92 #define F3D_CLEARGEOMETRYMODE 0xB6
93 //#define F3D_LINE3D 0xB5 // Only used in Line3D
95 #define F3D_RDPHALF_1 0xB4
96 #define F3D_RDPHALF_2 0xB3
97 #define F3D_RDPHALF_CONT 0xB2
100 //*****************************************************************************
101 //! UCode0 (aka F3D - Fast 3D)
102 //! Microcode used for Super Mario 64!!!
103 //*****************************************************************************
111 static void initialize(RSP* rsp, RDP* rdp, Memory* memory, DisplayListParser* dlp);
112 static void initializeGBI(GBI* gbi);
117 static void F3D_Mtx(MicrocodeArgument* ucode);
118 static void F3D_PopMtx(MicrocodeArgument* ucode);
121 static void F3D_Vtx(MicrocodeArgument* ucode);
122 static void F3D_Tri1(MicrocodeArgument* ucode);
123 static void F3D_Tri4(MicrocodeArgument* ucode);
124 static void F3D_Quad(MicrocodeArgument* ucode);
127 static void F3D_DList(MicrocodeArgument* ucode);
128 static void F3D_EndDL(MicrocodeArgument* ucode);
129 static void F3D_CullDL(MicrocodeArgument* ucode); //Unimplemented
132 static void F3D_Texture(MicrocodeArgument* ucode);
135 static void F3D_RDPHalf_1(MicrocodeArgument* ucode);
136 static void F3D_RDPHalf_2(MicrocodeArgument* ucode);
137 static void F3D_RDPHalf_Cont(MicrocodeArgument* ucode); //Unimplmeneted
140 static void F3D_SetGeometryMode(MicrocodeArgument* ucode);
141 static void F3D_ClearGeometryMode(MicrocodeArgument* ucode);
144 static void F3D_SetOtherMode_H(MicrocodeArgument* ucode);
145 static void F3D_SetOtherMode_L(MicrocodeArgument* ucode);
148 static void F3D_MoveMem(MicrocodeArgument* ucode);
149 static void F3D_MoveWord(MicrocodeArgument* ucode);
150 static void F3D_Sprite2D_Base(MicrocodeArgument* ucode); //Unimplemented
153 static void F3D_SPNoOp(MicrocodeArgument* ucode);
154 static void F3D_Reserved0(MicrocodeArgument* ucode);
155 static void F3D_Reserved1(MicrocodeArgument* ucode);
156 static void F3D_Reserved2(MicrocodeArgument* ucode);
157 static void F3D_Reserved3(MicrocodeArgument* ucode);
161 static RSP* m_rsp; //!< Pointer to Reality Signal Processor
162 static RDP* m_rdp; //!< Pointer to Reality Drawing Processor
163 static Memory* m_memory; //!< Pointer to Memory Manager
164 static DisplayListParser* m_displayListParser; //!< Pointer to Display List Parser