mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Consolidate pspUmdError/pspUmdType to header
This commit is contained in:
parent
1947718c43
commit
cff05e17a4
2 changed files with 49 additions and 69 deletions
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Add table
Reference in a new issue