//Load firm into FCRAM void loadFirm(void){ //Read FIRM from SD card and write to FCRAM fopen("/rei/firmware.bin"); firmSize = fsize(); fread(firmLocation, 1, firmSize); fclose(); decryptFirm(firmLocation, firmSize); //Initial setup firm = firmLocation; section = firm->section; k9loader(firmLocation + section[2].offset); //Check for Emunand getEmunandSect(&emuOffset, &emuHeader); if(emuOffset || emuHeader) loadEmu(); else loadSys(); }
//Load firm into FCRAM void loadFirm(void){ //Read FIRM from SD card and write to FCRAM fopen("/rei/firmware.bin", "rb"); firmSize = fsize()/2; if(PDN_MPCORE_CFG == 1) fseek(firmSize); fread(firmLocation, 1, firmSize); fclose(); decryptFirm(firmLocation, firmSize); //Initial setup firm = firmLocation; section = firm->section; keyInit(firmLocation + section[2].offset); //Set MPU for emu/thread code region getMPU(firmLocation, firmSize, &mpuOffset); memcpy((u8*)mpuOffset, mpu, sizeof(mpu)); //Inject custom loader fopen("/rei/loader.cxi", "rb"); u8 *arm11SysMods = (u8 *)firm + section[0].offset; Size ldrInFirmSize; Size ldrFileSize = fsize(); getLoader(arm11SysMods, &ldrInFirmSize, &ldrOffset); memcpy(section[0].address, arm11SysMods, ldrOffset); fread(section[0].address + ldrOffset, 1, ldrFileSize); memcpy(section[0].address + ldrOffset + ldrFileSize, arm11SysMods + ldrOffset + ldrInFirmSize, section[0].size - (ldrOffset + ldrInFirmSize)); fclose(); //Dont boot emu if AGB game was just played, or if START was held. getEmunandSect(&emuOffset, &emuHeader); if((HID & 0xFFF) == (1 << 3) || CFG_BOOTENV == 0x7 || !(emuOffset | emuHeader)) loadSys(); else loadEmu(); }