diff --git a/arm7/source/loader/CardSaveArranger.cpp b/arm7/source/loader/CardSaveArranger.cpp index 9a0d41f..b2a49cc 100644 --- a/arm7/source/loader/CardSaveArranger.cpp +++ b/arm7/source/loader/CardSaveArranger.cpp @@ -24,7 +24,7 @@ bool CardSaveArranger::SetupCardSave(const nds_header_ntr_t* header, const TCHAR if (header->nandBackupRegionStart != 0) { saveType = CardSaveType::Nand; - u32 blockSize = header->IsTwlRom() ? TWL_NAND_BLOCK_SIZE : NTR_NAND_BLOCK_SIZE; + u32 blockSize = header->SupportsDsiMode() ? TWL_NAND_BLOCK_SIZE : NTR_NAND_BLOCK_SIZE; u32 nandBackupRegionStart = header->nandBackupRegionStart * blockSize; saveSize = NAND_RW_REGION_END - nandBackupRegionStart; LOG_DEBUG("NAND save. Size: 0x%X.", saveSize); diff --git a/arm7/source/loader/NdsLoader.cpp b/arm7/source/loader/NdsLoader.cpp index 021a175..aa79fef 100644 --- a/arm7/source/loader/NdsLoader.cpp +++ b/arm7/source/loader/NdsLoader.cpp @@ -188,17 +188,21 @@ void NdsLoader::Load(BootMode bootMode) { if (_romHeader.IsDsiWare()) { - if (bootMode == BootMode::SdkResetSystem) + // There exist DS mode DSiWare applications, which don't have a save file. + if (_romHeader.SupportsDsiMode()) { - // todo: for DSiWare we should store the rom path - LOG_FATAL("Soft reset from DSiWare not yet supported\n"); - return; - } + if (bootMode == BootMode::SdkResetSystem) + { + // todo: for DSiWare we should store the rom path + LOG_FATAL("Soft reset from DSiWare not yet supported\n"); + return; + } - if (!TrySetupDsiWareSave()) - { - ErrorDisplay().PrintError("Failed to setup DSiWare save."); - return; + if (!TrySetupDsiWareSave()) + { + ErrorDisplay().PrintError("Failed to setup DSiWare save."); + return; + } } } else @@ -231,7 +235,7 @@ void NdsLoader::Load(BootMode bootMode) if (Environment::IsDsiMode()) { - if (_romHeader.IsTwlRom()) + if (_romHeader.SupportsDsiMode()) { SetupTwlConfig(); TwlAes().SetupAes(&_romHeader); @@ -248,7 +252,7 @@ void NdsLoader::Load(BootMode bootMode) return; } - if (Environment::IsDsiMode() && _romHeader.IsTwlRom()) + if (Environment::IsDsiMode() && _romHeader.SupportsDsiMode()) { if (!TryLoadArm9i()) { @@ -271,7 +275,7 @@ void NdsLoader::Load(BootMode bootMode) return; } - if (Environment::IsDsiMode() && _romHeader.IsTwlRom()) + if (Environment::IsDsiMode() && _romHeader.SupportsDsiMode()) { if (!TryLoadArm7i()) { @@ -293,7 +297,7 @@ void NdsLoader::Load(BootMode bootMode) LOG_DEBUG("Arm7 patches done\n"); } - if (Environment::IsDsiMode() && _romHeader.IsTwlRom()) + if (Environment::IsDsiMode() && _romHeader.SupportsDsiMode()) { SetupDsiDeviceList(); @@ -329,7 +333,7 @@ void NdsLoader::Load(BootMode bootMode) if (Environment::IsDsiMode()) { - if (_romHeader.IsTwlRom()) + if (_romHeader.SupportsDsiMode()) { if (!(_romHeader.twlFlags2 & 1)) { @@ -380,7 +384,7 @@ void NdsLoader::InsertArgv() // Find the address to write argv u32 argDst = ((_romHeader.arm9LoadAddress + _romHeader.arm9Size + 3) & ~3) + 4; - if (_romHeader.IsTwlRom()) + if (_romHeader.SupportsDsiMode()) { u32 argDstTwl = ((_romHeader.arm9iLoadAddress + _romHeader.arm9iSize + 3) & ~3) + 4; if (argDstTwl > argDst) @@ -442,7 +446,7 @@ void NdsLoader::ApplyArm7Patches() u32 mbk6 = 0; u32 mbk7 = 0; u32 mbk8 = 0; - if (Environment::IsDsiMode() && _romHeader.IsTwlRom()) + if (Environment::IsDsiMode() && _romHeader.SupportsDsiMode()) { mbk6 = REG_MBK6; mbk7 = REG_MBK7; @@ -466,7 +470,7 @@ void NdsLoader::ApplyArm7Patches() memcpy(patchCode.get(), srcAddress, patchSpaceSize); } - if (Environment::IsDsiMode() && _romHeader.IsTwlRom()) + if (Environment::IsDsiMode() && _romHeader.SupportsDsiMode()) { REG_MBK6 = mbk6; REG_MBK7 = mbk7; @@ -493,7 +497,7 @@ void NdsLoader::SetupSharedMemory(u32 cardId, u32 agbMem, u32 resetParam, u32 ro LoadFirmwareUserSettings(); - if (!_romHeader.IsTwlRom()) + if (!_romHeader.SupportsDsiMode()) { memcpy((void*)0x027FF800, (void*)0x02FFF800, sizeof(shared_memory_ntr_t)); memcpy((void*)0x023FF800, (void*)0x02FFF800, sizeof(shared_memory_ntr_t)); @@ -505,10 +509,10 @@ void NdsLoader::SetupSharedMemory(u32 cardId, u32 agbMem, u32 resetParam, u32 ro { strcpy(TWL_SHARED_MEMORY->sysMenuVersionInfoContentId, "00000009"); TWL_SHARED_MEMORY->sysMenuVersionInfoContentLastInitialCode = 'P'; // europe - - memcpy(TWL_SHARED_MEMORY->twlCardRomHeader, &_romHeader, sizeof(nds_header_twl_t)); - memcpy(TWL_SHARED_MEMORY->twlRomHeader, &_romHeader, sizeof(nds_header_twl_t)); } + + memcpy(TWL_SHARED_MEMORY->twlCardRomHeader, &_romHeader, sizeof(nds_header_twl_t)); + memcpy(TWL_SHARED_MEMORY->twlRomHeader, &_romHeader, sizeof(nds_header_twl_t)); } void NdsLoader::LoadFirmwareUserSettings() @@ -643,7 +647,7 @@ void NdsLoader::HandleAntiPiracy() void NdsLoader::RemapWram() { mem_unlockAllTwlWram(); - if (_romHeader.IsTwlRom()) + if (_romHeader.SupportsDsiMode()) { REG_MBK6 = _romHeader.arm7MbkSettings[0]; REG_MBK7 = _romHeader.arm7MbkSettings[1]; diff --git a/arm9/source/Arm7Patcher.cpp b/arm9/source/Arm7Patcher.cpp index 43ba649..718d8b8 100644 --- a/arm9/source/Arm7Patcher.cpp +++ b/arm9/source/Arm7Patcher.cpp @@ -35,8 +35,8 @@ void* Arm7Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform) const { (void*)romHeader->arm7LoadAddress, romHeader->arm7Size, - (romHeader->IsTwlRom()) ? (void*)twlRomHeader->arm7iLoadAddress : nullptr, - (romHeader->IsTwlRom()) ? twlRomHeader->arm7iSize : 0, + (romHeader->SupportsDsiMode()) ? (void*)twlRomHeader->arm7iLoadAddress : nullptr, + (romHeader->SupportsDsiMode()) ? twlRomHeader->arm7iSize : 0, sdkVersion, romHeader->gameCode, romHeader->softwareVersion, @@ -114,7 +114,7 @@ void* Arm7Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform) const u32 mbk6 = 0; u32 mbk7 = 0; u32 mbk8 = 0; - if (gIsDsiMode && romHeader->IsTwlRom()) + if (gIsDsiMode && romHeader->SupportsDsiMode()) { mbk6 = REG_MBK6; mbk7 = REG_MBK7; @@ -133,7 +133,7 @@ void* Arm7Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform) const ic_invalidateAll(); // If in DSi mode and the rom is a DSi rom, restore twl wram. - if (gIsDsiMode && romHeader->IsTwlRom()) + if (gIsDsiMode && romHeader->SupportsDsiMode()) { REG_MBK6 = mbk6; REG_MBK7 = mbk7; diff --git a/arm9/source/Arm9Patcher.cpp b/arm9/source/Arm9Patcher.cpp index 3ff9dfc..36cb2b7 100644 --- a/arm9/source/Arm9Patcher.cpp +++ b/arm9/source/Arm9Patcher.cpp @@ -51,7 +51,7 @@ void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApLis auto romHeader = (const nds_header_ntr_t*)TWL_SHARED_MEMORY->ntrSharedMem.romHeader; auto twlRomHeader = (const nds_header_twl_t*)TWL_SHARED_MEMORY->twlRomHeader; u32 arm9Size = romHeader->arm9Size; - u32 arm9iSize = romHeader->IsTwlRom() ? twlRomHeader->arm9iSize : 0; + u32 arm9iSize = romHeader->SupportsDsiMode() ? twlRomHeader->arm9iSize : 0; u32 compressedEnd = 0; auto moduleParams = ModuleParamsLocator().FindModuleParams(romHeader); SdkVersion sdkVersion = moduleParams ? moduleParams->sdkVersion : 0u; @@ -76,7 +76,7 @@ void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApLis } } - if (gIsDsiMode && romHeader->IsTwlRom()) + if (gIsDsiMode && romHeader->SupportsDsiMode()) { auto arm9iModuleParams = (module_params_twl_t*)(romHeader->arm9LoadAddress + twlRomHeader->arm9iModuleParamsAddress); if (arm9iModuleParams->magicBigEndian == MODULE_PARAMS_TWL_MAGIC_BE && @@ -112,7 +112,7 @@ void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApLis { (void*)romHeader->arm9LoadAddress, arm9Size, - romHeader->IsTwlRom() ? (void*)twlRomHeader->arm9iLoadAddress : nullptr, + romHeader->SupportsDsiMode() ? (void*)twlRomHeader->arm9iLoadAddress : nullptr, arm9iSize, sdkVersion, romHeader->gameCode, @@ -156,13 +156,10 @@ void Arm9Patcher::ApplyPatches(const LoaderPlatform* loaderPlatform, const ApLis { if (!twlRomHeader->IsDsiWare()) { - // if ((romHeader->unitCode & 3) != 3) - { - patchCollection.AddPatch(new CardiIsRomDmaAvailablePatch()); - } + patchCollection.AddPatch(new CardiIsRomDmaAvailablePatch()); patchCollection.AddPatch(new CardiReadRomWithCpuPatch()); - if (gIsDsiMode && romHeader->IsTwlRom()) + if (gIsDsiMode && romHeader->SupportsDsiMode()) { patchCollection.AddPatch(new CardiReadCardWithHashInternalAsyncPatch()); } diff --git a/arm9/source/main.cpp b/arm9/source/main.cpp index 0695fbe..53a42c1 100644 --- a/arm9/source/main.cpp +++ b/arm9/source/main.cpp @@ -220,7 +220,7 @@ static void handleBootCommand() Arm9IoRegisterClearer().ClearNtrIoRegisters(isSdkResetSystem); REG_EXMEMCNT |= 0x0880; // map ds and gba slot to arm7 auto ntrRomHeader = (const nds_header_ntr_t*)TWL_SHARED_MEMORY->ntrSharedMem.romHeader; - if (gIsDsiMode && ntrRomHeader->IsTwlRom()) + if (gIsDsiMode && ntrRomHeader->SupportsDsiMode()) { Arm9IoRegisterClearer().ClearTwlIoRegisters(); REG_SCFG_EXT = 0x8307F100; diff --git a/common/ndsHeader.h b/common/ndsHeader.h index 6d31449..cf9a6f1 100644 --- a/common/ndsHeader.h +++ b/common/ndsHeader.h @@ -1,6 +1,9 @@ #pragma once #include +#define NDS_HEADER_UNIT_CODE_NOT_SUPPORTS_DS_MODE (1 << 0) +#define NDS_HEADER_UNIT_CODE_SUPPORTS_DSI_MODE (1 << 1) + struct nds_header_ntr_t { u8 gameTitle[12]; @@ -55,9 +58,9 @@ struct nds_header_ntr_t u32 debugRomLoadAddress; // and arm9 entry u32 debugRomArm7EntryAddress; - constexpr bool IsTwlRom() const + constexpr bool SupportsDsiMode() const { - return unitCode & 2; + return unitCode & NDS_HEADER_UNIT_CODE_SUPPORTS_DSI_MODE; } }; @@ -134,29 +137,32 @@ struct nds_header_twl_t : public nds_header_ntr_t u8 gapF00[0x80]; u8 headerRsaSha1Signature[0x80]; + /// @brief Returns if this is a DSiWare application. Note that this does not imply that the app runs in DSi mode. + /// @return \c true when this is a DSiWare application, or \c false otherwise. constexpr bool IsDsiWare() const { - return IsTwlRom() && ((titleId >> 32) & 4) != 0; + // Do not use SupportsDsiMode() here, because there exist DS mode DSiWare applications. + return (twlFlags & 1) != 0 && ((titleId >> 32) & 4) != 0; } constexpr bool HasSdAccess() const { - return IsTwlRom() && (accessControl & NDS_HEADER_TWL_ACCESS_CONTROL_SD_ACCESS) != 0; + return SupportsDsiMode() && (accessControl & NDS_HEADER_TWL_ACCESS_CONTROL_SD_ACCESS) != 0; } constexpr bool HasNandAccess() const { - return IsTwlRom() && (accessControl & NDS_HEADER_TWL_ACCESS_CONTROL_NAND_ACCESS) != 0; + return SupportsDsiMode() && (accessControl & NDS_HEADER_TWL_ACCESS_CONTROL_NAND_ACCESS) != 0; } constexpr bool HasShared2Access() const { - return IsTwlRom() && (accessControl & NDS_HEADER_TWL_ACCESS_CONTROL_SHARED2_ACCESS) != 0; + return SupportsDsiMode() && (accessControl & NDS_HEADER_TWL_ACCESS_CONTROL_SHARED2_ACCESS) != 0; } constexpr bool HasSslCertAccess() const { - return IsTwlRom() && (accessControl & NDS_HEADER_TWL_ACCESS_CONTROL_SSLCERT_ACCESS) != 0; + return SupportsDsiMode() && (accessControl & NDS_HEADER_TWL_ACCESS_CONTROL_SSLCERT_ACCESS) != 0; } };