HLE: stub cellCrossController some more

This commit is contained in:
Megamouse 2019-11-17 00:22:56 +01:00
parent 41505117a7
commit 2152a77005
4 changed files with 119 additions and 23 deletions

View file

@ -1,39 +1,79 @@
#include "stdafx.h"
#include "stdafx.h"
#include "Emu/System.h"
#include "Emu/Cell/PPUModule.h"
#include "cellSysutil.h"
#include "cellCrossController.h"
LOG_CHANNEL(cellCrossController);
enum
template <>
void fmt_class_string<CellCrossControllerError>::format(std::string& out, u64 arg)
{
CELL_CROSS_CONTROLLER_STATUS_INITIALIZED = 1,
CELL_CROSS_CONTROLLER_STATUS_FINALIZED = 2
};
format_enum(out, arg, [](CellCrossControllerError value)
{
switch (value)
{
STR_CASE(CELL_CROSS_CONTROLLER_ERROR_CANCEL);
STR_CASE(CELL_CROSS_CONTROLLER_ERROR_NETWORK);
STR_CASE(CELL_CROSS_CONTROLLER_ERROR_OUT_OF_MEMORY);
STR_CASE(CELL_CROSS_CONTROLLER_ERROR_FATAL);
STR_CASE(CELL_CROSS_CONTROLLER_ERROR_INVALID_PKG_FILENAME);
STR_CASE(CELL_CROSS_CONTROLLER_ERROR_INVALID_SIG_FILENAME);
STR_CASE(CELL_CROSS_CONTROLLER_ERROR_INVALID_ICON_FILENAME);
STR_CASE(CELL_CROSS_CONTROLLER_ERROR_INVALID_VALUE);
STR_CASE(CELL_CROSS_CONTROLLER_ERROR_PKG_FILE_OPEN);
STR_CASE(CELL_CROSS_CONTROLLER_ERROR_SIG_FILE_OPEN);
STR_CASE(CELL_CROSS_CONTROLLER_ERROR_ICON_FILE_OPEN);
STR_CASE(CELL_CROSS_CONTROLLER_ERROR_INVALID_STATE);
STR_CASE(CELL_CROSS_CONTROLLER_ERROR_INVALID_PKG_FILE);
STR_CASE(CELL_CROSS_CONTROLLER_ERROR_INTERNAL);
}
struct CellCrossControllerParam
{
vm::bcptr<char> pPackageFileName;
vm::bcptr<char> pSignatureFileName;
vm::bcptr<char> pIconFileName;
vm::bptr<void> option;
};
return unknown;
});
}
struct CellCrossControllerPackageInfo
{
vm::bcptr<char> pTitle;
vm::bcptr<char> pTitleId;
vm::bcptr<char> pAppVer;
};
using CellCrossControllerCallback = void(s32 status, s32 errorCode, vm::ptr<void> option, vm::ptr<void> userdata);
s32 cellCrossControllerInitialize(vm::cptr<CellCrossControllerParam> pParam, vm::cptr<CellCrossControllerPackageInfo> pPkgInfo, vm::ptr<CellCrossControllerCallback> cb, vm::ptr<void> userdata) // LittleBigPlanet 2 and 3
error_code cellCrossControllerInitialize(vm::cptr<CellCrossControllerParam> pParam, vm::cptr<CellCrossControllerPackageInfo> pPkgInfo, vm::ptr<CellCrossControllerCallback> cb, vm::ptr<void> userdata) // LittleBigPlanet 2 and 3
{
cellCrossController.todo("cellCrossControllerInitialize(pParam=*0x%x, pPkgInfo=*0x%x, cb=*0x%x, userdata=*0x%x)", pParam, pPkgInfo, cb, userdata);
// TODO
//if (something)
//{
// return CELL_CROSS_CONTROLLER_ERROR_INVALID_STATE;
//}
if (!pParam || !pPkgInfo)
{
return CELL_CROSS_CONTROLLER_ERROR_INVALID_VALUE;
}
// Check if the strings exceed the allowed size (not counting null terminators)
if (!pParam->pPackageFileName || !memchr(pParam->pPackageFileName.get_ptr(), '\0', CELL_CROSS_CONTROLLER_PARAM_FILE_NAME_LEN + 1))
{
return CELL_CROSS_CONTROLLER_ERROR_INVALID_PKG_FILENAME;
}
if (!pParam->pSignatureFileName || !memchr(pParam->pSignatureFileName.get_ptr(), '\0', CELL_CROSS_CONTROLLER_PARAM_FILE_NAME_LEN + 1))
{
return CELL_CROSS_CONTROLLER_ERROR_INVALID_SIG_FILENAME;
}
if (!pParam->pIconFileName || !memchr(pParam->pIconFileName.get_ptr(), '\0', CELL_CROSS_CONTROLLER_PARAM_FILE_NAME_LEN + 1))
{
return CELL_CROSS_CONTROLLER_ERROR_INVALID_ICON_FILENAME;
}
if (!pPkgInfo->pAppVer || !memchr(pPkgInfo->pAppVer.get_ptr(), '\0', CELL_CROSS_CONTROLLER_PKG_APP_VER_LEN + 1) ||
!pPkgInfo->pTitleId || !memchr(pPkgInfo->pTitleId.get_ptr(), '\0', CELL_CROSS_CONTROLLER_PKG_TITLE_ID_LEN + 1) ||
!pPkgInfo->pTitle || !memchr(pPkgInfo->pTitle.get_ptr(), '\0', CELL_CROSS_CONTROLLER_PKG_TITLE_LEN + 1) ||
!cb)
{
return CELL_CROSS_CONTROLLER_ERROR_INVALID_VALUE;
}
sysutil_register_cb([=](ppu_thread& ppu) -> s32
{
cb(ppu, CELL_CROSS_CONTROLLER_STATUS_INITIALIZED, CELL_OK, vm::null, userdata);

View file

@ -0,0 +1,52 @@
#pragma once
enum CellCrossControllerError : u32
{
CELL_CROSS_CONTROLLER_ERROR_CANCEL = 0x8002cd80,
CELL_CROSS_CONTROLLER_ERROR_NETWORK = 0x8002cd81,
CELL_CROSS_CONTROLLER_ERROR_OUT_OF_MEMORY = 0x8002cd90,
CELL_CROSS_CONTROLLER_ERROR_FATAL = 0x8002cd91,
CELL_CROSS_CONTROLLER_ERROR_INVALID_PKG_FILENAME = 0x8002cd92,
CELL_CROSS_CONTROLLER_ERROR_INVALID_SIG_FILENAME = 0x8002cd93,
CELL_CROSS_CONTROLLER_ERROR_INVALID_ICON_FILENAME = 0x8002cd94,
CELL_CROSS_CONTROLLER_ERROR_INVALID_VALUE = 0x8002cd95,
CELL_CROSS_CONTROLLER_ERROR_PKG_FILE_OPEN = 0x8002cd96,
CELL_CROSS_CONTROLLER_ERROR_SIG_FILE_OPEN = 0x8002cd97,
CELL_CROSS_CONTROLLER_ERROR_ICON_FILE_OPEN = 0x8002cd98,
CELL_CROSS_CONTROLLER_ERROR_INVALID_STATE = 0x8002cd99,
CELL_CROSS_CONTROLLER_ERROR_INVALID_PKG_FILE = 0x8002cd9a,
CELL_CROSS_CONTROLLER_ERROR_INTERNAL = 0x8002cda0,
};
enum
{
CELL_CROSS_CONTROLLER_STATUS_INITIALIZED = 1,
CELL_CROSS_CONTROLLER_STATUS_FINALIZED = 2
};
enum
{
CELL_CROSS_CONTROLLER_PKG_APP_VER_LEN = 6, // e.g. 01.00
CELL_CROSS_CONTROLLER_PKG_TITLE_ID_LEN = 10, // e.g. NEKO12345
CELL_CROSS_CONTROLLER_PKG_TITLE_LEN = 52, // e.g. Cat Simulator 5
// Undefined helper value
CELL_CROSS_CONTROLLER_PARAM_FILE_NAME_LEN = 255,
};
struct CellCrossControllerParam
{
vm::bcptr<char> pPackageFileName;
vm::bcptr<char> pSignatureFileName;
vm::bcptr<char> pIconFileName;
vm::bptr<void> option;
};
struct CellCrossControllerPackageInfo
{
vm::bcptr<char> pTitle;
vm::bcptr<char> pTitleId;
vm::bcptr<char> pAppVer;
};
using CellCrossControllerCallback = void(s32 status, s32 errorCode, vm::ptr<void> option, vm::ptr<void> userdata);

View file

@ -389,6 +389,7 @@
<ItemGroup>
<ClInclude Include="..\3rdparty\stblib\stb_image.h" />
<ClInclude Include="..\Utilities\address_range.h" />
<ClInclude Include="Emu\Cell\Modules\cellCrossController.h" />
<ClInclude Include="Emu\Cell\Modules\cellSsl.h" />
<ClInclude Include="Emu\Io\Keyboard.h" />
<ClInclude Include="Emu\RSX\Common\texture_cache_helpers.h" />

View file

@ -1579,5 +1579,8 @@
<ClInclude Include="Emu\RSX\Overlays\overlay_perf_metrics.h">
<Filter>Emu\GPU\RSX\Overlays</Filter>
</ClInclude>
<ClInclude Include="Emu\Cell\Modules\cellCrossController.h">
<Filter>Emu\Cell\Modules</Filter>
</ClInclude>
</ItemGroup>
</Project>