Consolidate pspUmdError/pspUmdType to header

This commit is contained in:
raven02 2013-05-19 15:41:43 +09:00 committed by Jacky TSUI
parent 1947718c43
commit cff05e17a4
2 changed files with 49 additions and 69 deletions

View file

@ -22,17 +22,8 @@
#include "sceUmd.h" #include "sceUmd.h"
#include "sceKernelThread.h" #include "sceKernelThread.h"
const int PSP_ERROR_UMD_INVALID_PARAM = 0x80010016;
const u64 MICRO_DELAY_ACTIVATE = 4000; const u64 MICRO_DELAY_ACTIVATE = 4000;
#define UMD_NOT_PRESENT 0x01
#define UMD_PRESENT 0x02
#define UMD_CHANGED 0x04
#define UMD_NOT_READY 0x08
#define UMD_READY 0x10
#define UMD_READABLE 0x20
struct UmdWaitingThread struct UmdWaitingThread
{ {
SceUID threadID; SceUID threadID;
@ -55,11 +46,6 @@ static int umdStatTimeoutEvent = -1;
static int umdStatChangeEvent = -1; static int umdStatChangeEvent = -1;
static std::vector<UmdWaitingThread> umdWaitingThreads; static std::vector<UmdWaitingThread> umdWaitingThreads;
#define PSP_UMD_TYPE_GAME 0x10
#define PSP_UMD_TYPE_VIDEO 0x20
#define PSP_UMD_TYPE_AUDIO 0x40
struct PspUmdInfo { struct PspUmdInfo {
u32 size; u32 size;
u32 type; u32 type;
@ -94,14 +80,14 @@ void __UmdDoState(PointerWrap &p)
u8 __KernelUmdGetState() u8 __KernelUmdGetState()
{ {
u8 state = UMD_PRESENT; u8 state = PSP_UMD_PRESENT;
if (umdActivated) { if (umdActivated) {
state |= UMD_READY; state |= PSP_UMD_READY;
state |= UMD_READABLE; state |= PSP_UMD_READABLE;
} }
// TODO: My tests give UMD_READY but I suppose that's when it's been sitting in the drive? // TODO: My tests give PSP_UMD_READY but I suppose that's when it's been sitting in the drive?
else else
state |= UMD_NOT_READY; state |= PSP_UMD_NOT_READY;
return state; return state;
} }
@ -111,15 +97,13 @@ void __UmdStatChange(u64 userdata, int cyclesLate)
umdActivated = userdata & 0xFF; umdActivated = userdata & 0xFF;
// Wake anyone waiting on this. // Wake anyone waiting on this.
for (size_t i = 0; i < umdWaitingThreads.size(); ++i) for (size_t i = 0; i < umdWaitingThreads.size(); ++i) {
{
UmdWaitingThread &info = umdWaitingThreads[i]; UmdWaitingThread &info = umdWaitingThreads[i];
u32 error; u32 error;
SceUID waitID = __KernelGetWaitID(info.threadID, WAITTYPE_UMD, error); SceUID waitID = __KernelGetWaitID(info.threadID, WAITTYPE_UMD, error);
bool keep = false; bool keep = false;
if (waitID == 1) if (waitID == 1) {
{
if ((info.stat & __KernelUmdGetState()) != 0) if ((info.stat & __KernelUmdGetState()) != 0)
__KernelResumeThreadFromWait(info.threadID, 0); __KernelResumeThreadFromWait(info.threadID, 0);
// Only if they are still waiting do we keep them in the list. // Only if they are still waiting do we keep them in the list.
@ -134,7 +118,7 @@ void __UmdStatChange(u64 userdata, int cyclesLate)
void __KernelUmdActivate() void __KernelUmdActivate()
{ {
u32 notifyArg = UMD_PRESENT | UMD_READABLE; u32 notifyArg = PSP_UMD_PRESENT | PSP_UMD_READABLE;
__KernelNotifyCallbackType(THREAD_CALLBACK_UMD, -1, notifyArg); __KernelNotifyCallbackType(THREAD_CALLBACK_UMD, -1, notifyArg);
// Don't activate immediately, take time to "spin up." // Don't activate immediately, take time to "spin up."
@ -144,7 +128,7 @@ void __KernelUmdActivate()
void __KernelUmdDeactivate() void __KernelUmdDeactivate()
{ {
u32 notifyArg = UMD_PRESENT | UMD_READY; u32 notifyArg = PSP_UMD_PRESENT | PSP_UMD_READY;
__KernelNotifyCallbackType(THREAD_CALLBACK_UMD, -1, notifyArg); __KernelNotifyCallbackType(THREAD_CALLBACK_UMD, -1, notifyArg);
CoreTiming::RemoveAllEvents(umdStatChangeEvent); CoreTiming::RemoveAllEvents(umdStatChangeEvent);
@ -161,8 +145,7 @@ u32 sceUmdGetDiscInfo(u32 infoAddr)
{ {
DEBUG_LOG(HLE, "sceUmdGetDiscInfo(%08x)", infoAddr); DEBUG_LOG(HLE, "sceUmdGetDiscInfo(%08x)", infoAddr);
if (Memory::IsValidAddress(infoAddr)) if (Memory::IsValidAddress(infoAddr)) {
{
PspUmdInfo info; PspUmdInfo info;
Memory::ReadStruct(infoAddr, &info); Memory::ReadStruct(infoAddr, &info);
if (info.size != 8) if (info.size != 8)
@ -171,45 +154,38 @@ u32 sceUmdGetDiscInfo(u32 infoAddr)
info.type = PSP_UMD_TYPE_GAME; info.type = PSP_UMD_TYPE_GAME;
Memory::WriteStruct(infoAddr, &info); Memory::WriteStruct(infoAddr, &info);
return 0; return 0;
} } else
else
return PSP_ERROR_UMD_INVALID_PARAM; return PSP_ERROR_UMD_INVALID_PARAM;
} }
int sceUmdActivate(u32 unknown, const char *name) int sceUmdActivate(u32 mode, const char *name)
{ {
if (unknown < 1 || unknown > 2) if (mode < 1 || mode > 2)
return PSP_ERROR_UMD_INVALID_PARAM; return PSP_ERROR_UMD_INVALID_PARAM;
__KernelUmdActivate(); __KernelUmdActivate();
if (unknown == 1) if (mode == 1) {
{ DEBUG_LOG(HLE, "0=sceUmdActivate(%d, %s)", mode, name);
DEBUG_LOG(HLE, "0=sceUmdActivate(%d, %s)", unknown, name); } else {
} ERROR_LOG(HLE, "UNTESTED 0=sceUmdActivate(%d, %s)", mode, name);
else
{
ERROR_LOG(HLE, "UNTESTED 0=sceUmdActivate(%d, %s)", unknown, name);
} }
return 0; return 0;
} }
int sceUmdDeactivate(u32 unknown, const char *name) int sceUmdDeactivate(u32 mode, const char *name)
{ {
// Why 18? No idea. // Why 18? No idea.
if (unknown > 18) if (mode > 18)
return PSP_ERROR_UMD_INVALID_PARAM; return PSP_ERROR_UMD_INVALID_PARAM;
__KernelUmdDeactivate(); __KernelUmdDeactivate();
if (unknown == 1) if (mode == 1) {
{ DEBUG_LOG(HLE, "0=sceUmdDeactivate(%d, %s)", mode, name);
DEBUG_LOG(HLE, "0=sceUmdDeactivate(%d, %s)", unknown, name); } else {
} ERROR_LOG(HLE, "UNTESTED 0=sceUmdDeactivate(%d, %s)", mode, name);
else
{
ERROR_LOG(HLE, "UNTESTED 0=sceUmdDeactivate(%d, %s)", unknown, name);
} }
return 0; return 0;
@ -222,8 +198,7 @@ u32 sceUmdRegisterUMDCallBack(u32 cbId)
// TODO: If the callback is invalid, return PSP_ERROR_UMD_INVALID_PARAM. // TODO: If the callback is invalid, return PSP_ERROR_UMD_INVALID_PARAM.
if (cbId == 0) if (cbId == 0)
retVal = PSP_ERROR_UMD_INVALID_PARAM; retVal = PSP_ERROR_UMD_INVALID_PARAM;
else else {
{
// Remove the old one, we're replacing. // Remove the old one, we're replacing.
if (driveCBId != -1) if (driveCBId != -1)
__KernelUnregisterCallback(THREAD_CALLBACK_UMD, driveCBId); __KernelUnregisterCallback(THREAD_CALLBACK_UMD, driveCBId);
@ -242,8 +217,7 @@ int sceUmdUnRegisterUMDCallBack(int cbId)
if (cbId != driveCBId) if (cbId != driveCBId)
retVal = PSP_ERROR_UMD_INVALID_PARAM; retVal = PSP_ERROR_UMD_INVALID_PARAM;
else else {
{
retVal = cbId; retVal = cbId;
driveCBId = -1; driveCBId = -1;
__KernelUnregisterCallback(THREAD_CALLBACK_UMD, cbId); __KernelUnregisterCallback(THREAD_CALLBACK_UMD, cbId);
@ -257,7 +231,7 @@ u32 sceUmdGetDriveStat()
{ {
//u32 retVal = PSP_UMD_INITED | PSP_UMD_READY | PSP_UMD_PRESENT; //u32 retVal = PSP_UMD_INITED | PSP_UMD_READY | PSP_UMD_PRESENT;
u32 retVal = __KernelUmdGetState(); u32 retVal = __KernelUmdGetState();
DEBUG_LOG(HLE,"0x%02x=sceUmdGetDriveStat()",retVal); DEBUG_LOG(HLE,"0x%02x=sceUmdGetDriveStat()", retVal);
return retVal; return retVal;
} }
@ -271,8 +245,7 @@ void __UmdStatTimeout(u64 userdata, int cyclesLate)
if (waitID == 1) if (waitID == 1)
__KernelResumeThreadFromWait(threadID, SCE_KERNEL_ERROR_WAIT_TIMEOUT); __KernelResumeThreadFromWait(threadID, SCE_KERNEL_ERROR_WAIT_TIMEOUT);
for (size_t i = 0; i < umdWaitingThreads.size(); ++i) for (size_t i = 0; i < umdWaitingThreads.size(); ++i) {
{
if (umdWaitingThreads[i].threadID == threadID) if (umdWaitingThreads[i].threadID == threadID)
umdWaitingThreads.erase(umdWaitingThreads.begin() + i--); umdWaitingThreads.erase(umdWaitingThreads.begin() + i--);
} }
@ -300,8 +273,7 @@ int sceUmdWaitDriveStat(u32 stat)
{ {
DEBUG_LOG(HLE,"0=sceUmdWaitDriveStat(stat = %08x)", stat); DEBUG_LOG(HLE,"0=sceUmdWaitDriveStat(stat = %08x)", stat);
if ((stat & __KernelUmdGetState()) == 0) if ((stat & __KernelUmdGetState()) == 0) {
{
umdWaitingThreads.push_back(UmdWaitingThread::Make(__KernelGetCurThread(), stat)); umdWaitingThreads.push_back(UmdWaitingThread::Make(__KernelGetCurThread(), stat));
__KernelWaitCurThread(WAITTYPE_UMD, 1, stat, 0, 0, "umd stat waited"); __KernelWaitCurThread(WAITTYPE_UMD, 1, stat, 0, 0, "umd stat waited");
} }
@ -313,13 +285,11 @@ int sceUmdWaitDriveStatWithTimer(u32 stat, u32 timeout)
{ {
DEBUG_LOG(HLE,"0=sceUmdWaitDriveStatWithTimer(stat = %08x, timeout = %d)", stat, timeout); DEBUG_LOG(HLE,"0=sceUmdWaitDriveStatWithTimer(stat = %08x, timeout = %d)", stat, timeout);
if ((stat & __KernelUmdGetState()) == 0) if ((stat & __KernelUmdGetState()) == 0) {
{
__UmdWaitStat(timeout); __UmdWaitStat(timeout);
umdWaitingThreads.push_back(UmdWaitingThread::Make(__KernelGetCurThread(), stat)); umdWaitingThreads.push_back(UmdWaitingThread::Make(__KernelGetCurThread(), stat));
__KernelWaitCurThread(WAITTYPE_UMD, 1, stat, 0, 0, "umd stat waited with timer"); __KernelWaitCurThread(WAITTYPE_UMD, 1, stat, 0, 0, "umd stat waited with timer");
} } else
else
hleReSchedule("umd stat waited with timer"); hleReSchedule("umd stat waited with timer");
return 0; return 0;
@ -330,16 +300,14 @@ int sceUmdWaitDriveStatCB(u32 stat, u32 timeout)
DEBUG_LOG(HLE,"0=sceUmdWaitDriveStatCB(stat = %08x, timeout = %d)", stat, timeout); DEBUG_LOG(HLE,"0=sceUmdWaitDriveStatCB(stat = %08x, timeout = %d)", stat, timeout);
hleCheckCurrentCallbacks(); hleCheckCurrentCallbacks();
if ((stat & __KernelUmdGetState()) == 0) if ((stat & __KernelUmdGetState()) == 0) {
{
if (timeout == 0) if (timeout == 0)
timeout = 8000; timeout = 8000;
__UmdWaitStat(timeout); __UmdWaitStat(timeout);
umdWaitingThreads.push_back(UmdWaitingThread::Make(__KernelGetCurThread(), stat)); umdWaitingThreads.push_back(UmdWaitingThread::Make(__KernelGetCurThread(), stat));
__KernelWaitCurThread(WAITTYPE_UMD, 1, stat, 0, true, "umd stat waited"); __KernelWaitCurThread(WAITTYPE_UMD, 1, stat, 0, true, "umd stat waited");
} } else
else
hleReSchedule("umd stat waited"); hleReSchedule("umd stat waited");
return 0; return 0;

View file

@ -18,12 +18,24 @@
#pragma once #pragma once
enum pspUmdState { enum pspUmdState {
PSP_UMD_INIT = 0x00,
PSP_UMD_NOT_PRESENT = 0x01, PSP_UMD_NOT_PRESENT = 0x01,
PSP_UMD_PRESENT = 0x02, PSP_UMD_PRESENT = 0x02,
PSP_UMD_CHANGED = 0x04, PSP_UMD_CHANGED = 0x04,
PSP_UMD_INITING = 0x08, PSP_UMD_NOT_READY = 0x08,
PSP_UMD_INITED = 0x10, PSP_UMD_READY = 0x10,
PSP_UMD_READY = 0x20 PSP_UMD_READABLE = 0x20,
};
enum pspUmdError {
PSP_ERROR_UMD_NOT_READY = 0x80210001,
PSP_ERROR_UMD_INVALID_PARAM = 0x80010016,
};
enum pspUmdType {
PSP_UMD_TYPE_GAME = 0x00,
PSP_UMD_TYPE_VIDEO = 0x20,
PSP_UMD_TYPE_AUDIO = 0x40,
}; };
void __UmdInit(); void __UmdInit();