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