//******************************************************************* // IRISモニタプログラム //******************************************************************* #include "IrisMon.h" //---------------------------------------------------------------------- // メインルーチン //---------------------------------------------------------------------- extern void intr_main(void); extern void RegisterRamReset32(u32 resetFlags); extern void CpuSet32(const void *srcp, void *destp, u32 dmaCntData); extern void CpuFastSet32(const void *srcp, void *destp, u32 dmaCntData); void IrisMonMain() { NotifySubpIntf(0); // ブート・ハンドシェイク WaitSubpIntf(0); #ifdef NDEBUG NotifySubpIntf(1); WaitSubpIntf(1); #endif // NDEBUG InitReg(); // レジスタ初期化 InitRam(); // メモリ初期化 #ifdef DISP_BIOS_VERSION if ((*(vu8 *)REG_KEYINPUT ^ 0xff) & (START_BUTTON|SELECT_BUTTON)) { DispTegCheck(" 070", ""); // TEG専用バージョンチェック表示 while(1) ; } #endif *(vu16 *)REG_EXMEMCNT = CARD_ACCESS_SUBP // 10-6アクセス | CTRDG_ACCESS_SUBP | CTRDG_AD16_1ST_10CYC | CTRDG_AD16_2ND_6CYC | MMEM_PRIORITY_SUBP | MMEM_INTF_SYNC | MMEM_CE2_OUT; *(vu32 *)REG_CARDCNT = CARD_RESET_HI; // ユーザがカードバスを切り換えた時の安全性のため NotifySubpIntf(2); // 初期化完了の通知 #ifndef NDEBUG WaitSubpIntf(2); // ARM7 初期化完了待ち NotifySubpIntf(15); // デバッグ通信 #endif // NDEBUG // ARM7によるROMヘッダと実行イメージのダウンロード while (1) { u32 subpIntfData = RecvSubpIntf(); if (subpIntfData == 3) break; #ifdef TEST_AGB_MODE else if (subpIntfData == 7) Iris2Agb(); // AGBモード遷移 #endif // TEST_AGB_MODE #ifdef DISP_AGB_HEADER_ERROR else if (subpIntfData == 8) { DispTegCheck("CARTRIDGE ERROR", " PUSH A BUTTON"); // AGBヘッダエラー チェック表示 while (!((*(vu8 *)REG_KEYINPUT ^ 0xff) & A_BUTTON)) ; NotifySubpIntf(8); // AGBヘッダエラーの応答 reset_cp15(C1_DTCM_ENABLE | C1_EXCEPT_VEC_UPPER | C1_SB1_BITSET); Iris2Agb(); // AGBモード遷移 } #endif // DISP_AGB_HEADER_ERROR #ifdef DISP_READY_CARD_4_IPL2 else if (subpIntfData == 9) { DispTegCheck(" READY", ""); reset_cp15(C1_DTCM_ENABLE | C1_EXCEPT_VEC_UPPER | C1_SB1_BITSET); *(u8 *)REG_PAUSE = 2; // JTAGイネーブル WaitSubpIntf(3); break; } #endif // DISP_READY_CARD_4_IPL2 } *(vu32 *)REG_IME = 0; // IME クリア *(vu32 *)REG_IE = 0; // IE クリア *(vu32 *)REG_IF = -1; // IF クリア WaitSubpIntf(3); NotifySubpIntf(3); // 通常はここで終了 #ifdef TEST_CARD_BY_MAINP // カードバス切り換え検証 WaitSubpIntf(5); *(vu16 *)REG_EXMEMCNT = CTRDG_ACCESS_MAINP // MAINPカードアクセス | CTRDG_ACCESS_SUBP | CTRDG_AD16_1ST_10CYC | CTRDG_AD16_2ND_6CYC | MMEM_PRIORITY_SUBP | MMEM_INTF_SYNC | MMEM_CE2_OUT; ReadCard4Game((void *)MROM_GAME_AREA, (void *)0x027ff400,// GAMEモード読み込み MROM_PAGE_SIZE, 0xa1586000); *(vu16 *)REG_EXMEMCNT = CARD_ACCESS_SUBP // SUBPカードアクセス | CTRDG_ACCESS_SUBP | CTRDG_AD16_1ST_10CYC | CTRDG_AD16_2ND_6CYC | MMEM_PRIORITY_SUBP | MMEM_INTF_SYNC | MMEM_CE2_OUT; NotifySubpIntf(5); WaitSubpIntf(6); *(vu16 *)REG_EXMEMCNT = CTRDG_ACCESS_MAINP // MAINPカードアクセス | CTRDG_ACCESS_SUBP | CTRDG_AD16_1ST_10CYC | CTRDG_AD16_2ND_6CYC | MMEM_PRIORITY_SUBP | MMEM_INTF_SYNC | MMEM_CE2_OUT; ReadCard4Game((void *)(MROM_GAME_AREA+0x200), (void *)0x027ff600,// GAMEモード読み込み MROM_PAGE_SIZE, 0xa1586000); ReadCardID4Game(); // ID読み込み *(vu16 *)REG_EXMEMCNT = CARD_ACCESS_SUBP // SUBPカードアクセス | CTRDG_ACCESS_SUBP | CTRDG_AD16_1ST_10CYC | CTRDG_AD16_2ND_6CYC | MMEM_PRIORITY_SUBP | MMEM_INTF_SYNC | MMEM_CE2_OUT; NotifySubpIntf(6); #endif // TEST_CARD_BY_MAINP } //---------------------------------------------------------------------- // サブプロセッサ・インタフェース通知 //---------------------------------------------------------------------- void NotifySubpIntf(u32 param) { *(vu16 *)REG_SUBPINTF = param <