From 39d3814be73d06d55f3207f73fedabe04f7e9f0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Thu, 6 Mar 2014 01:52:23 +0100 Subject: [PATCH] Changes in cellRtc & sceNpTrophy * Two header files added: cellRtc.h and sceNpTrophy.h * Changes in sceNpTrophyCreateContext. * Implemented sceNpTrophyGetTrophyInfo. --- rpcs3/Emu/SysCalls/Modules/cellRtc.cpp | 37 +--------- rpcs3/Emu/SysCalls/Modules/cellRtc.h | 36 ++++++++++ rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp | 77 ++++++-------------- rpcs3/Emu/SysCalls/Modules/sceNpTrophy.h | 84 ++++++++++++++++++++++ 4 files changed, 144 insertions(+), 90 deletions(-) create mode 100644 rpcs3/Emu/SysCalls/Modules/cellRtc.h create mode 100644 rpcs3/Emu/SysCalls/Modules/sceNpTrophy.h diff --git a/rpcs3/Emu/SysCalls/Modules/cellRtc.cpp b/rpcs3/Emu/SysCalls/Modules/cellRtc.cpp index eb03cc225f..9162c06cb7 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellRtc.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellRtc.cpp @@ -2,44 +2,11 @@ #include "Emu/SysCalls/SysCalls.h" #include "Emu/SysCalls/SC_FUNC.h" +#include "cellRtc.h" + void cellRtc_init(); Module cellRtc(0x0009, cellRtc_init); -// Return Codes -enum -{ - CELL_RTC_ERROR_NOT_INITIALIZED = 0x80010601, - CELL_RTC_ERROR_INVALID_POINTER = 0x80010602, - CELL_RTC_ERROR_INVALID_VALUE = 0x80010603, - CELL_RTC_ERROR_INVALID_ARG = 0x80010604, - CELL_RTC_ERROR_NOT_SUPPORTED = 0x80010605, - CELL_RTC_ERROR_NO_CLOCK = 0x80010606, - CELL_RTC_ERROR_BAD_PARSE = 0x80010607, - CELL_RTC_ERROR_INVALID_YEAR = 0x80010621, - CELL_RTC_ERROR_INVALID_MONTH = 0x80010622, - CELL_RTC_ERROR_INVALID_DAY = 0x80010623, - CELL_RTC_ERROR_INVALID_HOUR = 0x80010624, - CELL_RTC_ERROR_INVALID_MINUTE = 0x80010625, - CELL_RTC_ERROR_INVALID_SECOND = 0x80010626, - CELL_RTC_ERROR_INVALID_MICROSECOND = 0x80010627, -}; - -struct CellRtcTick -{ - u64 tick; -}; - -struct CellRtcDateTime -{ - u16 year; - u16 month; - u16 day; - u16 hour; - u16 minute; - u16 second; - u32 microsecond; -}; - long convertToUNIXTime(u16 seconds, u16 minutes, u16 hours, u16 days, int years) { return (seconds + minutes*60 + hours*3600 + days*86400 + (years-70)*31536000 + ((years-69)/4)*86400 - ((years-1)/100)*86400 + ((years+299)/400)*86400); diff --git a/rpcs3/Emu/SysCalls/Modules/cellRtc.h b/rpcs3/Emu/SysCalls/Modules/cellRtc.h new file mode 100644 index 0000000000..5e9483c917 --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/cellRtc.h @@ -0,0 +1,36 @@ +#pragma once + +// Return Codes +enum +{ + CELL_RTC_ERROR_NOT_INITIALIZED = 0x80010601, + CELL_RTC_ERROR_INVALID_POINTER = 0x80010602, + CELL_RTC_ERROR_INVALID_VALUE = 0x80010603, + CELL_RTC_ERROR_INVALID_ARG = 0x80010604, + CELL_RTC_ERROR_NOT_SUPPORTED = 0x80010605, + CELL_RTC_ERROR_NO_CLOCK = 0x80010606, + CELL_RTC_ERROR_BAD_PARSE = 0x80010607, + CELL_RTC_ERROR_INVALID_YEAR = 0x80010621, + CELL_RTC_ERROR_INVALID_MONTH = 0x80010622, + CELL_RTC_ERROR_INVALID_DAY = 0x80010623, + CELL_RTC_ERROR_INVALID_HOUR = 0x80010624, + CELL_RTC_ERROR_INVALID_MINUTE = 0x80010625, + CELL_RTC_ERROR_INVALID_SECOND = 0x80010626, + CELL_RTC_ERROR_INVALID_MICROSECOND = 0x80010627, +}; + +struct CellRtcTick +{ + u64 tick; +}; + +struct CellRtcDateTime +{ + u16 year; + u16 month; + u16 day; + u16 hour; + u16 minute; + u16 second; + u32 microsecond; +}; diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp index d889553017..bae2bf372b 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp @@ -3,61 +3,14 @@ #include "Emu/SysCalls/SC_FUNC.h" #include "sceNp.h" +#include "sceNpTrophy.h" #include "Loader/TRP.h" void sceNpTrophy_unload(); void sceNpTrophy_init(); Module sceNpTrophy(0xf035, sceNpTrophy_init, nullptr, sceNpTrophy_unload); -enum -{ - SCE_NP_TROPHY_ERROR_ALREADY_INITIALIZED = 0x80022901, - SCE_NP_TROPHY_ERROR_NOT_INITIALIZED = 0x80022902, - SCE_NP_TROPHY_ERROR_NOT_SUPPORTED = 0x80022903, - SCE_NP_TROPHY_ERROR_CONTEXT_NOT_REGISTERED = 0x80022904, - SCE_NP_TROPHY_ERROR_OUT_OF_MEMORY = 0x80022905, - SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT = 0x80022906, - SCE_NP_TROPHY_ERROR_EXCEEDS_MAX = 0x80022907, - SCE_NP_TROPHY_ERROR_INSUFFICIENT = 0x80022909, - SCE_NP_TROPHY_ERROR_UNKNOWN_CONTEXT = 0x8002290a, - SCE_NP_TROPHY_ERROR_INVALID_FORMAT = 0x8002290b, - SCE_NP_TROPHY_ERROR_BAD_RESPONSE = 0x8002290c, - SCE_NP_TROPHY_ERROR_INVALID_GRADE = 0x8002290d, - SCE_NP_TROPHY_ERROR_INVALID_CONTEXT = 0x8002290e, - SCE_NP_TROPHY_ERROR_PROCESSING_ABORTED = 0x8002290f, - SCE_NP_TROPHY_ERROR_ABORT = 0x80022910, - SCE_NP_TROPHY_ERROR_UNKNOWN_HANDLE = 0x80022911, - SCE_NP_TROPHY_ERROR_LOCKED = 0x80022912, - SCE_NP_TROPHY_ERROR_HIDDEN = 0x80022913, - SCE_NP_TROPHY_ERROR_CANNOT_UNLOCK_PLATINUM = 0x80022914, - SCE_NP_TROPHY_ERROR_ALREADY_UNLOCKED = 0x80022915, - SCE_NP_TROPHY_ERROR_INVALID_TYPE = 0x80022916, - SCE_NP_TROPHY_ERROR_INVALID_HANDLE = 0x80022917, - SCE_NP_TROPHY_ERROR_INVALID_NP_COMM_ID = 0x80022918, - SCE_NP_TROPHY_ERROR_UNKNOWN_NP_COMM_ID = 0x80022919, - SCE_NP_TROPHY_ERROR_DISC_IO = 0x8002291a, - SCE_NP_TROPHY_ERROR_CONF_DOES_NOT_EXIST = 0x8002291b, - SCE_NP_TROPHY_ERROR_UNSUPPORTED_FORMAT = 0x8002291c, - SCE_NP_TROPHY_ERROR_ALREADY_INSTALLED = 0x8002291d, - SCE_NP_TROPHY_ERROR_BROKEN_DATA = 0x8002291e, - SCE_NP_TROPHY_ERROR_VERIFICATION_FAILURE = 0x8002291f, - SCE_NP_TROPHY_ERROR_INVALID_TROPHY_ID = 0x80022920, - SCE_NP_TROPHY_ERROR_UNKNOWN_TROPHY_ID = 0x80022921, - SCE_NP_TROPHY_ERROR_UNKNOWN_TITLE = 0x80022922, - SCE_NP_TROPHY_ERROR_UNKNOWN_FILE = 0x80022923, - SCE_NP_TROPHY_ERROR_DISC_NOT_MOUNTED = 0x80022924, - SCE_NP_TROPHY_ERROR_SHUTDOWN = 0x80022925, - SCE_NP_TROPHY_ERROR_TITLE_ICON_NOT_FOUND = 0x80022926, - SCE_NP_TROPHY_ERROR_TROPHY_ICON_NOT_FOUND = 0x80022927, - SCE_NP_TROPHY_ERROR_INSUFFICIENT_DISK_SPACE = 0x80022928, - SCE_NP_TROPHY_ERROR_ILLEGAL_UPDATE = 0x8002292a, - SCE_NP_TROPHY_ERROR_SAVEDATA_USER_DOES_NOT_MATCH = 0x8002292b, - SCE_NP_TROPHY_ERROR_TROPHY_ID_DOES_NOT_EXIST = 0x8002292c, - SCE_NP_TROPHY_ERROR_SERVICE_UNAVAILABLE = 0x8002292d, - SCE_NP_TROPHY_ERROR_UNKNOWN = 0x800229ff, -}; - - +// Internal Structs struct sceNpTrophyInternalContext { // TODO @@ -115,15 +68,15 @@ int sceNpTrophyCreateContext(mem32_t context, mem_ptr_t co { if (entry->flags & DirEntry_TypeDir) { - std::shared_ptr f(Emu.GetVFS().OpenFile("/app_home/TROPDIR/" + entry->name + "/TROPHY.TRP", vfsRead)); + vfsStream* stream = Emu.GetVFS().OpenFile("/app_home/TROPDIR/" + entry->name + "/TROPHY.TRP", vfsRead); - if (f && f->IsOpened()) + if (stream && stream->IsOpened()) { sceNpTrophyInternalContext ctxt; - ctxt.trp_stream = f.get(); + ctxt.trp_stream = stream; ctxt.trp_name = entry->name; s_npTrophyInstance.contexts.push_back(ctxt); - f = nullptr; + stream = nullptr; return CELL_OK; } } @@ -253,9 +206,23 @@ int sceNpTrophyGetTrophyIcon() return CELL_OK; } -int sceNpTrophyGetTrophyInfo() +int sceNpTrophyGetTrophyInfo(u32 context, u32 handle, s32 trophyId, mem_ptr_t details, mem_ptr_t data) { - UNIMPLEMENTED_FUNC(sceNpTrophy); + sceNpTrophy.Warning("sceNpTrophyGetTrophyInfo(context=%u, handle=%u, trophyId=%d, details_addr=0x%x, data_addr=0x%x)", + context, handle, trophyId, details.GetAddr(), data.GetAddr()); + + if (!s_npTrophyInstance.m_bInitialized) + return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; + if (!details.IsGood() || !data.IsGood()) + return SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT; + // TODO: There are other possible errors + + // sceNpTrophyInternalContext& ctxt = s_npTrophyInstance.contexts[context]; + memcpy(details->name, "Some Trophy", SCE_NP_TROPHY_NAME_MAX_SIZE); + memcpy(details->description, "Hey! Implement a XML reader, and load the description from TROP.SFM", SCE_NP_TROPHY_DESCR_MAX_SIZE); + details->hidden = false; + details->trophyId = trophyId; + details->trophyGrade = SCE_NP_TROPHY_GRADE_GOLD; return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.h b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.h new file mode 100644 index 0000000000..2bcf4b15c8 --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.h @@ -0,0 +1,84 @@ +#pragma once +#include "cellRtc.h" + +enum +{ + SCE_NP_TROPHY_ERROR_ALREADY_INITIALIZED = 0x80022901, + SCE_NP_TROPHY_ERROR_NOT_INITIALIZED = 0x80022902, + SCE_NP_TROPHY_ERROR_NOT_SUPPORTED = 0x80022903, + SCE_NP_TROPHY_ERROR_CONTEXT_NOT_REGISTERED = 0x80022904, + SCE_NP_TROPHY_ERROR_OUT_OF_MEMORY = 0x80022905, + SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT = 0x80022906, + SCE_NP_TROPHY_ERROR_EXCEEDS_MAX = 0x80022907, + SCE_NP_TROPHY_ERROR_INSUFFICIENT = 0x80022909, + SCE_NP_TROPHY_ERROR_UNKNOWN_CONTEXT = 0x8002290a, + SCE_NP_TROPHY_ERROR_INVALID_FORMAT = 0x8002290b, + SCE_NP_TROPHY_ERROR_BAD_RESPONSE = 0x8002290c, + SCE_NP_TROPHY_ERROR_INVALID_GRADE = 0x8002290d, + SCE_NP_TROPHY_ERROR_INVALID_CONTEXT = 0x8002290e, + SCE_NP_TROPHY_ERROR_PROCESSING_ABORTED = 0x8002290f, + SCE_NP_TROPHY_ERROR_ABORT = 0x80022910, + SCE_NP_TROPHY_ERROR_UNKNOWN_HANDLE = 0x80022911, + SCE_NP_TROPHY_ERROR_LOCKED = 0x80022912, + SCE_NP_TROPHY_ERROR_HIDDEN = 0x80022913, + SCE_NP_TROPHY_ERROR_CANNOT_UNLOCK_PLATINUM = 0x80022914, + SCE_NP_TROPHY_ERROR_ALREADY_UNLOCKED = 0x80022915, + SCE_NP_TROPHY_ERROR_INVALID_TYPE = 0x80022916, + SCE_NP_TROPHY_ERROR_INVALID_HANDLE = 0x80022917, + SCE_NP_TROPHY_ERROR_INVALID_NP_COMM_ID = 0x80022918, + SCE_NP_TROPHY_ERROR_UNKNOWN_NP_COMM_ID = 0x80022919, + SCE_NP_TROPHY_ERROR_DISC_IO = 0x8002291a, + SCE_NP_TROPHY_ERROR_CONF_DOES_NOT_EXIST = 0x8002291b, + SCE_NP_TROPHY_ERROR_UNSUPPORTED_FORMAT = 0x8002291c, + SCE_NP_TROPHY_ERROR_ALREADY_INSTALLED = 0x8002291d, + SCE_NP_TROPHY_ERROR_BROKEN_DATA = 0x8002291e, + SCE_NP_TROPHY_ERROR_VERIFICATION_FAILURE = 0x8002291f, + SCE_NP_TROPHY_ERROR_INVALID_TROPHY_ID = 0x80022920, + SCE_NP_TROPHY_ERROR_UNKNOWN_TROPHY_ID = 0x80022921, + SCE_NP_TROPHY_ERROR_UNKNOWN_TITLE = 0x80022922, + SCE_NP_TROPHY_ERROR_UNKNOWN_FILE = 0x80022923, + SCE_NP_TROPHY_ERROR_DISC_NOT_MOUNTED = 0x80022924, + SCE_NP_TROPHY_ERROR_SHUTDOWN = 0x80022925, + SCE_NP_TROPHY_ERROR_TITLE_ICON_NOT_FOUND = 0x80022926, + SCE_NP_TROPHY_ERROR_TROPHY_ICON_NOT_FOUND = 0x80022927, + SCE_NP_TROPHY_ERROR_INSUFFICIENT_DISK_SPACE = 0x80022928, + SCE_NP_TROPHY_ERROR_ILLEGAL_UPDATE = 0x8002292a, + SCE_NP_TROPHY_ERROR_SAVEDATA_USER_DOES_NOT_MATCH = 0x8002292b, + SCE_NP_TROPHY_ERROR_TROPHY_ID_DOES_NOT_EXIST = 0x8002292c, + SCE_NP_TROPHY_ERROR_SERVICE_UNAVAILABLE = 0x8002292d, + SCE_NP_TROPHY_ERROR_UNKNOWN = 0x800229ff, +}; + +enum +{ + SCE_NP_TROPHY_TITLE_MAX_SIZE = 128, + SCE_NP_TROPHY_GAME_DESCR_MAX_SIZE = 1024, + SCE_NP_TROPHY_NAME_MAX_SIZE = 128, + SCE_NP_TROPHY_DESCR_MAX_SIZE = 1024, +}; + +enum +{ + SCE_NP_TROPHY_GRADE_UNKNOWN = 0, + SCE_NP_TROPHY_GRADE_PLATINUM = 1, + SCE_NP_TROPHY_GRADE_GOLD = 2, + SCE_NP_TROPHY_GRADE_SILVER = 3, + SCE_NP_TROPHY_GRADE_BRONZE = 4, +}; + +struct SceNpTrophyDetails +{ + s32 trophyId; // SceNpTrophyId + u32 trophyGrade; // SceNpTrophyGrade + u8 name[SCE_NP_TROPHY_NAME_MAX_SIZE]; + u8 description[SCE_NP_TROPHY_DESCR_MAX_SIZE]; + bool hidden; + u8 reserved[3]; +}; + +struct SceNpTrophyData { + CellRtcTick timestamp; + s32 trophyId; // SceNpTrophyId + bool unlocked; + u8 reserved[3]; +};