From cc58a9bd35a24bcbdf2d95e27ea1a2583f0119b7 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 11 Nov 2012 14:47:28 -0800 Subject: [PATCH 1/3] Wrap some of the sceUmd* HLE functions. Intentionally skipped unimpl funcs. Also skipped sceUmdCheckMedium because docs online said it takes no param, but code says it does. --- Core/HLE/FunctionWrappers.h | 5 +++++ Core/HLE/sceUmd.cpp | 30 ++++++++++++++---------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/Core/HLE/FunctionWrappers.h b/Core/HLE/FunctionWrappers.h index c7c3eaa94b..6202100614 100644 --- a/Core/HLE/FunctionWrappers.h +++ b/Core/HLE/FunctionWrappers.h @@ -104,6 +104,11 @@ template void WrapU_CU() { RETURN((u32)retval); } +template void WrapU_UC() { + int retval = func(PARAM(0), Memory::GetCharPointer(PARAM(1))); + RETURN(retval); +} + template void WrapU_CUU() { int retval = func(Memory::GetCharPointer(PARAM(0)), PARAM(1), PARAM(2)); RETURN((u32)retval); diff --git a/Core/HLE/sceUmd.cpp b/Core/HLE/sceUmd.cpp index 9bb4cc5e29..f520f78e8b 100644 --- a/Core/HLE/sceUmd.cpp +++ b/Core/HLE/sceUmd.cpp @@ -94,29 +94,27 @@ void sceUmdGetDiscInfo() RETURN(0); } -void sceUmdActivate() +u32 sceUmdActivate(u32 unknown, const char *name) { - u32 unknown = PARAM(0); - const char *name = Memory::GetCharPointer(PARAM(1)); u32 retVal = 0; __KernelUmdActivate(); DEBUG_LOG(HLE,"%i=sceUmdActivate(%08x, %s)", retVal, unknown, name); u32 notifyArg = UMD_PRESENT | UMD_READABLE; __KernelNotifyCallbackType(THREAD_CALLBACK_UMD, -1, notifyArg); - RETURN(retVal); + return retVal; } -void sceUmdDeactivate() +u32 sceUmdDeactivate(u32 unknown, const char *name) { DEBUG_LOG(HLE,"sceUmdDeactivate()"); - bool triggerCallback = umdActivated; + u8 triggerCallback = umdActivated; __KernelUmdDeactivate(); if (triggerCallback) { u32 notifyArg = UMD_PRESENT | UMD_READY; __KernelNotifyCallbackType(THREAD_CALLBACK_UMD, -1, notifyArg); } - RETURN(0); + return 0; } u32 sceUmdRegisterUMDCallBack(u32 cbId) @@ -131,12 +129,12 @@ u32 sceUmdUnRegisterUMDCallBack(u32 cbId) return __KernelUnregisterCallback(THREAD_CALLBACK_UMD, cbId); } -void sceUmdGetDriveStat() +u32 sceUmdGetDriveStat() { //u32 retVal = PSP_UMD_INITED | PSP_UMD_READY | PSP_UMD_PRESENT; u32 retVal = __KernelUmdGetState(); DEBUG_LOG(HLE,"0x%02x=sceUmdGetDriveStat()",retVal); - RETURN(retVal); + return retVal; } /** @@ -178,25 +176,25 @@ void sceUmdCancelWaitDriveStat() RETURN(0); } -void sceUmdGetErrorStat() +u32 sceUmdGetErrorStat() { DEBUG_LOG(HLE,"%i=sceUmdGetErrorStat()", umdErrorStat); - RETURN(umdErrorStat); + return umdErrorStat; } const HLEFunction sceUmdUser[] = { - {0xC6183D47,sceUmdActivate,"sceUmdActivate"}, - {0x6B4A146C,sceUmdGetDriveStat,"sceUmdGetDriveStat"}, + {0xC6183D47,&WrapU_UC,"sceUmdActivate"}, + {0x6B4A146C,&WrapU_V,"sceUmdGetDriveStat"}, {0x46EBB729,sceUmdCheckMedium,"sceUmdCheckMedium"}, - {0xE83742BA,sceUmdDeactivate,"sceUmdDeactivate"}, + {0xE83742BA,&WrapU_UC,"sceUmdDeactivate"}, {0x8EF08FCE,sceUmdWaitDriveStat,"sceUmdWaitDriveStat"}, {0x56202973,sceUmdWaitDriveStatWithTimer,"sceUmdWaitDriveStatWithTimer"}, {0x4A9E5E29,sceUmdWaitDriveStatCB,"sceUmdWaitDriveStatCB"}, {0x6af9b50a,sceUmdCancelWaitDriveStat,"sceUmdCancelWaitDriveStat"}, - {0x6B4A146C,sceUmdGetDriveStat,"sceUmdGetDriveStat"}, - {0x20628E6F,sceUmdGetErrorStat,"sceUmdGetErrorStat"}, + {0x6B4A146C,&WrapU_V,"sceUmdGetDriveStat"}, + {0x20628E6F,&WrapU_V,"sceUmdGetErrorStat"}, {0x340B7686,sceUmdGetDiscInfo,"sceUmdGetDiscInfo"}, {0xAEE7404D,&WrapU_U,"sceUmdRegisterUMDCallBack"}, {0xBD2BDE07,&WrapU_U,"sceUmdUnRegisterUMDCallBack"}, From 21bc86f669cf2a8a7079722814a5182383c04afd Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 11 Nov 2012 15:09:27 -0800 Subject: [PATCH 2/3] Cleanup sceCtrlSetSamplingMode. Use constants, assert expected param range, wrap. --- Core/HLE/sceCtrl.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Core/HLE/sceCtrl.cpp b/Core/HLE/sceCtrl.cpp index 69a1b3a390..bcb0aa507f 100644 --- a/Core/HLE/sceCtrl.cpp +++ b/Core/HLE/sceCtrl.cpp @@ -24,6 +24,9 @@ #define CTRL_ANALOG_X 0 #define CTRL_ANALOG_Y 1 +#define CTRL_MODE_DIGITAL 0 +#define CTRL_MODE_ANALOG 1 + // Returned control data struct _ctrl_data @@ -154,18 +157,19 @@ void sceCtrlInit() DEBUG_LOG(HLE,"sceCtrlInit"); } -void sceCtrlSetSamplingMode() +u32 sceCtrlSetSamplingMode(u32 mode) { - u32 mode = PARAM(0); + u32 retVal = 0; + DEBUG_LOG(HLE,"sceCtrlSetSamplingMode(%i)", mode); + _assert_msg_(HLE, mode >= 0 && mode <= 1, "sceCtrlSetSamplingMode: mode outside expected range."); + if (ctrlInited) { - RETURN((u32)analogEnabled); - // Looks odd - analogEnabled = mode == 1 ? true : false; - return; + retVal = analogEnabled == true ? CTRL_MODE_ANALOG : CTRL_MODE_DIGITAL; + analogEnabled = mode == CTRL_MODE_ANALOG ? true : false; } - RETURN(0); + return retVal; } void sceCtrlSetIdleCancelThreshold() @@ -216,7 +220,7 @@ void sceCtrlReadLatch() { static const HLEFunction sceCtrl[] = { {0x6a2774f3, sceCtrlInit, "sceCtrlInit"}, //(int unknown), init with 0 - {0x1f4011e6, sceCtrlSetSamplingMode, "sceCtrlSetSamplingMode"}, //(int on); + {0x1f4011e6, &WrapU_U, "sceCtrlSetSamplingMode"}, //(int on); {0x1f803938, sceCtrlReadBufferPositive, "sceCtrlReadBufferPositive"}, //(ctrl_data_t* paddata, int unknown) // unknown should be 1 {0x6A2774F3, 0, "sceCtrlSetSamplingCycle"}, //? {0x6A2774F3,sceCtrlInit,"sceCtrlSetSamplingCycle"}, From 31fc4bf02a8c862918a2133735819973be99ab34 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 11 Nov 2012 15:35:50 -0800 Subject: [PATCH 3/3] Wrap a few sceCtrl* funcs. Also add an assert, seems like if nBufs = 0, could cause a bug. --- Core/HLE/sceCtrl.cpp | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/Core/HLE/sceCtrl.cpp b/Core/HLE/sceCtrl.cpp index bcb0aa507f..83ba95ff71 100644 --- a/Core/HLE/sceCtrl.cpp +++ b/Core/HLE/sceCtrl.cpp @@ -177,33 +177,30 @@ void sceCtrlSetIdleCancelThreshold() DEBUG_LOG(HLE,"UNIMPL sceCtrlSetIdleCancelThreshold"); } -void sceCtrlReadBufferPositive() +u32 sceCtrlReadBufferPositive(u32 ctrlDataPtr, u32 nBufs) { - u32 ctrlDataPtr = PARAM(0); - // u32 nBufs = PARAM(1); - DEBUG_LOG(HLE,"sceCtrlReadBufferPositive(%08x)", PARAM(0)); + DEBUG_LOG(HLE,"sceCtrlReadBufferPositive(%08x, %i)", ctrlDataPtr, nBufs); + _assert_msg_(HLE, nBufs > 0, "sceCtrlReadBufferPositive: trying to read nothing?"); - std::lock_guard guard(ctrlMutex); - // Let's just ignore if ctrl is inited or not; some games don't init it (Super Fruit Fall) + std::lock_guard guard(ctrlMutex); + // Let's just ignore if ctrl is inited or not; some games don't init it (Super Fruit Fall) //if (ctrlInited) //{ SampleControls(); - memcpy(Memory::GetPointer(ctrlDataPtr), &ctrl, sizeof(_ctrl_data)); + memcpy(Memory::GetPointer(ctrlDataPtr), &ctrl, sizeof(_ctrl_data)); //} - RETURN(1); + return 1; } -void sceCtrlPeekLatch() { - u32 latchDataPtr = PARAM(0); +u32 sceCtrlPeekLatch(u32 latchDataPtr) { ERROR_LOG(HLE,"FAKE sceCtrlPeekLatch(%08x)", latchDataPtr); if (Memory::IsValidAddress(latchDataPtr)) Memory::WriteStruct(latchDataPtr, &latch); - RETURN(1); + return 1; } -void sceCtrlReadLatch() { - u32 latchDataPtr = PARAM(0); +u32 sceCtrlReadLatch(u32 latchDataPtr) { ERROR_LOG(HLE,"FAKE sceCtrlReadLatch(%08x)", latchDataPtr); // Hackery to do it here. @@ -214,23 +211,23 @@ void sceCtrlReadLatch() { if (Memory::IsValidAddress(latchDataPtr)) Memory::WriteStruct(latchDataPtr, &latch); - RETURN(1); + return 1; } static const HLEFunction sceCtrl[] = { {0x6a2774f3, sceCtrlInit, "sceCtrlInit"}, //(int unknown), init with 0 {0x1f4011e6, &WrapU_U, "sceCtrlSetSamplingMode"}, //(int on); - {0x1f803938, sceCtrlReadBufferPositive, "sceCtrlReadBufferPositive"}, //(ctrl_data_t* paddata, int unknown) // unknown should be 1 + {0x1f803938, &WrapU_UU, "sceCtrlReadBufferPositive"}, //(ctrl_data_t* paddata, int unknown) // unknown should be 1 {0x6A2774F3, 0, "sceCtrlSetSamplingCycle"}, //? {0x6A2774F3,sceCtrlInit,"sceCtrlSetSamplingCycle"}, {0x02BAAD91,0,"sceCtrlGetSamplingCycle"}, {0xDA6B76A1,0,"sceCtrlGetSamplingMode"}, - {0x3A622550,sceCtrlReadBufferPositive,"sceCtrlPeekBufferPositive"}, + {0x3A622550,&WrapU_UU, "sceCtrlPeekBufferPositive"}, {0xC152080A,0,"sceCtrlPeekBufferNegative"}, {0x60B81F86,0,"sceCtrlReadBufferNegative"}, - {0xB1D0E5CD,sceCtrlPeekLatch,"sceCtrlPeekLatch"}, - {0x0B588501,sceCtrlReadLatch,"sceCtrlReadLatch"}, + {0xB1D0E5CD,&WrapU_U,"sceCtrlPeekLatch"}, + {0x0B588501,&WrapU_U,"sceCtrlReadLatch"}, {0x348D99D4,0,"sceCtrl_348D99D4"}, {0xAF5960F3,0,"sceCtrl_AF5960F3"}, {0xA68FD260,0,"sceCtrlClearRapidFire"},