mirror of
https://github.com/modmii/YAWM-ModMii-Edition.git
synced 2024-11-14 20:35:15 +01:00
87 lines
1.4 KiB
C
87 lines
1.4 KiB
C
|
#include <gccore.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <ogc/machine/processor.h>
|
||
|
#include <ogc/lwp_threads.h>
|
||
|
|
||
|
#include "fat.h"
|
||
|
#include "sys.h"
|
||
|
#include "wpad.h"
|
||
|
|
||
|
extern void __exception_closeall();
|
||
|
|
||
|
//struct __argv arguments;
|
||
|
//char* m_argv[MAX_ARGV];
|
||
|
//u8* m_Buffer = NULL;
|
||
|
|
||
|
u8* appBuffer = NULL;
|
||
|
u32 appSize = 0;
|
||
|
|
||
|
typedef void (*entrypoint)();
|
||
|
u32 appEntry = 0;
|
||
|
|
||
|
#include "appboot_bin.h"
|
||
|
|
||
|
static void Jump(entrypoint EntryPoint)
|
||
|
{
|
||
|
appEntry = (u32)EntryPoint;
|
||
|
|
||
|
u32 level = IRQ_Disable();
|
||
|
__IOS_ShutdownSubsystems();
|
||
|
__exception_closeall();
|
||
|
__lwp_thread_closeall();
|
||
|
asm volatile (
|
||
|
"lis %r3, appEntry@h\n"
|
||
|
"ori %r3, %r3, appEntry@l\n"
|
||
|
"lwz %r3, 0(%r3)\n"
|
||
|
"mtlr %r3\n"
|
||
|
"blr\n"
|
||
|
);
|
||
|
IRQ_Restore(level);
|
||
|
}
|
||
|
|
||
|
bool LoadApp(const char* path)
|
||
|
{
|
||
|
appBuffer = (u8*)0x92000000;
|
||
|
|
||
|
FILE* f = fopen(path, "rb");
|
||
|
|
||
|
if (f == NULL)
|
||
|
return false;
|
||
|
|
||
|
fseek(f, 0, SEEK_END);
|
||
|
u32 size = ftell(f);
|
||
|
rewind(f);
|
||
|
|
||
|
if (size > 0x1000000)
|
||
|
{
|
||
|
fclose(f);
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
u32 ret = fread(appBuffer, 1, size, f);
|
||
|
DCFlushRange(appBuffer, (size + 31) & (~31));
|
||
|
|
||
|
fclose(f);
|
||
|
|
||
|
return (ret == size);
|
||
|
}
|
||
|
|
||
|
u8* GetApp(u32* size)
|
||
|
{
|
||
|
*size = appSize;
|
||
|
return appBuffer;
|
||
|
}
|
||
|
|
||
|
void LaunchApp(void)
|
||
|
{
|
||
|
entrypoint entry;
|
||
|
|
||
|
memcpy((u8*)0x93000000, appboot_bin, appboot_bin_size);
|
||
|
DCFlushRange((u8*)0x93000000, appboot_bin_size);
|
||
|
entry = (entrypoint)0x93000000;
|
||
|
|
||
|
Jump(entry);
|
||
|
Sys_LoadMenu();
|
||
|
}
|