RetroArch/psp1/kernelFunctionsPrx/main.c

88 lines
1.7 KiB
C

#include <stdio.h>
#include <pspdebug.h>
#include <pspsdk.h>
#include <pspctrl.h>
#include <psploadexec_kernel.h>
#include <pspthreadman_kernel.h>
#include <string.h>
PSP_MODULE_INFO("kernel_functions", PSP_MODULE_KERNEL, 0, 0);
PSP_MAIN_THREAD_ATTR(0);
static volatile int thread_active;
static unsigned int buttons;
static SceUID main_thread_id;
static int main_thread(SceSize args, void *argp)
{
SceCtrlData paddata;
thread_active = 1;
while (thread_active)
{
sceCtrlPeekBufferPositive(&paddata, 1);
buttons = paddata.Buttons;
sceKernelDelayThread(1000000/60);
}
sceKernelExitThread(0);
return 0;
}
unsigned int read_system_buttons(void)
{
return buttons;
}
void exitspawn_kernel( const char* fileName, SceSize args, void * argp){
thread_active = 0;
struct SceKernelLoadExecVSHParam game_param;
memset(&game_param,0,sizeof(game_param));
game_param.size = sizeof(game_param);
game_param.args = args;
game_param.argp = argp;
game_param.key = "game";
game_param.vshmain_args_size = 0;
game_param.vshmain_args = NULL;
game_param.configfile = 0;
game_param.unk4 = 0;
game_param.unk5 = 0x10000;
pspSdkSetK1(0);
sceKernelSuspendAllUserThreads();
sceKernelLoadExecVSHMs2(fileName, &game_param);
}
int module_start(SceSize args, void *argp)
{
(void)args;
(void)argp;
buttons = 0;
thread_active = 0;
main_thread_id = sceKernelCreateThread("main Thread", main_thread, 0x11, 0x200, 0, NULL);
if (main_thread >= 0)
sceKernelStartThread(main_thread_id, 0, 0);
return 0;
}
int module_stop(void)
{
if (main_thread_id >= 0)
{
thread_active = 0;
sceKernelWaitThreadEnd(main_thread_id, NULL);
}
return 0;
}