mirror of
https://github.com/rvtr/ntr_bootrom.git
synced 2025-10-31 07:11:11 -04:00
159 lines
4.6 KiB
C
159 lines
4.6 KiB
C
//*******************************************************************
|
|
// 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 <<SUBP_SEND_STATUS_SHIFT;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// サブプロセッサ・インタフェース受信待ち
|
|
//----------------------------------------------------------------------
|
|
|
|
void WaitSubpIntf(u32 param)
|
|
{
|
|
while (RecvSubpIntf() != param) ;
|
|
}
|
|
|
|
|