diff --git a/Source/ee/MA_VU.h b/Source/ee/MA_VU.h index 59602739..4d13fd8f 100644 --- a/Source/ee/MA_VU.h +++ b/Source/ee/MA_VU.h @@ -110,6 +110,7 @@ private: void ITOF4(); void FTOI4(); void ABS(); + void MSUBAq(); void MADDA(); void MSUBA(); diff --git a/Source/ee/MA_VU_Upper.cpp b/Source/ee/MA_VU_Upper.cpp index 8325d10e..f3f051f1 100644 --- a/Source/ee/MA_VU_Upper.cpp +++ b/Source/ee/MA_VU_Upper.cpp @@ -360,6 +360,12 @@ void CMA_VU::CUpper::ABS() VUShared::ABS(m_codeGen, m_nDest, m_nFT, m_nFS); } +//09 +void CMA_VU::CUpper::MSUBAq() +{ + VUShared::MSUBAq(m_codeGen, m_nDest, m_nFS, m_relativePipeTime); +} + //0A void CMA_VU::CUpper::MADDA() { @@ -499,7 +505,7 @@ CMA_VU::CUpper::InstructionFuncConstant CMA_VU::CUpper::m_pOpVector1[0x20] = //0x00 &CMA_VU::CUpper::ADDAbc, &CMA_VU::CUpper::SUBAbc, &CMA_VU::CUpper::MADDAbc, &CMA_VU::CUpper::MSUBAbc, &CMA_VU::CUpper::ITOF4, &CMA_VU::CUpper::FTOI4, &CMA_VU::CUpper::MULAbc, &CMA_VU::CUpper::ABS, //0x08 - &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::MADDA, &CMA_VU::CUpper::MSUBA, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::MSUBAq, &CMA_VU::CUpper::MADDA, &CMA_VU::CUpper::MSUBA, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, //0x10 &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, //0x18 diff --git a/Source/ee/MA_VU_UpperReflection.cpp b/Source/ee/MA_VU_UpperReflection.cpp index 9d1ff3b2..c0f1ecc0 100644 --- a/Source/ee/MA_VU_UpperReflection.cpp +++ b/Source/ee/MA_VU_UpperReflection.cpp @@ -144,7 +144,7 @@ INSTRUCTION CMA_VU::CUpper::m_cReflVX1[32] = { "ABS", NULL, CopyMnemonic, ReflOpFtFs, NULL, NULL }, //0x08 { NULL, NULL, NULL, NULL, NULL, NULL }, - { NULL, NULL, NULL, NULL, NULL, NULL }, + { "MSUBA", NULL, CopyMnemonic, ReflOpAccFsQ, NULL, NULL }, { "MADDA", NULL, CopyMnemonic, ReflOpAccFsFt, NULL, NULL }, { "MSUBA", NULL, CopyMnemonic, ReflOpAccFsFt, NULL, NULL }, { NULL, NULL, NULL, NULL, NULL, NULL }, @@ -380,7 +380,7 @@ VUINSTRUCTION CMA_VU::CUpper::m_cVuReflVX1[32] = { "ABS", NULL, ReflOpAffFtFs }, //0x08 { NULL, NULL, NULL }, - { NULL, NULL, NULL }, + { "MSUBA", NULL, ReflOpAffWrARdFsQ }, { "MADDA", NULL, ReflOpAffWrARdFtFs }, { "MSUBA", NULL, ReflOpAffWrARdFtFs }, { NULL, NULL, NULL }, diff --git a/Source/ee/VUShared.cpp b/Source/ee/VUShared.cpp index f44cb5f0..22a37ed8 100644 --- a/Source/ee/VUShared.cpp +++ b/Source/ee/VUShared.cpp @@ -923,6 +923,14 @@ void VUShared::MSUBAi(CMipsJitter* codeGen, uint8 dest, uint8 fs, uint32 relativ true, relativePipeTime); } +void VUShared::MSUBAq(CMipsJitter* codeGen, uint8 dest, uint8 fs, uint32 relativePipeTime) +{ + MSUBA_base(codeGen, dest, + offsetof(CMIPS, m_State.nCOP2[fs]), + offsetof(CMIPS, m_State.nCOP2Q), + true, relativePipeTime); +} + void VUShared::MFIR(CMipsJitter* codeGen, uint8 dest, uint8 ft, uint8 is) { for(unsigned int i = 0; i < 4; i++) diff --git a/Source/ee/VUShared.h b/Source/ee/VUShared.h index af259376..1b01eae0 100644 --- a/Source/ee/VUShared.h +++ b/Source/ee/VUShared.h @@ -145,6 +145,7 @@ namespace VUShared void MSUBA(CMipsJitter*, uint8, uint8, uint8, uint32); void MSUBAbc(CMipsJitter*, uint8, uint8, uint8, uint8, uint32); void MSUBAi(CMipsJitter*, uint8, uint8, uint32); + void MSUBAq(CMipsJitter*, uint8, uint8, uint32); void MFIR(CMipsJitter*, uint8, uint8, uint8); void MTIR(CMipsJitter*, uint8, uint8, uint8); void MUL(CMipsJitter*, uint8, uint8, uint8, uint8, uint32);