2015-05-06 00:54:15 -04:00
|
|
|
#include <string.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "../MIPS.h"
|
|
|
|
#include "COP_VU.h"
|
|
|
|
#include "VUShared.h"
|
|
|
|
|
|
|
|
using namespace MIPSReflection;
|
|
|
|
using namespace VUShared;
|
|
|
|
|
|
|
|
void CCOP_VU::ReflMnemI(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nOpcode, char* sText, unsigned int nCount)
|
|
|
|
{
|
|
|
|
strncpy(sText, pInstr->sMnemonic, nCount);
|
|
|
|
|
|
|
|
if(nOpcode & 1)
|
|
|
|
{
|
|
|
|
strcat(sText, ".I");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
strcat(sText, ".NI");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-09-02 18:36:51 -04:00
|
|
|
void CCOP_VU::ReflOpOff(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
|
|
|
|
{
|
|
|
|
auto imm = static_cast<uint16>((nOpcode >> 0) & 0xFFFF);
|
|
|
|
nAddress += 4;
|
2017-05-29 06:01:32 +01:00
|
|
|
sprintf(sText, "$%08X", nAddress + CMIPS::GetBranch(imm));
|
2016-09-02 18:36:51 -04:00
|
|
|
}
|
|
|
|
|
2015-05-06 00:54:15 -04:00
|
|
|
void CCOP_VU::ReflOpRtFd(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
|
|
|
|
{
|
|
|
|
uint8 nRT = static_cast<uint8>((nOpcode >> 16) & 0x001F);
|
|
|
|
uint8 nFD = static_cast<uint8>((nOpcode >> 11) & 0x001F);
|
|
|
|
|
|
|
|
sprintf(sText, "%s, VF%i", CMIPS::m_sGPRName[nRT], nFD);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCOP_VU::ReflOpRtId(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
|
|
|
|
{
|
|
|
|
uint8 nRT = static_cast<uint8>((nOpcode >> 16) & 0x001F);
|
|
|
|
uint8 nID = static_cast<uint8>((nOpcode >> 11) & 0x001F);
|
|
|
|
|
|
|
|
sprintf(sText, "%s, VI%i", CMIPS::m_sGPRName[nRT], nID);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCOP_VU::ReflOpImm15(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
|
|
|
|
{
|
2018-04-30 21:01:23 +01:00
|
|
|
uint16 nImm = static_cast<uint16>((nOpcode >> 6) & 0x7FFF);
|
2015-05-06 00:54:15 -04:00
|
|
|
|
2017-05-29 06:01:32 +01:00
|
|
|
sprintf(sText, "$%04X", nImm);
|
2015-05-06 00:54:15 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void CCOP_VU::ReflOpAccFsFt(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
|
|
|
|
{
|
2018-04-30 21:01:23 +01:00
|
|
|
uint8 nFT = static_cast<uint8>((nOpcode >> 16) & 0x001F);
|
|
|
|
uint8 nFS = static_cast<uint8>((nOpcode >> 11) & 0x001F);
|
|
|
|
uint8 nDest = static_cast<uint8>((nOpcode >> 21) & 0x000F);
|
2015-05-06 00:54:15 -04:00
|
|
|
|
|
|
|
sprintf(sText, "ACC%s, VF%i%s, VF%i%s", m_sDestination[nDest], nFS, m_sDestination[nDest], nFT, m_sDestination[nDest]);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCOP_VU::ReflOpFtOffRs(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
|
|
|
|
{
|
2018-04-30 21:01:23 +01:00
|
|
|
uint8 nRS = static_cast<uint8>((nOpcode >> 21) & 0x001F);
|
|
|
|
uint8 nFT = static_cast<uint8>((nOpcode >> 16) & 0x001F);
|
|
|
|
uint16 nImm = static_cast<uint16>((nOpcode >> 0) & 0xFFFF);
|
2015-05-06 00:54:15 -04:00
|
|
|
|
2017-05-29 06:01:32 +01:00
|
|
|
sprintf(sText, "VF%i, $%04X(%s)", nFT, nImm, CMIPS::m_sGPRName[nRS]);
|
2015-05-06 00:54:15 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void CCOP_VU::ReflOpVi27(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode, char* sText, unsigned int nCount)
|
|
|
|
{
|
|
|
|
sprintf(sText, "VI27");
|
|
|
|
}
|
|
|
|
|
2016-09-02 18:36:51 -04:00
|
|
|
uint32 CCOP_VU::ReflEaOffset(INSTRUCTION* pInstr, CMIPS* pCtx, uint32 nAddress, uint32 nOpcode)
|
|
|
|
{
|
2018-04-30 21:01:23 +01:00
|
|
|
auto imm = static_cast<uint16>((nOpcode >> 0) & 0xFFFF);
|
2016-09-02 18:36:51 -04:00
|
|
|
nAddress += 4;
|
|
|
|
return (nAddress + CMIPS::GetBranch(imm));
|
|
|
|
}
|
|
|
|
|
2018-04-30 11:19:06 -04:00
|
|
|
// clang-format off
|
2015-05-06 00:54:15 -04:00
|
|
|
INSTRUCTION CCOP_VU::m_cReflGeneral[64] =
|
|
|
|
{
|
|
|
|
//0x00
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
//0x08
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
//0x10
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ "COP2", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
//0x18
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
//0x20
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
//0x28
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
//0x30
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ "LQC2", NULL, CopyMnemonic, ReflOpFtOffRs, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
//0x38
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ "SQC2", NULL, CopyMnemonic, ReflOpFtOffRs, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
};
|
|
|
|
|
|
|
|
INSTRUCTION CCOP_VU::m_cReflCop2[32] =
|
|
|
|
{
|
|
|
|
//0x00
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ "QMFC2", NULL, ReflMnemI, ReflOpRtFd, NULL, NULL },
|
|
|
|
{ "CFC2", NULL, ReflMnemI, ReflOpRtId, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ "QMTC2", NULL, ReflMnemI, ReflOpRtFd, NULL, NULL },
|
|
|
|
{ "CTC2", NULL, ReflMnemI, ReflOpRtId, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
//0x08
|
2016-09-02 18:36:51 -04:00
|
|
|
{ "BC2", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
2015-05-06 00:54:15 -04:00
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
//0x10
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
//0x18
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "V", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
};
|
|
|
|
|
2016-09-02 18:36:51 -04:00
|
|
|
INSTRUCTION CCOP_VU::m_cReflBc2[4] =
|
|
|
|
{
|
|
|
|
//0x00
|
2021-10-14 13:00:45 -04:00
|
|
|
{ "BC2F", NULL, CopyMnemonic, ReflOpOff, MIPSReflection::IsBranch, ReflEaOffset },
|
2016-09-02 18:36:51 -04:00
|
|
|
{ "BC2T", NULL, CopyMnemonic, ReflOpOff, MIPSReflection::IsBranch, ReflEaOffset },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
};
|
|
|
|
|
2015-05-06 00:54:15 -04:00
|
|
|
INSTRUCTION CCOP_VU::m_cReflV[64] =
|
|
|
|
{
|
|
|
|
//0x00
|
|
|
|
{ "VADD", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VADD", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VADD", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VADD", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VSUB", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VSUB", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VSUB", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VSUB", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
//0x08
|
|
|
|
{ "VMADD", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMADD", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMADD", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMADD", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMSUB", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMSUB", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMSUB", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMSUB", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
//0x10
|
|
|
|
{ "VMAX", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMAX", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMAX", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMAX", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMINI", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMINI", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMINI", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMINI", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
//0x18
|
|
|
|
{ "VMUL", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMUL", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMUL", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMUL", NULL, CopyMnemonic, ReflOpFdFsFtBc, NULL, NULL },
|
|
|
|
{ "VMUL", NULL, CopyMnemonic, ReflOpFdFsQ, NULL, NULL },
|
2016-05-16 20:52:09 -04:00
|
|
|
{ "VMAX", NULL, CopyMnemonic, ReflOpFdFsI, NULL, NULL },
|
2015-05-06 00:54:15 -04:00
|
|
|
{ "VMUL", NULL, CopyMnemonic, ReflOpFdFsI, NULL, NULL },
|
|
|
|
{ "VMINI", NULL, CopyMnemonic, ReflOpFdFsI, NULL, NULL },
|
|
|
|
//0x20
|
|
|
|
{ "VADD", NULL, CopyMnemonic, ReflOpFdFsQ, NULL, NULL },
|
|
|
|
{ "VMADD", NULL, CopyMnemonic, ReflOpFdFsQ, NULL, NULL },
|
2016-06-29 22:52:48 -04:00
|
|
|
{ "VADD", NULL, CopyMnemonic, ReflOpFdFsI, NULL, NULL },
|
2015-05-06 00:54:15 -04:00
|
|
|
{ "VMADD", NULL, CopyMnemonic, ReflOpFdFsI, NULL, NULL },
|
2015-05-08 21:31:32 -04:00
|
|
|
{ "VSUB", NULL, CopyMnemonic, ReflOpFdFsQ, NULL, NULL },
|
2015-05-06 00:54:15 -04:00
|
|
|
{ "VMSUB", NULL, CopyMnemonic, ReflOpFdFsQ, NULL, NULL },
|
|
|
|
{ "VSUB", NULL, CopyMnemonic, ReflOpFdFsI, NULL, NULL },
|
|
|
|
{ "VMSUB", NULL, CopyMnemonic, ReflOpFdFsI, NULL, NULL },
|
|
|
|
//0x28
|
|
|
|
{ "VADD", NULL, CopyMnemonic, ReflOpFdFsFt, NULL, NULL },
|
|
|
|
{ "VMADD", NULL, CopyMnemonic, ReflOpFdFsFt, NULL, NULL },
|
|
|
|
{ "VMUL", NULL, CopyMnemonic, ReflOpFdFsFt, NULL, NULL },
|
|
|
|
{ "VMAX", NULL, CopyMnemonic, ReflOpFdFsFt, NULL, NULL },
|
|
|
|
{ "VSUB", NULL, CopyMnemonic, ReflOpFdFsFt, NULL, NULL },
|
|
|
|
{ "VMSUB", NULL, CopyMnemonic, ReflOpFdFsFt, NULL, NULL },
|
|
|
|
{ "VOPMSUB", NULL, CopyMnemonic, ReflOpFdFsFt, NULL, NULL },
|
|
|
|
{ "VMINI", NULL, CopyMnemonic, ReflOpFdFsFt, NULL, NULL },
|
|
|
|
//0x30
|
|
|
|
{ "VIADD", NULL, CopyMnemonic, ReflOpIdIsIt, NULL, NULL },
|
2015-05-09 19:10:37 -04:00
|
|
|
{ "VISUB", NULL, CopyMnemonic, ReflOpIdIsIt, NULL, NULL },
|
2015-05-06 00:54:15 -04:00
|
|
|
{ "VIADDI", NULL, CopyMnemonic, ReflOpItIsImm5, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
2015-05-09 19:10:37 -04:00
|
|
|
{ "VIAND", NULL, CopyMnemonic, ReflOpIdIsIt, NULL, NULL },
|
2015-05-06 00:54:15 -04:00
|
|
|
{ "VIOR", NULL, CopyMnemonic, ReflOpIdIsIt, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
//0x38
|
|
|
|
{ "VCALLMS", NULL, CopyMnemonic, ReflOpImm15, IsNoDelayBranch, NULL },
|
|
|
|
{ "VCALLMSR", NULL, CopyMnemonic, ReflOpVi27, IsNoDelayBranch, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ "Vx0", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "Vx1", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "Vx2", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
{ "Vx3", NULL, SubTableMnemonic, SubTableOperands, SubTableIsBranch, SubTableEffAddr },
|
|
|
|
};
|
|
|
|
|
|
|
|
INSTRUCTION CCOP_VU::m_cReflVX0[32] =
|
|
|
|
{
|
|
|
|
//0x00
|
|
|
|
{ "VADDA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VSUBA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VMADDA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VMSUBA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VITOF0", NULL, CopyMnemonic, ReflOpFtFs, NULL, NULL },
|
|
|
|
{ "VFTOI0", NULL, CopyMnemonic, ReflOpFtFs, NULL, NULL },
|
|
|
|
{ "VMULA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VMULA", NULL, CopyMnemonic, ReflOpAccFsQ, NULL, NULL },
|
|
|
|
//0x08
|
2021-12-21 16:16:43 -05:00
|
|
|
{ "VADDA", NULL, CopyMnemonic, ReflOpAccFsQ, NULL, NULL },
|
2015-05-06 00:54:15 -04:00
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ "VADDA", NULL, CopyMnemonic, ReflOpAccFsFt, NULL, NULL },
|
|
|
|
{ "VSUBA", NULL, CopyMnemonic, ReflOpAccFsFt, NULL, NULL },
|
|
|
|
{ "VMOVE", NULL, CopyMnemonic, ReflOpFtFs, NULL, NULL },
|
|
|
|
{ "VLQI", NULL, CopyMnemonic, ReflOpFtDstIsInc, NULL, NULL },
|
|
|
|
{ "VDIV", NULL, CopyMnemonic, ReflOpQFsfFtf, NULL, NULL },
|
|
|
|
{ "VMTIR", NULL, CopyMnemonic, ReflOpItFsf, NULL, NULL },
|
|
|
|
//0x10
|
|
|
|
{ "VRNEXT", NULL, CopyMnemonic, ReflOpFtR, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
//0x18
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
};
|
|
|
|
|
|
|
|
INSTRUCTION CCOP_VU::m_cReflVX1[32] =
|
|
|
|
{
|
|
|
|
//0x00
|
|
|
|
{ "VADDA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VSUBA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VMADDA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VMSUBA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VITOF4", NULL, CopyMnemonic, ReflOpFtFs, NULL, NULL },
|
|
|
|
{ "VFTOI4", NULL, CopyMnemonic, ReflOpFtFs, NULL, NULL },
|
|
|
|
{ "VMULA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VABS", NULL, CopyMnemonic, ReflOpFtFs, NULL, NULL },
|
|
|
|
//0x08
|
2017-08-15 10:00:01 -04:00
|
|
|
{ "VMADDA", NULL, CopyMnemonic, ReflOpAccFsQ, NULL, NULL },
|
2017-08-15 09:57:49 -04:00
|
|
|
{ "VMSUBA", NULL, CopyMnemonic, ReflOpAccFsQ, NULL, NULL },
|
2015-05-06 00:54:15 -04:00
|
|
|
{ "VMADDA", NULL, CopyMnemonic, ReflOpAccFsFt, NULL, NULL },
|
|
|
|
{ "VMSUBA", NULL, CopyMnemonic, ReflOpAccFsFt, NULL, NULL },
|
|
|
|
{ "VMR32", NULL, CopyMnemonic, ReflOpFtFs, NULL, NULL },
|
|
|
|
{ "VSQI", NULL, CopyMnemonic, ReflOpFsDstItInc, NULL, NULL },
|
|
|
|
{ "VSQRT", NULL, CopyMnemonic, ReflOpQFtf, NULL, NULL },
|
|
|
|
{ "VMFIR", NULL, CopyMnemonic, ReflOpFtIs, NULL, NULL },
|
|
|
|
//0x10
|
|
|
|
{ "VRGET", NULL, CopyMnemonic, ReflOpFtR, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
//0x18
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
};
|
|
|
|
|
|
|
|
INSTRUCTION CCOP_VU::m_cReflVX2[32] =
|
|
|
|
{
|
|
|
|
//0x00
|
|
|
|
{ "VADDA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VSUBA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VMADDA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VMSUBA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VITOF12", NULL, CopyMnemonic, ReflOpFtFs, NULL, NULL },
|
|
|
|
{ "VFTOI12", NULL, CopyMnemonic, ReflOpFtFs, NULL, NULL },
|
|
|
|
{ "VMULA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VMULA", NULL, CopyMnemonic, ReflOpAccFsI, NULL, NULL },
|
|
|
|
//0x08
|
2021-05-19 16:26:21 -04:00
|
|
|
{ "VADDA", NULL, CopyMnemonic, ReflOpAccFsI, NULL, NULL },
|
|
|
|
{ "VSUBA", NULL, CopyMnemonic, ReflOpAccFsI, NULL, NULL },
|
2015-05-06 00:54:15 -04:00
|
|
|
{ "VMULA", NULL, CopyMnemonic, ReflOpAccFsFt, NULL, NULL },
|
|
|
|
{ "VOPMULA", NULL, CopyMnemonic, ReflOpAccFsFt, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
2016-04-06 10:41:17 -04:00
|
|
|
{ "VLQD", NULL, CopyMnemonic, ReflOpFtDstIsDec, NULL, NULL },
|
2015-05-06 00:54:15 -04:00
|
|
|
{ "VRSQRT", NULL, CopyMnemonic, ReflOpQFsfFtf, NULL, NULL },
|
|
|
|
{ "VILWR", NULL, CopyMnemonic, ReflOpItIsDst, NULL, NULL },
|
|
|
|
//0x10
|
|
|
|
{ "VRINIT", NULL, CopyMnemonic, ReflOpRFsf, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
//0x18
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
};
|
|
|
|
|
|
|
|
INSTRUCTION CCOP_VU::m_cReflVX3[32] =
|
|
|
|
{
|
|
|
|
//0x00
|
|
|
|
{ "VADDA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VSUBA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VMADDA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VMSUBA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VITOF15", NULL, CopyMnemonic, ReflOpFtFs, NULL, NULL },
|
|
|
|
{ "VFTOI15", NULL, CopyMnemonic, ReflOpFtFs, NULL, NULL },
|
|
|
|
{ "VMULA", NULL, CopyMnemonic, ReflOpAccFsFtBc, NULL, NULL },
|
|
|
|
{ "VCLIP", NULL, CopyMnemonic, ReflOpClip, NULL, NULL },
|
|
|
|
//0x08
|
|
|
|
{ "VMADDA", NULL, CopyMnemonic, ReflOpAccFsI, NULL, NULL },
|
|
|
|
{ "VMSUBA", NULL, CopyMnemonic, ReflOpAccFsI, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ "VNOP", NULL, CopyMnemonic, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
2015-06-03 01:50:25 -04:00
|
|
|
{ "VSQD", NULL, CopyMnemonic, ReflOpFsDstItDec, NULL, NULL },
|
2015-05-06 00:54:15 -04:00
|
|
|
{ "VWAITQ", NULL, CopyMnemonic, NULL, NULL, NULL },
|
|
|
|
{ "VISWR", NULL, CopyMnemonic, ReflOpItIsDst, NULL, NULL },
|
|
|
|
//0x10
|
|
|
|
{ "VRXOR", NULL, CopyMnemonic, ReflOpRFsf, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
//0x18
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
{ NULL, NULL, NULL, NULL, NULL, NULL },
|
|
|
|
};
|
2018-04-30 11:19:06 -04:00
|
|
|
// clang-format on
|
2015-05-06 00:54:15 -04:00
|
|
|
|
|
|
|
void CCOP_VU::SetupReflectionTables()
|
|
|
|
{
|
2018-04-30 21:01:23 +01:00
|
|
|
static_assert(sizeof(m_ReflGeneral) == sizeof(m_cReflGeneral), "Array sizes don't match");
|
|
|
|
static_assert(sizeof(m_ReflCop2) == sizeof(m_cReflCop2), "Array sizes don't match");
|
|
|
|
static_assert(sizeof(m_ReflBc2) == sizeof(m_cReflBc2), "Array sizes don't match");
|
|
|
|
static_assert(sizeof(m_ReflV) == sizeof(m_cReflV), "Array sizes don't match");
|
|
|
|
static_assert(sizeof(m_ReflVX0) == sizeof(m_cReflVX0), "Array sizes don't match");
|
|
|
|
static_assert(sizeof(m_ReflVX1) == sizeof(m_cReflVX1), "Array sizes don't match");
|
|
|
|
static_assert(sizeof(m_ReflVX2) == sizeof(m_cReflVX2), "Array sizes don't match");
|
|
|
|
static_assert(sizeof(m_ReflVX3) == sizeof(m_cReflVX3), "Array sizes don't match");
|
|
|
|
|
|
|
|
memcpy(m_ReflGeneral, m_cReflGeneral, sizeof(m_cReflGeneral));
|
|
|
|
memcpy(m_ReflCop2, m_cReflCop2, sizeof(m_cReflCop2));
|
|
|
|
memcpy(m_ReflBc2, m_cReflBc2, sizeof(m_cReflBc2));
|
|
|
|
memcpy(m_ReflV, m_cReflV, sizeof(m_cReflV));
|
|
|
|
memcpy(m_ReflVX0, m_cReflVX0, sizeof(m_cReflVX0));
|
|
|
|
memcpy(m_ReflVX1, m_cReflVX1, sizeof(m_cReflVX1));
|
|
|
|
memcpy(m_ReflVX2, m_cReflVX2, sizeof(m_cReflVX2));
|
|
|
|
memcpy(m_ReflVX3, m_cReflVX3, sizeof(m_cReflVX3));
|
|
|
|
|
|
|
|
m_ReflGeneralTable.nShift = 26;
|
|
|
|
m_ReflGeneralTable.nMask = 0x3F;
|
|
|
|
m_ReflGeneralTable.pTable = m_ReflGeneral;
|
|
|
|
|
|
|
|
m_ReflCop2Table.nShift = 21;
|
|
|
|
m_ReflCop2Table.nMask = 0x1F;
|
|
|
|
m_ReflCop2Table.pTable = m_ReflCop2;
|
|
|
|
|
|
|
|
m_ReflBc2Table.nShift = 16;
|
|
|
|
m_ReflBc2Table.nMask = 0x03;
|
|
|
|
m_ReflBc2Table.pTable = m_ReflBc2;
|
|
|
|
|
|
|
|
m_ReflVTable.nShift = 0;
|
|
|
|
m_ReflVTable.nMask = 0x3F;
|
|
|
|
m_ReflVTable.pTable = m_ReflV;
|
|
|
|
|
|
|
|
m_ReflVX0Table.nShift = 6;
|
|
|
|
m_ReflVX0Table.nMask = 0x1F;
|
|
|
|
m_ReflVX0Table.pTable = m_ReflVX0;
|
|
|
|
|
|
|
|
m_ReflVX1Table.nShift = 6;
|
|
|
|
m_ReflVX1Table.nMask = 0x1F;
|
|
|
|
m_ReflVX1Table.pTable = m_ReflVX1;
|
|
|
|
|
|
|
|
m_ReflVX2Table.nShift = 6;
|
|
|
|
m_ReflVX2Table.nMask = 0x1F;
|
|
|
|
m_ReflVX2Table.pTable = m_ReflVX2;
|
|
|
|
|
|
|
|
m_ReflVX3Table.nShift = 6;
|
|
|
|
m_ReflVX3Table.nMask = 0x1F;
|
|
|
|
m_ReflVX3Table.pTable = m_ReflVX3;
|
|
|
|
|
|
|
|
m_ReflGeneral[0x12].pSubTable = &m_ReflCop2Table;
|
|
|
|
|
|
|
|
m_ReflCop2[0x08].pSubTable = &m_ReflBc2Table;
|
2015-05-06 00:54:15 -04:00
|
|
|
for(unsigned int i = 0x10; i < 0x20; i++)
|
|
|
|
{
|
2018-04-30 21:01:23 +01:00
|
|
|
m_ReflCop2[i].pSubTable = &m_ReflVTable;
|
2015-05-06 00:54:15 -04:00
|
|
|
}
|
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
m_ReflV[0x3C].pSubTable = &m_ReflVX0Table;
|
|
|
|
m_ReflV[0x3D].pSubTable = &m_ReflVX1Table;
|
|
|
|
m_ReflV[0x3E].pSubTable = &m_ReflVX2Table;
|
|
|
|
m_ReflV[0x3F].pSubTable = &m_ReflVX3Table;
|
2015-05-06 00:54:15 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void CCOP_VU::GetInstruction(uint32 nOpcode, char* sText)
|
|
|
|
{
|
|
|
|
unsigned int nCount = 256;
|
|
|
|
|
|
|
|
if(nOpcode == 0)
|
|
|
|
{
|
|
|
|
strncpy(sText, "NOP", nCount);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
CMIPS* pCtx = NULL;
|
|
|
|
|
|
|
|
INSTRUCTION Instr;
|
2018-04-30 21:01:23 +01:00
|
|
|
Instr.pGetMnemonic = SubTableMnemonic;
|
|
|
|
Instr.pSubTable = &m_ReflGeneralTable;
|
2015-05-06 00:54:15 -04:00
|
|
|
Instr.pGetMnemonic(&Instr, pCtx, nOpcode, sText, nCount);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCOP_VU::GetArguments(uint32 nAddress, uint32 nOpcode, char* sText)
|
|
|
|
{
|
|
|
|
unsigned int nCount = 256;
|
|
|
|
|
|
|
|
if(nOpcode == 0)
|
|
|
|
{
|
|
|
|
strncpy(sText, "", nCount);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
CMIPS* pCtx = NULL;
|
|
|
|
|
|
|
|
INSTRUCTION Instr;
|
2018-04-30 21:01:23 +01:00
|
|
|
Instr.pGetOperands = SubTableOperands;
|
|
|
|
Instr.pSubTable = &m_ReflGeneralTable;
|
|
|
|
Instr.pGetOperands(&Instr, pCtx, nAddress, nOpcode, sText, 256);
|
2015-05-06 00:54:15 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
MIPS_BRANCH_TYPE CCOP_VU::IsBranch(uint32 nOpcode)
|
|
|
|
{
|
|
|
|
if(nOpcode == 0) return MIPS_BRANCH_NONE;
|
|
|
|
|
|
|
|
CMIPS* pCtx = NULL;
|
|
|
|
|
|
|
|
INSTRUCTION Instr;
|
2018-04-30 21:01:23 +01:00
|
|
|
Instr.pIsBranch = SubTableIsBranch;
|
|
|
|
Instr.pSubTable = &m_ReflGeneralTable;
|
2015-05-06 00:54:15 -04:00
|
|
|
return Instr.pIsBranch(&Instr, pCtx, nOpcode);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32 CCOP_VU::GetEffectiveAddress(uint32 nAddress, uint32 nOpcode)
|
|
|
|
{
|
|
|
|
INSTRUCTION Instr;
|
2018-04-30 21:01:23 +01:00
|
|
|
Instr.pGetEffectiveAddress = SubTableEffAddr;
|
|
|
|
Instr.pSubTable = &m_ReflGeneralTable;
|
2022-12-07 14:45:20 -05:00
|
|
|
return Instr.pGetEffectiveAddress(&Instr, nullptr, nAddress, nOpcode);
|
2015-05-06 00:54:15 -04:00
|
|
|
}
|