Skip to content

Commit

Permalink
Pre-load ROM data after boot in some games
Browse files Browse the repository at this point in the history
  • Loading branch information
RocketRobz committed Oct 11, 2024
1 parent c3a0c55 commit 68e5ddb
Show file tree
Hide file tree
Showing 38 changed files with 223 additions and 54 deletions.
5 changes: 3 additions & 2 deletions retail/arm9/include/configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 11 additions & 7 deletions retail/arm9/source/conf_sd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
7 changes: 3 additions & 4 deletions retail/arm9/source/nds_loader_arm9.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion retail/bootloader/source/arm7/load_crt0.s
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
@ .global gbaSaveSize
.global dataToPreloadAddr
.global dataToPreloadSize
.global dataToPreloadFrame
.global wideCheatFileCluster
.global wideCheatSize
.global apPatchFileCluster
Expand Down Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion retail/bootloaderi/include/hook.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ int hookNdsRetailArm7(
u8 dmaRomRead_LED,
bool ndmaDisabled,
bool twlTouch,
bool usesCloneboot
bool usesCloneboot,
u32 romPartLocation
);
int hookNdsRetailArm9(
cardengineArm9* ce9,
Expand Down
18 changes: 17 additions & 1 deletion retail/bootloaderi/source/arm7/hook_arm7.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -152,7 +153,8 @@ int hookNdsRetailArm7(
u8 dmaRomRead_LED,
bool ndmaDisabled,
bool twlTouch,
bool usesCloneboot
bool usesCloneboot,
u32 romPartLocation
) {
dbg_printf("hookNdsRetailArm7\n");

Expand Down Expand Up @@ -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;
Expand All @@ -367,6 +374,9 @@ int hookNdsRetailArm7(
if (saveOnFlashcard) {
ce7->valueBits |= b_saveOnFlashcard;
}
if (!laterSdk) {
ce7->valueBits |= b_eSdk2;
}
if (ROMinRAM) {
ce7->valueBits |= b_ROMinRAM;
}
Expand Down Expand Up @@ -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;
Expand Down
17 changes: 11 additions & 6 deletions retail/bootloaderi/source/arm7/hook_arm9.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion retail/bootloaderi/source/arm7/load_crt0.s
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
@ .global gbaSaveSize
.global dataToPreloadAddr
.global dataToPreloadSize
.global dataToPreloadFrame
.global wideCheatFileCluster
.global wideCheatSize
.global apPatchFileCluster
Expand Down Expand Up @@ -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
Expand Down
27 changes: 16 additions & 11 deletions retail/bootloaderi/source/arm7/main.arm7.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -941,25 +942,30 @@ 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) {
if (!dataToPreloadFound(ndsHeader)) {
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;
Expand All @@ -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;
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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");
Expand Down
2 changes: 1 addition & 1 deletion retail/cardengine/arm7/source/inGameMenu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
12 changes: 12 additions & 0 deletions retail/cardenginei/arm7/source/card_engine_header.s
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@
.global igmHotkey
.global ndsCodeStart
.global romLocation
.global romPartLocation
.global romPartSrc
.global romPartSize
.global romPartFrame
.global romMapLines
.global romMap

Expand Down Expand Up @@ -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:
Expand Down
Loading

0 comments on commit 68e5ddb

Please sign in to comment.