1 #include <string.h>
2 #include <stdio.h>
3 #include "COP_FPU.h"
4 #include "MIPS.h"
5 
6 using namespace MIPSReflection;
7 
ReflOpRtFs(INSTRUCTION * pInstr,CMIPS * pCtx,uint32 nAddress,uint32 nOpcode,char * sText,unsigned int nCount)8 void CCOP_FPU::ReflOpRtFs(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
9 {
10 	uint8 nRT = static_cast<uint8>((nOpcode >> 16) & 0x001F);
11 	uint8 nFS = static_cast<uint8>((nOpcode >> 11) & 0x001F);
12 
13 	sprintf(sText, "%s, F%i", CMIPS::m_sGPRName[nRT], nFS);
14 }
15 
ReflOpRtFcs(INSTRUCTION * pInstr,CMIPS * pCtx,uint32 nAddress,uint32 nOpcode,char * sText,unsigned int nCount)16 void CCOP_FPU::ReflOpRtFcs(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
17 {
18 	uint8 nRT = static_cast<uint8>((nOpcode >> 16) & 0x001F);
19 	uint8 nFS = static_cast<uint8>((nOpcode >> 11) & 0x001F);
20 
21 	sprintf(sText, "%s, FCR%i", CMIPS::m_sGPRName[nRT], nFS);
22 }
23 
ReflOpFdFs(INSTRUCTION * pInstr,CMIPS * pCtx,uint32 nAddress,uint32 nOpcode,char * sText,unsigned int nCount)24 void CCOP_FPU::ReflOpFdFs(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
25 {
26 	uint8 nFS = static_cast<uint8>((nOpcode >> 11) & 0x001F);
27 	uint8 nFD = static_cast<uint8>((nOpcode >> 6) & 0x001F);
28 
29 	sprintf(sText, "F%i, F%i", nFD, nFS);
30 }
31 
ReflOpFdFt(INSTRUCTION * pInstr,CMIPS * pCtx,uint32 nAddress,uint32 nOpcode,char * sText,unsigned int nCount)32 void CCOP_FPU::ReflOpFdFt(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
33 {
34 	uint8 nFT = static_cast<uint8>((nOpcode >> 16) & 0x001F);
35 	uint8 nFD = static_cast<uint8>((nOpcode >> 6) & 0x001F);
36 
37 	sprintf(sText, "F%i, F%i", nFD, nFT);
38 }
39 
ReflOpFsFt(INSTRUCTION * pInstr,CMIPS * pCtx,uint32 nAddress,uint32 nOpcode,char * sText,unsigned int nCount)40 void CCOP_FPU::ReflOpFsFt(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
41 {
42 	uint8 nFS = static_cast<uint8>((nOpcode >> 11) & 0x001F);
43 	uint8 nFT = static_cast<uint8>((nOpcode >> 16) & 0x001F);
44 
45 	sprintf(sText, "F%i, F%i", nFS, nFT);
46 }
47 
ReflOpCcFsFt(INSTRUCTION * pInstr,CMIPS * pCtx,uint32 nAddress,uint32 nOpcode,char * sText,unsigned int nCount)48 void CCOP_FPU::ReflOpCcFsFt(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
49 {
50 	uint8 nFT = static_cast<uint8>((nOpcode >> 16) & 0x001F);
51 	uint8 nFS = static_cast<uint8>((nOpcode >> 11) & 0x001F);
52 	uint8 nCC = static_cast<uint8>((nOpcode >> 8) & 0x0007);
53 
54 	sprintf(sText, "CC%i, F%i, F%i", nCC, nFS, nFT);
55 }
56 
ReflOpFdFsFt(INSTRUCTION * pInstr,CMIPS * pCtx,uint32 nAddress,uint32 nOpcode,char * sText,unsigned int nCount)57 void CCOP_FPU::ReflOpFdFsFt(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
58 {
59 	uint8 nFT = static_cast<uint8>((nOpcode >> 16) & 0x001F);
60 	uint8 nFS = static_cast<uint8>((nOpcode >> 11) & 0x001F);
61 	uint8 nFD = static_cast<uint8>((nOpcode >> 6) & 0x001F);
62 
63 	sprintf(sText, "F%i, F%i, F%i", nFD, nFS, nFT);
64 }
65 
ReflOpFtOffRs(INSTRUCTION * pInstr,CMIPS * pCtx,uint32 nAddress,uint32 nOpcode,char * sText,unsigned int nCount)66 void CCOP_FPU::ReflOpFtOffRs(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
67 {
68 	uint8 nRS = static_cast<uint8>((nOpcode >> 21) & 0x001F);
69 	uint8 nFT = static_cast<uint8>((nOpcode >> 16) & 0x001F);
70 	uint16 nImm = static_cast<uint16>((nOpcode >> 0) & 0xFFFF);
71 
72 	sprintf(sText, "F%i, $%04X(%s)", nFT, nImm, CMIPS::m_sGPRName[nRS]);
73 }
74 
ReflOpCcOff(INSTRUCTION * pInstr,CMIPS * pCtx,uint32 nAddress,uint32 nOpcode,char * sText,unsigned int nCount)75 void CCOP_FPU::ReflOpCcOff(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
76 {
77 	uint16 nImm = static_cast<uint16>((nOpcode >> 0) & 0xFFFF);
78 	nAddress += 4;
79 	sprintf(sText, "CC%i, $%08X", (nOpcode >> 18) & 0x07, nAddress + CMIPS::GetBranch(nImm));
80 }
81 
ReflEaOffset(INSTRUCTION * pInstr,CMIPS * pCtx,uint32 nAddress,uint32 nOpcode)82 uint32 CCOP_FPU::ReflEaOffset(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode)
83 {
84 	uint16 nImm = static_cast<uint16>((nOpcode >> 0) & 0xFFFF);
85 	nAddress += 4;
86 	return (nAddress + CMIPS::GetBranch(nImm));
87 }
88 
89 // clang-format off
90 INSTRUCTION CCOP_FPU::m_cReflGeneral[64] =
91 {
92 	//0x00
93 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
94 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
95 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
96 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
97 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
98 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
99 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
100 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
101 	//0x08
102 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
103 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
104 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
105 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
106 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
107 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
108 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
109 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
110 	//0x10
111 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
112 	{	"COP1",			NULL,			SubTableMnemonic,	SubTableOperands,	SubTableIsBranch,	SubTableEffAddr	},
113 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
114 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
115 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
116 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
117 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
118 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
119 	//0x18
120 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
121 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
122 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
123 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
124 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
125 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
126 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
127 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
128 	//0x20
129 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
130 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
131 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
132 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
133 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
134 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
135 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
136 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
137 	//0x28
138 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
139 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
140 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
141 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
142 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
143 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
144 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
145 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
146 	//0x30
147 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
148 	{	"LWC1",			NULL,			CopyMnemonic,		ReflOpFtOffRs,		NULL,				NULL			},
149 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
150 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
151 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
152 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
153 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
154 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
155 	//0x38
156 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
157 	{	"SWC1",			NULL,			CopyMnemonic,		ReflOpFtOffRs,		NULL,				NULL			},
158 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
159 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
160 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
161 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
162 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
163 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
164 };
165 
166 INSTRUCTION CCOP_FPU::m_cReflCop1[32] =
167 {
168 	//0x00
169 	{	"MFC1",			NULL,			CopyMnemonic,		ReflOpRtFs,			NULL,				NULL			},
170 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
171 	{	"CFC1",			NULL,			CopyMnemonic,		ReflOpRtFcs,		NULL,				NULL			},
172 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
173 	{	"MTC1",			NULL,			CopyMnemonic,		ReflOpRtFs,			NULL,				NULL			},
174 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
175 	{	"CTC1",			NULL,			CopyMnemonic,		ReflOpRtFcs,		NULL,				NULL			},
176 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
177 	//0x08
178 	{	"BC1",			NULL,			SubTableMnemonic,	SubTableOperands,	SubTableIsBranch,	SubTableEffAddr	},
179 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
180 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
181 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
182 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
183 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
184 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
185 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
186 	//0x10
187 	{	"S",			NULL,			SubTableMnemonic,	SubTableOperands,	SubTableIsBranch,	SubTableEffAddr	},
188 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
189 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
190 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
191 	{	"W",			NULL,			SubTableMnemonic,	SubTableOperands,	SubTableIsBranch,	SubTableEffAddr	},
192 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
193 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
194 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
195 	//0x18
196 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
197 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
198 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
199 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
200 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
201 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
202 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
203 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
204 };
205 
206 INSTRUCTION CCOP_FPU::m_cReflBc1[4] =
207 {
208 	//0x00
209 	{	"BC1F",			NULL,			CopyMnemonic,		ReflOpCcOff,		MIPSReflection::IsBranch,	ReflEaOffset	},
210 	{	"BC1T",			NULL,			CopyMnemonic,		ReflOpCcOff,		MIPSReflection::IsBranch,	ReflEaOffset	},
211 	{	"BC1FL",		NULL,			CopyMnemonic,		ReflOpCcOff,		MIPSReflection::IsBranch,	ReflEaOffset	},
212 	{	"BC1TL",		NULL,			CopyMnemonic,		ReflOpCcOff,		MIPSReflection::IsBranch,	ReflEaOffset	},
213 };
214 
215 INSTRUCTION CCOP_FPU::m_cReflS[64] =
216 {
217 	//0x00
218 	{	"ADD.S",		NULL,			CopyMnemonic,		ReflOpFdFsFt,		NULL,				NULL			},
219 	{	"SUB.S",		NULL,			CopyMnemonic,		ReflOpFdFsFt,		NULL,				NULL			},
220 	{	"MUL.S",		NULL,			CopyMnemonic,		ReflOpFdFsFt,		NULL,				NULL			},
221 	{	"DIV.S",		NULL,			CopyMnemonic,		ReflOpFdFsFt,		NULL,				NULL			},
222 	{	"SQRT.S",		NULL,			CopyMnemonic,		ReflOpFdFt,			NULL,				NULL			},
223 	{	"ABS.S",		NULL,			CopyMnemonic,		ReflOpFdFs,			NULL,				NULL			},
224 	{	"MOV.S",		NULL,			CopyMnemonic,		ReflOpFdFs,			NULL,				NULL			},
225 	{	"NEG.S",		NULL,			CopyMnemonic,		ReflOpFdFs,			NULL,				NULL			},
226 	//0x08
227 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
228 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
229 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
230 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
231 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
232 	{	"TRUNC.W.S",	NULL,			CopyMnemonic,		ReflOpFdFs,			NULL,				NULL			},
233 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
234 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
235 	//0x10
236 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
237 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
238 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
239 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
240 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
241 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
242 	{	"RSQRT.S",		NULL,			CopyMnemonic,		ReflOpFdFsFt,		NULL,				NULL			},
243 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
244 	//0x18
245 	{	"ADDA.S",		NULL,			CopyMnemonic,		ReflOpFsFt,			NULL,				NULL			},
246 	{	"SUBA.S",		NULL,			CopyMnemonic,		ReflOpFsFt,			NULL,				NULL			},
247 	{	"MULA.S",		NULL,			CopyMnemonic,		ReflOpFsFt,			NULL,				NULL			},
248 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
249 	{	"MADD.S",		NULL,			CopyMnemonic,		ReflOpFdFsFt,		NULL,				NULL			},
250 	{	"MSUB.S",		NULL,			CopyMnemonic,		ReflOpFdFsFt,		NULL,				NULL			},
251 	{	"MADDA.S",		NULL,			CopyMnemonic,		ReflOpFsFt,			NULL,				NULL			},
252 	{	"MSUBA.S",		NULL,			CopyMnemonic,		ReflOpFsFt,			NULL,				NULL			},
253 	//0x20
254 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
255 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
256 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
257 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
258 	{	"CVT.W.S",		NULL,			CopyMnemonic,		ReflOpFdFs,			NULL,				NULL			},
259 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
260 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
261 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
262 	//0x28
263 	{	"MAX.S",		NULL,			CopyMnemonic,   	ReflOpFdFsFt,		NULL,				NULL			},
264 	{	"MIN.S",		NULL,			CopyMnemonic,		ReflOpFdFsFt,		NULL,				NULL			},
265 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
266 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
267 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
268 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
269 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
270 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
271 	//0x30
272 	{	"C.F.S",		NULL,			CopyMnemonic,		ReflOpCcFsFt,		NULL,				NULL			},
273 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
274 	{	"C.EQ.S",		NULL,			CopyMnemonic,		ReflOpCcFsFt,		NULL,				NULL			},
275 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
276 	{	"C.LT.S",		NULL,			CopyMnemonic,		ReflOpCcFsFt,		NULL,				NULL			},
277 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
278 	{	"C.LE.S",		NULL,			CopyMnemonic,		ReflOpCcFsFt,		NULL,				NULL			},
279 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
280 	//0x38
281 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
282 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
283 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
284 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
285 	{	"C.LT.S",		NULL,			CopyMnemonic,		ReflOpCcFsFt,		NULL,				NULL			},
286 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
287 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
288 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
289 };
290 
291 INSTRUCTION CCOP_FPU::m_cReflW[64] =
292 {
293 	//0x00
294 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
295 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
296 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
297 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
298 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
299 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
300 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
301 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
302 	//0x08
303 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
304 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
305 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
306 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
307 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
308 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
309 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
310 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
311 	//0x10
312 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
313 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
314 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
315 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
316 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
317 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
318 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
319 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
320 	//0x18
321 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
322 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
323 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
324 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
325 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
326 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
327 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
328 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
329 	//0x20
330 	{	"CVT.S.W",		NULL,			CopyMnemonic,		ReflOpFdFs,			NULL,				NULL			},
331 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
332 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
333 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
334 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
335 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
336 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
337 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
338 	//0x28
339 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
340 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
341 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
342 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
343 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
344 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
345 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
346 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
347 	//0x30
348 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
349 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
350 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
351 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
352 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
353 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
354 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
355 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
356 	//0x38
357 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
358 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
359 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
360 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
361 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
362 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
363 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
364 	{	NULL,			NULL,			NULL,				NULL,				NULL,				NULL			},
365 };
366 // clang-format on
367 
SetupReflectionTables()368 void CCOP_FPU::SetupReflectionTables()
369 {
370 	static_assert(sizeof(m_reflGeneral) == sizeof(m_cReflGeneral), "Array sizes don't match");
371 	static_assert(sizeof(m_reflCop1) == sizeof(m_cReflCop1), "Array sizes don't match");
372 	static_assert(sizeof(m_reflBc1) == sizeof(m_cReflBc1), "Array sizes don't match");
373 	static_assert(sizeof(m_reflS) == sizeof(m_cReflS), "Array sizes don't match");
374 	static_assert(sizeof(m_reflW) == sizeof(m_cReflW), "Array sizes don't match");
375 
376 	memcpy(m_reflGeneral, m_cReflGeneral, sizeof(m_cReflGeneral));
377 	memcpy(m_reflCop1, m_cReflCop1, sizeof(m_cReflCop1));
378 	memcpy(m_reflBc1, m_cReflBc1, sizeof(m_cReflBc1));
379 	memcpy(m_reflS, m_cReflS, sizeof(m_cReflS));
380 	memcpy(m_reflW, m_cReflW, sizeof(m_cReflW));
381 
382 	m_reflGeneralTable.nShift = 26;
383 	m_reflGeneralTable.nMask = 0x3F;
384 	m_reflGeneralTable.pTable = m_reflGeneral;
385 
386 	m_reflCop1Table.nShift = 21;
387 	m_reflCop1Table.nMask = 0x1F;
388 	m_reflCop1Table.pTable = m_reflCop1;
389 
390 	m_reflBc1Table.nShift = 16;
391 	m_reflBc1Table.nMask = 0x03;
392 	m_reflBc1Table.pTable = m_reflBc1;
393 
394 	m_reflSTable.nShift = 0;
395 	m_reflSTable.nMask = 0x3F;
396 	m_reflSTable.pTable = m_reflS;
397 
398 	m_reflWTable.nShift = 0;
399 	m_reflWTable.nMask = 0x3F;
400 	m_reflWTable.pTable = m_reflW;
401 
402 	m_reflGeneral[0x11].pSubTable = &m_reflCop1Table;
403 
404 	m_reflCop1[0x08].pSubTable = &m_reflBc1Table;
405 	m_reflCop1[0x10].pSubTable = &m_reflSTable;
406 	m_reflCop1[0x14].pSubTable = &m_reflWTable;
407 }
408 
GetInstruction(uint32 nOpcode,char * sText)409 void CCOP_FPU::GetInstruction(uint32 nOpcode, char* sText)
410 {
411 	unsigned int nCount = 256;
412 	if(nOpcode == 0)
413 	{
414 		strncpy(sText, "NOP", nCount);
415 		return;
416 	}
417 
418 	INSTRUCTION Instr;
419 	Instr.pGetMnemonic = SubTableMnemonic;
420 	Instr.pSubTable = &m_reflGeneralTable;
421 	Instr.pGetMnemonic(&Instr, NULL, nOpcode, sText, nCount);
422 }
423 
GetArguments(uint32 nAddress,uint32 nOpcode,char * sText)424 void CCOP_FPU::GetArguments(uint32 nAddress, uint32 nOpcode, char* sText)
425 {
426 	unsigned int nCount = 256;
427 	if(nOpcode == 0)
428 	{
429 		strncpy(sText, "", nCount);
430 		return;
431 	}
432 
433 	INSTRUCTION Instr;
434 	Instr.pGetOperands = SubTableOperands;
435 	Instr.pSubTable = &m_reflGeneralTable;
436 	Instr.pGetOperands(&Instr, NULL, nAddress, nOpcode, sText, nCount);
437 }
438 
IsBranch(uint32 nOpcode)439 MIPS_BRANCH_TYPE CCOP_FPU::IsBranch(uint32 nOpcode)
440 {
441 	if(nOpcode == 0) return MIPS_BRANCH_NONE;
442 
443 	INSTRUCTION Instr;
444 	Instr.pIsBranch = SubTableIsBranch;
445 	Instr.pSubTable = &m_reflGeneralTable;
446 	return Instr.pIsBranch(&Instr, NULL, nOpcode);
447 }
448 
GetEffectiveAddress(uint32 nAddress,uint32 nOpcode)449 uint32 CCOP_FPU::GetEffectiveAddress(uint32 nAddress, uint32 nOpcode)
450 {
451 	if(nOpcode == 0) return 0;
452 
453 	INSTRUCTION Instr;
454 	Instr.pGetEffectiveAddress = SubTableEffAddr;
455 	Instr.pSubTable = &m_reflGeneralTable;
456 	return Instr.pGetEffectiveAddress(&Instr, NULL, nAddress, nOpcode);
457 }
458