mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-10 17:01:24 +12:00
Merge pull request #805 from Nekotekina/master
CallbackManager rewritten
This commit is contained in:
commit
3775d28d24
57 changed files with 1954 additions and 1037 deletions
|
@ -1,6 +1,8 @@
|
|||
#include "stdafx.h"
|
||||
#include "Emu/Memory/Memory.h"
|
||||
#include "Emu/System.h"
|
||||
#include "Emu/SysCalls/Modules.h"
|
||||
#include "Emu/SysCalls/Callback.h"
|
||||
|
||||
#include "Emu/FS/vfsFile.h"
|
||||
#include "Emu/FS/vfsStreamMemory.h"
|
||||
|
@ -235,14 +237,21 @@ vm::ptr<char> _sys_strncpy(vm::ptr<char> dest, vm::ptr<const char> source, u32 l
|
|||
return dest;
|
||||
}
|
||||
|
||||
u32 spu_printf_agcb;
|
||||
u32 spu_printf_dgcb;
|
||||
u32 spu_printf_atcb;
|
||||
u32 spu_printf_dtcb;
|
||||
typedef s32(*spu_printf_cb_t)(u32 arg);
|
||||
|
||||
s32 _sys_spu_printf_initialize(u32 agcb, u32 dgcb, u32 atcb, u32 dtcb)
|
||||
vm::ptr<spu_printf_cb_t> spu_printf_agcb;
|
||||
vm::ptr<spu_printf_cb_t> spu_printf_dgcb;
|
||||
vm::ptr<spu_printf_cb_t> spu_printf_atcb;
|
||||
vm::ptr<spu_printf_cb_t> spu_printf_dtcb;
|
||||
|
||||
s32 _sys_spu_printf_initialize(
|
||||
vm::ptr<spu_printf_cb_t> agcb,
|
||||
vm::ptr<spu_printf_cb_t> dgcb,
|
||||
vm::ptr<spu_printf_cb_t> atcb,
|
||||
vm::ptr<spu_printf_cb_t> dtcb)
|
||||
{
|
||||
sysPrxForUser->Warning("_sys_spu_printf_initialize(agcb=0x%x, dgcb=0x%x, atcb=0x%x, dtcb=0x%x)", agcb, dgcb, atcb, dtcb);
|
||||
sysPrxForUser->Warning("_sys_spu_printf_initialize(agcb_addr=0x%x, dgcb_addr=0x%x, atcb_addr=0x%x, dtcb_addr=0x%x)",
|
||||
agcb.addr(), dgcb.addr(), atcb.addr(), dtcb.addr());
|
||||
|
||||
// prx: register some callbacks
|
||||
spu_printf_agcb = agcb;
|
||||
|
@ -256,10 +265,10 @@ s32 _sys_spu_printf_finalize()
|
|||
{
|
||||
sysPrxForUser->Warning("_sys_spu_printf_finalize()");
|
||||
|
||||
spu_printf_agcb = 0;
|
||||
spu_printf_dgcb = 0;
|
||||
spu_printf_atcb = 0;
|
||||
spu_printf_dtcb = 0;
|
||||
spu_printf_agcb.set(0);
|
||||
spu_printf_dgcb.set(0);
|
||||
spu_printf_atcb.set(0);
|
||||
spu_printf_dtcb.set(0);
|
||||
return CELL_OK;
|
||||
}
|
||||
|
||||
|
@ -272,7 +281,7 @@ s64 _sys_spu_printf_attach_group(u32 arg)
|
|||
return CELL_ESTAT;
|
||||
}
|
||||
|
||||
return GetCurrentPPUThread().FastCall(vm::read32(spu_printf_agcb), vm::read32(spu_printf_agcb + 4), arg);
|
||||
return spu_printf_agcb(arg);
|
||||
}
|
||||
|
||||
s64 _sys_spu_printf_detach_group(u32 arg)
|
||||
|
@ -284,7 +293,7 @@ s64 _sys_spu_printf_detach_group(u32 arg)
|
|||
return CELL_ESTAT;
|
||||
}
|
||||
|
||||
return GetCurrentPPUThread().FastCall(vm::read32(spu_printf_dgcb), vm::read32(spu_printf_dgcb + 4), arg);
|
||||
return spu_printf_dgcb(arg);
|
||||
}
|
||||
|
||||
s64 _sys_spu_printf_attach_thread(u32 arg)
|
||||
|
@ -296,7 +305,7 @@ s64 _sys_spu_printf_attach_thread(u32 arg)
|
|||
return CELL_ESTAT;
|
||||
}
|
||||
|
||||
return GetCurrentPPUThread().FastCall(vm::read32(spu_printf_atcb), vm::read32(spu_printf_atcb + 4), arg);
|
||||
return spu_printf_atcb(arg);
|
||||
}
|
||||
|
||||
s64 _sys_spu_printf_detach_thread(u32 arg)
|
||||
|
@ -308,7 +317,20 @@ s64 _sys_spu_printf_detach_thread(u32 arg)
|
|||
return CELL_ESTAT;
|
||||
}
|
||||
|
||||
return GetCurrentPPUThread().FastCall(vm::read32(spu_printf_dtcb), vm::read32(spu_printf_dtcb + 4), arg);
|
||||
return spu_printf_dtcb(arg);
|
||||
}
|
||||
|
||||
s32 _sys_snprintf(vm::ptr<char> dst, u32 count, vm::ptr<const char> fmt, u32 a1, u32 a2) // va_args...
|
||||
{
|
||||
sysPrxForUser->Todo("_sys_snprintf(dst_addr=0x%x, count=%d, fmt_addr=0x%x['%s'], ...)", dst.addr(), count, fmt.addr(), fmt.get_ptr());
|
||||
|
||||
if (std::string(fmt.get_ptr()) == "%s_%08x")
|
||||
{
|
||||
return snprintf(dst.get_ptr(), count, fmt.get_ptr(), vm::get_ptr<char>(a1), a2);
|
||||
}
|
||||
|
||||
Emu.Pause();
|
||||
return 0;
|
||||
}
|
||||
|
||||
s32 _sys_printf(vm::ptr<const char> fmt)
|
||||
|
@ -317,6 +339,7 @@ s32 _sys_printf(vm::ptr<const char> fmt)
|
|||
|
||||
// probably, assertion failed
|
||||
sysPrxForUser->Warning("_sys_printf: \n%s", fmt.get_ptr());
|
||||
Emu.Pause();
|
||||
return CELL_OK;
|
||||
}
|
||||
|
||||
|
@ -412,7 +435,6 @@ void sysPrxForUser_init()
|
|||
REG_FUNC(sysPrxForUser, _sys_strncat);
|
||||
REG_FUNC(sysPrxForUser, _sys_strcpy);
|
||||
REG_FUNC(sysPrxForUser, _sys_strncpy);
|
||||
sysPrxForUser->AddFunc(0xe75c40f2, _unnamed_E75C40F2); // real name is unknown
|
||||
|
||||
REG_FUNC(sysPrxForUser, _sys_spu_printf_initialize);
|
||||
REG_FUNC(sysPrxForUser, _sys_spu_printf_finalize);
|
||||
|
@ -421,13 +443,16 @@ void sysPrxForUser_init()
|
|||
REG_FUNC(sysPrxForUser, _sys_spu_printf_attach_thread);
|
||||
REG_FUNC(sysPrxForUser, _sys_spu_printf_detach_thread);
|
||||
|
||||
REG_FUNC(sysPrxForUser, _sys_snprintf);
|
||||
|
||||
REG_FUNC(sysPrxForUser, _sys_printf);
|
||||
sysPrxForUser->AddFunc(0xe75c40f2, _unnamed_E75C40F2); // real name is unknown
|
||||
}
|
||||
|
||||
void sysPrxForUser_load()
|
||||
{
|
||||
spu_printf_agcb = 0;
|
||||
spu_printf_dgcb = 0;
|
||||
spu_printf_atcb = 0;
|
||||
spu_printf_dtcb = 0;
|
||||
spu_printf_agcb.set(0);
|
||||
spu_printf_dgcb.set(0);
|
||||
spu_printf_atcb.set(0);
|
||||
spu_printf_dtcb.set(0);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue