From 68e5ddb5a4f0430fbf4df80c63915d621f2f63b2 Mon Sep 17 00:00:00 2001 From: RocketRobz Date: Thu, 10 Oct 2024 21:00:36 -0600 Subject: [PATCH] Pre-load ROM data after boot in some games --- retail/arm9/include/configuration.h | 5 +- retail/arm9/source/conf_sd.cpp | 18 ++-- retail/arm9/source/nds_loader_arm9.c | 7 +- retail/bootloader/source/arm7/load_crt0.s | 3 +- retail/bootloaderi/include/hook.h | 3 +- retail/bootloaderi/source/arm7/hook_arm7.c | 18 +++- retail/bootloaderi/source/arm7/hook_arm9.c | 17 ++-- retail/bootloaderi/source/arm7/load_crt0.s | 3 +- retail/bootloaderi/source/arm7/main.arm7.c | 27 ++--- retail/cardengine/arm7/source/inGameMenu.c | 2 +- .../arm7/source/card_engine_header.s | 12 +++ retail/cardenginei/arm7/source/cardengine.c | 93 ++++++++++++++++-- retail/cardenginei/arm7/source/inGameMenu.c | 5 +- .../arm7_dsiware/source/card_engine_header.s | 8 ++ .../arm7_dsiware/source/inGameMenu.c | 2 +- .../cardenginei/arm9/source/cardDma.thumb.c | 20 +++- .../arm9/source/card_engine_header.s | 2 - retail/cardenginei/arm9/source/cardengine.c | 20 +++- .../common/include/cardengine_header_arm7.h | 6 +- .../common/include/cardengine_header_arm9.h | 1 + retail/common/include/load_crt0.h | 5 +- .../preLoadSettings/files-3ds/AZLE-236A.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-3ds/AZLJ-6133.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-3ds/AZLK-CBEC.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-3ds/AZLP-32D5.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-3ds/C24E-1F51.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-3ds/C24J-3CEC.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-3ds/C24P-432C.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-3ds/YVIE-3036.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-3ds/YVIJ-8FDB.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-3ds/YVIP-11DD.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-dsi/AZLE-236A.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-dsi/AZLJ-6133.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-dsi/AZLK-CBEC.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-dsi/AZLP-32D5.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-dsi/YVIE-3036.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-dsi/YVIJ-8FDB.bin | Bin 8 -> 12 bytes .../preLoadSettings/files-dsi/YVIP-11DD.bin | Bin 8 -> 12 bytes 38 files changed, 223 insertions(+), 54 deletions(-) diff --git a/retail/arm9/include/configuration.h b/retail/arm9/include/configuration.h index 267cadb48..ffa806ed6 100644 --- a/retail/arm9/include/configuration.h +++ b/retail/arm9/include/configuration.h @@ -36,8 +36,9 @@ typedef struct configuration { u32 apPatchSize; u32 cheatSize; u32 musicsSize; - u32 dataToPreloadAddr[2]; - u32 dataToPreloadSize[2]; + u32 dataToPreloadAddr; + u32 dataToPreloadSize; + u32 dataToPreloadFrame; u8 language; char* guiLanguage; s8 region; // SDK 5 diff --git a/retail/arm9/source/conf_sd.cpp b/retail/arm9/source/conf_sd.cpp index 8eafbac39..05357e7fd 100644 --- a/retail/arm9/source/conf_sd.cpp +++ b/retail/arm9/source/conf_sd.cpp @@ -1379,26 +1379,30 @@ int loadFromSD(configuration* conf, const char *bootstrapPath) { } if (offset > 0) { - if (size > 0x10) { - size = 0x10; + if (size > 0xC) { + size = 0xC; } fseek(file, offset, SEEK_SET); u32 *buffer = new u32[size/4]; fread(buffer, 1, size, file); - for (u32 i = 0; i < size/8; i++) { + /* for (u32 i = 0; i < size/8; i++) { conf->dataToPreloadAddr[i] = buffer[0+(i*2)]; conf->dataToPreloadSize[i] = buffer[1+(i*2)]; - } + } */ + conf->dataToPreloadAddr = buffer[0]; + conf->dataToPreloadSize = buffer[1]; + conf->dataToPreloadFrame = (size == 0xC) ? buffer[2] : 0; delete[] buffer; } } fclose(file); } - if (conf->dataToPreloadAddr[0] == 0) { + if (conf->dataToPreloadAddr == 0) { // Set NitroFS pre-load, in case if full ROM pre-load fails - conf->dataToPreloadAddr[0] = ndsArm7BinOffset+ndsArm7Size; - conf->dataToPreloadSize[0] = ((internalRomSize == 0 || internalRomSize > conf->romSize) ? conf->romSize : internalRomSize)-conf->dataToPreloadAddr[0]; + conf->dataToPreloadAddr = ndsArm7BinOffset+ndsArm7Size; + conf->dataToPreloadSize = ((internalRomSize == 0 || internalRomSize > conf->romSize) ? conf->romSize : internalRomSize)-conf->dataToPreloadAddr; + conf->dataToPreloadFrame = 0; } } else { const bool binary3 = (REG_SCFG_EXT7 == 0 ? !dsiEnhancedMbk : (a7mbk6 != 0x00403000)); diff --git a/retail/arm9/source/nds_loader_arm9.c b/retail/arm9/source/nds_loader_arm9.c index 1405d2ba9..cf111805d 100644 --- a/retail/arm9/source/nds_loader_arm9.c +++ b/retail/arm9/source/nds_loader_arm9.c @@ -268,10 +268,9 @@ int runNds(u32 cluster, u32 saveCluster, u32 donorTwlCluster, /* u32 gbaCluster, loader->saveSize = conf->saveSize; // loader->gbaRomSize = conf->gbaRomSize; // loader->gbaSaveSize = conf->gbaSaveSize; - loader->dataToPreloadAddr[0] = conf->dataToPreloadAddr[0]; - loader->dataToPreloadAddr[1] = conf->dataToPreloadAddr[1]; - loader->dataToPreloadSize[0] = conf->dataToPreloadSize[0]; - loader->dataToPreloadSize[1] = conf->dataToPreloadSize[1]; + loader->dataToPreloadAddr = conf->dataToPreloadAddr; + loader->dataToPreloadSize = conf->dataToPreloadSize; + loader->dataToPreloadFrame = conf->dataToPreloadFrame; loader->wideCheatFileCluster = wideCheatCluster; loader->wideCheatSize = conf->wideCheatSize; loader->apPatchFileCluster = apPatchCluster; diff --git a/retail/bootloader/source/arm7/load_crt0.s b/retail/bootloader/source/arm7/load_crt0.s index 22a23e3ec..647f0555c 100644 --- a/retail/bootloader/source/arm7/load_crt0.s +++ b/retail/bootloader/source/arm7/load_crt0.s @@ -43,6 +43,7 @@ @ .global gbaSaveSize .global dataToPreloadAddr .global dataToPreloadSize + .global dataToPreloadFrame .global wideCheatFileCluster .global wideCheatSize .global apPatchFileCluster @@ -120,9 +121,9 @@ saveSize: @ .word 0x00000000 @ GBA .sav file size dataToPreloadAddr: .word 0x00000000 - .word 0x00000000 dataToPreloadSize: .word 0x00000000 +dataToPreloadFrame: .word 0x00000000 wideCheatFileCluster: .word 0x00000000 diff --git a/retail/bootloaderi/include/hook.h b/retail/bootloaderi/include/hook.h index ce6e1b7e6..8ee4a841b 100644 --- a/retail/bootloaderi/include/hook.h +++ b/retail/bootloaderi/include/hook.h @@ -59,7 +59,8 @@ int hookNdsRetailArm7( u8 dmaRomRead_LED, bool ndmaDisabled, bool twlTouch, - bool usesCloneboot + bool usesCloneboot, + u32 romPartLocation ); int hookNdsRetailArm9( cardengineArm9* ce9, diff --git a/retail/bootloaderi/source/arm7/hook_arm7.c b/retail/bootloaderi/source/arm7/hook_arm7.c index 8d0d7b86b..3f15d51d4 100644 --- a/retail/bootloaderi/source/arm7/hook_arm7.c +++ b/retail/bootloaderi/source/arm7/hook_arm7.c @@ -37,6 +37,7 @@ #define b_gameOnFlashcard BIT(0) #define b_saveOnFlashcard BIT(1) +#define b_eSdk2 BIT(2) #define b_ROMinRAM BIT(3) #define b_dsiMode BIT(4) #define b_dsiSD BIT(5) @@ -152,7 +153,8 @@ int hookNdsRetailArm7( u8 dmaRomRead_LED, bool ndmaDisabled, bool twlTouch, - bool usesCloneboot + bool usesCloneboot, + u32 romPartLocation ) { dbg_printf("hookNdsRetailArm7\n"); @@ -350,6 +352,11 @@ int hookNdsRetailArm7( *vblankHandler = 0x2FFC008; } else {*/ extern u32 iUncompressedSize; + extern u32 dataToPreloadAddr; + extern u32 dataToPreloadSize; + extern u32 dataToPreloadFrame; + extern bool dataToPreloadFound(const tNDSHeader* ndsHeader); + const bool laterSdk = ((moduleParams->sdk_version >= 0x2008000 && moduleParams->sdk_version != 0x2012774) || moduleParams->sdk_version == 0x20029A8); ce7->intr_vblank_orig_return = *vblankHandler; ce7->intr_fifo_orig_return = *ipcSyncHandler; @@ -367,6 +374,9 @@ int hookNdsRetailArm7( if (saveOnFlashcard) { ce7->valueBits |= b_saveOnFlashcard; } + if (!laterSdk) { + ce7->valueBits |= b_eSdk2; + } if (ROMinRAM) { ce7->valueBits |= b_ROMinRAM; } @@ -445,6 +455,12 @@ int hookNdsRetailArm7( romOffset = ndsHeader->arm9overlaySource; } ce7->romLocation -= romOffset; + if (dataToPreloadFound(ndsHeader) && dataToPreloadFrame) { + ce7->romPartLocation = romPartLocation; + ce7->romPartSrc = dataToPreloadAddr; + ce7->romPartSize = dataToPreloadSize; + ce7->romPartFrame = dataToPreloadFrame; + } // 0: ROM part start, 1: ROM part start in RAM, 2: ROM part end in RAM extern u32 romMapLines; diff --git a/retail/bootloaderi/source/arm7/hook_arm9.c b/retail/bootloaderi/source/arm7/hook_arm9.c index 44726961f..16b99ba46 100644 --- a/retail/bootloaderi/source/arm7/hook_arm9.c +++ b/retail/bootloaderi/source/arm7/hook_arm9.c @@ -29,6 +29,7 @@ #define b_isDlp BIT(15) #define b_bypassExceptionHandler BIT(16) #define b_fntFatCached BIT(17) +#define b_waitForPreloadToFinish BIT(18) static const int MAX_HANDLER_LEN = 50; @@ -336,8 +337,9 @@ int hookNdsRetailArm9( extern u32 overlaysSize; extern bool overlayPatch; extern u32 romPaddingSize; - extern u32 dataToPreloadAddr[2]; - extern u32 dataToPreloadSize[2]; + extern u32 dataToPreloadAddr; + extern u32 dataToPreloadSize; + extern u32 dataToPreloadFrame; extern bool dataToPreloadFound(const tNDSHeader* ndsHeader); const char* romTid = getRomTid(ndsHeader); const bool laterSdk = ((moduleParams->sdk_version >= 0x2008000 && moduleParams->sdk_version != 0x2012774) || moduleParams->sdk_version == 0x20029A8); @@ -443,8 +445,8 @@ int hookNdsRetailArm9( //ce9->romLocation[1] = ce9->romLocation[0]+dataToPreloadSize[0]; // ce9->romLocation -= dataToPreloadAddr[0]; //ce9->romLocation[1] -= dataToPreloadAddr[1]; - configureRomMap(ce9, ndsHeader, dataToPreloadAddr[0], cacheBlockSize, dsiMode, consoleModel); - for (u32 i = 0; i < dataToPreloadSize[0]/*+dataToPreloadSize[1]*/; i += cacheBlockSize) { + configureRomMap(ce9, ndsHeader, dataToPreloadAddr, cacheBlockSize, dsiMode, consoleModel); + for (u32 i = 0; i < dataToPreloadSize/*+dataToPreloadSize[1]*/; i += cacheBlockSize) { ce9->cacheAddress += cacheBlockSize; if (isSdk5(moduleParams) || ((ce9->valueBits & b_dsiBios) && laterSdk)) { if (ce9->cacheAddress == 0x0C7C0000+cacheBlockSize) { @@ -468,10 +470,13 @@ int hookNdsRetailArm9( dataToPreloadSizeAligned += cacheBlockSize; } ce9->cacheSlots -= dataToPreloadSizeAligned/cacheBlockSize; - ce9->romPartSrc = dataToPreloadAddr[0]; + ce9->romPartSrc = dataToPreloadAddr; //ce9->romPartSrc[1] = dataToPreloadAddr[1]; - ce9->romPartSize = dataToPreloadSize[0]; + ce9->romPartSize = dataToPreloadSize; //ce9->romPartSize[1] = dataToPreloadSize[1]; + if (dataToPreloadFrame) { + ce9->valueBits |= b_waitForPreloadToFinish; + } } if (runOverlayCheck && overlaysSize <= 0x700000) { /*extern u8 gameOnFlashcard; diff --git a/retail/bootloaderi/source/arm7/load_crt0.s b/retail/bootloaderi/source/arm7/load_crt0.s index 22a23e3ec..647f0555c 100644 --- a/retail/bootloaderi/source/arm7/load_crt0.s +++ b/retail/bootloaderi/source/arm7/load_crt0.s @@ -43,6 +43,7 @@ @ .global gbaSaveSize .global dataToPreloadAddr .global dataToPreloadSize + .global dataToPreloadFrame .global wideCheatFileCluster .global wideCheatSize .global apPatchFileCluster @@ -120,9 +121,9 @@ saveSize: @ .word 0x00000000 @ GBA .sav file size dataToPreloadAddr: .word 0x00000000 - .word 0x00000000 dataToPreloadSize: .word 0x00000000 +dataToPreloadFrame: .word 0x00000000 wideCheatFileCluster: .word 0x00000000 diff --git a/retail/bootloaderi/source/arm7/main.arm7.c b/retail/bootloaderi/source/arm7/main.arm7.c index 7197c852c..e03b87003 100644 --- a/retail/bootloaderi/source/arm7/main.arm7.c +++ b/retail/bootloaderi/source/arm7/main.arm7.c @@ -104,8 +104,9 @@ extern u32 romSize; extern u32 saveSize; // extern u32 gbaRomSize; // extern u32 gbaSaveSize; -extern u32 dataToPreloadAddr[2]; -extern u32 dataToPreloadSize[2]; +extern u32 dataToPreloadAddr; +extern u32 dataToPreloadSize; +extern u32 dataToPreloadFrame; extern u32 wideCheatFileCluster; extern u32 wideCheatSize; extern u32 apPatchFileCluster; @@ -941,10 +942,10 @@ static void my_readUserSettings(tNDSHeader* ndsHeader) { bool dataToPreloadFound(const tNDSHeader* ndsHeader) { if (strncmp(ndsHeader->gameCode, "UBR", 3) == 0) { - return (dataToPreloadSize[0] > 0 && (dataToPreloadSize[0]/*+dataToPreloadSize[1]*/) <= retail_CACHE_ADRESS_SIZE_BROWSER-0x40000); + return (dataToPreloadSize > 0 && (dataToPreloadSize/*+dataToPreloadSize[1]*/) <= retail_CACHE_ADRESS_SIZE_BROWSER-0x40000); } - return (dataToPreloadSize[0] > 0 && (dataToPreloadSize[0]/*+dataToPreloadSize[1]*/) <= (consoleModel > 0 ? (dsiModeConfirmed ? (ndsHeader->unitCode > 0 ? dev_CACHE_ADRESS_SIZE_TWLSDK : dev_CACHE_ADRESS_SIZE_DSIMODE) : dev_CACHE_ADRESS_SIZE) : (dsiModeConfirmed ? retail_CACHE_ADRESS_SIZE_DSIMODE : retail_CACHE_ADRESS_SIZE))-0x40000); + return (dataToPreloadSize > 0 && (dataToPreloadSize/*+dataToPreloadSize[1]*/) <= (consoleModel > 0 ? (dsiModeConfirmed ? (ndsHeader->unitCode > 0 ? dev_CACHE_ADRESS_SIZE_TWLSDK : dev_CACHE_ADRESS_SIZE_DSIMODE) : dev_CACHE_ADRESS_SIZE) : (dsiModeConfirmed ? retail_CACHE_ADRESS_SIZE_DSIMODE : retail_CACHE_ADRESS_SIZE))-0x40000); } static void loadROMPartIntoRAM(const tNDSHeader* ndsHeader, const module_params_t* moduleParams, const bool laterSdk, aFile* file) { @@ -952,14 +953,19 @@ static void loadROMPartIntoRAM(const tNDSHeader* ndsHeader, const module_params_ return; } + if ((dataToPreloadFrame > 0) && !gameOnFlashcard && (!ROMsupportsDsiMode(ndsHeader) || !dsiModeConfirmed)) { + dbg_printf("Part of ROM will pre-load into RAM\n"); + return; + } + const bool dsiBios = scfgBios9i(); u32 dataLocation = getRomPartLocation(ndsHeader, !laterSdk, isSdk5(moduleParams), dsiBios); - s32 preloadSizeEdit = dataToPreloadSize[0]; + s32 preloadSizeEdit = dataToPreloadSize; u32 romLocationChange = dataLocation; u32 romLocationChangePrep = romLocationChange; - u32 romOffsetChange = dataToPreloadAddr[0]; + u32 romOffsetChange = dataToPreloadAddr; u32 romBlockSize = 0; while (preloadSizeEdit > 0) { bool readRom = false; @@ -969,9 +975,6 @@ static void loadROMPartIntoRAM(const tNDSHeader* ndsHeader, const module_params_ if (preloadSizeEdit <= 0) { readRom = true; - } else if (dsiWramAccess && !dsiWramMirrored && romLocationChangePrep == (consoleModel > 0 ? 0x0E000000 : 0x0D000000)) { - romLocationChangePrep = 0x03708000; - readRom = true; } else if (isSdk5(moduleParams) || (dsiBios && laterSdk)) { if (romLocationChangePrep == 0x0C7C0000+cacheBlockSize) { romLocationChangePrep += (ndsHeader->unitCode > 0 ? 0x20000 : 0x40000)-cacheBlockSize; @@ -1938,7 +1941,8 @@ int arm7_main(void) { dmaRomRead_LED, ndmaDisabled, twlTouch, - false + false, + 0 ); if (errorCode == ERR_NONE) { dbg_printf("Card hook 7 successful\n\n"); @@ -2210,7 +2214,8 @@ int arm7_main(void) { dmaRomRead_LED, ndmaDisabled, twlTouch, - usesCloneboot + usesCloneboot, + getRomPartLocation(ndsHeader, !laterSdk, isSdk5(moduleParams), scfgBios9i()) ); if (errorCode == ERR_NONE) { // dbg_printf("Card hook 7 successful\n\n"); diff --git a/retail/cardengine/arm7/source/inGameMenu.c b/retail/cardengine/arm7/source/inGameMenu.c index f8cece85a..825dfbc8b 100644 --- a/retail/cardengine/arm7/source/inGameMenu.c +++ b/retail/cardengine/arm7/source/inGameMenu.c @@ -41,7 +41,7 @@ volatile int timeTillStatusRefresh = 7; void inGameMenu(void) { sharedAddr[4] = 0x554E454D; // 'MENU' IPC_SendSync(0x9); - u32 errorBak = sharedAddr[0]; + const u32 errorBak = sharedAddr[0]; int volBak = REG_MASTER_VOLUME; REG_MASTER_VOLUME = 0; int oldIME = enterCriticalSection(); diff --git a/retail/cardenginei/arm7/source/card_engine_header.s b/retail/cardenginei/arm7/source/card_engine_header.s index 62b4232d2..ae9a07f64 100644 --- a/retail/cardenginei/arm7/source/card_engine_header.s +++ b/retail/cardenginei/arm7/source/card_engine_header.s @@ -35,6 +35,10 @@ .global igmHotkey .global ndsCodeStart .global romLocation +.global romPartLocation +.global romPartSrc +.global romPartSize +.global romPartFrame .global romMapLines .global romMap @@ -93,6 +97,14 @@ igmHotkey: .hword 0 romLocation: .word 0x00000000 +romPartLocation: + .word 0x00000000 +romPartSrc: + .word 0x00000000 +romPartSize: + .word 0x00000000 +romPartFrame: + .word 0x00000000 romMapLines: .word 0x00000000 romMap: diff --git a/retail/cardenginei/arm7/source/cardengine.c b/retail/cardenginei/arm7/source/cardengine.c index 5cae96f34..2429a2e0f 100644 --- a/retail/cardenginei/arm7/source/cardengine.c +++ b/retail/cardenginei/arm7/source/cardengine.c @@ -57,6 +57,7 @@ #define gameOnFlashcard BIT(0) #define saveOnFlashcard BIT(1) +#define eSdk2 BIT(1) #define ROMinRAM BIT(3) #define dsiMode BIT(4) #define b_dsiSD BIT(5) @@ -529,6 +530,7 @@ void reset(void) { initialized = false; //ipcSyncHooked = false; languageTimer = 0; + unlockMutex(&saveMutex); #ifndef TWLSDK if ((valueBits & isDlp) || currentSrlAddr != *(u32*)(resetParam+0xC) || *(u32*)(resetParam+8) == 0x44414F4C) { @@ -1352,6 +1354,72 @@ static bool resume_cardRead_arm9(void) { sharedAddr[4] = 0; return true; } */ + +static void loadROMPartIntoRAM(void) { + static bool finished = false; + extern u32 romPartLocation; + extern u32 romPartSrc; + extern u32 romPartSize; + extern u32 romPartFrame; + + if (finished || romPartFrame == 0 || *(int*)((valueBits & isSdk5) ? 0x02FFFC3C : 0x027FFC3C) < romPartFrame) { + return; + } + + const int oldIME = enterCriticalSection(); // This is needed to avoid crashing when reading or writing save data + + static bool inited = false; + const u32 cacheBlockSize = 0x4000; + + static s32 preloadSizeEdit = 0; + static u32 romLocationChange = 0; + static u32 romOffsetChange = 0; + + if (!inited) { + preloadSizeEdit = romPartSize; + romLocationChange = romPartLocation; + romOffsetChange = romPartSrc; + inited = true; + } + + if (preloadSizeEdit > 0) { + const u32 romBlockSize = (preloadSizeEdit > cacheBlockSize) ? cacheBlockSize : preloadSizeEdit; + if (lockMutex(&saveMutex)) { + cardReadLED(true, true); + fileRead((char*)romLocationChange, romFile, romOffsetChange, romBlockSize); + cardReadLED(false, true); + unlockMutex(&saveMutex); + } + preloadSizeEdit -= romBlockSize; + romOffsetChange += cacheBlockSize; + romLocationChange += cacheBlockSize; + + if ((valueBits & isSdk5) || ((valueBits & dsiBios) && !(valueBits & eSdk2))) { + if (romLocationChange == 0x0C7C0000+cacheBlockSize) { + romLocationChange += (ndsHeader->unitCode > 0 ? 0x20000 : 0x40000)-cacheBlockSize; + } else if (ndsHeader->unitCode == 0) { + if (romLocationChange == 0x0D000000-cacheBlockSize) { + romLocationChange += cacheBlockSize; + } + } else { + if (romLocationChange == 0x0C800000-cacheBlockSize) { + romLocationChange += cacheBlockSize; + } else if (romLocationChange == 0x0CFE0000) { + romLocationChange += 0x20000; + } + } + } else if ((romLocationChange == 0x0D000000-cacheBlockSize) && (valueBits & dsiBios)) { + romLocationChange += cacheBlockSize; + } else if (romLocationChange == 0x0C7C0000) { + romLocationChange += 0x40000; + } + } else { + sharedAddr[5] = 0x44454C50; // 'PLED' + finished = true; + } + + leaveCriticalSection(oldIME); +} #endif static inline void sdmmcHandler(void) { // Unused @@ -1436,7 +1504,9 @@ void runCardEngineCheck(void) { }*/ if (!(valueBits & gameOnFlashcard)) { - // #ifndef TWLSDK + #ifndef TWLSDK + loadROMPartIntoRAM(); + #endif if (/* sharedAddr[3] == (vu32)0x020FF808 || sharedAddr[3] == (vu32)0x020FF80A || */ sharedAddr[3] == (vu32)0x025FFB08 || sharedAddr[3] == (vu32)0x025FFB0A) { // ARM9 Card Read //if (!readOngoing ? start_cardRead_arm9() : resume_cardRead_arm9()) { bool useApFixOverlays = false; @@ -1451,9 +1521,12 @@ void runCardEngineCheck(void) { const bool isDma = (sharedAddr[3] == (vu32)0x025FFB0A); // readOngoing = true; - cardReadLED(true, isDma); // When a file is loading, turn on LED for card read indicator - fileRead((char*)dst, useApFixOverlays ? apFixOverlaysFile : romFile, src, len); - cardReadLED(false, isDma); // After loading is done, turn off LED for card read indicator + if (lockMutex(&saveMutex)) { + cardReadLED(true, isDma); // When a file is loading, turn on LED for card read indicator + fileRead((char*)dst, useApFixOverlays ? apFixOverlaysFile : romFile, src, len); + cardReadLED(false, isDma); // After loading is done, turn off LED for card read indicator + unlockMutex(&saveMutex); + } // readOngoing = false; sharedAddr[3] = 0; if (isDma) { @@ -1465,7 +1538,6 @@ void runCardEngineCheck(void) { sharedAddr[3] = 0; IPC_SendSync(0x3); }*/ - // #endif } #ifdef DEBUG @@ -1624,6 +1696,7 @@ void myIrqHandlerVBlank(void) { #endif */ if ((0 == (REG_KEYINPUT & igmHotkey) && 0 == (REG_EXTKEYINPUT & (((igmHotkey >> 10) & 3) | ((igmHotkey >> 6) & 0xC0))) && (valueBits & igmAccessible) && !wifiIrq) /* || returnToMenu */ || sharedAddr[5] == 0x4C4D4749 /* IGML */) { + if (tryLockMutex(&saveMutex)) { #ifdef TWLSDK igmText = (struct IgmText *)INGAME_MENU_LOCATION; i2cWriteRegister(0x4A, 0x12, 0x00); @@ -1632,11 +1705,13 @@ void myIrqHandlerVBlank(void) { #ifdef TWLSDK i2cWriteRegister(0x4A, 0x12, 0x01); #endif + unlockMutex(&saveMutex); + } } /*KEY_X*/ /* if (0==(REG_KEYINPUT & (KEY_L | KEY_R | KEY_UP)) && !(REG_EXTKEYINPUT & KEY_A)) { - if (tryLockMutex(&saveMutex)) { + if (lockMutex(&saveMutex)) { if (swapTimer == 60){ swapTimer = 0; if (!ipcEveryFrame) { @@ -1691,7 +1766,7 @@ void myIrqHandlerVBlank(void) { } if ( 0 == (REG_KEYINPUT & (KEY_L | KEY_R | KEY_START | KEY_SELECT))) { - if (tryLockMutex(&saveMutex)) { + if (lockMutex(&saveMutex)) { if ((softResetTimer == 60 * 2) && (saveTimer == 0)) { REG_MASTER_VOLUME = 0; int oldIME = enterCriticalSection(); @@ -1937,7 +2012,7 @@ bool eepromRead(u32 src, void *dst, u32 len) { return false; } - if (tryLockMutex(&saveMutex)) { + if (lockMutex(&saveMutex)) { // while (readOngoing) { swiDelay(100); } #ifdef TWLSDK //bool doBak = ((valueBits & gameOnFlashcard) && !(valueBits & saveOnFlashcard)); @@ -1986,7 +2061,7 @@ bool eepromPageWrite(u32 dst, const void *src, u32 len) { return false; } - if (tryLockMutex(&saveMutex)) { + if (lockMutex(&saveMutex)) { // while (readOngoing) { swiDelay(100); } #ifdef TWLSDK //bool doBak = ((valueBits & gameOnFlashcard) && !(valueBits & saveOnFlashcard)); diff --git a/retail/cardenginei/arm7/source/inGameMenu.c b/retail/cardenginei/arm7/source/inGameMenu.c index 768b76004..03f594191 100644 --- a/retail/cardenginei/arm7/source/inGameMenu.c +++ b/retail/cardenginei/arm7/source/inGameMenu.c @@ -55,7 +55,8 @@ volatile int timeTillStatusRefresh = 7; void inGameMenu(void) { // returnToMenu = false; sharedAddr[4] = 0x554E454D; // 'MENU' - u32 errorBak = sharedAddr[0]; + const u32 errorBak = sharedAddr[0]; + const u32 flagBak = sharedAddr[5]; IPC_SendSync(0x9); REG_MASTER_VOLUME = 0; int oldIME = enterCriticalSection(); @@ -219,7 +220,7 @@ void inGameMenu(void) { sharedAddr[0] = errorBak; sharedAddr[4] = 0; - sharedAddr[5] = 0; + sharedAddr[5] = flagBak; sharedAddr[7] -= 0x10000000; // Clear time receive flag timeTillStatusRefresh = 7; diff --git a/retail/cardenginei/arm7_dsiware/source/card_engine_header.s b/retail/cardenginei/arm7_dsiware/source/card_engine_header.s index 8bf3e6707..6ce4d3755 100644 --- a/retail/cardenginei/arm7_dsiware/source/card_engine_header.s +++ b/retail/cardenginei/arm7_dsiware/source/card_engine_header.s @@ -92,6 +92,14 @@ igmHotkey: .hword 0 romLocation: .word 0x00000000 +romPartLocation: + .word 0x00000000 +romPartSrc: + .word 0x00000000 +romPartSize: + .word 0x00000000 +romPartFrame: + .word 0x00000000 romMapLines: .word 0x00000000 romMap: diff --git a/retail/cardenginei/arm7_dsiware/source/inGameMenu.c b/retail/cardenginei/arm7_dsiware/source/inGameMenu.c index 4c64501d4..caaa25fb1 100644 --- a/retail/cardenginei/arm7_dsiware/source/inGameMenu.c +++ b/retail/cardenginei/arm7_dsiware/source/inGameMenu.c @@ -55,7 +55,7 @@ volatile int timeTillStatusRefresh = 7; void inGameMenu(void) { // returnToMenu = false; sharedAddr[4] = 0x554E454D; // 'MENU' - u32 errorBak = sharedAddr[0]; + const u32 errorBak = sharedAddr[0]; IPC_SendSync(0x9); REG_MASTER_VOLUME = 0; int oldIME = enterCriticalSection(); diff --git a/retail/cardenginei/arm9/source/cardDma.thumb.c b/retail/cardenginei/arm9/source/cardDma.thumb.c index 8b9cc6ae1..aef75cfe8 100644 --- a/retail/cardenginei/arm9/source/cardDma.thumb.c +++ b/retail/cardenginei/arm9/source/cardDma.thumb.c @@ -45,6 +45,7 @@ #define cacheFlushFlag BIT(7) #define cardReadFix BIT(8) #define cacheDisabled BIT(9) +#define waitForPreloadToFinish BIT(18) //#ifdef DLDI #include "my_fat.h" @@ -76,6 +77,7 @@ bool dmaDirectRead = false; #ifndef TWLSDK static bool dataSplit = false; #endif +extern bool romPart; void endCardReadDma() { #ifndef TWLSDK @@ -117,6 +119,10 @@ extern u32 newOverlayOffset; extern u32 newOverlaysSize; #endif +static inline bool isPreloadFinished(void) { + return (sharedAddr[5] == 0x44454C50); // 'PLED' +} + static inline bool checkArm7(void) { // IPC_SendSync(0x4); return (sharedAddr[3] == (vu32)0); @@ -379,7 +385,7 @@ void cardSetDma(u32 * params) { #ifndef TWLSDK dataSplit = false; #endif - bool romPart = false; + romPart = false; //int romPartNo = 0; if (!(ce9->valueBits & ROMinRAM)) { /*for (int i = 0; i < 2; i++) { @@ -393,6 +399,18 @@ void cardSetDma(u32 * params) { } }*/ romPart = (ce9->romPartSize > 0 && src >= ce9->romPartSrc && src < ce9->romPartSrc+ce9->romPartSize); + #ifndef DLDI + #ifndef TWLSDK + if (romPart && (ce9->valueBits & waitForPreloadToFinish)) { + if (isPreloadFinished()) { + sharedAddr[5] = 0; + ce9->valueBits &= ~waitForPreloadToFinish; + } else { + romPart = false; + } + } + #endif + #endif } if ((ce9->valueBits & ROMinRAM) || romPart) { dmaDirectRead = true; diff --git a/retail/cardenginei/arm9/source/card_engine_header.s b/retail/cardenginei/arm9/source/card_engine_header.s index 968193a72..dec3c15cc 100644 --- a/retail/cardenginei/arm9/source/card_engine_header.s +++ b/retail/cardenginei/arm9/source/card_engine_header.s @@ -60,10 +60,8 @@ cacheBlockSize: .hword 0 romPartSrc: .word 0x00000000 -@ .word 0x00000000 romPartSize: .word 0x00000000 -@ .word 0x00000000 #ifndef TWLSDK romMapLines: .word 0x00000000 diff --git a/retail/cardenginei/arm9/source/cardengine.c b/retail/cardenginei/arm9/source/cardengine.c index 35b05abe7..d71bc86be 100644 --- a/retail/cardenginei/arm9/source/cardengine.c +++ b/retail/cardenginei/arm9/source/cardengine.c @@ -53,6 +53,7 @@ #define softResetMb BIT(13) #define cloneboot BIT(14) #define fntFatCached BIT(17) +#define waitForPreloadToFinish BIT(18) //#ifdef DLDI #include "my_fat.h" @@ -137,6 +138,7 @@ static u32 asyncSector = 0; #endif // ASYNCPF #endif // DLDI bool flagsSet = false; +bool romPart = false; #ifdef DLDI static bool driveInitialized = false; #endif @@ -358,6 +360,10 @@ void getAsyncSector() { extern void setExceptionHandler2(); +static inline bool isPreloadFinished(void) { + return (sharedAddr[5] == 0x44454C50); // 'PLED' +} + static inline void waitForArm7(void) { // IPC_SendSync(0x4); while (sharedAddr[3] != (vu32)0) { @@ -824,7 +830,7 @@ void cardRead(u32* cacheStruct, u8* dst0, u32 src0, u32 len0) { } #endif - bool romPart = false; + romPart = false; //int romPartNo = 0; if (!(ce9->valueBits & ROMinRAM)) { /*for (int i = 0; i < 2; i++) { @@ -838,6 +844,18 @@ void cardRead(u32* cacheStruct, u8* dst0, u32 src0, u32 len0) { } }*/ romPart = (ce9->romPartSize > 0 && src >= ce9->romPartSrc && src < ce9->romPartSrc+ce9->romPartSize); + #ifndef DLDI + #ifndef TWLSDK + if (romPart && (ce9->valueBits & waitForPreloadToFinish)) { + if (isPreloadFinished()) { + sharedAddr[5] = 0; + ce9->valueBits &= ~waitForPreloadToFinish; + } else { + romPart = false; + } + } + #endif + #endif } if ((ce9->valueBits & ROMinRAM) || romPart) { cardReadRAM(dst, src, len/*, romPartNo*/); diff --git a/retail/common/include/cardengine_header_arm7.h b/retail/common/include/cardengine_header_arm7.h index 770e2dd64..5219cf184 100644 --- a/retail/common/include/cardengine_header_arm7.h +++ b/retail/common/include/cardengine_header_arm7.h @@ -83,7 +83,7 @@ typedef struct cardengineArm7 { /* 0: gameOnFlashcard 1: saveOnFlashcard - 2: extendedMemory + 2: eSdk2 3: ROMinRAM 4: dsiMode 5: dsiSD @@ -116,6 +116,10 @@ typedef struct cardengineArm7 { u16 scfgRomBak; u16 igmHotkey; u32 romLocation; + u32 romPartLocation; + u32 romPartSrc; + u32 romPartSize; + u32 romPartFrame; u32 romMapLines; u32 romMap[5][3]; // 0: ROM part start, 1: ROM part start in RAM, 2: ROM part end in RAM } cardengineArm7; diff --git a/retail/common/include/cardengine_header_arm9.h b/retail/common/include/cardengine_header_arm9.h index 180f03c2b..6e7bba855 100644 --- a/retail/common/include/cardengine_header_arm9.h +++ b/retail/common/include/cardengine_header_arm9.h @@ -103,6 +103,7 @@ typedef struct cardengineArm9 { 15: isDlp 16: bypassExceptionHandler 17: fntFatCached + 18: waitForPreloadToFinish */ s32 mainScreen; u32 consoleModel; diff --git a/retail/common/include/load_crt0.h b/retail/common/include/load_crt0.h index 057560451..b15b78e47 100644 --- a/retail/common/include/load_crt0.h +++ b/retail/common/include/load_crt0.h @@ -26,8 +26,9 @@ typedef struct loadCrt0 { u32 saveSize; // u32 gbaRomSize; // u32 gbaSaveSize; - u32 dataToPreloadAddr[2]; - u32 dataToPreloadSize[2]; + u32 dataToPreloadAddr; + u32 dataToPreloadSize; + u32 dataToPreloadFrame; u32 wideCheatFileCluster; u32 wideCheatSize; u32 apPatchFileCluster; diff --git a/retail/preLoadSettings/files-3ds/AZLE-236A.bin b/retail/preLoadSettings/files-3ds/AZLE-236A.bin index 5bec8647c5ea96c800c885bbd485a79eea408d3b..c17337b5fb91787c26023164759f8aa23dcf5918 100644 GIT binary patch literal 12 TcmZRGQDI;Zo6f+NT0|Ns96hZ=V literal 8 PcmZR$rozB*Yc>M_3Vs4` diff --git a/retail/preLoadSettings/files-3ds/AZLP-32D5.bin b/retail/preLoadSettings/files-3ds/AZLP-32D5.bin index 9debea67001050906429114d29d22732da0bff63..8819562aaf750062a3a261948be35a08f3dca902 100644 GIT binary patch literal 12 TcmZQLp~k=NT0|Ns96hZ=V literal 8 PcmZR$rozB*Yc>M_3Vs4` diff --git a/retail/preLoadSettings/files-dsi/AZLP-32D5.bin b/retail/preLoadSettings/files-dsi/AZLP-32D5.bin index 9debea67001050906429114d29d22732da0bff63..8819562aaf750062a3a261948be35a08f3dca902 100644 GIT binary patch literal 12 TcmZQLp~k=