Misc fixes (accept .prx, work on power callbacks, bugs)

This commit is contained in:
Henrik Rydgard 2012-11-10 10:15:11 +01:00
parent 3a1b9e28df
commit 387552f564
17 changed files with 304 additions and 58 deletions

View file

@ -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"},

View file

@ -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()

View file

@ -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)
{

View file

@ -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);

View file

@ -267,6 +267,8 @@ void sceKernelDcacheWritebackInvalidateRange();
void sceKernelDcacheWritebackInvalidateAll();
void sceKernelGetThreadStackFreeSize();
void sceKernelIcacheInvalidateAll();
void sceKernelIcacheClearAll();
#define KERNELOBJECT_MAX_NAME_LENGTH 31
class KernelObjectPool;

View file

@ -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)",

View file

@ -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<Callback>(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;

View file

@ -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.

View file

@ -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[] =

View file

@ -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 <map>
#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"},

View file

@ -17,5 +17,7 @@
#pragma once
void __PowerInit();
void Register_scePower();
void Register_sceSuspendForUser();

View file

@ -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;
}

View file

@ -438,7 +438,7 @@ namespace MIPSInt
void Int_Vflush(u32 op)
{
DEBUG_LOG(CPU,"vflush");
// DEBUG_LOG(CPU,"vflush");
PC += 4;
}

View file

@ -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);
}

View file

@ -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++)

View file

@ -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;

View file

@ -15,4 +15,4 @@ public class PpssppActivity extends NativeActivity {
{
return false;
}
}
}