diff --git a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c index 91f910cb..d4425ae1 100644 --- a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c @@ -330,14 +330,11 @@ static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget* static void BOOTi_ClearREG_RAM( void ) { - if( SYSMi_GetWork()->flags.common.isCardBoot ) { #ifdef DEBUG_USED_CARD_SLOT_B_ - reg_MI_MC_SWP ^= 0x80; // カードスロットのスワップ + reg_MI_MC_SWP ^= 0x80; // カードスロットのスワップ #endif - *(u32 *)HW_BOOT_CHECK_INFO_BUF = SYSMi_GetWork()->nCardID; // カード抜けチェックバッファにカードIDをセット - }else { - *(u32 *)HW_BOOT_CHECK_INFO_BUF = 0; - } + // カード抜けチェックバッファにカードIDをセット + ((SDKBootCheckInfo*)HW_BOOT_CHECK_INFO_BUF)->nCardID = SYSMi_GetWork()->appCardID; *(vu32 *)HW_RESET_PARAMETER_BUF = 0; // リセットバッファをクリア diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index a323f660..eb385bf8 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -91,6 +91,7 @@ static HotSwState ReadSecureModeCardData(void); static void ClearCardFlgs(void); static void FinalizeHotSw(HotSwApliType type); +static void ForceNitroModeToFinalize(void); static BOOL ChangeGameMode(void); static void ClearCardIrq(void); static void ClearAllCardRegister(void); @@ -408,7 +409,7 @@ static HotSwState LoadCardData(void) RegisterRomEmuInfo(); // 排他制御ここまで UnlockHotSwRsc(&SYSMi_GetWork()->lockCardRsc); - goto end; + goto finalize; } } @@ -1588,7 +1589,6 @@ static void HotSwThread(void *arg) SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE; SYSMi_GetWork()->flags.hotsw.isCardStateChanged = TRUE; SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted = TRUE; - SYSMi_GetWork()->nCardID = s_cbData.id_gam; #ifdef USE_WRAM_LOAD SYSMi_GetWork()->flags.hotsw.isCardGameMode = TRUE; #endif @@ -1671,11 +1671,14 @@ static void ClearCardFlgs(void) ・カードが挿さっていて TWL NANDアプリ起動なら + NANDアプリヘッダ指定無し + → スロット電源OFF + NANDアプリヘッダのゲームカードONフラグ=1 → NANDアプリ起動後もカード電源(OFF後)ONにしてNormalモードにする - NANDアプリヘッダのゲームカードONフラグ=0 - → スロット電源OFF + NANDアプリヘッダのゲームカードNITROモードフラグ=1 + → NTR NANDアプリ同様 NTR NANDアプリ起動なら カード種別問わず、一度スロット電源OFFしてから、GAMEモードに遷移させておく。 @@ -1691,8 +1694,9 @@ static void ClearCardFlgs(void) *---------------------------------------------------------------------------*/ static void FinalizeHotSw(HotSwApliType type) { + ROM_Header* rh = (void*)SYSM_APP_ROM_HEADER_BUF; static BOOL finalized = FALSE; - BOOL isCardExist; + BOOL isAccessible; if(finalized){ return; @@ -1705,17 +1709,19 @@ static void FinalizeHotSw(HotSwApliType type) // ポーリングスレッドを消去 OS_KillThread( &HotSwThreadData.monitorThread, NULL ); + SYSMi_GetWork()->appCardID = 0; + if(type == HOTSW_APLITYPE_CARD){ - ClearCardIrq(); + SYSMi_GetWork()->appCardID = s_cbData.id_gam; goto final; } - isCardExist = HOTSW_IsCardExist(); + isAccessible = HOTSW_IsCardAccessible(); McPowerOff(); - // カードがなかったら、レジスタクリアしてリターン - if(!isCardExist){ + // カードが無い(アクセスできない)なら、レジスタクリアしてリターン + if(!isAccessible){ ClearAllCardRegister(); goto final; } @@ -1725,14 +1731,7 @@ static void FinalizeHotSw(HotSwApliType type) case HOTSW_APLITYPE_NTR_NAND: OS_PutString("Finalize Type : NTR NAND Application\n"); - if(!ChangeGameMode()){ - ClearAllCardRegister(); - McPowerOff(); - - OS_PutString("Failed To Change Game Mode... Card Slot Power Off\n"); - - goto final; - } + ForceNitroModeToFinalize(); break; // TWL NAND Application Boot @@ -1744,12 +1743,17 @@ static void FinalizeHotSw(HotSwApliType type) } // NANDアプリヘッダはコピー済み - if(((ROM_Header*)SYSM_APP_ROM_HEADER_BUF)->s.access_control.game_card_on){ + if(rh->s.access_control.game_card_nitro_mode){ + ForceNitroModeToFinalize(); + } + else if(rh->s.access_control.game_card_on){ McPowerOn(); s_cbData.modeType = HOTSW_MODE2; (void)LoadTable(); + (void)ReadIDNormal(&s_cbData); (void)ReadBootSegNormal(&s_cbData); + SYSMi_GetWork()->appCardID = s_cbData.id_nml; OS_PutString("- game card on flg is TRUE : now Normal Mode\n"); } @@ -1765,10 +1769,13 @@ static void FinalizeHotSw(HotSwApliType type) break; } +final: ClearCardIrq(); -final: - // デバッガではTWLカードスロット2を電源ON(既にONなら何もしない) + // デバッガではTWLカードスロット2を電源ON + //(既にONなら何もしない) + // NANDアプリ起動時はデフォルトではカードI/FをOFFにするが、 + // デバッガモニタではカードI/Fが必要なためスロット2を使用 if ( SYSM_IsRunOnDebugger() ) { HOTSWi_TurnCardPowerOn( 2 ); @@ -1779,6 +1786,26 @@ final: } +/*---------------------------------------------------------------------------* + Name: ForceNitroModeToFinalize + + Description: Nitro互換のGame Modeに強制移行させる + *---------------------------------------------------------------------------*/ +static void ForceNitroModeToFinalize(void) +{ + s_cbData.id_gam = 0; + + if(!ChangeGameMode()){ + ClearAllCardRegister(); + McPowerOff(); + + OS_PutString("Failed To Change Game Mode... Card Slot Power Off\n"); + } + + SYSMi_GetWork()->appCardID = s_cbData.id_gam; +} + + /*---------------------------------------------------------------------------* Name: ChangeGameMode diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index b9491227..889a6031 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -218,7 +218,6 @@ void TwlMain( void ) #endif // DSP初期化 -#if 0 { FSFile file[1]; MIWramSize sizeB = MI_WRAM_SIZE_128KB; @@ -238,8 +237,6 @@ void TwlMain( void ) } DSP_UnloadJpegDecoder(); } -#endif - #endif // INIT_DEVICES_LIKE_UIG_LAUNCHER // start時間計測1-c diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index 07a9e77a..10933309 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -136,7 +136,7 @@ typedef struct SYSM_work { OSLockWord lockCardRsc ATTRIBUTE_ALIGN(8); // カードリソース排他制御用 OSLockWord lockHotSW; // カードリソース排他制御用 - u32 nCardID; // カードID + u32 appCardID; // カードID u32 gameCommondParam; // NTRのゲームコマンドパラメータ(NTRのROMヘッダのゲームコマンドパラメータに上書きする) u8 cloneBootMode;