From 6360ef1790d5a335aadd45d82b3fd0e44f32014a Mon Sep 17 00:00:00 2001 From: Raul Tambre Date: Sat, 20 Sep 2014 19:09:18 +0300 Subject: [PATCH] Added sceNpBasicGetFriendListEntryCount and sceNpBasicGetMessageEntryCount Fixed (?) sometimes functions being unloaded when they shouldn't. Also reverted the SPUThread hack. --- rpcs3/Emu/Cell/SPUThread.cpp | 4 +-- rpcs3/Emu/SysCalls/Modules.cpp | 9 ++++--- rpcs3/Emu/SysCalls/Modules/cellOvis.cpp | 5 ++-- rpcs3/Emu/SysCalls/Modules/sceNp.cpp | 22 +++++++++++++--- rpcs3/Emu/SysCalls/Modules/sceNp.h | 34 +++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 63e8c77f9b..f7dc30ca73 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -175,16 +175,16 @@ void SPUThread::ProcessCmd(u32 cmd, u32 tag, u32 lsa, u64 ea, u32 size) return; } + SPUThread* spu = (SPUThread*)Emu.GetCPU().GetThread(group->list[num]); + u32 addr = (ea & SYS_SPU_THREAD_BASE_MASK) % SYS_SPU_THREAD_OFFSET; if ((addr <= 0x3ffff) && (addr + size <= 0x40000)) { - SPUThread* spu = (SPUThread*)Emu.GetCPU().GetThread(group->list[num]); // LS access ea = spu->dmac.ls_offset + addr; } else if ((cmd & MFC_PUT_CMD) && size == 4 && (addr == SYS_SPU_THREAD_SNR1 || addr == SYS_SPU_THREAD_SNR2)) { - SPUThread* spu = (SPUThread*)Emu.GetCPU().GetThread(group->list[num]); spu->WriteSNR(SYS_SPU_THREAD_SNR2 == addr, vm::read32(dmac.ls_offset + lsa)); return; } diff --git a/rpcs3/Emu/SysCalls/Modules.cpp b/rpcs3/Emu/SysCalls/Modules.cpp index a994cf5488..4d8f841240 100644 --- a/rpcs3/Emu/SysCalls/Modules.cpp +++ b/rpcs3/Emu/SysCalls/Modules.cpp @@ -89,10 +89,11 @@ void Module::UnLoad() if(m_unload_func) m_unload_func(); - for(u32 i=0; iid); - } + // TODO: Re-enable this when needed + //for(u32 i=0; iid); + //} SetLoaded(false); } diff --git a/rpcs3/Emu/SysCalls/Modules/cellOvis.cpp b/rpcs3/Emu/SysCalls/Modules/cellOvis.cpp index 3b2e2e0403..6284596f73 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellOvis.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellOvis.cpp @@ -1,4 +1,5 @@ #include "stdafx.h" +#include "Emu/Memory/Memory.h" #include "Emu/SysCalls/Modules.h" Module *cellOvis = nullptr; @@ -11,9 +12,9 @@ enum CELL_OVIS_ERROR_ALIGN = 0x80410410, }; -int cellOvisGetOverlayTableSize() +int cellOvisGetOverlayTableSize(vm::ptr elf) { - UNIMPLEMENTED_FUNC(cellOvis); + cellOvis->Todo("cellOvisGetOverlayTableSize(elf_addr=0x%x)", elf.addr()); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/sceNp.cpp b/rpcs3/Emu/SysCalls/Modules/sceNp.cpp index 9930bcb665..f424cf3f92 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNp.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNp.cpp @@ -998,9 +998,16 @@ int sceNpCommerceGetCurrencyDecimals() return CELL_OK; } -int sceNpBasicGetFriendListEntryCount() +int sceNpBasicGetFriendListEntryCount(u32 count) { - UNIMPLEMENTED_FUNC(sceNp); + sceNp->Warning("sceNpBasicGetFriendListEntryCount(count=%d)", count); + + if (!sceNpInstance.m_bSceNpInitialized) + return SCE_NP_BASIC_ERROR_NOT_INITIALIZED; + + // TODO: Check if there are any friends + vm::write32(count, 0); + return CELL_OK; } @@ -1339,9 +1346,16 @@ int sceNpBasicSendMessage() return CELL_OK; } -int sceNpBasicGetMessageEntryCount() +int sceNpBasicGetMessageEntryCount(u32 type, u32 count) { - UNIMPLEMENTED_FUNC(sceNp); + sceNp->Warning("sceNpBasicGetMessageEntryCount(type=%d, count=%d)", type, count); + + if (!sceNpInstance.m_bSceNpInitialized) + return SCE_NP_BASIC_ERROR_NOT_INITIALIZED; + + // TODO: Check if there are messages + vm::write32(count, 0); + return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/sceNp.h b/rpcs3/Emu/SysCalls/Modules/sceNp.h index 87a4540132..a41ab4c538 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNp.h +++ b/rpcs3/Emu/SysCalls/Modules/sceNp.h @@ -28,6 +28,40 @@ enum SCE_NP_ERROR_ALREADY_USED = 0x8002aa15, SCE_NP_ERROR_DIFFERENT_USER = 0x8002aa16, SCE_NP_ERROR_ALREADY_DONE = 0x8002aa17, + // NP Basic Utility + SCE_NP_BASIC_ERROR_ALREADY_INITIALIZED = 0x8002a661, + SCE_NP_BASIC_ERROR_NOT_INITIALIZED = 0x8002a662, + SCE_NP_BASIC_ERROR_NOT_SUPPORTED = 0x8002a663, + SCE_NP_BASIC_ERROR_OUT_OF_MEMORY = 0x8002a664, + SCE_NP_BASIC_ERROR_INVALID_ARGUMENT = 0x8002a665, + SCE_NP_BASIC_ERROR_BAD_ID = 0x8002a666, + SCE_NP_BASIC_ERROR_IDS_DIFFER = 0x8002a667, + SCE_NP_BASIC_ERROR_PARSER_FAILED = 0x8002a668, + SCE_NP_BASIC_ERROR_TIMEOUT = 0x8002a669, + SCE_NP_BASIC_ERROR_NO_EVENT = 0x8002a66a, + SCE_NP_BASIC_ERROR_EXCEEDS_MAX = 0x8002a66b, + SCE_NP_BASIC_ERROR_INSUFFICIENT = 0x8002a66c, + SCE_NP_BASIC_ERROR_NOT_REGISTERED = 0x8002a66d, + SCE_NP_BASIC_ERROR_DATA_LOST = 0x8002a66e, + SCE_NP_BASIC_ERROR_BUSY = 0x8002a66f, + SCE_NP_BASIC_ERROR_STATUS = 0x8002a670, + SCE_NP_BASIC_ERROR_CANCEL = 0x8002a671, + SCE_NP_BASIC_ERROR_INVALID_MEMORY_CONTAINER = 0x8002a672, + SCE_NP_BASIC_ERROR_INVALID_DATA_ID = 0x8002a673, + SCE_NP_BASIC_ERROR_BROKEN_DATA = 0x8002a674, + SCE_NP_BASIC_ERROR_BLOCKLIST_ADD_FAILED = 0x8002a675, + SCE_NP_BASIC_ERROR_BLOCKLIST_IS_FULL = 0x8002a676, + SCE_NP_BASIC_ERROR_SEND_FAILED = 0x8002a677, + SCE_NP_BASIC_ERROR_NOT_CONNECTED = 0x8002a678, + SCE_NP_BASIC_ERROR_INSUFFICIENT_DISK_SPACE = 0x8002a679, + SCE_NP_BASIC_ERROR_INTERNAL_FAILURE = 0x8002a67a, + SCE_NP_BASIC_ERROR_DOES_NOT_EXIST = 0x8002a67b, + SCE_NP_BASIC_ERROR_INVALID = 0x8002a67c, + SCE_NP_BASIC_ERROR_UNKNOWN = 0x8002a6bf, + SCE_NP_EXT_ERROR_CONTEXT_DOES_NOT_EXIST = 0x8002a6a1, + SCE_NP_EXT_ERROR_CONTEXT_ALREADY_EXISTS = 0x8002a6a2, + SCE_NP_EXT_ERROR_NO_CONTEXT = 0x8002a6a3, + SCE_NP_EXT_ERROR_NO_ORIGIN = 0x8002a6a4, // NP Community Utility SCE_NP_COMMUNITY_ERROR_ALREADY_INITIALIZED = 0x8002a101, SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED = 0x8002a102,