ntr_bootrom/trunk/IrisMainp/IrisMon/IrisMon.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) ;
}