-we should read in the loader.bin before closing the devices :P

This commit is contained in:
fix94.1 2012-07-12 16:02:51 +00:00
parent aeafda53a0
commit b4dbfeaa1d
3 changed files with 27 additions and 25 deletions

View File

@ -126,7 +126,9 @@ void DML_New_WriteOptions()
// Devolution // Devolution
u8 *loader_bin = NULL;
static gconfig *DEVO_CONFIG = (gconfig*)0x80000020; static gconfig *DEVO_CONFIG = (gconfig*)0x80000020;
#define LAUNCH() ((void(*)(void))loader_bin)()
bool DEVO_Installed(const char* path) bool DEVO_Installed(const char* path)
{ {
@ -142,8 +144,23 @@ bool DEVO_Installed(const char* path)
return devo; return devo;
} }
void DEVO_SetOptions(const char *path, const char *partition) void DEVO_SetOptions(const char *path, const char *partition, const char* loader)
{ {
//Read in loader.bin
char loader_path[256];
snprintf(loader_path, sizeof(loader_path), "%s/loader.bin", loader);
FILE *f = fopen(loader_path, "rb");
if(f)
{
fseek(f, 0, SEEK_END);
u32 size = ftell(f);
rewind(f);
loader_bin = (u8*)MEM2_alloc(size);
fread(loader_bin, 1, size, f);
fclose(f);
}
//start writing cfg to mem
struct stat st; struct stat st;
char full_path[256]; char full_path[256];
int data_fd; int data_fd;
@ -204,24 +221,11 @@ void DEVO_SetOptions(const char *path, const char *partition)
DCFlushRange(lowmem, 64); DCFlushRange(lowmem, 64);
} }
u8 *loader_bin = NULL; void DEVO_Boot()
#define LAUNCH() ((void(*)(void))loader_bin)()
void DEVO_Boot(const char* path)
{ {
char loader_path[256]; // the Devolution blob has an ID string at offset 4
snprintf(loader_path, sizeof(loader_path), "%s/loader.bin", path);
FILE *f = fopen(loader_path, "rb");
if(f)
{
fseek(f, 0, SEEK_END);
u32 size = ftell(f);
rewind(f);
loader_bin = (u8*)MEM2_alloc(size);
fread(loader_bin, 1, size, f);
puts((const char*)loader_bin + 4); puts((const char*)loader_bin + 4);
LAUNCH(); LAUNCH();
}
} }

View File

@ -64,8 +64,8 @@ typedef struct global_config
} gconfig; } gconfig;
bool DEVO_Installed(const char* path); bool DEVO_Installed(const char* path);
void DEVO_SetOptions(const char* path, const char *partition); void DEVO_SetOptions(const char* path, const char *partition, const char *loader);
void DEVO_Boot(const char* path); void DEVO_Boot();
// General // General

View File

@ -801,7 +801,7 @@ void CMenu::_launchGC(dir_discHdr *hdr, bool DML)
DMLvideoMode = 2; DMLvideoMode = 2;
if(m_devo_installed && strcasestr(path.c_str(), "boot.bin") == NULL) if(m_devo_installed && strcasestr(path.c_str(), "boot.bin") == NULL)
DEVO_SetOptions(path.c_str(), DeviceName[currentPartition]); DEVO_SetOptions(path.c_str(), DeviceName[currentPartition], m_dataDir.c_str());
else if(DML) else if(DML)
{ {
m_cfg.setString("DML", "current_item", id); m_cfg.setString("DML", "current_item", id);
@ -814,13 +814,11 @@ void CMenu::_launchGC(dir_discHdr *hdr, bool DML)
nodisc = (nodisc == 0) ? m_cfg.getInt("DML", "no_disc_patch", 0) : nodisc-1; nodisc = (nodisc == 0) ? m_cfg.getInt("DML", "no_disc_patch", 0) : nodisc-1;
bool cheats = m_gcfg2.testOptBool(id, "cheat", m_cfg.getBool("DML", "cheat", false)); bool cheats = m_gcfg2.testOptBool(id, "cheat", m_cfg.getBool("DML", "cheat", false));
bool DML_debug = m_gcfg2.getBool(id, "debugger", false); bool DML_debug = m_gcfg2.getBool(id, "debugger", false);
if(cheats) if(cheats)
{ {
snprintf(CheatPath, sizeof(CheatPath), "%s/%s", m_cheatDir.c_str(), fmt("%s.gct", id.c_str())); snprintf(CheatPath, sizeof(CheatPath), "%s/%s", m_cheatDir.c_str(), fmt("%s.gct", id.c_str()));
snprintf(NewCheatPath, sizeof(NewCheatPath), "%s/%s/%s", fmt(DML_DIR, "sd"), path.c_str(), fmt("%s.gct", id.c_str())); snprintf(NewCheatPath, sizeof(NewCheatPath), "%s/%s/%s", fmt(DML_DIR, "sd"), path.c_str(), fmt("%s.gct", id.c_str()));
} }
string newPath; string newPath;
if(strcasestr(path.c_str(), "boot.bin") != NULL) if(strcasestr(path.c_str(), "boot.bin") != NULL)
{ {
@ -863,7 +861,7 @@ void CMenu::_launchGC(dir_discHdr *hdr, bool DML)
Sys_LoadMenu(); Sys_LoadMenu();
} }
else else
DEVO_Boot(m_dataDir.c_str()); DEVO_Boot();
} }
void CMenu::_launchHomebrew(const char *filepath, vector<string> arguments) void CMenu::_launchHomebrew(const char *filepath, vector<string> arguments)