From 387552f564d93a328331a9408397aaacd69f4b92 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sat, 10 Nov 2012 10:15:11 +0100 Subject: [PATCH] Misc fixes (accept .prx, work on power callbacks, bugs) --- Core/HLE/HLETables.cpp | 2 +- Core/HLE/sceAudio.cpp | 3 +- Core/HLE/sceIo.cpp | 2 +- Core/HLE/sceKernel.cpp | 9 + Core/HLE/sceKernel.h | 2 + Core/HLE/sceKernelMemory.cpp | 13 +- Core/HLE/sceKernelThread.cpp | 26 +- Core/HLE/sceKernelThread.h | 1 + Core/HLE/sceMpeg.cpp | 254 +++++++++++++++--- Core/HLE/scePower.cpp | 35 ++- Core/HLE/scePower.h | 2 + Core/Loaders.cpp | 2 +- Core/MIPS/MIPSIntVFPU.cpp | 2 +- GPU/GLES/TransformPipeline.cpp | 3 +- Windows/WndMainWindow.cpp | 2 +- android/jni/MenuScreens.cpp | 2 +- .../src/org/ppsspp/ppsspp/PpssppActivity.java | 2 +- 17 files changed, 304 insertions(+), 58 deletions(-) diff --git a/Core/HLE/HLETables.cpp b/Core/HLE/HLETables.cpp index de45d71c0b..f3546d8f69 100644 --- a/Core/HLE/HLETables.cpp +++ b/Core/HLE/HLETables.cpp @@ -157,7 +157,7 @@ const HLEFunction LoadCoreForKernel[] = {0xB4D6FECC, 0, "sceKernelApplyElfRelSection"}, {0x54AB2675, 0, "LoadCoreForKernel_54AB2675"}, {0x2952F5AC, 0, "sceKernelDcacheWBinvAll"}, - {0xD8779AC6, 0, "sceKernelIcacheClearAll"}, + {0xD8779AC6, sceKernelIcacheClearAll, "sceKernelIcacheClearAll"}, {0x99A695F0, 0, "sceKernelRegisterLibrary"}, {0x5873A31F, 0, "sceKernelRegisterLibraryForUser"}, {0x0B464512, 0, "sceKernelReleaseLibrary"}, diff --git a/Core/HLE/sceAudio.cpp b/Core/HLE/sceAudio.cpp index 0db8521442..7acca0edad 100644 --- a/Core/HLE/sceAudio.cpp +++ b/Core/HLE/sceAudio.cpp @@ -266,9 +266,8 @@ void sceAudioOutput2OutputBlocking() chans[0].leftVolume = vol; chans[0].rightVolume = vol; chans[0].sampleAddress = dataPtr; + RETURN(chans[0].sampleCount); __AudioEnqueue(chans[0], 0, true); - - RETURN(0); } void sceAudioOutput2ChangeLength() diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index edcaad8fd0..91abd1d47e 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -511,7 +511,7 @@ void sceIoDevctl() //(const char *name, int cmd, void *arg, size_t arglen, void // This should really send it on to a FileSystem implementation instead. - if (!strcmp(name, "mscmhc0:")) + if (!strcmp(name, "mscmhc0:") || !strcmp(name, "ms0:")) { switch (cmd) { diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 2b67aed6bd..25856082fc 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -45,6 +45,7 @@ #include "sceKernelEventFlag.h" #include "sceKernelVTimer.h" #include "sceKernelTime.h" +#include "scePower.h" #include "sceUtility.h" #include "sceUmd.h" @@ -74,6 +75,7 @@ void __KernelInit() __DisplayInit(); __InterruptsInit(); __GeInit(); + __PowerInit(); __UtilityInit(); __UmdInit(); @@ -276,6 +278,13 @@ int KernelObjectPool::GetCount() } void sceKernelIcacheInvalidateAll() +{ + DEBUG_LOG(CPU, "Icache invalidated - should clear JIT someday"); + RETURN(0); +} + + +void sceKernelIcacheClearAll() { DEBUG_LOG(CPU, "Icache cleared - should clear JIT someday"); RETURN(0); diff --git a/Core/HLE/sceKernel.h b/Core/HLE/sceKernel.h index 8d4e5fae29..edc26a6d1b 100644 --- a/Core/HLE/sceKernel.h +++ b/Core/HLE/sceKernel.h @@ -267,6 +267,8 @@ void sceKernelDcacheWritebackInvalidateRange(); void sceKernelDcacheWritebackInvalidateAll(); void sceKernelGetThreadStackFreeSize(); void sceKernelIcacheInvalidateAll(); +void sceKernelIcacheClearAll(); + #define KERNELOBJECT_MAX_NAME_LENGTH 31 class KernelObjectPool; diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index 257b3f2e59..8c93aef3c5 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -458,19 +458,28 @@ void sceKernelSetCompilerVersion() void sceKernelCreateVpl() { const char *name = Memory::GetCharPointer(PARAM(0)); + + u32 vplSize = PARAM(3); + u32 memBlockPtr = userMemory.Alloc(vplSize, false, "VPL"); + if (memBlockPtr == -1) { + ERROR_LOG(HLE, "sceKernelCreateVpl: Failed to allocate %i bytes of pool data", vplSize); + RETURN(-1); + return; + } + VPL *vpl = new VPL; SceUID id = kernelObjects.Create(vpl); strncpy(vpl->nv.name, name, 32); //vpl->nv.mpid = PARAM(1); //seems to be the standard memory partition (user, kernel etc) vpl->nv.attr = PARAM(2); - vpl->size = PARAM(3); + vpl->size = vplSize; vpl->nv.poolSize = vpl->size; vpl->nv.size = sizeof(vpl->nv); vpl->nv.numWaitThreads = 0; vpl->nv.freeSize = vpl->nv.poolSize; - vpl->address = userMemory.Alloc(vpl->size, false, "VPL"); + vpl->address = memBlockPtr; vpl->alloc.Init(vpl->address, vpl->size); DEBUG_LOG(HLE,"sceKernelCreateVpl(\"%s\", block=%i, attr=%i, size=%i)", diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index c6002b6191..a86feb20d6 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -229,6 +229,8 @@ public: FreeStack(); } + void setReturnValue(u32 retval); + // Utils bool isRunning() const { return (nt.status & THREADSTATUS_RUNNING) != 0; } bool isStopped() const { return (nt.status & THREADSTATUS_DORMANT) != 0; } @@ -284,6 +286,15 @@ SceUID curModule; //STATE END ////////////////////////////////////////////////////////////////////////// +void Thread::setReturnValue(u32 retval) +{ + if (this == currentThread) { + currentMIPS->r[2] = retval; + } else { + context.r[2] = retval; + } +} + // TODO: Should move to this wrapper so we can keep the current thread as a SceUID instead // of a dangerous raw pointer. Thread *__GetCurrentThread() { @@ -1146,8 +1157,10 @@ void sceKernelWakeupThread() RETURN(0); } else { __KernelResumeThreadFromWait(uid); - __KernelReSchedule("wakeup"); } + } + else { + RETURN(error); } } @@ -1287,9 +1300,9 @@ void sceKernelNotifyCallback() { SceUID cbId = PARAM(0); u32 arg = PARAM(1); - DEBUG_LOG(HLE,"sceKernelNotifyCallback(%i, %i) UNIMPL", cbId, arg); + DEBUG_LOG(HLE,"sceKernelNotifyCallback(%i, %i)", cbId, arg); - // __KernelNotifyCallback(__KernelGetCurThread(), cbId, arg); + __KernelNotifyCallback(THREAD_CALLBACK_USER_DEFINED, __KernelGetCurThread(), cbId, arg); RETURN(0); } @@ -1681,7 +1694,7 @@ bool __KernelInCallback() u32 __KernelRegisterCallback(RegisteredCallbackType type, SceUID cbId) { Thread *t = __GetCurrentThread(); - if (t->registeredCallbacks[type].find(cbId) == t->registeredCallbacks[type].end()) { + if (cbId > 0 && t->registeredCallbacks[type].find(cbId) == t->registeredCallbacks[type].end()) { t->registeredCallbacks[type].insert(cbId); return 0; } else { @@ -1705,6 +1718,11 @@ void __KernelNotifyCallback(RegisteredCallbackType type, SceUID threadId, SceUID u32 error; Callback *cb = kernelObjects.Get(cbId, error); + if (!cb) { + // Yeah, we're screwed, this shouldn't happen. + ERROR_LOG(HLE, "__KernelNotifyCallback - invalid callback 0"); + return; + } cb->nc.notifyCount++; cb->nc.notifyArg = notifyArg; diff --git a/Core/HLE/sceKernelThread.h b/Core/HLE/sceKernelThread.h index 92f88c8dc7..66c8a941c9 100644 --- a/Core/HLE/sceKernelThread.h +++ b/Core/HLE/sceKernelThread.h @@ -160,6 +160,7 @@ class Thread; void __KernelSwitchContext(Thread *target, const char *reason); u32 __KernelResumeThreadFromWait(SceUID threadID); bool __KernelExecutePendingMipsCalls(); +void __KernelNotifyCallback(RegisteredCallbackType type, SceUID threadId, SceUID cbId, int notifyArg); // A call into game code. These can be pending on a thread. // Similar to Callback-s (NOT CallbackInfos) in JPCSP. diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index 8900ebee58..e3c9723830 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -20,84 +20,264 @@ void sceMpegInit() { - DEBUG_LOG(HLE, "HACK sceMpegInit(...)"); + WARN_LOG(HLE, "HACK sceMpegInit(...)"); RETURN(0); } void sceMpegCreate() { - DEBUG_LOG(HLE, "HACK sceMpegCreate(...)"); + WARN_LOG(HLE, "HACK sceMpegCreate(...)"); RETURN(0); } void sceMpegInitAu() { - DEBUG_LOG(HLE, "HACK sceMpegInitAu(...)"); + WARN_LOG(HLE, "HACK sceMpegInitAu(...)"); RETURN(0); } void sceMpegQueryMemSize() { - DEBUG_LOG(HLE, "HACK sceMpegQueryMemSize(...)"); + WARN_LOG(HLE, "HACK sceMpegQueryMemSize(...)"); RETURN(0x10000); // 64K } void sceMpegRingbufferQueryMemSize() { int packets = PARAM(0); - DEBUG_LOG(HLE, "HACK sceMpegRingbufferQueryMemSize(...)"); + WARN_LOG(HLE, "HACK sceMpegRingbufferQueryMemSize(...)"); RETURN(packets * (104 + 2048)); } void sceMpegRingbufferConstruct() { - DEBUG_LOG(HLE, "HACK sceMpegRingbufferConstruct(...)"); + WARN_LOG(HLE, "HACK sceMpegRingbufferConstruct(...)"); RETURN(0); } void sceMpegRegistStream() { - DEBUG_LOG(HLE, "HACK sceMpegRegistStream(...)"); + WARN_LOG(HLE, "HACK sceMpegRegistStream(...)"); + RETURN(0); +} + +void sceMpegUnRegistStream() +{ + WARN_LOG(HLE, "HACK sceMpegRegistStream(...)"); + RETURN(0); +} + +void sceMpegGetAtracAu() +{ + WARN_LOG(HLE, "HACK sceMpegGetAtracAu(...)"); + RETURN(0); +} + +void sceMpegQueryPcmEsSize() +{ + WARN_LOG(HLE, "HACK sceMpegQueryPcmEsSize(...)"); + RETURN(0); +} + +void sceMpegQueryAtracEsSize() +{ + WARN_LOG(HLE, "HACK sceMpegQueryAtracEsSize(...)"); + RETURN(0); +} + +void sceMpegChangeGetAuMode() +{ + WARN_LOG(HLE, "HACK sceMpegChangeGetAuMode(...)"); + RETURN(0); +} + +void sceMpegQueryStreamOffset() +{ + WARN_LOG(HLE, "HACK sceMpegQueryStreamOffset(...)"); + RETURN(0); +} + +void sceMpegGetPcmAu() +{ + WARN_LOG(HLE, "HACK sceMpegGetPcmAu(...)"); + RETURN(0); +} + +void sceMpegRingbufferQueryPackNum() +{ + WARN_LOG(HLE, "HACK sceMpegRingbufferQueryPackNum(...)"); + RETURN(0); +} + +void sceMpegFlushAllStream() +{ + WARN_LOG(HLE, "HACK sceMpegFlushAllStream(...)"); + RETURN(0); +} + +void sceMpegMallocAvcEsBuf() +{ + WARN_LOG(HLE, "HACK sceMpegMallocAvcEsBuf(...)"); + RETURN(0); +} + +void sceMpegAvcCopyYCbCr() +{ + WARN_LOG(HLE, "HACK sceMpegAvcCopyYCbCr(...)"); + RETURN(0); +} + +void sceMpegFreeAvcEsBuf() +{ + WARN_LOG(HLE, "HACK sceMpegFreeAvcEsBuf(...)"); + RETURN(0); +} + +void sceMpegAtracDecode() +{ + WARN_LOG(HLE, "HACK sceMpegAtracDecode(...)"); + RETURN(0); +} + +void sceMpegAvcDecodeStop() +{ + WARN_LOG(HLE, "HACK sceMpegAvcDecodeStop(...)"); + RETURN(0); +} + +void sceMpegAvcDecodeMode() +{ + WARN_LOG(HLE, "HACK sceMpegAvcDecodeMode(...)"); + RETURN(0); +} + +void sceMpegAvcDecode() +{ + WARN_LOG(HLE, "HACK sceMpegAvcDecode(...)"); + RETURN(0); +} + +void sceMpegAvcCsc() +{ + WARN_LOG(HLE, "HACK sceMpegAvcCsc(...)"); + RETURN(0); +} + +void sceMpegAvcDecodeStopYCbCr() +{ + WARN_LOG(HLE, "HACK sceMpegAvcDecodeStopYCbCr(...)"); + RETURN(0); +} + +void sceMpegRingbufferDestruct() +{ + WARN_LOG(HLE, "HACK sceMpegRingbufferDestruct(...)"); + RETURN(0); +} + +void sceMpegAvcDecodeYCbCr() +{ + WARN_LOG(HLE, "HACK sceMpegAvcDecodeYCbCr(...)"); + RETURN(0); +} + +void sceMpegRingbufferPut() +{ + WARN_LOG(HLE, "HACK sceMpegRingbufferPut(...)"); + RETURN(0); +} + +void sceMpegAvcInitYCbCr() +{ + WARN_LOG(HLE, "HACK sceMpegAvcInitYCbCr(...)"); + RETURN(0); +} + +void sceMpegAvcQueryYCbCrSize() +{ + WARN_LOG(HLE, "HACK sceMpegAvcQueryYCbCrSize(...)"); + RETURN(0); +} + +void sceMpegRingbufferAvailableSize() +{ + WARN_LOG(HLE, "HACK sceMpegRingbufferAvailableSize(...)"); + RETURN(0); +} + +void sceMpegAvcDecodeDetail() +{ + WARN_LOG(HLE, "HACK sceMpegAvcDecodeDetail(...)"); + RETURN(0); +} + +void sceMpegAvcDecodeFlush() +{ + WARN_LOG(HLE, "HACK sceMpegAvcDecodeFlush(...)"); + RETURN(0); +} + +void sceMpegFinish() +{ + WARN_LOG(HLE, "HACK sceMpegFinish(...)"); + RETURN(0); +} + +void sceMpegDelete() +{ + WARN_LOG(HLE, "HACK sceMpegDelete(...)"); + RETURN(0); +} + +void sceMpegGetAvcAu() +{ + WARN_LOG(HLE, "HACK sceMpegDelete(...)"); + RETURN(0); +} + +void sceMpegQueryStreamSize() +{ + WARN_LOG(HLE, "HACK sceMpegDelete(...)"); RETURN(0); } const HLEFunction sceMpeg[] = { - {0xe1ce83a7,0,"sceMpegGetAtracAu"}, - {0xfe246728,0,"sceMpegGetAvcAu"}, + {0xe1ce83a7,sceMpegGetAtracAu,"sceMpegGetAtracAu"}, + {0xfe246728,sceMpegGetAvcAu,"sceMpegGetAvcAu"}, {0xd8c5f121,sceMpegCreate,"sceMpegCreate"}, - {0xf8dcb679,0,"sceMpegQueryAtracEsSize"}, + {0xf8dcb679,sceMpegQueryAtracEsSize,"sceMpegQueryAtracEsSize"}, {0xc132e22f,sceMpegQueryMemSize,"sceMpegQueryMemSize"}, - {0x21ff80e4,0,"sceMpegQueryStreamOffset"}, - {0x611e9e11,0,"sceMpegQueryStreamSize"}, + {0x21ff80e4,sceMpegQueryStreamOffset,"sceMpegQueryStreamOffset"}, + {0x611e9e11,sceMpegQueryStreamSize,"sceMpegQueryStreamSize"}, {0x42560f23,sceMpegRegistStream,"sceMpegRegistStream"}, - {0x591a4aa2,0,"sceMpegUnRegistStream"}, - {0x707b7629,0,"sceMpegFlushAllStream"}, - {0xa780cf7e,0,"sceMpegMallocAvcEsBuf"}, - {0xceb870b1,0,"sceMpegFreeAvcEsBuf"}, + {0x591a4aa2,sceMpegUnRegistStream,"sceMpegUnRegistStream"}, + {0x707b7629,sceMpegFlushAllStream,"sceMpegFlushAllStream"}, + {0xa780cf7e,sceMpegMallocAvcEsBuf,"sceMpegMallocAvcEsBuf"}, + {0xceb870b1,sceMpegFreeAvcEsBuf,"sceMpegFreeAvcEsBuf"}, {0x167afd9e,sceMpegInitAu,"sceMpegInitAu"}, {0x682a619b,sceMpegInit,"sceMpegInit"}, - {0x800c44df,0,"sceMpegAtracDecode"}, - {0x740fccd1,0,"sceMpegAvcDecodeStop"}, - {0x0e3c2e9d,0,"sceMpegAvcDecode"}, + {0x800c44df,sceMpegAtracDecode,"sceMpegAtracDecode"}, + {0x740fccd1,sceMpegAvcDecodeStop,"sceMpegAvcDecodeStop"}, + {0x0e3c2e9d,sceMpegAvcDecode,"sceMpegAvcDecode"}, {0xd7a29f46,sceMpegRingbufferQueryMemSize,"sceMpegRingbufferQueryMemSize"}, {0x37295ed8,sceMpegRingbufferConstruct,"sceMpegRingbufferConstruct"}, - {0x13407f13,0,"sceMpegRingbufferDestruct"}, - {0xb240a59e,0,"sceMpegRingbufferPut"}, - {0xb5f6dc87,0,"sceMpegRingbufferAvailableSize"}, - {0x606a4649,0,"sceMpegDelete"}, - {0x874624d6,0,"sceMpegFinish"}, - {0x4571cc64,0,"sceMpegAvcDecodeFlush"}, - {0x0f6c18d7,0,"sceMpegAvcDecodeDetail"}, - {0x211a057c,0,"sceMpegAvcQueryYCbCrSize"}, - {0x67179b1b,0,"sceMpegAvcInitYCbCr"}, - {0xf0eb1125,0,"sceMpegAvcDecodeYCbCr"}, - {0xf2930c9c,0,"sceMpegAvcDecodeStopYCbCr"}, - {0x31bd0272,0,"sceMpegAvcCsc"}, - {0xa11c7026,0,"sceMpegAvcDecodeMode"}, - {0x0558B075,0,"sceMpegAvcCopyYCbCr"}, - {0x769BEBB6,0,"sceMpegRingbufferQueryPackNum"}, - {0x8C1E027D,0,"sceMpegGetPcmAu"}, - {0x9DCFB7EA,0,"sceMpegChangeGetAuMode"}, - {0xC02CF6B5,0,"sceMpegQueryPcmEsSize"}, + {0x13407f13,sceMpegRingbufferDestruct,"sceMpegRingbufferDestruct"}, + {0xb240a59e,sceMpegRingbufferPut,"sceMpegRingbufferPut"}, + {0xb5f6dc87,sceMpegRingbufferAvailableSize,"sceMpegRingbufferAvailableSize"}, + {0x606a4649,sceMpegDelete,"sceMpegDelete"}, + {0x874624d6,sceMpegFinish,"sceMpegFinish"}, + {0x4571cc64,sceMpegAvcDecodeFlush,"sceMpegAvcDecodeFlush"}, + {0x0f6c18d7,sceMpegAvcDecodeDetail,"sceMpegAvcDecodeDetail"}, + {0x211a057c,sceMpegAvcQueryYCbCrSize,"sceMpegAvcQueryYCbCrSize"}, + {0x67179b1b,sceMpegAvcInitYCbCr,"sceMpegAvcInitYCbCr"}, + {0xf0eb1125,sceMpegAvcDecodeYCbCr,"sceMpegAvcDecodeYCbCr"}, + {0xf2930c9c,sceMpegAvcDecodeStopYCbCr,"sceMpegAvcDecodeStopYCbCr"}, + {0x31bd0272,sceMpegAvcCsc,"sceMpegAvcCsc"}, + {0xa11c7026,sceMpegAvcDecodeMode,"sceMpegAvcDecodeMode"}, + {0x0558B075,sceMpegAvcCopyYCbCr,"sceMpegAvcCopyYCbCr"}, + {0x769BEBB6,sceMpegRingbufferQueryPackNum,"sceMpegRingbufferQueryPackNum"}, + {0x8C1E027D,sceMpegGetPcmAu,"sceMpegGetPcmAu"}, + {0x9DCFB7EA,sceMpegChangeGetAuMode,"sceMpegChangeGetAuMode"}, + {0xC02CF6B5,sceMpegQueryPcmEsSize,"sceMpegQueryPcmEsSize"}, }; const HLEFunction sceMp3[] = diff --git a/Core/HLE/scePower.cpp b/Core/HLE/scePower.cpp index cb6bc56f5f..4ce3f05982 100644 --- a/Core/HLE/scePower.cpp +++ b/Core/HLE/scePower.cpp @@ -14,15 +14,22 @@ // Official git repository and contact information can be found at // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - +#include #include "HLE.h" #include "../MIPS/MIPS.h" #include "../CoreTiming.h" #include "scePower.h" +#include "sceKernelThread.h" static bool volatileMemLocked; +static int powerCbSlots[16]; + +void __PowerInit() { + memset(powerCbSlots, 0, sizeof(powerCbSlots)); +} + void scePowerGetBatteryLifePercent() { DEBUG_LOG(HLE, "100=scePowerGetBatteryLifePercent"); @@ -56,9 +63,28 @@ void scePowerIsLowBattery() void scePowerRegisterCallback() { - DEBUG_LOG(HLE,"0=scePowerRegisterCallback() UNIMPL"); + int slot = PARAM(0); + int cbId = PARAM(1); + DEBUG_LOG(HLE,"0=scePowerRegisterCallback(%i, %i)", slot, cbId); + powerCbSlots[slot] = cbId; + + __KernelRegisterCallback(THREAD_CALLBACK_POWER, cbId); + + // Immediately notify + RETURN(0); + + __KernelNotifyCallbackType(THREAD_CALLBACK_POWER, cbId, 0); +} + +void scePowerUnregisterCallback() +{ + int slotId = PARAM(0); + int cbId = powerCbSlots[slotId]; + DEBUG_LOG(HLE,"0=scePowerUnregisterCallback(%i) (cbid = %i)", slotId, cbId); + __KernelUnregisterCallback(THREAD_CALLBACK_POWER, cbId); RETURN (0); } + void sceKernelPowerLock() { DEBUG_LOG(HLE,"UNIMPL 0=sceKernelPowerLock()"); @@ -164,9 +190,8 @@ static const HLEFunction scePower[] = {0xAC32C9CC,0,"scePowerRequestSuspend"}, {0x2875994B,0,"scePower_2875994B"}, {0x0074EF9B,0,"scePowerGetResumeCount"}, - {0x04B7766E,0,"scePowerRegisterCallback"}, - {0xDFA8BAF8,0,"scePowerUnregisterCallback"}, - {0xDB9D28DD,0,"scePowerUnregitserCallback"}, //haha + {0xDFA8BAF8,scePowerUnregisterCallback,"scePowerUnregisterCallback"}, + {0xDB9D28DD,scePowerUnregisterCallback,"scePowerUnregitserCallback"}, //haha {0x843FBF43,0,"scePowerSetCpuClockFrequency"}, {0xB8D7B3FB,0,"scePowerSetBusClockFrequency"}, {0xFEE03A2F,0,"scePowerGetCpuClockFrequency"}, diff --git a/Core/HLE/scePower.h b/Core/HLE/scePower.h index b0609da03b..ac99c6a769 100644 --- a/Core/HLE/scePower.h +++ b/Core/HLE/scePower.h @@ -17,5 +17,7 @@ #pragma once +void __PowerInit(); + void Register_scePower(); void Register_sceSuspendForUser(); diff --git a/Core/Loaders.cpp b/Core/Loaders.cpp index ef3ac95ca2..fd3eabf6a9 100644 --- a/Core/Loaders.cpp +++ b/Core/Loaders.cpp @@ -42,7 +42,7 @@ EmuFileType Identify_File(const char *filename) fclose(f); if (id == 'FLE\x7F') { - if (strstr(filename,".plf") || strstr(filename,"BOOT.BIN") || strstr(filename,".elf") ) + if (strstr(filename,".plf") || strstr(filename,"BOOT.BIN") || strstr(filename,".elf") || strstr(filename,".prx") ) { return FILETYPE_PSP_ELF; } diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index 4dc955a82f..a2bffc4a16 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -438,7 +438,7 @@ namespace MIPSInt void Int_Vflush(u32 op) { - DEBUG_LOG(CPU,"vflush"); + // DEBUG_LOG(CPU,"vflush"); PC += 4; } diff --git a/GPU/GLES/TransformPipeline.cpp b/GPU/GLES/TransformPipeline.cpp index 9957f1e038..b856fea184 100644 --- a/GPU/GLES/TransformPipeline.cpp +++ b/GPU/GLES/TransformPipeline.cpp @@ -270,7 +270,6 @@ void TransformAndDrawPrim(void *verts, void *inds, int prim, int vertexCount, Li // TODO : check if has uv for (int j=0; j<2; j++) uv[j] = decoded[index].uv[j]; - // Rescale UV? } else @@ -284,6 +283,7 @@ void TransformAndDrawPrim(void *verts, void *inds, int prim, int vertexCount, Li } else { + // Skinning Vec3 psum(0,0,0); Vec3 nsum(0,0,0); int nweights = (gstate.vertType & GE_VTYPE_WEIGHT_MASK) >> GE_VTYPE_WEIGHT_SHIFT; @@ -376,6 +376,7 @@ void TransformAndDrawPrim(void *verts, void *inds, int prim, int vertexCount, Li break; } } + // Transform the coord by the view matrix. Should this be done before or after texcoord generation? Vec3ByMatrix43(v, out, gstate.viewMatrix); } diff --git a/Windows/WndMainWindow.cpp b/Windows/WndMainWindow.cpp index 8883ec51ef..0b87bbeb57 100644 --- a/Windows/WndMainWindow.cpp +++ b/Windows/WndMainWindow.cpp @@ -170,7 +170,7 @@ namespace MainWindow filter += "PSP"; filter += "|"; - filter += "*.pbp;*.elf;*.iso;*.cso;"; + filter += "*.pbp;*.elf;*.iso;*.cso;*.prx"; filter += "|"; filter += "|"; for (int i=0; i<(int)filter.length(); i++) diff --git a/android/jni/MenuScreens.cpp b/android/jni/MenuScreens.cpp index 4ede3f51fd..f1458b0b9c 100644 --- a/android/jni/MenuScreens.cpp +++ b/android/jni/MenuScreens.cpp @@ -155,7 +155,7 @@ void MenuScreen::render() { if (UIButton(GEN_ID, vlinear, w, "Load...", ALIGN_RIGHT)) { FileSelectScreenOptions options; options.allowChooseDirectory = true; - options.filter = "iso:cso:pbp:elf:"; + options.filter = "iso:cso:pbp:elf:prx:"; options.folderIcon = I_ICON_FOLDER; options.iconMapping["iso"] = I_ICON_UMD; options.iconMapping["cso"] = I_ICON_UMD; diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index be46ac6038..fbab3e664b 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -15,4 +15,4 @@ public class PpssppActivity extends NativeActivity { { return false; } -} \ No newline at end of file +} \ No newline at end of file