diff --git a/Core/HLE/HLETables.cpp b/Core/HLE/HLETables.cpp index 53143d0c6a..c5a8646832 100644 --- a/Core/HLE/HLETables.cpp +++ b/Core/HLE/HLETables.cpp @@ -85,6 +85,7 @@ const HLEFunction UtilsForUser[] = {0xB435DEC5, sceKernelDcacheWritebackInvalidateAll, "sceKernelDcacheWritebackInvalidateAll"}, {0x3EE30821, sceKernelDcacheWritebackRange, "sceKernelDcacheWritebackRange"}, {0x34B9FA9E, sceKernelDcacheWritebackInvalidateRange, "sceKernelDcacheWritebackInvalidateRange"}, + {0xC2DF770E, 0, "sceKernelIcacheInvalidateRange"}, {0x80001C4C, 0, "sceKernelDcacheProbe"}, {0x16641D70, 0, "sceKernelDcacheReadTag"}, {0x4FD31C9D, 0, "sceKernelIcacheProbe"}, diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 8f160946eb..48997885dc 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -344,7 +344,6 @@ const HLEFunction ThreadManForUser[] = {0x6b30100f,&WrapU_UU,"sceKernelUnlockMutex"}, {0xb7d098c6,&WrapU_CUU,"sceKernelCreateMutex"}, {0x0DDCD2C9, 0, "sceKernelTryLockMutex"}, - // NOTE: LockLwMutex and UnlockLwMutex are in Kernel_Library, see sceKernelInterrupt.cpp. {0xFCCFAD26,sceKernelCancelWakeupThread,"sceKernelCancelWakeupThread"}, diff --git a/Core/HLE/sceKernelInterrupt.cpp b/Core/HLE/sceKernelInterrupt.cpp index c994951d2e..de3cef99bb 100644 --- a/Core/HLE/sceKernelInterrupt.cpp +++ b/Core/HLE/sceKernelInterrupt.cpp @@ -427,6 +427,7 @@ const HLEFunction Kernel_Library[] = {0xb55249d2,sceKernelIsCpuIntrEnable, "sceKernelIsCpuIntrEnable"}, {0xa089eca4,sceKernelMemset, "sceKernelMemset"}, {0xDC692EE3,0, "sceKernelTryLockLwMutex"}, + {0x37431849,0, "sceKernelTryLockLwMutex_600"}, {0xbea46419,0, "sceKernelLockLwMutex"}, {0x1FC64E09,0, "sceKernelLockLwMutexCB"}, {0x15b6446b,0, "sceKernelUnlockLwMutex"}, diff --git a/Core/HLE/sceUtility.cpp b/Core/HLE/sceUtility.cpp index c1d6c9f276..7dec4ae316 100644 --- a/Core/HLE/sceUtility.cpp +++ b/Core/HLE/sceUtility.cpp @@ -567,6 +567,7 @@ const HLEFunction sceUtility[] = {0x32E32DCB, 0, "sceUtilityGamedataInstallShutdownStart"}, {0x4AECD179, 0, "sceUtilityGamedataInstallUpdate"}, {0xB57E95D9, 0, "sceUtilityGamedataInstallGetStatus"}, + {0x180F7B62, 0, "sceUtilityGamedataInstallAbortFunction"}, }; void Register_sceUtility() diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index 15f5168493..89ca31ca4c 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -488,46 +488,49 @@ namespace MIPSInt EatPrefixes(); } - void Int_Vocp(u32 op) - { - float s[4], d[4]; - int vd = _VD; - int vs = _VS; - VectorSize sz = GetVecSize(op); - ReadVector(s, sz, vs); - ApplySwizzleS(s, sz); - for (int i = 0; i < GetNumVectorElements(sz); i++) - { - d[i] = 1.0f - s[i]; //vocp - } - ApplyPrefixD(d, sz); - WriteVector(d, sz, vd); - PC += 4; - EatPrefixes(); - } + void Int_Vocp(u32 op) + { + float s[4], d[4]; + int vd = _VD; + int vs = _VS; + VectorSize sz = GetVecSize(op); + ReadVector(s, sz, vs); + ApplySwizzleS(s, sz); + for (int i = 0; i < GetNumVectorElements(sz); i++) + { + d[i] = 1.0f - s[i]; + } + ApplyPrefixD(d, sz); + WriteVector(d, sz, vd); + PC += 4; + EatPrefixes(); + } - void Int_Vsgn(u32 op) - { - float s[4], d[4]; - int vd = _VD; - int vs = _VS; - VectorSize sz = GetVecSize(op); - ReadVector(s, sz, vs); - ApplySwizzleS(s, sz); - for (int i = 0; i < GetNumVectorElements(sz); i++) - { - if (s[i] > 0.0f) - d[i] = 1.0f; - else if (s[i] < 0.0f) - d[i] = -1.0f; - else + void Int_Vsgn(u32 op) + { + float s[4], d[4]; + int vd = _VD; + int vs = _VS; + VectorSize sz = GetVecSize(op); + ReadVector(s, sz, vs); + ApplySwizzleS(s, sz); + for (int i = 0; i < GetNumVectorElements(sz); i++) + { + // To handle NaNs correctly, we do this with integer hackery + u32 val; + memcpy(&val, &s[i], sizeof(u32)); + if (val == 0 || val == 0x80000000) d[i] = 0.0f; - } - ApplyPrefixD(d, sz); - WriteVector(d, sz, vd); - PC += 4; - EatPrefixes(); - } + else if ((val >> 31) == 0) + d[i] = 1.0f; + else + d[i] = -1.0f; + } + ApplyPrefixD(d, sz); + WriteVector(d, sz, vd); + PC += 4; + EatPrefixes(); + } void Int_Vf2i(u32 op) { @@ -581,7 +584,6 @@ namespace MIPSInt void Int_Vh2f(u32 op) { _dbg_assert_msg_(CPU,0,"Trying to interpret instruction that can't be interpreted"); - /* int s[4]; float d[4]; @@ -607,6 +609,7 @@ namespace MIPSInt void Int_Vf2h(u32 op) { _dbg_assert_msg_(CPU,0,"Trying to interpret instruction that can't be interpreted"); + // See http://stackoverflow.com/questions/1659440/32-bit-to-16-bit-floating-point-conversion /* int s[4]; @@ -630,11 +633,6 @@ namespace MIPSInt EatPrefixes(); } - u32 replicate3(u32 low) { - low &= 0xFF; - return low | (low << 8) | (low << 16); - } - void Int_Vx2i(u32 op) { int s[4]; diff --git a/Core/PSPLoaders.cpp b/Core/PSPLoaders.cpp index bada1d5c79..49750d3fbc 100644 --- a/Core/PSPLoaders.cpp +++ b/Core/PSPLoaders.cpp @@ -65,6 +65,10 @@ bool Load_PSP_ISO(const char *filename, std::string *error_string) pspFileSystem.Mount("DISC0:", umd2); std::string bootpath("disc0:/PSP_GAME/SYSDIR/EBOOT.BIN"); + // bypass patchers + if (pspFileSystem.GetFileInfo("disc0:/PSP_GAME/SYSDIR/EBOOT.OLD").exists) { + bootpath = "disc0:/PSP_GAME/SYSDIR/EBOOT.OLD"; + } bool hasEncrypted = false; u32 fd; if ((fd = pspFileSystem.OpenFile(bootpath, FILEACCESS_READ)) != 0) diff --git a/pspautotests b/pspautotests index 871e721dec..cb8c23e174 160000 --- a/pspautotests +++ b/pspautotests @@ -1 +1 @@ -Subproject commit 871e721dece5acd3c631e0a30226b6482a00362d +Subproject commit cb8c23e1748d9e98ebb21797d8449d8711f04439