git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-09%20-%20platinum.7z%20+%20generic.7z%20+%20from_nintendo.rar/platinum/ntr_bootrom@2 75ba2c1e-421a-9847-b97b-53b085e6d9b8

This commit is contained in:
nakasima 2009-04-24 01:22:59 +00:00
parent 17563b362d
commit b4d63fc9c4
125 changed files with 36646 additions and 0 deletions

View File

@ -0,0 +1,221 @@
AGB/AGB2モニタプログラム変更履歴
NITRO-V0.01(V3.01データ調整バージョン / CRC16 0xcc3f
・MonCheckSum() の戻り値を変えるため、3f0ch番地 00000000h → 00000001h 変更
(戻り値: baae187fh → baae1880h)
V5.11(シャープ評価用)
・起動直後にカートリッジへジャンプ
V5.10TS5.1バージョン)
・V3.01へ戻す
V5.01
・FIQスリープ機能の追加
V5.00AGB2-TS1バージョン
・ガンマ補正機能の追加(<R + Bキー>デモ変更)
・PAUSEレジスタ CHKフラグセットタイミングをカートリッジ開始直前へ移動
・起動デモ専用コピールーチンの変更
・パレット先頭データ削除に伴う各ルーチンの調整
・ハイライトパレット・コピールーチンの縮小
・GBロゴパレット作成ルーチンの追加
V3.01(V2.12)
・TS3バージョン
V3.00(V2.11)
・TS3バージョン(サウンドバグあり)
V2.12
・SoundVSync()を割り込み呼び出しへ変更
V2.11
・サウンド・タイ修正
V2.10
・デバッガ飛び先の変更
1M-DACS→9fe2000h8M-DACS→9ffc000hDACS無し→9ffc000h
V2.05
・サウンドドライバのエコー・バグ修正
・キーアドレス指定フラグ(80000b4h:d7)反転
V2.04
・SIOブート時のロゴセットを3ルーチンに分割
・SIOブート時のロゴセットと発音処理を別フレームに分散
V2.03
・カセット挿入識別 一時停止
・8M-DACS用にデバッガ領域移動フラグ対応
・IN35端子ラッチ処理の追加
・サウンドドライバ更新
・システムコールにてAGBモニタ起動時でも内部ROMコピーを禁止
・LogoCopyCommon()で内部ROMイメージのコピーを禁止
・Intr_Wait()とSoundBiasChange16()中のベースアドレスを毎ループ設定
V2.02
・IntrWait()バグ修正
・カセット挿入識別
・強制SIOブート機能 追加 <START + SELECTキー>
・SIOブート・モード キー固定中止
・内部ROMチェックサム システムコール追加
・デモのZ座標小数部廃止
V2.01
・TS2.1バージョン
・挿入カセット識別フラグの再反転AGB=0CGB=1
V2.00
・TS2バージョン
V1.59
・PlttLinerSet()のLinerParam有効範囲08→032
V1.58
・サウンドドライバ000303a
・SIOスレーブ000304a
・Nintendoロゴセット 修正
V1.57
・SPSR_fiq→0x3007FE0/CPSR_fiq→0x3007FE4
V1.56
・互換SIOスレーブ機能 追加
V1.55
・→SP_svc=3007FE0hSP_fiq=3007FF0h
・IRQ/FIQ時のジャンプをldr命令にて行ない、bx命令を削除して高速化
32bitモード固定
・カセット/CPU外部RAMジャンプ用レジスタr7→lr
・ソフトリセット システムコール追加
・システムコール デフォルト FIQ許可
・セキュリティ解除チェック ON
・サウンドドライバ データ精度向上
・マルチプレイSIOスレーブ機能 追加
V1.54
・CGB互換モード振幅6bit設定
・レジスタRAMリセット システムコール追加
V1.53S
・フラッシュ上での2WAIT実行
V1.53
・PROM_000221対応
V1.52
・システムコール→直接呼び出し
・サウンドエリア内部RAM
V1.51
・セキュリティ解除チェック一旦中止
・サウンドエリア外部RAM
V1.50
・PROM_991216対応
・システムコールシフト中止
・不用システムコール削除
V1.46
・DACSルーチン・データ差し換え
・DACSパッチ当て
・ユーザが32bit命令で0番地に飛んで来た場合の対処
・RAM上でのNON WAIT実行
V1.45
・PROM_000131対応
・ROMアクセス 8-8Nintendoロゴ化け防止
・フラッシュ上での2WAIT実行
V1.43
・JOYルーチン26-5バージョン
・DACSキーNo算出データ領域の変更
・PauseRegReadシステムコールバグ修正
V1.42
・JOYルーチン26-3バージョン
・ハイライトの初期値を小さくしアクセントを付ける
V1.41
・JOYルーチン26-2バージョン
V1.40
・JOYルーチン26バージョン
V1.39
・カセット起動時は汎用入出力SIOモード
CPU外部RAM起動時はJOYバスSIOモード
V1.38
・起動時スタック領域クリア
V1.37
・JOYルーチン24バージョン
V1.36
・JOYルーチン23バージョン
V1.35
・無限ループ中サウンドDMA停止
V1.34
・モニタ用変数領域をCPU内部RAM3000000hへ移動
・JOYルーチン22バージョン
V1.33
・JOYルーチン21バージョン
V1.32
・JOYルーチン14バージョン
・サウンド波形データ圧縮
V1.31
・IF待ちシステムコール削除
・JOYルーチン12バージョン
・サウンドドライバ000105バージョン
V1.30
・挿入カセット識別フラグの反転CGB=0AGB=1
・ROM内登録データのコピー
//・例外時分岐をROM内登録データのFIQフラグ改変時のみに限定
// 通常時はそのままリターン
・IF待ち割り込み待ちSqrtArcTanシステムコール追加
・Divシステムコール引数入れ換え
V1.22
・全例外の分岐先を0x9fe2000に、その復帰命令を"subs pc, lr, #4"に固定
V1.21
・システムコールを使用したコピーへの対策
・IMEレジスタをセットしない
V1.20
・セキュリティ・キー読み込み追加とキー解除ルーチンの修正
・サウンドDMAの新仕様対応
・モニタ用変数領域はCPU外部RAM2000000hのまま
・スタック領域・システム領域をCPU内部RAM3000000hへ移動
・→SP_usr=3007F00hSP_irq=3007FA0hSP_svc=3007FE8hSP_fiq=3007FFCh
・OBJ回転中心位置の移動設定
・起動プログラム終了フラグのセット
・IMEレジスタのセット
・RAM上でのNON WAIT実行
V1.11
・RAM上でのNON WAIT実行
V1.10TS1.1バージョン)
・Halt一旦中止
・ROM上での実行
・BGOBJアフィン変換システムコール・バグ修正
V1.02
・ブレッドボードでの遅延DMAをCPUで代替
V1.01
・例外ベクタ・バグ修正
・RAM上でのNON WAIT実行
V1.00TS1バージョン
・デモサウンド暫定版の追加
・サウンドドライバ暫定版の追加
・例外スタック処理変更
・システムコールのアセンブラ化
・システムコール引数をRAM渡しからレジスタ渡しへ変更
・例外ベクタ・バグあり
V0.30
・タイトルデモ暫定版の追加
・サウンドBIASセットorリセットのシステムコールの追加
・"bx lr"での例外からの復帰に対応
V0.23
旧AGB-CPU仕様用レジュ-ム復帰システムコール郡の削除
圧縮関係システムコール郡の追加32bit命令
V0.22
・FIQSVCモード時のFIQ許可
V0.21
・FIQSVCモード時のFIQ不許可
・IRQモードのspの初期化
・起動時はユーザモードにして外部プログラムへジャンプ
・全例外発生時にはそのままのCPUモードにて外部プログラムへジャンプ
・例外用スタック 6 Word を (200BFC0 ) → (200BFD8 ) へ
 システムコール引数領域 2 Word を (200BFD8 ) → (200BFF0 ) へ移動
・AGBモニタ例外処理のデバッグ用に各モード時のcpsr,pcとユーザモードのspも退避
V0.20
・起動時全例外時にIRQモードにて外部プログラムへジャンプ
・IRQ専用スタックは廃止してユーザで管理
V0.11
・タイマー停止処理
V0.10
・IMEのセット
・モニタROM動作中のFIQ許可

View File

@ -0,0 +1,74 @@
;=======================================================================
; crt0_arm.s
; スタートアップルーチンARMASM用
;
; Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
;=======================================================================
AREA Init, CODE, READONLY
INCLUDE IrisDefineArm.s
INCLUDE IrisMemoryMapArm.s
INCLUDE IrisSystemCallArm.s
INCLUDE IrisMacroArm.s
INCLUDE IrisMonDefineArm.s
INCLUDE IrisMonMempryMapArm.s
;-----------------------------------------------------------------------
; システム制御コプロセッサ リセットr0=パラメータ)
;-----------------------------------------------------------------------
GLOBAL reset_cp15
ALIGN
CODE32
reset_cp15
; プロテクションユニット/キャッシュ/TCM セット
mcr p15, 0, r0, c1, c0, 0
; キャッシュ無効化
mov r0, #0
mcr p15, 0, r0, c7, c5, 0 ; 命令キャッシュ
mcr p15, 0, r0, c7, c6, 0 ; データキャッシュ
; ライトバッファ エンプティ待ち
mcr p15, 0, r0, c7, c10, 4
bx lr
;-----------------------------------------------------------------------
; システム制御コプロセッサ 初期化
;-----------------------------------------------------------------------
GLOBAL init_cp15
ALIGN
CODE32
init_cp15
mov r12, lr
; プロテクションユニット/キャッシュ/TCM ディセーブル
ldr r0, =C1_EXCEPT_VEC_UPPER | C1_SB1_BITSET
bl reset_cp15
; データTCM 設定
ldr r0, =MON_DTCM :OR: C9_TCMR_16KB
mcr p15, 0, r0, c9, c1, 0
; システム制御コプロセッサ マスター設定
mrc p15, 0, r0, c1, c0, 0
ldr r0, =C1_DTCM_ENABLE | C1_EXCEPT_VEC_UPPER | C1_SB1_BITSET
mcr p15, 0, r0, c1, c0, 0
bx r12
END

View File

@ -0,0 +1,146 @@
IRISモニタプログラム変更履歴
V0.76
・IPL2カートリッジブート・バージョン
V0.75
・カードバス切り換え実験バージョン
V0.74
・デバッガ4MB動作バージョン
V0.73
・カートリッジブート仕様
V0.72
・3Dメモリ擬似対応版
V0.71
・IPL2ブート実験版
V0.70TS040304提出バージョン / CRC16 0x6cf8
・IPL2ブート対応版
・初期化シーケンス最適化
・圧縮システムコール・エラー時のTerminate処理 追加
V0.62
・3Dメモリ擬似対応版
V0.61
・IPL2ブート実験版
・検証のため JTAGイネーブル
V0.60TS提出バージョン / CRC16 0x0690
・IPL2ブート対応版
・DTCM全クリア
V0.59
・IPL2ブート対応版
V0.58
・IPL2ブート実験版
・バージョン表示 削除
V0.57
・IPL2ブート対応版
V0.56
・IPL2ブート実験版
・SVC_Div()/SVC_DivRem()/SVC_Sqrt()/UnDiffByte2Byte()/UnDiffShort2Short 追加
・UC_*StreamFuncp() 引数変更
V0.52
・IPL2ブート対応版
V0.51
・IPL2ブート実験版
・NINTENDOロゴデータを含める
・システムコールの整理
・JTAGイネーブルのみ有効
V0.50
・3Dメモリ擬似対応
V0.45
・NEC製擬似SRAMバーストモード修正
V0.41
・IPL2ブート対応版
V0.40
・IPL2ブート実験版
V0.36
・IPL2実験用にプロテクションユニットをディセーブル
V0.32
・UsrSwi() 削除
V0.31
・サウンドチーム提出バージョン
V0.30
・システム領域 4KB → 16KB 拡張対応
・IPL2でブートさせる場合に無限ループに入っていたのを修正
・DISP_READY_CARD_4_IPL2 定義追加
V0.30
・NEC製擬似SRAMの新仕様へ対応
・カードバス・リセット処理をMAINP側へ移動
V0.29
・カード(カートリッジ)ヘッダチェック成功時にのみデバッガモニタ起動
・AGBモード時の表示期間待ち処理をMAINP側へ移動
・DISABLE_AGB_MODE → DISP_AGB_HEADER_ERROR 変更
V0.28
・デバッガスタックアドレス移動DTCM_END-0x40 → 0x027F_FD80
・IsMmem8MB() 追加
・MMEM_CHK_SIZE_[WRITE|READ]_BUF をSUBPと分離
・例外発生時の FIQ 不許可バグの修正
V0.27
・デバッガモニタブート情報エリアの移動0x170 → 0160
V0.26
・デバッガモニタブート情報エリアの移動0x70 → 0170
・AGBモード一時排除
V0.25
・例外発生時の FIQ 不許可対応
・AGBモード暫定対応
V0.24
・SUBPとの通信部分の変更
・カードのリセット準備コード追加
V0.23
・スレッド対応を元に戻す
・キャッシュ無効化バグ修正
・プロテクションユニットをディセーブルにしてアプリケーションを起動DTCMのみ有効
V0.22a
・システムコールにて呼び出し元のスタックを使用するように変更(スレッド対応)
V0.22
・デバッガインタフェース変更
V0.21a
・デバッガインタフェース復帰処理の修正
V0.21
・デバッガインタフェース実装
V0.20TEGボード配布バージョン
・SVC_UsrSwi() システムコール追加
V0.17
・システムコール群の整理
V0.16
・システムコールと割り込み処理呼び出しの高速化
・スタックポインタの移動
・*CpuSet*() の転送サイズ有効範囲の拡張
V0.15
・SVC_WaitByLoop() 追加
・SVC_WaitIntr() 高速化
・SVC_CpuSetFast() バグ修正
V0.14
・メインメモリのシステム領域初期化
・SVC_AccessCard() TEGボード暫定版の追加
・SVC_CpuSetFast() の32Byteサイズ制限の解除
・SVC_WaitIntr() へホールトの追加
V0.13
・システムコールNo参照時のバイトアクセス修正
V0.12
・リストRAM の 0xffffffffクリア
V0.11
・TEG でのADバス・ダウンロードへ対応
・TEG でサウンド出力を有効にするため LCDイネーブルフラグをセットする
V0.10
・TEG で動作するように対応
V0.06
・システム領域をDTCM領域へ移動TEG対応
・RegisterRamReset() 変更
V0.05AD16BUSバージョンV0.01
・IOP同期ダウンロード実行
V0.04
・Halt()、Stop() 修正
V0.03
・ArcTan2() → ArcTan3()
V0.02
・IntrWait()内の Halt 中止
V0.01
・フラッシュ実行
・AGBにあるサウンドと通信以外のシステムコールの実装
・BB の仕様に合わせて内部ワークRAMイメージを未使用
・プログラムコピー用に CpuFastSet() のソースチェック解除
・最後に無限ループで停止(ユーザプログラムのロード時に
デバッガが PC を変更してくれるため)

View File

@ -0,0 +1,158 @@
//*******************************************************************
// 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) ;
}

View File

@ -0,0 +1,18 @@
/********************************************************************/
/* IRISモニタプログラム ヘッダファイル郡 */
/********************************************************************/
#ifndef _IRIS_MON_H
#define _IRIS_MON_H
#include <Iris.h>
#include <IrisCardDefine.h>
#include <IrisMainMemeoryDefine.h>
#include "IrisMonDefine.h"
#include "IrisMonMemoryMap.h"
#include "IrisMonMacro.h"
#include "IrisMonSub.h"
#endif /* _IRIS_MON_H */

Binary file not shown.

View File

@ -0,0 +1,241 @@
[CLI]
dwParse=1
dwEcho=1
dwUpdate=1
dwHistorySize=16
dwInstructionSize=1
dwMemBytes=32
dwMemSize=0
dwStepSize=0
Format=hex
FormatPar=-1
dwLogFile=0
dwRecordFile=0
[Control]
dwActiveTab=0
[DebugEnvironment]
biDebugEnvironment=EECEFEDDABAAAAAABAAAAAAADEKDMFAFCHPGHGCHBGNGACGEJGMGFGDHMFBECFNEMFNEFHMGEHJGNCJEDEFEMFNEFHMGEHJGNCJEDEFEOCEGMGMGAANEFHMGEHJGNCJEDEFEAADCGJBAAAAACEJFEFFEDFFEIFNDMEJGEHEHMGFGNAKANEFFMEEFJENCJEDEFEPFDEPEOEOEFEDEEFJEPEOEPFOEBENEFENDNAKANEFFMEEFJENCJEDEFEPFDFFECFGFFECFPFMEPEDEBEEFJEPEOENDMGPGDGBGMGIGPGDHEHNAKANEFFMEEFJENCJEDEFEPFEEMEMEPFDFFEEFEFJEOEHEDFNDADNAKAEFBECFHEFEEFPFEEJECFNDDEKDMFAFCHPGHGCHBGNGACGEJGMGFGDHMFBECFNEMFNEFHMGEHJGNCJEDEFENAKANEFFMEEFJENCJEDEFEPFIEBEOEEEMEFECFCEBEDFFEBEEEEECFNDGEGEADADADADADADNAKANEFFMEEFJENCJEDEFEPFDEMEFEBEOEDEPEEEFEBEEEEECFNDADADADADADADFDADNAKAEFCFBEDEFEEEMEMEPFEFCFBEDEFEDEPEOEEFCFPEMEMEJEDFEFJEEFFENEADNDNAKAEFCFBEDEFEEEMEMEPFEFCFBEDEFEDEPEOEEFCFPEMEOEBENEFENDNAKADEPEOEEFCFPEMEMEFECFPFCFEEJEGFFECFDFJEPEOENDBDFDBDNAKANEFFMEEFJENCJEDEFEPFIFDFIEPEEFAFMEFFHEHEJEOEHEFEOEBECEMEFEEENDEFCFFFFENAKANEFFMEEFJENCJEDEFEPFEECFJEGFFECFADPFOEBENEFENDBECFNEJDEDGDFENCDFNAKANEFFMEEFJENCJEDEFEPFEFBEAFADPFAFPEDFJEEFJEPEOENDADNAKADCDC
[Docking]
biBarID_0=AMAAAAAABJAAAAAAAMAAAAAAIEAAAAAAAMAAAAAAHOBAAAAAOPPPPPPPMBAAAAAAAAAAAAAAAAPBAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_4=AMAAAAAABJAAAAAAILDAAAAABJAAAAAAMGAAAAAAAIAAAAAAOPPPPPPPJACAAAAAAAAAAAAAAAPIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_65539=LCCAAAAAKJBAAAAAILDAAAAABJAAAAAAMGAAAAAAAIAAAAAAFGAAAAAAFECAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_1114115=AMAAAAAABJAAAAAAILDAAAAABJAAAAAAMGAAAAAAAIAAAAAAOPPPPPPPJACAAAAAAAAAAAAAAAPIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_65538=LMAAAAAAIGBAAAAAAMAAAAAAIEAAAAAAAMAAAAAAICAAAAAAKODAAAAABMAAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_1=AMAAAAAABJAAAAAAILDAAAAABJAAAAAAMGAAAAAAAIAAAAAAOPPPPPPPCHBAAAAAAAAAAAAAAAPIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_65540=JCBAAAAAEKBAAAAAAMAAAAAAIEAAAAAAAMAAAAAAMGAAAAAACEDAAAAAMACAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_7=MFBAAAAAIKAAAAAAILDAAAAABJAAAAAAMGAAAAAAAIAAAAAADFDAAAAAEGCAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
[Docking\OpenStates]
biBarID_0=BAAAAAAA
biBarID_4=BAAAAAAA
biBarID_7=BAAAAAAA
biBarID_65538=BAAAAAAA
biBarID_65539=BAAAAAAA
biBarID_65540=BAAAAAAA
[Images\Image_0]
Filename=D:\Iris\IrisMon\IrisMon_Data\ThumbRelease\IrisMon.axf
Processor=ARM946E_S_0
dwProfileState=0
[Interface\AutoRefresh]
dwEnabled=0
dwInterval=100
dwTerminateOnSuspend=0
[Interface\Formatting]
dwDecIsUser=0
DecFormat=%d
dwHexIsUser=0
HexFormat=%0X
dwFloatIsUser=0
FloatFormat=%.7g
dwDbleIsUser=0
DbleFormat=%.10g
dwQ15IsUser=0
Q15Format=%.6g
dwQ31IsUser=0
Q31Format=%.12g
dwArrayThreshold=16
[Interface\General]
dwTarget Connection=1
dwReport All Warnings=0
dwReport Exceptions=1
[Interface\SessionFiles]
dwReselect Target=1
dwReload Images=0
dwRun Config Script=0
Config Script Name=D:\Iris\geometry\geometry.ses
[Interface\Toolbars]
dwTBFile=1
dwTBSearch=1
dwTBExecute=1
dwTBSystemView=1
dwTBProcView=1
dwTBHelp=1
[Interface\Views]
biDefault Fixed Font=EPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAJBAAAAAAAAAAAAADACABABBCIMGCICHACGJOLCJJKAAHHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biDefault General Font=EPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAJBAAAAAAAAAAAAADACABABBCIMGCICHACGJOLCJJKAACHJGGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
dwTab Size=4
dwInterleave=0
dwShow Line Numbers=1
dwShow Margin=1
dwShow Tooltips=1
dwInitViewState=0
[MainWnd]
biWndPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPBGAAAAAAIIAAAAAABCEAAAAABGDAAAAA
[Memory]
dwActiveTab=1
dwApplyToAllTabs=0
[Memory\Tab_0]
dwStartAddress=33570560
Format=hex_noprefix_32
dwFormatID=-1
dwListBigEndian=0
dwDisplayOffset=0
dwPageSize=1024
dwListSize=4
dwTargetAccessSize=0
dwAutoRefresh=1
[Memory\Tab_1]
dwStartAddress=41940992
Format=hex_noprefix_32
dwFormatID=-1
dwListBigEndian=0
dwDisplayOffset=0
dwPageSize=1024
dwListSize=4
dwTargetAccessSize=0
dwAutoRefresh=1
[Memory\Tab_2]
dwStartAddress=41942016
Format=hex_noprefix_32
dwFormatID=-1
dwListBigEndian=0
dwDisplayOffset=0
dwPageSize=1024
dwListSize=4
dwTargetAccessSize=0
dwAutoRefresh=1
[Memory\Tab_3]
dwStartAddress=67108864
Format=hex_noprefix_32
dwFormatID=-1
dwListBigEndian=0
dwDisplayOffset=0
dwPageSize=1024
dwListSize=4
dwTargetAccessSize=0
dwAutoRefresh=1
[Output]
dwActiveTab=0
[ProcessorRegisters\ARM946E_S_0]
dwFormatID=-1
dwRefresh=0
[ProcessorRegisters\ARM9_0]
dwFormatID=-1
dwRefresh=1
[RecentFileList]
dwFileCount=4
[RecentImageList]
File_1=D:\Iris\IrisMon\IrisMon_Data\ThumbRelease\IrisMon.axf
File_2=D:\Iris\ipl2_test\ipl2_test_Data\ThumbDebugRel\ipl2_test.axf
File_3=D:\Iris\two_quads\two_quads_Data\ThumbDebugRel\two_quads.axf
File_4=D:\Iris\geometry\geometry_Data\ThumbRelease\geometry.axf
dwFileCount=4
[RecentSymbolsList]
File_1=D:\IrisSubp\IrisSubpMon\IrisSubpMon_Data\ThumbRelease\IrisSubpMon.axf
dwFileCount=4
[Target\ARM946E_S_0]
dwMode=0
dwCommsChannel=0
dwArmSWI=1193046
dwThumbSWI=171
dwSHVector=8
dwDCCSHVector=458752
dwECVector=27
dwTopOfMemory=524288
dwTopOfMemoryExists=1
[ToolBars\ToolBarID-Bar0]
dwBarID=59419
dwBars=12
dwBar#0=0
dwBar#1=171
dwBar#2=173
dwBar#3=175
dwBar#4=179
dwBar#5=177
dwBar#6=128
dwBar#7=65543
dwBar#8=65538
dwBar#9=65539
dwBar#10=65540
dwBar#11=0
[ToolBars\ToolBarID-Bar1]
dwBarID=59422
dwBars=3
dwBar#0=0
dwBar#1=4
dwBar#2=0
[ToolBars\ToolBarID-Bar2]
dwBarID=59423
dwHorz=1
dwFloating=1
dwXPos=855
dwYPos=631
dwBars=3
dwBar#0=0
dwBar#1=7
dwBar#2=0
[ToolBars\ToolBarID-Bar3]
dwBarID=59423
dwHorz=1
dwFloating=1
dwXPos=1006
dwYPos=212
dwBars=3
dwBar#0=0
dwBar#1=2
dwBar#2=0
[ToolBars\ToolBarID-Bar4]
dwBarID=59423
dwHorz=1
dwFloating=1
dwXPos=105
dwYPos=600
dwBars=3
dwBar#0=0
dwBar#1=3
dwBar#2=0
[ToolBars\ToolBarID-Bar5]
dwBarID=59423
dwHorz=1
dwFloating=1
dwXPos=838
dwYPos=543
dwBars=3
dwBar#0=0
dwBar#1=4
dwBar#2=0
[ToolBars\ToolBarID-Summary]
dwBars=6
dwScreenCX=1280
dwScreenCY=1024
[Variables]
dwActiveTab=1
[Variables\Tab_0]
dwFormatID=-1
dwRefresh=1
[Variables\Tab_1]
dwFormatID=-1
dwRefresh=1
[Variables\Tab_2]
dwFormatID=-1
dwRefresh=1
[Views]
dwLastView=0
[Views\View_0]
UnitName=ARM946E_S_0
ImageName=D:\Iris\IrisMon\IrisMon_Data\ThumbRelease\IrisMon.axf
dwDisassembly=0
FileName=D:\Iris\IrisMon\crt0Arm.s
dwMixedView=0
dwShowMargin=1
dwShowLineNumbers=1
biWndPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPAAAAAAAAAAAAAAAAGFCAAAAAJEBAAAAA

View File

@ -0,0 +1,298 @@
//*******************************************************************
// IRIS-MAINPモニタプログラム カード関数
//*******************************************************************
#include "IrisMon.h"
#ifdef TEST_CARD_BY_MAINP
//--------------------- グローバル 変数 -------------------------------
CardIntrWork cardIntrWork;
//----------------------------------------------------------------------
// コマンド設定
//----------------------------------------------------------------------
void SetCardOp(const CardCtrlParam *paramp)
{
int i;
WaitCardDma(paramp->dmaNo); // カード転送終了待ち
*(vu8 *)REG_CARD_MASTER_CNT = CARDMST_SEL_ROM // マスターイネーブル
| CARDMST_ENABLE | CARDMST_IF_ENABLE;
for (i=0; i<2; i++) { // コマンド設定
u32 opTmp = paramp->op[1 - i];
vu8 *opDestBasep = (vu8 *)(REG_CARD_CMD + i*4);
opDestBasep[0] = opTmp >>24;
opDestBasep[1] = opTmp >>16;
opDestBasep[2] = opTmp >>8;
opDestBasep[3] = opTmp >>0;
}
}
//----------------------------------------------------------------------
// カード待ち DMA停止
//----------------------------------------------------------------------
void WaitCardDma(u32 dmaNo)
{
WaitCard();
if (dmaNo <= 3) StopDma(dmaNo);
}
//----------------------------------------------------------------------
// カードページ読み込みGAMEモード同期
//----------------------------------------------------------------------
void ReadCard4Game(void *romp, void *ramp, s32 size, u32 cntParam)
{
CardCtrlParam param;
s32 restSize = size;
s32 blockSize = MROM_PAGE_SIZE;
param.cardCnt = cntParam // コントロール設定
| CARD_READ_MODE | CARD_1_PAGE
| CARD_START | CARD_RESET_HI;
param.dmaNo = 3; // DMA番号指定
while (restSize > 0) { // ブロック分割読み込み
ReadCardAsync4Game(romp, ramp, blockSize, &param);
(u8 *)romp += blockSize;
(u8 *)ramp += blockSize;
restSize -= blockSize;
}
WaitCardDma(param.dmaNo);
}
//----------------------------------------------------------------------
// カード読み込みDMA非同期
//----------------------------------------------------------------------
void ReadCardAsync(void *romp, void *ramp, s32 size, CardCtrlParam *paramp)
{
SetCardOp(paramp); // コマンド設定
if (paramp->dmaNo <= 3) {
DmaReadCard(paramp->dmaNo, ramp); // DMA設定最大設定 DMA0-2: 64KB / DMA3: 256KB
*(vu32 *)REG_CARDCNT = paramp->cardCnt; // コントロール設定 & DMAスタート
} else {
void *ramEndp;
u32 cardCntTmp;
*(vu32 *)REG_CARDCNT = paramp->cardCnt; // コントロール設定
ramEndp = (u8 *)ramp + size; // 格納終了アドレス算出
do { // CPU読み込み
cardCntTmp = *(vu32 *)REG_CARDCNT;
if (cardCntTmp & CARD_DATA_READY) {
u32 dataTmp = *(vu32 *)REG_CARD_DATA;
if (ramp < ramEndp)
*((vu32 *)ramp) = dataTmp; // 指定サイズまで格納(後続データは読み捨て)
((vu32 *)ramp)++;
}
} while (cardCntTmp & CARD_START);
}
}
//----------------------------------------------------------------------
// カード転送ブロックサイズ 獲得
//----------------------------------------------------------------------
s32 GetBlockSizeFromCardCnt(CardCnt *paramp)
{
s32 blockSize = 0;
s32 pages = paramp->pages;
if (pages == ST_CARD_STATUS) blockSize = 4;
else if (pages >= ST_CARD_1_PAGE) blockSize = 512 <<(pages - 1);
return blockSize;
}
//----------------------------------------------------------------------
// カードID読み込み同期
//----------------------------------------------------------------------
u32 ReadCardID(CardCtrlParam *paramp)
{
paramp->dmaNo = -1; // DMA不使用指定
SetCardOp(paramp); // コマンド設定
*(vu32 *)REG_CARDCNT = paramp->cardCnt // コントロール設定
| CARD_READ_MODE | CARD_STATUS
| CARD_START | CARD_RESET_HI;
WaitCardData();
return *(vu32 *)REG_CARD_DATA;
}
//----------------------------------------------------------------------
// カードID読み込みNORMALモード
//----------------------------------------------------------------------
u32 ReadCardID4Normal(void)
{
CardCtrlParam param;
param.cardCnt = GetCardCnt4Normal(); // コントロール設定(スクランブル設定クリア)
param.op[0] = 0; // コマンド設定
param.op[1] = MROMOP_N_READ_ID;
return ReadCardID(&param);
}
//----------------------------------------------------------------------
// カードID読み込みNORMALモード
//----------------------------------------------------------------------
u32 ReadCardID4Game(void)
{
CardCtrlParam param;
param.cardCnt = GetCardCnt4Game(); // コントロール設定(スクランブル設定クリア)
param.op[0] = 0; // コマンド設定
param.op[1] = MROMOP_G_READ_ID;
return ReadCardID(&param);
}
//----------------------------------------------------------------------
// カードデータ読み込みGAMEモード非同期
//----------------------------------------------------------------------
void ReadCardAsync4Game(void *romp, void *ramp, s32 size, CardCtrlParam *paramp)
{
paramp->op[0] = (u32 )romp <<24; // コマンド設定
paramp->op[1] = MROMOP_G_READ_PAGE | (u32 )romp >>8;
ReadCardAsync(romp, ramp, size, paramp);
}
//----------------------------------------------------------------------
// カード割り込み 設定
//----------------------------------------------------------------------
void SetCardIntr(void *romp, void *ramp, s32 size, CardIntrWork *ciwp)
{
ciwp->romp = romp;
ciwp->ramp = ramp;
ciwp->restSize = size;
ciwp->blockSize = GetBlockSizeFromCardCnt((CardCnt *)&ciwp->param.cardCnt);
ciwp->param.dmaNo = 3;
WaitCardDma(ciwp->param.dmaNo);
*(vu32 *)REG_IME = 0;
// *(vu32 *)INTR_CHECK_BUF &= (-1 ^ CARD_DATA_INTR_FLAG); // カード割込チェックのクリア
*(vu32 *)REG_IF = CARD_DATA_INTR_FLAG;
*(vu32 *)REG_IE |= CARD_DATA_INTR_FLAG; // カード割り込み許可
*(vu32 *)REG_IME = 1;
ciwp->AsyncFuncp(ciwp->romp, ciwp->ramp, ciwp->blockSize, &ciwp->param);
}
//----------------------------------------------------------------------
// カード割り込み 終了待ち
//----------------------------------------------------------------------
void WaitCardIntr(void)
{
WaitIntr(0, CARD_DATA_INTR_FLAG);
{ CardIntrWork *ciwp = &cardIntrWork;
WaitCardDma(ciwp->param.dmaNo);
}
*(vu32 *)REG_IME = 0;
*(vu32 *)REG_IE &= (-1 ^ CARD_DATA_INTR_FLAG); // カード割り込み禁止
*(vu32 *)REG_IME = 1;
}
//----------------------------------------------------------------------
// カード割り込み 設定GAMEモード
//----------------------------------------------------------------------
void SetCardIntr4Game(void *romp, void *ramp, s32 size)
{
CardIntrWork *ciwp = &cardIntrWork;
ciwp->param.cardCnt = GetCardCnt4Game() // コントロール設定
| CARD_READ_MODE | CARD_1_PAGE
| CARD_START | CARD_RESET_HI;
ciwp->AsyncFuncp = ReadCardAsync4Game; // データ読み込み関数 セット
SetCardIntr(romp, ramp, size, ciwp);
}
//----------------------------------------------------------------------
// カード割り込み
//----------------------------------------------------------------------
void CardIntr(void)
{
CardIntrWork *ciwp = &cardIntrWork;
s32 blockSize = ciwp->blockSize;
// ブロック分割読み込み
(u8 *)ciwp->romp += blockSize;
(u8 *)ciwp->ramp += blockSize;
ciwp->restSize -= blockSize;
if (ciwp->restSize > 0) {
cardIntrWork.AsyncFuncp(ciwp->romp, ciwp->ramp, blockSize, &ciwp->param);
} else {
*(vu32 *)INTR_CHECK_BUF |= CARD_DATA_INTR_FLAG; // カード割込チェックのセット
}
}
#endif // TEST_CARD_BY_MAINP
//----------------------------------------------------------------------
// カードアクセス
//----------------------------------------------------------------------
#ifndef TS_MON
void AccessCard(u32 dmaNo, s32 *srcp, s32 *destp, s32 size)
{
int i;
// *(vu8 *)REG_EXMEMCNT = CTRDG_ACCESS_MAINP | CTRDG_AD16_1ST_10CYC | CTRDG_AD16_2ND_6CYC; // 10-6アクセス
CpuCopy16_32(srcp, destp, size, 32); // カートリッジからの転送
}
#endif // TS_MON

View File

@ -0,0 +1,40 @@
//======================================================================
// IRISモニタプログラム用定義
//======================================================================
#ifndef _IRIS_MON_DEFINE_H
#define _IRIS_MON_DEFINE_H
#include "IrisMonTarget.h"
//----------------------------------------------------------------------
// DMA割り当て
//----------------------------------------------------------------------
#define V_DMA_NO 2
#define M_DMA_NO 3
//----------------------------------------------------------------------
// レジスタ&RAM リセット システムコール
//----------------------------------------------------------------------
#define RESET_ALL_FLAGS 0xff // 全リセット
#define RESET_ALL_REG_FLAGS 0xe0 // 全レジスタ リセット
#define RESET_REG_FLAG 0x80 // レジスタ(下記以外)リセット
#define RESET_REG_SOUND_FLAG 0x40 // サウンドレジスタ リセット
#define RESET_REG_SIO_FLAG 0x20 // SIOレジスタ リセット
#define RESET_ALL_RAM_FLAGS 0x1f // 全RAM クリア
#define RESET_MMEM_FLAG 0x01 // メインメモリ クリア
#define RESET_CPU_WRAM_FLAG 0x02 // CPU内部RAM クリア
#define RESET_PLTT_FLAG 0x04 // パレット クリア
#define RESET_VRAM_FLAG 0x08 // クリア
#define RESET_OAM_FLAG 0x10 // クリア
#endif // _IRIS_MON_DEFINE_H

View File

@ -0,0 +1,36 @@
;********************************************************************/
;* IRISモニタプログラム用定義 */
;********************************************************************/
IF :DEF: _IRIS_MON_DEFINE_H
ELSE
_IRIS_MON_DEFINE_H * 1
INCLUDE IrisMonTargetArm.s
;-----------------------------------------------------------------------
; レジスタ&RAM リセット システムコール
;-----------------------------------------------------------------------
RESET_ALL_FLAGS * 0xff ; 全リセット
RESET_ALL_REG_FLAGS * 0xe0 ; 全レジスタ リセット
RESET_REG_FLAG * 0x80 ; レジスタ(下記以外)リセット
RESET_REG_SOUND_FLAG * 0x40 ; サウンドレジスタ リセット
RESET_REG_SIO_FLAG * 0x20 ; SIOレジスタ リセット
RESET_ALL_RAM_FLAGS * 0x1f ; 全RAM クリア
RESET_MMEM_FLAG * 0x01 ; メインメモリ クリア
RESET_CPU_WRAM_FLAG * 0x02 ; CPU内部RAM クリア
RESET_PLTT_FLAG * 0x04 ; パレット クリア
RESET_VRAM_FLAG * 0x08 ; クリア
RESET_OAM_FLAG * 0x10 ; クリア
ENDIF ; _IRIS_MON_DEFINE_H
END

View File

@ -0,0 +1,80 @@
//*******************************************************************
// IRISモニタプログラム マクロ関数
//*******************************************************************
#ifndef _IRIS_MON_MACRO_H
#define _IRIS_MON_MACRO_H
#include <IrisTypes.h>
#include "IrisMonTarget.h"
//----------------------------------------------------------------------
// サブプロセッサ・インタフェース受信
//----------------------------------------------------------------------
#define RecvSubpIntf() \
\
((*(vSubpIntf *)REG_SUBPINTF).recvStatus)
//----------------------------------------------------------------------
// クリア
//----------------------------------------------------------------------
#define CpuClear16_32(data, destp, size, bit) \
{ \
u##bit tmp = (vu##bit )(data); \
CpuSet16_32((u8 *)&(tmp), (u8 *)(destp), ( \
DMA_SRC_FIX | \
DMA_##bit##BIT_BUS | (size)/((bit)/8))); \
}
#define CpuArrayClear16_32( data, destp, bit) \
CpuClear16_32( data, destp, sizeof(destp), bit)
//----------------------------------------------------------------------
// コピー
//----------------------------------------------------------------------
#define CpuCopy16_32(srcp, destp, size, bit) \
\
CpuSet16_32((u8 *)(srcp), (u8 *)(destp), ( \
DMA_SRC_INC | \
DMA_##bit##BIT_BUS | (size)/((bit)/8)))
#define CpuArrayCopy16_32( srcp, destp, bit) \
CpuCopy16_32( srcp, destp, sizeof(srcp), bit)
//----------------------------------------------------------------------
// 高速クリア(32Byte単位)
//----------------------------------------------------------------------
#define CpuClearFast32(data, destp, size) \
{ \
u32 tmp = (vu32 )(data); \
CpuSetFast32((u8 *)&(tmp), (u8 *)(destp), ( \
DMA_SRC_FIX | (size)/(32/8))); \
}
#define CpuClearArrayFast32( data, destp) \
CpuClearFast32( data, destp, sizeof(destp))
//----------------------------------------------------------------------
// 高速コピー(32Byte単位)
//----------------------------------------------------------------------
#define CpuCopyFast32(srcp, destp, size) \
\
CpuSetFast32((u8 *)(srcp), (u8 *)(destp), ( \
DMA_SRC_INC | (size)/(32/8)))
#define CpuCopyArrayFast32( srcp, destp) \
CpuCopyFast32( srcp, destp, sizeof(srcp))
#endif // _IRIS_MON_MACRO_H

View File

@ -0,0 +1,82 @@
//======================================================================
// IRISモニタプログラム用定義
//======================================================================
#ifndef _IRIS_MON_MEMORY_MAP_H
#define _IRIS_MON_MEMORY_MAP_H
#include "IrisMonTarget.h"
//----------------------------------------------------------------------
// メモリ・マップ
//----------------------------------------------------------------------
#define MON_DTCM 0x00800000 // モニタ用データTCM
#define MON_DTCM_END (MON_DTCM + 0x4000)
#undef DTCM
#define DTCM MON_DTCM // データTCM
#define MMEM_CHK_SIZE_READ_BUF (MAIN_MEM_END - 0x8) // メインメモリ・サイズチェック書き込みバッファ
#define MMEM_CHK_SIZE_WRITE_BUF (MAIN_MEM_EX_END - 0x8) // 読み込みバッファ
#define MON_PNA_DEFAULT 0x02000ec7 // PNAデフォルト値
#define MON_PNB_DEFAULT 0x02000f75 // PNB
#define MON_CPU_WRAM 0x03000000 // CPU内部ワークRAM
#define MON_CPU_WRAM_END (MON_CPU_WRAM + 0x01000000)
#define MON_WRAM EX_WRAM // ワークRAM全体
#define MON_WRAM_END MON_CPU_WRAM_END
#define MON_USR_BUF EX_WRAM // ユーザ領域
#define MON_USR_BUF_END (MON_CPU_WRAM_END - 4*32)
#define MON_SYS_BUF (MON_CPU_WRAM_END - 4*32) //システム領域
#define MON_SYS_BUF_END MON_CPU_WRAM_END
#define MON_FIQ_VECTOR_BUF (MON_CPU_WRAM_END - 4*6 ) // FIQ割り込み分岐アドレス
#define MON_INTR_VECTOR_BUF (MON_CPU_WRAM_END - 4*1 ) // 割り込み分岐アドレス
#define ROM_HEADER 0x08000004 // ROM内登録データ
#define MON_NINLOGO (ROM_HEADER + 0x0 ) // NINTENDOロゴ・データ
#define MON_FIQ_FLAG (ROM_HEADER + 0x9c - 4) // FIQフラグ
#define MON_KEY_GROUP_NO (ROM_HEADER + 0x9e - 4) // キーグループNo
#define MON_SOFT_NAME (ROM_HEADER + 0xa0 - 4) // ソフト名
#define MON_COMPLEMENT (ROM_HEADER + 0xbd - 4) // 補数チェック・データ
#define ICE_ROM0 0x09fe2000 //
#define ICE_ROM0_END 0x09fe4000
#define ICE_ROM1 0x09ffc000
#define ICE_ROM1_END 0x09ffe000
#define DACS_KEY_REG0 0x0bfe2000 - 32 // DACSキーレジスタ
#define DACS_KEY_REG1 0x0c000000 - 32
#define REG_PAUSE (REG_BASE + 0x300) //
#define REG_OBJ_CENTER (REG_BASE + 0x410) // OBJ中心位置
//----------------------------------------------------------------------
// メモリ・サイズ
//----------------------------------------------------------------------
#define ROM_HEADER_SIZE (0xc0 - 4 + OFFSET_MON_NINLOGO) // ROM内登録データ
#define MON_NINLOGO_SIZE (MON_SOFT_NAME - MON_NINLOGO) // NINTENDOロゴ・データ
#define ICE_ROM_SIZE 0x2000 //
//----------------------------------------------------------------------
// 登録データ・オフセット
//----------------------------------------------------------------------
#define OFFSET_MON_NINLOGO (MON_NINLOGO - MON_NINLOGO) // NINTENDOロゴ・データ
#define OFFSET_MON_FIQ_FLAG (MON_FIQ_FLAG - MON_NINLOGO) // FIQフラグ
#define OFFSET_MON_KEY_GROUP_NO (MON_KEY_GROUP_NO - MON_NINLOGO) // キーグループNo
#define OFFSET_MON_SOFT_NAME (MON_SOFT_NAME - MON_NINLOGO) // ソフト名
#define OFFSET_MON_COMPLEMENT (MON_COMPLEMENT - MON_NINLOGO) // 補数チェック・データ
#define OFFSET_REG_PAUSE 0x300 //
#define OFFSET_REG_OBJ_CENTER 0x410 // OBJ中心位置
#endif // _IRIS_MON_MEMORY_MAP_H

View File

@ -0,0 +1,76 @@
;********************************************************************/
;* IRISモニタプログラム用定義 */
;********************************************************************/
IF :DEF: _IRIS_MON_MEMORY_MAP_H
ELSE
_IRIS_MON_MEMORY_MAP_H * 1
INCLUDE IrisMonTargetArm.s
INCLUDE IrisMainMemoryDefineArm.s
;*------------------------------------------------------------------*/
;* メモリ・マップ */
;*------------------------------------------------------------------*/
MON_DTCM * 0x00800000 ; モニタ用データTCM
MON_DTCM_END * (MON_DTCM + 0x4000)
IMG_CPU_WRAM * 0x03000000 ; CPU内部ワークRAM
IMG_CPU_WRAM_END * (IMG_CPU_WRAM + 0x00800000)
IMG_WRAM * MAIN_MEM ; ワークRAM全体
IMG_WRAM_END * IMG_CPU_WRAM_END
;IMG_USR_BUF * MAIN_MEM ; ユーザ領域
;IMG_USR_BUF_END * (IMG_CPU_WRAM_END - 4*32)
;IMG_SYS_BUF * (IMG_CPU_WRAM_END - 4*32) ;システム領域
;IMG_SYS_BUF_END * IMG_CPU_WRAM_END
;IMG_FIQ_VECTOR_BUF * (IMG_CPU_WRAM_END - 4*5 ) ; FIQ割り込み分岐アドレス
;IMG_INTR_VECTOR_BUF * (IMG_CPU_WRAM_END - 4*1 ) ; 割り込み分岐アドレス
ROM_HEADER * 0x08000004 ; ROM内登録データ
MON_NINLOGO * (ROM_HEADER + 0x0 ) ; NINTENDOロゴ・データ
MON_FIQ_FLAG * (ROM_HEADER + 0x9c - 4) ; FIQフラグ
MON_KEY_GROUP_NO * (ROM_HEADER + 0x9e - 4) ; キーグループNo
MON_SOFT_NAME * (ROM_HEADER + 0xa0 - 4) ; ソフト名
MON_COMPLEMENT * (ROM_HEADER + 0xbd - 4) ; 補数チェック・データ
ICE_ROM0 * 0x09fe2000 ;
ICE_ROM0_END * 0x09fe4000
ICE_ROM1 * 0x09ffc000
ICE_ROM1_END * 0x09ffe000
DACS_KEY_REG0 * 0x0bfe2000 - 32 ; DACSキーレジスタ
DACS_KEY_REG1 * 0x0c000000 - 32
REG_PAUSE * (REG_BASE + 0x300) ;
REG_OBJ_CENTER * (REG_BASE + 0x410) ; OBJ中心位置
;*------------------------------------------------------------------*/
;* 登録データ・オフセット */
;*------------------------------------------------------------------*/
OFFSET_MON_NINLOGO * (MON_NINLOGO - MON_NINLOGO) ; NINTENDOロゴ・データ
OFFSET_MON_FIQ_FLAG * (MON_FIQ_FLAG - MON_NINLOGO) ; FIQフラグ
OFFSET_MON_KEY_GROUP_NO * (MON_KEY_GROUP_NO - MON_NINLOGO) ; キーグループNo
OFFSET_MON_SOFT_NAME * (MON_SOFT_NAME - MON_NINLOGO) ; ソフト名
OFFSET_MON_COMPLEMENT * (MON_COMPLEMENT - MON_NINLOGO) ; 補数チェック・データ
OFFSET_REG_PAUSE * 0x300 ;
;*------------------------------------------------------------------*/
;* メモリ・サイズ */
;*------------------------------------------------------------------*/
ROM_HEADER_SIZE * (0xc0 - 4 + OFFSET_MON_NINLOGO) ; ROM内登録データ
MON_NINLOGO_SIZE * (MON_SOFT_NAME - MON_NINLOGO) ; NINTENDOロゴ・データ
ICE_ROM_SIZE * 0x2000 ;
ENDIF ; _IRIS_SUBP_MON_MEMORY_MAP_H
END

View File

@ -0,0 +1,300 @@
//*******************************************************************
// IRISモニタプログラム サブルーチン
//*******************************************************************
#include "IrisMon.h"
//--------------------- グローバル 変数 -------------------------------
//----------------------------------------------------------------------
// レジスタ初期化
//----------------------------------------------------------------------
void InitReg(void)
{
*(vu32 *)REG_IME = 0; // IME クリア
*(vu32 *)REG_IE = 0; // IE クリア
*(vu32 *)REG_IF = -1; // IF クリア
*(vu8 *)REG_WRAMCNT = WRAM_SUBP_ALL; // 共有内部ワークRAM割り当て
#ifdef TS_MON
*(vu16 *)REG_POWCNT = 0; // LCD OFF
#else
*(vu16 *)REG_POWCNT = POW_LCDC_ON; // LCD ONTEGボードにてサウンド出力を有効にするため
#endif
#ifdef TEST_ENABLE_JTAG
*(u8 *)REG_PAUSE = 3; // JTAGイネーブル & チェックフラグ セット
#endif // TEST_ENABLE_JTAG
}
//----------------------------------------------------------------------
// メモリ初期化
//----------------------------------------------------------------------
void InitRam(void)
{
#ifdef TEG_MON
CpuClearFast32(0xffffffff, 0x01000000, 0xf000); // リストRAM クリア
#endif
CpuClearFast32(0, MON_DTCM, DTCM_SIZE - 512); // DTCM クリア
CpuClearFast32(0, MAIN_MEM_EX_END - 0x8000, 0x8000); // メインメモリ・システム32KB領域 クリア
}
//----------------------------------------------------------------------
// CRC16bit 算出
//----------------------------------------------------------------------
const u16 crc16_table[16] = {
0x0000, 0xCC01, 0xD801, 0x1400,
0xF001, 0x3C00, 0x2800, 0xE401,
0xA001, 0x6C00, 0x7800, 0xB401,
0x5000, 0x9C01, 0x8801, 0x4400
};
u16 GetCRC16(u32 start, u16 *datap, u32 size)
{
u16 *dataEndp = datap + size/2;
u16 data16;
u32 shift = 0;
u16 r1, total = start;
while(datap < dataEndp) {
if (!shift) data16 = *datap;
// 4bit単位
r1 = crc16_table[total & 0xf];
total = (total >>4);
total = total ^ r1 ^ crc16_table[(data16 >>shift) & 0xf];
shift += 4;
if (shift >= 0x10) {
shift = 0;
datap++;
}
}
return total;
}
//----------------------------------------------------------------------
// メインメモリ 拡張チェック
//----------------------------------------------------------------------
const u16 mmemSizeCheckTable[] = {0x56a9, 0x695a, 0xa695, 0x96a5};
s32 IsMmem8MB(void)
{
u32 mmemExFlag = 0;
int i;
for (i=0; i<4; i++) {
*(vu16 *)MMEM_CHK_SIZE_WRITE_BUF = mmemSizeCheckTable[i];
if (*(vu16 *)MMEM_CHK_SIZE_READ_BUF != mmemSizeCheckTable[i]) mmemExFlag++;
}
*(vu16 *)MMEM_CHK_SIZE_WRITE_BUF = 0;
return (mmemExFlag >= 3);
}
//----------------------------------------------------------------------
// ハフマンデータ展開32Bit→32Bit
//----------------------------------------------------------------------
#define TREE_END 0x80
s32 UnCompHuffman32(const u8 *srcp, u32 *destp, u8 *tableBufp, const UC_InternalFuncp *ifp)
{
u8 *treep;// = (u8 *)srcp + 4;
s32 treeSize;// = (*treep + 1) * 2;
u32 treeCheck;
u32 treeShift;
u32 srcTmp;
u32 destTmp = 0;
u32 destTmpCount = 0;
s32 srcCount;
s32 error;
int i;
s32 header = ifp->InitFuncp(srcp, destp, tableBufp); // 初期化(アドレス送信)
s32 size = header >>8;
s32 destCount = size;
s32 dataBit = header & 0x0f;
u32 destTmpDataNum = 4 + (dataBit & 0x7);
u32 destTopShift = 32 - dataBit;
if (header < 0) { size = header;
goto terminate;
}
srcp += 3;
tableBufp[0] = ifp->ByteStreamFuncp(++srcp);
treeSize = (tableBufp[0] + 1) * 2;
for (i=1; i<treeSize; i++)
tableBufp[i] = ifp->ByteStreamFuncp(++srcp);
srcp++;
treep = tableBufp + 1;
while (destCount > 0) {
srcCount = 32;
srcTmp = ifp->WordStreamFuncp(srcp);
srcp += 4;
while (--srcCount >= 0) {
treeShift = (srcTmp >> 31) & 0x1;
treeCheck = *treep;
treeCheck <<= treeShift;
treep = (u8 *)((((u32 )treep>>1) <<1) + (((*treep & 0x3f)+1) <<1) + treeShift);
if (treeCheck & TREE_END) {
destTmp >>= dataBit;
destTmp |= *treep << destTopShift;
treep = tableBufp + 1;
if (++destTmpCount == destTmpDataNum) {
*destp++ = destTmp;
destCount -= 4;
destTmpCount = 0;
}
}
if (destCount <= 0) break;
srcTmp <<= 1;
}
}
terminate:
if (ifp->TerminateFuncp) { // 終了ダミー読み込み
if ((error = ifp->TerminateFuncp(srcp)) < 0) return error;
}
return size;
}
//----------------------------------------------------------------------
// LZバイトデータ展開8Bit→16Bit
//----------------------------------------------------------------------
s32 UnCompLZ77Short(const u8 *srcp, u16 *destp, const void *paramp, const UC_InternalFuncp *ifp)
{
u32 destTmp = 0;
u32 flags;
s32 offset;
s32 offset0_8;
s32 length;
u32 shift = 0;
u8 src;
s32 error;
int i;
s32 header = ifp->InitFuncp(srcp, destp, paramp); // 初期化(アドレス送信)
s32 size = header >>8;
s32 destCount = size;
if (header < 0) { size = header;
goto terminate;
}
srcp += 3;
while (destCount > 0) {
flags = ifp->ByteStreamFuncp(++srcp);
for (i=8; --i>=0; ) {
if (!(flags & 0x80)){ destTmp |= ifp->ByteStreamFuncp(++srcp) <<shift;
destCount--;
if (!(shift ^= 8)){
*destp = destTmp;
destp++;
destTmp = 0;
}
} else { length = ((src = ifp->ByteStreamFuncp(++srcp)) >>4) + 3;
offset = ( src & 0x0f) << 8;
offset = (offset | ifp->ByteStreamFuncp(++srcp)) + 1;
offset0_8 = (8 - shift) ^ ((offset & 1) <<3);
destCount -= length;
while (--length >= 0) { offset0_8 ^= 8;
destTmp |= (destp[-((offset + ((8 - shift) >>3)) >>1)]
& (0xff <<offset0_8)) >>offset0_8 <<shift;
if (!(shift ^= 8)){
*destp = destTmp;
destp++;
destTmp = 0;
}
}
}
if (destCount <= 0) break;
flags <<= 1;
}
}
terminate:
if (ifp->TerminateFuncp) { // 終了ダミー読み込み
if ((error = ifp->TerminateFuncp(++srcp)) < 0) return error;
}
return size;
}
//----------------------------------------------------------------------
// ランレングスデータ展開8Bit→16Bit
//----------------------------------------------------------------------
s32 UnCompRLShort(const u8 *srcp, u16 *destp, const void *paramp, const UC_InternalFuncp *ifp)
{
s32 srcTmp;
s32 destTmp = 0;
u32 flags;
s32 offset;
s32 length;
u32 shift = 0;
s32 error;
s32 header = ifp->InitFuncp(srcp, destp, paramp); // 初期化(アドレス送信)
s32 size = header >>8;
s32 destCount = size;
if (header < 0) { size = header;
goto terminate;
}
srcp += 3;
while (destCount > 0) {
flags = ifp->ByteStreamFuncp(++srcp);
length = flags & 0x7f;
if (!(flags & 0x80)) { length++;
destCount -= length;
while (--length >= 0){ destTmp |= ifp->ByteStreamFuncp(++srcp) << shift;
if (!(shift ^= 8)){ *destp++ = destTmp;
destTmp = 0;
}
}
} else { length += 3;
destCount -= length;
srcTmp = ifp->ByteStreamFuncp(++srcp);
while (--length >= 0){ destTmp |= srcTmp << shift;
if (!(shift ^= 8)){ *destp++ = destTmp;
destTmp = 0;
}
}
}
}
terminate:
if (ifp->TerminateFuncp) { // 終了ダミー読み込み
if ((error = ifp->TerminateFuncp(++srcp)) < 0) return error;
}
return size;
}

View File

@ -0,0 +1,79 @@
/********************************************************************/
/* IRISモニタプログラム サブルーチン */
/********************************************************************/
#ifndef _IRIS_MON_SUB_H
#define _IRIS_MON_SUB_H
#include <Iris.h>
#include "IrisMonTarget.h"
#include "IrisMonMacro.h"
// 圧縮展開関数型宣言
typedef s32 (* UC_InitFuncp)(const u8 *devicep, void *ramp, const void *paramp);
typedef s32 (* UC_TerminateFuncp)(const u8 *devicep);
typedef u8 (* UC_ByteStreamFuncp)(const u8 *devicep);
typedef u16 (* UC_ShortStreamFuncp)(const u8 *devicep);
typedef u32 (* UC_WordStreamFuncp)(const u8 *devicep);
// 圧縮展開関数指定
typedef struct {
UC_InitFuncp InitFuncp; // 初期化関数
UC_TerminateFuncp TerminateFuncp; // 終了関数
UC_ByteStreamFuncp ByteStreamFuncp; // バイトストリーム読み込み関数
UC_ShortStreamFuncp ShortStreamFuncp; // ハーフワードストリーム読み込み関数
UC_WordStreamFuncp WordStreamFuncp; // ワードストリーム読み込み関数
} UC_InternalFuncp;
//--------------------- 汎用サブルーチン -------------------------------
void NotifySubpIntf(u32 param);
void WaitSubpIntf(u32 param);
void InitCard(void);
void ReadCardAsync(void *romp, void *ramp, s32 size, CardCtrlParam *paramp);
void ReadCardAsync4Game(void *romp, void *ramp, s32 size, CardCtrlParam *paramp);
void ReadCard4Game(void *romp, void *ramp, s32 size, u32 cntParam);
void SetCardIntr(void *romp, void *ramp, s32 size, CardIntrWork *ciwp);
void SetCardIntr4Game(void *romp, void *ramp, s32 size);
void CardIntr(void);
void WaitCardIntr(void);
u32 ReadCardID4Normal(void);
u32 ReadCardID4Game(void);
void ChangeCardMode4Normal(void);
s32 GetBlockSizeFromCardCnt(CardCnt *paramp);
void WaitCardDma(u32 dmaNo);
void InitRam(void);
void InitReg(void);
void DispTegCheck(char *str0, char *str1);
void Iris2Agb(void);
void reset_cp15(u32 param);
void WaitIntr(u32 InitIfClear, u32 IfFlags);
void WaitVBlankIntr(void);
void CpuSet16_32(const void *srcp, void *destp, u32 dmaCntData);
void CpuSetFast32(const void *srcp, void *destp, u32 dmaCntData);
void UnPackBits32( u8 *srcp, u32 *destp, UnPackBitsParam *UnPackBitsParamp);
void UnCompRLByte( u8 *srcp, u8 *destp);
s32 UnCompRLShort(const u8 *srcp, u16 *destp, const void *paramp, const UC_InternalFuncp *ifp);
void UnCompLZ77Byte( u8 *srcp, u8 *sestp);
s32 UnCompLZ77Short(const u8 *srcp, u16 *ramp, const void *paramp, const UC_InternalFuncp *ifp);
s32 UnCompHuffman32(const u8 *srcp, u32 *destp, u8 *tableBufp, const UC_InternalFuncp *ifp);
void UnDiffByte2Byte( u8 *Srcp, u8 *Destp);
void UnDiffShort2Short(u16 *Srcp, u16 *Destp);
#endif // _IRIS_MON_SUB_H

View File

@ -0,0 +1,32 @@
//======================================================================
// IRISサブプロセッサ・モニタプログラム用定義
//======================================================================
#ifndef _IRIS_SUBP_MON_TARGET_H
#define _IRIS_SUBP_MON_TARGET_H
#include <IrisTarget.h>
//#define BB_MON // ブレッドボード専用定義への切り換え
//#define TEG_MON // TEGボード専用定義への切り換え
#define TS_MON // TS専用定義への切り換え
#define NDEBUG
//#define DISP_BIOS_VERSION // BIOSバージョン表示
//#define DISP_READY_CARD_4_IPL2 // IPL2カード読み込み準備完了表示
//#define TEST_AGB_MODE // AGBモード・テスト
//#define DISP_AGB_HEADER_ERROR // AGBヘッダエラー表示
//#define TEST_ENABLE_JTAG // JTAGイネーブルテスト
//#define TEST_CARD_BY_MAINP // メインプロセッサでのカードアクセス・テスト
#endif // _IRIS_SUBP_MON_TARGET_H

View File

@ -0,0 +1,24 @@
;=======================================================================
; IrisMonTargetArm.s
; IRISターゲット選択ARMASM用
;
; Copyright (C) 2003 NINTENDO Co.,Ltd.
;=======================================================================
IF :DEF: _IRIS_MON_TARGET_H
ELSE
_IRIS_MON_TARGET_H * 1
; BB_MON * 1 ; ブレッドボード専用定義への切り換え
; TEG_MON * 1 ; TEGボード専用定義への切り換え
TS_MON * 1 ; TS専用定義への切り換え
; DISABLE_BOOT_IPL2 * 1 ; IPL2ブート無効化
; DISABLE_ENTRY_OF_ROM_HEADER * 1 ; ROMヘッダのエントリ情報無効化TEG用
ENDIF ; _IRIS_MON_TARGET_H
END

View File

@ -0,0 +1,220 @@
//*******************************************************************
// TEG限定ルーチン
//*******************************************************************
#include "IrisMon.h"
#if defined(DISP_BIOS_VERSION) || defined(DISP_READY_CARD_4_IPL2)
//---------------------- パレットデータ -------------------------------
const u16 samplePlttData[16][16] = {
{RGB555(31,31,31), RGB555(0, 0, 0 ), RGB555(0, 0, 0 ), RGB555(0, 0, 0 ),}, // Black
{RGB555(31,31,31), RGB555(31,0, 0 ), RGB555(31,0, 0 ), RGB555(31,0, 0 ),}, // Red
{RGB555(31,31,31), RGB555(0, 31,0 ), RGB555(0, 31,0 ), RGB555(0, 31,0 ),}, // Green
{RGB555(31,31,31), RGB555(0, 0, 31), RGB555(0, 0, 31), RGB555(0, 0, 31),}, // Blue
{RGB555(31,31,31), RGB555(31,31,0 ), RGB555(31,31,0 ), RGB555(31,31,0 ),}, // Yellow
{RGB555(31,31,31), RGB555(0, 31,31), RGB555(0, 31,31), RGB555(0, 31,31),}, // Cyan
{RGB555(31,31,31), RGB555(31,0, 31), RGB555(31,0, 31), RGB555(31,0, 31),}, // Purple
};
//---------------------- キャラクタデータ -----------------------------
const u32 sampleCharData[8*0x30] = {
0x00011100,0x00110010,0x01100011,0x01100011, //0030 0
0x01100011,0x00100110,0x00011100,0x00000000,
0x00011000,0x00011100,0x00011110,0x00011000, //0031 1
0x00011000,0x00011000,0x00011000,0x00000000,
0x00111110,0x01100011,0x01100011,0x00111000, //0032 2
0x00001110,0x00000011,0x01111111,0x00000000,
0x01111110,0x00110000,0x00011000,0x00111100, //0033 3
0x01100000,0x01100011,0x00111110,0x00000000,
0x00110000,0x00111000,0x00111100,0x00110110, //0034 4
0x00110011,0x01111111,0x00110000,0x00000000,
0x00111111,0x00000011,0x00000011,0x00111111, //0035 5
0x01100000,0x01100011,0x00111110,0x00000000,
0x00111100,0x00000110,0x00000011,0x00111111, //0036 6
0x01100011,0x01100011,0x00111110,0x00000000,
0x01111111,0x01110000,0x00111000,0x00011100, //0037 7
0x00001100,0x00001100,0x00001100,0x00000000,
0x00111110,0x01100011,0x01100011,0x00111110, //0038 8
0x01100011,0x01100011,0x00111110,0x00000000,
0x00111110,0x01100011,0x01100011,0x01111110, //0039 9
0x01100000,0x00110000,0x00011110,0x00000000,
0x00000000,0x00011000,0x00011000,0x00000000, //003A :
0x00000000,0x00011000,0x00011000,0x00000000,
0x00000000,0x00011000,0x00011000,0x00000000, //003B ;
0x00000000,0x00011000,0x00011000,0x00010000,
0x01100000,0x00111000,0x00001110,0x00000011, //003C <
0x00001110,0x00111000,0x01100000,0x00000000,
0x00000000,0x00000000,0x00111110,0x00000000, //003D =
0x00000000,0x00111110,0x00000000,0x00000000,
0x00000011,0x00001110,0x00111000,0x01100000, //003E >
0x00111000,0x00001110,0x00000011,0x00000000,
0x01111110,0x11000011,0x11000011,0x01111000, //003F ?
0x00011000,0x00000000,0x00011000,0x00000000,
0x00111110,0x01100011,0x01011001,0x01010101, //0040 @
0x01011101,0x01110011,0x00011110,0x00000000,
0x00111110,0x01100011,0x01100011,0x01111111, //0041 A
0x01100011,0x01100011,0x01100011,0x00000000,
0x00111111,0x01100011,0x01100011,0x00111111, //0042 B
0x01100011,0x01100011,0x00111111,0x00000000,
0x00111110,0x01100011,0x01100011,0x00000011, //0043 C
0x01100011,0x01100011,0x00111110,0x00000000,
0x00111111,0x01100011,0x01100011,0x01100011, //0044 D
0x01100011,0x01100011,0x00111111,0x00000000,
0x01111111,0x00000011,0x00000011,0x00111111, //0045 E
0x00000011,0x00000011,0x01111111,0x00000000,
0x01111111,0x00000011,0x00000011,0x00111111, //0046 F
0x00000011,0x00000011,0x00000011,0x00000000,
0x00111110,0x01100011,0x00000011,0x01111011, //0047 G
0x01100011,0x01100011,0x00111110,0x00000000,
0x01100011,0x01100011,0x01100011,0x01111111, //0048 H
0x01100011,0x01100011,0x01100011,0x00000000,
0x00011000,0x00011000,0x00011000,0x00011000, //0049 I
0x00011000,0x00011000,0x00011000,0x00000000,
0x01100000,0x01100000,0x01100000,0x01100000, //004A J
0x01100000,0x01100011,0x00111110,0x00000000,
0x01100011,0x01110011,0x00111011,0x00011111, //004B K
0x00111011,0x01110011,0x01100011,0x00000000,
0x00000011,0x00000011,0x00000011,0x00000011, //004C L
0x00000011,0x00000011,0x01111111,0x00000000,
0x01100011,0x01100011,0x01110111,0x01110111, //004D M
0x01111111,0x01101011,0x01101011,0x00000000,
0x01100011,0x01100111,0x01101111,0x01111111, //004E N
0x01111011,0x01110011,0x01100011,0x00000000,
0x00111110,0x01100011,0x01100011,0x01100011, //004F O
0x01100011,0x01100011,0x00111110,0x00000000,
0x00111111,0x01100011,0x01100011,0x00111111, //0050 P
0x00000011,0x00000011,0x00000011,0x00000000,
0x00111110,0x01100011,0x01100011,0x01100011, //0051 Q
0x01100011,0x00111110,0x01110000,0x00000000,
0x00111111,0x01100011,0x01100011,0x00111111, //0052 R
0x01100011,0x01100011,0x01100011,0x00000000,
0x00111110,0x01100011,0x00000011,0x00111110, //0053 S
0x01100000,0x01100011,0x00111110,0x00000000,
0x11111111,0x00011000,0x00011000,0x00011000, //0054 T
0x00011000,0x00011000,0x00011000,0x00000000,
0x01100011,0x01100011,0x01100011,0x01100011, //0055 U
0x01100011,0x01100011,0x00111110,0x00000000,
0x01100011,0x01100011,0x00110110,0x00110110, //0056 V
0x00011100,0x00011100,0x00001000,0x00000000,
0x11011011,0x11011011,0x11011011,0x11011011, //0057 W
0x11011011,0x01111110,0x01100110,0x00000000,
0x01000001,0x01100011,0x00110110,0x00011100, //0058 X
0x00011100,0x00110110,0x01100011,0x00000000,
0x11000011,0x11000011,0x11100111,0x01111110, //0059 Y
0x00011000,0x00011000,0x00011000,0x00000000,
0x01111111,0x00110000,0x00011000,0x00001100, //005A Z
0x00000110,0x00000011,0x01111111,0x00000000,
0x00001111,0x00000011,0x00000011,0x00000011, //005B [
0x00000011,0x00000011,0x00001111,0x00000000,
0x01100110,0x01100110,0x11111111,0x00011000, //005C \.
0x11111111,0x00011000,0x00011000,0x00000000,
0x01111000,0x01100000,0x01100000,0x01100000, //005D ]
0x01100000,0x01100000,0x01111000,0x00000000,
0x00011100,0x00110110,0x00100010,0x00000000, //005E ^
0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000, //005F _
0x00000000,0x00000000,0x01111111,0x00000000,
};
//----------------------------------------------------------------------
// TEG専用バージョンチェック表示
//----------------------------------------------------------------------
void BG_SetScreen(const char *srcp, u16 *destp, u32 plttNo);
void DispTegCheck(char *str0, char *str1)
{
s32 i;
*(vu16 *)REG_POWCNT = POW_LCDC_ON | POW_2D_ON; // 各ロジック パワーON
// OAMとパレットRAMへアクセスする場合は
// 2DエンジンをONにして下さい
*(vu32 *)REG_DISPCNT = DISP_GFX_MODE | DISP_LCDC_OFF; // LCDC OFF
// VRAM設定
*(vu32 *)REG_VRAM_ABCD_CNT = (VRAM_LCDC_MODE | VRAM_DISABLE) <<VRAM_A_CNT_SHIFT
| (VRAM_LCDC_MODE | VRAM_DISABLE) <<VRAM_B_CNT_SHIFT
| (VRAM_LCDC_MODE | VRAM_DISABLE) <<VRAM_C_CNT_SHIFT
| (VRAM_LCDC_MODE | VRAM_DISABLE) <<VRAM_D_CNT_SHIFT;
*(vu32 *)REG_VRAM_EFG_W_CNT = (VRAM_BG_MODE | 0 <<VRAM_OFFSET_SHIFT | VRAM_ENABLE) <<VRAM_E_CNT_SHIFT
| (VRAM_OBJ_MODE | 0 <<VRAM_OFFSET_SHIFT | VRAM_ENABLE) <<VRAM_F_CNT_SHIFT
| (VRAM_OBJ_MODE | 1 <<VRAM_OFFSET_SHIFT | VRAM_ENABLE) <<VRAM_G_CNT_SHIFT
| WRAM_SUBP_ALL <<WRAM_CNT_SHIFT;
CpuClearFast32(0, BG_VRAM, VRAM_E_SIZE ); // BG-VRAM クリア
CpuClearFast32(0, PLTT, PLTT_SIZE ); // パレット クリア
CpuCopyArrayFast32(sampleCharData, BG_VRAM+0x8020); // BGキャラクタ セット
CpuCopyArrayFast32(samplePlttData, BG_PLTT ); // BGパレット セット
BG_SetScreen(str0, &((u16 *)BG_VRAM)[32*11+9], 0); // バージョン表示
BG_SetScreen(str1, &((u16 *)BG_VRAM)[32*13+9], 1); // キー押し指示
*(vu16 *)REG_BG1CNT = // BGコントロール セット
BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_0
| 0 <<BG_SCREEN_BASE_SHIFT | 2 <<BG_CHAR_BASE_SHIFT ;
*(vu32 *)REG_DISPCNT = DISP_GFX_MODE | DISP_BG_MODE_N2A1E1
| DISP_BG1_ON; // LCDC ON
}
//----------------------------------------------------------------------
// BGスクリーン セット
//----------------------------------------------------------------------
void BG_SetScreen(const char *srcp, u16 *destp, u32 plttNo)
{
while (*srcp != '\0')
*destp++ = (u16 )plttNo <<BG_SC_PLTT_SHIFT | (*srcp++ - '0' + 1);
}
#endif
//----------------------------------------------------------------------
// AGBモード遷移
//----------------------------------------------------------------------
void Halt(void);
#ifdef TEST_AGB_MODE
void Iris2Agb(void)
{
int i;
*(vu32 *)REG_IME = 0;
while (((vDispStat *)REG_DISPSTAT)->blankingV == 1) ;
while (((vDispStat *)REG_DISPSTAT)->blankingV != 1) ; // 表示期間待ち
*(vu16 *)REG_POWCNT = POW_LCDC_ON | POW_2D_ON;
// LCD切り換え処理
*(vu32 *)REG_VRAM_ABCD_CNT = (VRAM_LCDC_MODE | VRAM_ENABLE) <<VRAM_A_CNT_SHIFT
| (VRAM_LCDC_MODE | VRAM_ENABLE) <<VRAM_B_CNT_SHIFT;
// | (VRAM_SUBP_MODE | VRAM_ENABLE) <<VRAM_C_CNT_SHIFT
// | (VRAM_SUBP_MODE | VRAM_ENABLE) <<VRAM_D_CNT_SHIFT;
// *(vu32 *)REG_VRAM_EFG_W_CNT = 0;
#if 0
*(vu32 *)REG_VRAM_EFG_W_CNT = (VRAM_BG_MODE | 0 <<VRAM_OFFSET_SHIFT | VRAM_ENABLE) <<VRAM_E_CNT_SHIFT
| (VRAM_OBJ_MODE | 0 <<VRAM_OFFSET_SHIFT | VRAM_ENABLE) <<VRAM_F_CNT_SHIFT
| (VRAM_OBJ_MODE | 1 <<VRAM_OFFSET_SHIFT | VRAM_ENABLE) <<VRAM_G_CNT_SHIFT
| WRAM_SUBP_ALL <<WRAM_CNT_SHIFT;
#endif
CpuClear16_32(RGB555(0,0,0), LCDC_VRAM_A, VRAM_A_SIZE * 2, 16); // VRAM-AB クリア
WaitSubpIntf(7); // モード遷移通知待ち
NotifySubpIntf(7);
Halt(); // ホールト
}
#endif // TEST_AGB_MODE

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,424 @@
;********************************************************************
; IRISモニタプログラム スタートアップルーチン
;********************************************************************
AREA Init, CODE, READONLY
INCLUDE IrisDefineArm.s
INCLUDE IrisMemoryMapArm.s
INCLUDE IrisCardDefineArm.s
INCLUDE IrisMonDefineArm.s
INCLUDE IrisMonMempryMapArm.s
ENTRY
;====================================================================
; 割り込み領域
;====================================================================
CODE32
start_v b start_handler
undef_v b fiq_v
swi_v b swi_handler
code_abort_v b fiq_v
data_abort_v b fiq_v
reserve_v b fiq_v
irq_v b irq_handler
fiq_v b fiq_handler
;====================================================================
; NINTENDOロゴデータ
;====================================================================
ALIGN
GLOBAL Nin_Char_Diff_Huff
Nin_Char_Diff_Huff
DCB 0x24,0xff,0xae,0x51,0x69,0x9a,0xa2,0x21,0x3d,0x84,0x82,0x0a,0x84,0xe4,0x09,0xad
DCB 0x11,0x24,0x8b,0x98,0xc0,0x81,0x7f,0x21,0xa3,0x52,0xbe,0x19,0x93,0x09,0xce,0x20
DCB 0x10,0x46,0x4a,0x4a,0xf8,0x27,0x31,0xec,0x58,0xc7,0xe8,0x33,0x82,0xe3,0xce,0xbf
DCB 0x85,0xf4,0xdf,0x94,0xce,0x4b,0x09,0xc1,0x94,0x56,0x8a,0xc0,0x13,0x72,0xa7,0xfc
DCB 0x9f,0x84,0x4d,0x73,0xa3,0xca,0x9a,0x61,0x58,0x97,0xa3,0x27,0xfc,0x03,0x98,0x76
DCB 0x23,0x1d,0xc7,0x61,0x03,0x04,0xae,0x56,0xbf,0x38,0x84,0x00,0x40,0xa7,0x0e,0xfd
DCB 0xff,0x52,0xfe,0x03,0x6f,0x95,0x30,0xf1,0x97,0xfb,0xc0,0x85,0x60,0xd6,0x80,0x25
DCB 0xa9,0x63,0xbe,0x03,0x01,0x4e,0x38,0xe2,0xf9,0xa2,0x34,0xff,0xbb,0x3e,0x03,0x44
DCB 0x78,0x00,0x90,0xcb,0x88,0x11,0x3a,0x94,0x65,0xc0,0x7c,0x63,0x87,0xf0,0x3c,0xaf
DCB 0xd6,0x25,0xe4,0x8b,0x38,0x0a,0xac,0x72,0x21,0xd4,0xf8,0x07,0x56,0xcf,0x00,0x00
ALIGN
;====================================================================
; サブルーチン群
;====================================================================
;--------------------------------------------------------------------
; デバッガモニタへジャンプ
;--------------------------------------------------------------------
CODE32
fiq_handler
mrs sp, cpsr ; IRQ/FIQ不許可
orr sp, sp, #PSR_IRQ_DISABLE | PSR_FIQ_DISABLE
msr cpsr_cxsf, sp
ldr sp, fiq_sp ; SP のセット
add sp, sp, #1
fiq_m stmfd sp!, {r12, lr} ; レジスタ の退避合計4ワード
mrs lr, spsr
mrc p15, 0, r12, c1, c0, 0 ; コプロセッサ・マスタ 退避
stmfd sp!, {r12, lr}
bic r12, r12, #C1_PROTECT_UNIT_ENABLE ; プロテクションユニット ディセーブル
mcr p15, 0, r12, c1, c0, 0
bic r12, sp, #1 ; デバッガ処理へジャンプ
ldr r12, [r12, #16]
cmp r12, #0
blxne r12
;--------------------------------------------------------------------
; デバッガモニタからの復帰
;--------------------------------------------------------------------
CODE32
fiq_return
ldmfd sp!, {r12, lr} ; レジスタ の復帰
mcr p15, 0, r12, c1, c0, 0 ; コプロセッサ・マスタ 復帰
msr spsr_sxcf, lr
ldmfd sp!, {r12, lr}
subs pc, lr, #4
;--------------------------------------------------------------------
; 初期化
;--------------------------------------------------------------------
EXTERN init_cp15
EXTERN reset_cp15
EXTERN IrisMonMain
EXTERN intr_main
CODE32
start_handler
cmp lr, #0 ; fiq_return => pc = -4 対策
moveq lr, #4
mov r12, #REG_BASE ; /
ldrb r12, [r12, #OFFSET_REG_PAUSE]
teq r12, #1
mrseq r12, cpsr ; IRQ/FIQ不許可
orreq r12, r12, #PSR_IRQ_DISABLE | PSR_FIQ_DISABLE
msreq cpsr_cxsf,r12
ldreq sp, fiq_sp ; SP のセット
beq fiq_m ; デバッガモニタへジャンプ
mov r4, #REG_BASE ; Low 1us
mov r0, #CARD_RESET_LO
mov r1, #CARDMST_SEL_ROM | CARDMST_ENABLE
str r0, [r4, #REG_CARDCNT - REG_BASE]
str r1, [r4, #REG_CARD_MASTER_CNT - REG_BASE] ;
; (実際はリードオンリーフラグへ書き込んでしまっている
; <シャープさんからの指摘>)
restart_v mov r0, #0xc0 | PSR_SYS_MODE ; システムモードへ切り換え & IRQ/FIQ不許可
msr cpsr_cxsf, r0
mov r0, #0x8000/4 ; メインメモリLow期間 0.97ms
bl WaitByLoop
mainmem_change_burst ; メインメモリ バーストモード遷移
ldr r4, =0x04000204 ; REG_EXMEMCNT
mov r1, #MMEM_CE2_OUT
strh r1, [r4]
mov r0, #0x8000/4 ; メインメモリHigh期間 0.97ms
bl WaitByLoop
ldr r3, =MAIN_MEM_EX_END - 2
ldr r1, =MMEMD4_BURST_MODE | MMEMD4_BURST_CONTINUOUS \
| MMEMD4_PARTIAL_REFRESH_NONE | MMEMD4_SB1
ldr r2, =MMEMD5_1ST_R4_W3 | MMEMD5_BURST_WRITE | MMEMD5_BURST_LINER \
| MMEMD5_CLOCK_TRIGGER_UP | MMEMD5_SB1
ldr r12, =MAIN_MEM | MMEMP_CLOCK_TRIGGER_UP \
| MMEMP_BURST_MODE | MMEMP_BURST_CONTINUOUS \
| MMEMP_1ST_R4_W3 | MMEMP_BURST_WRITE | MMEMP_BURST_LINER \
| MMEMP_PARTIAL_REFRESH_NONE | MMEMP_SB1
ldrh r0, [r3]
strh r0, [r3]
strh r0, [r3]
strh r1, [r3]
strh r2, [r3]
ldrh r0, [r12]
ldr r4, =0x04000204 ; REG_EXMEMCNT
mov r1, #MMEM_INTF_SYNC | MMEM_CE2_OUT
strh r1, [r4]
bl init_cp15 ; システム制御コプロセッサ 初期化
mov r4, #REG_BASE ; IME
strb r4, [r4, #OFFSET_REG_IME]
bl bankreg_init_stack_clear ; バンクレジスタ リセット & スタック領域 クリア
; adr r0, intr_main ; 割り込みアドレスのセット
; str r0, [sp, #0x100-4]
ldr r0, =IrisMonMain ; Cルーチン処理
blx r0
main_return
bl terminate_mon ; モニタ終了処理
ldr r12, =MAIN_MEM_EX_END ; ユーザ・エントリポイント 獲得
IF :DEF: DISABLE_ENTRY_OF_ROM_HEADER
ldr lr, [r12, #-(0x200 - 0x28)] ; rmhp->arm9->ramAddr
ELSE
ldr lr, [r12, #-(0x200 - 0x24)] ; rmhp->arm9->entryAddr
ENDIF
IF :DEF: DISABLE_BOOT_IPL2
ldrh r0, [r12, #-4] ; ROMヘッダ チェック
cmp r0, #1
0 beq %b0 ; ROMヘッダ不整合時
sub r12, r12, #0x800
ldrh r0, [r12, #0x14] ; デバッガチェック
add r12, r12, #0x800
cmp r0, #1 ; if (!shwp->isOnDebugger)
mov r0, #0
ldreq r12, [r12, #-(0x200 - 0x168)]; デバッガエントリポイント 獲得
; cmpeq r12, #0 ; rmhp->dbgArm9RamAddr
; cmpeq r12, #-1
bxeq r12
IF :DEF: BB_MON
0 b %b0 ; ブレッドボード開発用
ENDIF
mov r0, #0
bx lr
ELSE
sub r12, r12, #0x800
ldrh r0, [r12, #0x2c] ; IPL2・CRCチェック
cmp r0, #0 ; if (!shwp->flashCrcError)
0 bne %b0
ldr r12, [r12, #0x20] ; IPL2・エントリポイント 獲得
cmp r12, #0 ; shwp->flashArm9RamAddr
0 beq %b0
bx r12
ENDIF
;--------------------------------------------------------------------
; ソフトリセット
;--------------------------------------------------------------------
CODE32
soft_reset
bl terminate_mon ; 終了処理
ldr r12, =MAIN_MEM_EX_END ; ユーザ・エントリポイント 獲得
ldr lr, [r12, #-(0x200 - 0x24)]
mov r12, #0
bx lr
;--------------------------------------------------------------------
; モニタプログラム終了処理
;--------------------------------------------------------------------
CODE32
terminate_mon
mov r12, lr
mov r0, #PSR_SYS_MODE ; IRQ/FIQ
msr cpsr_cxsf, r0
ldr r0, =C1_DTCM_ENABLE | C1_EXCEPT_VEC_UPPER \
| C1_SB1_BITSET
bl reset_cp15 ; プロテクションユニットディセーブル
bl bankreg_init_stack_clear ; バンクレジスタ リセット & スタック領域 クリア
ldmea r4, {r0-r11} ; 汎用レジスタ クリア
bx r12
;--------------------------------------------------------------------
; バンクレジスタ リセット スタック領域 クリア
;--------------------------------------------------------------------
CODE32
bankreg_init_stack_clear
mov r0, #0xc0 | PSR_SVC_MODE ; SVCモードへ切り換え & IRQ/FIQ不許可
msr cpsr_cxsf, r0
ldr sp, svc_sp ; SP のセット
mov lr, #0
msr spsr_csxf, lr
mov r0, #0xc0 | PSR_IRQ_MODE ; IRQモードへ切り換え & IRQ/FIQ不許可
msr cpsr_cxsf, r0
ldr sp, irq_sp ; SP のセット
mov lr, #0
msr spsr_cxsf, lr
mov r0, #0x40 | PSR_SYS_MODE ; システムモードへ切り換え & IRQ許可/FIQ不許可
msr cpsr_cxsf, r0
ldr sp, usr_sp ; SP のセット
stack_clear
IF :DEF: BB_MON
ldr r4, =CPU_WRAM_END
ELSE
mrc p15, 0, r4, c9, c1, 0 ; DTCMアドレス獲得
; bic r4, r4, lsr #0xff
mov r4, r4, lsr #C9_TCMR_BASE_SHIFT
mov r4, r4, lsl #C9_TCMR_BASE_SHIFT
add r4, r4, #DTCM_SIZE
ENDIF ; BB_MON
adr r0, stack_clear_10 + 1
bx r0
CODE16
stack_clear_10 mov r0, #0
ldr r1, =-4*128
1 str r0, [r4, r1]
add r1, #4
blt %b1
bx lr
;--------------------------------------------------------------------
; IRQ処理へジャンプ
;--------------------------------------------------------------------
ALIGN
CODE32
irq_handler
stmfd sp!, {r0-r3,r12,lr} ; レジスタ の退避6ワード
mrc p15, 0, r0, c9, c1, 0 ; DTCMアドレス獲得
; bic r0, r0, lsr #0xff
mov r0, r0, lsr #C9_TCMR_BASE_SHIFT
mov r0, r0, lsl #C9_TCMR_BASE_SHIFT
add r0, r0, #DTCM_SIZE
adr lr, irq_return
ldr pc, [r0, #-4] ; 32bitコードでジャンプ
;--------------------------------------------------------------------
; IRQからの復帰
;--------------------------------------------------------------------
CODE32
irq_return ldmfd sp!, {r0-r3,r12,lr} ; レジスタ の復帰
subs pc, lr, #4
;--------------------------------------------------------------------
; システムコールへジャンプ
;--------------------------------------------------------------------
CODE32
swi_handler
stmfd sp!, {r11, r12, lr} ; SVCモード レジスタ退避
ldrh r12, [lr, #-2] ; システムコールNo 取得(ハーフワードアクセス対応)
and r12, r12, #0xff
adr r11, sys_table ; システムコール・アドレス 取得
ldr r12, [r11, r12, lsl #2]
mrs r11, spsr ; SVCモード SPSR退避合計4ワード
stmfd sp!, {r11}
and r11, r11, #PSR_IRQ_DISABLE ; IRQ
orr r11, r11, #PSR_SYS_MODE ; & FIQ
msr cpsr_cxsf,r11
stmfd sp!, {r2, lr} ; システムモード レジスタ退避2ワード
blx r12 ; コードの切換とジャンプ
;--------------------------------------------------------------------
; システムコールからの復帰
;--------------------------------------------------------------------
GLOBAL swi_return
CODE32
swi_return ldmfd sp!, {r2, lr} ; システムモード レジスタ復帰
mov r12, #0xc0 | PSR_SVC_MODE ; SVCモードへ切り換え
msr cpsr_cxsf, r12 ; & IRQ/FIQ不許可
ldmfd sp!, {r11} ; SVCモード レジスタ復帰
msr spsr_cxsf, r11
ldmfd sp!, {r11, r12, lr}
movs pc, lr
;--------------------------------------------------------------------
; PAUSEレジスタ セット
;--------------------------------------------------------------------
GLOBAL SetPauseReg
CODE16
SetPauseReg
ldr r2, =REG_PAUSE
str r0, [r2, #0]
bx lr
;====================================================================
; アドレステーブル
;====================================================================
ALIGN
usr_sp DCD MON_DTCM_END - 0x140
irq_sp DCD MON_DTCM_END - 0x60
svc_sp DCD MON_DTCM_END - 0x40
fiq_sp DCD ROM_HEADER_BUF - 0x64
;fiq_sp DCD MON_DTCM_END - 0x24
EXTERN AccessCard
EXTERN WaitByLoop
EXTERN WaitIntr
EXTERN WaitVBlankIntr
EXTERN Halt
EXTERN IsMmem8MB
EXTERN GetCRC16
EXTERN DivS32
EXTERN SqrtU32
EXTERN CpuSet16_32
EXTERN CpuSetFast32
EXTERN UnPackBits32
EXTERN UnCompLZ77Byte
EXTERN UnCompLZ77Short
EXTERN UnCompHuffman32
EXTERN UnCompRLByte
EXTERN UnCompRLShort
EXTERN UnDiffByte2Byte
EXTERN UnDiffShort2Short
sys_table
DCD soft_reset ; 0
DCD 0 ; 1
DCD 0 ; 2
DCD WaitByLoop ; 3
DCD WaitIntr ; 4
DCD WaitVBlankIntr ; 5
DCD Halt ; 6
DCD 0 ; 7
DCD 0 ; 8
DCD DivS32 ; 9
DCD 0 ; 10
DCD CpuSet16_32 ; 11
DCD CpuSetFast32 ; 12
DCD SqrtU32 ; 13
DCD GetCRC16 ; 14
DCD IsMmem8MB ; 15
DCD UnPackBits32 ; 16
DCD UnCompLZ77Byte ; 17
DCD UnCompLZ77Short ; 18
DCD UnCompHuffman32 ; 19
DCD UnCompRLByte ; 20
DCD UnCompRLShort ; 21
DCD UnDiffByte2Byte ; 22
DCD 0 ; 23
DCD UnDiffShort2Short ; 24
DCD 0 ; 25
DCD 0 ; 26
DCD 0 ; 27
DCD 0 ; 28
DCD 0 ; 29
DCD 0 ; 30
DCD SetPauseReg ; 31
END

View File

@ -0,0 +1,566 @@
;********************************************************************
; IRISモニタプログラム サブルーチン群
;********************************************************************
AREA IrisCrt0Sub, CODE, READONLY
INCLUDE IrisDefineArm.s
INCLUDE IrisMemoryMapArm.s
INCLUDE IrisSystemCallDefineArm.s
INCLUDE IrisMonDefineArm.s
INCLUDE IrisMonMempryMapArm.s
MON_ONLY
NDEBUG2
;-----------------------------------------------------------------------
;
;-----------------------------------------------------------------------
GLOBAL Halt
CODE32
Halt
mov r0, #0
mcr p15, 0, r0, c7, c0, 4
bx lr
;-----------------------------------------------------------------------
; ループ待ちr0=loopCount
;-----------------------------------------------------------------------
GLOBAL WaitByLoop
ALIGN
CODE16
WaitByLoop
sub r0, #1
bgt WaitByLoop
bx lr
;--------------------------------------------------------------------
; Vブランク割り込みウェイト
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL WaitVBlankIntr
ALIGN
CODE32
WaitVBlankIntr mov r0, #1
mov r1, #V_BLANK_INTR_FLAG
;--------------------------------------------------------------------
; 割り込みウェイトr0=InitCheckClear, r1=IntrFlag
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL WaitIntr
CODE32
WaitIntr stmfd sp!, {r4, lr} ; r4 はアライメント調整用
cmp r0, #0
blne WaitIntr_sub ; IfCheck クリア
0
mov lr, #0
mcr p15, 0, lr, c7, c0, 4 ; OS_Halt()
bl WaitIntr_sub
beq %b0 ; while (!(IfCheck & IfFlags))
ldmfd sp!, {r4, lr}
bx lr
WaitIntr_sub mov r12,#REG_BASE ; r12: #REG_BASEstop
str r12,[r12,#REG_IME - REG_BASE] ; IME = 0
mrc p15, 0, r3, c9, c1, 0 ; DTCMアドレス獲得
; bic r3, r3, lsr #0xff
mov r3, r3, lsr #C9_TCMR_BASE_SHIFT
mov r3, r3, lsl #C9_TCMR_BASE_SHIFT
add r3, r3, #DTCM_SIZE
ldr r2, [r3, #INTR_CHECK_BUF - DTCM_END]
ands r0, r1, r2 ; IfCheck 判定
eorne r2, r2, r0 ; IfCheck クリア
strne r2, [r3, #INTR_CHECK_BUF - DTCM_END]
mov r0, #1
str r0, [r12,#REG_IME - REG_BASE] ; IME = 1
bx lr
; ENDIF
;--------------------------------------------------------------------
; 汎用符号付き割り算r0/r1→r0',r0%r1→r1',|r0'|→r3'
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL DivS32
ALIGN
CODE32
DivS32 ands r3, r1, #0x80000000 ; r1: 除数の絶対値
rsbmi r1, r1, #0
eors r12,r3, r0, asr #32 ; r12: d31=結果の符合,d30=被除数の符号
rsbcs r0, r0, #0 ; r0: 被除数の絶対値
movs r2, r1 ; r2: コントロール・ビット
; beq devide_by_zero
divide_just_l cmp r2, r0, lsr #1
movls r2, r2, lsl #1
blo divide_just_l
divide_div_l cmp r0, r2 ; 減算できるかチェック
adc r3, r3, r3 ; r3*2 + キャリー
subcs r0, r0, r2 ; 減算可能なら減算
teq r2, r1 ; 終了チェック
movne r2, r2, lsr #1 ; 終了でなければ2で割り再チェック
bne divide_div_l
mov r1, r0
mov r0, r3
movs r12,r12,lsl #1
rsbcs r0, r0, #0
rsbmi r1, r1, #0
bx lr
; ENDIF
;--------------------------------------------------------------------
; 平方根算出r0=param
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL SqrtU32
ALIGN
CODE32
SqrtU32 stmfd sp!, {r4, r5} ; r5 はアライメント調整用
mov r12,r0 ; r12: ParamBak
mov r1, #1
1 cmp r0, r1
movhi r0, r0, lsr #1
movhi r1, r1, lsl #1
bhi %b1
2 mov r0, r12 ; r0: 被除数
mov r4, r1 ; r1: 除数
mov r3, #0 ; r3: 商
mov r2, r1 ; r2: コントロール・ビット
3 cmp r2, r0, lsr #1
movls r2, r2, lsl #1
blo %b3
4 cmp r0, r2 ; 減算できるかチェック
adc r3, r3, r3 ; r3*2 + キャリー
subcs r0, r0, r2 ; 減算可能なら減算
teq r2, r1 ; 終了チェック
movne r2, r2, lsr #1 ; 終了でなければ2で割り再チェック
bne %b4
add r1, r1, r3
movs r1, r1, lsr #1
cmp r1, r4
bcc %b2
mov r0, r4
ldmfd sp!, {r4, r5}
bx lr
; ENDIF
;--------------------------------------------------------------------
; セット (r0=srcp, r1=destp, r2=dmaCntData)
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL CpuSet16_32
CODE16
CpuSet16_32 push {r4-r6, lr} ; r6 はアライメント調整用
lsl r4, r2, #11 ; r4: size = (dmaCntData & 0x1fffff)*4
lsr r4, #11-2
; bl CheckSrcp16_32 ; ソースアドレス チェック
; beq %f6
0 mov r5, #0 ; r5: i = 0
lsr r3, r2, #27 ; if ((dmaCntData) & DMA_32BIT_BUS)
bcc %f3
add r5, r1, r4 ; r5: destEndp = destp + size
lsr r3, r2, #25 ; if ((dmaCntData) & DMA_SRC_FIX)
bcc %f2
ldmia r0!, {r3}
1 cmp r1, r5 ; while (destp < destEndp)
bge %f6
stmia r1!, {r3} ; *((vu32 *)(destp))++ = *((vu32 *)(srcp))
b %b1
2 cmp r1, r5 ; while (destp < destEndp)
bge %f6
ldmia r0!, {r3} ; *((vu32 *)(destp))++ = *((vu32 *)(srcp))++
stmia r1!, {r3}
b %b2
3 lsr r4, #1
lsr r3, r2, #25 ; if ((dmaCntData) & DMA_SRC_FIX)
bcc %f5
ldrh r3, [r0, #0]
4 cmp r5, r4 ; for ( ; i<count; i++)
bge %f6
strh r3, [r1, r5] ; ((vu16 *)(destp))[i] = ((vu16 *)(srcp))[0]
add r5, #2
b %b4
5 cmp r5, r4 ; for ( ; i<count; i++)
bge %f6
ldrh r3, [r0, r5] ; ((vu16 *)(destp))[i] = ((vu16 *)(srcp))[i]
strh r3, [r1, r5]
add r5, #2
b %b5
6 pop {r4, r5}
pop {r2, r3}
bx r3
; ENDIF
;--------------------------------------------------------------------
; 高速セット(32Byte) (r0=srcp, r1=destp, r2=dmaCntData)
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL CpuSetFast32_T
GLOBAL CpuSetFast32
CODE16
CpuSetFast32_T mov r3, pc
bx r3
ALIGN
CODE32
CpuSetFast32 stmfd sp!, {r4-r10, lr}
mov r10, r2, lsl #11 ; r10: count = (dmaCntData & 0x1fffff)*4
; movs r12, r10, lsr #11-2 ; r12: size = count * 4
; bl CheckSrcp ; ソースアドレス チェック
; beq %f5
add lr, r1, r10, lsr #11-2 ; lr: destEndp = destp + size
mov r10, r10, lsr #11+3 ; r10: blockEndp = srcp + size/32*32
add r10, r1, r10,lsl #3
0 movs r2, r2, lsr #25 ; if ((dmaCntData) & DMA_SRC_FIX)
bcc %f3
ldr r2, [r0, #0]
mov r3, r2
mov r4, r2
mov r5, r2
mov r6, r2
mov r7, r2
mov r8, r2
mov r9, r2
1 cmp r1, r10 ; while (destp < destEndp)
stmltia r1!, {r2-r9} ; *((vu32 *)(destp++)) = *((vu32 *)(srcp))
blt %b1
2 cmp r1, lr
stmltia r1!, {r2}
blt %b2
b %f5
3 cmp r1, r10 ; while (destp < destEndp)
ldmltia r0!, {r2-r9} ; *((vu32 *)(destp)++) = *((vu32 *)(srcp)++)
stmltia r1!, {r2-r9}
blt %b3
4 cmp r1, lr
ldmltia r0!, {r2}
stmltia r1!, {r2}
blt %b4
5 ldmfd sp!, {r4-r10, lr}
bx lr
; ENDIF
;--------------------------------------------------------------------
; Bit圧縮データ展開 (r0=srcp, r1=destp, r2=unPackBitsParamp)
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL UnPackBits32
ALIGN
CODE32
UnPackBits32
stmfd sp!, {r4-r12, lr} ; r12 はアライメント調整用
sub sp, sp, #8
ldrh r7, [r2, #0] ; r7: srcNum = unPackBitsParamp->srcNum
; movs r12, r7 ; r12: srcCount
; bl CheckSrcp ; ソースアドレス チェック
; beq %f6
0 ldrb r6, [r2, #2] ; r6: srcBitNum = unPackBitsParamp->srcBitNum
rsb r10, r6, #8 ; r10: srcBitNumInv = 8 - srcBitNum
mov r14, #0 ; r14: destBak = 0
ldr r11, [r2, #4] ; r8: destOffset0_On
mov r8, r11, lsr #31 ; = unPackBitsParamp->destOffset0_On
ldr r11,[r2, #4] ; destOffset = unPackBitsParamp->destOffset
mov r11,r11, lsl #1
mov r11,r11, lsr #1
str r11,[sp, #0]
ldrb r2, [r2, #3] ; r2: destBitNum = unPackBitsParamp->destBitNum
mov r3, #0 ; r3: destBitCount = 0
1 subs r7, r7, #1 ; while (--srcNum >= 0)
blt %f6
mov r11, #0xff ; r5: srcMask = 0xff >> srcBitNumInv
mov r5, r11, asr r10
ldrb r9, [r0], #1 ; r9: srcTmp = *srcp++
mov r4, #0 ; r4: srcBitCount = 0
2 cmp r4, #8 ; while (srcBitCount < 8)
bge %b1
and r11, r9, r5 ; r12: destTmp = ((srcTmp&srcMask) >>srcBitCount)
movs r12, r11, lsr r4
cmpeq r8, #0
beq %f4
3 ldr r11, [sp, #0] ; destTmp += destOffset
add r12, r12, r11
4 orr r14, r14, r12, lsl r3 ; destBak |= destTmp << destBitCount
add r3, r3, r2 ; destBitCount += destBitNum
cmp r3, #0x20 ; if (destBitCount >= 32)
blt %f5
str r14, [r1], #4 ; *destp++ = destBak
mov r14, #0 ; destBak = 0
mov r3, #0 ; destBitCount = 0
5 mov r5, r5, lsl r6 ; srcMask <<= srcBitNum
add r4, r4, r6 ; srcBitCount += srcBitNum
b %b2
6 add sp, sp, #8
ldmfd sp!, {r4-r12, lr}
bx lr
; ENDIF
;--------------------------------------------------------------------
; データ展開8Bit→8Bit(r0=srcp, r1=destp)
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL UnCompLZ77Byte
ALIGN
CODE32
UnCompLZ77Byte
stmfd sp!, {r4-r6, lr}
ldr r5, [r0], #4 ; r2: destCount = *(u32 *)srcp >> 8
mov r2, r5, lsr #8 ; r0: srcp += 4
; movs r12, r2 ; r12: srcCount
; bl CheckSrcp ; ソースアドレス チェック
; beq %f6
1 cmp r2, #0 ; while (destCount > 0)
ble %f6
ldrb r14, [r0], #1 ; r14: flags = *srcp++
mov r4, #8 ; for (i=8; --i>=0; )
2 subs r4, r4, #1
blt %b1
tst r14, #0x80 ; if (!(flags & 0x80))
bne %f3
ldrb r6, [r0], #1 ; *srcp++
swpb r6, r6, [r1] ; r1: *destp++(バイト書き込み対策)
add r1, r1, #1
sub r2, r2, #1 ; destCount--
b %f5
3 ldrb r5, [r0, #0] ; r3: length = (*srcp >> 4) + 3
mov r6, #3
add r3, r6, r5, asr #4
ldrb r6, [r0], #1 ; r12: offset = (*srcp++ & 0x0f) << 8
and r5, r6, #0xf
mov r12,r5, lsl #8
ldrb r6, [r0], #1 ; offset = (offset | *srcp++) + 1
orr r5, r6, r12
add r12, r5, #1
sub r2, r2, r3 ; destCount -= length
4 ldrb r5, [r1, -r12] ; *destp++ = destp[-offset]
swpb r5, r5, [r1] ; (バイト書き込み対策)
add r1, r1, #1
subs r3, r3, #1 ; while (--length > 0)
bgt %b4
5 cmp r2, #0 ; if (destCount <= 0) break;
movgt r14, r14, lsl #1 ; flags <<= 1
bgt %b2
b %b1
6 ldmfd sp!, {r4-r6, lr}
bx lr
; ENDIF
;--------------------------------------------------------------------
; ランレングスデータ展開8Bit→8Bit(r0=srcp, r1=destp)
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL UnCompRLByte
CODE16
UnCompRLByte
push {r7, lr} ; r7 はアライメント調整用
push {r4-r7}
ldmia r0!, {r3} ; r7: destCount = *(u32 *)srcp >> 8
lsr r7, r3, #8 ; r0: srcp += 4
; mov r4, r7 ; r4: count
; bl CheckSrcp16_32 ; ソースアドレス チェック
; beq %f5
1 cmp r7, #0 ; while (destCount > 0)
ble %f5
ldrb r4, [r0, #0] ; r4: flags = *srcp++
add r0, #1
lsl r2, r4, #25 ; r2: length = flags & 0x7f
lsr r2, #25
lsr r3, r4, #8 ; if (!(flags & 0x80))
bcs %f3
add r2, #1 ; length++
sub r7, r2 ; destCount -= length
2 ldrb r3, [r0, #0] ; *destp++ = *srcp++
strb r3, [r1, #0]
add r0, #1
add r1, #1
sub r2, r2, #1 ; while (--length > 0)
bgt %b2
b %b1
3 add r2, #3 ; length += 3
sub r7, r2 ; destCount -= length
ldrb r5, [r0, #0] ; srcTmp = *srcp++
add r0, #1
4 strb r5, [r1, #0] ; *destp++ = srcTmp
add r1, #1
sub r2, r2, #1 ; while (--length > 0)
bgt %b4
b %b1
5 pop {r4-r7}
pop {r2, r3}
bx r3
; ENDIF
;--------------------------------------------------------------------
; 差分フィルタ展開8Bit→8Bit (r0=srcp, r1=destp)
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL UnDiffByte2Byte
CODE16
UnDiffByte2Byte
push {r4, lr}
push {r4, r5} ; アライメント調整用
ldmia r0!, {r4} ; r4: destCount = *(u32 *)srcp >> 8
lsr r4, r4, #8 ; r0: srcp += 4
; bl CheckSrcp16_32 ; ソースアドレス チェック
; beq %f2
ldrb r2, [r0, #0] ; r2: destTmp = *srcp++
add r0, #1
strb r2, [r1, #0] ; r1: *destp++ = destTmp
add r1, #1
1 sub r4, r4, #1 ; while (--destCount > 0)
ble %f2
ldrb r3, [r0, #0] ; destTmp += *srcp++
add r2, r3, r2
add r0, #1
strb r2, [r1, #0] ; *destp++ = destTmp
add r1, #1
b %b1
2 pop {r4, r5}
pop {r2, r3}
bx r3
; ENDIF
;--------------------------------------------------------------------
; 差分フィルタ展開16Bit→16Bit (r0=srcp, r1=destp)
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL UnDiffShort2Short
CODE16
UnDiffShort2Short
push {r4, lr}
push {r4, r5} ; アライメント調整用
ldmia r0!, {r4} ; r4: destCount = *(u32 *)srcp >> 8
lsr r4, r4, #8 ; r0: srcp += 2
; bl CheckSrcp16_32 ; ソースアドレス チェック
; beq %f2
ldrh r2, [r0, #0] ; r2: destTmp = *srcp++
add r0, #2
strh r2, [r1, #0] ; r1: *destp++ = destTmp
add r1, #2
1 sub r4, r4, #2 ; while ((destCount-=2) > 0)
ble %f2
ldrh r3, [r0, #0] ; destTmp += *srcp++
add r2, r3, r2
add r0, #2
strh r2, [r1, #0] ; *destp++ = destTmp
add r1, #2
b %b1
2 pop {r4, r5}
pop {r2, r3}
bx r3
; ENDIF
;--------------------------------------------------------------------
; r3レジスタによるルーチン呼び出し
;--------------------------------------------------------------------
GLOBAL __call_via_r3
CODE16
__call_via_r3 bx r3
;--------------------------------------------------------------------
; r2レジスタによるルーチン呼び出し
;--------------------------------------------------------------------
GLOBAL __call_via_r2
CODE16
__call_via_r2 bx r2
;--------------------------------------------------------------------
; r1レジスタによるルーチン呼び出し
;--------------------------------------------------------------------
GLOBAL __call_via_r1
CODE16
__call_via_r1 bx r1
END

View File

@ -0,0 +1,39 @@
//======================================================================
// Iris.h
// IRIS •W<E280A2>€ƒwƒbƒ_ƒtƒ@ƒCƒŒQ
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_H
#define _IRIS_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTypes.h>
#include <IrisDefine.h>
#include <IrisMemoryMap.h>
#include <IrisMacro.h>
#include <IrisSystemCall.h>
#include <IrisOS.h>
#include <IrisUTL.h>
#include <IrisVEC.h>
#include <IrisQUAT.h>
#include <IrisGX.h>
#include <IrisGXB.h>
#include <IrisGXC.h>
#include <IrisGX_Primitive.h>
#include <IrisGXB_Primitive.h>
#include <IrisMTX.h>
#include <IrisSinTable.h>
#include <Iris2D.h>
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_H

View File

@ -0,0 +1,89 @@
//====================================================================
// Iris2D.h
// 2Dアフィン変換ライブラリ
//
// Copyright (C) 2003 NINTENDO Co.,Ltd.
//====================================================================
#ifndef _IRIS_2D_H
#define _IRIS_2D_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTarget.h>
#include <IrisTypes.h>
//----------------------------------------------------------------------
// BGアフィン変換 セット
//
//・BGのアフィンパラメータを算出し、セットします。
//
//・引数:
// BgAffineSrcData *srcp ソースアドレス
// BgAffineDestData *destp デスティネーションアドレス
// s32 num 計算回数
//
//・BgAffineSrcData構造体
// s32 srcCenterX 元データ中心座標小数点以下8bit
// s32 srcCenterY
// s16 dispCenterX 表示中心座標
// s16 dispCenterY
// s16 ratioX 拡大縮小率逆数小数点以下8bit
// s16 ratioY
// s16 theta 回転角小数点以下8bit
//
//・BgAffineDestData構造体
// s16 h_diffX ライン方向X座標差分
// s16 v_diffX 垂直方向X座標差分
// s16 h_diffY ライン方向Y座標差分
// s16 v_diffY 垂直方向Y座標差分
// s32 startX スタートX座標
// s32 startY スタートY座標
//
//・戻り値:なし
//----------------------------------------------------------------------
void BG_SetAffine(const BgAffineSrcData *srcp, BgAffineDestData *destp, s32 num);
//----------------------------------------------------------------------
// OBJアフィン変換 セット
//
//・OBJのアフィンパラメータを算出し、セットします。
//
//・引数:
// ObjAffineSrcData *srcp ソースアドレス
// void *destp デスティネーションアドレス
// s32 num 計算回数
// s32 offset パラメータアドレスのオフセット・バイト数(通常 2|8
// OAMに直接セットする場合は"8"を指定
//
//・ObjAffineSrcData構造体
// s16 ratioX 拡大縮小率逆数小数点以下8bit
// s16 ratioY
// s16 theta 回転角小数点以下8bit
//
//・ObjAffineDestData構造体
// s16 h_diffX ライン方向X座標差分
// s16 v_diffX 垂直方向X座標差分
// s16 h_diffY ライン方向Y座標差分
// s16 v_diffY 垂直方向Y座標差分
//
//・戻り値:なし
//----------------------------------------------------------------------
void OBJ_SetAffine(const ObjAffineSrcData *srcp, void *destp, s32 num, s32 offset);
#ifdef __cplusplus
}
#endif
#endif // _IRIS_2D_H

View File

@ -0,0 +1,34 @@
;=====================================================================
; Iris2D_Arm.s
; 2Dアフィン変換ライブラリARMASM用
;
; Copyright (C) 2003 NINTENDO Co.,Ltd.
;=====================================================================
IF :DEF: _IRIS_2D_H
ELSE
_IRIS_2D_H * 1
INCLUDE IrisTargetArm.s
;-----------------------------------------------------------------------
; BGアフィン変換パラメータ セット
;-----------------------------------------------------------------------
EXTERN BG_SetAffine
;-----------------------------------------------------------------------
; OBJアフィン変換 セット
;-----------------------------------------------------------------------
EXTERN OBJ_SetAffine
ENDIF ; _IRIS_2D_H
END

View File

@ -0,0 +1,28 @@
;=====================================================================
; Iris2D_Mw.s
; 2Dアフィン変換ライブラリARMASM用
;
; Copyright (C) 2003 NINTENDO Co.,Ltd.
;=====================================================================
#ifndef _IRIS_2D_H
#define _IRIS_2D_H
.INCLUDE IrisTarget.h
;-----------------------------------------------------------------------
; BGアフィン変換パラメータ セット
;-----------------------------------------------------------------------
.EXTERN BG_SetAffine
;-----------------------------------------------------------------------
; OBJアフィン変換 セット
;-----------------------------------------------------------------------
.EXTERN OBJ_SetAffine
#endif // _IRIS_2D_H

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,262 @@
//====================================================================
// IrisGXB_Primitive.h
// IRISプリミティブ描画ディスプレイリストをバッファへ生成
//
// Copyright (C) 2003 NINTENDO Co.,Ltd.
//====================================================================
#ifndef _IRIS_GXB_PRIMITIVE_H
#define _IRIS_GXB_PRIMITIVE_H
#include <IrisTarget.h>
#include <IrisTypes.h>
#include <IrisGX_Primitive.h>
#ifdef __cplusplus
extern "C" {
#endif
//----------------------------------------------------------------------
// 立方体の描画
//
//・立方体を描画します。
//
//・引数:
// bufp ディスプレイリストバッファのポインタ
// width 一辺の長さ
// texParamp テクスチャパラメータへのポインタ
// フォーマットはPrimTexParam構造体を参照して下さい
//
//・戻り値: なし
//----------------------------------------------------------------------
#define GXB_DrawCube(bufp, width, texParamp) \
\
((bufp) = _GXB_DrawCube(bufp, width, texParamp))
u32 *_GXB_DrawCube(u32 *bufp, u16 width, const u32 (* texParamp)[4]);
//----------------------------------------------------------------------
// 直方体の描画
//
//・直方体を描画します。
//
//・引数:
// bufp ディスプレイリストバッファのポインタ
// width 幅
// height 高さ
// depth 奥行き
// texParamp テクスチャパラメータへのポインタ
// フォーマットはPrimTexParam構造体を参照して下さい
//
//・戻り値: なし
//----------------------------------------------------------------------
#define GXB_DrawBox(bufp, width, height, depth, texParamp) \
\
((bufp) = _GXB_DrawBox(bufp, width, height, depth, texParamp))
u32 *_GXB_DrawBox(u32 *bufp, u16 width, u16 height, u16 depth, const u32 (* texParamp)[4]);
//----------------------------------------------------------------------
// 球の描画
//
//・球を描画します。
//
//・引数:
// bufp ディスプレイリストバッファのポインタ
// radius 半径
// numMajor 緯度(latitude)の分割数
// numMinor 経度(longitude)の分割数
// texParamp テクスチャパラメータへのポインタ
// フォーマットはPrimTexParam構造体を参照して下さい
//
//・戻り値: なし
//----------------------------------------------------------------------
#define GXB_DrawSphere(bufp, radius, numMajor, numMinor, texParamp) \
\
((bufp) = _GXB_DrawSphere(bufp, radius, numMajor, numMinor, texParamp))
u32 *_GXB_DrawSphere(u32 *bufp, s16 radius, s16 numMajor, s16 numMinor, const u32 (* texParamp)[4]);
//----------------------------------------------------------------------
// 正二十面体を再帰的に分割した球の描画
//
//・正二十面体を再帰的に分割した球を描画します。
//
//・引数:
// bufp ディスプレイリストバッファのポインタ
// radius 半径
// numLevel 細分のレベル数
//
//・戻り値: なし
//
//※平方根演算器と除算器を使用するため、TCM上で実行したとしても
// DMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXB_DrawSphereHedron(bufp, radius, numLevel) \
\
((bufp) = _GXB_DrawSphereHedron(bufp, radius, numLevel))
u32 *_GXB_DrawSphereHedron(u32 *bufp, s16 radius, s16 numLevel);
//----------------------------------------------------------------------
// 円柱の描画
//
//・円柱を描画します。
//
//・引数:
// bufp ディスプレイリストバッファのポインタ
// radius 半径
// height 高さ
// numEdges 円周の分割数
// texParamp テクスチャパラメータへのポインタ
// フォーマットはPrimTexParam構造体を参照して下さい
//
//・戻り値: なし
//----------------------------------------------------------------------
#define GXB_DrawCylinder(bufp, radius, height, numEdges, texParamp) \
\
((bufp) = _GXB_DrawCylinder(bufp, radius, height, numEdges, texParamp))
u32 *_GXB_DrawCylinder(u32 *bufp, s16 radius, u16 height, s16 numEdges, const u32 (* texParamp)[4]);
//----------------------------------------------------------------------
// 円錐の描画
//
//・円錐を描画します。
//
//・引数:
// bufp ディスプレイリストバッファのポインタ
// radius 底面の半径
// height 高さ
// numEdges 円周の分割数
// texParamp テクスチャパラメータへのポインタ
// フォーマットはPrimTexParam構造体を参照して下さい
//
//・戻り値: なし
//
//※平方根演算器と除算器を使用するため、TCM上で実行したとしても
// DMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXB_DrawCone(bufp, radius, height, numEdges, texParamp) \
\
((bufp) = _GXB_DrawCone(bufp, radius, height, numEdges, texParamp))
u32 *_GXB_DrawCone(u32 *bufp, s16 radius, u16 height, s16 numEdges, const u32 (* texParamp)[4]);
//----------------------------------------------------------------------
// トーラス(円環)の描画
//
//・トーラス(円環)を描画します。
//
//・引数:
// bufp ディスプレイリストバッファのポインタ
// size トーラスの中心から回転される円の中心までの距離
// rc sizeと回転される円の半径の比率
// numc 回転される円の分割数
// numt 軸回転による円の分割数
// texParamp テクスチャパラメータへのポインタ
// フォーマットはPrimTexParam構造体を参照して下さい
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXB_DrawTorus(bufp, size, rc, numc, numt, texParamp) \
\
((bufp) = _GXB_DrawTorus(bufp, size, rc, numc, numt, texParamp))
u32 *_GXB_DrawTorus(u32 *bufp, s16 size, s16 rc, s16 numc, s16 numt, const u32 (* texParamp)[4]);
//----------------------------------------------------------------------
// 正八面体の描画
//
//・正八面体を描画します。
//
//・引数:
// bufp ディスプレイリストバッファのポインタ
// radius 半径
//
//・戻り値:なし
//
//※平方根演算器と除算器を使用するため、TCM上で実行したとしても
// DMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXB_Draw8Hedron(bufp, radius) \
\
((bufp) = _GXB_Draw8Hedron(bufp, radius))
u32 *_GXB_Draw8Hedron(u32 *bufp, s16 radius);
//----------------------------------------------------------------------
// 正十二面体の描画
//
//・正十二面体を描画します。
//
//・引数:
// bufp ディスプレイリストバッファのポインタ
// radius 半径
//
//・戻り値:なし
//
//※平方根演算器と除算器を使用するため、TCM上で実行したとしても
// DMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXB_Draw12Hedron(bufp, radius) \
\
((bufp) = _GXB_Draw12Hedron(bufp, radius))
u32 *_GXB_Draw12Hedron(u32 *bufp, s16 radius);
//----------------------------------------------------------------------
// 正二十面体の描画
//
//・正二十面体を描画します。
//
//・引数:
// bufp ディスプレイリストバッファのポインタ
// radius 半径
//
//・戻り値:なし
//
//※平方根演算器と除算器を使用するため、TCM上で実行したとしても
// DMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXB_Draw20Hedron(bufp, radius) \
\
((bufp) = _GXB_Draw20Hedron(bufp, radius))
u32 *_GXB_Draw20Hedron(u32 *bufp, s16 radius);
#ifdef __cplusplus
}
#endif
#endif // _IRIS_GXB_PRIMITIVE_H

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,232 @@
//====================================================================
// IrisGX_Primitive.h
// IRISプリミティブ描画ディスプレイリスト生成
//
// Copyright (C) 2003 NINTENDO Co.,Ltd.
//====================================================================
#ifndef _IRIS_GX_PRIMITIVE_H
#define _IRIS_GX_PRIMITIVE_H
#include <IrisTarget.h>
#include <IrisTypes.h>
#ifdef __cplusplus
extern "C" {
#endif
// プリミティブ描画関数用テクスチャパラメータ構造体
typedef struct {
TexImageParamCnt img; // テクスチャイメージコマンドのパラメータ
TexPlttBaseCnt plt; // テクスチャパレットベースコマンドのパラメータ
TexCoord texStart; // テクスチャスタート座標
TexCoord texEnd; // テクスチャエンド座標
} PrimTexParam;
//----------------------------------------------------------------------
// 立方体の描画
//
//・立方体を描画します。
//
//・引数:
// width 一辺の長さ
// texParamp テクスチャパラメータへのポインタ
// フォーマットはPrimTexParam構造体を参照して下さい
//
//・戻り値: なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_DrawCube(u16 width, const u32 (* texParamp)[4]);
//----------------------------------------------------------------------
// 直方体の描画
//
//・直方体を描画します。
// texParamp テクスチャパラメータへのポインタ
// フォーマットはPrimTexParam構造体を参照して下さい
//
//・引数:
// width 幅
// height 高さ
// depth 奥行き
//
//・戻り値: なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_DrawBox(u16 width, u16 height, u16 depth, const u32 (* texParamp)[4]);
//----------------------------------------------------------------------
// 球の描画
//
//・球を描画します。
//
//・引数:
// radius 半径
// numMajor 緯度(latitude)の分割数
// numMinor 経度(longitude)の分割数
// texParamp テクスチャパラメータへのポインタ
// フォーマットはPrimTexParam構造体を参照して下さい
//
//・戻り値: なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_DrawSphere(s16 radius, s16 numMajor, s16 numMinor, const u32 (* texParamp)[4]);
//----------------------------------------------------------------------
// 正二十面体を再帰的に分割した球の描画
//
//・正二十面体を再帰的に分割した球を描画します。
//
//・引数:
// radius 半径
// numLevel 細分のレベル数
//
//・戻り値: なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_DrawSphereHedron(s16 radius, s16 numLevel);
//----------------------------------------------------------------------
// 円柱の描画
//
//・円柱を描画します。
//
//・引数:
// radius 半径
// height 高さ
// numEdges 円周の分割数
// texParamp テクスチャパラメータへのポインタ
// フォーマットはPrimTexParam構造体を参照して下さい
//
//・戻り値: なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_DrawCylinder(s16 radius, u16 height, s16 numEdges, const u32 (* texParamp)[4]);
//----------------------------------------------------------------------
// 円錐の描画
//
//・円錐を描画します。
//
//・引数:
// radius 底面の半径
// height 高さ
// numEdges 円周の分割数
// texParamp テクスチャパラメータへのポインタ
// フォーマットはPrimTexParam構造体を参照して下さい
//
//・戻り値: なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_DrawCone(s16 radius, u16 height, s16 numEdges, const u32 (* texParamp)[4]);
//----------------------------------------------------------------------
// トーラス(円環)の描画
//
//・トーラス(円環)を描画します。
//
//・引数:
// size トーラスの中心から回転される円の中心までの距離
// rc sizeと回転される円の半径の比率
// numc 回転される円の分割数
// numt 軸回転による円の分割数
// texParamp テクスチャパラメータへのポインタ
// フォーマットはPrimTexParam構造体を参照して下さい
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_DrawTorus(s16 size, s16 rc, s16 numc, s16 numt, const u32 (* texParamp)[4]);
//----------------------------------------------------------------------
// 正八面体の描画
//
//・正八面体を描画します。
//
//・引数:
// radius 半径
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_Draw8Hedron(s16 radius);
//----------------------------------------------------------------------
// 正十二面体の描画
//
//・正十二面体を描画します。
//
//・引数:
// radius 半径
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_Draw12Hedron(s16 radius);
//----------------------------------------------------------------------
// 正二十面体の描画
//
//・正二十面体を描画します。
//
//・引数:
// radius 半径
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_Draw20Hedron(s16 radius);
#ifdef __cplusplus
}
#endif
#endif // _IRIS_GX_PRIMITIVE_H

View File

@ -0,0 +1,673 @@
//======================================================================
// IrisMTX.h
// 行列ライブラリ
//
// MTX関数は64bitの乗算を多用しますので、できるだけ
// GX関数を使用し、負荷を軽減するようにして下さい。
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_MTX_H
#define _IRIS_MTX_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTarget.h>
#include <IrisTypes.h>
#include <IrisSinTable.h>
//======================================================================
// 汎用行列
//======================================================================
//----------------------------------------------------------------------
// 単位行列の生成
//
//・dstpが指す行列へ単位行列を生成します。
//
//・引数:
// dstp 行列格納バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void MTX_Identity(Mtx *dstp);
void MTX33_Identity(Mtx33 *dstp);
void MTX44_Identity(Mtx44 *dstp);
//----------------------------------------------------------------------
// 行列のコピー
//
//・srcpが指す行列をdstpが指す行列へコピーします。
//
//・引数:
// srcp 転送元行列のポインタ
// dstp 転送先行列バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
// 4x3行列を指定行列へコピー
void MTX_Copy( const Mtx *srcp, Mtx *dstp);
void MTX_Copy2Mtx33(const Mtx *srcp, Mtx33 *dstp);
void MTX_Copy2Mtx44(const Mtx *srcp, Mtx44 *dstp);
// 3x3行列を指定行列へコピー
void MTX33_Copy( const Mtx33 *srcp, Mtx33 *dstp);
void MTX33_Copy2Mtx( const Mtx33 *srcp, Mtx *dstp);
void MTX33_Copy2Mtx44(const Mtx33 *srcp, Mtx44 *dstp);
// 4x4行列を指定行列へコピー
void MTX44_Copy( const Mtx44 *srcp, Mtx44 *dstp);
void MTX44_Copy2Mtx( const Mtx44 *srcp, Mtx *dstp);
void MTX44_Copy2Mtx33(const Mtx44 *srcp, Mtx33 *dstp);
//----------------------------------------------------------------------
// 行列の連結
//
//・src0pとsrc1pが指す行列の転結行列をdstpへ生成します。
//
//・引数:
// src0p 転送元行列のポインタ
// src1p 転送元行列のポインタ
// dstp 連結行列バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void MTX_Concat(Mtx *src0p, Mtx *src1p, Mtx *dstp);
void MTX33_Concat(Mtx33 *src0p, Mtx33 *src1p, Mtx33 *dstp);
void MTX44_Concat(Mtx44 *src0p, Mtx44 *src1p, Mtx44 *dstp);
//----------------------------------------------------------------------
// 転置行列の生成
//
//・srcpが指す行列の転置行列をdstpが指す行列へ生成します。
//
//・引数:
// srcp 転置前行列のポインタ
// dstp 生成行列バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void MTX_Transpose( Mtx *srcp, Mtx *dstp);
void MTX33_Transpose( Mtx33 *srcp, Mtx33 *dstp);
void MTX44_Transpose( Mtx44 *srcp, Mtx44 *dstp);
//======================================================================
// モデル行列
//======================================================================
//----------------------------------------------------------------------
// 平行移動行列の生成
//
//・平行移動行列をdstpが指す行列へ生成します。
//
//・引数:
// dstp 生成行列バッファのポインタ
// x X成分
// y Y成分
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
void MTX_Translate(Mtx *dstp, s32 x, s32 y, s32 z);
void MTX44_Translate(Mtx44 *dstp, s32 x, s32 y, s32 z);
//----------------------------------------------------------------------
// 平行移動行列を前方から適用
//
//・srcpが指す行列に平行移動行列を前方から適用した行列を
// dstpが指す行列へ生成します。
//
//・引数:
// srcp 適用行列のポインタ
// dstp 生成行列バッファのポインタ
// x X成分
// y Y成分
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
void MTX_TranslateBefore(Mtx *srcp, Mtx *dstp, s32 x, s32 y, s32 z);
void MTX44_TranslateBefore(Mtx44 *srcp, Mtx44 *dstp, s32 x, s32 y, s32 z);
//----------------------------------------------------------------------
// 平行移動行列を後方から適用
//
//・srcpが指す行列に平行移動行列を後方から適用した行列を
// dstpが指す行列へ生成します。
//
//・引数:
// srcp 適用行列のポインタ
// dstp 生成行列バッファのポインタ
// x X成分
// y Y成分
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
void MTX_TranslateAfter(Mtx *srcp, Mtx *dstp, s32 x, s32 y, s32 z);
void MTX44_TranslateAfter(Mtx44 *srcp, Mtx44 *dstp, s32 x, s32 y, s32 z);
//----------------------------------------------------------------------
// スケール行列の生成
//
//・スケール行列をdstpが指す行列へ生成します。
//
//・引数:
// dstp 生成行列バッファのポインタ
// x X成分
// y Y成分
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
void MTX_Scale(Mtx *dstp, s32 xS, s32 yS, s32 zS);
void MTX33_Scale(Mtx33 *dstp, s32 xS, s32 yS, s32 zS);
void MTX44_Scale(Mtx44 *dstp, s32 xS, s32 yS, s32 zS);
//----------------------------------------------------------------------
// スケール行列を前方から適用
//
//・srcpが指す行列にスケール行列を前方から適用した行列を
// dstpが指す行列へ生成します。
//
//・引数:
// srcp 適用行列のポインタ
// dstp 生成行列バッファのポインタ
// x X成分
// y Y成分
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
void MTX_ScaleBefore(Mtx *srcp, Mtx *dstp, s32 xS, s32 yS, s32 zS);
void MTX33_ScaleBefore(Mtx33 *srcp, Mtx33 *dstp, s32 xS, s32 yS, s32 zS);
void MTX44_ScaleBefore(Mtx44 *srcp, Mtx44 *dstp, s32 xS, s32 yS, s32 zS);
//----------------------------------------------------------------------
// スケール行列を後方から適用
//
//・srcpが指す行列にスケール行列を後方から適用した行列を
// dstpが指す行列へ生成します。
//
//・引数:
// srcp 適用行列のポインタ
// dstp 生成行列バッファのポインタ
// x X成分
// y Y成分
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
void MTX_ScaleAfter(Mtx *srcp, Mtx *dstp, s32 xS, s32 yS, s32 zS);
void MTX33_ScaleAfter(Mtx33 *srcp, Mtx33 *dstp, s32 xS, s32 yS, s32 zS);
void MTX44_ScaleAfter(Mtx44 *srcp, Mtx44 *dstp, s32 xS, s32 yS, s32 zS);
//----------------------------------------------------------------------
//
// 主軸回転行列の生成
//
//・主軸回転行列をdstpが指す行列へ生成します。
//
//・引数:
// dstp 生成行列バッファのポインタ
// theta 回転角度25610244096段階
//
//・戻り値:なし
//----------------------------------------------------------------------
#define MTX_RotateX(dstp, theta) MTXxx_RotatePriv(_, X, SIN_NDIV_DEFAULT, dstp, theta)
#define MTX_RotateY(dstp, theta) MTXxx_RotatePriv(_, Y, SIN_NDIV_DEFAULT, dstp, theta)
#define MTX_RotateZ(dstp, theta) MTXxx_RotatePriv(_, Z, SIN_NDIV_DEFAULT, dstp, theta)
#define MTX33_RotateX(dstp, theta) MTXxx_RotatePriv(33_, X, SIN_NDIV_DEFAULT, dstp, theta)
#define MTX33_RotateY(dstp, theta) MTXxx_RotatePriv(33_, Y, SIN_NDIV_DEFAULT, dstp, theta)
#define MTX33_RotateZ(dstp, theta) MTXxx_RotatePriv(33_, Z, SIN_NDIV_DEFAULT, dstp, theta)
#define MTX44_RotateX(dstp, theta) MTXxx_RotatePriv(44_, X, SIN_NDIV_DEFAULT, dstp, theta)
#define MTX44_RotateY(dstp, theta) MTXxx_RotatePriv(44_, Y, SIN_NDIV_DEFAULT, dstp, theta)
#define MTX44_RotateZ(dstp, theta) MTXxx_RotatePriv(44_, Z, SIN_NDIV_DEFAULT, dstp, theta)
void MTX_RotateX256(Mtx *dstp, u32 theta);
void MTX_RotateY256(Mtx *dstp, u32 theta);
void MTX_RotateZ256(Mtx *dstp, u32 theta);
void MTX_RotateX1024(Mtx *dstp, u32 theta);
void MTX_RotateY1024(Mtx *dstp, u32 theta);
void MTX_RotateZ1024(Mtx *dstp, u32 theta);
void MTX_RotateX4096(Mtx *dstp, u32 theta);
void MTX_RotateY4096(Mtx *dstp, u32 theta);
void MTX_RotateZ4096(Mtx *dstp, u32 theta);
void MTX33_RotateX256(Mtx33 *dstp, u32 theta);
void MTX33_RotateY256(Mtx33 *dstp, u32 theta);
void MTX33_RotateZ256(Mtx33 *dstp, u32 theta);
void MTX33_RotateX1024(Mtx33 *dstp, u32 theta);
void MTX33_RotateY1024(Mtx33 *dstp, u32 theta);
void MTX33_RotateZ1024(Mtx33 *dstp, u32 theta);
void MTX33_RotateX4096(Mtx33 *dstp, u32 theta);
void MTX33_RotateY4096(Mtx33 *dstp, u32 theta);
void MTX33_RotateZ4096(Mtx33 *dstp, u32 theta);
void MTX44_RotateX256(Mtx44 *dstp, u32 theta);
void MTX44_RotateY256(Mtx44 *dstp, u32 theta);
void MTX44_RotateZ256(Mtx44 *dstp, u32 theta);
void MTX44_RotateX1024(Mtx44 *dstp, u32 theta);
void MTX44_RotateY1024(Mtx44 *dstp, u32 theta);
void MTX44_RotateZ1024(Mtx44 *dstp, u32 theta);
void MTX44_RotateX4096(Mtx44 *dstp, u32 theta);
void MTX44_RotateY4096(Mtx44 *dstp, u32 theta);
void MTX44_RotateZ4096(Mtx44 *dstp, u32 theta);
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define MTXxx_RotatePriv(xx_, axis, ndiv, dstp, theta) MTXxx_RotateNDiv(xx_, axis, ndiv, dstp, theta)
#define MTXxx_RotateNDiv(xx_, axis, ndiv, dstp, theta) MTX##xx_##Rotate##axis##ndiv( dstp, theta)
//----------------------------------------------------------------------
// 主軸回転行列(三角関数による回転角指定)の生成
//
//・主軸回転行列をdstpが指す行列へ生成します。
//・回転角度はサインとコサインにて指定します。
//
//・引数:
// dstp 生成行列バッファのポインタ
// sinA 回転角度のサイン
// cosA 回転角度のコサイン
//
//・戻り値:なし
//----------------------------------------------------------------------
void MTX_RotateXSinCos(Mtx *dstp, s32 sinA, s32 cosA);
void MTX_RotateYSinCos(Mtx *dstp, s32 sinA, s32 cosA);
void MTX_RotateZSinCos(Mtx *dstp, s32 sinA, s32 cosA);
void MTX33_RotateXSinCos(Mtx33 *dstp, s32 sinA, s32 cosA);
void MTX33_RotateYSinCos(Mtx33 *dstp, s32 sinA, s32 cosA);
void MTX33_RotateZSinCos(Mtx33 *dstp, s32 sinA, s32 cosA);
void MTX44_RotateXSinCos(Mtx44 *dstp, s32 sinA, s32 cosA);
void MTX44_RotateYSinCos(Mtx44 *dstp, s32 sinA, s32 cosA);
void MTX44_RotateZSinCos(Mtx44 *dstp, s32 sinA, s32 cosA);
//----------------------------------------------------------------------
// 任意軸回転行列の生成
//
//・任意軸回転行列をdstpが指す行列へ生成します。
//
//・通常版は平方根演算器と除算器を使用しますが、高速版は使用しません
// (高速版には単位ベクトルを渡して下さい)。
//
//・引数:
// dstp 生成行列バッファのポインタ
// axisp 回転軸ベクトルのポインタ
// theta 回転角度25610244096段階
//
//・戻り値:なし
//
//※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
#define MTX_RotateAxis( dstp, axisp, heta) MTXxx_RotateAxisPriv( _, SIN_NDIV_DEFAULT, dstp, axisp, theta)
#define MTX_RotateAxisFast(dstp, axisp, theta) MTXxx_RotateAxisPrivFast(_, SIN_NDIV_DEFAULT, dstp, axisp, theta)
#define MTX33_RotateAxis( dstp, axisp, heta) MTXxx_RotateAxisPriv( 33_, SIN_NDIV_DEFAULT, dstp, axisp, theta)
#define MTX33_RotateAxisFast(dstp, axisp, theta) MTXxx_RotateAxisPrivFast(33_, SIN_NDIV_DEFAULT, dstp, axisp, theta)
#define MTX44_RotateAxis( dstp, axisp, heta) MTXxx_RotateAxisPriv( 44_, SIN_NDIV_DEFAULT, dstp, axisp, theta)
#define MTX44_RotateAxisFast(dstp, axisp, theta) MTXxx_RotateAxisPrivFast(44_, SIN_NDIV_DEFAULT, dstp, axisp, theta)
void MTX_RotateAxis256(Mtx *dstp, const Vec *axisp, u32 theta);
void MTX_RotateAxis256Fast(Mtx *dstp, const Vec *axisp, u32 theta);
void MTX_RotateAxis1024(Mtx *dstp, const Vec *axisp, u32 theta);
void MTX_RotateAxis1024Fast(Mtx *dstp, const Vec *axisp, u32 theta);
void MTX_RotateAxis4096(Mtx *dstp, const Vec *axisp, u32 theta);
void MTX_RotateAxis4096Fast(Mtx *dstp, const Vec *axisp, u32 theta);
void MTX33_RotateAxis256(Mtx33 *dstp, const Vec *axisp, u32 theta);
void MTX33_RotateAxis256Fast(Mtx33 *dstp, const Vec *axisp, u32 theta);
void MTX33_RotateAxis1024(Mtx33 *dstp, const Vec *axisp, u32 theta);
void MTX33_RotateAxis1024Fast(Mtx33 *dstp, const Vec *axisp, u32 theta);
void MTX33_RotateAxis4096(Mtx33 *dstp, const Vec *axisp, u32 theta);
void MTX33_RotateAxis4096Fast(Mtx33 *dstp, const Vec *axisp, u32 theta);
void MTX44_RotateAxis256(Mtx44 *dstp, const Vec *axisp, u32 theta);
void MTX44_RotateAxis256Fast(Mtx44 *dstp, const Vec *axisp, u32 theta);
void MTX44_RotateAxis1024(Mtx44 *dstp, const Vec *axisp, u32 theta);
void MTX44_RotateAxis1024Fast(Mtx44 *dstp, const Vec *axisp, u32 theta);
void MTX44_RotateAxis4096(Mtx44 *dstp, const Vec *axisp, u32 theta);
void MTX44_RotateAxis4096Fast(Mtx44 *dstp, const Vec *axisp, u32 theta);
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define MTXxx_RotateAxisPriv( xx_, ndiv, dstp, axisp, theta) MTXxx_RotateAxisNDiv( xx_, ndiv, dstp, axisp, theta)
#define MTXxx_RotateAxisPrivFast(xx_, ndiv, dstp, axisp, theta) MTXxx_RotateAxisNDivFast(xx_, ndiv, dstp, axisp, theta)
#define MTXxx_RotateAxisNDiv( xx_, ndiv, dstp, axisp, theta) MTX##xx_##RotateAxis##ndiv( dstp, axisp, theta)
#define MTXxx_RotateAxisNDivFast(xx_, ndiv, dstp, axisp, theta) MTX##xx_##RotateAxis##ndiv##Fast( dstp, axisp, theta)
//----------------------------------------------------------------------
// 任意軸回転行列(三角関数による回転角指定)の生成
//
//・任意軸回転行列をdstpが指す行列へ生成します。
//・回転角度はサインとコサインにて指定します。
//
//・通常版は平方根演算器と除算器を使用しますが、高速版は使用しません
// (高速版には単位ベクトルを渡して下さい)。
//
//・引数:
// dstp 生成行列バッファのポインタ
// axisp 回転軸ベクトルのポインタ
// sinA 回転角度のサイン
// cosA 回転角度のコサイン
//
//・戻り値:なし
//
//※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
void MTX_RotateAxisSinCos(Mtx *dstp, const Vec *axisp, s32 sinA, s32 cosA);
void MTX_RotateAxisSinCosFast(Mtx *dstp, const Vec *axisp, s32 sinA, s32 cosA);
void MTX33_RotateAxisSinCos(Mtx33 *dstp, const Vec *axisp, s32 sinA, s32 cosA);
void MTX33_RotateAxisSinCosFast(Mtx33 *dstp, const Vec *axisp, s32 sinA, s32 cosA);
void MTX44_RotateAxisSinCos(Mtx44 *dstp, const Vec *axisp, s32 sinA, s32 cosA);
void MTX44_RotateAxisSinCosFast(Mtx44 *dstp, const Vec *axisp, s32 sinA, s32 cosA);
//----------------------------------------------------------------------
// Z軸にアライメントする回転行列の生成
//
//・任意軸をZ軸の正方向と一致させる回転を行う行列を
// dstpが指す行列へ生成します。
//
// H = sqrt (X*X + Z*Z)
//
// [ 1 ] [ Z/H -X/H ] [ Z/H -X/H ]
// [ v ] [ H/1 -Y/1 ] [ 1 ] = [ v ] [ -YX/H H -YZ/H ]
// [ Y/1 H/1 ] [ X/H Z/H ] [ X Y Z ]
//
//・関数内で平方根演算器と除算器を使用します。
//
//・引数:
// dstp 生成行列バッファのポインタ
// vLookInvp 視線と逆方向の単位ベクトル(*_LookAt*() で得られます)
//
//※平方根演算器と除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
void MTX_AlignZ(Mtx *dstp, const Vec *vLookInvp);
void MTX33_AlignZ(Mtx33 *dstp, const Vec *vLookInvp);
void MTX44_AlignZ(Mtx44 *dstp, const Vec *vLookInvp);
//----------------------------------------------------------------------
// クォータニオンから変換した回転行列の生成
//
//・クォータニオンから変換した回転行列をdstpが指す行列へ生成します。
//
//・通常版は除算器を使用しますが、高速版は使用しません
// (高速版には正規化クォータニオンを渡して下さい)。
//
//・引数:
// dstp 行列格納バッファのポインタ
// quatp クォータニオンのポインタ
//
//・戻り値:なし
//
//※通常版は除算器を使用するため、ディスプレイリスト等のDMA転送と
// 並列して実行するとストールが発生する可能性があります。
//----------------------------------------------------------------------
void MTX_QuatMtx(Mtx *dstp, const Quat *quatp);
void MTX_QuatMtxFast(Mtx *dstp, const Quat *quatp);
void MTX33_QuatMtx(Mtx33 *dstp, const Quat *quatp);
void MTX33_QuatMtxFast(Mtx33 *dstp, const Quat *quatp);
void MTX44_QuatMtx(Mtx44 *dstp, const Quat *quatp);
void MTX44_QuatMtxFast(Mtx44 *dstp, const Quat *quatp);
//======================================================================
// ビュー行列
//======================================================================
//----------------------------------------------------------------------
// 視界行列の生成
//
//・視界行列をdstpが指す行列へ生成します。
//
//・関数内でベクトルの正規化のために平方根演算器と除算器を使用します。
//
//・引数:
// dstp 生成行列バッファのポインタ
// eye 視点
// at 注視点
// vUp 上方向ベクトル
// vDst 0NULLポインタ以外を渡すと、視線逆方向ベクトルを返します
//
//・戻り値:なし
//
//※平方根演算器と除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
void MTX_LookAt( Mtx *dstp, const Pos *eye, const Pos *at, const Vec *vUp, Vec *vDst);
void MTX_LookAtFast(Mtx *dstp, const Pos *eye, const Pos *at, const Vec *vUp, Vec *vDst);
//======================================================================
// 射影行列
//======================================================================
//----------------------------------------------------------------------
// 左右対称の透視射影行列の生成
//
//・左右対称の透視法視錐台の行列をdstpが指す行列へ生成します。
//
//・引数:
// dstp 生成行列バッファのポインタ
// fovy 縦方向の視野角度25610244096段階
// aspect 横方向の視野を確定する縦横比(視野の 幅/高さ)
// near 視点からnearクリップ面までの距離常に正
// far 視点からfarクリップ面までの距離 (常に正)
// scaleW クリップ座標W値のスケールパラメータ座標変換後の精度調整
//
//・戻り値:なし
//
//※除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
#define MTX44_Perspective(dstp, fovy, aspect, near, far, scaleW) MTX44_PerspectivePriv(SIN_NDIV_DEFAULT, dstp, fovy, aspect, near, far, scaleW)
void MTX44_Perspective256(Mtx44 *dstp, u32 fovy, s32 aspect, s32 near, s32 far, s32 scaleW);
void MTX44_Perspective1024(Mtx44 *dstp, u32 fovy, s32 aspect, s32 near, s32 far, s32 scaleW);
void MTX44_Perspective4096(Mtx44 *dstp, u32 fovy, s32 aspect, s32 near, s32 far, s32 scaleW);
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define MTX44_PerspectivePriv(ndiv, dstp, fovy, aspect, near, far, scaleW) MTX44_PerspectiveNDiv(ndiv, dstp, fovy, aspect, near, far, scaleW)
#define MTX44_PerspectiveNDiv(ndiv, dstp, fovy, aspect, near, far, scaleW) MTX44_Perspective##ndiv( dstp, fovy, aspect, near, far, scaleW)
//----------------------------------------------------------------------
// 左右対称の透視射影行列(三角関数による視野角指定)の生成
//
//・左右対称の透視法視錐台の行列をdstpが指す行列へ生成します。
//・回転角度はサインとコサインにて指定します。
//
//・引数:
// dstp 生成行列バッファのポインタ
// sinA 縦方向の視野角度のサイン
// cosA 縦方向の視野角度のコサイン(上位関数からの呼び出し高速化のため最後に渡す)
// aspect 横方向の視野を確定する縦横比(視野の 幅/高さ)
// near 視点からnearクリップ面までの距離常に正
// far 視点からfarクリップ面までの距離 (常に正)
// scaleW クリップ座標W値のスケールパラメータ座標変換後の精度調整
//
//・戻り値:なし
//
//※除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
void MTX44_PerspectiveSinCos(Mtx44 *dstp, s32 sinA, s32 aspect, s32 near, s32 far, s32 scaleW, s32 cosA);
//----------------------------------------------------------------------
// 透視射影行列の生成
//
//・透視法視錐台の行列をdstpが指す行列へ生成します。
//
//・引数:
// dstp 生成行列バッファのポインタ
// t nearクリップ面上辺のy座標
// b nearクリップ面下辺のy座標
// l nearクリップ面左辺のx座標
// r nearクリップ面右辺のx座標
// n 視点からnearクリップ面までの距離常に正
// f 視点からfarクリップ面までの距離 (常に正)
// scaleW クリップ座標W値のスケールパラメータ座標変換後の精度調整
//
//・戻り値:なし
//
//※除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
void MTX44_Frustum(Mtx44 *dstp, s32 t, s32 b, s32 l, s32 r, s32 n, s32 f, s32 scaleW);
//----------------------------------------------------------------------
// 正射影行列の生成
//
//・正射影の平行視体積の行列をdstpが指す行列へ生成します。
//
//・引数:
// dstp 生成行列バッファのポインタ
// t nearクリップ面上辺のy座標
// b nearクリップ面下辺のy座標
// l nearクリップ面左辺のx座標
// r nearクリップ面右辺のx座標
// n 視点からnearクリップ面までの距離正負どちらでも可
// f 視点からfarクリップ面までの距離 (正負どちらでも可)
// scaleW クリップ座標W値のスケールパラメータ座標変換後の精度調整
//
//・戻り値:なし
//
//※除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
void MTX44_Ortho( Mtx44 *dstp, s32 t, s32 b, s32 l, s32 r, s32 n, s32 f, s32 scaleW);
//======================================================================
// 行列・ベクトル乗算
//======================================================================
//----------------------------------------------------------------------
// 3Dベクトルと行列の乗算
//
//・srcpが指す3Dベクトルをmultが指す行列で座標変換した結果を
// dstpが指す3Dベクトルへ格納します。
//
//・引数:
// mult 乗算行列
// srcp 乗算前のベクトル
// dstp 乗算後のベクトル
//
//・戻り値:なし
//----------------------------------------------------------------------
void MTX_MultVec( const Mtx *mult, Vec *srcp, Vec *dstp);
void MTX33_MultVec(const Mtx33 *mult, Vec *srcp, Vec *dstp);
void MTX44_MultVec(const Mtx44 *mult, Vec *srcp, Vec *dstp);
//----------------------------------------------------------------------
// 複数の3Dベクトルと行列の乗算
//
//・srcBasepが指す3Dベクトル群をmultが指す行列で座標変換した結果を
// dstBasepが指す3Dベクトル群へ格納します。
//
//・引数:
// mult 乗算行列
// srcBasep 乗算前のベクトル
// dstBasep 乗算後のベクトル
// count 回数
//
//・戻り値:なし
//----------------------------------------------------------------------
void MTX_MultVecArray( const Mtx *mult, Vec *srcBasep, Vec *dstBasep, u32 count);
void MTX33_MultVecArray(const Mtx33 *mult, Vec *srcBasep, Vec *dstBasep, u32 count);
void MTX44_MultVecArray(const Mtx44 *mult, Vec *srcBasep, Vec *dstBasep, u32 count);
//----------------------------------------------------------------------
// 3Dベクトルと行列のスケール回転成分との乗算
//
//・srcpが指す3Dベクトルをmultが指す行列のスケール回転成分で座標変換した結果を
// dstpが指す3Dベクトルへ格納します。
//
//・引数:
// mult 乗算行列のスケール回転成分
// srcp 乗算前のベクトル
// dstp 乗算後のベクトル
//
//・戻り値:なし
//----------------------------------------------------------------------
void MTX_MultVecSR( const Mtx *mult, Vec *srcp, Vec *dstp);
void MTX44_MultVecSR(const Mtx44 *mult, Vec *srcp, Vec *dstp);
//----------------------------------------------------------------------
// 複数の3Dベクトルと行列のスケール回転成分との乗算
//
//・srcBasepが指す3Dベクトル群をmultが指す行列のスケール回転成分で座標変換した結果を
// dstBasepが指す3Dベクトル群へ格納します。
//
//・引数:
// mult 乗算行列のスケール回転成分
// srcBasep 乗算前のベクトル
// dstBasep 乗算後のベクトル
// count 回数
//
//・戻り値:なし
//----------------------------------------------------------------------
void MTX_MultVecArraySR( const Mtx *mult, Vec *srcBasep, Vec *dstBasep, u32 count);
void MTX44_MultVecArraySR(const Mtx44 *mult, Vec *srcBasep, Vec *dstBasep, u32 count);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_MTX_H

View File

@ -0,0 +1,701 @@
//======================================================================
// IrisMacro.h
// IRIS 標準マクロ関数
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_MACRO_H
#define _IRIS_MACRO_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTarget.h>
#include <IrisTypes.h>
#include <IrisDefine.h>
#include <IrisMemoryMap.h>
#include <IrisSystemCall.h>
#include <IrisUTL.h>
#include <IrisOS.h>
//----------------------------------------------------------------------
// カラー
//----------------------------------------------------------------------
#define RGB555(r, g, b) \
\
((r) << RED5_SHIFT | (g) << GREEN5_SHIFT | (b) << BLUE5_SHIFT)
#define RGBA5551(r, g, b, a) \
\
((r) << RED5_SHIFT | (g) << GREEN5_SHIFT | (b) << BLUE5_SHIFT | (a) << ALPHA1_SHIFT)
#define RGBF5551(r, g, b, flag) \
\
((r) << RED5_SHIFT | (g) << GREEN5_SHIFT | (b) << BLUE5_SHIFT | (flag) << 15)
#define RGB888(r, g, b) \
\
((r) << RED8_SHIFT | (g) << GREEN8_SHIFT | (b) << BLUE8_SHIFT)
#define RGBA8888(r, g, b, a) \
\
((r) << RED8_SHIFT | (g) << GREEN8_SHIFT | (b) << BLUE8_SHIFT | (a) << ALPHA8_SHIFT)
//----------------------------------------------------------------------
// 座標
//----------------------------------------------------------------------
#define XYZ101010(x, y, z) (((x) & X10_MASK) << X10_SHIFT \
| ((y) & X10_MASK) << Y10_SHIFT \
| ((z) & X10_MASK) << Z10_SHIFT)
#define XY1616(x, y) (((x) & X16_MASK) | (y) << Y16_SHIFT)
#define Z16(z) ((z) & X16_MASK)
#define ZW1616(z, w) (((z) & X16_MASK) | (w) << Y16_SHIFT)
#define HD1616(h, d) (((h) & X16_MASK) | (d) << Y16_SHIFT)
#define ST1616(s, t) (((s) & TEX_S_MASK ) | (t) << TEX_T_SHIFT)
//----------------------------------------------------------------------
// ライト
//----------------------------------------------------------------------
#define LIGHT_VECTOR(no, x, y, z) ((no)<<LIGHT_ID_SHIFT | XYZ101010((x), (y), (z)))
#define LIGHT_COLOR( no, r, g, b) ((no)<<LIGHT_ID_SHIFT | RGB555( (r), (g), (b)))
//----------------------------------------------------------------------
// テクスチャイメージ&パレット アドレス変換
//----------------------------------------------------------------------
// スタティックリスト用
#define ADDR_TO_TEXIMAGE_BASE(basep) (((basep) >> TEX_IMAGE_BASE_SHIFT) & TEX_IMAGE_BASE_MASK)
#define ADDR_TO_TEXPLTT_BASE(basep, mode) (((basep) >> mode##_SHIFT) & TEX_PLTT_BASE_MASK)
// リアルタイム処理用
#define Addr2TexImageBase(basep) (((u32 )(basep) >> TEX_IMAGE_BASE_SHIFT) & TEX_IMAGE_BASE_MASK)
#define Addr2TexPlttBase(basep, mode) ( (u32 )(basep) >> "\0\4\3\4\4\4\4"[mode])
//----------------------------------------------------------------------
// 除算器
//----------------------------------------------------------------------
// パラメータ設定(通常版)
#define SetDiv(numer, denom, numBits, denBits) \
{ \
*(vu32 *)REG_DIVCNT = DIV_##numBits##_##denBits##BIT_MODE; \
SetDivImm(numer, denom, numBits, denBits); \
}
// パラメータ設定(モード設定省略版)
#define SetDivImm(numer, denom, numBits, denBits) \
{ \
*(vs##numBits *)REG_DIV_NUMER = (numer); \
*(vs##denBits *)REG_DIV_DENOM = (denom); \
}
// 除算器終了待ち
#define IsDivBusy() (((vu8 *)REG_DIVCNT)[1] & (DIV_BUSY>>8))
#define WaitDiv() \
{ \
while (IsDivBusy()) ; \
}
// 結果読み出し(除算器終了未確認版)
#define DivResultImm(bits) (*(vs##bits *)REG_DIV_RESULT)
#define DivRemResultImm(bits) (*(vs##bits *)REG_DIVREM_RESULT)
// 結果読み出し(通常版)
#define DivResult(bits) DivResult##bits##()
#define DivRemResult(bits) DivRemResult##bits##()
__inline static s64 DivResult64(void)
{
WaitDiv();
return DivResultImm(64);
}
__inline static s64 DivRemResult64(void)
{
WaitDiv();
return DivRemResultImm(64);
}
__inline static s32 DivResult32(void)
{
WaitDiv();
return DivResultImm(32);
}
__inline static s32 DivRemResult32(void)
{
WaitDiv();
return DivRemResultImm(32);
}
__inline static s16 DivResult16(void)
{
WaitDiv();
return DivResultImm(16);
}
__inline static s16 DivRemResult16(void)
{
WaitDiv();
return DivRemResultImm(16);
}
__inline static s8 DivResult8(void)
{
WaitDiv();
return DivResultImm(8);
}
__inline static s8 DivRemResult8(void)
{
WaitDiv();
return DivRemResultImm(8);
}
//----------------------------------------------------------------------
// 平方根演算器
//----------------------------------------------------------------------
// パラメータ設定(通常版)
#define SetSqrt(param, bits) \
{ \
*(vu32 *)REG_SQRTCNT = SQRT_##bits##BIT_MODE; \
SetSqrtImm(param, bits); \
}
// パラメータ設定(モード設定省略版)
#define SetSqrtImm(param, bits) \
{ \
*(vu##bits *)REG_SQRT_PARAM = (param); \
}
// 平方根演算器終了待ち
#define IsSqrtBusy() (((vu8 *)REG_SQRTCNT)[1] & (SQRT_BUSY>>8))
#define WaitSqrt() \
{ \
while (IsSqrtBusy()) ; \
}
// 結果読み出し(除算器終了未確認版)
#define SqrtResultImm(bits) (*(vu##bits *)REG_SQRT_RESULT)
// 結果読み出し(通常版)
#define SqrtResult(bits) SqrtResult##bits##()
__inline static u32 SqrtResult32(void)
{
WaitSqrt();
return SqrtResultImm(32);
}
__inline static u16 SqrtResult16(void)
{
WaitSqrt();
return SqrtResultImm(16);
}
__inline static u8 SqrtResult8(void)
{
WaitSqrt();
return SqrtResultImm(8);
}
//----------------------------------------------------------------------
// データ読み込み
//----------------------------------------------------------------------
#define ReadData(readp, bit) (*(vu##bit *)(readp))
//----------------------------------------------------------------------
// データ書き込み
//----------------------------------------------------------------------
#define WriteData(writep, data, bit) \
\
(*(vu##bit *)(writep) = (data))
//----------------------------------------------------------------------
// データ コピー
//----------------------------------------------------------------------
#define CopyData(readp, writep, bit) \
\
(*(vu##bit *)(writep) = *(vu##bit *)(readp))
//----------------------------------------------------------------------
// アドレス境界整列バッファの有効化
//----------------------------------------------------------------------
#ifdef __CC_ARM
#define EnableAlignBuf(alignBuf) \
{ \
vu16 alignBufTmp = *(vu16 *)alignBuf; \
}
#else
#define EnableAlignBuf(alignBuf) ((void) 0)
#endif
//----------------------------------------------------------------------
// 割り込みアドレス セット
//----------------------------------------------------------------------
#define SetIntrAddr(intrp) \
\
(*(vu32 *)INTR_VECTOR_BUF = (vu32 )intrp)
//・割り込み処理のアドレスをセットします。
//----------------------------------------------------------------------
// セット
//----------------------------------------------------------------------
//#define SIMULATOR
#ifndef SIMULATOR
#define DmaSet(dmaNo, srcp, destp, dmaCntData) \
{ \
vu32 *dmaCntp = &((vu32 *)REG_DMA0)[dmaNo * 3]; \
dmaCntp[0] = (vu32 )(srcp); \
dmaCntp[1] = (vu32 )(destp); \
dmaCntp[2] = (vu32 )(dmaCntData); \
{u32 dummy = dmaCntp[2];} \
{u32 dummy = dmaCntp[2];} \
}
#define DmaSetAsync(dmaNo, srcp, destp, dmaCntData) \
{ \
vu32 *dmaCntp = &((vu32 *)REG_DMA0)[dmaNo * 3]; \
dmaCntp[0] = (vu32 )(srcp); \
dmaCntp[1] = (vu32 )(destp); \
dmaCntp[2] = (vu32 )(dmaCntData); \
}
#else
#define DmaSet(dmaNo, srcp, destp, dmaCntData) \
{ \
int i; \
for (i=0; i<(dmaCntData & 0x1ffff); i++) \
if ((dmaCntData) & DMA_SRC_FIX) { \
if ((dmaCntData) & DMA_32BIT_BUS) \
((vu32 *)(destp))[i] = ((vu32 *)(srcp))[0]; \
else ((vu16 *)(destp))[i] = ((vu16 *)(srcp))[0]; \
} else { \
if ((dmaCntData) & DMA_32BIT_BUS) \
((vu32 *)(destp))[i] = ((vu32 *)(srcp))[i]; \
else ((vu16 *)(destp))[i] = ((vu16 *)(srcp))[i]; \
} \
}
#define DmaSetAsync(dmaNo, srcp, destp, dmaCntData) \
DmaSet( dmaNo, srcp, destp, dmaCntData)
#endif
//・DMAコントローラにパラメータをセットします。
//・SIMULATERを定義するとCPUでシミュレートします。
// GDBでデバッグする場合などに有効です。
//・最後にDMA起動待ちのために"LDR"命令が挿入されます。
//
//・引数:
// dmaNo DMA番号
// srcp ソースアドレス
// destp デスティネーションアドレス
// dmaCntData パラメータデータ
//
//※CPU内部RAM上のプログラムにてDMAを起動すると
// その次の命令が先に実行されます。
// よって、DMA直後に転送先をCPUにて変更しようとした場合、
// 読み込み書き戻しの間にDMAが起動されてしまいますので、
// DMAの転送先のデータが意図していない値になる場合があります。
// その場合にはWaitDma()を直後に挿入して、DMAが終了したか
// どうかをチェックすると続くコードへの影響を確実に回避できます。
//----------------------------------------------------------------------
// クリア
//----------------------------------------------------------------------
#define DmaClear(dmaNo, data, destp, size, bit) \
{ \
vu32 *srcp = &((vu32 *)REG_DMA0_CLR_DATA)[dmaNo]; \
*srcp = (data); \
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_IMM | \
DMA_SRC_FIX | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8)))); \
}
#define DmaClearIf(dmaNo, data, destp, size, bit) \
{ \
vu32 *srcp = &((vu32 *)REG_DMA0_CLR_DATA)[dmaNo]; \
*srcp = (data); \
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_IMM | \
DMA_IF_ENABLE | \
DMA_SRC_FIX | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8)))); \
}
#define DmaClearArray( dmaNo, data, destp, bit) \
DmaClear( dmaNo, data, destp, sizeof(destp), bit)
#define DmaClearArrayIf(dmaNo, data, destp, bit) \
DmaClearIf( dmaNo, data, destp, sizeof(destp), bit)
//・DMAでRAMクリアします。
//・クリアデータはスタックに置かれ、それをデスティネーションへコピーします。
//・DmaClearIfDmaClearArrayIfは終了時に割り込み要求を発生します。
//・DmaClearArrayDmaClearArrayIfはデスティネーション配列全体をクリアします。
//
//・引数:
// dmaNo DMA番号
// data クリアデータ
// destp デスティネーションアドレス
// size クリアバイト数
// bit 転送ビット幅16|32
//
//
//※CPU内部RAM上のプログラムにてDMAを起動すると
// その次の命令が先に実行されます。
// よって、DMA直後に転送先をCPUにて変更しようとした場合、
// 読み込み書き戻しの間にDMAが起動されてしまいますので、
// DMAの転送先のデータが意図していない値になる場合があります。
// その場合にはWaitDma()を直後に挿入して、DMAが終了したか
// どうかをチェックすると続くコードへの影響を確実に回避できます。
//----------------------------------------------------------------------
// コピー
//----------------------------------------------------------------------
#define DmaCopy(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_IMM | \
DMA_SRC_INC | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/((bit)/8))))
#define DmaCopyIf(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_IMM | \
DMA_IF_ENABLE | \
DMA_SRC_INC | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8))))
#define DmaCopyArray( dmaNo, srcp, destp, bit) \
DmaCopy( dmaNo, srcp, destp, sizeof(srcp), bit)
#define DmaCopyArrayIf(dmaNo, srcp, destp, bit) \
DmaCopyIf( dmaNo, srcp, destp, sizeof(srcp), bit)
//・DMAでコピーします。
//・DmaCopyIfDmaCopyArrayIfは終了時に割り込み要求を発生します。
//・DmaCopyArrayDmaCopyArrayIfはソース配列全体をコピーします。
//
//・引数:
// dmaNo DMA番号
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
// bit 転送ビット幅16|32
//
//
//※CPU内部RAM上のプログラムにてDMAを起動すると
// その次の命令が先に実行されます。
// よって、DMA直後に転送先をCPUにて変更しようとした場合、
// 読み込み書き戻しの間にDMAが起動されてしまいますので、
// DMAの転送先のデータが意図していない値になる場合があります。
// その場合にはWaitDma()を直後に挿入して、DMAが終了したか
// どうかをチェックすると続くコードへの影響を確実に回避できます。
//----------------------------------------------------------------------
// HブランクDMA コピー
//----------------------------------------------------------------------
#define H_DmaCopy(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_H_BLANK | \
DMA_SRC_INC | DMA_DEST_RELOAD | \
DMA_CONTINUOUS_ON | \
DMA_##bit##BIT_BUS | ((size)/((bit)/8))))
#define H_DmaCopyIf(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_H_BLANK | \
DMA_IF_ENABLE | \
DMA_SRC_INC | DMA_DEST_RELOAD | \
DMA_CONTINUOUS_ON | \
DMA_##bit##BIT_BUS | ((size)/(bit/8))))
#define H_DmaCopyArray( dmaNo, srcp, destp, bit) \
H_DmaCopy( dmaNo, srcp, destp, sizeof(srcp), bit)
#define H_DmaCopyArrayIf(dmaNo, srcp, destp, bit) \
H_DmaCopyIf( dmaNo, srcp, destp, sizeof(srcp), bit)
//・Hブランクに同期してDMAでコピーします。
//・H_DmaCopyIfH_DmaCopyArrayIfは終了時に割り込み要求を発生します。
//・H_DmaCopyArrayH_DmaCopyArrayIfはソース配列全体をコピーします。
//
//・引数:
// dmaNo DMA番号
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
// bit 転送ビット幅16|32
//----------------------------------------------------------------------
// VブランクDMA コピー
//----------------------------------------------------------------------
#define V_DmaCopy(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_V_BLANK | \
DMA_SRC_INC | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8))))
#define V_DmaCopyIf(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_V_BLANK | \
DMA_IF_ENABLE | \
DMA_SRC_INC | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8))))
#define V_DmaCopyArray( dmaNo, srcp, destp, bit) \
V_DmaCopy( dmaNo, srcp, destp, sizeof(srcp), bit)
#define V_DmaCopyArrayIf(dmaNo, srcp, destp, bit) \
V_DmaCopyIf( dmaNo, srcp, destp, sizeof(srcp), bit)
//・Vブランクに同期してDMAでコピーします。
//・V_DmaCopyIfV_DmaCopyArrayIfは終了時に割り込み要求を発生します。
//・V_DmaCopyArrayV_DmaCopyArrayIfはソース配列全体をコピーします。
//
//・引数:
// dmaNo DMA番号
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
// bit 転送ビット幅16|32
//----------------------------------------------------------------------
// メインメモリ表示DMA
//----------------------------------------------------------------------
#define DmaDispMainmem(dmaNo, srcp) \
\
DmaSet(dmaNo, srcp, REG_DISP_WRAM_FIFO, ( \
DMA_ENABLE | DMA_TIMMING_DISP_MMEM | \
DMA_SRC_INC | DMA_DEST_FIX | \
DMA_CONTINUOUS_ON | \
DMA_32BIT_BUS | (4)))
//・メインメモリ上のイメージを表示するDMA転送を行います。
//
//・引数:
// dmaNo DMA番号
// srcp ソースアドレス
//----------------------------------------------------------------------
// ジオメトリFIFO-DMA
//----------------------------------------------------------------------
#define GX_Dma(dmaNo, srcp, length) \
\
DmaSetAsync(dmaNo, srcp, REG_GXFIFO, ( \
DMA_ENABLE | DMA_TIMMING_GXFIFO | \
DMA_SRC_INC | DMA_DEST_FIX | \
DMA_32BIT_BUS | (length)))
#define GX_DmaIf(dmaNo, srcp, length) \
\
DmaSetAsync(dmaNo, srcp, REG_GXFIFO, ( \
DMA_ENABLE | DMA_TIMMING_GXFIFO | \
DMA_IF_ENABLE | \
DMA_SRC_INC | DMA_DEST_FIX | \
DMA_32BIT_BUS | (length)))
#define GX_DmaFast(dmaNo, srcp, length) \
\
DmaSet(dmaNo, srcp, REG_GXFIFO, ( \
DMA_ENABLE | DMA_TIMMING_IMM | \
DMA_SRC_INC | DMA_DEST_FIX | \
DMA_32BIT_BUS | (length)))
#define GX_DmaFastIf(dmaNo, srcp, length) \
\
DmaSet(dmaNo, srcp, REG_GXFIFO, ( \
DMA_ENABLE | DMA_TIMMING_IMM | \
DMA_IF_ENABLE | \
DMA_SRC_INC | DMA_DEST_FIX | \
DMA_32BIT_BUS | (length)))
#define GX_DmaArray( dmaNo, srcp, destp, bit) \
GX_Dma( dmaNo, srcp, destp, sizeof(srcp), bit)
#define GX_DmaArrayIf(dmaNo, srcp, destp, bit) \
GX_DmaIf(dmaNo, srcp, destp, sizeof(srcp), bit)
#define GX_DmaArrayFast( dmaNo, srcp, destp, bit) \
GX_DmaFast( dmaNo, srcp, destp, sizeof(srcp), bit)
#define GX_DmaArrayFastIf(dmaNo, srcp, destp, bit) \
GX_DmaFastIf(dmaNo, srcp, destp, sizeof(srcp), bit)
//・ジオメトリFIFOからの要求によってDMAでコピーします。
//・GX_DmaIfGX_DmaArrayIfGX_DmaFastIfGX_DmaArrayFastIf
// は終了時に割り込み要求を発生します。
//・GX_DmaArrayGX_DmaArrayIfGX_DmaArrayFastGX_DmaArrayFastIf
// はソース配列全体をコピーします。
//
//・引数:
// dmaNo DMA番号
// srcp ソースアドレス
// size 転送バイト数
//----------------------------------------------------------------------
// 終了待ち
//----------------------------------------------------------------------
#define WaitDma(dmaNo) \
{ \
vu32 *(dmaCntp) = &((vu32 *)REG_DMA0)[dmaNo * 3]; \
while (dmaCntp[2] & DMA_ENABLE) ; \
}
//・DMAの終了を待ちます。
//
//・引数:
// dmaNo DMA番号
//----------------------------------------------------------------------
// ストップ
//----------------------------------------------------------------------
#define StopDma(dmaNo) \
{ \
vu16 *(dmaCntp) = &((vu16 *)REG_DMA0)[dmaNo * 6]; \
dmaCntp[5] &= ~((DMA_TIMMING_MASK | DMA_CONTINUOUS_ON) \
>> 16); \
dmaCntp[5] &= ~( DMA_ENABLE >> 16); \
{u32 dummy = dmaCntp[5];} \
{u32 dummy = dmaCntp[5];} \
}
//・DMAを停止します。
//・但し、処理中にDMAの自動起動が掛かった場合は一度だけDMAが実行されます。
//
//・引数:
// dmaNo DMA番号
//----------------------------------------------------------------------
// クリア
//----------------------------------------------------------------------
#define CpuClear(data, destp, size, bit) UTL_CpuClear##bit(data, (void *)(destp), size)
#define CpuClearArray(data, destp, bit) \
CpuClear( data, destp, sizeof(destp), bit)
//・CPUでRAMクリアするシステムコールを呼び出します。
//・クリアデータはスタックに置かれ、それをデスティネーションへコピーします。
//・CpuClearArrayはデスティネーション配列全体をクリアします。
//
//・引数:
// data クリアデータ
// destp デスティネーションアドレス
// size クリアバイト数
// bit 転送ビット幅16|32
//----------------------------------------------------------------------
// コピー
//----------------------------------------------------------------------
#define CpuCopy(srcp, destp, size, bit) UTL_CpuCopy##bit((void *)(srcp), (void *)(destp), size)
#define CpuCopyArray(srcp, destp, bit) \
CpuCopy( srcp, destp, sizeof(srcp), bit)
//・CPUでコピーするシステムコールを呼び出します。
//・CpuCopyArrayはソース配列全体をコピーします。
//
//・引数:
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
// bit 転送ビット幅16|32
//----------------------------------------------------------------------
// 高速クリア
//----------------------------------------------------------------------
#define CpuClearFast(data, destp, size) UTL_CpuClearFast(data, (void *)(destp), size)
#define CpuClearArrayFast(data, destp) \
CpuClearFast( data, destp, sizeof(destp))
//・CPUで高速にRAMクリアするシステムコールを呼び出します。
//・クリアデータはスタックに置かれ、それをデスティネーションへコピーします。
//・CpuClearArrayFastはデスティネーション配列全体をクリアします。
//
//・引数:
// data クリアデータ
// destp デスティネーションアドレス
// size クリアバイト数
//----------------------------------------------------------------------
// 高速コピー
//----------------------------------------------------------------------
#define CpuCopyFast(srcp, destp, size) UTL_CpuCopyFast((void *)(srcp), (void *)(destp), size)
#define CpuCopyArrayFast(srcp, destp) \
CpuCopyFast( srcp, destp, sizeof(srcp))
//・CPUで高速にコピーするシステムコールを呼び出します。
//・CpuCopyArrayFastはソース配列全体をコピーします。
//
//・引数:
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_MACRO_H

View File

@ -0,0 +1,32 @@
;=======================================================================
; IrisMacroArm.s
; IRIS 標準マクロ関数ARMASM用
;
; Copyright (C) 2002-2004 NINTENDO Co.,Ltd.
;=======================================================================
IF :DEF: _IRIS_MACRO_H
ELSE
_IRIS_MACRO_H * 1
INCLUDE IrisTargetArm.s
;-----------------------------------------------------------------------
; システムコール
;-----------------------------------------------------------------------
MACRO
SystemCall16 $No
swi $No
MEND
MACRO
SystemCall32 $No
swi $No << 16
MEND
ENDIF ; _IRIS_MACRO_H
END

View File

@ -0,0 +1,28 @@
;=======================================================================
; IrisMacroMw.s
; IRIS 標準マクロ関数MWASMARM用
;
; Copyright (C) 2003 NINTENDO Co.,Ltd.
;=======================================================================
#ifndef _IRIS_MACRO_H
#define _IRIS_MACRO_H
.INCLUDE IrisTarget.h
;-----------------------------------------------------------------------
; システムコール
;-----------------------------------------------------------------------
SystemCall16: .MACRO No
swi No
.ENDM
SystemCall32: .MACRO No
swi No << 16
.ENDM
#endif // _IRIS_MACRO_H

View File

@ -0,0 +1,704 @@
//======================================================================
// IrisMemoryMap.h
// IRIS メモリマップ定数
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_MEMORY_MAP_H
#define _IRIS_MEMORY_MAP_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTarget.h>
//----------------------------------------------------------------------
// メモリ・マップ
//----------------------------------------------------------------------
#define SHARED_WORK 0x027ff000 // CPU間共有ワーク領域
#define SHARED_WORK_END 0x02800000
#if defined(NDEBUG)
#define SUBP_PRV 0x02380000 // サブプロセッサ専有領域(リリースバージョン)
#elif defined(MMEM_4M)
#define SUBP_PRV 0x02300000 // (デバッグバージョン<メインメモリ4M本体>)
#else
#define SUBP_PRV 0x02600000 // (デバッグバージョン<メインメモリ8M本体>)
#endif
#define SUBP_PRV_END SHARED_WORK
#if defined(IRIS_TEG) | defined(IRIS_TS)
#define ITCM 0x01ff8000 // 命令TCM
#define ITCM_END (ITCM + 0x8000)
#define DTCM SUBP_PRV // データTCM(TEGボード以降)
#else
#define DTCM 0x8000 // (ブレッドボード専用)
#endif
#define DTCM_END (DTCM + 0x4000)
#define INTR_VECTOR_BUF (DTCM_END - 0x4) // 割り込み分岐アドレス
#define INTR_CHECK_BUF (DTCM_END - 0x8) // 割り込みチェック
#define SEND_FIFO_LOCK_BUF (DTCM_END - 0x10) // CPU間送信FIFO・ロックバッファ
#define TIMER3_LOCK_BUF (DTCM_END - 0x12) // タイマー3・ロックバッファ
#define TIMER2_LOCK_BUF (DTCM_END - 0x14) // タイマー2
#define TIMER1_LOCK_BUF (DTCM_END - 0x16) // タイマー1
#define TIMER0_LOCK_BUF (DTCM_END - 0x18) // タイマー0
#define DMA3_LOCK_BUF (DTCM_END - 0x1a) // DMA3・ロックバッファ
#define DMA2_LOCK_BUF (DTCM_END - 0x1c) //
#define DMA1_LOCK_BUF (DTCM_END - 0x1e) //
#define DMA0_LOCK_BUF (DTCM_END - 0x20) //
#define MAIN_MEM 0x02000000 // メインメモリ
#define MAIN_MEM_END (MAIN_MEM + 0x400000)
#define MAIN_MEM_EX_END (MAIN_MEM + 0x800000) //(拡張時の最終アドレス)
#define MAIN_MEM_CMD_AREA (MAIN_MEM_EX_END - 0x2) // メインメモリコマンド発行エリア(使用禁止エリア)
#define SHARED_LOCK_BUF (MAIN_MEM_EX_END - 0x40) // 共有リソース・ロックバッファ
#define SHARED_LOCK_BUF_END (MAIN_MEM_EX_END - 0x10)
#define INIT_LOCK_BUF (MAIN_MEM_EX_END - 0x10) // 初期化ロックバッファ
#define CARTRIDGE_LOCK_BUF (MAIN_MEM_EX_END - 0x18) // カートリッジ・ロックバッファ
#define CARD_LOCK_BUF (MAIN_MEM_EX_END - 0x20) // カード・ロックバッファ
#define WRAM_BLOCK1_LOCK_BUF (MAIN_MEM_EX_END - 0x28) // CPU内部ワークRAM・ブロック1・ロックバッファ
#define WRAM_BLOCK0_LOCK_BUF (MAIN_MEM_EX_END - 0x30) // ブロック0・ロックバッファ
#define VRAM_D_LOCK_BUF (MAIN_MEM_EX_END - 0x38) // VRAM-D・ロックバッファ
#define VRAM_C_LOCK_BUF (MAIN_MEM_EX_END - 0x40) // C・ロックバッファ
#define FROM_SUBP_IF_BUF (MAIN_MEM_EX_END - 0x50) // サブ→メインプロセッサ割り込み要求フラグ(2Byte×8)
#define WM_FROM_SUBP_IF_BUF (MAIN_MEM_EX_END - 0x50) // ワイヤレスマネージャ予約
#define TO_SUBP_IF_BUF (MAIN_MEM_EX_END - 0x60) // メイン→サブプロセッサ割り込み要求フラグ(2Byte×8)
#define WM_TO_SUBP_IF_BUF (MAIN_MEM_EX_END - 0x60) // ワイヤレスマネージャ予約
#define ROM_HEADER_BUF (MAIN_MEM_EX_END - 0x200)// ROM内登録エリアデータ・バッファ
#define DMA_CLEAR_DATA_BUF (MAIN_MEM_EX_END - 0x210)// DMAクリアデータ・バッファ(暫定対応、廃止予定)
#define CPU_WRAM 0x037f8000 // CPU内部ワークRAM
#define CPU_WRAM_END (CPU_WRAM + 0x8000)
#define CPU_WRAM_BLOCK0 0x037f8000 // ブロック0
#define CPU_WRAM_BLOCK0_END (CPU_WRAM_BLOCK0 + 0x4000)
#define CPU_WRAM_BLOCK1 0x037fc000 // ブロック1
#define CPU_WRAM_BLOCK1_END (CPU_WRAM_BLOCK1 + 0x4000)
#define REG_BASE 0x04000000 // レジスタ群
#define PLTT 0x05000000 // パレットRAM
#define PLTT_END (PLTT + 0x400)
#define BG_PLTT (PLTT + 0x0) // BGパレットRAM
#define BG_PLTT_END (PLTT + 0x200)
#define OBJ_PLTT (PLTT + 0x200) // OBJパレットRAM
#define OBJ_PLTT_END (PLTT + 0x400)
#define VRAM 0x06000000 //
#define BG_VRAM (VRAM + 0x0) // BGキャラクタ/スクリーンRAM
#define BG_VRAM_END (VRAM + 0x80000)
#define OBJ_VRAM (VRAM + 0x400000) // OBJキャラクタRAM
#define OBJ_VRAM_END (VRAM + 0x440000)
#define LCDC_VRAM (VRAM + 0x800000) //
#define LCDC_VRAM_A (VRAM + 0x800000)
#define LCDC_VRAM_B (VRAM + 0x820000)
#define LCDC_VRAM_C (VRAM + 0x840000)
#define LCDC_VRAM_D (VRAM + 0x860000)
#define LCDC_VRAM_E (VRAM + 0x880000)
#define LCDC_VRAM_F (VRAM + 0x890000)
#define LCDC_VRAM_G (VRAM + 0x894000)
#define LCDC_VRAM_END (VRAM + 0x898000)
#define OAM 0x07000000 //
#define OAM_END (OAM + 0x400)
#define CARTRIDGE 0x08000000 // カートリッジ
#define CTRDG_AD16_BANK0 0x08000000 // カートリッジ AD16バス バンク0
#define CTRDG_AD16_BANK0_END 0x0a000000
#define CTRDG_AD16_BANK1 0x0a000000 // バンク1
#define CTRDG_AD16_BANK1_END 0x0c000000
#define CTRDG_AD16_BANK2 0x0c000000 // バンク2
#define CTRDG_AD16_BANK2_END 0x0e000000
#define CTRDG_DT8 0x0e000000 // カートリッジ 8bitデータバス
#define CTRDG_DT8_END 0x10000000
#define BIOS 0xffff0000 //
#define BIOS_END (BIOS + 0x8000)
//----------------------------------------------------------------------
// メモリ・サイズ
//----------------------------------------------------------------------
#define SHARED_WORK_SIZE (SHARED_WORK_END - SHARED_WORK) // CPU間共有ワーク領域(4KB以上、2のべき乗サイズ)
#define SUBP_PRV_SIZE (SUBP_PRV_END - SUBP_PRV) // サブプロセッサ専有領域(32KB以上、2のべき乗サイズ)
#define SHARED_LOCK_BUF_SIZE (SHARED_LOCK_BUF_END - SHARED_LOCK_BUF) // 共有リソース・ロックバッファ
#define ITCM_SIZE 0x8000 // 命令TCM
#define DTCM_SIZE 0x4000 // データTCM
#define ICACHE_SIZE 0x2000 // 命令キャッシュ
#define DCACHE_SIZE 0x1000 // データキャッシュ
#define CACHE_LINE_SIZE 32 // キャッシュライン
#define MAIN_MEM_SIZE 0x400000 // メインメモリ
#define MAIN_MEM_EX_SIZE 0x800000 // (拡張時)
#define CPU_WRAM_SIZE 0x8000 // CPU内部ワークRAM 合計
#define CPU_WRAM_BLOCK0_SIZE 0x4000 // ブロック0
#define CPU_WRAM_BLOCK1_SIZE 0x4000 // ブロック1
#define MROM_PAGE_SIZE 512 // マスクROM・ページ
#define PLTT_SIZE (2*256*2) // パレットRAM
#define BG_PLTT_SIZE (2*256) // BGパレットRAM
#define OBJ_PLTT_SIZE (2*256) // OBJパレットRAM
#define BG_VRAM_SIZE 0x80000 //
#define OBJ_VRAM_SIZE 0x40000 //
#define LCDC_VRAM_SIZE 0x98000 //
#define VRAM_A_SIZE 0x20000 //
#define VRAM_B_SIZE 0x20000 //
#define VRAM_C_SIZE 0x20000 //
#define VRAM_D_SIZE 0x20000 //
#define VRAM_E_SIZE 0x10000 //
#define VRAM_F_SIZE 0x4000 //
#define VRAM_G_SIZE 0x4000 //
#define OAM_SIZE (8*128) //
#define CARTRIDGE_SIZE 0x02000000 // カートリッジ
#define CTRDG_AD16_BANK_SIZE 0x02000000 // カートリッジ AD16バス バンク
#define CTRDG_AD16_BANK0_SIZE 0x02000000 // バンク0
#define CTRDG_AD16_BANK1_SIZE 0x02000000 // バンク1
#define CTRDG_AD16_BANK2_SIZE 0x02000000 // バンク2
#define CTRDG_DT8_SIZE 0x02000000 // カートリッジ 8bitデータバス
#define BIOS_SIZE 0x8000 //
//----------------------------------------------------------------------
// レジスタ・アドレス
//----------------------------------------------------------------------
#define REG_IME (REG_BASE + 0x208) // 割り込みマスタイネーブル
#define REG_IE (REG_BASE + 0x210) // 割り込み許可
#define REG_IF (REG_BASE + 0x214) // 割り込み要求
#define REG_SUBPINTF (REG_BASE + 0x180) // サブプロセッサインタフェース
#define REG_SUBP_FIFO_CNT (REG_BASE + 0x184) // CPU間FIFOコントロール
#define REG_SEND_FIFO (REG_BASE + 0x188) // 送信FIFO
#define REG_RECV_FIFO (REG_BASE + 0x100000) // 受信FIFO
#define REG_EXMEMCNT (REG_BASE + 0x204) // 外部メモリコントロール
#define REG_POWCNT (REG_BASE + 0x304) // パワーコントロール
#define REG_DIVCNT (REG_BASE + 0x280) // 除算器 コントロール
#define REG_DIV_NUMER (REG_BASE + 0x290) // 被除数
#define REG_DIV_DENOM (REG_BASE + 0x298) // 除数
#define REG_DIV_RESULT (REG_BASE + 0x2a0) // 商
#define REG_DIVREM_RESULT (REG_BASE + 0x2a8) // 余り
#define REG_SQRTCNT (REG_BASE + 0x2b0) // 平方根演算器 コントロール
#define REG_SQRT_RESULT (REG_BASE + 0x2b4) // 結果
#define REG_SQRT_PARAM (REG_BASE + 0x2b8) // パラメータ
#define REG_DISPCNT (REG_BASE + 0x0) // 表示コントロール
#define REG_DISPCNT_L (REG_BASE + 0x0)
#define REG_DISPCNT_H (REG_BASE + 0x2)
#define REG_DISP2DCNT (REG_BASE + 0x0) // 2D表示コントロール
#define REG_DISP3DCNT (REG_BASE + 0x60) // 3D表示コントロール
#define REG_DISPSTAT (REG_BASE + 0x4) // 表示ステータス
#define REG_VCOUNT (REG_BASE + 0x6) // Vカウンタ
#define REG_GXSTAT (REG_BASE + 0x600) // ジオメトリエンジンステータス
#define REG_VRAMCNT (REG_BASE + 0x240) // VRAMコントロール
#define REG_WRAMCNT (REG_BASE + 0x247) // 内部ワークRAMコントロール
#define REG_WVRAMCNT (REG_BASE + 0x244) // 内部ワークRAM コントロール
#define REG_VRAM_A_CNT (REG_BASE + 0x240) //
#define REG_VRAM_B_CNT (REG_BASE + 0x241) //
#define REG_VRAM_C_CNT (REG_BASE + 0x242) //
#define REG_VRAM_D_CNT (REG_BASE + 0x243) //
#define REG_VRAM_E_CNT (REG_BASE + 0x244) //
#define REG_VRAM_F_CNT (REG_BASE + 0x245) //
#define REG_VRAM_G_CNT (REG_BASE + 0x246) //
#define REG_VRAM_H_CNT (REG_BASE + 0x248) //
#define REG_VRAM_I_CNT (REG_BASE + 0x249) //
#define REG_VRAM_AB_CNT (REG_BASE + 0x240) //
#define REG_VRAM_CD_CNT (REG_BASE + 0x242) //
#define REG_VRAM_EF_CNT (REG_BASE + 0x244) //
#define REG_VRAM_G_W_CNT (REG_BASE + 0x246) // 内部ワークRAM
#define REG_VRAM_ABCD_CNT (REG_BASE + 0x240) //
#define REG_VRAM_EFG_W_CNT (REG_BASE + 0x244) // 内部ワークRAM
#define REG_VRAM_HI_CNT (REG_BASE + 0x248) //
#define REG_MASTER_BRIGHT (REG_BASE + 0x6c) // マスター輝度 コントロール
#define REG_DISPCAPCNT (REG_BASE + 0x64) // 表示キャプチャ コントロール
#define REG_DISP_MMEM_FIFO (REG_BASE + 0x68) // メインメモリ表示FIFO
#define REG_MOSAIC (REG_BASE + 0x4c) // モザイク サイズ
#define REG_BLDCNT (REG_BASE + 0x50) // ブレンドモード コントロール
#define REG_BLDALPHA (REG_BASE + 0x52) // 半透明 パラメータ
#define REG_BLDY (REG_BASE + 0x54) // 輝度変更 パラメータ
#define REG_WINCNT (REG_BASE + 0x40) // ウインドウ コントロール
#define REG_WIN0H (REG_BASE + 0x40) // ウインドウ0水平領域
#define REG_WIN1H (REG_BASE + 0x42) // ウインドウ1水平領域
#define REG_WIN0V (REG_BASE + 0x44) // ウインドウ0垂直領域
#define REG_WIN1V (REG_BASE + 0x46) // ウインドウ1垂直領域
#define REG_WININ (REG_BASE + 0x48) // ウインドウ内コントロール
#define REG_WIN0 (REG_BASE + 0x48) // ウインドウ0コントロール
#define REG_WIN1 (REG_BASE + 0x49) // ウインドウ1コントロール
#define REG_WIN01 (REG_BASE + 0x48) // ウインドウ0・1コントロール
#define REG_WINOUT (REG_BASE + 0x4a) // ウインドウ外コントロール
#define REG_OBJWIN (REG_BASE + 0x4b) // OBJウインドウコントロール
#define REG_WINOUTOBJ (REG_BASE + 0x4a) // ウインドウ外・OBJウインドウコントロール
#define REG_BGCNT (REG_BASE + 0x8) // BGコントロール
#define REG_BG0CNT (REG_BASE + 0x8) // BG0コントロール
#define REG_BG1CNT (REG_BASE + 0xa) // BG1コントロール
#define REG_BG2CNT (REG_BASE + 0xc) // BG2コントロール
#define REG_BG3CNT (REG_BASE + 0xe) // BG3コントロール
#define REG_BGOFS (REG_BASE + 0x10) // BGオフセット
#define REG_BG0HOFS (REG_BASE + 0x10) // BG0Hオフセット
#define REG_BG0VOFS (REG_BASE + 0x12) // BG0Vオフセット
#define REG_BG1HOFS (REG_BASE + 0x14) // BG1Hオフセット
#define REG_BG1VOFS (REG_BASE + 0x16) // BG1Vオフセット
#define REG_BG2HOFS (REG_BASE + 0x18) // BG2Hオフセット
#define REG_BG2VOFS (REG_BASE + 0x1a) // BG2Vオフセット
#define REG_BG3HOFS (REG_BASE + 0x1c) // BG3Hオフセット
#define REG_BG3VOFS (REG_BASE + 0x1e) // BG3Vオフセット
#define REG_BG2AFFINE (REG_BASE + 0x20) // BG2アフィン変換パラメータ群
#define REG_BG2PA (REG_BASE + 0x20) // BG2ライン方向X座標差分
#define REG_BG2PB (REG_BASE + 0x22) // 垂直方向X座標差分
#define REG_BG2PC (REG_BASE + 0x24) // BG2ライン方向Y座標差分
#define REG_BG2PD (REG_BASE + 0x26) // 垂直方向Y座標差分
#define REG_BG2X (REG_BASE + 0x28) // BG2スタートX座標
#define REG_BG2Y (REG_BASE + 0x2c) // BG2スタートY座標
#define REG_BG3AFFINE (REG_BASE + 0x30) // BG3アフィン変換パラメータ群
#define REG_BG3PA (REG_BASE + 0x30) // BG3ライン方向X座標差分
#define REG_BG3PB (REG_BASE + 0x32) // 垂直方向X座標差分
#define REG_BG3PC (REG_BASE + 0x34) // BG3ライン方向Y座標差分
#define REG_BG3PD (REG_BASE + 0x36) // 垂直方向Y座標差分
#define REG_BG3X (REG_BASE + 0x38) // BG3スタートX座標
#define REG_BG3Y (REG_BASE + 0x3c) // BG3スタートY座標
#define REG_GXFIFO (REG_BASE + 0x400) // ジオメトリFIFO
#define REG_LISTRAM_COUNT (REG_BASE + 0x604) // ポリゴンリストRAMカウンタ
#define REG_VTXRAM_COUNT (REG_BASE + 0x606) // 頂点RAMカウンタ
#define REG_RDLINES_COUNT (REG_BASE + 0x320) // レンダリング済みライン数カウンタ
#define REG_SWAP_BUFFERS (REG_BASE + 0x540) // レンダリングエンジン参照データ群のスワップ
#define REG_VIEWPORT (REG_BASE + 0x580) // 視界
#define REG_MTX_MODE (REG_BASE + 0x440) // 行列モード
#define REG_MTX_PUSH (REG_BASE + 0x444) // 行列プッシュ
#define REG_MTX_POP (REG_BASE + 0x448) // 行列ポップ
#define REG_MTX_STORE (REG_BASE + 0x44c) // 行列ストア
#define REG_MTX_RESTORE (REG_BASE + 0x450) // 行列リストア
#define REG_MTX_IDENTITY (REG_BASE + 0x454) // 単位行列 初期化
#define REG_MTX_LOAD_4x4 (REG_BASE + 0x458) // 行列ロード(4x4)
#define REG_MTX_LOAD_4x3 (REG_BASE + 0x45c) //
#define REG_MTX_MULT_4x4 (REG_BASE + 0x460) // 行列乗算
#define REG_MTX_MULT_4x3 (REG_BASE + 0x464) //
#define REG_MTX_MULT_3x3 (REG_BASE + 0x468) //
#define REG_MTX_SCALE (REG_BASE + 0x46c) // スケール行列乗算(1x3)
#define REG_MTX_TRANS (REG_BASE + 0x470) // 移動行列乗算(1x3)
#define REG_CLIPMTX_RESULT (REG_BASE + 0x640) // カレントクリップ座標行列 読み込み
#define REG_VECMTX_RESULT (REG_BASE + 0x680) // カレントベクトル行列 読み込み
#define REG_LIGHT_VECTOR (REG_BASE + 0x4c8) // ライトベクトル
#define REG_LIGHT_COLOR (REG_BASE + 0x4cc) // ライトカラー
#define REG_MATERIAL_COLOR (REG_BASE + 0x4c0) // マテリアルカラー
#define REG_DIF_AMB (REG_BASE + 0x4c0) // 拡散光 環境光成分
#define REG_SPE_EMI (REG_BASE + 0x4c4) // 反射光 放射光成分
#define REG_SHININESS (REG_BASE + 0x4d0) // 鏡面反射輝度
#define REG_POLYGON_ATTR (REG_BASE + 0x4a4) // ポリゴン属性
#define REG_TEX_PARAM (REG_BASE + 0x4a8) // テクスチャパラメータ
#define REG_TEXIMAGE_PARAM (REG_BASE + 0x4a8)
#define REG_TEXPLTT_BASE (REG_BASE + 0x4ac)
#define REG_BEGIN_VTXS (REG_BASE + 0x500) // 頂点リスト スタート
#define REG_END_VTXS (REG_BASE + 0x504) // 頂点リスト エンド
#define REG_COLOR (REG_BASE + 0x480) // 頂点カラー
#define REG_NORMAL (REG_BASE + 0x484) // 頂点法線
#define REG_TEXCOORD (REG_BASE + 0x488) // 頂点テクスチャ座標
#define REG_VTX_16 (REG_BASE + 0x48c) // 頂点16bit座標
#define REG_VTX_10 (REG_BASE + 0x490) // 頂点10bit座標
#define REG_VTX_XY (REG_BASE + 0x494) // 頂点16bitXY座標
#define REG_VTX_XZ (REG_BASE + 0x498) // 頂点16bitXZ座標
#define REG_VTX_YZ (REG_BASE + 0x49c) // 頂点16bitYZ座標
#define REG_VTX_DIFF (REG_BASE + 0x4a0) // 頂点16bit座標差分値
#define REG_BOX_TEST (REG_BASE + 0x5c0) // ボックステスト
#define REG_POS_TEST (REG_BASE + 0x5c4) // 位置テスト
#define REG_VEC_TEST (REG_BASE + 0x5c8) // ベクトルテスト
#define REG_POS_RESULT (REG_BASE + 0x620) // 位置テスト結果
#define REG_VEC_RESULT (REG_BASE + 0x630) // ベクトルテスト結果
#define REG_CLEAR_COLOR_ATTR (REG_BASE +0x350) // カラー&属性バッファ クリア値
#define REG_CLEAR_DEPTH (REG_BASE + 0x354) // Zバッファ クリア値
#define REG_CLRIMAGE_OFFSET (REG_BASE + 0x356) // クリアイメージ オフセット
#define REG_EDGE_COLOR (REG_BASE + 0x330) // エッジカラー
#define REG_FOG_COLOR (REG_BASE + 0x358) // フォグ カラー
#define REG_FOG_OFFSET (REG_BASE + 0x35c) // フォグ オフセット
#define REG_FOG_TABLE (REG_BASE + 0x360) // フォグ濃度テーブル
#define REG_TOON_TABLE (REG_BASE + 0x380) // トゥーンシェーディング・テーブル
#define REG_ALPHA_TEST_REF (REG_BASE + 0x340) // アルファテスト参照値
#define REG_DISP_1DOT_DEPTH (REG_BASE + 0x610) // 1ドットポリゴン描画開始Z値
#define REG_DMA0 (REG_BASE + 0xb0) //
#define REG_DMA0SAD (REG_BASE + 0xb0)
#define REG_DMA0DAD (REG_BASE + 0xb4)
#define REG_DMA0CNT (REG_BASE + 0xb8)
#define REG_DMA0CNT_L (REG_BASE + 0xb8)
#define REG_DMA0CNT_H (REG_BASE + 0xba)
#define REG_DMA1 (REG_BASE + 0xbc) //
#define REG_DMA1SAD (REG_BASE + 0xbc)
#define REG_DMA1DAD (REG_BASE + 0xc0)
#define REG_DMA1CNT (REG_BASE + 0xc4)
#define REG_DMA1CNT_L (REG_BASE + 0xc4)
#define REG_DMA1CNT_H (REG_BASE + 0xc6)
#define REG_DMA2 (REG_BASE + 0xc8) //
#define REG_DMA2SAD (REG_BASE + 0xc8)
#define REG_DMA2DAD (REG_BASE + 0xcc)
#define REG_DMA2CNT (REG_BASE + 0xd0)
#define REG_DMA2CNT_L (REG_BASE + 0xd0)
#define REG_DMA2CNT_H (REG_BASE + 0xd2)
#define REG_DMA3 (REG_BASE + 0xd4) //
#define REG_DMA3SAD (REG_BASE + 0xd4)
#define REG_DMA3DAD (REG_BASE + 0xd8)
#define REG_DMA3CNT (REG_BASE + 0xdc)
#define REG_DMA3CNT_L (REG_BASE + 0xdc)
#define REG_DMA3CNT_H (REG_BASE + 0xde)
#define REG_DMA3CNT_L (REG_BASE + 0xdc)
#ifdef IRIS_TS
#define REG_DMA0_CLR_DATA (REG_BASE + 0xe0) // クリアデータ
#define REG_DMA1_CLR_DATA (REG_BASE + 0xe4)
#define REG_DMA2_CLR_DATA (REG_BASE + 0xe8)
#define REG_DMA3_CLR_DATA (REG_BASE + 0xec)
#else
#define REG_DMA0_CLR_DATA (DMA_CLEAR_DATA_BUF + 0x0)
#define REG_DMA1_CLR_DATA (DMA_CLEAR_DATA_BUF + 0x4)
#define REG_DMA2_CLR_DATA (DMA_CLEAR_DATA_BUF + 0x8)
#define REG_DMA3_CLR_DATA (DMA_CLEAR_DATA_BUF + 0xc)
#endif
#define REG_TM0CNT (REG_BASE + 0x100) // タイマー0
#define REG_TM0CNT_L (REG_BASE + 0x100)
#define REG_TM0CNT_H (REG_BASE + 0x102)
#define REG_TM1CNT (REG_BASE + 0x104) // タイマー1
#define REG_TM1CNT_L (REG_BASE + 0x104)
#define REG_TM1CNT_H (REG_BASE + 0x106)
#define REG_TM2CNT (REG_BASE + 0x108) // タイマー2
#define REG_TM2CNT_L (REG_BASE + 0x108)
#define REG_TM2CNT_H (REG_BASE + 0x10a)
#define REG_TM3CNT (REG_BASE + 0x10c) // タイマー3
#define REG_TM3CNT_L (REG_BASE + 0x10c)
#define REG_TM3CNT_H (REG_BASE + 0x10e)
#define REG_KEYINPUT (REG_BASE + 0x130) // キー入力
#define REG_KEYCNT (REG_BASE + 0x132) // キーコントロール
#define REG_R0CNT (REG_BASE + 0x134) // 汎用ポート0
#define REG_R1CNT (REG_BASE + 0x138) //
//----------------------------------------------------------------------
// レジスタ・オフセット
//----------------------------------------------------------------------
#define OFFSET_REG_IME 0x208 // 割り込みマスタイネーブル
#define OFFSET_REG_IE 0x210 // 割り込み許可
#define OFFSET_REG_IF 0x214 // 割り込み要求
#define OFFSET_REG_SUBPINTF 0x180 // サブプロセッサインタフェース
#define OFFSET_REG_SUBP_FIFO_CNT 0x184 // CPU間FIFOコントロール
#define OFFSET_REG_SEND_FIFO 0x188 // 送信FIFO
#define OFFSET_REG_RECV_FIFO 0x100000 // 受信FIFO
#define OFFSET_REG_EXMEMCNT 0x204 // 外部メモリコントロール
#define OFFSET_REG_POWCNT 0x304 // パワーコントロール
#define OFFSET_REG_DIVCNT 0x280 // 除算器 コントロール
#define OFFSET_REG_DIV_NUMER 0x290 // 被除数
#define OFFSET_REG_DIV_DENOM 0x298 // 除数
#define OFFSET_REG_DIV_RESULT 0x2a0 // 商
#define OFFSET_REG_DIVREM_RESULT 0x2a8 // 余り
#define OFFSET_REG_SQRTCNT 0x2b0 // 平方根演算器 コントロール
#define OFFSET_REG_SQRT_RESULT 0x2b4 // 結果
#define OFFSET_REG_SQRT_PARAM 0x2b8 // パラメータ
#define OFFSET_REG_DISPCNT 0x0 // 表示コントロール
#define OFFSET_REG_DISPCNT_L 0x0
#define OFFSET_REG_DISPCNT_H 0x2
#define OFFSET_REG_DISP2DCNT 0x0 // 2D表示コントロール
#define OFFSET_REG_DISP3DCNT 0x60 // 3D表示コントロール
#define OFFSET_REG_DISPSTAT 0x4 // 表示ステータス
#define OFFSET_REG_VCOUNT 0x6 // Vカウンタ
#define OFFSET_REG_GXSTAT 0x600 // ジオメトリエンジンステータス
#define OFFSET_REG_VRAMCNT 0x240 // VRAMコントロール
#define OFFSET_REG_WRAMCNT 0x247 // 内部ワークRAMコントロール
#define OFFSET_REG_WVRAMCNT 0x244 // 内部ワークRAM コントロール
#define OFFSET_REG_VRAM_A_CNT 0x240 //
#define OFFSET_REG_VRAM_B_CNT 0x241 //
#define OFFSET_REG_VRAM_C_CNT 0x242 //
#define OFFSET_REG_VRAM_D_CNT 0x243 //
#define OFFSET_REG_VRAM_E_CNT 0x244 //
#define OFFSET_REG_VRAM_F_CNT 0x245 //
#define OFFSET_REG_VRAM_G_CNT 0x246 //
#define OFFSET_REG_VRAM_H_CNT 0x248 //
#define OFFSET_REG_VRAM_I_CNT 0x249 //
#define OFFSET_REG_VRAM_AB_CNT 0x240 //
#define OFFSET_REG_VRAM_CD_CNT 0x242 //
#define OFFSET_REG_VRAM_EF_CNT 0x244 //
#define OFFSET_REG_VRAM_G_W_CNT 0x246 // 内部ワークRAM
#define OFFSET_REG_VRAM_ABCD_CNT 0x240 //
#define OFFSET_REG_VRAM_EFG_W_CNT 0x244 // 内部ワークRAM
#define OFFSET_REG_VRAM_HI_CNT 0x248 //
#define OFFSET_REG_MASTER_BRIGHT 0x6c // マスター輝度 コントロール
#define OFFSET_REG_DISPCAPCNT 0x64 // 表示キャプチャ コントロール
#define OFFSET_REG_DISP_MMEM_FIFO 0x68 // メインメモリ表示FIFO
#define OFFSET_REG_TVOUTCNT 0x70 // テレビ出力コントロール
#define OFFSET_REG_MOSAIC 0x4c // モザイク サイズ
#define OFFSET_REG_BLDCNT 0x50 // ブレンドモード コントロール
#define OFFSET_REG_BLDALPHA 0x52 // 半透明 パラメータ
#define OFFSET_REG_BLDY 0x54 // 輝度変更 パラメータ
#define OFFSET_REG_WINCNT 0x40 // ウインドウ コントロール
#define OFFSET_REG_WIN0H 0x40 // ウインドウ0水平領域
#define OFFSET_REG_WIN1H 0x42 // ウインドウ1水平領域
#define OFFSET_REG_WIN0V 0x44 // ウインドウ0垂直領域
#define OFFSET_REG_WIN1V 0x46 // ウインドウ1垂直領域
#define OFFSET_REG_WININ 0x48 // ウインドウ内コントロール
#define OFFSET_REG_WIN0 0x48 // ウインドウ0コントロール
#define OFFSET_REG_WIN1 0x49 // ウインドウ1コントロール
#define OFFSET_REG_WIN01 0x48 // ウインドウ0・1コントロール
#define OFFSET_REG_WINOUT 0x4a // ウインドウ外コントロール
#define OFFSET_REG_OBJWIN 0x4b // OBJウインドウコントロール
#define OFFSET_REG_WINOUTOBJ 0x4a // ウインドウ外・OBJウインドウコントロール
#define OFFSET_REG_BGCNT 0x8 // BGコントロール
#define OFFSET_REG_BG0CNT 0x8 // BG0コントロール
#define OFFSET_REG_BG1CNT 0xa // BG1コントロール
#define OFFSET_REG_BG2CNT 0xc // BG2コントロール
#define OFFSET_REG_BG3CNT 0xe // BG3コントロール
#define OFFSET_REG_BGOFS 0x10 // BGオフセット
#define OFFSET_REG_BG0HOFS 0x10 // BG0Hオフセット
#define OFFSET_REG_BG0VOFS 0x12 // BG0Vオフセット
#define OFFSET_REG_BG1HOFS 0x14 // BG1Hオフセット
#define OFFSET_REG_BG1VOFS 0x16 // BG1Vオフセット
#define OFFSET_REG_BG2HOFS 0x18 // BG2Hオフセット
#define OFFSET_REG_BG2VOFS 0x1a // BG2Vオフセット
#define OFFSET_REG_BG3HOFS 0x1c // BG3Hオフセット
#define OFFSET_REG_BG3VOFS 0x1e // BG3Vオフセット
#define OFFSET_REG_BG2AFFINE 0x20 // BG2アフィン変換パラメータ群
#define OFFSET_REG_BG2PA 0x20 // BG2ライン方向X座標差分
#define OFFSET_REG_BG2PB 0x22 // 垂直方向X座標差分
#define OFFSET_REG_BG2PC 0x24 // BG2ライン方向Y座標差分
#define OFFSET_REG_BG2PD 0x26 // 垂直方向Y座標差分
#define OFFSET_REG_BG2X 0x28 // BG2スタートX座標
#define OFFSET_REG_BG2Y 0x2c // BG2スタートY座標
#define OFFSET_REG_BG3AFFINE 0x30 // BG3アフィン変換パラメータ群
#define OFFSET_REG_BG3PA 0x30 // BG3ライン方向X座標差分
#define OFFSET_REG_BG3PB 0x32 // 垂直方向X座標差分
#define OFFSET_REG_BG3PC 0x34 // BG3ライン方向Y座標差分
#define OFFSET_REG_BG3PD 0x36 // 垂直方向Y座標差分
#define OFFSET_REG_BG3X 0x38 // BG3スタートX座標
#define OFFSET_REG_BG3Y 0x3c // BG3スタートY座標
#define OFFSET_REG_GXFIFO 0x400 // ジオメトリFIFO
#define OFFSET_REG_LISTRAM_COUNT 0x604 // ポリゴンリストRAMカウンタ
#define OFFSET_REG_VTXRAM_COUNT 0x606 // 頂点RAMカウンタ
#define OFFSET_REG_RDLINES_COUNT 0x320 // レンダリング済みライン数カウンタ
#define OFFSET_REG_SWAP_BUFFERS 0x540 // レンダリングエンジン参照データ群のスワップ
#define OFFSET_REG_VIEWPORT 0x580 // 視界
#define OFFSET_REG_MTX_MODE 0x440 // 行列モード
#define OFFSET_REG_MTX_PUSH 0x444 // 行列プッシュ
#define OFFSET_REG_MTX_POP 0x448 // 行列ポップ
#define OFFSET_REG_MTX_STORE 0x44c // 行列ストア
#define OFFSET_REG_MTX_RESTORE 0x450 // 行列リストア
#define OFFSET_REG_MTX_IDENTITY 0x454 // 単位行列 初期化
#define OFFSET_REG_MTX_LOAD_4x4 0x458 // 行列ロード(4x4)
#define OFFSET_REG_MTX_LOAD_4x3 0x45c //
#define OFFSET_REG_MTX_MULT_4x4 0x460 // 行列乗算
#define OFFSET_REG_MTX_MULT_4x3 0x464 //
#define OFFSET_REG_MTX_MULT_3x3 0x468 //
#define OFFSET_REG_MTX_SCALE 0x46c // スケール行列乗算(1x3)
#define OFFSET_REG_MTX_TRANS 0x470 // 移動行列乗算(1x3)
#define OFFSET_REG_CLIPMTX_RESULT 0x640 // カレントクリップ座標行列 読み込み
#define OFFSET_REG_VECMTX_RESULT 0x680 // カレントベクトル行列 読み込み
#define OFFSET_REG_LIGHT_VECTOR 0x4c8 // ライトベクトル
#define OFFSET_REG_LIGHT_COLOR 0x4cc // ライトカラー
#define OFFSET_REG_MATERIAL_COLOR 0x4c0 // マテリアルカラー
#define OFFSET_REG_DIF_AMB 0x4c0 // 拡散光 環境光成分
#define OFFSET_REG_SPE_EMI 0x4c4 // 反射光 放射光成分
#define OFFSET_REG_SHININESS 0x4d0 // 鏡面反射輝度
#define OFFSET_REG_POLYGON_ATTR 0x4a4 // ポリゴン属性
#define OFFSET_REG_TEX_PARAM 0x4a8 // テクスチャパラメータ
#define OFFSET_REG_TEXIMAGE_PARAM 0x4a8
#define OFFSET_REG_TEXPLTT_BASE 0x4ac
#define OFFSET_REG_BEGIN_VTXS 0x500 // 頂点リスト スタート
#define OFFSET_REG_END_VTXS 0x504 // 頂点リスト エンド
#define OFFSET_REG_COLOR 0x480 // 頂点カラー
#define OFFSET_REG_NORMAL 0x484 // 頂点法線
#define OFFSET_REG_TEXCOORD 0x488 // 頂点テクスチャ座標
#define OFFSET_REG_VTX_16 0x48c // 頂点16bit座標
#define OFFSET_REG_VTX_10 0x490 // 頂点10bit座標
#define OFFSET_REG_VTX_XY 0x494 // 頂点16bitXY座標
#define OFFSET_REG_VTX_XZ 0x498 // 頂点16bitXZ座標
#define OFFSET_REG_VTX_YZ 0x49c // 頂点16bitYZ座標
#define OFFSET_REG_VTX_DIFF 0x4a0 // 頂点16bit座標差分値
#define OFFSET_REG_BOX_TEST 0x5c0 // ボックステスト
#define OFFSET_REG_POS_TEST 0x5c4 // 位置テスト
#define OFFSET_REG_VEC_TEST 0x5c8 // ベクトルテスト
#define OFFSET_REG_POS_RESULT 0x620 // 位置テスト結果
#define OFFSET_REG_VEC_RESULT 0x630 // ベクトルテスト結果
#define OFFSET_REG_CLEAR_COLOR_ATTR 0x350 // カラー&属性バッファ クリア値
#define OFFSET_REG_CLEAR_DEPTH 0x354 // Zバッファ クリア値
#define OFFSET_REG_CLRIMAGE_OFFSET 0x356 // クリアイメージ オフセット
#define OFFSET_REG_EDGE_COLOR 0x330 // エッジカラー
#define OFFSET_REG_FOG_COLOR 0x358 // フォグ カラー
#define OFFSET_REG_FOG_OFFSET 0x35c // フォグ オフセット
#define OFFSET_REG_FOG_TABLE 0x360 // フォグ濃度テーブル
#define OFFSET_REG_TOON_TABLE 0x380 // トゥーンシェーディング・テーブル
#define OFFSET_REG_ALPHA_TEST_REF 0x340 // アルファテスト参照値
#define OFFSET_REG_DISP_1DOT_DEPTH 0x610 // 1ドットポリゴン描画開始Z値
#define OFFSET_REG_DMA0 0xb0 //
#define OFFSET_REG_DMA0SAD 0xb0
#define OFFSET_REG_DMA0DAD 0xb4
#define OFFSET_REG_DMA0CNT 0xb8
#define OFFSET_REG_DMA0CNT_L 0xb8
#define OFFSET_REG_DMA0CNT_H 0xba
#define OFFSET_REG_DMA1 0xbc //
#define OFFSET_REG_DMA1SAD 0xbc
#define OFFSET_REG_DMA1DAD 0xc0
#define OFFSET_REG_DMA1CNT 0xc4
#define OFFSET_REG_DMA1CNT_L 0xc4
#define OFFSET_REG_DMA1CNT_H 0xc6
#define OFFSET_REG_DMA2 0xc8 //
#define OFFSET_REG_DMA2SAD 0xc8
#define OFFSET_REG_DMA2DAD 0xcc
#define OFFSET_REG_DMA2CNT 0xd0
#define OFFSET_REG_DMA2CNT_L 0xd0
#define OFFSET_REG_DMA2CNT_H 0xd2
#define OFFSET_REG_DMA3 0xd4 //
#define OFFSET_REG_DMA3SAD 0xd4
#define OFFSET_REG_DMA3DAD 0xd8
#define OFFSET_REG_DMA3CNT 0xdc
#define OFFSET_REG_DMA3CNT_L 0xdc
#ifdef IRIS_TS
#define OFFSET_REG_DMA0_CLR_DATA 0xe0 // クリアデータ
#define OFFSET_REG_DMA1_CLR_DATA 0xe4
#define OFFSET_REG_DMA2_CLR_DATA 0xe8
#define OFFSET_REG_DMA3_CLR_DATA 0xec
#endif
#define OFFSET_REG_TM0CNT 0x100 // タイマー0
#define OFFSET_REG_TM0CNT_L 0x100
#define OFFSET_REG_TM0CNT_H 0x102
#define OFFSET_REG_TM1CNT 0x104 // タイマー1
#define OFFSET_REG_TM1CNT_L 0x104
#define OFFSET_REG_TM1CNT_H 0x106
#define OFFSET_REG_TM2CNT 0x108 // タイマー2
#define OFFSET_REG_TM2CNT_L 0x108
#define OFFSET_REG_TM2CNT_H 0x10a
#define OFFSET_REG_TM3CNT 0x10c // タイマー3
#define OFFSET_REG_TM3CNT_L 0x10c
#define OFFSET_REG_TM3CNT_H 0x10e
#define OFFSET_REG_KEYINPUT 0x130 // キー入力
#define OFFSET_REG_KEYCNT 0x132 // キーコントロール
#define OFFSET_REG_R0CNT 0x134 // 汎用ポート0
#define OFFSET_REG_R1CNT 0x138 //
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_MEMORY_MAP_H

View File

@ -0,0 +1,704 @@
;=======================================================================
; IrisMemoryMapArm.s
; IRIS メモリマップ定数ARMASM用
;
; Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
;=======================================================================
IF :DEF: _IRIS_MEMORY_MAP_H
ELSE
_IRIS_MEMORY_MAP_H * 1
INCLUDE IrisTargetArm.s
INCLUDE IrisDefineArm.s
;-----------------------------------------------------------------------
; メモリ・マップ
;-----------------------------------------------------------------------
SHARED_WORK * 0x027ff000 ; CPU間共有ワーク領域
SHARED_WORK_END * 0x02800000
IF :DEF: NDEBUG
SUBP_PRV * 0x02380000 ; サブプロセッサ専有領域(リリースバージョン)
ELSE
IF :DEF: MMEM_4M
SUBP_PRV * 0x02300000 ; (デバッグバージョン<メインメモリ4M本体>)
ELSE
SUBP_PRV * 0x02600000 ; (デバッグバージョン<メインメモリ8M本体>)
ENDIF
ENDIF
SUBP_PRV_END * SHARED_WORK
IF :DEF: IRIS_TEG :LOR: :DEF: IRIS_TS
ITCM * 0x01ff8000 ; 命令TCM
ITCM_END * (ITCM + 0x8000)
DTCM * SUBP_PRV ; データTCM(TEGボード以降)
ELSE
DTCM * 0x8000 ; (ブレッドボード専用)
ENDIF
DTCM_END * (DTCM + 0x4000)
INTR_VECTOR_BUF * (DTCM_END - 0x4) ; 割り込み分岐アドレス
INTR_CHECK_BUF * (DTCM_END - 0x8) ; 割り込みチェック
SEND_FIFO_LOCK_BUF * (DTCM_END - 0x10) ; CPU間送信FIFO・ロックバッファ
TIMER3_LOCK_BUF * (DTCM_END - 0x12) ; タイマー3・ロックバッファ
TIMER2_LOCK_BUF * (DTCM_END - 0x14) ; タイマー2
TIMER1_LOCK_BUF * (DTCM_END - 0x16) ; タイマー1
TIMER0_LOCK_BUF * (DTCM_END - 0x18) ; タイマー0
DMA3_LOCK_BUF * (DTCM_END - 0x1a) ; DMA3・ロックバッファ
DMA2_LOCK_BUF * (DTCM_END - 0x1c) ;
DMA1_LOCK_BUF * (DTCM_END - 0x1e) ;
DMA0_LOCK_BUF * (DTCM_END - 0x20) ;
MAIN_MEM * 0x02000000 ; メインメモリ
MAIN_MEM_END * (MAIN_MEM + 0x400000)
MAIN_MEM_EX_END * (MAIN_MEM + 0x800000) ;(拡張時の最終アドレス)
MAIN_MEM_CMD_AREA * (MAIN_MEM_EX_END - 0x2) ; メインメモリコマンド発行エリア(使用禁止エリア)
SHARED_LOCK_BUF * (MAIN_MEM_EX_END - 0x40) ; 共有リソース・ロックバッファ
SHARED_LOCK_BUF_END * (MAIN_MEM_EX_END - 0x10)
INIT_LOCK_BUF * (MAIN_MEM_EX_END - 0x10) ; 初期化ロックバッファ
CARTRIDGE_LOCK_BUF * (MAIN_MEM_EX_END - 0x18) ; カートリッジ・ロックバッファ
CARD_LOCK_BUF * (MAIN_MEM_EX_END - 0x20) ; カード・ロックバッファ
WRAM_BLOCK1_LOCK_BUF * (MAIN_MEM_EX_END - 0x28) ; CPU内部ワークRAM・ブロック1・ロックバッファ
WRAM_BLOCK0_LOCK_BUF * (MAIN_MEM_EX_END - 0x30) ; ブロック0・ロックバッファ
VRAM_D_LOCK_BUF * (MAIN_MEM_EX_END - 0x38) ; VRAM-D・ロックバッファ
VRAM_C_LOCK_BUF * (MAIN_MEM_EX_END - 0x40) ; C・ロックバッファ
FROM_SUBP_IF_BUF * (MAIN_MEM_EX_END - 0x50) ; サブ→メインプロセッサ割り込み要求フラグ(2Byte×8)
WM_FROM_SUBP_IF_BUF * (MAIN_MEM_EX_END - 0x50) ; ワイヤレスマネージャ予約
TO_SUBP_IF_BUF * (MAIN_MEM_EX_END - 0x60) ; メイン→サブプロセッサ割り込み要求フラグ(2Byte×8)
WM_TO_SUBP_IF_BUF * (MAIN_MEM_EX_END - 0x60) ; ワイヤレスマネージャ予約
ROM_HEADER_BUF * (MAIN_MEM_EX_END - 0x200); ROM内登録エリアデータ・バッファ
DMA_CLEAR_DATA_BUF * (MAIN_MEM_EX_END - 0x210); DMAクリアデータ・バッファ(暫定対応、廃止予定)
CPU_WRAM * 0x037f8000 ; CPU内部ワークRAM
CPU_WRAM_END * (CPU_WRAM + 0x8000)
CPU_WRAM_BLOCK0 * 0x037f8000 ; ブロック0
CPU_WRAM_BLOCK0_END * (CPU_WRAM_BLOCK0 + 0x4000)
CPU_WRAM_BLOCK1 * 0x037fc000 ; ブロック1
CPU_WRAM_BLOCK1_END * (CPU_WRAM_BLOCK1 + 0x4000)
REG_BASE * 0x04000000 ; レジスタ群
PLTT * 0x05000000 ; パレットRAM
PLTT_END * (PLTT + 0x400)
BG_PLTT * (PLTT + 0x0) ; BGパレットRAM
BG_PLTT_END * (PLTT + 0x200)
OBJ_PLTT * (PLTT + 0x200) ; OBJパレットRAM
OBJ_PLTT_END * (PLTT + 0x400)
VRAM * 0x06000000 ;
BG_VRAM * (VRAM + 0x0) ; BGキャラクタ/スクリーンRAM
BG_VRAM_END * (VRAM + 0x80000)
OBJ_VRAM * (VRAM + 0x400000) ; OBJキャラクタRAM
OBJ_VRAM_END * (VRAM + 0x440000)
LCDC_VRAM * (VRAM + 0x800000) ;
LCDC_VRAM_A * (VRAM + 0x800000)
LCDC_VRAM_B * (VRAM + 0x820000)
LCDC_VRAM_C * (VRAM + 0x840000)
LCDC_VRAM_D * (VRAM + 0x860000)
LCDC_VRAM_E * (VRAM + 0x880000)
LCDC_VRAM_F * (VRAM + 0x890000)
LCDC_VRAM_G * (VRAM + 0x894000)
LCDC_VRAM_END * (VRAM + 0x898000)
OAM * 0x07000000 ;
OAM_END * (OAM + 0x400)
CARTRIDGE * 0x08000000 ; カートリッジ
CTRDG_AD16_BANK0 * 0x08000000 ; カートリッジ AD16バス バンク0
CTRDG_AD16_BANK0_END * 0x0a000000
CTRDG_AD16_BANK1 * 0x0a000000 ; バンク1
CTRDG_AD16_BANK1_END * 0x0c000000
CTRDG_AD16_BANK2 * 0x0c000000 ; バンク2
CTRDG_AD16_BANK2_END * 0x0e000000
CTRDG_DT8 * 0x0e000000 ; カートリッジ 8bitデータバス
CTRDG_DT8_END * 0x10000000
BIOS * 0xffff0000 ;
BIOS_END * (BIOS + 0x8000)
;-----------------------------------------------------------------------
; メモリ・サイズ
;-----------------------------------------------------------------------
SHARED_WORK_SIZE * (SHARED_WORK_END - SHARED_WORK) ; CPU間共有ワーク領域(4KB以上、2のべき乗サイズ)
SUBP_PRV_SIZE * (SUBP_PRV_END - SUBP_PRV) ; サブプロセッサ専有領域(32KB以上、2のべき乗サイズ)
SHARED_LOCK_BUF_SIZE * (SHARED_LOCK_BUF_END - SHARED_LOCK_BUF) ; 共有リソース・ロックバッファ
ITCM_SIZE * 0x8000 ; 命令TCM
DTCM_SIZE * 0x4000 ; データTCM
ICACHE_SIZE * 0x2000 ; 命令キャッシュ
DCACHE_SIZE * 0x1000 ; データキャッシュ
CACHE_LINE_SIZE * 32 ; キャッシュライン
MAIN_MEM_SIZE * 0x400000 ; メインメモリ
MAIN_MEM_EX_SIZE * 0x800000 ; (拡張時)
CPU_WRAM_SIZE * 0x8000 ; CPU内部ワークRAM 合計
CPU_WRAM_BLOCK0_SIZE * 0x4000 ; ブロック0
CPU_WRAM_BLOCK1_SIZE * 0x4000 ; ブロック1
MROM_PAGE_SIZE * 512 ; マスクROM・ページ
PLTT_SIZE * (2*256*2) ; パレットRAM
BG_PLTT_SIZE * (2*256) ; BGパレットRAM
OBJ_PLTT_SIZE * (2*256) ; OBJパレットRAM
BG_VRAM_SIZE * 0x80000 ;
OBJ_VRAM_SIZE * 0x40000 ;
LCDC_VRAM_SIZE * 0x98000 ;
VRAM_A_SIZE * 0x20000 ;
VRAM_B_SIZE * 0x20000 ;
VRAM_C_SIZE * 0x20000 ;
VRAM_D_SIZE * 0x20000 ;
VRAM_E_SIZE * 0x10000 ;
VRAM_F_SIZE * 0x4000 ;
VRAM_G_SIZE * 0x4000 ;
OAM_SIZE * (8*128) ;
CARTRIDGE_SIZE * 0x02000000 ; カートリッジ
CTRDG_AD16_BANK_SIZE * 0x02000000 ; カートリッジ AD16バス バンク
CTRDG_AD16_BANK0_SIZE * 0x02000000 ; バンク0
CTRDG_AD16_BANK1_SIZE * 0x02000000 ; バンク1
CTRDG_AD16_BANK2_SIZE * 0x02000000 ; バンク2
CTRDG_DT8_SIZE * 0x02000000 ; カートリッジ 8bitデータバス
BIOS_SIZE * 0x8000 ;
;-----------------------------------------------------------------------
; レジスタ・アドレス
;-----------------------------------------------------------------------
REG_IME * (REG_BASE + 0x208) ; 割り込みマスタイネーブル
REG_IE * (REG_BASE + 0x210) ; 割り込み許可
REG_IF * (REG_BASE + 0x214) ; 割り込み要求
REG_SUBPINTF * (REG_BASE + 0x180) ; サブプロセッサインタフェース
REG_SUBP_FIFO_CNT * (REG_BASE + 0x184) ; CPU間FIFOコントロール
REG_SEND_FIFO * (REG_BASE + 0x188) ; 送信FIFO
REG_RECV_FIFO * (REG_BASE + 0x100000) ; 受信FIFO
REG_EXMEMCNT * (REG_BASE + 0x204) ; 外部メモリコントロール
REG_POWCNT * (REG_BASE + 0x304) ; パワーコントロール
REG_DIVCNT * (REG_BASE + 0x280) ; 除算器 コントロール
REG_DIV_NUMER * (REG_BASE + 0x290) ; 被除数
REG_DIV_DENOM * (REG_BASE + 0x298) ; 除数
REG_DIV_RESULT * (REG_BASE + 0x2a0) ; 商
REG_DIVREM_RESULT * (REG_BASE + 0x2a8) ; 余り
REG_SQRTCNT * (REG_BASE + 0x2b0) ; 平方根演算器 コントロール
REG_SQRT_RESULT * (REG_BASE + 0x2b4) ; 結果
REG_SQRT_PARAM * (REG_BASE + 0x2b8) ; パラメータ
REG_DISPCNT * (REG_BASE + 0x0) ; 表示コントロール
REG_DISPCNT_L * (REG_BASE + 0x0)
REG_DISPCNT_H * (REG_BASE + 0x2)
REG_DISP2DCNT * (REG_BASE + 0x0) ; 2D表示コントロール
REG_DISP3DCNT * (REG_BASE + 0x60) ; 3D表示コントロール
REG_DISPSTAT * (REG_BASE + 0x4) ; 表示ステータス
REG_VCOUNT * (REG_BASE + 0x6) ; Vカウンタ
REG_GXSTAT * (REG_BASE + 0x600) ; ジオメトリエンジンステータス
REG_VRAMCNT * (REG_BASE + 0x240) ; VRAMコントロール
REG_WRAMCNT * (REG_BASE + 0x247) ; 内部ワークRAMコントロール
REG_WVRAMCNT * (REG_BASE + 0x244) ; 内部ワークRAM コントロール
REG_VRAM_A_CNT * (REG_BASE + 0x240) ;
REG_VRAM_B_CNT * (REG_BASE + 0x241) ;
REG_VRAM_C_CNT * (REG_BASE + 0x242) ;
REG_VRAM_D_CNT * (REG_BASE + 0x243) ;
REG_VRAM_E_CNT * (REG_BASE + 0x244) ;
REG_VRAM_F_CNT * (REG_BASE + 0x245) ;
REG_VRAM_G_CNT * (REG_BASE + 0x246) ;
REG_VRAM_H_CNT * (REG_BASE + 0x248) ;
REG_VRAM_I_CNT * (REG_BASE + 0x249) ;
REG_VRAM_AB_CNT * (REG_BASE + 0x240) ;
REG_VRAM_CD_CNT * (REG_BASE + 0x242) ;
REG_VRAM_EF_CNT * (REG_BASE + 0x244) ;
REG_VRAM_G_W_CNT * (REG_BASE + 0x246) ; 内部ワークRAM
REG_VRAM_ABCD_CNT * (REG_BASE + 0x240) ;
REG_VRAM_EFG_W_CNT * (REG_BASE + 0x244) ; 内部ワークRAM
REG_VRAM_HI_CNT * (REG_BASE + 0x248) ;
REG_MASTER_BRIGHT * (REG_BASE + 0x6c) ; マスター輝度 コントロール
REG_DISPCAPCNT * (REG_BASE + 0x64) ; 表示キャプチャ コントロール
REG_DISP_MMEM_FIFO * (REG_BASE + 0x68) ; メインメモリ表示FIFO
REG_MOSAIC * (REG_BASE + 0x4c) ; モザイク サイズ
REG_BLDCNT * (REG_BASE + 0x50) ; ブレンドモード コントロール
REG_BLDALPHA * (REG_BASE + 0x52) ; 半透明 パラメータ
REG_BLDY * (REG_BASE + 0x54) ; 輝度変更 パラメータ
REG_WINCNT * (REG_BASE + 0x40) ; ウインドウ コントロール
REG_WIN0H * (REG_BASE + 0x40) ; ウインドウ0水平領域
REG_WIN1H * (REG_BASE + 0x42) ; ウインドウ1水平領域
REG_WIN0V * (REG_BASE + 0x44) ; ウインドウ0垂直領域
REG_WIN1V * (REG_BASE + 0x46) ; ウインドウ1垂直領域
REG_WININ * (REG_BASE + 0x48) ; ウインドウ内コントロール
REG_WIN0 * (REG_BASE + 0x48) ; ウインドウ0コントロール
REG_WIN1 * (REG_BASE + 0x49) ; ウインドウ1コントロール
REG_WIN01 * (REG_BASE + 0x48) ; ウインドウ0・1コントロール
REG_WINOUT * (REG_BASE + 0x4a) ; ウインドウ外コントロール
REG_OBJWIN * (REG_BASE + 0x4b) ; OBJウインドウコントロール
REG_WINOUTOBJ * (REG_BASE + 0x4a) ; ウインドウ外・OBJウインドウコントロール
REG_BGCNT * (REG_BASE + 0x8) ; BGコントロール
REG_BG0CNT * (REG_BASE + 0x8) ; BG0コントロール
REG_BG1CNT * (REG_BASE + 0xa) ; BG1コントロール
REG_BG2CNT * (REG_BASE + 0xc) ; BG2コントロール
REG_BG3CNT * (REG_BASE + 0xe) ; BG3コントロール
REG_BGOFS * (REG_BASE + 0x10) ; BGオフセット
REG_BG0HOFS * (REG_BASE + 0x10) ; BG0Hオフセット
REG_BG0VOFS * (REG_BASE + 0x12) ; BG0Vオフセット
REG_BG1HOFS * (REG_BASE + 0x14) ; BG1Hオフセット
REG_BG1VOFS * (REG_BASE + 0x16) ; BG1Vオフセット
REG_BG2HOFS * (REG_BASE + 0x18) ; BG2Hオフセット
REG_BG2VOFS * (REG_BASE + 0x1a) ; BG2Vオフセット
REG_BG3HOFS * (REG_BASE + 0x1c) ; BG3Hオフセット
REG_BG3VOFS * (REG_BASE + 0x1e) ; BG3Vオフセット
REG_BG2AFFINE * (REG_BASE + 0x20) ; BG2アフィン変換パラメータ群
REG_BG2PA * (REG_BASE + 0x20) ; BG2ライン方向X座標差分
REG_BG2PB * (REG_BASE + 0x22) ; 垂直方向X座標差分
REG_BG2PC * (REG_BASE + 0x24) ; BG2ライン方向Y座標差分
REG_BG2PD * (REG_BASE + 0x26) ; 垂直方向Y座標差分
REG_BG2X * (REG_BASE + 0x28) ; BG2スタートX座標
REG_BG2Y * (REG_BASE + 0x2c) ; BG2スタートY座標
REG_BG3AFFINE * (REG_BASE + 0x30) ; BG3アフィン変換パラメータ群
REG_BG3PA * (REG_BASE + 0x30) ; BG3ライン方向X座標差分
REG_BG3PB * (REG_BASE + 0x32) ; 垂直方向X座標差分
REG_BG3PC * (REG_BASE + 0x34) ; BG3ライン方向Y座標差分
REG_BG3PD * (REG_BASE + 0x36) ; 垂直方向Y座標差分
REG_BG3X * (REG_BASE + 0x38) ; BG3スタートX座標
REG_BG3Y * (REG_BASE + 0x3c) ; BG3スタートY座標
REG_GXFIFO * (REG_BASE + 0x400) ; ジオメトリFIFO
REG_LISTRAM_COUNT * (REG_BASE + 0x604) ; ポリゴンリストRAMカウンタ
REG_VTXRAM_COUNT * (REG_BASE + 0x606) ; 頂点RAMカウンタ
REG_RDLINES_COUNT * (REG_BASE + 0x320) ; レンダリング済みライン数カウンタ
REG_SWAP_BUFFERS * (REG_BASE + 0x540) ; レンダリングエンジン参照データ群のスワップ
REG_VIEWPORT * (REG_BASE + 0x580) ; 視界
REG_MTX_MODE * (REG_BASE + 0x440) ; 行列モード
REG_MTX_PUSH * (REG_BASE + 0x444) ; 行列プッシュ
REG_MTX_POP * (REG_BASE + 0x448) ; 行列ポップ
REG_MTX_STORE * (REG_BASE + 0x44c) ; 行列ストア
REG_MTX_RESTORE * (REG_BASE + 0x450) ; 行列リストア
REG_MTX_IDENTITY * (REG_BASE + 0x454) ; 単位行列 初期化
REG_MTX_LOAD_4x4 * (REG_BASE + 0x458) ; 行列ロード(4x4)
REG_MTX_LOAD_4x3 * (REG_BASE + 0x45c) ;
REG_MTX_MULT_4x4 * (REG_BASE + 0x460) ; 行列乗算
REG_MTX_MULT_4x3 * (REG_BASE + 0x464) ;
REG_MTX_MULT_3x3 * (REG_BASE + 0x468) ;
REG_MTX_SCALE * (REG_BASE + 0x46c) ; スケール行列乗算(1x3)
REG_MTX_TRANS * (REG_BASE + 0x470) ; 移動行列乗算(1x3)
REG_CLIPMTX_RESULT * (REG_BASE + 0x640) ; カレントクリップ座標行列 読み込み
REG_VECMTX_RESULT * (REG_BASE + 0x680) ; カレントベクトル行列 読み込み
REG_LIGHT_VECTOR * (REG_BASE + 0x4c8) ; ライトベクトル
REG_LIGHT_COLOR * (REG_BASE + 0x4cc) ; ライトカラー
REG_MATERIAL_COLOR * (REG_BASE + 0x4c0) ; マテリアルカラー
REG_DIF_AMB * (REG_BASE + 0x4c0) ; 拡散光 環境光成分
REG_SPE_EMI * (REG_BASE + 0x4c4) ; 反射光 放射光成分
REG_SHININESS * (REG_BASE + 0x4d0) ; 鏡面反射輝度
REG_POLYGON_ATTR * (REG_BASE + 0x4a4) ; ポリゴン属性
REG_TEX_PARAM * (REG_BASE + 0x4a8) ; テクスチャパラメータ
REG_TEXIMAGE_PARAM * (REG_BASE + 0x4a8)
REG_TEXPLTT_BASE * (REG_BASE + 0x4ac)
REG_BEGIN_VTXS * (REG_BASE + 0x500) ; 頂点リスト スタート
REG_END_VTXS * (REG_BASE + 0x504) ; 頂点リスト エンド
REG_COLOR * (REG_BASE + 0x480) ; 頂点カラー
REG_NORMAL * (REG_BASE + 0x484) ; 頂点法線
REG_TEXCOORD * (REG_BASE + 0x488) ; 頂点テクスチャ座標
REG_VTX_16 * (REG_BASE + 0x48c) ; 頂点16bit座標
REG_VTX_10 * (REG_BASE + 0x490) ; 頂点10bit座標
REG_VTX_XY * (REG_BASE + 0x494) ; 頂点16bitXY座標
REG_VTX_XZ * (REG_BASE + 0x498) ; 頂点16bitXZ座標
REG_VTX_YZ * (REG_BASE + 0x49c) ; 頂点16bitYZ座標
REG_VTX_DIFF * (REG_BASE + 0x4a0) ; 頂点16bit座標差分値
REG_BOX_TEST * (REG_BASE + 0x5c0) ; ボックステスト
REG_POS_TEST * (REG_BASE + 0x5c4) ; 位置テスト
REG_VEC_TEST * (REG_BASE + 0x5c8) ; ベクトルテスト
REG_POS_RESULT * (REG_BASE + 0x620) ; 位置テスト結果
REG_VEC_RESULT * (REG_BASE + 0x630) ; ベクトルテスト結果
REG_CLEAR_COLOR_ATTR * (REG_BASE + 0x350) ; カラー&属性バッファ クリア値
REG_CLEAR_DEPTH * (REG_BASE + 0x354) ; Zバッファ クリア値
REG_CLRIMAGE_OFFSET * (REG_BASE + 0x356) ; クリアイメージ オフセット
REG_EDGE_COLOR * (REG_BASE + 0x330) ; エッジカラー
REG_FOG_COLOR * (REG_BASE + 0x358) ; フォグ カラー
REG_FOG_OFFSET * (REG_BASE + 0x35c) ; フォグ オフセット
REG_FOG_TABLE * (REG_BASE + 0x360) ; フォグ濃度テーブル
REG_TOON_TABLE * (REG_BASE + 0x380) ; トゥーンシェーディング・テーブル
REG_ALPHA_TEST_REF * (REG_BASE + 0x340) ; アルファテスト参照値
REG_DISP_1DOT_DEPTH * (REG_BASE + 0x610) ; 1ドットポリゴン描画開始Z値
REG_DMA0 * (REG_BASE + 0xb0) ;
REG_DMA0SAD * (REG_BASE + 0xb0)
REG_DMA0DAD * (REG_BASE + 0xb4)
REG_DMA0CNT * (REG_BASE + 0xb8)
REG_DMA0CNT_L * (REG_BASE + 0xb8)
REG_DMA0CNT_H * (REG_BASE + 0xba)
REG_DMA1 * (REG_BASE + 0xbc) ;
REG_DMA1SAD * (REG_BASE + 0xbc)
REG_DMA1DAD * (REG_BASE + 0xc0)
REG_DMA1CNT * (REG_BASE + 0xc4)
REG_DMA1CNT_L * (REG_BASE + 0xc4)
REG_DMA1CNT_H * (REG_BASE + 0xc6)
REG_DMA2 * (REG_BASE + 0xc8) ;
REG_DMA2SAD * (REG_BASE + 0xc8)
REG_DMA2DAD * (REG_BASE + 0xcc)
REG_DMA2CNT * (REG_BASE + 0xd0)
REG_DMA2CNT_L * (REG_BASE + 0xd0)
REG_DMA2CNT_H * (REG_BASE + 0xd2)
REG_DMA3 * (REG_BASE + 0xd4) ;
REG_DMA3SAD * (REG_BASE + 0xd4)
REG_DMA3DAD * (REG_BASE + 0xd8)
REG_DMA3CNT * (REG_BASE + 0xdc)
REG_DMA3CNT_L * (REG_BASE + 0xdc)
REG_DMA3CNT_H * (REG_BASE + 0xde)
IF :DEF: IRIS_TS
REG_DMA0_CLR_DATA * (REG_BASE + 0xe0) ; クリアデータ
REG_DMA1_CLR_DATA * (REG_BASE + 0xe4)
REG_DMA2_CLR_DATA * (REG_BASE + 0xe8)
REG_DMA3_CLR_DATA * (REG_BASE + 0xec)
ELSE
REG_DMA0_CLR_DATA * (DMA_CLEAR_DATA_BUF + 0x0)
REG_DMA1_CLR_DATA * (DMA_CLEAR_DATA_BUF + 0x4)
REG_DMA2_CLR_DATA * (DMA_CLEAR_DATA_BUF + 0x8)
REG_DMA3_CLR_DATA * (DMA_CLEAR_DATA_BUF + 0xc)
ENDIF
REG_TM0CNT * (REG_BASE + 0x100) ; タイマー0
REG_TM0CNT_L * (REG_BASE + 0x100)
REG_TM0CNT_H * (REG_BASE + 0x102)
REG_TM1CNT * (REG_BASE + 0x104) ; タイマー1
REG_TM1CNT_L * (REG_BASE + 0x104)
REG_TM1CNT_H * (REG_BASE + 0x106)
REG_TM2CNT * (REG_BASE + 0x108) ; タイマー2
REG_TM2CNT_L * (REG_BASE + 0x108)
REG_TM2CNT_H * (REG_BASE + 0x10a)
REG_TM3CNT * (REG_BASE + 0x10c) ; タイマー3
REG_TM3CNT_L * (REG_BASE + 0x10c)
REG_TM3CNT_H * (REG_BASE + 0x10e)
REG_KEYINPUT * (REG_BASE + 0x130) ; キー入力
REG_KEYCNT * (REG_BASE + 0x132) ; キーコントロール
REG_R0CNT * (REG_BASE + 0x134) ; 汎用ポート0
REG_R1CNT * (REG_BASE + 0x138) ;
;-----------------------------------------------------------------------
; レジスタ・オフセット
;-----------------------------------------------------------------------
OFFSET_REG_IME * 0x208 ; 割り込みマスタイネーブル
OFFSET_REG_IE * 0x210 ; 割り込み許可
OFFSET_REG_IF * 0x214 ; 割り込み要求
OFFSET_REG_SUBPINTF * 0x180 ; サブプロセッサインタフェース
OFFSET_REG_SUBP_FIFO_CNT * 0x184 ; CPU間FIFOコントロール
OFFSET_REG_SEND_FIFO * 0x188 ; 送信FIFO
OFFSET_REG_RECV_FIFO * 0x100000 ; 受信FIFO
OFFSET_REG_EXMEMCNT * 0x204 ; 外部メモリコントロール
OFFSET_REG_POWCNT * 0x304 ; パワーコントロール
OFFSET_REG_DIVCNT * 0x280 ; 除算器 コントロール
OFFSET_REG_DIV_NUMER * 0x290 ; 被除数
OFFSET_REG_DIV_DENOM * 0x298 ; 除数
OFFSET_REG_DIV_RESULT * 0x2a0 ; 商
OFFSET_REG_DIVREM_RESULT * 0x2a8 ; 余り
OFFSET_REG_SQRTCNT * 0x2b0 ; 平方根演算器 コントロール
OFFSET_REG_SQRT_RESULT * 0x2b4 ; 結果
OFFSET_REG_SQRT_PARAM * 0x2b8 ; パラメータ
OFFSET_REG_DISPCNT * 0x0 ; 表示コントロール
OFFSET_REG_DISPCNT_L * 0x0
OFFSET_REG_DISPCNT_H * 0x2
OFFSET_REG_DISP2DCNT * 0x0 ; 2D表示コントロール
OFFSET_REG_DISP3DCNT * 0x60 ; 3D表示コントロール
OFFSET_REG_DISPSTAT * 0x4 ; 表示ステータス
OFFSET_REG_VCOUNT * 0x6 ; Vカウンタ
OFFSET_REG_GXSTAT * 0x600 ; ジオメトリエンジンステータス
OFFSET_REG_VRAMCNT * 0x240 ; VRAMコントロール
OFFSET_REG_WRAMCNT * 0x247 ; 内部ワークRAMコントロール
OFFSET_REG_WVRAMCNT * 0x244 ; 内部ワークRAM コントロール
OFFSET_REG_VRAM_A_CNT * 0x240 ;
OFFSET_REG_VRAM_B_CNT * 0x241 ;
OFFSET_REG_VRAM_C_CNT * 0x242 ;
OFFSET_REG_VRAM_D_CNT * 0x243 ;
OFFSET_REG_VRAM_E_CNT * 0x244 ;
OFFSET_REG_VRAM_F_CNT * 0x245 ;
OFFSET_REG_VRAM_G_CNT * 0x246 ;
OFFSET_REG_VRAM_H_CNT * 0x248 ;
OFFSET_REG_VRAM_I_CNT * 0x249 ;
OFFSET_REG_VRAM_AB_CNT * 0x240 ;
OFFSET_REG_VRAM_CD_CNT * 0x242 ;
OFFSET_REG_VRAM_EF_CNT * 0x244 ;
OFFSET_REG_VRAM_G_W_CNT * 0x246 ; 内部ワークRAM
OFFSET_REG_VRAM_ABCD_CNT * 0x240 ;
OFFSET_REG_VRAM_EFG_W_CNT * 0x244 ; 内部ワークRAM
OFFSET_REG_VRAM_HI_CNT * 0x248 ;
OFFSET_REG_MASTER_BRIGHT * 0x6c ; マスター輝度 コントロール
OFFSET_REG_DISPCAPCNT * 0x64 ; 表示キャプチャ コントロール
OFFSET_REG_DISP_MMEM_FIFO * 0x68 ; メインメモリ表示FIFO
OFFSET_REG_TVOUTCNT * 0x70 ; テレビ出力コントロール
OFFSET_REG_MOSAIC * 0x4c ; モザイク サイズ
OFFSET_REG_BLDCNT * 0x50 ; ブレンドモード コントロール
OFFSET_REG_BLDALPHA * 0x52 ; 半透明 パラメータ
OFFSET_REG_BLDY * 0x54 ; 輝度変更 パラメータ
OFFSET_REG_WINCNT * 0x40 ; ウインドウ コントロール
OFFSET_REG_WIN0H * 0x40 ; ウインドウ0水平領域
OFFSET_REG_WIN1H * 0x42 ; ウインドウ1水平領域
OFFSET_REG_WIN0V * 0x44 ; ウインドウ0垂直領域
OFFSET_REG_WIN1V * 0x46 ; ウインドウ1垂直領域
OFFSET_REG_WININ * 0x48 ; ウインドウ内コントロール
OFFSET_REG_WIN0 * 0x48 ; ウインドウ0コントロール
OFFSET_REG_WIN1 * 0x49 ; ウインドウ1コントロール
OFFSET_REG_WIN01 * 0x48 ; ウインドウ0・1コントロール
OFFSET_REG_WINOUT * 0x4a ; ウインドウ外コントロール
OFFSET_REG_OBJWIN * 0x4b ; OBJウインドウコントロール
OFFSET_REG_WINOUTOBJ * 0x4a ; ウインドウ外・OBJウインドウコントロール
OFFSET_REG_BGCNT * 0x8 ; BGコントロール
OFFSET_REG_BG0CNT * 0x8 ; BG0コントロール
OFFSET_REG_BG1CNT * 0xa ; BG1コントロール
OFFSET_REG_BG2CNT * 0xc ; BG2コントロール
OFFSET_REG_BG3CNT * 0xe ; BG3コントロール
OFFSET_REG_BGOFS * 0x10 ; BGオフセット
OFFSET_REG_BG0HOFS * 0x10 ; BG0Hオフセット
OFFSET_REG_BG0VOFS * 0x12 ; BG0Vオフセット
OFFSET_REG_BG1HOFS * 0x14 ; BG1Hオフセット
OFFSET_REG_BG1VOFS * 0x16 ; BG1Vオフセット
OFFSET_REG_BG2HOFS * 0x18 ; BG2Hオフセット
OFFSET_REG_BG2VOFS * 0x1a ; BG2Vオフセット
OFFSET_REG_BG3HOFS * 0x1c ; BG3Hオフセット
OFFSET_REG_BG3VOFS * 0x1e ; BG3Vオフセット
OFFSET_REG_BG2AFFINE * 0x20 ; BG2アフィン変換パラメータ群
OFFSET_REG_BG2PA * 0x20 ; BG2ライン方向X座標差分
OFFSET_REG_BG2PB * 0x22 ; 垂直方向X座標差分
OFFSET_REG_BG2PC * 0x24 ; BG2ライン方向Y座標差分
OFFSET_REG_BG2PD * 0x26 ; 垂直方向Y座標差分
OFFSET_REG_BG2X * 0x28 ; BG2スタートX座標
OFFSET_REG_BG2Y * 0x2c ; BG2スタートY座標
OFFSET_REG_BG3AFFINE * 0x30 ; BG3アフィン変換パラメータ群
OFFSET_REG_BG3PA * 0x30 ; BG3ライン方向X座標差分
OFFSET_REG_BG3PB * 0x32 ; 垂直方向X座標差分
OFFSET_REG_BG3PC * 0x34 ; BG3ライン方向Y座標差分
OFFSET_REG_BG3PD * 0x36 ; 垂直方向Y座標差分
OFFSET_REG_BG3X * 0x38 ; BG3スタートX座標
OFFSET_REG_BG3Y * 0x3c ; BG3スタートY座標
OFFSET_REG_GXFIFO * 0x400 ; ジオメトリFIFO
OFFSET_REG_LISTRAM_COUNT * 0x604 ; ポリゴンリストRAMカウンタ
OFFSET_REG_VTXRAM_COUNT * 0x606 ; 頂点RAMカウンタ
OFFSET_REG_RDLINES_COUNT * 0x320 ; レンダリング済みライン数カウンタ
OFFSET_REG_SWAP_BUFFERS * 0x540 ; レンダリングエンジン参照データ群のスワップ
OFFSET_REG_VIEWPORT * 0x580 ; 視界
OFFSET_REG_MTX_MODE * 0x440 ; 行列モード
OFFSET_REG_MTX_PUSH * 0x444 ; 行列プッシュ
OFFSET_REG_MTX_POP * 0x448 ; 行列ポップ
OFFSET_REG_MTX_STORE * 0x44c ; 行列ストア
OFFSET_REG_MTX_RESTORE * 0x450 ; 行列リストア
OFFSET_REG_MTX_IDENTITY * 0x454 ; 単位行列 初期化
OFFSET_REG_MTX_LOAD_4x4 * 0x458 ; 行列ロード(4x4)
OFFSET_REG_MTX_LOAD_4x3 * 0x45c ;
OFFSET_REG_MTX_MULT_4x4 * 0x460 ; 行列乗算
OFFSET_REG_MTX_MULT_4x3 * 0x464 ;
OFFSET_REG_MTX_MULT_3x3 * 0x468 ;
OFFSET_REG_MTX_SCALE * 0x46c ; スケール行列乗算(1x3)
OFFSET_REG_MTX_TRANS * 0x470 ; 移動行列乗算(1x3)
OFFSET_REG_CLIPMTX_RESULT * 0x640 ; カレントクリップ座標行列 読み込み
OFFSET_REG_VECMTX_RESULT * 0x680 ; カレントベクトル行列 読み込み
OFFSET_REG_LIGHT_VECTOR * 0x4c8 ; ライトベクトル
OFFSET_REG_LIGHT_COLOR * 0x4cc ; ライトカラー
OFFSET_REG_MATERIAL_COLOR * 0x4c0 ; マテリアルカラー
OFFSET_REG_DIF_AMB * 0x4c0 ; 拡散光 環境光成分
OFFSET_REG_SPE_EMI * 0x4c4 ; 反射光 放射光成分
OFFSET_REG_SHININESS * 0x4d0 ; 鏡面反射輝度
OFFSET_REG_POLYGON_ATTR * 0x4a4 ; ポリゴン属性
OFFSET_REG_TEX_PARAM * 0x4a8 ; テクスチャパラメータ
OFFSET_REG_TEXIMAGE_PARAM * 0x4a8
OFFSET_REG_TEXPLTT_BASE * 0x4ac
OFFSET_REG_BEGIN_VTXS * 0x500 ; 頂点リスト スタート
OFFSET_REG_END_VTXS * 0x504 ; 頂点リスト エンド
OFFSET_REG_COLOR * 0x480 ; 頂点カラー
OFFSET_REG_NORMAL * 0x484 ; 頂点法線
OFFSET_REG_TEXCOORD * 0x488 ; 頂点テクスチャ座標
OFFSET_REG_VTX_16 * 0x48c ; 頂点16bit座標
OFFSET_REG_VTX_10 * 0x490 ; 頂点10bit座標
OFFSET_REG_VTX_XY * 0x494 ; 頂点16bitXY座標
OFFSET_REG_VTX_XZ * 0x498 ; 頂点16bitXZ座標
OFFSET_REG_VTX_YZ * 0x49c ; 頂点16bitYZ座標
OFFSET_REG_VTX_DIFF * 0x4a0 ; 頂点16bit座標差分値
OFFSET_REG_BOX_TEST * 0x5c0 ; ボックステスト
OFFSET_REG_POS_TEST * 0x5c4 ; 位置テスト
OFFSET_REG_VEC_TEST * 0x5c8 ; ベクトルテスト
OFFSET_REG_POS_RESULT * 0x620 ; 位置テスト結果
OFFSET_REG_VEC_RESULT * 0x630 ; ベクトルテスト結果
OFFSET_REG_CLEAR_COLOR_ATTR * 0x350 ; カラー&属性バッファ クリア値
OFFSET_REG_CLEAR_DEPTH * 0x354 ; Zバッファ クリア値
OFFSET_REG_CLRIMAGE_OFFSET * 0x356 ; クリアイメージ オフセット
OFFSET_REG_EDGE_COLOR * 0x330 ; エッジカラー
OFFSET_REG_FOG_COLOR * 0x358 ; フォグ カラー
OFFSET_REG_FOG_OFFSET * 0x35c ; フォグ オフセット
OFFSET_REG_FOG_TABLE * 0x360 ; フォグ濃度テーブル
OFFSET_REG_TOON_TABLE * 0x380 ; トゥーンシェーディング・テーブル
OFFSET_REG_ALPHA_TEST_REF * 0x340 ; アルファテスト参照値
OFFSET_REG_DISP_1DOT_DEPTH * 0x610 ; 1ドットポリゴン描画開始Z値
OFFSET_REG_DMA0 * 0xb0 ;
OFFSET_REG_DMA0SAD * 0xb0
OFFSET_REG_DMA0DAD * 0xb4
OFFSET_REG_DMA0CNT * 0xb8
OFFSET_REG_DMA0CNT_L * 0xb8
OFFSET_REG_DMA0CNT_H * 0xba
OFFSET_REG_DMA1 * 0xbc ;
OFFSET_REG_DMA1SAD * 0xbc
OFFSET_REG_DMA1DAD * 0xc0
OFFSET_REG_DMA1CNT * 0xc4
OFFSET_REG_DMA1CNT_L * 0xc4
OFFSET_REG_DMA1CNT_H * 0xc6
OFFSET_REG_DMA2 * 0xc8 ;
OFFSET_REG_DMA2SAD * 0xc8
OFFSET_REG_DMA2DAD * 0xcc
OFFSET_REG_DMA2CNT * 0xd0
OFFSET_REG_DMA2CNT_L * 0xd0
OFFSET_REG_DMA2CNT_H * 0xd2
OFFSET_REG_DMA3 * 0xd4 ;
OFFSET_REG_DMA3SAD * 0xd4
OFFSET_REG_DMA3DAD * 0xd8
OFFSET_REG_DMA3CNT * 0xdc
OFFSET_REG_DMA3CNT_L * 0xdc
OFFSET_REG_DMA3CNT_H * 0xde
IF :DEF: IRIS_TS
OFFSET_REG_DMA0_CLR_DATA * 0xe0 ; クリアデータ
OFFSET_REG_DMA1_CLR_DATA * 0xe4
OFFSET_REG_DMA2_CLR_DATA * 0xe8
OFFSET_REG_DMA3_CLR_DATA * 0xec
ENDIF
OFFSET_REG_TM0CNT * 0x100 ; タイマー0
OFFSET_REG_TM0CNT_L * 0x100
OFFSET_REG_TM0CNT_H * 0x102
OFFSET_REG_TM1CNT * 0x104 ; タイマー1
OFFSET_REG_TM1CNT_L * 0x104
OFFSET_REG_TM1CNT_H * 0x106
OFFSET_REG_TM2CNT * 0x108 ; タイマー2
OFFSET_REG_TM2CNT_L * 0x108
OFFSET_REG_TM2CNT_H * 0x10a
OFFSET_REG_TM3CNT * 0x10c ; タイマー3
OFFSET_REG_TM3CNT_L * 0x10c
OFFSET_REG_TM3CNT_H * 0x10e
OFFSET_REG_KEYINPUT * 0x130 ; キー入力
OFFSET_REG_KEYCNT * 0x132 ; キーコントロール
OFFSET_REG_R0CNT * 0x134 ; 汎用ポート0
OFFSET_REG_R1CNT * 0x138 ;
ENDIF ; _IRIS_MEMORY_MAP_H
END

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,478 @@
;=====================================================================
; IrisOS_Arm.s
; OSライブラリARMASM用
;
; Copyright (C) 2003-2004 NINTENDO Co.,Ltd.
;=====================================================================
IF :DEF: _IRIS_OS_H
ELSE
_IRIS_OS_H * 1
INCLUDE IrisTargetArm.s
INCLUDE IrisDefineArm.s
;=======================================================================
; ロック変数
;=======================================================================
; ロックID
OS_UNLOCK_ID * 0 ; ロック変数がロックされていない場合のID
OS_MAINP_LOCKED_FLAG * 0x40 ; メインプロセッサによるロック確認フラグ
OS_MAINP_LOCK_ID_START * 0x40 ; メインプロセッサ用ロックIDの割り当て開始番号
OS_MAINP_LOCK_ID_END * 0x6f ; 割り当て終了番号
OS_MAINP_DBG_LOCK_ID * 0x70 ; デバッガ予約番号
OS_MAINP_SYSTEM_LOCK_ID * 0x7f ; システム予約番号
OS_SUBP_LOCKED_FLAG * 0x80 ; サブプロセッサによるロック確認フラグ
OS_SUBP_LOCK_ID_START * 0x80 ; サブプロセッサ用ロックIDの割り当て開始番号
OS_SUBP_LOCK_ID_END * 0xaf ; 割り当て終了番号
OS_SUBP_DBG_LOCK_ID * 0xb0 ; デバッガ予約番号
OS_SUBP_SYSTEM_LOCK_ID * 0xbf ; システム予約番号
OS_LOCK_SUCCESS * 0 ; ロック成功
OS_LOCK_ERROR * -1 ; ロックエラー
OS_UNLOCK_SUCCESS * 0 ; ロック解除成功
OS_UNLOCK_ERROR * -2 ; ロック解除エラー
OS_LOCK_FREE * 0 ; ロック解除中
OS_LOCK_ID_ERROR * -3 ; ロックIDエラー
;-----------------------------------------------------------------------
; ロック関数の初期化
;-----------------------------------------------------------------------
EXTERN OS_InitLock
;-----------------------------------------------------------------------
; ロックIDの獲得
;-----------------------------------------------------------------------
EXTERN OS_GetLockID
;-----------------------------------------------------------------------
; スピンロック(ワード/バイト)
;-----------------------------------------------------------------------
EXTERN OS_LockWord
EXTERN OS_LockByte
EXTERN OS_LockCard
EXTERN OS_LockCartridge
EXTERN OS_LockWramBlock0
EXTERN OS_LockWramBlock1
EXTERN OS_LockVramC
EXTERN OS_LockVramD
EXTERN OS_LockSendFifo
;-----------------------------------------------------------------------
; ロックの解除(ワード/バイト)
;-----------------------------------------------------------------------
EXTERN OS_UnLockWord
EXTERN OS_UnLockByte
EXTERN OS_UnLockCard
EXTERN OS_UnLockCartridge
EXTERN OS_UnLockWramBlock0
EXTERN OS_UnLockWramBlock1
EXTERN OS_UnLockVramC
EXTERN OS_UnLockVramD
EXTERN OS_UnLockSendFifo
;-----------------------------------------------------------------------
; ロックの試行(ワード/バイト)
;-----------------------------------------------------------------------
EXTERN OS_TryLockWord
EXTERN OS_TryLockByte
EXTERN OS_TryLockCard
EXTERN OS_TryLockCartridge
EXTERN OS_TryLockWramBlock0
EXTERN OS_TryLockWramBlock1
EXTERN OS_TryLockVramC
EXTERN OS_TryLockVramD
EXTERN OS_TryLockSendFifo
;-----------------------------------------------------------------------
; ロックフラグの読み込み(ワード/バイト)
;-----------------------------------------------------------------------
EXTERN OS_ReadLockWord
EXTERN OS_ReadLockByte
;-----------------------------------------------------------------------
; ロック変数の所有モジュールIDの読み込みワードバイト
;-----------------------------------------------------------------------
EXTERN OS_ReadOwnerOfLockWord
EXTERN OS_ReadOwnerOfLockByte
;-----------------------------------------------------------------------
; ホールト
;-----------------------------------------------------------------------
IF :DEF: IRIS_BB
ELSE
EXTERN OS_Halt
ENDIF ; IRIS_BB
IF :DEF: IRIS_BB
ELSE
;=======================================================================
; プログラムステータスレジスタ
;=======================================================================
;-----------------------------------------------------------------------
; プログラムステータスレジスタ セットr0=パラメータ)
;-----------------------------------------------------------------------
EXTERN OS_SetCpsr
;-----------------------------------------------------------------------
; カレント・プログラムステータスレジスタ値 獲得
;-----------------------------------------------------------------------
EXTERN OS_GetCpsr
;-----------------------------------------------------------------------
; イネーブル/ディセーブル
;-----------------------------------------------------------------------
EXTERN OS_EnableCpsrIRQ
EXTERN OS_DisableCpsrIRQ
;-----------------------------------------------------------------------
; イネーブル/ディセーブル
;-----------------------------------------------------------------------
EXTERN OS_EnableCpsrFIQ_IRQ
EXTERN OS_DisableCpsrFIQ_IRQ
;=======================================================================
; 例外ベクタ
;=======================================================================
;-----------------------------------------------------------------------
; 例外ベクタを上位/下位アドレスへ移動
;-----------------------------------------------------------------------
EXTERN OS_UpperExceptionVector
EXTERN OS_LowerExceptionVector
;=======================================================================
; プロテクションユニット
;=======================================================================
;-----------------------------------------------------------------------
; プロテクションユニット イネーブル/ディセーブル
;-----------------------------------------------------------------------
EXTERN OS_EnableProtectUnit
EXTERN OS_DisableProtectUnit
;=======================================================================
; 命令キャッシュ
;=======================================================================
;-----------------------------------------------------------------------
; 命令キャッシュ イネーブル/ディセーブル
;-----------------------------------------------------------------------
EXTERN OS_EnableICache
EXTERN OS_DisableICache
;-----------------------------------------------------------------------
; 命令キャッシュ 無効化
;-----------------------------------------------------------------------
EXTERN OS_InvalidateICache
;-----------------------------------------------------------------------
; 命令キャッシュラインのアドレスによる無効化
;-----------------------------------------------------------------------
EXTERN OS_InvalidateICacheAddr
EXTERN OS_InvalidateICacheAddrs
;-----------------------------------------------------------------------
; 命令キャッシュラインのアドレスによるプリフェッチ
;-----------------------------------------------------------------------
EXTERN OS_PrefetchICacheAddr
EXTERN OS_PrefetchICacheAddrs
;-----------------------------------------------------------------------
; 命令キャッシュ ロックダウン
;-----------------------------------------------------------------------
EXTERN OS_LockdownICache
;=======================================================================
; データキャッシュ
;=======================================================================
;-----------------------------------------------------------------------
; データキャッシュ イネーブル/ディセーブル
;-----------------------------------------------------------------------
EXTERN OS_EnableDCache
EXTERN OS_DisableDCache
;-----------------------------------------------------------------------
; データキャッシュ 無効化
;-----------------------------------------------------------------------
EXTERN OS_InvalidateDCache
;-----------------------------------------------------------------------
; データキャッシュラインのアドレスによる無効化
;-----------------------------------------------------------------------
EXTERN OS_InvalidateDCacheAddr
EXTERN OS_InvalidateDCacheAddrs
;-----------------------------------------------------------------------
; データキャッシュ クリーン
;-----------------------------------------------------------------------
EXTERN OS_CleanDCache
;-----------------------------------------------------------------------
; データキャッシュラインのアドレスによるクリーン
;-----------------------------------------------------------------------
EXTERN OS_CleanDCacheAddr
EXTERN OS_CleanDCacheAddrs
;-----------------------------------------------------------------------
; データキャッシュラインのインデックスによるクリーン
;-----------------------------------------------------------------------
EXTERN OS_CleanDCacheIndex
EXTERN OS_CleanDCacheIndices
;-----------------------------------------------------------------------
; データキャッシュ クリーン&無効化
;-----------------------------------------------------------------------
EXTERN OS_Clean2InvalidateDCache
;-----------------------------------------------------------------------
; データキャッシュラインのアドレスによるクリーン&無効化
;-----------------------------------------------------------------------
EXTERN OS_Clean2InvalidateDCacheAddr
EXTERN OS_Clean2InvalidateDCacheAddrs
;-----------------------------------------------------------------------
; データキャッシュラインのインデックスによるクリーン&無効化
;-----------------------------------------------------------------------
EXTERN OS_Clean2InvalidateDCacheIndex
EXTERN OS_Clean2InvalidateDCacheIndices
;-----------------------------------------------------------------------
; データキャッシュラインのアドレスによるプリロード
;-----------------------------------------------------------------------
EXTERN OS_PreloadDCacheAddr
EXTERN OS_PreloadDCacheAddrs
;-----------------------------------------------------------------------
; データキャッシュ ロックダウン
;-----------------------------------------------------------------------
EXTERN OS_LockdownDCache
;=======================================================================
; ライトバッファ
;=======================================================================
;-----------------------------------------------------------------------
; ライトバッファ エンプティ待ち
;-----------------------------------------------------------------------
EXTERN OS_WaitWriteBufferEmpty
;=======================================================================
; 命令TCM
;=======================================================================
;-----------------------------------------------------------------------
; 命令TCM イネーブル/ディセーブル
;-----------------------------------------------------------------------
EXTERN OS_EnableITCM
EXTERN OS_DisableITCM
;-----------------------------------------------------------------------
; 命令TCMパラメータ セット
;-----------------------------------------------------------------------
EXTERN OS_SetParamITCM
;-----------------------------------------------------------------------
; 命令TCMパラメータ 獲得
;-----------------------------------------------------------------------
EXTERN OS_GetParamITCM
;=======================================================================
; データTCM
;=======================================================================
;-----------------------------------------------------------------------
; データTCM イネーブル/ディセーブル
;-----------------------------------------------------------------------
EXTERN OS_EnableICache
EXTERN OS_EnableICache
;-----------------------------------------------------------------------
; データTCMパラメータ セット
;-----------------------------------------------------------------------
EXTERN OS_SetParamDTCM
;-----------------------------------------------------------------------
; データTCMパラメータ 獲得
;-----------------------------------------------------------------------
EXTERN OS_GetParamDTCM
;=======================================================================
; プロテクションリージョン
;=======================================================================
;-----------------------------------------------------------------------
; プロテクションリージョン毎の命令キャッシュ イネーブル/ディセーブル
;-----------------------------------------------------------------------
EXTERN OS_EnableICache4PR
EXTERN OS_DisableICache4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎のデータキャッシュ イネーブル/ディセーブル
;-----------------------------------------------------------------------
EXTERN OS_EnableDCache4PR
EXTERN OS_DisableDCache4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎のライトバッファ イネーブル/ディセーブル
;-----------------------------------------------------------------------
EXTERN OS_EnableWriteBuffer4PR
EXTERN OS_DisableWriteBuffer4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎の命令キャッシュ イネーブルフラグ獲得
;-----------------------------------------------------------------------
EXTERN OS_GetICacheEnableFlags4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎のデータキャッシュ イネーブルフラグ獲得
;-----------------------------------------------------------------------
EXTERN OS_GetDCacheEnableFlags4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎のライトバッファ・イネーブルフラグ 獲得
;-----------------------------------------------------------------------
EXTERN OS_GetWriteBufferEnableFlags4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎の命令アクセス制限 セット
;-----------------------------------------------------------------------
EXTERN OS_SetIPermissions4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎のデータアクセス制限 セット
;-----------------------------------------------------------------------
EXTERN OS_SetDPermissions4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎の命令アクセス制限 獲得
;-----------------------------------------------------------------------
EXTERN OS_GetIPermissions4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎のデータアクセス制限 獲得
;-----------------------------------------------------------------------
EXTERN OS_GetDPermissions4PR
;-----------------------------------------------------------------------
; 各プロテクションリージョンのパラメータ セット
;-----------------------------------------------------------------------
EXTERN OS_SetProtectRegion0
EXTERN OS_SetProtectRegion1
EXTERN OS_SetProtectRegion2
EXTERN OS_SetProtectRegion3
EXTERN OS_SetProtectRegion4
EXTERN OS_SetProtectRegion5
EXTERN OS_SetProtectRegion6
EXTERN OS_SetProtectRegion7
;-----------------------------------------------------------------------
; 各プロテクションリージョンのパラメータ 獲得
;-----------------------------------------------------------------------
EXTERN OS_GetProtectRegion0
EXTERN OS_GetProtectRegion1
EXTERN OS_GetProtectRegion2
EXTERN OS_GetProtectRegion3
EXTERN OS_GetProtectRegion4
EXTERN OS_GetProtectRegion5
EXTERN OS_GetProtectRegion6
EXTERN OS_GetProtectRegion7
ENDIF ; IRIS_BB
ENDIF ; _IRIS_OS_H
END

View File

@ -0,0 +1,477 @@
;=====================================================================
; IrisOS_Mw.s
; OSライブラリMWASMARM用
;
; Copyright (C) 2003-2004 NINTENDO Co.,Ltd.
;=====================================================================
#ifndef _IRIS_OS_H
#define _IRIS_OS_H
.INCLUDE IrisTarget.h
.INCLUDE IrisDefine.h
;=======================================================================
; ロック変数
;=======================================================================
//
#define OS_UNLOCK_ID 0 //
#define OS_MAINP_LOCKED_FLAG 0x40 //
#define OS_MAINP_LOCK_ID_START 0x40 //
#define OS_MAINP_LOCK_ID_END 0x6f //
#define OS_MAINP_DBG_LOCK_ID 0x70 //
#define OS_MAINP_SYSTEM_LOCK_ID 0x7f //
#define OS_SUBP_LOCKED_FLAG 0x80 //
#define OS_SUBP_LOCK_ID_START 0x80 //
#define OS_SUBP_LOCK_ID_END 0xaf //
#define OS_SUBP_DBG_LOCK_ID 0xb0 //
#define OS_SUBP_SYSTEM_LOCK_ID 0xbf //
#define OS_LOCK_SUCCESS 0 //
#define OS_LOCK_ERROR -1 //
#define OS_UNLOCK_SUCCESS 0 //
#define OS_UNLOCK_ERROR -2 //
#define OS_LOCK_FREE 0 //
#define OS_LOCK_ID_ERROR -3 //
;-----------------------------------------------------------------------
; ロック関数の初期化
;-----------------------------------------------------------------------
.EXTERN OS_InitLock
;-----------------------------------------------------------------------
; ロックIDの獲得
;-----------------------------------------------------------------------
.EXTERN OS_GetLockID
;-----------------------------------------------------------------------
; スピンロック(ワード/バイト)
;-----------------------------------------------------------------------
.EXTERN OS_LockWord
.EXTERN OS_LockByte
.EXTERN OS_LockCard
.EXTERN OS_LockCartridge
.EXTERN OS_LockWramBlock0
.EXTERN OS_LockWramBlock1
.EXTERN OS_LockVramC
.EXTERN OS_LockVramD
.EXTERN OS_LockSendFifo
;-----------------------------------------------------------------------
; ロックの解除(ワード/バイト)
;-----------------------------------------------------------------------
.EXTERN OS_UnLockWord
.EXTERN OS_UnLockByte
.EXTERN OS_UnLockCard
.EXTERN OS_UnLockCartridge
.EXTERN OS_UnLockWramBlock0
.EXTERN OS_UnLockWramBlock1
.EXTERN OS_UnLockVramC
.EXTERN OS_UnLockVramD
.EXTERN OS_UnLockSendFifo
;-----------------------------------------------------------------------
; ロックの試行(ワード/バイト)
;-----------------------------------------------------------------------
.EXTERN OS_TryLockWord
.EXTERN OS_TryLockByte
.EXTERN OS_TryLockCard
.EXTERN OS_TryLockCartridge
.EXTERN OS_TryLockWramBlock0
.EXTERN OS_TryLockWramBlock1
.EXTERN OS_TryLockVramC
.EXTERN OS_TryLockVramD
.EXTERN OS_TryLockSendFifo
;-----------------------------------------------------------------------
; ロックフラグの読み込み(ワード/バイト)
;-----------------------------------------------------------------------
.EXTERN OS_ReadLockWord
.EXTERN OS_ReadLockByte
;-----------------------------------------------------------------------
; ロック変数の所有モジュールIDの読み込みワードバイト
;-----------------------------------------------------------------------
.EXTERN OS_ReadOwnerOfLockWord
.EXTERN OS_ReadOwnerOfLockByte
;-----------------------------------------------------------------------
; ホールト
;-----------------------------------------------------------------------
#ifdef IRIS_BB
#else
.EXTERN OS_Halt
#endif // IRIS_BB
#ifdef IRIS_BB
#else
;=======================================================================
; プログラムステータスレジスタ
;=======================================================================
;-----------------------------------------------------------------------
; プログラムステータスレジスタ セットr0=パラメータ)
;-----------------------------------------------------------------------
.EXTERN OS_SetCpsr
;-----------------------------------------------------------------------
; カレント・プログラムステータスレジスタ値 獲得
;-----------------------------------------------------------------------
.EXTERN OS_GetCpsr
;-----------------------------------------------------------------------
; イネーブル/ディセーブル
;-----------------------------------------------------------------------
.EXTERN OS_EnableCpsrIRQ
.EXTERN OS_DisableCpsrIRQ
;-----------------------------------------------------------------------
; イネーブル/ディセーブル
;-----------------------------------------------------------------------
.EXTERN OS_EnableCpsrFIQ_IRQ
.EXTERN OS_DisableCpsrFIQ_IRQ
;=======================================================================
; 例外ベクタ
;=======================================================================
;-----------------------------------------------------------------------
; 例外ベクタを上位/下位アドレスへ移動
;-----------------------------------------------------------------------
.EXTERN OS_UpperExceptionVector
.EXTERN OS_LowerExceptionVector
;=======================================================================
; プロテクションユニット
;=======================================================================
;-----------------------------------------------------------------------
; プロテクションユニット イネーブル/ディセーブル
;-----------------------------------------------------------------------
.EXTERN OS_EnableProtectUnit
.EXTERN OS_DisableProtectUnit
;=======================================================================
; 命令キャッシュ
;=======================================================================
;-----------------------------------------------------------------------
; 命令キャッシュ イネーブル/ディセーブル
;-----------------------------------------------------------------------
.EXTERN OS_EnableICache
.EXTERN OS_DisableICache
;-----------------------------------------------------------------------
; 命令キャッシュ 無効化
;-----------------------------------------------------------------------
.EXTERN OS_InvalidateICache
;-----------------------------------------------------------------------
; 命令キャッシュラインのアドレスによる無効化
;-----------------------------------------------------------------------
.EXTERN OS_InvalidateICacheAddr
.EXTERN OS_InvalidateICacheAddrs
;-----------------------------------------------------------------------
; 命令キャッシュラインのアドレスによるプリフェッチ
;-----------------------------------------------------------------------
.EXTERN OS_PrefetchICacheAddr
.EXTERN OS_PrefetchICacheAddrs
;-----------------------------------------------------------------------
; 命令キャッシュ ロックダウン
;-----------------------------------------------------------------------
.EXTERN OS_LockdownICache
;=======================================================================
; データキャッシュ
;=======================================================================
;-----------------------------------------------------------------------
; データキャッシュ イネーブル/ディセーブル
;-----------------------------------------------------------------------
.EXTERN OS_EnableDCache
.EXTERN OS_DisableDCache
;-----------------------------------------------------------------------
; データキャッシュ 無効化
;-----------------------------------------------------------------------
.EXTERN OS_InvalidateDCache
;-----------------------------------------------------------------------
; データキャッシュラインのアドレスによる無効化
;-----------------------------------------------------------------------
.EXTERN OS_InvalidateDCacheAddr
.EXTERN OS_InvalidateDCacheAddrs
;-----------------------------------------------------------------------
; データキャッシュ クリーン
;-----------------------------------------------------------------------
.EXTERN OS_CleanDCache
;-----------------------------------------------------------------------
; データキャッシュラインのアドレスによるクリーン
;-----------------------------------------------------------------------
.EXTERN OS_CleanDCacheAddr
.EXTERN OS_CleanDCacheAddrs
;-----------------------------------------------------------------------
; データキャッシュラインのインデックスによるクリーン
;-----------------------------------------------------------------------
.EXTERN OS_CleanDCacheIndex
.EXTERN OS_CleanDCacheIndices
;-----------------------------------------------------------------------
; データキャッシュ クリーン&無効化
;-----------------------------------------------------------------------
.EXTERN OS_Clean2InvalidateDCache
;-----------------------------------------------------------------------
; データキャッシュラインのアドレスによるクリーン&無効化
;-----------------------------------------------------------------------
.EXTERN OS_Clean2InvalidateDCacheAddr
.EXTERN OS_Clean2InvalidateDCacheAddrs
;-----------------------------------------------------------------------
; データキャッシュラインのインデックスによるクリーン&無効化
;-----------------------------------------------------------------------
.EXTERN OS_Clean2InvalidateDCacheIndex
.EXTERN OS_Clean2InvalidateDCacheIndices
;-----------------------------------------------------------------------
; データキャッシュラインのアドレスによるプリロード
;-----------------------------------------------------------------------
.EXTERN OS_PreloadDCacheAddr
.EXTERN OS_PreloadDCacheAddrs
;-----------------------------------------------------------------------
; データキャッシュ ロックダウン
;-----------------------------------------------------------------------
.EXTERN OS_LockdownDCache
;=======================================================================
; ライトバッファ
;=======================================================================
;-----------------------------------------------------------------------
; ライトバッファ エンプティ待ち
;-----------------------------------------------------------------------
.EXTERN OS_WaitWriteBufferEmpty
;=======================================================================
; 命令TCM
;=======================================================================
;-----------------------------------------------------------------------
; 命令TCM イネーブル/ディセーブル
;-----------------------------------------------------------------------
.EXTERN OS_EnableITCM
.EXTERN OS_DisableITCM
;-----------------------------------------------------------------------
; 命令TCMパラメータ セット
;-----------------------------------------------------------------------
.EXTERN OS_SetParamITCM
;-----------------------------------------------------------------------
; 命令TCMパラメータ 獲得
;-----------------------------------------------------------------------
.EXTERN OS_GetParamITCM
;=======================================================================
; データTCM
;=======================================================================
;-----------------------------------------------------------------------
; データTCM イネーブル/ディセーブル
;-----------------------------------------------------------------------
.EXTERN OS_EnableICache
.EXTERN OS_EnableICache
;-----------------------------------------------------------------------
; データTCMはイネーブルか?
;-----------------------------------------------------------------------
.EXTERN OS_IsEnableDTCM
;-----------------------------------------------------------------------
; データTCMパラメータ セット
;-----------------------------------------------------------------------
.EXTERN OS_SetParamDTCM
;-----------------------------------------------------------------------
; データTCMパラメータ 獲得
;-----------------------------------------------------------------------
.EXTERN OS_GetParamDTCM
;=======================================================================
; プロテクションリージョン
;=======================================================================
;-----------------------------------------------------------------------
; プロテクションリージョン毎の命令キャッシュ イネーブル/ディセーブル
;-----------------------------------------------------------------------
.EXTERN OS_EnableICache4PR
.EXTERN OS_DisableICache4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎のデータキャッシュ イネーブル/ディセーブル
;-----------------------------------------------------------------------
.EXTERN OS_EnableDCache4PR
.EXTERN OS_DisableDCache4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎のライトバッファ イネーブル/ディセーブル
;-----------------------------------------------------------------------
.EXTERN OS_EnableWriteBuffer4PR
.EXTERN OS_DisableWriteBuffer4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎の命令キャッシュ イネーブルフラグ獲得
;-----------------------------------------------------------------------
.EXTERN OS_GetICacheEnableFlags4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎のデータキャッシュ イネーブルフラグ獲得
;-----------------------------------------------------------------------
.EXTERN OS_GetDCacheEnableFlags4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎のライトバッファ・イネーブルフラグ 獲得
;-----------------------------------------------------------------------
.EXTERN OS_GetWriteBufferEnableFlags4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎の命令アクセス制限 セット
;-----------------------------------------------------------------------
.EXTERN OS_SetIPermissions4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎のデータアクセス制限 セット
;-----------------------------------------------------------------------
.EXTERN OS_SetDPermissions4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎の命令アクセス制限 獲得
;-----------------------------------------------------------------------
.EXTERN OS_GetIPermissions4PR
;-----------------------------------------------------------------------
; プロテクションリージョン毎のデータアクセス制限 獲得
;-----------------------------------------------------------------------
.EXTERN OS_GetDPermissions4PR
;-----------------------------------------------------------------------
; 各プロテクションリージョンのパラメータ セット
;-----------------------------------------------------------------------
.EXTERN OS_SetProtectRegion0
.EXTERN OS_SetProtectRegion1
.EXTERN OS_SetProtectRegion2
.EXTERN OS_SetProtectRegion3
.EXTERN OS_SetProtectRegion4
.EXTERN OS_SetProtectRegion5
.EXTERN OS_SetProtectRegion6
.EXTERN OS_SetProtectRegion7
;-----------------------------------------------------------------------
; 各プロテクションリージョンのパラメータ 獲得
;-----------------------------------------------------------------------
.EXTERN OS_GetProtectRegion0
.EXTERN OS_GetProtectRegion1
.EXTERN OS_GetProtectRegion2
.EXTERN OS_GetProtectRegion3
.EXTERN OS_GetProtectRegion4
.EXTERN OS_GetProtectRegion5
.EXTERN OS_GetProtectRegion6
.EXTERN OS_GetProtectRegion7
#endif // IRIS_BB
#endif // _IRIS_OS_H

View File

@ -0,0 +1,199 @@
//======================================================================
// IrisQUAT.h
// クォータニオンライブラリ
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_QUAT_H
#define _IRIS_QUAT_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTarget.h>
#include <IrisTypes.h>
#include <IrisSinTable.h>
#define QM_S_SFT 14 // クォータニオンから行列への変換の精度調整定数
//----------------------------------------------------------------------
// 軸ベクトルと回転角からクォータニオンへの変換
//
//・軸ベクトルと回転角から求めたクォータニオンをdstpが指すクォータニオンへ格納します。
//
//・引数:
// axisp 回転軸ベクトルのポインタ
// theta 回転角度25610244096段階
// dstp クォータニオン格納バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
#define VEC_Conv2Quat(axisp, theta, dstp) VEC_Conv2QuatPriv(SIN_NDIV_DEFAULT, axisp, theta, dstp)
void VEC_Conv2Quat256(const Vec *axisp, u32 theta, Quat *dstp);
void VEC_Conv2Quat1024(const Vec *axisp, u32 theta, Quat *dstp);
void VEC_Conv2Quat4096(const Vec *axisp, u32 theta, Quat *dstp);
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define VEC_Conv2QuatPriv(ndiv, axisp, theta, dstp) VEC_Conv2QuatNDiv(ndiv, axisp, theta, dstp)
#define VEC_Conv2QuatNDiv(ndiv, axisp, theta, dstp) VEC_Conv2Quat##ndiv( axisp, theta, dstp)
//----------------------------------------------------------------------
// クォータニオンの内積
//
//・2つのクォータニオンの内積を求めます。
//
//・引数:
// a 第1クォータニオンのポインタ
// b 第2クォータニオンのポインタ
//
//・戻り値:内積
//----------------------------------------------------------------------
s32 QUAT_DotProduct(const Quat *a, const Quat *b);
//----------------------------------------------------------------------
// クォータニオンの正規化
//
//・srcpが指すクォータニオンを正規化してdstpが指すクォータニオンへ格納します。
//
//・引数:
// srcp 未正規化クォータニオンのポインタ
// dstp 正規化クォータニオン格納バッファのポインタ
//
//・戻り値:なし
//
//※平方根演算器と除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
void QUAT_Normalize(Quat *srcp, Quat *dstp);
//----------------------------------------------------------------------
// クォータニオンの逆数(逆回転)
//
//・srcpが指すクォータニオンの逆数を求め、dstpが指すクォータニオンへ格納します。
//
//・引数:
// srcp 元のクォータニオンのポインタ
// dstp 逆クォータニオン格納バッファのポインタ
//
//・戻り値:なし
//
//※除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
void QUAT_Inverse(Quat *srcp, Quat *dstp);
//----------------------------------------------------------------------
// クォータニオンの乗算
//
//・つのクォータニオンを乗算してaxbが指すクォータニオンへ格納します。
//
//・引数:
// a 第1クォータニオンのポインタ
// b 第2クォータニオンのポインタ
// axb 乗算クォータニオン格納バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void QUAT_Multiply(Quat *a, Quat *b, Quat *axb);
//----------------------------------------------------------------------
// クォータニオンの加算
//
//・つのクォータニオンを加算した結果をa_bが指すクォータニオンへ格納します。
//
//・引数:
// a 第1クォータニオンのポインタ
// b 第2クォータニオンのポインタ
// a_b 加算後のクォータニオン格納バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void QUAT_Add(Quat *a, Quat *b, Quat *a_b);
//----------------------------------------------------------------------
// クォータニオンの減算
//
//・srcpが指すクォータニオンをスケーリングした結果をdstpが指すクォータニオンへ格納します。
//
//・引数:
// a 第1クォータニオンのポインタ
// b 第2クォータニオンのポインタ
// a_b 減算後のクォータニオン格納バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void QUAT_Sub(Quat *a, Quat *b, Quat *a_b);
//----------------------------------------------------------------------
// クォータニオンのスケーリング
//
//・つのクォータニオンをスケーリングした結果をa_bが指すクォータニオンへ格納します。
//
//・引数:
// srcp スケーリング前のクォータニオンのポインタ
// dstp スケーリング後のクォータニオン格納バッファのポインタ
// scale スケーリングパラメータ
//
//・戻り値:なし
//----------------------------------------------------------------------
void QUAT_Scale(Quat *srcp, Quat *dstp, s32 scale);
//----------------------------------------------------------------------
// クォータニオンの線形補間
//
//・つのクォータニオンを線形補間した結果をdが指すクォータニオンへ格納します。
//
//・引数:
// a 第1クォータニオンのポインタ
// b 第2クォータニオンのポインタ
// d 補間クォータニオン格納バッファのポインタ
// t 補間パラメータ
//
//・戻り値:なし
//----------------------------------------------------------------------
void QUAT_Lerp( Quat *p, Quat *q, Quat *d, s32 t);
//----------------------------------------------------------------------
// クォータニオンの球面線形補間
//
//・つのクォータニオンを球面線形補間した結果をdが指すクォータニオンへ格納します。
//
//・引数:
// a 第1クォータニオンのポインタ
// b 第2クォータニオンのポインタ
// d 補間クォータニオン格納バッファのポインタ
// t 補間パラメータ
//
//・戻り値:なし
//
//※除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
void QUAT_Slerp(Quat *p, Quat *q, Quat *d, s32 t);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_QUAT_H

View File

@ -0,0 +1,128 @@
//======================================================================
// IrisSinTable.h
// Sinテーブル関連
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_SIN_TABLE_H
#define _IRIS_SIN_TABLE_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTarget.h>
#include <IrisTypes.h>
#include <IrisDefine.h>
#define SIN_NDIV_DEFAULT 256 // デフォルトSinテーブルの分割数
#define SINCOS256TBL_ON_TCM // TCM上に配置するのに適した256段階のSinCosテーブルを選択
#define SINCOS1024TBL_ON_TCM // TCM上に配置するのに適した1024段階のSinCosテーブルを選択
#define SINCOS4096TBL_ON_TCM // TCM上に配置するのに適した4096段階のSinCosテーブルを選択
// デフォルトSinテーブルシフト調整有り
#define SinTbl(theta) TrigonTblPriv(Sin, SIN_NDIV_DEFAULT, theta)
#define CosTbl(theta) TrigonTblPriv(Cos, SIN_NDIV_DEFAULT, theta)
// 回転角精度別Sinテーブルシフト調整有り
#ifdef SINCOS256TBL_ON_TCM
#define Sin256Tbl(theta) (sin256_tbl[ ((u16 )((theta) )) >>8])
#define Cos256Tbl(theta) (sin256_tbl[ ((u16 )((theta)+0x10000/4)) >>8])
#else
#define Sin256Tbl(theta) (sincos256_tbl[ (((u16 )((theta) )) >>8) * 2 ])
#define Cos256Tbl(theta) (sincos256_tbl[ (((u16 )((theta) )) >>8) * 2 + 1])
#endif
#ifdef SINCOS1024TBL_ON_TCM
#define Sin1024Tbl(theta) (sin1024_tbl[ ((u16 )((theta) )) >>6])
#define Cos1024Tbl(theta) (sin1024_tbl[ ((u16 )((theta)+0x10000/4)) >>6])
#else
#define Sin1024Tbl(theta) (sincos1024_tbl[(((u16 )((theta) )) >>6) * 2 ])
#define Cos1024Tbl(theta) (sincos1024_tbl[(((u16 )((theta) )) >>6) * 2 + 1])
#endif
#ifdef SINCOS4096TBL_ON_TCM
#define Sin4096Tbl(theta) (sin4096_tbl[ ((u16 )((theta) )) >>4])
#define Cos4096Tbl(theta) (sin4096_tbl[ ((u16 )((theta)+0x10000/4)) >>4])
#else
#define Sin4096Tbl(theta) (sincos4096_tbl[(((u16 )((theta) )) >>4) * 2 ])
#define Cos4096Tbl(theta) (sincos4096_tbl[(((u16 )((theta) )) >>4) * 2 + 1])
#endif
// デフォルトSinテーブルシフト調整無し
#define SinTblImm(theta) TrigonTblImmPriv(Sin, SIN_NDIV_DEFAULT, theta)
#define CosTblImm(theta) TrigonTblImmPriv(Cos, SIN_NDIV_DEFAULT, theta)
// 回転角精度別Sinテーブルシフト調整無し
#ifdef SINCOS256TBL_ON_TCM
#define Sin256TblImm(theta) (sin256_tbl[ (u8 )((theta) )])
#define Cos256TblImm(theta) (sin256_tbl[ (u8 )((theta)+0x100/4 )])
#else
#define Sin256TblImm(theta) (sincos256_tbl[ (u8 )((theta) ) * 2 ])
#define Cos256TblImm(theta) (sincos256_tbl[ (u8 )((theta) ) * 2 + 1])
#endif
#ifdef SINCOS1024TBL_ON_TCM
#define Sin1024TblImm(theta) (sin1024_tbl[ (u16 )((theta) )])
#define Cos1024TblImm(theta) (sin1024_tbl[ (u16 )((theta)+0x400/4 )])
#else
#define Sin1024TblImm(theta) (sincos1024_tbl[(u16 )(theta) )) * 2 ])
#define Cos1024TblImm(theta) (sincos1024_tbl[(u16 )(theta) )) * 2 + 1])
#endif
#ifdef SINCOS4096TBL_ON_TCM
#define Sin4096TblImm(theta) (sin4096_tbl[ (u16 )((theta) )])
#define Cos4096TblImm(theta) (sin4096_tbl[ (u16 )((theta)+0x1000/4)])
#else
#define Sin4096TblImm(theta) (sincos4096_tbl[(u16 )((theta) ) * 2 ])
#define Cos4096TblImm(theta) (sincos4096_tbl[(u16 )((theta) ) * 2 + 1])
#endif
// ArcCosテーブル
#define ArcCosTbl(cos) ((cos) >= V_ONE ? 0 \
: arcCos256_tbl[-(cos) >= V_ONE ? 0 \
: ((cos)>>(V_SFT - 8)) + 0])
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define TrigonTblPriv( trigon, ndiv, theta) TrigonNDivTbl( trigon, ndiv, theta)
#define TrigonNDivTbl( trigon, ndiv, theta) trigon##ndiv##Tbl( theta)
#define TrigonTblImmPriv(trigon, ndiv, theta) TrigonNDivTblImm(trigon, ndiv, theta)
#define TrigonNDivTblImm(trigon, ndiv, theta) trigon##ndiv##TblImm( theta)
extern const s16 sin256_tbl[];
extern const s16 sin1024_tbl[];
extern const s16 sin4096_tbl[];
extern const s16 sincos256_tbl[];
extern const s16 sincos1024_tbl[];
extern const s16 sincos4096_tbl[];
extern const u16 arcCos256_tbl[];
#define ArcTanTbl(tan) (arcTan256_tbl[((tan)>>(9-7)) + 128])
extern const s16 arcTan256_tbl[];
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_SIN_TABLE_H

View File

@ -0,0 +1,235 @@
//======================================================================
// IrisSystemCall.h
// IRIS システムコール
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_SYSTEM_CALL_H
#define _IRIS_SYSTEM_CALL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTarget.h>
#include <IrisTypes.h>
#include <IrisSystemCallDefine.h>
#ifdef __MWERKS__
#ifndef CODE32
#define SystemCall(No) asm { SWI No }
#else
#define SystemCall(No) asm { SWI No << 16 }
#endif
#elif defined( __GNUC__ )
#ifndef CODE32
#define SystemCall(No) asm ("SWI "#No)
#else
#define SystemCall(No) asm ("SWI "#No" << 16")
#endif
#elif defined( __CC_ARM )
#ifndef CODE32
#define SystemCall(No) __asm { SWI No }
#else
#define SystemCall(No) __asm { SWI No << 16 }
#endif
#endif
//----------------------------------------------------------------------
// カード読み込み
//----------------------------------------------------------------------
#if defined(IRIS_TS)
#define SVC_ReadCard(dmaNo, srcp, destp, size) _SVC_ReadCard(dmaNo, (void *)(srcp), (void *)(destp), size)
void _SVC_ReadCard(s32 dmaNo, void *srcp, void *destp, s32 size);
#elif defined(IRIS_TEG)
#define SVC_ReadCard(dmaNo, srcp, destp, size) _SVC_TEG_ReadCard(dmaNo, (void *)(srcp), (void *)(destp), size)
void _SVC_TEG_ReadCard(s32 dmaNo, void *srcp, void *destp, s32 size);
#else
#define SVC_ReadCard(dmaNo, srcp, destp, size) ((void) 0)
#endif
//・カードからデータを読み込みます。
//・カード上のアドレスは512Byte境界、本体側のアドレスは4Byte境界へ
// 合わせる必要があります。
//
//・引数:
// s32 dmaNo DMA番号03 以外の値が渡された時はCPUで読み込みます
// TEGボードでは無視され、常にCPUにて転送されます
// void *srcp カード上のソースアドレス
// void *destp 本体側のデスティネーションアドレス
// s32 size 転送サイズ
//----------------------------------------------------------------------
// 割り込みウェイト
//----------------------------------------------------------------------
void SVC_WaitIntr(u32 clearEnable, u32 intrFlags);
//・IntrFlagsで指定した割り込みが発生するまでHalt状態で待ち続けます。
//・割り込み処理にてINTR_CHECK_BUF (DTCM_END - 0x8) へ該当するフラグをセットして下さい。
//・複数の割り込みを併用した時、OS_Halt()が繰り返し呼び出される場合と比べて
// システムコール呼び出しのオーバーヘッドを軽減することができます。
//
//・引数:
// u32 clearEnable 既に該当フラグがセットされている場合にクリアするかどうかの指定
// u32 intrFlags ウェイトする割り込みの指定IrisSystemCallDefine.h参照
//----------------------------------------------------------------------
// Vブランク割り込みウェイト
//----------------------------------------------------------------------
void SVC_WaitVBlankIntr(void);
//・ブランク割り込みが発生するまでHalt状態で待ち続けます。
//・割り込み処理にてINTR_CHECK_BUF (DTCM_END - 0x8) へ該当するフラグをセットして下さい。
//・複数の割り込みを併用した時、OS_Halt()が繰り返し呼び出される場合と比べて
// システムコール呼び出しのオーバーヘッドを軽減することができます。
//・SVC_WaitIntr(1, V_BLANK_INTR_FLAG)と等価です。
//----------------------------------------------------------------------
// CPUセット
//----------------------------------------------------------------------
void SVC_CpuSet(const void *srcp, void *destp, u32 dmaCntData);
//・DmaSetマクロ互換のパラメータでRAMクリアまたはコピーします。
//・32bit転送では強制的に4Byte境界にてアクセスされますが、
// 16bit転送では引数を2Byte境界へ合わせて渡す必要があります。
//
//・引数:
// void *srcp ソースアドレス
// void *destp デスティネーションアドレス
// u32 dmaCntData DMA_SRC_FIXDMA_32BIT_BUSDMA_COUNT_MASKのみ有効
// DMA_SRC_FIX( 0, 1) = (ソースアドレス・インクリメント, ソースアドレス固定)
// DMA_32BIT_BUS(0, 1) = (16bit転送, 32bit転送)
// DMA_COUNT_MASK & dmaCntData = 転送回数
//
//・上位マクロ:
// SVC_CpuClear, SVC_CpuClearArray, SVC_CpuCopy, SVC_CpuCopyArray
//----------------------------------------------------------------------
// CPU高速セット
//----------------------------------------------------------------------
void SVC_CpuSetFast(const void *srcp, void *destp, u32 dmaCntData);
//・DmaSetマクロ互換のパラメータで高速にRAMクリアまたはコピーします。
//・オーバーフローしない範囲では32Byte単位の複数ロードストア命令が使用されます。
//・4Byte境界以外で引数を与えても強制的に4Byte境界にてアクセスされます。
//
//・引数:
// void *srcp ソースアドレス
// void *destp デスティネーションアドレス
// u32 dmaCntData DMA_SRC_FIXDMA_COUNT_MASKのみ有効
// DMA_SRC_FIX(0, 1) = (ソースアドレス・インクリメント, ソースアドレス固定)
// DMA_COUNT_MASK & dmaCntData = 転送回数
//
//・上位マクロ:
// SVC_CpuClearFast, SVC_CpuClearArrayFast, SVC_CpuCopyFast, SVC_CpuCopyArrayFast
//----------------------------------------------------------------------
// クリア
//----------------------------------------------------------------------
#define SVC_CpuClear(data, destp, size, bit) \
{ \
vu##bit tmp = (vu##bit )(data); \
SVC_CpuSet((u8 *)&(tmp), (u8 *)(destp), ( \
DMA_SRC_FIX | \
DMA_##bit##BIT_BUS | ((size)/(bit/8) & 0x1fffff))); \
}
#define SVC_CpuClearArray(data, destp, bit) \
SVC_CpuClear( data, destp, sizeof(destp), bit)
//・CPUでRAMクリアするシステムコールを呼び出します。
//・クリアデータはスタックに置かれ、それをデスティネーションへコピーします。
//・SVC_CpuClearArrayはデスティネーション配列全体をクリアします。
//
//・引数:
// data クリアデータ
// destp デスティネーションアドレス
// size クリアバイト数
// bit 転送ビット幅16|32
//----------------------------------------------------------------------
// コピー
//----------------------------------------------------------------------
#define SVC_CpuCopy(srcp, destp, size, bit) \
\
SVC_CpuSet((u8 *)(srcp), (u8 *)(destp), ( \
DMA_SRC_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8) & 0x1fffff)))
#define SVC_CpuCopyArray(srcp, destp, bit) \
SVC_CpuCopy( srcp, destp, sizeof(srcp), bit)
//・CPUでコピーするシステムコールを呼び出します。
//・SVC_CpuCopyArrayはソース配列全体をコピーします。
//
//・引数:
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
// bit 転送ビット幅16|32
//----------------------------------------------------------------------
// 高速クリア
//----------------------------------------------------------------------
#define SVC_CpuClearFast(data, destp, size) \
{ \
vu32 tmp = (vu32 )(data); \
SVC_CpuSetFast((u8 *)&(tmp), (u8 *)(destp), ( \
DMA_SRC_FIX | ((size)/(32/8) & 0x1fffff))); \
}
#define SVC_CpuClearArrayFast(data, destp) \
SVC_CpuClearFast( data, destp, sizeof(destp))
//・CPUで高速にRAMクリアするシステムコールを呼び出します。
//・クリアデータはスタックに置かれ、それをデスティネーションへコピーします。
//・オーバーフローしない範囲では32Byte単位の複数ストア命令が使用されます。
//・SVC_CpuClearArrayFastはデスティネーション配列全体をクリアします。
//
//・引数:
// data クリアデータ
// destp デスティネーションアドレス
// size クリアバイト数
//----------------------------------------------------------------------
// 高速コピー
//----------------------------------------------------------------------
#define SVC_CpuCopyFast(srcp, destp, size) \
\
SVC_CpuSetFast((u8 *)(srcp), (u8 *)(destp), ( \
DMA_SRC_INC | ((size)/(32/8) & 0x1fffff)))
#define SVC_CpuCopyArrayFast(srcp, destp) \
SVC_CpuCopyFast( srcp, destp, sizeof(srcp))
//・CPUで高速にコピーするシステムコールを呼び出します。
//・オーバーフローしない範囲では32Byte単位の複数ロードストア命令が使用されます。
//・SVC_CpuCopyArrayFastはソース配列全体をコピーします。
//
//・引数:
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_SYSTEM_CALL_H

View File

@ -0,0 +1,51 @@
;=======================================================================
; IrisSystemCallArm.s
; IRIS システムコールARMASM用
;
; 各システムコールの仕様は IrisSystemCall.h
; を参照して下さい。
;
; Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
;=======================================================================
IF :DEF: _IRIS_SYSTEM_CALL_H
ELSE
_IRIS_SYSTEM_CALL_H * 1
INCLUDE IrisTargetArm.s
INCLUDE IrisSystemCallDefineArm.s
;-----------------------------------------------------------------------
; 割り込みウェイト
;-----------------------------------------------------------------------
EXTERN SVC_WaitIntr
;-----------------------------------------------------------------------
; Vブランク割り込みウェイト
;-----------------------------------------------------------------------
EXTERN SVC_WaitVBlankIntr
;-----------------------------------------------------------------------
; CPUセット
;-----------------------------------------------------------------------
EXTERN SVC_CpuSet
;-----------------------------------------------------------------------
; CPU高速セット
;-----------------------------------------------------------------------
EXTERN SVC_CpuSetFast
ENDIF ; _IRIS_SYSTEM_CALL_H
END

View File

@ -0,0 +1,31 @@
//======================================================================
// IrisSystemCallDefine.h
// IRIS システムコール用定数
//
// Copyright (C) 2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_SYSTEM_CALL_DEFINE_H
#define _IRIS_SYSTEM_CALL_DEFINE_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTarget.h>
//----------------------------------------------------------------------
// システムコールNo
//----------------------------------------------------------------------
#define SWI_NO_WAIT_INTR 4 // SVC_WaitIntr()
#define SWI_NO_WAIT_VBLANK_INTR 5 // SVC_WaitVBlankIntr()
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_SYSTEM_CALL_DEFINE_H

View File

@ -0,0 +1,30 @@
;=======================================================================
; IrisSystemCallDefineArm.s
; IRIS システムコール用定数ARMASM用
;
; Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
;=======================================================================
IF :DEF: _IRIS_SYSTEM_CALL_DEFINE_H
ELSE
_IRIS_SYSTEM_CALL_DEFINE_H * 1
INCLUDE IrisTargetArm.s
;-----------------------------------------------------------------------
; システムコールNo
;-----------------------------------------------------------------------
SWI_NO_WAIT_INTR * 4 ; SVC_WaitIntr()
SWI_NO_WAIT_VBLANK_INTR * 5 ; SVC_WaitVBlankIntr()
SWI_NO_CPU_SET * 11 ; SVC_CpuSet()
SWI_NO_CPU_SET_FAST * 12 ; SVC_CpuSetFast()
ENDIF ; _IRIS_SYSTEM_CALL_DEFINE_H
END

View File

@ -0,0 +1,47 @@
;=======================================================================
; IrisSystemCallMw.s
; IRIS システムコールMWASMARM用
;
; 各システムコールの仕様は IrisSystemCall.h
; を参照して下さい。
;
; Copyright (C) 2003 NINTENDO Co.,Ltd.
;=======================================================================
#ifndef _IRIS_SYSTEM_CALL_H
#define _IRIS_SYSTEM_CALL_H
.INCLUDE IrisTarget.h
.INCLUDE IrisSystemCallDefine.h
;-----------------------------------------------------------------------
; 割り込みウェイト
;-----------------------------------------------------------------------
.EXTERN SVC_WaitIntr
;-----------------------------------------------------------------------
; Vブランク割り込みウェイト
;-----------------------------------------------------------------------
.EXTERN SVC_WaitVBlankIntr
;-----------------------------------------------------------------------
; CPUセット
;-----------------------------------------------------------------------
.EXTERN SVC_CpuSet
;-----------------------------------------------------------------------
; CPU高速セット
;-----------------------------------------------------------------------
.EXTERN SVC_CpuSetFast
#endif // _IRIS_SYSTEM_CALL_H

View File

@ -0,0 +1,38 @@
//======================================================================
// IrisTarget.h
// IRISターゲット選択
//
// Copyright (C) 2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_TARGET_H
#define _IRIS_TARGET_H
#ifdef __cplusplus
extern "C" {
#endif
//#define IRIS_BB // ブレッドボード専用定義への切り換え
//#define IRIS_TEG // TEGボード専用定義への切り換え
#define IRIS_TS // TS専用定義への切り換え
#define MMEM_4M // メインメモリ4M本体用定義への切り換え
#ifdef NDEBUG
#else
//#define ENABLE_DBGLIB // デバッグライブラリを使用します
#endif
//#define NSYNC_SUBP // サブプロセッサと同期を取らない場合
#ifdef IRIS_BB
#else
#define EXCEPT_VEC_TO_ITCM // 例外ベクタを命令TCM上へ移動する場合
#endif
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_TARGET_H

View File

@ -0,0 +1,39 @@
;=======================================================================
; IrisTargetArm.s
; IRISターゲット選択ARMASM用
;
; Copyright (C) 2003 NINTENDO Co.,Ltd.
;=======================================================================
IF :DEF: _IRIS_TARGET_H
ELSE
_IRIS_TARGET_H * 1
; IRIS_BB * 1 ; ブレッドボード専用定義への切り換え
IRIS_TEG * 1 ; TEGボード専用定義への切り換え
; IRIS_TS * 1 ; TS専用定義への切り換え
MMEM_4M * 1 ; メインメモリ4M本体用定義への切り換え
IF :DEF: NDEBUG
ELSE
; ENABLE_DBGLIB ; デバッグライブラリを使用します
ENDIF
; NSYNC_SUBP * 1 ; サブプロセッサと同期を取らない場合
IF :DEF: IRIS_BB
ELSE
EXCEPT_VEC_TO_ITCM * 1 ; 例外ベクタを命令TCM上へ移動する場合
ENDIF
ENDIF ; _IRIS_TARGET_H
END

View File

@ -0,0 +1,851 @@
//======================================================================
// IrisTypes.h
// IRIS 標準型宣言
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_TYPES_H
#define _IRIS_TYPES_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTarget.h>
//----------------------------------------------------------------------
// データタイプ再定義
//----------------------------------------------------------------------
typedef unsigned char u8;
typedef unsigned short int u16;
typedef unsigned int u32;
typedef unsigned long long int u64;
typedef signed char s8;
typedef signed short int s16;
typedef signed int s32;
typedef signed long long int s64;
typedef float f32;
typedef double f64;
#define vl volatile
typedef vl u8 vu8;
typedef vl u16 vu16;
typedef vl u32 vu32;
typedef vl u64 vu64;
typedef vl s8 vs8;
typedef vl s16 vs16;
typedef vl s32 vs32;
typedef vl s64 vs64;
typedef vl f32 vf32;
typedef vl f64 vf64;
// ディスプレイリスト
typedef u32 Gxl;
typedef vl Gxl vGxl;
// ライトベクトル
typedef struct {
s32 x:10;
s32 y:10;
s32 z:10;
u32 no:2;
} LightVector;
typedef vl LightVector vLightVector;
// ライトカラー
typedef struct {
u16 r:5;
u16 g:5;
u16 b:5;
u16 :0;
u16 :14;
u16 no:2;
} LightColor;
typedef vl LightColor vLightColor;
// 10bit 3Dベクトルテストベクトル
typedef struct {
s32 x:10;
s32 y:10;
s32 z:10;
} Vec10, Pos10, TestVec;
typedef vl Pos10 vPos10;
typedef vl Vec10 vVec10;
typedef vl TestVec vTestVec;
// 16bit 3Dベクトル標準ベクトル、テスト位置座標
typedef struct {
s16 x;
s16 y;
s16 z;
s16 w; // パッド領域(生成コードの高速化のために追加)
} Vec16, Vec, Pos16, TestPos;
typedef vl Pos16 vPos16;
typedef vl Vec16 vVec16;
typedef vl Vec vVec;
typedef vl TestPos vTestPos;
// 32bit 3Dベクトル標準位置座標
typedef struct {
s32 x;
s32 y;
s32 z;
} Vec32, Pos32, Pos;
typedef vl Vec32 vVec32;
typedef vl Pos32 vPos32;
typedef vl Pos vPos;
// 16bit クォータニオン(標準クォータニオン)
typedef struct {
s16 x;
s16 y;
s16 z;
s16 w;
} Quat16, Quat;
typedef vl Quat16 vQuat16;
typedef vl Quat vQuat;
// 32bit クォータニオン
typedef struct {
s32 x;
s32 y;
s32 z;
s32 w;
} Quat32;
typedef vl Quat32 vQuat32;
// 16bit 2Dベクトル標準2Dベクトル
typedef struct {
s16 x;
s16 y;
} Vec2D16, Pos2D16, Vec2D;
typedef vl Vec2D16 vVec2D16;
typedef vl Pos2D16 vPos2D16;
typedef vl Vec2D vVec2D;
// 32bit 2Dベクトル標準2D位置座標
typedef struct {
s32 x;
s32 y;
} Vec2D32, Pos2D32, Pos2D;
typedef vl Vec2D32 vVec2D32;
typedef vl Pos2D32 vPos2D32;
typedef vl Pos2D vPos2D;
// テクスチャ座標
typedef struct {
s16 s;
s16 t;
} TexCoord, ST1616_t;
typedef vl TexCoord vTexCoord;
typedef vl ST1616_t vST1616_t;
// テストボックス
typedef struct {
s16 x;
s16 y;
s16 z;
s16 w;
s16 h;
s16 d;
} TestBox, Box16_t;
typedef vl TestBox vTestBox;
typedef vl Box16_t vBox16_t;
// 5bitカラー
typedef struct {
u16 r:5;
u16 g:5;
u16 b:5;
u16 a:1;
} Color5, RGBA5551_t;
typedef vl Color5 vColor5;
typedef vl RGBA5551_t vRGBA5551_t;
// 8bitカラー
typedef struct {
u8 r;
u8 g;
u8 b;
u8 a;
} Color8, RGBA8888_t;
typedef vl Color8 vColor8;
typedef vl RGBA8888_t vRGBA8888_t;
// 3要素の行
typedef s32 MtxRow3_t[3];
typedef struct {
MtxRow3_t r;
} MtxRow3;
typedef MtxRow3 MtxRow;
typedef MtxRow3 Mtx33Row;
typedef vl MtxRow vMtxRow;
typedef vl MtxRow3 vMtxRow3;
typedef vl Mtx33Row vMtx33Row;
// 4要素の行
typedef s32 MtxRow4_t[4];
typedef struct {
MtxRow4_t r;
} MtxRow4;
typedef MtxRow4 Mtx44Row;
typedef vl MtxRow4 vMtxRow4;
typedef vl Mtx44Row vMtx44Row;
// 4x3行列
typedef s32 Mtx_t[4][3];
typedef union {
Mtx_t m;
} Mtx;
typedef vl Mtx vMtx;
// 3x3行列
typedef s32 Mtx33_t[3][3];
typedef union {
Mtx33_t m;
} Mtx33;
typedef vl Mtx33 vMtx33;
// 4x4行列
// used for projection matrix
typedef s32 Mtx44_t[4][4];
typedef union {
Mtx44_t m;
} Mtx44;
typedef vl Mtx44 vMtx44;
//----------------------------------------------------------------------
// 構造体
//----------------------------------------------------------------------
// プログラムステータスレジスタ構造体
typedef struct {
u32 cpuMode:5; // CPUモード
u32 thumbState:1; // THUMBステート
u32 fiq_disable:1; // FIQ不許可
u32 irq_disable:1; // IRQ不許可
u32 :19;
u32 q:1; // スティッキーオーバーフロー
u32 v:1; // オーバーフロー
u32 c:1; // キャリー/ボロー/拡張
u32 z:1; // ゼロ
u32 n:1; // 負/未満
} PsrData;
typedef vl PsrData vPsrData;
// 割り込み要求/許可フラグ構造体
typedef struct {
u16 blankV:1; // Vブランク
u16 blankH:1; // Hブランク
u16 countV:1; // Vカウンタ一致
u16 timer0:1; // タイマー0
u16 timer1:1; // タイマー1
u16 timer2:1; // タイマー2
u16 timer3:1; // タイマー3
u16 sio:1; // シリアル通信
u16 dma0:1; //
u16 dma1:1; //
u16 dma2:1; //
u16 dma3:1; //
u16 key:1; // キー
u16 cartridge:1; // カートリッジ
u16 :2;
u16 subp:1; // サブプロセッサ
u16 subpSendFifoEmpty:1; // サブプロセッサ間送信FIFOエンプティ
u16 subpRecvFifoNotEmpty:1; // サブプロセッサ間受信FIFOノットエンプティ
u16 cardData:1; // カードデータ
u16 cardIreq:1; // カードIREQ
u16 gxfifo:1; // ジオメトリコマンドFIFO
} IntrFlags;
typedef vl IntrFlags vIntrFlags;
// サブプロセッサインタフェース構造体
typedef struct {
u16 recvStatus:4; // 受信ステータス
u16 :4;
u16 sendStatus:4; // 送信ステータス
u16 :1;
u16 sendIf:1; // 割り込み要求送信
u16 recvIf_enable:1; // 割り込み要求受信 許可
u16 subp_enable:1; // サブプロセッサ イネーブル(削除予定)
} SubpIntf;
typedef vl SubpIntf vSubpIntf;
// サブプロセッサ通信FIFOコントロール構造体
typedef struct {
u16 sendEmpty:1; // 送信FIFO エンプティ
u16 sendFull:1; // フル
u16 sendIf_enable:1; // 割り込み要求 許可
u16 sendClear:1; // クリア
u16 :4;
u16 recvEmpty:1; // 受信FIFO エンプティ
u16 recvFull:1; // フル
u16 recvIf_enable:1; // 割り込み要求 許可
u16 :4;
u16 enable:1; // FIFOイネーブル
} SubpFifoCnt;
typedef vl SubpFifoCnt vSubpFifoCnt;
// VRAMコントロール構造体
typedef struct
{
u8 mode:3;
u8 offset:2;
u8 :2;
u8 enable:1;
} VramCnt;
typedef vl VramCnt vVramCnt;
// 内部ワークRAMコントロール構造体
typedef struct
{
u8 block0:1;
u8 block1:1;
} WramCnt;
typedef vl WramCnt vWramCnt;
// 表示コントロール構造体
typedef struct {
u16 bgMode:3; // BGモード選択
u16 bg0_3D_on:1; // BG0へ3Dを表示
u16 objCharMapType:1; // OBJキャラクタデータ マッピングタイプ
u16 objBmpMapType:2; // OBJビットマップデータ マッピングタイプ
u16 lcdc_off:1; //
u16 bg0_on:1; //
u16 bg1_on:1; //
u16 bg2_on:1; //
u16 bg3_on:1; //
u16 obj_on:1; //
u16 win0_on:1; // ウインドウ0
u16 win1_on:1; // ウインドウ1
u16 objwin_on:1; // OBJウインドウ
u16 dispMode:2; // 表示モード
u16 dispVram:2; // 表示VRAM選択
u16 objCharVramEx:2; // OBJキャラクタデータVRAM拡張
u16 objBmpVramEx:1; // OBJビットマップデータVRAM拡張
u16 blankH_objOff:1; // Hブランク中OBJ処理
u16 bgCharBaseOffset:3; // BGキャラクタデータベースアドレス・オフセット
u16 bgScBaseOffset:3; // BGスクリーンデータベースアドレス・オフセット
u16 bgPlttEx:1; // BGパレット拡張
u16 objPlttEx:1; // OBJパレット拡張
} DispCnt;
typedef vl DispCnt vDispCnt;
// 3D表示コントロール構造体
typedef struct {
u16 texMaster_on:1; // テクスチャマスタ
u16 shadingEx:1; // 拡張シェーディングモード
u16 alphaTest_on:1; // アルファテスト
u16 alphaBlend_on:1; // アルファブレンド
u16 antiAliasing_on:1; // アンチエリアシング
u16 edgeMarking_on:1; // エッジマーキング
u16 fogMode:1; // フォグモード
u16 fogMaster_on:1; // フォグマスタ
u16 fogIndex:4; // フォグ インデックス範囲
u16 render_over:1; // レンダリング オーバーフロー
u16 geometry_over:1; // ジオメトリ オーバーフロー
u16 clearImage_on:1; // プリレンダリングイメージ初期化
} Disp3DCnt;
typedef vl Disp3DCnt vDisp3DCnt;
// 表示ステータス構造体
typedef struct {
u16 blankingV:1; // Vブランク期間中
u16 blankingH:1; // Hブランク期間中
u16 countV:1; // Vカウンタ一致中
u16 blankV_if_enable:1; // Vブランク割り込み要求 許可
u16 blankH_if_enable:1; // Hブランク割り込み要求 許可
u16 countV_if_enable:1; // Vカウンタ一致割り込み要求 許可
u16 :1;
u16 setV_d8:1; // Vカウンタ比較値設定(D8)
u16 setV:8; //
u16 readV:9; // Vカウンタ現在値
u16 :0;
} DispStat;
typedef vl DispStat vDispStat;
// 表示キャプチャコントロール構造体
typedef struct {
u16 gfxBlendWeight:8; // グラフィックス側のブレンド係数
u16 ramBlendWeight:8; // RAM側のブレンド係数
u16 destVram:2; // 書き込みVRAM指定
u16 destVramOffset:2; // 書き込みVRAMアドレス・オフセット
u16 size:2; // キャプチャサイズ
u16 :2;
u16 dispSrc:1; // 表示側読み込み指定
u16 ramSrc:1; // RAM側読み込み指定
u16 srcVramOffset:2; // 読み込みVRAMアドレス・オフセット
u16 :1;
u16 blendMode:2; // ブレンドモード
u16 enable:1; // キャプチャイネーブル
} DispCapCnt;
typedef vl DispCapCnt vDispCapCnt;
// モザイクコントロール構造体
typedef struct {
u16 sizeBgH:4; // BGモザイク Hサイズ
u16 sizeBgV:4; // BGモザイク Vサイズ
u16 sizeObjH:4; // OBJモザイク Hサイズ
u16 sizeObjV:4; // OBJモザイク Vサイズ
} MosCnt;
typedef vl MosCnt vMosCnt;
// ブレンドコントロール構造体
typedef struct {
u16 nearPixel_bg0_on:1; // 1stピクセル
u16 nearPixel_bg1_on:1;
u16 nearPixel_bg2_on:1;
u16 nearPixel_bg3_on:1;
u16 nearPixel_obj_on:1;
u16 nearPixel_bd_on:1;
u16 blendMode:2; // ブレンドモード
u16 farPixel_bg0_on:1; // 2ndピクセル
u16 farPixel_bg1_on:1;
u16 farPixel_bg2_on:1;
u16 farPixel_bg3_on:1;
u16 farPixel_obj_on:1;
u16 farPixel_bd_on:1;
u16 :2;
u16 a:5; // パラメータ
u16 :3;
u16 b:5; // パラメータ
u16 :3;
u16 y:5; // パラメータ
u16 :3;
} BlendCnt;
typedef vl BlendCnt vBlendCnt;
// ウインドウコントロール構造体
typedef struct {
u8 bg0_on:1; //
u8 bg1_on:1; //
u8 bg2_on:1; //
u8 bg3_on:1; //
u8 obj_on:1; //
u8 blend_on:1; // カラー特殊効果
u8 :2;
} WindCnt;
typedef vl WindCnt vWindCnt;
// BGコントロール構造体
typedef struct {
u16 priority:2; // 表示優先
u16 charBasep:2; // キャラクタ ベースアドレス
u16 :2;
u16 mosaic:1; // モザイク
u16 colorMode:1; // 16色/256色 選択
u16 scBasep:5; // スクリーン ベースアドレス
u16 loop:1; // ループ
u16 size:2; // スクリーンサイズ
} BgCnt;
typedef vl BgCnt vBgCnt;
// パレット拡張BGコントロール構造体
typedef struct {
u16 priority:2; // 表示優先
u16 charBasep:2; // キャラクタ ベースアドレス
u16 :2;
u16 mosaic:1; // モザイク
u16 colorMode:1; // 16色/256色 選択
u16 scBasep:5; // スクリーン ベースアドレス
u16 exPlttSlot:1; // 拡張パレットのスロット割り当て
u16 size:2; // スクリーンサイズ
} ExPlttBgCnt;
typedef vl ExPlttBgCnt vExPlttBgCnt;
// BGオフセットコントロール構造体
typedef struct {
u16 h;
u16 v;
} BgOffsetCnt;
typedef vl BgOffsetCnt vBgOffsetCnt;
// BGスクリーン構造体
typedef struct {
u16 charNo:10; // キャラクタNo
u16 flipH:1; // Hフリップ
u16 flipV:1; // Vフリップ
u16 pltt:4; // パレットNo
} BgScData;
typedef vl BgScData vBgScData;
// BGアフィン変換ソースデータ構造体
typedef struct {
s32 srcCenterX; // 元データ中心座標 << 8
s32 srcCenterY;
s16 dispCenterX; // 表示中心座標
s16 dispCenterY;
s16 ratioX; // 拡大縮小率 << 8
s16 ratioY;
s16 theta; // 回転角(-128 127<< 8
} BgAffineSrcData;
typedef vl BgAffineSrcData vBgAffineSrcData;
// BGアフィン変換デスティネーションデータ構造体
typedef struct {
s16 h_diffX; // ライン方向X座標差分
s16 v_diffX; // 垂直方向X座標差分
s16 h_diffY; // ライン方向Y座標差分
s16 v_diffY; // 垂直方向Y座標差分
s32 startX; // スタートX座標
s32 startY; // スタートY座標
} BgAffineDestData;
typedef vl BgAffineDestData vBgAffineDestData;
// OAM構造体
typedef struct {
u16 posV:8; // Y座標
u16 affineMode:2; // アフィンモード
u16 objMode:2; // OBJモード
u16 mosaic:1; // モザイク
u16 colorMode:1; // 16色/256色 選択
u16 shape:2; // OBJ形状
u16 posH:9; // X座標
u16 affineParamNo_lo:3; // アフィン変換パラメータNo 下位3ビット
u16 flipH:1; // Hフリップ
u16 flipV:1; // Vフリップ
u16 size:2; // OBJサイズ
u16 charNo:10; // キャラクタNo
u16 priority:2; // 表示優先
u16 pltt:4; // パレットNo
u16 affineParam; // アフィン変換パラメータ
} OamData;
typedef vl OamData vOamData;
// ビットマップOBJ専用OAM構造体
typedef struct {
u16 posV:8; // Y座標
u16 affineMode:2; // アフィンモード
u16 objMode:2; // OBJモード
u16 mosaic:1; // モザイク
u16 colorMode:1; // 16色/256色 選択
u16 shape:2; // OBJ形状
u16 posH:9; // X座標
u16 affineParamNo_lo:3; // アフィン変換パラメータNo 下位3ビット
u16 flipH:1; // Hフリップ
u16 flipV:1; // Vフリップ
u16 size:2; // OBJサイズ
u16 charNo:10; // キャラクタNo
u16 priority:2; // 表示優先
u16 alpha:4; // アルファ値
u16 affineParam; // アフィン変換パラメータ
} BmpObjOamData;
typedef vl BmpObjOamData vBmpObjOamData;
// OBJアフィン変換ソースデータ構造体
typedef struct {
s16 ratioX; // 拡大縮小率
s16 ratioY;
s16 theta; // 回転角(-128 127<< 8
} ObjAffineSrcData;
typedef vl ObjAffineSrcData vObjAffineSrcData;
// OBJアフィン変換デスティネーションデータ構造体
typedef struct {
s16 h_diffX; // ライン方向X座標差分
s16 v_diffX; // 垂直方向X座標差分
s16 h_diffY; // ライン方向Y座標差分
s16 v_diffY; // 垂直方向Y座標差分
} ObjAffineDestData;
typedef vl ObjAffineDestData vObjAffineDestData;
// カラーパレット構造体
typedef struct {
u16 red:5; // 赤
u16 green:5; // 緑
u16 blue:5; // 青
u16 :1;
} PlttData;
typedef vl PlttData vPlttData;
// 初期化イメージオフセットコントロール構造体
typedef struct
{
u16 x:8;
u16 y:8;
} ClearImageOffsetCnt;
typedef vl ClearImageOffsetCnt vClearImageOffsetCnt;
// ビューポート構造体
typedef struct
{
u16 x1:8;
u16 y1:8;
u16 x2:8;
u16 y2:8;
} ViewPortCnt;
typedef vl ViewPortCnt vViewPortCnt;
// ジオメトリエンジンステータス構造体
typedef struct {
u16 testBusy:1; // テスト処理中
u16 boxInView:1; // ボックスの一部が視体積内にあるか
u16 :6;
u16 posvecStackLevel:5; // 位置&ベクトルマトリクス スタックレベル
u16 projStackLevel:1; // プロジェクションマトリクス スタックレベル
u16 mtxStackBusy:1; // マトリクススタック ビジー
u16 mtxStackError:1; // オーバーフロー or アンダーフロー
u16 fifoCount:8; // ジオメトリFIFO 格納数
u16 fifoFull:1; // フル
u16 fifoUnderHalf:1; // ハーフ以下
u16 fifoEmpty:1; // エンプティ
u16 geometryBusy:1; // ジオメトリエンジン ビジー
u16 :2;
u16 fifoIntrType:2; // ジオメトリFIFO 割り込みタイプ
} GxStat;
typedef vl GxStat vGxStat;
// 行列モード コントロール構造体
typedef struct {
u16 mode; // 行列モード
u16 pad; // パッド領域
} MtxModeCnt;
typedef vl MtxModeCnt vMtxModeCnt;
// ポリゴン属性 コントロール構造体
typedef struct {
u16 light0_on:1; // ライト0
u16 light1_on:1; // ライト1
u16 light2_on:1; // ライト2
u16 light3_on:1; // ライト3
u16 renderMode:2; // レンダリングモード
u16 backFace_on:1; // 裏面
u16 frontFace_on:1; // 表面
u16 :3;
u16 xlu_depth_on:1; // 半透明ポリゴンのデプスバッファ更新
u16 farClipping_on:1; // FARクリッピング
u16 disp1Dot:1; // 1ドット時表示
u16 depthTestMode:1; // デプステストモード
u16 fog_on:1; // フォグ
u16 alpha:8; // 不透明度
u16 id:8; //
} PolygonAttrCnt;
typedef vl PolygonAttrCnt vPolygonAttrCnt;
/// コントロール構造体
typedef struct {
u16 primitiveType; // プリミティブタイプ
u16 pad; // パッド領域
} BeginCnt;
typedef vl BeginCnt vBeginCnt;
// テクスチャパラメータ コントロール構造体
typedef struct {
u16 imageBasep; // イメージベースアドレス
u16 repeatS:1; // Sリピート
u16 repeatT:1; //
u16 flipS:1; // Sフリップ
u16 flipT:1; //
u16 sizeS:3; // Sサイズ
u16 sizeT:3; //
u16 format:3; // テクスチャフォーマット
u16 pltt0_off:1; // カラーパレット0
u16 coordGenSrc:2; // 座標変換ソース
u16 plttBasep; // パレットベースアドレス
u16 pad; // パッド領域
} TexParamCnt;
typedef vl TexParamCnt vTexParamCnt;
// テクスチャイメージパラメータ コントロール構造体
typedef struct {
u16 imageBasep; // イメージベースアドレス
u16 repeatS:1; // Sリピート
u16 repeatT:1; //
u16 flipS:1; // Sフリップ
u16 flipT:1; //
u16 sizeS:3; // Sサイズ
u16 sizeT:3; //
u16 format:3; // テクスチャフォーマット
u16 pltt0_off:1; // カラーパレット0
u16 coordGenSrc:2; // 座標変換ソース
} TexImageParamCnt;
typedef vl TexImageParamCnt vTexImageParamCnt;
// テクスチャパレットベースアドレス コントロール構造体
typedef struct {
u16 plttBasep; // パレットベースアドレス
u16 pad; // パッド領域
} TexPlttBaseCnt;
typedef vl TexPlttBaseCnt vTexPlttBaseCnt;
// DMAコントロール構造体
typedef struct {
u16 count; // 転送数
u16 :5;
u16 destpCnt:2; // 転送先アドレス コントロール
u16 srcpCnt:2; // 転送元アドレス コントロール
u16 continuous:1; // コンティニュアスモード
u16 busSize:1; // バスサイズ /32Bit選択
u16 timming:3; // タイミング選択
u16 if_enable:1; // 割り込み要求 許可
u16 enable:1; // DMA許可
} DmaCnt;
typedef vl DmaCnt vDmaCnt;
// タイマーコントロール構造体
typedef struct {
u16 count; // カウント数
u16 prescaler:2; // プリスケーラ選択
u16 connect:1; // 下位タイマー接続
u16 :3;
u16 if_enable:1; // 割り込み要求 許可
u16 enable:1; // タイマー許可
u16 pad:8; // パッド領域
} TimerCnt;
typedef vl TimerCnt vTimerCnt;
// キーデータ構造体
typedef struct {
u16 a:1; //
u16 b:1; //
u16 select:1; // セレクト
u16 start:1; // スタート
u16 plusR:1; // 右
u16 plusL:1; // 左
u16 plusU:1; // 上
u16 plusD:1; // 下
u16 r:1; //
u16 l:1; //
u16 :6;
} KeyData;
typedef vl KeyData vKeyData;
// キーコントロール構造体
typedef struct {
u16 sel_a:1; // Aボタン 選択
u16 sel_b:1; // Bボタン 選択
u16 sel_select:1; // セレクトボタン 選択
u16 sel_start:1; // スタートボタン 選択
u16 sel_plusR:1; // 右キー 選択
u16 sel_plusL:1; // 左キー 選択
u16 sel_plusU:1; // 上キー 選択
u16 sel_plusD:1; // 下キー 選択
u16 sel_r:1; // Rボタン 選択
u16 sel_l:1; // Lボタン 選択
u16 :4;
u16 if_enable:1; // 割り込み要求 許可
u16 intrType:1; // 割り込みタイプ 選択
} KeyCnt;
typedef vl KeyCnt vKeyCnt;
// 外部メモリコントロール構造体
typedef struct {
u16 ctrdgDt8_cycles:2; // カートリッジ 8bitデータバス アクセスサイクル数
u16 ctrdgtAd16_1stCycles:2; // AD16バス 1stアクセスサイクル数
u16 ctrdgAd16_2ndCycles:1; // 2ndアクセスサイクル数
u16 ctrdgPhiClock:2; // φ端子出力クロック 選択
u16 ctrdgAccess:1; // アクセス権選択
u16 :3;
u16 cardAccess:1; // カードアクセス権選択
#ifdef IRIS_TS
u16 mainmemByteAccess:1; // メインメモリバイトアクセス検出
u16 mainmemCE2:1; // CE2信号出力
#else
u16 :2;
#endif
u16 mainmemInterface:1; // インタフェース
u16 mainmemPriority:1; // 優先権
} ExMemCnt;
typedef vl ExMemCnt vExMemCnt;
// Bit圧縮データ展開用パラメータ
typedef struct {
u16 srcNum; // ソースデータ・バイト数
u16 srcBitNum:8; // 1ソースデータ・ビット数
u16 destBitNum:8; // 1デスティネーションデータ・ビット数
u32 destOffset:31; // ソースデータに加算する数
u32 destOffset0_on:1; // 0のデータにオフセットを加算するか否かのフラグ
} UnPackBitsParam;
typedef vl UnPackBitsParam vUnPackBitsParam;
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_TYPES_H

View File

@ -0,0 +1,357 @@
//====================================================================
// IrisUTL.h
// ユーティリティライブラリ
//
// Copyright (C) 2003 NINTENDO Co.,Ltd.
//====================================================================
#ifndef _IRIS_UTL_H
#define _IRIS_UTL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTarget.h>
#include <IrisTypes.h>
//======================================================================
// クリア コピー
//======================================================================
//----------------------------------------------------------------------
// 16bitクリア
//
//・CPUにて16bitデータでクリアします。
//
//・引数:
// data クリアデータ
// destp デスティネーションアドレス
// size クリアサイズ
//
//・戻り値:なし
//----------------------------------------------------------------------
void UTL_CpuClear16(u32 data, void *destp, s32 size);
//----------------------------------------------------------------------
// 16bitコピー
//
//・CPUにて16bit幅でコピーします。
//
//・引数:
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送サイズ
//
//・戻り値:なし
//----------------------------------------------------------------------
void UTL_CpuCopy16(const void *srcp, void *destp, s32 size);
//----------------------------------------------------------------------
// 32bitクリア
//
//・CPUにて32bitデータでクリアします。
//
//・引数:
// data クリアデータ
// destp デスティネーションアドレス
// size クリアサイズ
//
//・戻り値:なし
//----------------------------------------------------------------------
void UTL_CpuClear32(u32 data, void *destp, s32 size);
//----------------------------------------------------------------------
// 32bitコピー
//
//・CPUにて32bit幅でコピーします。
//
//・引数:
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送サイズ
//
//・戻り値:なし
//----------------------------------------------------------------------
void UTL_CpuCopy32(const void *srcp, void *destp, s32 size);
//----------------------------------------------------------------------
// 高速クリア
//
//・CPUにて32bitデータで高速にクリアします。
//・オーバーフローしない範囲では32Byte単位の複数ストア命令が使用されます。
//
//・引数:
// data クリアデータ
// destp デスティネーションアドレス
// size クリアサイズ
//
//・戻り値:なし
//----------------------------------------------------------------------
void UTL_CpuClearFast(u32 data, void *destp, s32 size);
//----------------------------------------------------------------------
// 高速コピー
//
//・CPUにて32bit幅で高速にコピーします。
//・オーバーフローしない範囲では32Byte単位の複数ロードストア命令が使用されます。
//
//・引数:
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送サイズ
//
//・戻り値:なし
//----------------------------------------------------------------------
void UTL_CpuCopyFast(const void *srcp, void *destp, s32 size);
//----------------------------------------------------------------------
// データのスワップ(ワード/バイト)
//
//・setDataとdestpが指す先のデータをスワップします。
//・プロセッサ間やモジュール間で共有リソースを排他制御するための
// スピンロック等を実現することができます。
//
//・引数:
// setData セットするデータ
// destp スワップ先のポインタ
//
//・戻り値:スワップ先へ直前に格納されていた値
//
//※但し、メインメモリに対してはキャッシュ経由でなければ
// バイトアクセスはできないことに注意して下さい。
// ですので、メインメモリ上では基本的に UTL_SwapWord() を使用して下さい。
//----------------------------------------------------------------------
s32 UTL_SwapWord(u32 setData, volatile u32 *destp);
u8 UTL_SwapByte(u32 setData, volatile u8 *destp);
//======================================================================
// 圧縮データ展開
//======================================================================
//----------------------------------------------------------------------
// Bit圧縮データ展開
//
//・0固定のビットを詰めたデータを展開します。
//・ソースアドレスにメインメモリを指定する場合は
// データキャッシュを有効にする必要があります。
//・デスティネーションアドレスは4Byte境界に合わせて下さい。
//
//・引数:
// void *srcp ソースアドレス
// void *destp デスティネーションアドレス
// UnPackBitsParam *paramp UnPackBitsParam構造体データのアドレス
//
//・UnPackBitsParam構造体
// u16 srcNum ソースデータ・バイト数
// u8 srcBitNum 1ソースデータ・ビット数
// u8 destBitNum 1デスティネーションデータ・ビット数
// u32 destOffset:31 ソースデータに加算するオフセット数
// destOffset0_On:1 0のデータにオフセットを加算するか否かのフラグ
//
//・戻り値:なし
//----------------------------------------------------------------------
void UTL_UnPackBits(const void *srcp, void *destp, UnPackBitsParam *paramp);
//----------------------------------------------------------------------
// LZ77圧縮データ8bit展開
//
//・LZ77圧縮データを展開し、8bit単位で書き込みます。
//・ソースアドレス、デスティネーションアドレスともに、メインメモリを
// 指定する場合はデータキャッシュを有効にする必要があります。
//・VRAMに直接展開することはできません。
//・圧縮データのサイズが4の倍数にならなかった場合は
// 出来るだけ0で詰めて調整して下さい。
//・ソースアドレスは4Byte境界に合わせて下さい。
//
//・引数:
// void *srcp ソースアドレス
// void *destp デスティネーションアドレス
//
//・データヘッダ
// u32 :4 予約
// compType:4 圧縮タイプ( = 1
// destSize:24 展開後のデータサイズ
//
//・フラグデータフォーマット
// u8 flags 圧縮/無圧縮フラグ
// 0, 1 = (無圧縮データ, 圧縮データ)
//・コードデータフォーマットBig Endian
// u16 length:4 展開データ長 - 3一致長3Byte以上時のみ圧縮
// offset:12 一致データオフセット - 1
//
//・戻り値:なし
//----------------------------------------------------------------------
void UTL_UnCompLZ77Byte(const void *srcp, void *destp);
//----------------------------------------------------------------------
// LZ77圧縮データ16bit展開
//
//・LZ77圧縮データを展開し、16bit単位で書き込みます。
//・データTCMやメインメモリにも展開できますが、UTL_UnCompLZ77Byte()
// より低速です。
//・ソースアドレスにメインメモリを指定する場合は
// データキャッシュを有効にする必要があります。
//・圧縮データは一致文字列を2Byte以前より検索したものにして下さい。
//・圧縮データのサイズが4の倍数にならなかった場合は
// 出来るだけ0で詰めて調整して下さい。
//・ソースアドレスは4Byte境界に合わせて下さい。
//
//・引数:
// void *srcp ソースアドレス
// void *destp デスティネーションアドレス
//
//・データヘッダ
// u32 :4 予約
// compType:4 圧縮タイプ( = 1
// destSize:24 展開後のデータサイズ
//
//・フラグデータフォーマット
// u8 flags 圧縮/無圧縮フラグ
// 0, 1 = (無圧縮データ, 圧縮データ)
//・コードデータフォーマットBig Endian
// u16 length:4 展開データ長 - 3一致長3Byte以上時のみ圧縮
// offset:12 一致データオフセット( >= 2 - 1
//
//・戻り値:なし
//----------------------------------------------------------------------
void UTL_UnCompLZ77Short(const void *srcp, void *destp);
//----------------------------------------------------------------------
// ハフマン圧縮データ展開
//
//・ハフマン圧縮データを展開し、32bit単位で書き込みます。
//・ソースアドレスにメインメモリを指定する場合は
// データキャッシュを有効にする必要があります。
//・圧縮データのサイズが4の倍数にならなかった場合は
// 出来るだけ0で詰めて調整して下さい。
//・ソースアドレスは4Byte境界に合わせて下さい。
//
//・引数:
// void *srcp ソースアドレス
// void *destp デスティネーションアドレス
//
//・データヘッダ
// u32 bitSize:4 1データ・ビットサイズ(通常 4|8
// compType:4 圧縮タイプ( = 2
// destSize:24 展開後のデータサイズ
//
//・ツリーテーブル
// u8 treeSize ツリーテーブルサイズ/2 - 1
// TreeNodeData nodeRoot ルートノード
//
// TreeNodeData nodeLeft ルート左ノード
// TreeNodeData nodeRight ルート右ノード
//
// TreeNodeData nodeLeftLeft 左左ノード
// TreeNodeData nodeLeftRight 左右ノード
//
// TreeNodeData nodeRightLeft 右左ノード
// TreeNodeData nodeRightRight 右右ノード
//
// ・
// ・
//
// この後に圧縮データ本体
//
//・TreeNodeData構造体
// u8 nodeNextOffset:6 次ノードデータへのオフセット - 12Byte単位
// rightEndFlag:1 右ノード終了フラグ
// leftEndzflag:1 左ノード終了フラグ
// 終了フラグがセットされている場合
// 次ノードにデータがある
//
//・戻り値:なし
//----------------------------------------------------------------------
void UTL_UnCompHuffman(const void *srcp, void *destp);
//----------------------------------------------------------------------
// ランレングス圧縮データ8bit展開
//
//・ランレングス圧縮データを展開し、8bit単位で書き込みます。
//・ソースアドレス、デスティネーションアドレスともに、メインメモリを
// 指定する場合はデータキャッシュを有効にする必要があります。
//・VRAMに直接展開することはできません。
//・圧縮データのサイズが4の倍数にならなかった場合は
// 出来るだけ0で詰めて調整して下さい。
//・ソースアドレスは4Byte境界に合わせて下さい。
//
//・引数:
// void *srcp ソースアドレス
// void *destp デスティネーションアドレス
//
//・データヘッダ
// u32 :4 予約
// compType:4 圧縮タイプ( = 3
// destSize:24 展開後のデータサイズ
//
//・フラグデータフォーマット
// u8 length:7 展開データ長 - 1無圧縮時
// 展開データ長 - 3連続長3Byte以上時のみ圧縮
// flag:1 0, 1 = (無圧縮データ, 圧縮データ)
//
//・戻り値:なし
//----------------------------------------------------------------------
void UTL_UnCompRLByte(const void *srcp, void *destp);
//----------------------------------------------------------------------
// ランレングス圧縮データ16bit展開
//
//・ランレングス圧縮データを展開し、16bit単位で書き込みます。
//・データTCMやメインメモリにも展開できますが、UTL_UnCompRLByte()
// より低速です。
//・ソースアドレスにメインメモリを指定する場合は
// データキャッシュを有効にする必要があります。
//・圧縮データのサイズが4の倍数にならなかった場合は
// 出来るだけ0で詰めて調整して下さい。
//・ソースアドレスは4Byte境界に合わせて下さい。
//
//・引数:
// void *srcp ソースアドレス
// void *destp デスティネーションアドレス
//
//・データヘッダ
// u32 :4 予約
// compType:4 圧縮タイプ( = 3
// destSize:24 展開後のデータサイズ
//
//・フラグデータフォーマット
// u8 length:7 展開データ長 - 1無圧縮時
// 展開データ長 - 3連続長3Byte以上時のみ圧縮
// flag:1 0, 1 = (無圧縮データ, 圧縮データ)
//
//・戻り値:なし
//----------------------------------------------------------------------
void UTL_UnCompRLShort(const void *srcp, void *destp);
#ifdef __cplusplus
}
#endif
#endif // _IRIS_UTL_H

View File

@ -0,0 +1,112 @@
;=====================================================================
; IrisUTL_Arm.s
; ユーティリティライブラリARMASM用
;
; Copyright (C) 2003 NINTENDO Co.,Ltd.
;=====================================================================
IF :DEF: _IRIS_UTL_H
ELSE
_IRIS_UTL_H * 1
INCLUDE IrisTargetArm.s
;=======================================================================
; クリア コピー
;=======================================================================
;-----------------------------------------------------------------------
; 16bitクリア
;-----------------------------------------------------------------------
EXTERN UTL_CpuClear16
;-----------------------------------------------------------------------
; 16bitコピー
;-----------------------------------------------------------------------
EXTERN UTL_CpuCopy16
;-----------------------------------------------------------------------
; 32bitクリア
;-----------------------------------------------------------------------
EXTERN UTL_CpuClear32
;-----------------------------------------------------------------------
; 32bitコピー
;-----------------------------------------------------------------------
EXTERN UTL_CpuCopy32
;-----------------------------------------------------------------------
; 高速クリア
;-----------------------------------------------------------------------
EXTERN UTL_CpuClearFast
;-----------------------------------------------------------------------
; 高速コピー
;-----------------------------------------------------------------------
EXTERN UTL_CpuCopyFast
;-----------------------------------------------------------------------
; データのスワップ(ワード/バイト)
;-----------------------------------------------------------------------
EXTERN UTL_SwapWord
EXTERN UTL_SwapByte
;=======================================================================
; 圧縮データ展開
;=======================================================================
;-----------------------------------------------------------------------
; Bit圧縮データ展開
;-----------------------------------------------------------------------
EXTERN UTL_UnPackBits
;-----------------------------------------------------------------------
; LZ77圧縮データ8bit展開
;-----------------------------------------------------------------------
EXTERN UTL_UnCompLZ77Byte
;-----------------------------------------------------------------------
; LZ77圧縮データ16bit展開
;-----------------------------------------------------------------------
EXTERN UTL_UnCompLZ77Short
;-----------------------------------------------------------------------
; ハフマン圧縮データ展開
;-----------------------------------------------------------------------
EXTERN UTL_UnCompHuffman
;-----------------------------------------------------------------------
; ランレングス圧縮データ8bit展開
;-----------------------------------------------------------------------
EXTERN UTL_UnCompRLByte
;-----------------------------------------------------------------------
; ランレングス圧縮データ16bit展開
;-----------------------------------------------------------------------
EXTERN UTL_UnCompRLShort
ENDIF ; _IRIS_UTL_H
END

View File

@ -0,0 +1,105 @@
;=====================================================================
; IrisUTL_Mw.s
; ユーティリティライブラリMWASMARM用
;
; Copyright (C) 2003 NINTENDO Co.,Ltd.
;=====================================================================
#ifndef _IRIS_UTL_H
#define _IRIS_UTL_H
.INCLUDE IrisTarget.h
;=======================================================================
; クリア コピー
;=======================================================================
;-----------------------------------------------------------------------
; 16bitクリア
;-----------------------------------------------------------------------
.EXTERN UTL_CpuClear16
;-----------------------------------------------------------------------
; 16bitコピー
;-----------------------------------------------------------------------
.EXTERN UTL_CpuCopy16
;-----------------------------------------------------------------------
; 32bitクリア
;-----------------------------------------------------------------------
.EXTERN UTL_CpuClear32
;-----------------------------------------------------------------------
; 32bitコピー
;-----------------------------------------------------------------------
.EXTERN UTL_CpuCopy32
;-----------------------------------------------------------------------
; 高速クリア
;-----------------------------------------------------------------------
.EXTERN UTL_CpuClearFast
;-----------------------------------------------------------------------
; 高速コピー
;-----------------------------------------------------------------------
.EXTERN UTL_CpuCopyFast
;-----------------------------------------------------------------------
; データのスワップ(ワード/バイト)
;-----------------------------------------------------------------------
.EXTERN UTL_SwapWord
.EXTERN UTL_SwapByte
;=======================================================================
; 圧縮データ展開
;=======================================================================
;-----------------------------------------------------------------------
; Bit圧縮データ展開
;-----------------------------------------------------------------------
.EXTERN UTL_UnPackBits
;-----------------------------------------------------------------------
; LZ77圧縮データ8bit展開
;-----------------------------------------------------------------------
.EXTERN UTL_UnCompLZ77Byte
;-----------------------------------------------------------------------
; LZ77圧縮データ16bit展開
;-----------------------------------------------------------------------
.EXTERN UTL_UnCompLZ77Short
;-----------------------------------------------------------------------
; ハフマン圧縮データ展開
;-----------------------------------------------------------------------
.EXTERN UTL_UnCompHuffman
;-----------------------------------------------------------------------
; ランレングス圧縮データ8bit展開
;-----------------------------------------------------------------------
.EXTERN UTL_UnCompRLByte
;-----------------------------------------------------------------------
; ランレングス圧縮データ16bit展開
;-----------------------------------------------------------------------
.EXTERN UTL_UnCompRLShort
#endif // _IRIS_UTL_H

View File

@ -0,0 +1,241 @@
//======================================================================
// IrisVEC.h
// ベクトルライブラリ
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_VEC_H
#define _IRIS_VEC_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTarget.h>
#include <IrisTypes.h>
//----------------------------------------------------------------------
// ベクトルのコピー
//
//・各ベクトル間でサイズに合わせてコピーします。
//・VEC_AlignPoint2Vec10() / VEC10_AlignPoint2Vec() は16bitベクトルと
// 10bitベクトル間での固定小数点位置の調整も行います。
//
//・引数:
// srcp 転送元ベクトルのポインタ
// dstp 転送先ベクトルバッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void VEC_Copy2Vec10(const Vec *srcp, Vec10 *dstp);
void VEC_Copy2Vec32(const Vec *srcp, Vec32 *dstp);
void VEC32_Copy2Vec(const Vec32 *srcp, Vec *dstp);
void VEC_AlignPoint2Vec10(const Vec *srcp, Vec10 *dstp);
void VEC10_AlignPoint2Vec(const Vec10 *srcp, Vec *dstp);
//----------------------------------------------------------------------
// ベクトルの内積
//
//・2つのベクトルの内積を求めます。
//
//・引数:
// a 第1ベクトルのポインタ
// b 第2ベクトルのポインタ
//
//・戻り値:内積
//----------------------------------------------------------------------
s32 VEC_DotProduct( const Vec *a, const Vec *b);
s32 VEC32_DotProduct( const Vec32 *a, const Vec32 *b);
s32 VEC32_DotProductFast(const Vec32 *a, const Vec32 *b);
s32 VEC32VEC_DotProduct( const Vec32 *a, const Vec *b);
#define VEC2D_DotProduct(ax, ay, bx, by) (((ax) * (bx) + (ay) * (by)) >>V_SFT)
//----------------------------------------------------------------------
// ベクトルの外積
//
//・つのベクトルの外積ベクトルを求め、axbが指すベクトルへ格納します。
//
//・引数:
// a 第1ベクトルのポインタ
// b 第2ベクトルのポインタ
// axb 外積ベクトル格納バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void VEC_CrossProduct( Vec *a, Vec *b, Vec *axb);
void VEC32_CrossProduct( Vec32 *a, Vec32 *b, Vec32 *axb);
void VEC32_CrossProductFast(Vec32 *a, Vec32 *b, Vec32 *axb);
#define VEC2D_CrossProduct(ax, ay, bx, by) (((ax) * (by) - (ay) * (bx)) >>V_SFT)
//----------------------------------------------------------------------
// ベクトルの正規化
//
//・srcpが指すベクトルを正規化してdstpが指すベクトルへ格納します。
//
//・引数:
// srcp 未正規化ベクトルのポインタ
// dstp 正規化ベクトル格納バッファのポインタ
//
//・戻り値:なし
//
//※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
void VEC_Normalize( Vec *srcp, Vec *dstp);
void VEC32_Normalize( Vec32 *srcp, Vec32 *dstp);
void VEC32_Normalize2Vec(Vec32 *srcp, Vec *dstp);
//----------------------------------------------------------------------
// ベクトルの加算
//
//・つのベクトルを加算した結果をa_bが指すベクトルへ格納します。
//
//・引数:
// a 第1ベクトルのポインタ
// b 第2ベクトルのポインタ
// a_b 加算後のベクトル格納バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void VEC_Add(Vec *a, Vec *b, Vec *ab);
//----------------------------------------------------------------------
// ベクトルの減算
//
//・つのベクトルを減算した結果をa_bが指すベクトルへ格納します。
//
//・引数:
// a 第1ベクトルのポインタ
// b 第2ベクトルのポインタ
// a_b 減算後のベクトル格納バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void VEC_Sub(Vec *a, Vec *b, Vec *a_b);
//----------------------------------------------------------------------
// ベクトルのスケーリング
//
//・srcpが指すベクトルをスケーリングした結果をdstpが指すベクトルへ格納します。
//
//・引数:
// srcp スケーリング前のベクトルのポインタ
// dstp スケーリング後のベクトル格納バッファのポインタ
// scale スケーリングパラメータ
//
//・戻り値:なし
//----------------------------------------------------------------------
void VEC_Scale(Vec *srcp, Vec *dstp, s32 scale);
//----------------------------------------------------------------------
// ベクトルの反転
//
//・srcpが指すベクトルを反転した結果をdstpが指すベクトルへ格納します。
//
//・引数:
// srcp 反転前のベクトルのポインタ
// dstp 反転後のベクトル格納バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void VEC_Reverse(const Vec *srcp, Vec *dstp);
//----------------------------------------------------------------------
// ベクトルの大きさ
//
//・ベクトルの大きさを求めます。
//
//・引数:
// v 入力ベクトルのポインタ
//
//・戻り値:大きさ
//
//※平方根演算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
u32 VEC_Magnitude(const Vec *v);
//----------------------------------------------------------------------
// ベクトルの大きさの2乗
//
//・ベクトルの大きさの2乗を求めます。
//
//・引数:
// v 入力ベクトルのポインタ
//
//・戻り値:大きさの2乗
//----------------------------------------------------------------------
u32 VEC_SquareMagnitude(const Vec *v);
//----------------------------------------------------------------------
// ベクトル間の距離
//
//・ベクトル間の距離を求めます。
//
//・引数:
// a 第1ベクトルのポインタ
// b 第2ベクトルのポインタ
//
//・戻り値:距離
//
//※平方根演算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
u32 VEC_Distance(const Vec *a, const Vec *b);
//----------------------------------------------------------------------
// ベクトル間の距離の2乗
//
//・ベクトル間の距離の2乗を求めます。
//
//・引数:
// a 第1ベクトルのポインタ
// b 第2ベクトルのポインタ
//
//・戻り値:距離の2乗
//----------------------------------------------------------------------
u32 VEC_SquareDistance(const Vec *a, const Vec *b);
//----------------------------------------------------------------------
// ベクトルの線形補間
//
//・つのベクトルを線形補間した結果をdが指すベクトルへ格納します。
//
//・引数:
// a 第1ベクトルのポインタ
// b 第2ベクトルのポインタ
// d 補間ベクトル格納バッファのポインタ
// t 補間パラメータ
//
//・戻り値:なし
//----------------------------------------------------------------------
void VEC_Lerp(Vec *a, Vec *b, Vec *d, s32 t);
void VEC32_Lerp(Vec32 *a, Vec32 *b, Vec32 *d, s32 t);
void VEC32_LerpFast(Vec32 *a, Vec32 *b, Vec32 *d, s32 t);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_VEC_H

View File

@ -0,0 +1,424 @@
//====================================================================
// IrisCardDefine.h
// IRIS カード定数
//
// Copyright (C) 2003,2004 NINTENDO Co.,Ltd.
//====================================================================
#ifndef _IRIS_CARD_DEFINE_H
#define _IRIS_CARD_DEFINE_H
#ifdef __cplusplus
extern "C" {
#endif
// カードアクセス・コントロールレジスタ構造体
typedef struct {
u16 latency1:13; // レイテンシ1のサイクル数
u16 dataScramble_on:1; // データスクランブル
u16 scrambleUnit_on:1; // スクランブル回路
u16 initScramblePN:1; // スクランブルPNデータ初期化
u16 latency2:6; // レイテンシ2のサイクル数
u16 cmdScramble_on:1; // コマンドスクランブル
u16 dataReady:1; // データ レディ
u16 pages:3; // ページ数
u16 clockType:1; // クロックタイプ(150ns/240ns)
u16 clockInLatency:1; // レイテンシ期間にクロック供給
u16 reset:1; // リセット信号
u16 accessMode:1; // アクセスモード
u16 start:1; // スタート
} CardCnt;
// カードコントロール・パラメータ構造体
typedef struct {
u32 dmaNo; // DMA番号
u32 cardCnt; // カードコントロール
u32 op[2]; // コマンド
} CardCtrlParam;
// カード非同期読み込み関数型宣言
typedef void (* ReadCardAsyncFuncp)(void *romp, void *ramp, s32 size, CardCtrlParam *paramp);
// カード割り込み関数型宣言
typedef void (* CardIntrFuncp)(void);
// カード割り込みワーク構造体
typedef struct {
u8 *romp; // ROMアドレス
u8 *ramp; // RAMアドレス
s32 restSize; // 残りサイズ
s32 blockSize; // ブロックサイズ
CardCtrlParam param; // カードアクセス・パラメータ構造体
ReadCardAsyncFuncp AsyncFuncp; // カード読み込み関数
// u32 pad; // 予約
} CardIntrWork;
//----------------------------------------------------------------------
// カードDMA
//----------------------------------------------------------------------
#define DmaReadCard(dmaNo, destp) \
\
DmaSet(dmaNo, REG_CARD_DATA, destp, ( \
DMA_ENABLE | DMA_TIMMING_CARD | \
DMA_SRC_FIX | DMA_DEST_INC | \
DMA_CONTINUOUS_ON | \
DMA_32BIT_BUS | (1)))
#define DmaWriteCard(dmaNo, srcp) \
\
DmaSet(dmaNo, srcp, REG_CARD_DATA, ( \
DMA_ENABLE | DMA_TIMMING_CARD | \
DMA_SRC_INC | DMA_DEST_FIX | \
DMA_CONTINUOUS_ON | \
DMA_32BIT_BUS | (1)))
//・カードメモリ間のDMA転送を行います。
//
//・引数:
// dmaNo DMA番号
// srcp ソースアドレス
// destp デスティネーションアドレス
//----------------------------------------------------------------------
// カードのデータ転送はレディか?
//----------------------------------------------------------------------
#define IsCardDataReady() \
\
(*(vu32 *)REG_CARDCNT & CARD_DATA_READY)
//・カードのデータ転送はレディかどうかを返します。
//----------------------------------------------------------------------
// カードデータ待ち
//----------------------------------------------------------------------
#define WaitCardData() \
{ \
while (!IsCardDataReady()) ; \
}
//・カードデータ転送の終了を待ちます。
//----------------------------------------------------------------------
// カードはビジーか?
//----------------------------------------------------------------------
#define IsCardBusy() \
\
(*(vu32 *)REG_CARDCNT & CARD_START)
//・カードがビジーかどうかを返します。
//----------------------------------------------------------------------
// カード待ち
//----------------------------------------------------------------------
#define WaitCard() \
{ \
while (IsCardBusy()) ; \
}
//・カードの終了を待ちます。
//----------------------------------------------------------------------
// コントロールパラメータ獲得NORMALモード
//----------------------------------------------------------------------
#define GetCardCnt4Normal() \
\
(GetCardCnt4Game() & CARD_SCRAMBLE_CLEAR_MASK)
//・NORMALモードのコントロールパラメータを獲得します。
//・スクランブルの設定はクリアします。
//----------------------------------------------------------------------
// コントロールパラメータ獲得SECUREモード
//----------------------------------------------------------------------
#define GetCardCnt4Secure() \
\
(*(vu32 *)MROMCNT_SECURE_BUF & (CARD_CLOCK_TYPE | CARD_LATENCY_MASK))
//・SECUREモードのコントロールパラメータを獲得します。
//----------------------------------------------------------------------
// コントロールパラメータ獲得GAMEモード
//----------------------------------------------------------------------
#define GetCardCnt4Game() \
\
(*(vu32 *)MROMCNT_GAME_BUF)
//・GAMEモードのコントロールパラメータを獲得します。
//----------------------------------------------------------------------
// コントロールパラメータ セットNORMALモード
//----------------------------------------------------------------------
#define SetCardCnt4Normal(param) \
\
(*(vu32 *)MROMCNT_GAME_BUF = param)
//・GAMEモードのコントロールパラメータをセットします。
//----------------------------------------------------------------------
// コントロールパラメータ セットSECUREモード
//----------------------------------------------------------------------
#define SetCardCnt4Secure(param) \
\
(*(vu32 *)MROMCNT_SECURE_BUF = param)
//・SECUREモードのコントロールパラメータをセットします。
//----------------------------------------------------------------------
// コントロールパラメータ セットGAMEモード
//----------------------------------------------------------------------
#define SetCardCnt4Game(param) \
\
(*(vu32 *)MROMCNT_GAME_BUF = param)
//・GAMEモードのコントロールパラメータをセットします。
//----------------------------------------------------------------------
// レイテンシ2をレイテンシ1へ加算
//----------------------------------------------------------------------
#define AddLatency2ToLatency1(param) \
\
( (((param) & CARD_LATENCY2_CYCLES_MASK) \
>> CARD_LATENCY2_CYCLES_SHIFT) \
+ ((param) & ~CARD_LATENCY2_CYCLES_MASK) \
)
//・カードの終了を待ちます。
//----------------------------------------------------------------------
// ROMエリア・マップ
//----------------------------------------------------------------------
#define MROM_SECURE_AREA 0x4000 // SECUREエリア
#define MROM_GAME_AREA 0x8000 // GAMEエリア
//----------------------------------------------------------------------
// ROMエリア・サイズ
//----------------------------------------------------------------------
#define MROM_SEGMENT_SIZE 0x1000 // セグメントサイズ
#define MROM_SECURE_SIZE 0x4000 // SECUREエリアサイズ
//----------------------------------------------------------------------
// メモリ・マップ
//----------------------------------------------------------------------
#define MROMCNT_GAME_BUF (ROM_HEADER_BUF + 0x60) // GAMEモード・コントロールデータ
#define MROMCNT_SECURE_BUF (ROM_HEADER_BUF + 0x64) // SECUREモード・コントロールデータ
//----------------------------------------------------------------------
// レジスタ・アドレス
//----------------------------------------------------------------------
#define REG_CARDMST_SPI_CNT (REG_BASE + 0x1a0) // カードマスター&SPIコントロール
#define REG_CARD_MASTER_CNT (REG_BASE + 0x1a1) // カードマスターコントロール
#define REG_CARD_SPI_CNT (REG_BASE + 0x1a0) // カードSPIコントロール
#define REG_CARD_SPI_DATA (REG_BASE + 0x1a2) // データ
#define REG_CARDCNT (REG_BASE + 0x1a4) // カードコントロール
#define REG_CARD_CMD (REG_BASE + 0x1a8) // コマンド設定
#define REG_CARD_DATA (REG_BASE + 0x100010) // データ
#define REG_CARD_PN_INIT (REG_BASE + 0x1b0) // カードPNデータ初期値
#define REG_CARD_PNA_INIT_L (REG_BASE + 0x1b0)
#define REG_CARD_PNB_INIT_L (REG_BASE + 0x1b4)
#define REG_CARD_PNA_INIT_H (REG_BASE + 0x1b8)
#define REG_CARD_PNB_INIT_H (REG_BASE + 0x1ba)
//----------------------------------------------------------------------
// カード マスターコントロール
//----------------------------------------------------------------------
#define CARDMST_SEL_DEVICE 0x20 // デバイス選択
#define CARDMST_SEL_ROM 0x00 // マスクROM/3Dメモリ選択
#define CARDMST_SEL_SPI 0x20 // SPI選択
#define CARDMST_IF_ENABLE 0x40 // 割り込み要求 許可
#define CARDMST_ENABLE 0x80 // カードイネーブル
//----------------------------------------------------------------------
// カードSPI コントロール
//----------------------------------------------------------------------
#define CARDSPI_SCK_MASK 0x03 // シフトクロック数
#define CARDSPI_SCK_SHIFT 0
#define CARDSPI_SCK_4M 0x00 // シフトクロック 4MHz選択
#define CARDSPI_SCK_2M 0x01 // 2MHz選択
#define CARDSPI_SCK_1M 0x02 // 1MHz選択
#define CARDSPI_SCK_524K 0x03 // 524KHz選択
#define CARDSPI_INV_CS 0x40 // 通信終了時に/CSダウン維持
#define CARDSPI_BUSY 0x80 // ビジー
//----------------------------------------------------------------------
// カードアクセス コントロール
//----------------------------------------------------------------------
#define CARD_LATENCY1_CYCLES_MASK 0x00001fff // レイテンシ1のサイクル数
#define CARD_LATENCY2_CYCLES_MASK 0x003f0000 // レイテンシ2のサイクル数
#define CARD_LATENCY_MASK 0x003f1fff // 上記を合わせたマスク
#define CARD_PAGE_COUNT_MASK 0x07000000 // ページ数
#define CARD_LATENCY1_CYCLES_SHIFT 0
#define CARD_LATENCY2_CYCLES_SHIFT 16
#define CARD_PAGE_COUNT_SHIFT 24
// スクランブルフラグ群のセット
#define CARD_SCRAMBLE_SET_MASK ( CARD_SCRAMBLE_UNIT_ON | CARD_DATA_SCRAMBLE_ON \
| CARD_CMD_SCRAMBLE_ON)
// スクランブルフラグ群のクリア
#define CARD_SCRAMBLE_CLEAR_MASK ( ~(CARD_INIT_SCRAMBLE_PN \
| CARD_SCRAMBLE_SET_MASK \
| CARD_CLOCK_IN_LATENCY \
| CARD_WRITE_MODE))
#define CARD_DATA_SCRAMBLE_ON 0x00002000 // データスクランブル
#define CARD_SCRAMBLE_UNIT_ON 0x00004000 // スクランブル回路
#define CARD_INIT_SCRAMBLE_PN 0x00008000 // スクランブルPNデータ初期化
#define CARD_CMD_SCRAMBLE_ON 0x00400000 // コマンドスクランブル
#define CARD_DATA_READY 0x00800000 // データ レディ
#define CARD_0_PAGE 0x00000000 // 0ページ
#define CARD_1_PAGE 0x01000000 // 1ページ
#define CARD_2_PAGES 0x02000000 // 2ページ
#define CARD_4_PAGES 0x03000000 // 4ページ
#define CARD_8_PAGES 0x04000000 // 8ページ
#define CARD_16_PAGES 0x05000000 // 16ページ
#define CARD_32_PAGES 0x06000000 // 32ページ
#define CARD_STATUS 0x07000000 // ステータスリード
#define CARD_CLOCK_TYPE 0x08000000 // クロック タイプ
#define CARD_CLOCK_150NS 0x00000000 // クロックサイクル
#define CARD_CLOCK_240NS 0x08000000 //
#define CARD_CLOCK_IN_LATENCY 0x10000000 // レイテンシ期間にクロック供給
#define CARD_RESET_LO 0x00000000 // リセット信号レベル
#define CARD_RESET_HI 0x20000000 //
#define CARD_ACCESS_MODE 0x40000000 // アクセス モード
#define CARD_READ_MODE 0x00000000 // リードモード
#define CARD_WRITE_MODE 0x40000000 // ライトモード
#define CARD_START 0x80000000 // スタート
// 構造体メンバ用定数
#define ST_CARD_0_PAGE 0 // 0ページ
#define ST_CARD_1_PAGE 1 // 1ページ
#define ST_CARD_2_PAGES 2 // 2ページ
#define ST_CARD_4_PAGES 3 // 4ページ
#define ST_CARD_8_PAGES 4 // 8ページ
#define ST_CARD_16_PAGES 5 // 16ページ
#define ST_CARD_32_PAGES 6 // 32ページ
#define ST_CARD_STATUS 7 // ステータスリード
#define ST_CARD_CLOCK_150NS 0 // クロックサイクル
#define ST_CARD_CLOCK_240NS 1 //
#define ST_CARD_READ_MODE 0 // リードモード
#define ST_CARD_WRITE_MODE 1 // ライトモード
//----------------------------------------------------------------------
// マスクROMコマンド
//----------------------------------------------------------------------
// NORMALモード
#define MROMOP_N_OP_MASK 0xff000000 // コマンドマスク
#define MROMOP_N_READ_ID 0x90000000 // ID読み込み
#define MROMOP_N_READ_PAGES 0x00000000 // ページ群読み込み
#define MROMOP_N_LOAD_TABLE 0x9f000000 // フラッシュメモリ・テーブル設定
#define MROMOP_N_CHANGE_MODE 0x3c000000 // SECUREモードへ遷移
#define MROMOP_N_READ_ID_PAD_L 0xffffffff
#define MROMOP_N_READ_ID_PAD_H 0x00ffffff
#define MROMOP_N_READ_PAGES_PAD_L 0xffffffff
#define MROMOP_N_READ_PAGES_PAD_H 0x00ffffff
#define MROMOP_N_READ_PAGES_ADDR_MASK 0x000ffffe
#define MROMOP_N_CHANGE_SECURE_PAD_L 0xf00000ff
#define MROMOP_N_CHANGE_SECURE_PAD_H 0x00000000
#define MROMOP_N_VAE_MASK_H 0x00ffffff
#define MROMOP_N_VBI_SHIFT_L 8
// SECUREモード
#define MROM_S_LATENCY1_CYCLES_MIN 0x00008f8 // レイテンシ1の最少サイクル数
#define MROM_S_LATENCY2_CYCLES_MIN 0x0000018 // レイテンシ2の最少サイクル数
#define MROMOP_S_OP_MASK 0xf0000000 // コマンドマスク
#define MROMOP_S_READ_ID 0x10000000 // ID読み込み
#define MROMOP_S_READ_SEGMENT 0x20000000 // 暗号セグメント読み込み
#define MROMOP_S_PNG_ON 0x40000000 // PNジェネレータ
#define MROMOP_S_PNG_OFF 0x60000000 // PNジェネレータ
#define MROMOP_S_CHANGE_MODE 0xa0000000 // GAMEモードへ遷移
#define MROMOP_S_VA_MASK_L 0xfff00000
#define MROMOP_S_VA_MASK_H 0x00000fff
#define MROMOP_S_VB_MASK_L 0x000fffff
#define MROMOP_S_VC_MASK_H 0x0ffff000
#define MROMOP_S_VD_MASK_L 0xfff00000
#define MROMOP_S_VD_MASK_H 0x00000fff
#define MROMOP_S_VA_SHIFT_L 20
#define MROMOP_S_VA_SHIFT_H 12
#define MROMOP_S_VC_SHIFT_H 12
#define MROMOP_S_VD_SHIFT_L 20
#define MROMOP_S_VD_SHIFT_H 12
// GAMEモード
#define MROMOP_G_OP_MASK 0xff000000 // コマンドマスク
#define MROMOP_G_READ_ID 0xb8000000 // ID読み込み
#define MROMOP_G_READ_PAGE 0xb7000000 // ページ読み込み
#define MROMOP_G_READ_PAGE_PAD_L 0x00ffffff
#define MROMOP_G_READ_PAGE_PAD_H 0x00f00000
#define MROMOP_G_READ_PAGE_MASK_L 0x00ffffff
#define MROMOP_G_READ_PAGE_MASK_H 0xfffffffe
#define MROMOP_G_READ_PAGE_ADDR_MASK 0x000ffffe
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_CARD_DEFINE_H

View File

@ -0,0 +1,190 @@
;=======================================================================
; IrisCardDefineArm.s
; IRIS カード定数ARMASM用
;
; Copyright (C) 2003,2004 NINTENDO Co.,Ltd.
;=======================================================================
IF :DEF: _IRIS_CARD_DEFINE_H
ELSE
_IRIS_CARD_DEFINE_H * 1
;-----------------------------------------------------------------------
; メモリ・マップ
;-----------------------------------------------------------------------
REG_CARDMST_SPI_CNT * (REG_BASE + 0x1a0) ; カードマスター&SPIコントロール
REG_CARD_MASTER_CNT * (REG_BASE + 0x1a1) ; カードマスターコントロール
REG_CARD_SPI_CNT * (REG_BASE + 0x1a0) ; カードSPIコントロール
REG_CARD_SPI_DATA * (REG_BASE + 0x1a2) ; データ
REG_CARDCNT * (REG_BASE + 0x1a4) ; カードコントロール
REG_CARD_CMD * (REG_BASE + 0x1a8) ; コマンド設定
REG_CARD_DATA * (REG_BASE + 0x100010) ; データ
REG_CARD_PN_INIT * (REG_BASE + 0x1b0) ; カードPNデータ初期値
REG_CARD_PNA_INIT_L * (REG_BASE + 0x1b0)
REG_CARD_PNB_INIT_L * (REG_BASE + 0x1b4)
REG_CARD_PNA_INIT_H * (REG_BASE + 0x1b8)
REG_CARD_PNB_INIT_H * (REG_BASE + 0x1ba)
;-----------------------------------------------------------------------
; カード マスターコントロール
;-----------------------------------------------------------------------
CARDMST_SEL_DEVICE * 0x20 ; デバイス選択
CARDMST_SEL_ROM * 0x00 ; マスクROM/3Dメモリ選択
CARDMST_SEL_SPI * 0x20 ; SPI選択
CARDMST_IF_ENABLE * 0x40 ; 割り込み要求 許可
CARDMST_ENABLE * 0x80 ; カードイネーブル
;-----------------------------------------------------------------------
; カードSPI コントロール
;-----------------------------------------------------------------------
CARD_SPI_SCK_MASK * 0x03 ; シフトクロック数
CARD_SPI_SCK_SHIFT * 0
CARD_SPI_SCK_4M * 0x00 ; シフトクロック 4MHz選択
CARD_SPI_SCK_2M * 0x01 ; 2MHz選択
CARD_SPI_SCK_1M * 0x02 ; 1MHz選択
CARD_SPI_SCK_524K * 0x03 ; 524KHz選択
CARD_SPI_INV_CS * 0x40 ; 通信終了時に/CSダウン維持
CARD_SPI_BUSY * 0x80 ; ビジー
;-----------------------------------------------------------------------
; カード コントロール
;-----------------------------------------------------------------------
CARD_LATENCY1_CYCLES_MASK * 0x00001fff ; レイテンシ1のサイクル数
CARD_LATENCY2_CYCLES_MASK * 0x003f0000 ; レイテンシ2のサイクル数
CARD_PAGE_COUNT_MASK * 0x07000000 ; ページ数
CARD_LATENCY1_CYCLES_SHIFT * 0
CARD_LATENCY2_CYCLES_SHIFT * 16
CARD_PAGE_COUNT_SHIFT * 24
CARD_DATA_SCRAMBLE_ON * 0x00002000 ; データスクランブル
CARD_SCRAMBLE_UNIT_ON * 0x00004000 ; スクランブル回路
CARD_INIT_SCRAMBLE_PN * 0x00008000 ; スクランブルPNデータ初期化
CARD_CMD_SCRAMBLE_ON * 0x00400000 ; コマンドスクランブル
CARD_DATA_READY * 0x00800000 ; データ レディ
CARD_0_PAGE * 0x00000000 ; 0ページ
CARD_1_PAGE * 0x01000000 ; 1ページ
CARD_2_PAGES * 0x02000000 ; 2ページ
CARD_4_PAGES * 0x03000000 ; 4ページ
CARD_8_PAGES * 0x04000000 ; 8ページ
CARD_16_PAGES * 0x05000000 ; 16ページ
CARD_32_PAGES * 0x06000000 ; 32ページ
CARD_STATUS * 0x07000000 ; ステータスリード
CARD_CLOCK_TYPE * 0x08000000 ; クロック タイプ
CARD_CLOCK_150NS * 0x00000000 ; クロックサイクル
CARD_CLOCK_240NS * 0x08000000 ;
CARD_CLOCK_IN_LATENCY * 0x10000000 ; レイテンシ期間にクロック供給
CARD_RESET_LO * 0x00000000 ; リセット信号レベル
CARD_RESET_HI * 0x20000000 ;
CARD_ACCESS_MODE * 0x40000000 ; アクセス モード
CARD_READ_MODE * 0x00000000 ; リードモード
CARD_WRITE_MODE * 0x40000000 ; ライトモード
CARD_START * 0x80000000 ; スタート
; 構造体メンバ用定数
ST_CARD_0_PAGE * 0 ; 0ページ
ST_CARD_1_PAGE * 1 ; 1ページ
ST_CARD_2_PAGES * 2 ; 2ページ
ST_CARD_4_PAGES * 3 ; 4ページ
ST_CARD_8_PAGES * 4 ; 8ページ
ST_CARD_16_PAGES * 5 ; 16ページ
ST_CARD_32_PAGES * 6 ; 32ページ
ST_CARD_STATUS * 7 ; ステータスリード
ST_CARD_CLOCK_150NS * 0 ; クロックサイクル
ST_CARD_CLOCK_240NS * 1 ;
ST_CARD_READ_MODE * 0 ; リードモード
ST_CARD_WRITE_MODE * 1 ; ライトモード
;-----------------------------------------------------------------------
; マスクROMコマンド
;-----------------------------------------------------------------------
; NORMALモード
MROMOP_N_READ_ID * 0x90000000 ; ID読み込み
MROMOP_N_READ_HEADER * 0x00000000 ; ヘッダセグメント読み込み
MROMOP_N_CHANGE_SECURE * 0x3c000000 ; SECUREモードへ遷移
MROMOP_N_READ_ID_PAD_L * 0xffffffff
MROMOP_N_READ_ID_PAD_H * 0x00ffffff
MROMOP_N_READ_HEADER_PAD_L * 0xffffffff
MROMOP_N_READ_HEADER_PAD_H * 0x00ffffff
MROMOP_N_CHANGE_SECURE_PAD_L * 0xf00000ff
MROMOP_N_CHANGE_SECURE_PAD_H * 0x00000000
; SECUREモード
MROMOP_S_READ_ID * 0x10000000 ; ID読み込み
MROMOP_S_READ_SEGMENT * 0x20000000 ; 暗号セグメント読み込み
MROMOP_S_PNG_ON * 0x40000000 ; PNジェネレータ
MROMOP_S_CHANGE_GAME * 0xa0000000 ; GAMEモードへ遷移
MROMOP_S_READ_ID_PAD_L * 0x00000000
MROMOP_S_READ_ID_PAD_H * 0x0ffff000
MROMOP_S_PNG_ON_PAD_L * 0x00000000
MROMOP_S_PNG_ON_PAD_H * 0x0ffff000
MROMOP_S_CHANGE_GAME_PAD_L * 0xffffffff
MROMOP_S_CHANGE_GAME_PAD_H * 0x0fffffff
; GAMEモード
MROMOP_G_READ_PAGE * 0xb7000000 ; ページ読み込み
MROMOP_G_READ_PAGE_PAD_L * 0x00ffffff
MROMOP_G_READ_PAGE_PAD_H * 0x00f00000
MROMOP_G_READ_PAGE_MASK_L * 0x00ffffff
MROMOP_G_READ_PAGE_MASK_H * 0xfffffffe
MROMOP_G_READ_PAGE_ADDR_MASK * 0x000ffffe
;-----------------------------------------------------------------------
; マスクROMコマンド
;-----------------------------------------------------------------------
; NORMALモード
MEM3DOP_N_READ_ID * 0x90000000 ; ID読み込み
MEM3DOP_N_READ_PAGE * 0x00000000 ; ページ読み込み
MEM3DOP_N_WRITE_PAGE * 0x10000000 ; ページ書き込み
MEM3DOP_N_INPUT_SERIAL * 0x80000000 ; シリアルデータ入力
MEM3DOP_N_READ_STAT * 0x70000000 ; ステータス読み込み
MEM3DOP_N_READ_ID_PAD_L * 0xffffffff
MEM3DOP_N_READ_ID_PAD_H * 0x00ffffff
MEM3DOP_N_READ_PAGE_PAD_L * 0x00000000
MEM3DOP_N_READ_PAGE_PAD_H * 0x00ffffff
MEM3DOP_N_WRITE_PAGE_PAD_L * 0xffffffff
MEM3DOP_N_WRITE_PAGE_PAD_H * 0x00ffffff
MEM3DOP_N_INPUT_SERIAL_PAD_L * 0x00000000
MEM3DOP_N_INPUT_SERIAL_PAD_H * 0x00ffffff
MEM3DOP_N_READ_STAT_PAD_L * 0xffffffff
MEM3DOP_N_READ_STAT_PAD_H * 0x00ffffff
ENDIF ; _IRIS_CARD_DEFINE_H
END

View File

@ -0,0 +1,55 @@
//====================================================================
// IrisMainMemeoryDefine.h
// IRIS メインメモリ定数
//
// Copyright (C) 2003 NINTENDO Co.,Ltd.
//====================================================================
#ifndef _IRIS_MMEM_DEFINE_H
#define _IRIS_MMEM_DEFINE_H
#ifdef __cplusplus
extern "C" {
#endif
//----------------------------------------------------------------------
// メインメモリ コマンド
//----------------------------------------------------------------------
// 4サイクル目のデータ
#define MMEMD4_PARTIAL_REFRESH_NONE 0x0003 // パーシャルリフレッシュ無し
#define MMEMD4_BURST_CONTINUOUS 0x001c // 連続バースト(224バイト)
#define MMEMD4_BURST_MODE 0x0000 // バーストモード
#define MMEMD4_PAGE_MODE 0x0020 // ページモード
#define MMEMD4_SB1 0xffc0 // 1固定
// 5サイクル目のデータ
#define MMEMD5_1ST_R4_W3 0x0002 //
#define MMEMD5_BURST_WRITE 0x0000 // バーストライト
#define MMEMD5_CLOCK_TRIGGER_UP 0x0100 // クロック立上り
#define MMEMD5_BURST_LINER 0x0200 // バーストリニア・シーケンス
#define MMEMD5_SB1 0xe430 // 1固定
// 6サイクル目のアドレス
#define MMEMP_SB1 0x004003fe // 1固定
#define MMEMP_CLOCK_TRIGGER_UP 0x00000400 // クロック立上り
#define MMEMP_BURST_WRITE 0x00000000 // バーストライト
#define MMEMP_BURST_LINER 0x00001000 // バーストリニア・シーケンス
#define MMEMP_1ST_R4_W3 0x00004000 //
#define MMEMP_BURST_MODE 0x00000000 // バーストモード
#define MMEMP_PAGE_MODE 0x00010000 // ページモード
#define MMEMP_BURST_CONTINUOUS 0x000e0000 // 連続バースト(224バイト)
#define MMEMP_PARTIAL_REFRESH_NONE 0x00300000 // パーシャルリフレッシュ無し
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_MMEM_DEFINE_H

View File

@ -0,0 +1,49 @@
;=======================================================================
; IrisMainMemoryDefineArm.s
; IRIS メインメモリ定数ARMASM用
;
; Copyright (C) 2003 NINTENDO Co.,Ltd.
;=======================================================================
IF :DEF: _IRIS_MMEM_DEFINE_H
ELSE
_IRIS_MMEM_DEFINE_H * 1
;-----------------------------------------------------------------------
; メインメモリ コマンド
;-----------------------------------------------------------------------
; 4サイクル目のデータ
MMEMD4_PARTIAL_REFRESH_NONE * 0x0003 ; パーシャルリフレッシュ無し
MMEMD4_BURST_CONTINUOUS * 0x001c ; 連続バースト(224バイト)
MMEMD4_BURST_MODE * 0x0000 ; バーストモード
MMEMD4_PAGE_MODE * 0x0020 ; ページモード
MMEMD4_SB1 * 0xffc0 ; 1固定
; 5サイクル目のデータ
MMEMD5_1ST_R4_W3 * 0x0002 ;
MMEMD5_BURST_WRITE * 0x0000 ; バーストライト
MMEMD5_CLOCK_TRIGGER_UP * 0x0100 ; クロック立上り
MMEMD5_BURST_LINER * 0x0200 ; バーストリニア・シーケンス
MMEMD5_SB1 * 0xe430 ; 1固定
; 6サイクル目のアドレス
MMEMP_SB1 * 0x004003fe ; 1固定
MMEMP_CLOCK_TRIGGER_UP * 0x00000400 ; クロック立上り
MMEMP_BURST_WRITE * 0x00000000 ; バーストライト
MMEMP_BURST_LINER * 0x00001000 ; バーストリニア・シーケンス
MMEMP_1ST_R4_W3 * 0x00004000 ;
MMEMP_BURST_MODE * 0x00000000 ; バーストモード
MMEMP_PAGE_MODE * 0x00010000 ; ページモード
MMEMP_BURST_CONTINUOUS * 0x000e0000 ; 連続バースト(224バイト)
MMEMP_PARTIAL_REFRESH_NONE * 0x00300000 ; パーシャルリフレッシュ無し
ENDIF ; _IRIS_MMEM_DEFINE_H
END

View File

@ -0,0 +1,158 @@
//*******************************************************************
// IRIS-SUBPƒƒjƒ^ƒvƒ<76>ƒOƒ‰ƒ€ BlowfishŠÖ<C5A0>
//*******************************************************************
#include "Blowfish.h"
#define MAXKEYBYTES 56 /* 448 bits */
#define N 16
//BLOWFISH_CTX blowfishCardTable;
//BLOWFISH_CTX blowfishEepromTable;
static unsigned int F(const BLOWFISH_CTX *ctx, unsigned int x);
void InitBlowfish(BLOWFISH_CTX *ctx, const unsigned char *key, int keyLen)
{
int i, j, k;
unsigned int data, datal, datar;
#ifndef DISABLE_SECURE_CODE
j = 0;
for (i = 0; i < N + 2; ++i) {
data = 0x00000000;
for (k = 0; k < 4; ++k) {
data = (data << 8) | key[j];
j = j + 1;
if (j >= keyLen)
j = 0;
}
ctx->P[i] = ctx->P[i] ^ data;
}
datal = 0x00000000;
datar = 0x00000000;
for (i = 0; i < N + 2; i += 2) {
EncryptByBlowfish(ctx, &datal, &datar);
ctx->P[i] = datal;
ctx->P[i + 1] = datar;
}
for (i = 0; i < 4; ++i) {
for (j = 0; j < 256; j += 2) {
EncryptByBlowfish(ctx, &datal, &datar);
ctx->S[i][j] = datal;
ctx->S[i][j + 1] = datar;
}
}
#endif // DISABLE_SECURE_CODE
}
void EncryptByBlowfish(const BLOWFISH_CTX *ctx, unsigned int *xl, unsigned int *xr)
{
unsigned int Xl;
unsigned int Xr;
unsigned int temp;
int i;
#if !defined(DISABLE_SECURE_CODE) & !defined(DISABLE_ENCRYPT)
Xl = *xl;
Xr = *xr;
for (i = 0; i < N; ++i) {
Xl = Xl ^ ctx->P[i];
Xr = F(ctx, Xl) ^ Xr;
temp = Xl;
Xl = Xr;
Xr = temp;
}
temp = Xl;
Xl = Xr;
Xr = temp;
Xr = Xr ^ ctx->P[N];
Xl = Xl ^ ctx->P[N + 1];
*xl = Xl;
*xr = Xr;
#endif // DISABLE_SECURE_CODE
}
void DecryptByBlowfish(const BLOWFISH_CTX *ctx, unsigned int *xl, unsigned int *xr)
{
unsigned int Xl;
unsigned int Xr;
unsigned int temp;
int i;
#ifndef DISABLE_SECURE_CODE
Xl = *xl;
Xr = *xr;
for (i = N + 1; i > 1; --i) {
Xl = Xl ^ ctx->P[i];
Xr = F(ctx, Xl) ^ Xr;
/* Exchange Xl and Xr */
temp = Xl;
Xl = Xr;
Xr = temp;
}
/* Exchange Xl and Xr */
temp = Xl;
Xl = Xr;
Xr = temp;
Xr = Xr ^ ctx->P[1];
Xl = Xl ^ ctx->P[0];
*xl = Xl;
*xr = Xr;
#endif // DISABLE_SECURE_CODE
}
unsigned int F(const BLOWFISH_CTX *ctx, unsigned int x) {
unsigned int a, b, c, d;
int y;
#ifndef DISABLE_SECURE_CODE
d = x & 0x00FF;
x >>= 8;
c = x & 0x00FF;
x >>= 8;
b = x & 0x00FF;
x >>= 8;
a = x & 0x00FF;
y = ctx->S[0][a] + ctx->S[1][b];
y = y ^ ctx->S[2][c];
y = y + ctx->S[3][d];
return y;
#endif // DISABLE_SECURE_CODE
}

View File

@ -0,0 +1,44 @@
//======================================================================
// IRIS-SUBPモニタプログラム Blowfish関数
//======================================================================
#ifndef _IRIS_SUBP_BLOWFISH_H
#define _IRIS_SUBP_BLOWFISH_H
#include "IrisSubpMonTarget.h"
typedef struct {
unsigned int P[16 + 2];
unsigned int S[4][256];
} BLOWFISH_CTX;
void InitBlowfish(BLOWFISH_CTX *ctx, const unsigned char *key, int keyLen);
void EncryptByBlowfish(const BLOWFISH_CTX *ctx, unsigned int *xl, unsigned int *xr);
void DecryptByBlowfish(const BLOWFISH_CTX *ctx, unsigned int *xl, unsigned int *xr);
#ifndef DISABLE_SECURE_CODE
void InitBlowfishFook(BLOWFISH_CTX *ctx, const unsigned char *key, int keyLen);
void EncryptByBlowfishFook0(const BLOWFISH_CTX *ctx, unsigned int *xl, unsigned int *xr);
void EncryptByBlowfishFook1(const BLOWFISH_CTX *ctx, unsigned int *x);
void EncryptByBlowfishFook2(const BLOWFISH_CTX *ctx, unsigned int *x);
void DecryptByBlowfishFook(const BLOWFISH_CTX *ctx, unsigned int *x);
#else
#define InitBlowfishFook() InitBlowfish()
#define EncryptByBlowfishFook0(ctx, xl, xr) EncryptByBlowfish(ctx, xl, xr)
#define EncryptByBlowfishFook1(ctx, x) EncryptByBlowfish(ctx, &(x)[1], &(x)[0])
#define EncryptByBlowfishFook2(ctx, x) EncryptByBlowfish(ctx, &(x)[2], &(x)[1])
#define DecryptByBlowfishFook(ctx, x) DecryptByBlowfish(ctx, &(x)[1], &(x)[0])
#endif // DISABLE_SECURE_CODE
#ifndef ENABLE_TEST_BLOWFISH
extern const BLOWFISH_CTX blowfishInitTable; // 初期化テーブル
#else
extern const BLOWFISH_CTX blowfishTestTable; // (テスト版)
#endif // ENABLE_TEST_BLOWFISH
#endif // _IRIS_SUBP_BLOWFISH_H

View File

@ -0,0 +1,277 @@
;********************************************************************
; Blowfishイニシャルキーテーブル
;********************************************************************
ALIGN
GLOBAL blowfishInitTable
blowfishInitTable
DCD 0x5f20d599, 0xb9f54457, 0xd9a4196e, 0x945a6a9e
DCD 0xebf1aed8, 0x3ae27541, 0x32d08293, 0xd531ee33
DCD 0x9a6157cc, 0x1ba20637, 0xf5723979, 0xbef6ae55
DCD 0xfb691b5f, 0xe9f19de5, 0xa1d92cce, 0xe605325e
DCD 0xcffed3fe, 0x0d0462d4
DCD 0xb7ecf58b, 0xbb79602b, 0x0d319512, 0x2bda3f6e
DCD 0xf1f08488, 0x257e123d, 0xbbf12245, 0x061a0624
DCD 0x28dfad11, 0x3481648b, 0x2933eb2b, 0xbdf2aa99
DCD 0x9d95149c, 0x8cf5f79f, 0x29a19772, 0xcf5fd19d
DCD 0x1a074d66, 0x4b4ad3de, 0xa3a7c985, 0x3a059517
DCD 0xbf0a493d, 0xa28b890a, 0xdd49824a, 0x0bf19027
DCD 0x6a1cebe9, 0x05457683, 0x617081ba, 0xde4b3f17
DCD 0x39abcfae, 0x563af257, 0x8aad1148, 0x3f45e140
DCD 0x54029bfa, 0xfb93a6ca, 0x6ffe4def, 0x9c87d8a3
DCD 0x48d5ba08, 0xfd2d8d6a, 0x74f8156e, 0x8b52bebd
DCD 0x9e8a2218, 0x073774fb, 0x4a6c361b, 0x6242ba19
DCD 0x109179b9, 0x9665677b, 0xe82302fe, 0x778c99ee
DCD 0x64865c3e, 0x86786d4d, 0xe2654fa5, 0x5adfb21e
DCD 0x087ed00a, 0xac71b014, 0x1c83dbbd, 0x62a1d7b9
DCD 0x7c63c6cd, 0xe6c36952, 0x12ce75bf, 0x04215d44
DCD 0x3cd3fbfa, 0xd4631138, 0x49418595, 0x08f20946
DCD 0x1fdc1143, 0x6d15c076, 0x70633c1f, 0x6c8087ea
DCD 0x8b63bdc3, 0x372137c2, 0x2309eedc, 0x4d6a372e
DCD 0x50f79073, 0x921cac30, 0x91231004, 0xaa07d24f
DCD 0x9a4f3e68, 0x6a6064c9, 0xf32114c8, 0x124122d6
DCD 0xe6cf2444, 0x0ddd568a, 0x85e14d53, 0x5a528c1e
DCD 0xc284199c, 0x6ff15703, 0x58be00e3, 0xd5ed4cf6
DCD 0x1f9c6421, 0x3c0355be, 0xaaffdc4a, 0x5de0dac9
DCD 0xdee6bf5e, 0xf8b1d8f5, 0xb9b336ff, 0xdb956762
DCD 0xed375f31, 0x9967704c, 0x3118b590, 0x99993d6c
DCD 0xd3da42e4, 0xa0134225, 0x6c70d7ae, 0xc7cf55b1
DCD 0x43d546d7, 0x443d1761, 0x8533e928, 0x93a2d0d5
DCD 0x1f1225aa, 0x460bc5fb, 0x567697f5, 0x87bea645
DCD 0xe86b94b1, 0x9933feb1, 0x6c3e1fae, 0x091d7139
DCD 0xe4379000, 0x74753e10, 0x3b838cff, 0xf9b0f1b0
DCD 0x42470501, 0xacd6f195, 0x9ee6387e, 0x3f267495
DCD 0x185068b4, 0xb43043d0, 0x68e34b4c, 0xb64de5bf
DCD 0xa00a8b95, 0x77322574, 0x2cf7a1cf, 0x5a1371d8
DCD 0x51c9eaab, 0xefee0de8, 0x197e93e9, 0x38431ea7
DCD 0xa12c1681, 0xcc73e348, 0xd36c2129, 0xd9a0ce5d
DCD 0xa0437161, 0x64b51315, 0x192acf92, 0xa5b7addc
DCD 0xf865869f, 0xfbe79f1a, 0x13b8fdf7, 0x6fdb276c
DCD 0xf71c35df, 0x9b5b2c8d, 0x6438ab12, 0x31decc06
DCD 0x11754ee8, 0xeafae364, 0xc25434eb, 0xeb343fad
DCD 0x267d2c93, 0xf3569d36, 0xb3f6e15a, 0x9e4a6398
DCD 0x9ae48332, 0x907d6084, 0xee0e132e, 0xa2364b93
DCD 0x3816ec85, 0x020688e8, 0x3aa0f0bf, 0x9a6ad7ed
DCD 0xcf57e173, 0xdcb844f8, 0xd159232e, 0x715295df
DCD 0x4ba06199, 0x786e7fd5, 0x30c5a9ba, 0x328640d3
DCD 0x9c0c329d, 0x2f02b737, 0xa99854ba, 0xc90413c4
DCD 0xe7c8be8d, 0x2e50975d, 0x5922d693, 0x22bc270c
DCD 0x20a7e092, 0x7f6f930f, 0xb5d39f4c, 0x740b2aa6
DCD 0x107d4967, 0xc5d1cb26, 0x8ce77186, 0x5be99ca0
DCD 0x01f61ab2, 0x5e9e8cee, 0xdb1af283, 0x84eae5e6
DCD 0x7cd27659, 0x49a58df6, 0x16c24836, 0xa383bb52
DCD 0x0c07b974, 0x2861ff3b, 0xe4e961e1, 0xaa156eef
DCD 0x5de8ba4e, 0x32bb9605, 0x72fbb056, 0xc80e0f52
DCD 0x76652542, 0xdef2af89, 0x01f02710, 0x97a7744b
DCD 0x5426d507, 0x821f0954, 0x307d860a, 0x26b30e39
DCD 0xbb570b9b, 0xaf310636, 0xd9fc79fd, 0x0c2b1030
DCD 0xd79be1b3, 0xef5fdc7b, 0x4513f8d2, 0xbd75474d
DCD 0x7e3c9646, 0xb53ef375, 0x3b9ac567, 0x6b295bb0
DCD 0xc85b80de, 0x31b10515, 0xdd49ceb6, 0xaeb584ad
DCD 0x3167dc60, 0x4efe3034, 0xa62f80bd, 0x213963bf
DCD 0x7f35d986, 0x05226816, 0x2690e954, 0x516c078c
DCD 0xd75531a4, 0x3ea80709, 0xc166532e, 0xc47bf2f8
DCD 0xf1cf58f2, 0xe7a2c587, 0x87308f27, 0x6264a058
DCD 0x88b91823, 0xc4cefa7c, 0x17adae98, 0xf35b4acc
DCD 0x56d548e9, 0xc8f20dd3, 0xdb8c7392, 0xac562fd7
DCD 0x6992f981, 0xf632c64d, 0x218dc0e6, 0x618076e2
DCD 0x6cdcbc11, 0x6919af93, 0xb9bfd09b, 0x67029f31
DCD 0x83ee51a3, 0x0c7b2206, 0x404249ab, 0x7d01d5b8
DCD 0x55f75ece, 0x99c53953, 0x9f87d846, 0xb464f7ba
DCD 0xa1fa9ae3, 0x1068906d, 0x548aca30, 0xc3609fa7
DCD 0x0d6bf519, 0xe698517a, 0xb4514398, 0x4fe935d6
DCD 0x7b0fdfc3, 0xbd5c2fd6, 0x1961153a, 0xaacb4bf1
DCD 0xc9646ddc, 0x561ec6d3, 0x504c38ef, 0xcc758671
DCD 0xe94e0d0d, 0x5d06f628, 0xd3aa1b70, 0x39a8cf45
DCD 0x2ea695ac, 0xd422e4b4, 0x5f37a874, 0xcc047a48
DCD 0xd8404ca5, 0x0828b428, 0x52721c0d, 0x477df041
DCD 0x4e533a19, 0x6b628458, 0x818ab593, 0xdc0d4e21
DCD 0xc6a23fb4, 0x402bc9fc, 0xe90438da, 0x6b865a5e
DCD 0x8525220c, 0x7c8d1168, 0x55951d92, 0xbb8eab4d
DCD 0xb7e6a6da, 0x5a32b651, 0x05dd4105, 0x50560a2a
DCD 0xcc471791, 0xb57ee6c9, 0x73db4a61, 0x33c85167
DCD 0x746edaf5, 0x37c3542e, 0x08af6d0d, 0x5f8a15e8
DCD 0xcd2159e2, 0x060cdea8, 0x5f6b775a, 0x3e6518db
DCD 0x78de50c8, 0xb382b8e0, 0x32724e5d, 0x34c14f07
DCD 0xb796ba23, 0x28a44e67, 0xeb62341e, 0xe9706a2d
DCD 0x70c4422f, 0x9c315a4e, 0x28475bf9, 0x6f71daaa
DCD 0x78b31f38, 0x1c6b92c4, 0x9a35f69e, 0xbf0e4db7
DCD 0x412918cc, 0x5d354803, 0xc62bd055, 0x605caf29
DCD 0x5e8e6974, 0xbdd47c9b, 0x7d64447b, 0x695d923f
DCD 0x4b001fb6, 0xcf3583d4, 0x174e647e, 0x2ed58dae
DCD 0x4e12289a, 0x08492b2e, 0x46c6ae5c, 0x6141ae85
DCD 0xd2826f1e, 0x1f163751, 0xa459f60b, 0xaf5aca9a
DCD 0x8b33d40d, 0x84f16320, 0xcfcb5c80, 0xd3b9b408
DCD 0x62bd0516, 0x569b3183, 0xba9f9851, 0xb2aa5bb2
DCD 0xb52c6b22, 0x63fa48d4, 0xfa585f2b, 0x0964fa61
DCD 0xb8e038bb, 0xa860929d, 0x0e6f670d, 0x010df537
DCD 0xd477c29f, 0x73f1ecfe, 0x7de03930, 0xe49861f5
DCD 0x0455282c, 0x2fdb5556, 0x58e5ec6b, 0x8064b606
DCD 0x4e1a2a6a, 0xc4d80f5b, 0x19522e0a, 0x30f562d9
DCD 0x7b8cbe48, 0xa29b384f, 0xd3c9afc3, 0x4162c1c7
DCD 0x2161b986, 0x4f996f57, 0x7bcebac1, 0x5e4d3bb5
DCD 0x57448b8a, 0x705f135f, 0x47295b6d, 0xece238dc
DCD 0x12655504, 0x4317e82a, 0x2add8ee1, 0xf794e2b3
DCD 0xe65c6e09, 0x6df88aeb, 0x48544989, 0xbfad2ff5
DCD 0xca4b94ea, 0x828739fc, 0xf2018a5f, 0x71e6f275
DCD 0xde42d8d6, 0x281d2df1, 0xa37e88a6, 0x301d47a0
DCD 0xdf71a3d9, 0x01cb1c49, 0xf2b136f8, 0x5d5822f0
DCD 0xa0bd6b45, 0x4288b2bb, 0xce288cc7, 0x6390e893
DCD 0x897c9008, 0xb77df53c, 0x554f2d04, 0x7efd1651
DCD 0xc1bee879, 0xf8d412f2, 0x230584b4, 0x2bd2cca0
DCD 0xadabe1fd, 0x6c55d10d, 0x4d944123, 0x054f3777
DCD 0x17bf0c28, 0x6c6712b3, 0xf75ac38c, 0x6d2a8441
DCD 0x271294d0, 0x9cedb42c, 0x8247ec4d, 0xb967d597
DCD 0x55c09d1b, 0x8ee57e07, 0x3ee7a8e2, 0x3a0ee412
DCD 0x3455452a, 0x5a2df9a2, 0x7c52ab1b, 0x555f1083
DCD 0x435af1d2, 0xa4a7c62b, 0xe8951589, 0xf89d4bb4
DCD 0x609fe375, 0xe6d65b78, 0x21e6440d, 0x2247bd06
DCD 0xad00a453, 0x8513438d, 0xfcaaf739, 0xed7baf38
DCD 0x542be4fc, 0xfc4c9850, 0xdff78085, 0xe122803c
DCD 0x24deda94, 0x397ab0c6, 0xa10fdc38, 0x6ff9f4a7
DCD 0x8b571863, 0x2e2a4184, 0xd9f253d4, 0xddd00f00
DCD 0xa6196e99, 0x5becd00a, 0xc0ab2458, 0xec6506cb
DCD 0x9438131a, 0x2f03670a, 0x77e3f73f, 0xc6337744
DCD 0xe3d03914, 0x7908a2c0, 0x579940bb, 0x90010b41
DCD 0x48cce1cd, 0xafb3db67, 0x4cf37488, 0xb1728f82
DCD 0xc42923b5, 0xfc196c12, 0x9ca4468e, 0x876525c4
DCD 0x8abe6dd3, 0x38031193, 0xf32b83ed, 0xea93a446
DCD 0x1d85533b, 0x08f1d4ce, 0xfced2783, 0xbc181a9b
DCD 0xdcae8bf9, 0x3850ab24, 0x104b72e9, 0x467b1722
DCD 0x6459ab5d, 0xf8ae40f3, 0xf9c8e5bb, 0x554e0326
DCD 0xfeebeb7d, 0xe0e639f7, 0x2ebe110a, 0xed98ff28
DCD 0x5642c9c0, 0x00fdc342, 0xa287aff6, 0x323f015b
DCD 0x9a954792, 0x3d32a572, 0x9bd06bae, 0x9249d207
DCD 0xfa4a78e3, 0xf27d06a1, 0x7477cf41, 0x0cb21404
DCD 0x16648486, 0xa151bbd5, 0xd1f16fe5, 0x5ff7e2f2
DCD 0xb84d2058, 0xddcfc757, 0x76bed8c5, 0x7e5ff63d
DCD 0x888b2ae7, 0x3f381b24, 0x7723410e, 0xd44bf0f5
DCD 0xa4fa1f0c, 0xcf5f800b, 0xdae0f645, 0x5359342f
DCD 0x523c20fb, 0xb5355e62, 0x608bfe62, 0x5a86e363
DCD 0xd16e1a15, 0x32bc4547, 0x3867ebb4, 0x336ee4ab
DCD 0xa3edb53a, 0x4ee067ad, 0x62ee9541, 0x1d267162
DCD 0x3062ef31, 0xac82d7af, 0x0405dcc2, 0xbf0797f5
DCD 0x07235911, 0xe80264c0, 0xaf3ee597, 0xa659ac18
DCD 0x90334a8b, 0x9c7c6e1c, 0x3c4c7e20, 0xbb64613e
DCD 0x7e7c6bc5, 0x4cc59f3e, 0xf573ea9f, 0x4cc089d7
DCD 0x2df4fbf4, 0x511b14ec, 0xc812c1d5, 0x4a0bdf10
DCD 0x93bc9c8b, 0x3e3e6a45, 0xbaa9c17d, 0x07b4c1cd
DCD 0x8668e1e4, 0x386db243, 0x5c0cfbf3, 0xde713766
DCD 0xa06eef56, 0xa7654010, 0xbed0f798, 0x3637c80e
DCD 0x7cca10ec, 0x1e84ab9c, 0x02761705, 0xaa524f1c
DCD 0xa0c6c15f, 0x04d8b956, 0xa74d4484, 0x60ded859
DCD 0x050e38e6, 0x3be1038f, 0x3304816d, 0xce0b306f
DCD 0x33210569, 0x89bb26fb, 0x87aeb67d, 0xe007517e
DCD 0x0a96f7ac, 0x5cc4f96b, 0x4744e41d, 0xe3fa5eb8
DCD 0x42558478, 0xf75e484b, 0x8635477d, 0x05432b1d
DCD 0xb88aec03, 0x763c061e, 0x431a480c, 0xed8ab7a7
DCD 0x43c6131e, 0xdbef10ee, 0x833cfbec, 0xef4495b2
DCD 0x4e5154d8, 0x1d44112d, 0x1e5936fb, 0xc3c1347a
DCD 0x610057ca, 0x16a567ea, 0x55d0559b, 0x36d97fe1
DCD 0xae7640d2, 0xb0ce01dc, 0xcbd5837a, 0x6bec9820
DCD 0x349272c1, 0x375782f3, 0x36328a62, 0xae43900c
DCD 0x789b5cae, 0x0265138e, 0xc17168fd, 0xa031b0fe
DCD 0xc3b08224, 0xa76979b1, 0xd0ebd2f5, 0xdc32c082
DCD 0x3c26c79e, 0xc1988d6d, 0xd0d422bb, 0x3eec330f
DCD 0xdce1ccb9, 0x36774c6a, 0xbff91c14, 0x5f289f81
DCD 0x29328571, 0xc4487590, 0xd8ce4ab3, 0x2f148f44
DCD 0xef5740fd, 0xd97508aa, 0x6ed6d146, 0xc31f5532
DCD 0x1f84fe18, 0xffd584fc, 0x481b5e71, 0x0e9586c3
DCD 0xd3270828, 0x7b718338, 0x5463804c, 0xacb0569a
DCD 0x31ca80cf, 0xf3feef09, 0x7e24afbe, 0x3f53fea6
DCD 0x334a8dc2, 0xa622d168, 0xea7bad66, 0xb043b6de
DCD 0x009525a1, 0x46753fa3, 0xec441114, 0x92bc95d7
DCD 0x16a94ff0, 0x60976253, 0xf1410f2a, 0xeebe2471
DCD 0xcd087f94, 0x85b39360, 0x3f00075b, 0x83280fd8
DCD 0x9f69d19a, 0xc32edad1, 0xb9a20190, 0x662a4e6b
DCD 0xa6aeda9d, 0x68d32aea, 0x9c0c0c2f, 0xed4a8cd2
DCD 0x65579ee2, 0xa387099d, 0x5d32c4b4, 0x2b32d4c9
DCD 0x1e71e0b1, 0x90e64d64, 0x401ee371, 0x84f37ded
DCD 0x78c8ed0e, 0x71c0ae76, 0x05bb7227, 0xfb6402ea
DCD 0xb56b48f3, 0xed3f9342, 0xd253139f, 0xec2afef7
DCD 0xdb25471d, 0xc686913c, 0xfd11f08e, 0xf7367423
DCD 0x7a9ef5a4, 0x4450537e, 0xd3ca47d4, 0xe66d38eb
DCD 0x7f9471d9, 0x4b69c64a, 0xea52f411, 0xb08afe22
DCD 0x598b6736, 0x2a80e6e8, 0x130465eb, 0x9edcecee
DCD 0x05ecb15f, 0x9fe6596a, 0x896b595e, 0xca1af7bf
DCD 0x6a5bf944, 0xe4038571, 0x70e06229, 0xcfc4416f
DCD 0xe3ccb1b2, 0xa807a67e, 0x847fe787, 0x4b52db93
DCD 0xdd7eec6c, 0x104824d4, 0x60049f69, 0x1848e674
DCD 0xb92ce4f3, 0x7a502e4f, 0x6954d4df, 0xf3a78b2b
DCD 0xf31fffce, 0x3901263e, 0x89849517, 0x4b4cf0b0
DCD 0xc49f9182, 0xa59dac4b, 0x2517af74, 0xd332cac9
DCD 0x848a89bc, 0xae0dcc89, 0x9cdba27c, 0xee91786a
DCD 0x4e5d76ea, 0x69f56087, 0x02d46715, 0x3648afcf
DCD 0x6fbfea07, 0x8f062d66, 0xf9fe9ac4, 0x758790f6
DCD 0x0fadf7b8, 0x3d5a1076, 0xb32eb059, 0xcc2c35c7
DCD 0xcb2b5670, 0xc59637e3, 0x8a1b462f, 0x88c74622
DCD 0x983226a7, 0x2286df61, 0x2f1cf48a, 0xaa09a187
DCD 0xd3aea9cc, 0x1c4500bd, 0x8687549a, 0xffef8752
DCD 0x8fa18f1e, 0x355c89c1, 0x3a2dda1b, 0xc2b2162c
DCD 0x78e256f1, 0x97636bc1, 0xc98f56c5, 0xaa2c7f32
DCD 0xaca8a6af, 0x88229120, 0x8b60e4de, 0x25424bf9
DCD 0x9c7fe31a, 0x3a89192c, 0x36d4057e, 0xc25869cc
DCD 0x2f8b32c1, 0x7aeb8590, 0xa1a55039, 0x66c59227
DCD 0x584f20b0, 0x4383557e, 0x9ce2452b, 0x9012d8e4
DCD 0x5683162c, 0xb3037916, 0x18612dad, 0x371f131a
DCD 0x739ce1e2, 0xfdd5807b, 0xfc87512d, 0x1fd7aa7b
DCD 0xaf8e7a2c, 0xcdbb8df4, 0x727c1195, 0xe26fee0b
DCD 0x37deafb9, 0x8d8cde83, 0xb7670562, 0x568dc696
DCD 0x62d70db6, 0x3646d6ba, 0xe6c88ebd, 0x106c2aea
DCD 0x5b6bff14, 0x463c82fa, 0x464330b1, 0x9b7d8a51
DCD 0x79833e92, 0xb25d555b, 0x90ce5e6c, 0x98538e62
DCD 0xe56d0dc9, 0xc5cd572d, 0xe1ba5781, 0x728fb8e8
DCD 0xdc134fe5, 0x15719dea, 0x8811b210, 0x7fd409d5
DCD 0x2c7f655b, 0x114c383b, 0xfb8d5068, 0xbf59b09e
DCD 0x4a898094, 0x12181ac5, 0x4ad15389, 0x8ce82910
DCD 0xeab6ec1c, 0x8b17c746, 0xa8311525, 0xb1436ba2
DCD 0x0bdbe29d, 0x11b09b87, 0xd2710e04, 0x82897729
DCD 0x7f41660a, 0xff480b1d, 0xfd24bb72, 0x9ba148c2
DCD 0xce7f7bfe, 0xd986db88, 0xb01c3b85, 0x0733a8dc
DCD 0xe32e51bf, 0x97009a0e, 0x97c0061e, 0xb6d89d43
DCD 0x6786c445, 0x88f8005f, 0x9e52a49a, 0x838aaac7
DCD 0x18c5ec75, 0x2fc3ceae, 0x18f92b1a, 0xf51aaeff
DCD 0x33b50b53, 0xe8fda751, 0x64a2e1a8, 0x431722b6
DCD 0xd80acc80, 0x40ba3bae, 0x4a92d9d7, 0x1004df89
DCD 0x2b189bee, 0x8a69776a, 0xb9f9f468, 0x6e1521a2
DCD 0x033b1ee6, 0x609b3062, 0x9b257e41, 0x52c58f9e
DCD 0xc2f80810, 0x1121a169, 0x795e3788, 0x10ff6635
DCD 0xed6e1842, 0x1c6bb697, 0x6de5364e, 0xbfe4b47d
DCD 0x05e0b920, 0xb8d5693a, 0xe0dcd5e3, 0x3e53acb9
DCD 0xad57a407, 0x1848ff77, 0x49ac2a76, 0x75478e2a
DCD 0x63679f6d, 0x398c3530, 0x6fd53905, 0xad5b3a64
DCD 0x82bb0bca, 0xb1459952, 0x99363693, 0x442013af
DCD 0x4402d836, 0x85923909, 0x974a4aff, 0xd763a687
DCD 0x24b5b5c7, 0x6fb40fed, 0x1452580c, 0xd37ba6d9
DCD 0x5838bc79, 0x843bbda1, 0x061ad806, 0xeaa86bfd
DCD 0x0428694b, 0x9982ad37, 0x851b0efb, 0x735da8bd
DCD 0x7558dccd, 0x6c63be0a, 0xe44ce748, 0x60042b30
DCD 0xdad815b9, 0x8f758186, 0x1c8dd496, 0x7c85705d
DCD 0xd57b671c, 0xcea66708, 0x70660a4b, 0xd463e5b7
DCD 0xea828a5b, 0xe2ca6710, 0x8517eff4, 0x8a5f2a2f
DCD 0x6af88297, 0xea1034d6, 0x3c5cc9eb, 0x46f849e1
DCD 0xf6bddeeb, 0xaaf192a9, 0xb018a0a6, 0x1f0fd33a
DCD 0x31ff6ff3, 0xd3444345, 0x88f79a50, 0xcec19609
DCD 0x2cf2cc76, 0x82adba2c, 0x84188f77, 0x9c07d2c0
DCD 0x4e839036, 0x434fa50b, 0x78ab043e, 0x09fbd64f
DCD 0xda902401, 0x613a3c6f, 0x4a697f0d, 0x02302beb
DCD 0x84e0dbb4, 0x35d7eca9, 0x857d37bf, 0x4ea9ce58
DCD 0xa8c780e4, 0x486730d3, 0x2faf29eb, 0xa7b46a74
DCD 0x923f0f3f, 0xaccaf3af, 0x94d94baf, 0x81ca43c0
DCD 0xa1482f0d, 0xd2d527b0, 0x85054bef, 0x934ddea3
DCD 0xbbf03c30, 0x27308f4a, 0x3ee3eb4c, 0x2f9aed64
DCD 0xf082f13b, 0x7fcff4ba, 0xe1b0cb40, 0x57aabc7f
DCD 0xf274c9d3, 0x220d43fa, 0x4e77f4d0, 0x7085d793
DCD 0xb6bf991f, 0x30f135de, 0xf0715ea7, 0x7b2d016b
DCD 0x5333f064, 0xf388390a, 0x6ba63a6b, 0x432fd235
DCD 0xb5fd02cd, 0xaa5bbce9, 0x7e19a4d8, 0x81945d0e
DCD 0xad776f9e, 0x93740ed6, 0x18c4e796, 0x19f5ad5f
END

View File

@ -0,0 +1,277 @@
;********************************************************************
; Blowfishイニシャルキーテーブルテスト版
;********************************************************************
ALIGN
GLOBAL blowfishTestTable
blowfishTestTable
DCD 0x4a46f6a1, 0xf887db81, 0xf4376b4f, 0x0b9eec26
DCD 0xb9df846e, 0x8ca411c1, 0x2c5a135c, 0xa06b7bcb
DCD 0xcd61fedf, 0x2728b095, 0xbe22b311, 0x44d1e898
DCD 0x5b703b54, 0x97114577, 0x67d8960a, 0x929b96b9
DCD 0x2c7f8c34, 0x4b04fa76
DCD 0xcd70865b, 0x26359533, 0xd19a41fa, 0x9e597e8c
DCD 0xf25b08ce, 0x60707b7f, 0x815c245a, 0x6eceba71
DCD 0xc0094824, 0x100efe30, 0x40c1dc72, 0x05edd815
DCD 0xac17dade, 0x60a21e58, 0xc55d4536, 0x04b0b435
DCD 0xc9c03c65, 0xe2e9f11c, 0x93138f3c, 0xe2e96c96
DCD 0xd6b44360, 0x19a848df, 0xd5440bb1, 0x876e76cc
DCD 0x23b378fb, 0xff73b479, 0x460612a3, 0x723d8f73
DCD 0x0dfc89a4, 0xc89ab0a0, 0x463daaed, 0xed802868
DCD 0x2b88b026, 0x0ee4f376, 0xa2f569a7, 0xd02df1f9
DCD 0x67613e5d, 0xdde56443, 0x8178f731, 0xb35a8e3d
DCD 0xeb680e97, 0x1e32a8d0, 0x16f5b8bb, 0xd9046a54
DCD 0x30ba0b86, 0x20174d9a, 0x5b290549, 0x84c41a0e
DCD 0xd4096d8c, 0x704a3aa1, 0xe145c9d1, 0xa557a14b
DCD 0xbadd2621, 0xb4755e78, 0xa6c57d89, 0x82ccbd36
DCD 0x7527df4d, 0x0474cbe9, 0x8ccd8a8e, 0xe5f4ab84
DCD 0xc0eca098, 0xbb97e24b, 0x49380d6b, 0xae9d53e1
DCD 0x20d2a135, 0x2a4f2089, 0x959e535e, 0xc7150f35
DCD 0x0008ddae, 0x1abab9e0, 0x05562aba, 0x8f1d9865
DCD 0x62aecea4, 0x1ab41a12, 0x15ad25e3, 0xbeafc96e
DCD 0x7d803c6a, 0x6de25cb8, 0xe64ad0a0, 0x9c5f8879
DCD 0x42711a43, 0x2cc470f3, 0xf6addba3, 0xaac39e41
DCD 0xf8e91246, 0x90980bb6, 0xb33de41c, 0x24d79b08
DCD 0x6cd084e9, 0x080eb68c, 0x84136558, 0x77d4244c
DCD 0x5d201fd9, 0xb2e5682d, 0x1880302d, 0xd5f3fa99
DCD 0x71a11d92, 0xc9e2af1a, 0xe1c804df, 0x2d9ebee7
DCD 0x2da9625e, 0x94deb7fd, 0xeded6198, 0x4dd61935
DCD 0xe67443b1, 0x5213e1e7, 0x6dfdf6fd, 0x6ad71b6c
DCD 0x37adc8cd, 0x41c84096, 0xc884ceec, 0xa30f33a8
DCD 0x7b900d16, 0x48b35ad1, 0x505d9f32, 0x412dc939
DCD 0xb95d16fb, 0x3b28e381, 0xc1857465, 0x5c0470dd
DCD 0x7fb288d0, 0x6bd0408a, 0x22c39383, 0xe4aed9f3
DCD 0x238879e3, 0xf26e0a21, 0x09a95ff2, 0x0252fd6f
DCD 0x8c289f17, 0x2253bda4, 0xe79513ad, 0x3cdd8b4c
DCD 0xaa950b46, 0x50fd411f, 0x63c15e69, 0x9ec1ae90
DCD 0xf863ef11, 0x6f1a151f, 0xcdbe12cf, 0xaa3d8581
DCD 0xe48181f3, 0xa52210bd, 0x93cbc5e0, 0xe61ebf37
DCD 0x3eaea1f8, 0x2c606c99, 0xeef82ba8, 0xc17805ec
DCD 0x8784bc41, 0x390bf39f, 0x585375a4, 0x70775e27
DCD 0x55fbe67f, 0xf9af439a, 0x79ab3c2d, 0xa1e1e581
DCD 0x68d87ed9, 0x184a0883, 0x9d88d137, 0xc629bf0f
DCD 0xee2c4d1e, 0x0f6fe232, 0xc8f6889a, 0xa4495c00
DCD 0x2e3f71c6, 0x57a072a1, 0x1ef48739, 0x17447c8e
DCD 0x6848f422, 0xb49fe027, 0x4499dbd5, 0x1fdf5795
DCD 0xf58b1677, 0x1ba20506, 0xfb7fddd1, 0x62410693
DCD 0x9ebb6e66, 0x9f0daa55, 0xe693a20b, 0x0ada8b21
DCD 0x4f17b80b, 0xdd7868b3, 0x5164e1d8, 0x9cd2f619
DCD 0xd7811039, 0x82086954, 0xdf5cc03b, 0x1a99e593
DCD 0x791ddf2a, 0x7dd4d3ea, 0x6f162c9d, 0x8be468fc
DCD 0x9f6e7e0e, 0x07feb9d2, 0xa8c95922, 0x116d0ddb
DCD 0x219a6a8a, 0x300e9420, 0xc0cd3072, 0xef4d9f56
DCD 0x3c7695a5, 0x211f7b11, 0x3e40fd95, 0x21b15d2f
DCD 0xdaa08678, 0xd76e836a, 0x3e3f0411, 0x67dc241b
DCD 0xdf591603, 0x1d0cd5cf, 0x8719d73a, 0xff55f428
DCD 0x31ba5a0a, 0x69086166, 0x34ef91f8, 0xb3bd5965
DCD 0x862c239e, 0xa526a80f, 0x92ede2e0, 0x049b5692
DCD 0xca83d0a0, 0x7de4b866, 0x3bc1e5a0, 0xf47004be
DCD 0x70fb397c, 0x57bf0226, 0x6c9323eb, 0x651ae032
DCD 0xece995af, 0x612a9926, 0x33ae9b95, 0xc92956e2
DCD 0xd34d588b, 0x8ee12ef1, 0xa8de650f, 0x90ca4a5e
DCD 0xec40eee8, 0x83ad7c85, 0x19eacbe7, 0x500cc9fd
DCD 0xb7a08ab5, 0xedb22f62, 0xafdeabf1, 0x3d146b41
DCD 0xb1db523e, 0xf2c0e966, 0x06ab4d5f, 0x505ee648
DCD 0x1f71c0a1, 0x43c12324, 0x730091ce, 0xddf551c5
DCD 0x474a1a43, 0x422ea2c0, 0x5ee96481, 0x35e08c56
DCD 0x1d3820aa, 0xd6726c1f, 0x45b00ccc, 0xa85491ca
DCD 0xa3fd6ed3, 0xa89695fe, 0xc12beb97, 0x7eff99cd
DCD 0x5db0dc5b, 0xb26abce6, 0x036a4401, 0x5a8840c8
DCD 0xdbce41a7, 0x343cb974, 0x9cc9afc2, 0x2d4e2c30
DCD 0x0e8269f7, 0x8bff82ce, 0x9e518bd9, 0xf397ebef
DCD 0xefd46c83, 0x22a93aad, 0x84c2b0a0, 0x28a26694
DCD 0x3324e6f6, 0x40f4539c, 0xda3609d1, 0xa9483f55
DCD 0xdf704dda, 0x1f735c0b, 0x45102ec9, 0x71543b90
DCD 0x4884b455, 0x229cd00d, 0x87cafe2b, 0x46d87ac7
DCD 0xa0ab6c3f, 0x2be31c52, 0xfd24f2f5, 0xede7b0e3
DCD 0x55fbf4a3, 0x49c8da6f, 0xc2a0ea0a, 0x0d5a115c
DCD 0x2053dc30, 0x19cd3500, 0xb0f0ec60, 0x05a77b19
DCD 0xb2db158b, 0xa570bd7c, 0x2413b797, 0x05bed629
DCD 0x0e1df7ac, 0x0958aa4d, 0x0e3817ea, 0x83bd43e5
DCD 0x5fcb3f51, 0xb8f8f0bd, 0x7ebd6452, 0xe1ced5a8
DCD 0xf812dee6, 0x3ba09c46, 0xa01890d7, 0x8eed8e02
DCD 0x53c73145, 0x7db33d18, 0x661a69e8, 0x3ef4f086
DCD 0x519b2c50, 0xbace6f68, 0xf20ff75a, 0x3c251f2f
DCD 0x229282a9, 0x5b135571, 0x481a0a45, 0x92d30aeb
DCD 0xc32c7cf0, 0xcf6f3df5, 0x8be85f42, 0x6336e724
DCD 0xaa6596f5, 0x33314ef7, 0x9ac02115, 0xe26f0c5e
DCD 0x0cbcc701, 0xcafa791d, 0xa727a01e, 0x21bd128e
DCD 0x1f350c49, 0xd3571b57, 0xd249a9e8, 0xbd85c611
DCD 0x0ba903d1, 0x8302bcca, 0xdc89ba64, 0x08369ad7
DCD 0x4fe6ebb0, 0x288ba46a, 0xa5cf9b04, 0x2609f604
DCD 0x5f3698d8, 0xe40fc850, 0x49091ccb, 0x669895a7
DCD 0xb35e6e4f, 0x3bed2be9, 0x4f841603, 0x5bf6c70e
DCD 0x331bc24d, 0x11d138cb, 0xc1ae0a88, 0xfb985b54
DCD 0x54828ebb, 0x2c96da55, 0x0af13542, 0x0774b6c6
DCD 0x95f451ee, 0xaf4b3b77, 0x2a201b3e, 0xb822dc0d
DCD 0x337f018d, 0x9eb8c10b, 0x1b3e3a19, 0xbfe9d57f
DCD 0x8ffc736f, 0xeae418cf, 0xddf160f2, 0x037f811f
DCD 0xee569e70, 0x7f6b3748, 0xfac6caff, 0xe540f41f
DCD 0x42bfe95a, 0x8a2f723a, 0xc90f3a17, 0xe2acbbdd
DCD 0x84930a13, 0xd627355e, 0x880c18c3, 0x91571ba0
DCD 0x175d17a1, 0xf9c3023f, 0xfe710233, 0x30d9d488
DCD 0x5e8ff406, 0xb1bc7144, 0x040a57d3, 0x3f5f702b
DCD 0xf1182cf2, 0xa48be70e, 0x2710b09c, 0x2a761426
DCD 0xe6b53260, 0x739a5ff9, 0x44573814, 0x00028530
DCD 0x6883b926, 0x73fbd408, 0xa9e78906, 0x3cc79185
DCD 0x8d4d1263, 0xf7227cf9, 0x87a62ad2, 0xdc799673
DCD 0xe79c8caa, 0x34fa9369, 0xe4153f43, 0x4bb9f688
DCD 0xc05b5600, 0xa3de2e7f, 0xa775b317, 0x585e21c2
DCD 0x02a74643, 0x23f530ad, 0x3df9978d, 0xafb60023
DCD 0x8cecde2e, 0x3344866e, 0x1ad981dd, 0x4918b9f6
DCD 0xf5d24a8d, 0xdcd691cc, 0x0d81647d, 0x1859de1c
DCD 0x7dc54442, 0x8303fc99, 0xd91ae065, 0x52b2c9c0
DCD 0x0522a188, 0xee129947, 0x322fde74, 0xd33da79f
DCD 0x9b0b41ac, 0xd1f0e908, 0x382101b3, 0xee60afb3
DCD 0xf294ea92, 0xfdf4e422, 0x4e2dd429, 0x53d4ca12
DCD 0xf83d4d69, 0x7ca99fc0, 0xdc80b12c, 0x92ae95c2
DCD 0x5b962ed7, 0x1e4c8e02, 0x9d2baf33, 0xbda48e6e
DCD 0x1d966a9f, 0x9b154721, 0x14447bb2, 0x2584e6fa
DCD 0x15a0e697, 0xe2df5c32, 0xef43dc6a, 0x09aa7d7d
DCD 0x7c037cab, 0x2edbef6b, 0x276f3965, 0x9615325f
DCD 0x95634ad3, 0x7d14b74c, 0xcece5e78, 0x41c4b17b
DCD 0x5b8931b8, 0xa960ca71, 0xbf1bc3af, 0x2ef5cbcc
DCD 0xee25cbca, 0xefd9e40b, 0x2d2af1f8, 0x2b504f79
DCD 0x23950771, 0xc459a9b3, 0xeaff71c1, 0x07b920bb
DCD 0x7597cc0a, 0xc6e5244c, 0x3c513083, 0x3601005f
DCD 0x662b9a2c, 0xcd8cc1c1, 0x305dfcb2, 0xf3f6a575
DCD 0x57776b82, 0xedf78348, 0x8b3ba524, 0xe0475039
DCD 0x7417a999, 0x0169b153, 0x65f20fef, 0xfe102fe4
DCD 0xfdd7b23c, 0x7b201dcf, 0x2d59863d, 0xd24178eb
DCD 0x7a760f23, 0x8241f550, 0xc64beabf, 0x3380cb8a
DCD 0x114d08d8, 0x18f76bde, 0x6e5f6e2b, 0x3121c61c
DCD 0x8fd633f4, 0xe7afdfbd, 0x0333db83, 0x84e70127
DCD 0x48f3634d, 0x83d709dd, 0x79987ff7, 0x063b2c27
DCD 0x843e416d, 0x65a378bb, 0x8ef8439a, 0xf789c3cc
DCD 0x2e4b4121, 0xc245e44c, 0xff193556, 0x34a0be4e
DCD 0x620dd47f, 0x586c3a17, 0xd20012da, 0x718cf285
DCD 0xa7f8533a, 0xf6f5cf6c, 0x0be9b734, 0xd1935d5b
DCD 0x2506bd64, 0x2bf60d6e, 0x15c804bf, 0x13a69ce5
DCD 0x071ed428, 0x24e7b02a, 0xeb3db5e8, 0x82421988
DCD 0x9a453028, 0x5d174bf1, 0x2da5c77e, 0x9c2e2e8f
DCD 0x63f0f8fc, 0x2be1ed90, 0x77c1b78c, 0x6c578857
DCD 0x4076ce06, 0xf81a6cb8, 0x5db92f12, 0x15ab7171
DCD 0x6d4b870d, 0x99193327, 0x42073d13, 0xb70a19b6
DCD 0x43851600, 0xb522889b, 0xe52278cf, 0x722ac563
DCD 0xa624a83c, 0x41703498, 0x2d585fa1, 0xba4a5b3c
DCD 0x2bfe1197, 0xff05182c, 0x8408bee2, 0x9f48121f
DCD 0x7922b4d1, 0x6664bf5e, 0x2bd9f7f4, 0x51ea46eb
DCD 0x7bc520da, 0xad8580f8, 0x51b13918, 0xa05cf186
DCD 0x96a463af, 0x242f6690, 0xc4e30e72, 0x550a4738
DCD 0x57cabf8b, 0x2f302a46, 0x03a705bc, 0x7eb63047
DCD 0x62bf270e, 0x44fe74b7, 0x3ae4201b, 0x67e2b944
DCD 0xadcdb554, 0x71462dea, 0x3f8181a8, 0xd6b5b988
DCD 0x26bff131, 0xa0e01570, 0x5545ae12, 0x93f74add
DCD 0xf8cb7682, 0x794f3bb2, 0xff80da2d, 0x49899941
DCD 0x39d5801f, 0x07619fff, 0x15cdd0db, 0x1ffaa2ce
DCD 0x42854b62, 0x7b9eaeba, 0x0255fce0, 0x5e021626
DCD 0x94ba16b6, 0x23b8eabc, 0x60edf8a4, 0x722334f2
DCD 0xe0e03074, 0xf24c6abe, 0x1ff5738b, 0x4b714d54
DCD 0x124d3ed3, 0xcf61bdb0, 0xa3e510ea, 0xf0e89b3b
DCD 0x7c0c4086, 0xb80a8f06, 0x5e7a1fcc, 0x0c944a7b
DCD 0x834ca2f0, 0x0535d835, 0x2cb51685, 0xb0a1a73b
DCD 0x650067f7, 0x8c0fe4f3, 0xb8f5cb4b, 0x1c56dacc
DCD 0xd9f52c39, 0xa410e041, 0x577f4797, 0x062b486b
DCD 0x53e8378d, 0x5fd38d55, 0x38918478, 0xfccb7ee7
DCD 0xf09bfbb6, 0x65148bdd, 0xbbab0c9d, 0xf454c0e2
DCD 0x4ff63ec2, 0x42a29ea1, 0xa0b28b20, 0x57ed9d13
DCD 0x48450cd1, 0x299cb22e, 0x46ce322b, 0xa1de4d20
DCD 0x23f03d35, 0xd769ebc3, 0x161343e6, 0x1d7de909
DCD 0x721db01c, 0x6cdcfa43, 0x707d3751, 0xed0a30ee
DCD 0xef6e149e, 0xdf4e330c, 0xbcc7f6a0, 0xf62e3ca5
DCD 0x5056cbe9, 0xc2f1616f, 0x62499137, 0x95706c54
DCD 0x5a7e91dc, 0xec659c3f, 0x5d7f4e62, 0x3d865b1e
DCD 0x2f172b51, 0x109f5710, 0xbd80cafd, 0x9a5ce374
DCD 0x7d967f96, 0x0918958c, 0x917b4c42, 0x79321830
DCD 0x5b53f509, 0x8ced3e11, 0xa85e80ea, 0x83aa1888
DCD 0x94706df1, 0x0e7ee640, 0xdc8dfa43, 0x839349da
DCD 0xdf1086a1, 0x008ad8e7, 0x80e8aac0, 0x1463d245
DCD 0x3f0a4a0b, 0x750054d3, 0x80cb5e28, 0x2410b552
DCD 0x57137422, 0x26b9af08, 0x514ffdab, 0xc57564b4
DCD 0x88ae77b9, 0x65a04a8d, 0xb754becd, 0x6fcd10dc
DCD 0x3d8e1857, 0xa90d1232, 0xf34bd8f7, 0x13448440
DCD 0x922e6998, 0x19cf7e25, 0xaa2918e1, 0x890b60b0
DCD 0x7030ab18, 0x22417447, 0xe42da9a5, 0x86515844
DCD 0x73087c5b, 0x6f4c50e9, 0x84cdfe3f, 0x0e9942f5
DCD 0x398a2c77, 0xfc986c58, 0x9a9dec00, 0xd5ca4c52
DCD 0x33394f6e, 0x1b71fd37, 0xeaa2f109, 0x1954de63
DCD 0x4200de8e, 0x7d046b7c, 0x16d107fc, 0x1a8fcff2
DCD 0x4b55ae3c, 0xbab53607, 0xb7cbb780, 0xe043c98e
DCD 0xf87098e5, 0xe138e25d, 0x40ff8057, 0x86940083
DCD 0x3ce76995, 0x4cb9d05f, 0x0f581907, 0x5e3dac5d
DCD 0x83a2c1b9, 0xd4f1a3ce, 0x71cf27ea, 0xd997f122
DCD 0xa655447e, 0x1b59d11f, 0xf458295c, 0x7f72b78c
DCD 0xd496a483, 0x5ea9055c, 0xc0189738, 0x3db25255
DCD 0x2d111ffb, 0xa706e838, 0x251b91d9, 0x304c40ec
DCD 0x4b3525be, 0x15f10969, 0x35fc8d6f, 0xcf87942c
DCD 0xee977ca8, 0x3194a850, 0x54fee439, 0xe528af54
DCD 0x25698e1e, 0x361b8f99, 0x7bbf7a35, 0xcf0ee45d
DCD 0xe46f6833, 0x333e00c7, 0xe5c63a77, 0x72d7d30b
DCD 0x0aa86fdc, 0x0375daba, 0x3a84ee54, 0x8d23cf64
DCD 0xeb5ebdfa, 0x20f636d2, 0xd8991ab0, 0x16734342
DCD 0x0980bb8b, 0x2341def2, 0xddee4deb, 0x618ea347
DCD 0xe46bbeb0, 0x2ce56bc1, 0xd101ae6c, 0x935228ad
DCD 0x56792ec0, 0x6d79fbc3, 0xaa98039a, 0xd5a8b85e
DCD 0xac30ac15, 0xc8fca8ca, 0xf4e13bc5, 0xbcac4bcf
DCD 0xb8027c04, 0x2deefacb, 0x75fcfebc, 0xe0b203b9
DCD 0x7052e4c0, 0x232ab7f3, 0x190fac4b, 0xd1174bc3
DCD 0xc54423fd, 0x8ec85ec4, 0x60c1f887, 0x6a67736a
DCD 0xb4a4c3f1, 0x7d435e1e, 0x2598d0c9, 0x27092040
DCD 0xaf74052a, 0xa289d174, 0x1e9101b2, 0x6d290e1b
DCD 0xd8c66be8, 0x70b54fc4, 0x6a0d981d, 0x1649da16
DCD 0xd8ab187f, 0x112dc8b9, 0x517c8ef2, 0xa0feaaa8
DCD 0x01a95519, 0x5145c21e, 0x51628a1b, 0x3b13f266
DCD 0x4ed13baa, 0xe34e1bf7, 0xe8e4c670, 0xa37acadc
DCD 0xb21013d8, 0xbf469fee, 0xb149f1d2, 0x35eec167
DCD 0xa5315b49, 0x724bcacb, 0xfc8bac25, 0x20b70168
DCD 0xdb829cff, 0xa0c8d14a, 0x647a9274, 0x7e6449e0
DCD 0xf3073316, 0xb3b91ab0, 0x1a712fb5, 0xaf92ca1e
DCD 0xcfd46fbd, 0x74dabdf6, 0x1e8c192a, 0xabb6369d
DCD 0x61bd95c7, 0x3346b2c2, 0x112ed78c, 0x734299cb
DCD 0xadf16e9f, 0x90d9c452, 0x229e47ea, 0x07340abf
DCD 0x7358eb8f, 0xb1ae7ea5, 0x41562eeb, 0xe0d58f71
DCD 0x99be2884, 0x8a86e155, 0xa9da6d22, 0x73e0587e
DCD 0xd4357f4a, 0xf704c44f, 0x23381b31, 0xc48a1dd5
DCD 0x4ebe8b98, 0xa187266a, 0x45f66098, 0x13e71b79
DCD 0x22f58514, 0x37386d82, 0xc8da6692, 0x133fce69
DCD 0x1dd81184, 0x413479fe, 0xd5f19d9e, 0xc98a4fe7
DCD 0x8e11080b, 0xe503d16b, 0xe418ad10, 0x0bd0a216
DCD 0x10699750, 0x78381ca1, 0xfa59a938, 0xeaf9c653
DCD 0xfb57fa86, 0x118a69c0, 0x71a8d96c, 0xfa90d4e6
DCD 0x8f71c373, 0x219cd448, 0xdef7378b, 0x1091c20b
DCD 0xf5c45ac2, 0xf6f453dc, 0x23f57355, 0x3ce4af40
DCD 0x88728468, 0x394e5b9f, 0x8ccd2a2b, 0xb34c3c46
DCD 0x1649945b, 0x1e26db73, 0xa28a1a19, 0x00299280
DCD 0x5bc3153c, 0x5e57cbbc, 0x724e0efe, 0x33547d75
DCD 0x975e83bf, 0x4007bccc, 0x5d618dd1, 0x4a736824
DCD 0x04f8c27b, 0x0e85b5f5, 0xe1a2c7f3, 0x02ed2fb0
DCD 0x8dbe2bef, 0xeddd7222, 0x36ec5780, 0xd5d28d5c
DCD 0x725a076e, 0xea2026f0, 0xa2ddac96, 0x1a33a523
DCD 0x02ea4733, 0xcb7dafc8, 0x4f48395b, 0xbb556441
DCD 0x35ffdeb6, 0x10a3d7ae, 0x8bd12776, 0x05f1954e
DCD 0x71eb73dd, 0x9d5fce77, 0x4fcb38c3, 0x2214fa74
DCD 0xd5cbd35c, 0x22fa10c1, 0x9a093b77, 0xe77d9bec
DCD 0xce1b6f8a, 0x7de7b617, 0xf628c408, 0x8075c24f
DCD 0x8dc66e84, 0x0acabccf, 0x508e1667, 0x60860869
DCD 0xe9124705, 0xb078f70f, 0xfa3a5d40, 0x4d879462
DCD 0x92b0ceaf, 0xc43888af, 0x46788685, 0xee4a3f9f
DCD 0xb349a574, 0x2ec7130f, 0x9474228e, 0x4e792129
DCD 0x29dd3e46, 0x05cc67fa, 0x2adda55d, 0x86657225
DCD 0x2e615073, 0x00bde29b, 0x724621fd, 0x93566aeb
DCD 0x963a885e, 0xb54b452b, 0x888f81b4, 0x13482851
DCD 0x18892eaa, 0xe005315d, 0xdec4faa1, 0xef014fe7
DCD 0x7d4f14c6, 0x6932aee5, 0x4cfc1292, 0xeceac113
DCD 0xa70c4070, 0x78f22a86, 0x34838e27, 0xa672b6cd
DCD 0x185191c2, 0xcb5ce063, 0xe05e1497, 0x314cce8f
DCD 0xbf0aeb87, 0x7636aee5, 0xf6793f41, 0x2d5416a6
DCD 0xfb85d95f, 0x6b9394f8, 0xccb7bb64, 0x49573004
DCD 0x7c00df3c, 0xb7b9e311, 0xb597eaad, 0x8234af78
END

View File

@ -0,0 +1,239 @@
IRIS-SUBPモニタプログラム変更履歴
V0.76
・IPL2カートリッジブート・バージョン
V0.75
・カードバス切り換え実験バージョン
V0.74
・デバッガ4MB動作バージョン
V0.73
・カートリッジブート仕様
V0.72
・3Dメモリ擬似対応版
V0.71
・IPL2ブート実験版
V0.70TS040304提出バージョン / CRC16 0x5835
・IPL2ブート対応版
・ARM7側をメインメモリへもブートできるように拡張
・初期化シーケンス最適化
・RTC読み込みをメモリ初期化直後へ移動
・IPL2へ渡すタイマーをRTC読み込み直後に開始、セキュア処理完了後に停止IPL2のRTC動作確認のマージンを稼ぐため
・メインメモリ先頭64KB初期化
・IPL2 のメインメモリへのロード可能領域上限を32バイト下位へ移動
・IPL2 の内部ワークRAM へのロード可能領域上限を32バイト下位へ移動
・IPL2 の内部ワークRAM へのロード可能領域下限をセキュアワーク0x2200バイト上位へ移動
・カードSECUREコマンドレイテンシ最小サイクル数定義必ずGAMEモードへ遷移するため
・スクランブル乱数算出時のSP参照を vc_dummy から vd へ移動
・enableReadSecure の条件へ !enableCardNormalOnly を追加
・IPL2のCRC不一致時メインメモリ先頭64KBクリア条件を flashCrcError のみへ変更
・圧縮システムコール・エラー時のTerminate処理 追加
・サインテーブル縮小
V0.62
・3Dメモリ擬似対応版
V0.61
・IPL2ブート実験版
V0.60TS提出バージョン / CRC16 0x4809
・IPL2ブート対応版
V0.59
・IPL2ブート対応版
V0.58
・IPL2ブート実験版
・RTC処理変更ウェイト変更 30us → 6us
・IsMmem8MB() 変更
・フラッシュARM7ロード制限拡張
・InitReadFlash() 修正
・SIOハンドシェイクデータをセキュアHI領域へ隠蔽
・終了同期番号 4 → 3 変更
V0.57
・IPL2ブート対応版
V0.56
・IPL2ブート実験版
・SVC_Div()/SVC_DivRem()/SVC_Sqrt() 追加
・UC_*StreamFuncp() 引数変更
・InitVA_VB_VD() の vc_dummy 計算式変更SecureWork 移動のため)
・enableReadSecure の条件に !rtcResetError を含める
・enableCardNormal 時のデバッガ起動対応
・SharedWork 構造体へ cardHeaderError メンバ追加
・ChangeObjectTableFook() 内で ChangeObjectTable() への引数を与える
・RTC 初期化バグ修正
V0.55
・IPL2ブート対応版
V0.54
・IPL2ブート実験版
・TerminateFuncp の NULLポインタチェック
・DecryptObjectFileFook()/ChangeObjectTableFook()
/CopyBiosAreaFook()/CpuSetFast32Fook() 追加
・フラッシュ CRC エラー時、SECURE領域クリア
V0.53
・カートリッジブート仕様
・サインテーブル追加
V0.52
・IPL2ブート対応版
V0.51
・IPL2ブート実験版
・UnCompLZ77Short()/UnCompHuffman32() の内部初期化関数への第3引数変更
・システムコールの整理
・暗号関数のフック関数群 追加(隠蔽化のため)
・ARM7ユーザ最大ロードサイズ 32KB → 64KB
・サウンドSINテーブル追加
・サウンドボリュームテーブル更新
V0.50
・3Dメモリ擬似対応版
V0.49
・デバッガ通信実験版(フラッシュ書き込み無し)
V0.48
・デバッガ通信実験版(フラッシュ書き込み有り)
・デバッガ・ロードチェック強化
・SIO 通信データクリア処理の変更
V0.47
・IPL2ブート対応版
V0.46
・IPL2ブート実験版
・暗号テーブル更新
・カード・ロードパラメータチェック強化
・SPI割り込み要求廃止
V0.45
・フラッシュヘッダのフォーマット変更
・セキュリティ有りデバッガ通信
V0.44
・デバッガ通信実験版(フラッシュ書き込み無し)
・SIO "ID" 文字列チェック追加
V0.43
・デバッガ通信実験版(フラッシュ書き込み有り)
・CRC初期値 0 → 0xffff
V0.42
・デバッガ通信実験版(セキュリティ無し)
・スクランブルの強制設定位置をSECUREエリア読み込みシーケンス部へ移動
・SECURE領域のCRC計算時にRTCリセットエラーもチェック
V0.41
・IPL2ブート対応版
V0.40
・IPL2ブート実験版
・IPL2サイズ制限削除
・IPL2圧縮タイプチェック 4bit → 8bit
・暗号化オブジェクト対応
・デバッガモニタのADバスブート削除
・デバッガモニタの有効範囲を拡張メモリ領域へ制限
・デバッガとのSIOハンドシェイク暫定対応
・SECUREモード・コントロール設定マクロ修正
V0.39
・2画面ブレッドボードでのカートリッジバスブート仕様
V0.38
・IPL2ブート対応版
V0.37
・IPL2ブート実験版の改良
・NORMALモードのみ動作許可キー対応
・PNG-OFF有効キー対応
V0.36
・IPL2実験用カードバス・ダウンロード
V0.35
・SECUREコマンドとフラッシュ読み込みの完全並列処理化3Dメモリ・レイテンシ対策
・カードバス・フルダウンロード
V0.34
・3Dメモリ・50msレイテンシバグ修正
V0.33
・3DメモリSECUREモード対応
・ROMヘッダフォーマット変更
・フラッシュヘッダフォーマット変更
・カードブート時 NINTENDO ロゴチェック → CRCデータチェック 変更
・カードロード・バグ修正
V0.32
・カードブート時 NINTENDO 文字列チェック → ロゴチェック 変更
・UsrSwi() 削除
V0.31
・サウンドチーム提出バージョン
V0.30
・カードバスSECUREコマンド発行手順のランダム化
・IPL2用関数ポインタ取得システムコールの追加
・IPL2用ブートシステムコールを繰り返し呼ぶ仕様へ変更
・DISP_READY_CARD_4_IPL2 定義追加
・カードバス・リセット処理をMAINP側へ移動
・IPL2用ブートシステムコール追加
V0.29
・カード(カートリッジ)ヘッダチェック成功時にのみデバッガモニタ起動
・PNA初期値テーブル修正
・共有ワークを 4KB → 16KB 拡張
・SPIシフトクロック 4Mbps 変更
・CTRDG_PHI_OUT_* 修正
・AGBモード時の表示期間待ち処理をMAINP側へ移動
・DISABLE_AGB_MODE → DISP_AGB_HEADER_ERROR 変更
V0.28(デバッガ専用)
・MMEM_CHK_SIZE_[WRITE|READ]_BUF 移動 MAINPと分離
・3Mメモリ暫定セキュリティ仕様対応
・デバッガモニタ・カートリッジブート時の読み込みサイズ修正0x180 → 0170
・例外発生時の FIQ 不許可バグの修正
・カートリッジバスへAGBと同等信号の出力
・AGBモードのROMヘッダチェック無効化定義の追加
・AGBモード非対応時の無限ループ
V0.27(デバッガ専用)
・デバッガモニタブート情報エリアの移動0x170 → 0160
・BIOSプロテクションアドレス セット
・JTAGイネーブル セット
V0.26(デバッガ専用)
・デバッガモニタブート情報エリアの移動0x70 → 0170
・デバッガモニタ・カードブート対応
・カード関係セキュアコード一時排除
・AGBモード一時排除
V0.25
・マスクROMブート対応 RTC 乱数初期化)
・例外発生時の FIQ 不許可対応
・AGBモード暫定対応
V0.24
・MAINPとの通信部分の変更
・カードリセット 追加
V0.23
・スレッド対応を元に戻す
・デバッガモニタブート情報エリアの移動0x10 → 0x70
V0.22a
・システムコールにて呼び出し元のスタックを使用するように変更(スレッド対応)
V0.21
・デバッガインタフェース実装
・SVC_UnPackBits() バイトアクセス回避
V0.20TEGボード配布バージョン
・割り込み処理、システムコール最適化
・SVC_UsrSwi() システムコール追加
V0.17
・システムコール群の整理
V0.16
・システムコールと割り込み処理呼び出しの高速化
・スタックポインタの移動
#・*CpuSet*() の転送サイズ有効範囲の拡張
V0.15
・SVC_WaitByLoop() 追加
・SVC_WaitIntr() 高速化
・SVC_WaitIntr() 内部で Halt 処理追加
・SVC_CpuSetFast() バグ修正
・SVC_ChangeSoundBias() を2ステップ → 1ステップ 変更
・初期化時に無線のクロック出力を切らないように修正
・コピー関数ソースアドレスチェック復活
・ROMヘッダ領域コピー
V0.14
・カートリッジアクセスタイミング 10-6 変更
・SVC_AccessCard() TEGボード暫定版の追加
・SVC_CpuSetFast() の32Byteサイズ制限の解除
V0.13
・システムコールNo参照時のバイトアクセス修正
V0.12
・UICアクセス遅延 追加
V0.11
・TEG でのADバス・ダウンロードへ対応
・ADバスへのアクセスタイミングをカードのSECUREモードに合わせる
・SUBP-DMA では256KByteまでしか転送できないため CPU で 8MB まで転送できるように変更
・サウンドバイアス設定
V0.10
・TEG で動作するように対応
V0.05AD16BUSバージョンV0.01
・MAINP同期ダウンロード実行
V0.02メインBB対応
・Halt() 修正、Stop() 削除
V0.01サウンドBB対応
・AGBにあるサウンドと通信以外のシステムコールの実装
・BB の仕様に合わせて内部ワークRAMイメージを未使用
・RAM実行プログラムコピー用に CpuFastSet() のソースチェック解除
・キー入力があるまでユーザプログラムのロード待ち&この間ブラックアウト表示

View File

@ -0,0 +1,240 @@
//======================================================================
// IRISモニタプログラム共有領域定義
//======================================================================
#ifndef _IRIS_MON_SHARED_AREA_H
#define _IRIS_MON_SHARED_AREA_H
#include "IrisSubpMonTarget.h"
#include <IrisCardDefine.h>
typedef void (*IntrFuncp)(void);
// ROMヘッダ・ブートパラメータ構造体
typedef struct {
u8 *romAddr; // ROMアドレス
u8 *entryAddr; // エントリアドレス
u8 *ramAddr; // RAMアドレス
s32 romSize; // ROMサイズ
} BootUsrParam;
// ROMヘッダ構造体
typedef struct {
s8 titleName[12]; // ソフトタイトル名
u32 initialCode; // イニシャルコード
u16 makerCode; // メーカーコード
u8 machineCode; // 本体コード
u8 deviceType; // デバイスタイプ
u8 nonVerReserved[4]; // 予約4バイト
u8 verDepReserved[4]; // 予約バージョン依存、4バイト
u16 wirelessSerialNo; // 無線シリアルNo
u16 softVersion:8; // ソフトバージョン
u16 compArm9BootArea:1; // ARM9ブートエリア圧縮フラグ
u16 compArm7BootArea:1; // ARM7ブートエリア圧縮フラグ
u16 :0;
BootUsrParam arm9; // ARM9ブートパラメータ
BootUsrParam arm7; // ARM7ブートパラメータ
u32 fileSysReserved[8]; // ファイルシステム予約32バイト
CardCnt romCtrl4Game; // ROMコントロール情報NORMAL & GAMEモード
CardCnt romCtrl4Secure; // SECUREモード
u8 romCtrlReserved_l[4]; // 予約
u16 secureCRC16; // セキュア領域CRC16bit
u16 romTimerLatency; // タイマーレイテンシ((サイクル数/256) - 2、3Dメモリ用
u8 romReserved_h[8]; // 予約
u32 romNormalModeKey[2]; // NORMALモード判定キー
u8 reserved[64]; // 予約領域64バイト
u16 nintendoLogo[0x9c/2]; // NINTENDOロゴ156バイト
u16 ninLogoCRC16; // NINTENDOロゴCRC16
u16 headerCRC16; // ヘッダCRC16
u8 *dbgRomAddr; // デバッガモニタROMアドレス
s32 dbgRomSize; // デバッガモニタROMサイズ
u8 *dbgArm9RamAddr; // デバッガモニタARM9-RAMアドレス
u8 *dbgArm7RamAddr; // デバッガモニタARM7-RAMアドレス
} RomHeader;
// フラッシュメモリヘッダ構造体
typedef struct {
u32 macAddr_l; // MACアドレス Low
u16 macAddr_h; // High
u16 crc16; // CRC16bit
u32 blowfishKey; // BLOWFISHキー
u16 arm9RomOffset; // ARM9-フラッシュメモリオフセット
u16 arm9RamInvOffset; // ARM9-RAM負オフセット
u16 arm7RomOffset; // ARM7-フラッシュメモリオフセット
u16 arm7RamInvOffset; // ARM7-RAM負オフセット
u16 arm9RomAlign:3; // ARM9-フラッシュメモリオフセット境界
u16 arm9RamAlign:3; // ARM9-RAMオフセット境界
u16 arm7RomAlign:3; // ARM7-フラッシュメモリオフセット境界
u16 arm7RamAlign:3; // ARM7-RAMオフセット境界
u16 arm7PlaceMmem:1; // ARM7-RAMメインメモリ配置フラグ
u16 :0; // 予約3bit
u16 rsv2Byte; // 予約
u32 unScrambleKey[2]; // スクランブル解除キー8バイト
} FlashHeader;
// セキュアワーク構造体
typedef struct {
u8 recvRtcBuf[8]; // RTCデータ受信バッファ要4バイト境界
u16 flashCrc16; // フラッシュメモリCRC16
u16 flashCount; // フラッシュメモリ 8バイトカウント
u32 flashBuf[2]; // フラッシュメモリ受信バッファ要4バイト境界
u32 flashKeyBuf[3]; // フラッシュメモリキー・テンポラリバッファ
u32 unScrambleKey[2]; // スクランブル解除キー8バイト、MakeBlowfishTable() で算出)
s16 isGenUnScrambleKey; // スクランブル解除キー生成完了MakeBlowfishTable() で設定)
u32 va; // 下位24bit24bit送信
u32 vb; // 中間20bit+未定義4bit、VBI: 32bit送信
u32 vc_dummy; // 下位16bit16bit送信
u32 vd; // 下位24bit24bit送信
CardCnt cardCntBak4Secure; // SECUREコマンドパラメータ・バックアップ
s16 enableReadSecure; // SECURE領域リード・イネーブルLoadSecure4Card() で設定)
u32 cardNormalModeKey[2]; // NORMALモード判定キーMakeBlowfishTable() で算出)
u32 cardKeyBuf[3]; // カードキー・テンポラリバッファ
s32 secureSize; // SECURE領域サイズ
s16 sequenceNo4Secure; // シーケンス番号SECURE用
s16 segmentTblShift; // セグメント番号テーブルシフト値SECURE用
u8 *segmentTblp; // セグメントテーブルポインタSECURE用
s16 numSecureSegment; // SECUREセグメント数SECURE用
s16 segmentOffset; // セグメントオフセットSECURE用
s16 blockOffset; // ブロックオフセットSECURE用
CardCtrlParam paramBak; // カードパラメータ 暗号化前バックアップSECURE用
#ifdef TEST_HUFFMAN
u8 huffTableBuf[512]; // ハフマンテーブルバッファ
#endif
#ifdef TRACE_SECURE_OP
s16 traceSecureOp; // SECUREコマンドのトレース
s16 traceOpCount;
// カードパラメータ トレースメモリSECURE用
CardCtrlParam paramTrace[64];
#endif
BLOWFISH_CTX blowfishCardTable; // カード用Blowfishテーブル
BLOWFISH_CTX blowfishFlashTable; // フラッシュメモリ用Blowfishテーブル
u8 bufEnd[4]; // セキュアワーク最終データ
} SecureWork;
// 共有ワーク構造体
typedef struct {
u32 nCardID; // NORMALカードIDLoadCardHeader() で取得)
u32 sCardID; // SECUREカードIDCardTimerIntr4Secure() で取得)
u16 cardHeaderCrc16; // カードヘッダCRC16LoadCardHeader() で算出)
u16 cardSecureCrc16; // カードSECURE領域CRC16LoadSecure4Card() で算出)
s16 cardHeaderError; // カードヘッダエラーCheckCardHeader() で設定)
s16 disableEncryptedCardData;// カードSECURE領域暗号化データ無効DecryptObjectFile() で設定)
s16 cardSequenceNo; // カード読み込みシーケンス番号
s16 enableCardNormalOnly; // カードNORMALモードのみ有効LoadFlashDemo() で設定)
s16 isOnDebugger; // デバッガ上で動作中か
s16 rtcError; // RTCエラー
u32 recvRtc[2]; // RTCステータス1タイマーデータ要4バイト境界
u8 *flashArm9RamAddr; // フラッシュメモリARM9-RAMアドレス
u8 *flashArm7RamAddr; // フラッシュメモリARM7-RAMアドレス
s16 flashArm9HeaderError; // フラッシュメモリ・ARM9ヘッダエラー
s16 flashArm7HeaderError; // ARM7ヘッダエラー
s16 flashCrcError; // フラッシュメモリCRCエラー
s16 flashReserved; // フラッシュメモリ予約領域
FlashHeader flashHeader; // フラッシュメモリヘッダ
u16 sysromCrc16; // システムROMのCRC16
} SharedWork;
//----------------------------------------------------------------------
// 共有ワーク領域のアドレス獲得
//----------------------------------------------------------------------
#define GetSharedWorkAddr() \
\
((SharedWork *)0x027ff800)
//・共有ワーク領域のアドレスを獲得します。
//・現在 2KB
//----------------------------------------------------------------------
// セキュアワーク領域のアドレス獲得
//----------------------------------------------------------------------
#if !defined(MOVE_TRACE_SECURE_BUF) && !defined(TEST_AGB_MODE)
#define GetSecureWorkAddr() \
\
((SecureWork *)0x037f8000)
#else
#define GetSecureWorkAddr() \
\
((SecureWork *)0x0380d000)
// ((SecureWork *)0x027fc000)
#endif
//・セキュアワーク領域のアドレスを獲得します。
//・現在 9KB
//----------------------------------------------------------------------
// カード割り込みワーク領域のアドレス獲得
//----------------------------------------------------------------------
#define GetCardIntrWorkAddr() \
\
((CardIntrWork *)0x0380fc00)
// ((CardIntrWork *)0x027ff880)
// ((CardIntrWork *)((u32 )GetSecureWorkAddr() + sizeof(SecureWork)))
// (&GetSharedWorkAddr()->cardIntrWork)
//・カード割り込みワーク領域のアドレスを獲得します。
//----------------------------------------------------------------------
// フラッシュメモリヘッダアドレス獲得
//----------------------------------------------------------------------
#define GetFlashHeaderAddr() \
\
(&GetSharedWorkAddr()->flashHeader)
//・フラッシュメモリヘッダのアドレスを獲得します。
//----------------------------------------------------------------------
// マスクROMヘッダアドレス獲得
//----------------------------------------------------------------------
#define GetRomHeaderAddr() \
\
((RomHeader *)ROM_HEADER_BUF)
//・マスクROMのヘッダアドレスを獲得します。
#endif // _IRIS_MON_SHARED_AREA_H

View File

@ -0,0 +1,624 @@
//*******************************************************************
// IRIS-SUBPモニタプログラム
//*******************************************************************
#include "IrisSubpMon.h"
//----------------------------------------------------------------------
// メインルーチン
//----------------------------------------------------------------------
extern u8 SecureAreaEndp[];
CardIntrWork *cardIntrWorkp;
RomHeader *romHeaderp;
void Iris2Agb(void);
s32 CalledFormIPL2(void);
s32 CheckCardHeader(void);
s32 CheckCartridgeHeader(void);
void LoadCardHeader(void);
void LoadSecure4Card(void);
#define CARD_DMA_NO 3
void IrisSubpMonMain()
{
SharedWork *shwp = GetSharedWorkAddr();
NotifyMainpIntf(0); // ブート・ハンドシェイク
#ifdef NDEBUG
WaitMainpIntf(1);
NotifyMainpIntf(1);
#endif // NDEBUG
InitReg(); // レジスタ初期化
PreInitRam(); // メモリ初期化
WaitMainpIntf(2); // ARM9 初期化完了待ち(この後で上記レジスタ設定が有効になる)
*(vu32 *)REG_CARDCNT = CARD_RESET_HI; // カード スタートリセットはMAINPで行っている、事前設定
*(vu8 *)REG_CARD_MASTER_CNT = CARDMST_SEL_ROM | CARDMST_ENABLE; // カードマスターイネーブル
PostInitRam(); // メモリ初期化共用ワークRAMクリア、
// カードリセットHI期間に含まれる
InitRtc(); // RTC初期化 & リード共用ワークRAM使用、
// カードリセットHI期間に含まれる
*(u32 *)REG_TM0CNT = TMR_PRESCALER_256CK | TMR_ENABLE; // タイマー スタート
*(u32 *)REG_TM1CNT = TMR_CONNECT | TMR_ENABLE;
sharedWorkp = GetSharedWorkAddr(); // 共有ワーク領域デバッグ用
secureWorkp = GetSecureWorkAddr(); // セキュアワーク領域デバッグ用
cardIntrWorkp = GetCardIntrWorkAddr(); // カード割り込みワーク領域
romHeaderp = GetRomHeaderAddr(); // ROMヘッダ領域
shwp->sysromCrc16 = GetInvCRC16(NULL, BIOS_SIZE); // システムROMのCRC算出メインメモリクリア完了後、
// カードリセットHI期間に含まれる
NotifyMainpIntf(2); // 初期化完了の通知
intrTable[0] = CardIntr; // カード割り込み関数 セット
LoadCardHeader(); // カードヘッダ領域のロード
LoadFlashHeader(); // フラッシュメモリヘッダのロード
#ifndef NDEBUG
WaitMainpIntf(15); // デバッグ通信
#endif // NDEBUG
LoadSecure4Card(); // カードセキュア領域(+FLASHデモのロード
*(vu16 *)REG_TM0CNT_H = 0; // タイマー停止
*(vu16 *)REG_TM1CNT_H = 0;
#ifdef DISP_READY_CARD_4_IPL2
NotifyMainpIntf(9); // IPL2カード読み込み準備完了通知
while(1) ;
#endif // DISP_READY_CARD_4_IPL2
#ifdef DISABLE_BOOT_IPL2
intrTable[0] = CardIntr; // カード割り込み関数 再セット
while (CalledFormIPL2() != -1) { // IPL2メモリ呼び出し部分
WaitVBlank(1);
}
#endif // DISABLE_BOOT_IPL2
*(vu32 *)REG_IME = 0; // IME クリア
*(vu32 *)REG_IE = 0; // IE クリア
*(vu32 *)REG_IF = -1; // IF クリア
NotifyMainpIntf(3); // ダウンロード完了の通知
WaitMainpIntf(3);
}
//----------------------------------------------------------------------
// ROMヘッダ領域のロード
//----------------------------------------------------------------------
void LoadCardHeader(void)
{
SharedWork *shwp = GetSharedWorkAddr();
RomHeader *rmhp = GetRomHeaderAddr();
*(vu8 *)REG_CARD_MASTER_CNT = CARDMST_SEL_ROM // カードマスターイネーブル
| CARDMST_ENABLE | CARDMST_IF_ENABLE;
LoadCardTable(); // フラッシュメモリ・テーブル設定
ReadCardHeader(); // ROMヘッダ読み込み
shwp->cardHeaderCrc16 = GetInvCRC16((u16 *)rmhp, 0x15e); // ROMヘッダのCRC算出
// クロックタイプとレイテンシ設定以外 クリア
SetCardCnt4Normal(GetCardCnt4Normal() & (CARD_CLOCK_TYPE | CARD_LATENCY_MASK));
shwp->nCardID = ReadCardID4Normal(); // カードID格納
}
#ifdef BOOT_FROM_CARTRIDGE
void LoadHeader4Cartridge(void)
{
*(vu32 *)REG_EXMEMCNT = CTRDG_AD16_1ST_10CYC | CTRDG_AD16_2ND_6CYC; // 10-6アクセスメインメモリ/カード関係はリードオンリー)
CpuCopy16_32(CTRDG_AD16_BANK0, ROM_HEADER_BUF, 0x170, 32); // ROMヘッダ読み込み
}
#endif // BOOT_FROM_CARTRIDGE
//----------------------------------------------------------------------
// カードヘッダのチェック
//----------------------------------------------------------------------
#define IS_EXIST_CARD_WORD 0xcf56 // 0x2e03
s32 CheckCardHeader(void)
{
SharedWork *shwp = GetSharedWorkAddr();
RomHeader *rmhp = GetRomHeaderAddr();
u32 retval;
*(vu16 *)(MAIN_MEM_EX_END - 0x4) = 1; // ヘッダ読み込み失敗フラグ 初期化
shwp->cardHeaderError = 1;
if (shwp->cardHeaderCrc16 != rmhp->headerCRC16) return 1; // ROMヘッダのCRCチェック
if (rmhp->ninLogoCRC16 != IS_EXIST_CARD_WORD) return 1;
*(vu16 *)(MAIN_MEM_EX_END - 0x4) = 0; // ヘッダ読み込み成功フラグ セット
shwp->cardHeaderError = 0;
return 0;
}
//----------------------------------------------------------------------
// カートリッジヘッダのチェック
//----------------------------------------------------------------------
#ifdef BOOT_FROM_CARTRIDGE
s32 CheckCartridgeHeader(void)
{
if ((*(u32 *)(ROM_HEADER_BUF + 0) != *(vu32 *)"NINT")
|| (*(u32 *)(ROM_HEADER_BUF + 4) != *(vu32 *)"ENDO")) {
return 1;
}
*(vu16 *)(MAIN_MEM_EX_END - 0x4) = 0; // ヘッダ読み込み成功フラグ セット
return 0;
}
#endif // BOOT_FROM_CARTRIDGE
//----------------------------------------------------------------------
// ROMセキュア領域のロード
//----------------------------------------------------------------------
extern u32 png_off_key[];
void LoadSecure4Card(void)
{
SharedWork *shwp = GetSharedWorkAddr();
SecureWork *scwp = GetSecureWorkAddr();
RomHeader *rmhp = GetRomHeaderAddr();
FlashHeader *fhp = GetFlashHeaderAddr();
u8 *loadStartp = (void *)((u32 )rmhp->arm9.romAddr & ~(MROM_SEGMENT_SIZE - 1));
u8 *loadDestp = rmhp->arm9.ramAddr;
s32 loadSize = rmhp->arm9.romSize;
s32 secureSize = MROM_GAME_AREA - (s32 )loadStartp;
if (secureSize < 0) secureSize = 0; // SECURE領域サイズ補正
scwp->secureSize = secureSize;
ClearMmemSecureArea(); // セキュリティのためメインメモリ先頭64KB事前クリア
InitSecureParamFook(); // SECUREモードパラメータ 初期化
if (!CheckCardHeader() // カード・ヘッダのチェック
&& !shwp->enableCardNormalOnly // NORMALカード・チェック
&& !shwp->rtcError // RTCエラーチェック
&& (secureSize > 0) // アドレス情報のチェック
&& ((loadStartp >= (u8 *)MROM_SECURE_AREA) && (loadStartp < (u8 *)MROM_GAME_AREA))
&& ((loadDestp >= (u8 *)MAIN_MEM) && (loadDestp < (u8 *)MON_MMEM_LOAD_LIMIT)))
scwp->enableReadSecure = 1; // SECURE領域リード・イネーブル
CheckDebugger(); // デバッガ起動チェック
// ARM9先頭16KBエリア転送
#ifndef DISABLE_SECURE_CODE
if (shwp->enableCardNormalOnly) { // NORMALカード使用時SECURE領域は読まない
LoadFlashDemo(); // FLASHデモプログラム読み込み
} else
#endif // DISABLE_SECURE_CODE
if ((shwp->isOnDebugger == 1) && IsMmem8MB()) { // デバッガ起動時
if (scwp->enableReadSecure)
SetCardIntr4Normal(loadStartp, loadDestp, secureSize); // NORMALモード読み込み
LoadFlashDemo(); // FLASHデモプログラム読み込み
if (scwp->enableReadSecure)
WaitCardIntr(); // NORMALモード読み込み終了待ち
ChangeCardMode4Normal(); // GAMEモード遷移
#ifndef DISABLE_SECURE_CODE
} else { // SECUREカード使用時
ChangeCardMode4Normal(); // SECUREモード遷移
intrTable[0] = CardIntr4Secure; // カード割り込み関数 セット
intrTable[1] = CardTimerIntr4Secure; // カードタイマー割り込み関数 セット
InitCardParam4Secure(); // SECUREコマンドパラメータ初期化
SetCardIntr4Secure(loadStartp, loadDestp, secureSize); // SECUREモード読み込み
LoadFlashDemo(); // FLASHデモプログラム読み込み
WaitCardIntr(); // SECUREモード読み込み終了待ち
TerminateCardParam4Secure(); // SECUREコマンドパラメータ復元
if ((scwp->unScrambleKey[0] != png_off_key[0]) // スクランブル解除キー無効時
|| (scwp->unScrambleKey[1] != png_off_key[1])) {
SetCardCnt4Game(GetCardCnt4Game() | CARD_SCRAMBLE_SET_MASK);// スクランブル強制設定
}
#endif // DISABLE_SECURE_CODE
}
if (scwp->enableReadSecure) // SECURE領域のCRC算出
shwp->cardSecureCrc16 = GetInvCRC16((u16 *)loadDestp, secureSize);
DecryptObjectFileFook(); // 暗号化オブジェクトの復号
#ifndef DISABLE_SECURE_CODE
*(vu32 *)REG_BIOS_PROTECT_ADDR = (u32 )&SecureAreaEndp; // BIOSセキュリティアドレス セット
#endif // DISABLE_SECURE_CODE
#ifndef TRACE_SECURE_OP
CpuClearFast32(0, GetSecureWorkAddr(), sizeof(SecureWork)); // セキュアワーク クリア
#endif // TRACE_SECURE_OP
if (shwp->flashCrcError) // IPL2のCRC不一致時、SECURE領域 クリア
ClearMmemSecureArea();
}
#ifdef BOOT_FROM_CARTRIDGE
void LoadSecure4Cartridge(void)
{
LoadFlashDemo(); // FLASHデモプログラム読み込み
{ u32 loadStartp = *(u32 *)(ROM_HEADER_BUF + 0x20) | CTRDG_AD16_BANK0;
u32 loadSize = *(u32 *)(ROM_HEADER_BUF + 0x2c) & (MAIN_MEM_SIZE - 1);
u32 loadDestp = *(u32 *)(ROM_HEADER_BUF + 0x28);
while (!loadStartp || !loadDestp) ;
CpuCopy16_32(loadStartp, loadDestp, loadSize, 32); // ARM9実行イメージ読み込み
}
}
#endif // BOOT_FROM_CARTRIDGE
//----------------------------------------------------------------------
// IPL2メモリ呼び出し部分
//----------------------------------------------------------------------
void LoadGame4Card(void);
void LoadHeader4Cartridge(void);
void LoadSecure4Cartridge(void);
void LoadGame4Cartridge(void);
void LoadDebugger(void);
#ifndef DISABLE_READ_CARD_4_IPL2
s32 CalledFormIPL2(void)
{
SharedWork *shwp = GetSharedWorkAddr();
RomHeader *rmhp = GetRomHeaderAddr();
s16 *sequenceNop = &shwp->cardSequenceNo;
if (*(vu8 *)REG_PAUSE & 1) return -2;
switch (*sequenceNop) {
case 0: if (!shwp->cardHeaderError) { // カード・ヘッダのチェック
u8 *arm9LoadStartp = rmhp->arm9.romAddr;
u8 *arm9LoadDestp = rmhp->arm9.ramAddr;
u8 *arm9LoadDestEndp;
s32 arm9LoadSize = rmhp->arm9.romSize;
s32 arm9SecureSize = (u8 *)MROM_GAME_AREA - arm9LoadStartp; // セキュリティ上 再計算
if (arm9SecureSize < 0) arm9SecureSize = 0;
arm9LoadStartp += arm9SecureSize;
arm9LoadDestp += arm9SecureSize;
arm9LoadSize -= arm9SecureSize;
if ((arm9LoadDestp >= (u8 *)MAIN_MEM) && (arm9LoadDestp < (u8 *)MON_MMEM_LOAD_LIMIT)) {
arm9LoadDestEndp = arm9LoadDestp + arm9LoadSize;
if (arm9LoadDestEndp > (u8 *)MON_MMEM_LOAD_LIMIT)
arm9LoadSize -= (arm9LoadDestEndp - (u8 *)MON_MMEM_LOAD_LIMIT);
if (arm9LoadSize > 0) { // GAMEモード読み込み
SetCardIntr4Game(arm9LoadStartp, arm9LoadDestp, arm9LoadSize);
*sequenceNop = 1;
} else {
*sequenceNop = 2;
}
} else {
*sequenceNop = 2;
}
} else {
*sequenceNop = 6;
}
break;
case 1: if (*(vu32 *)INTR_CHECK_BUF & CARD_DATA_INTR_FLAG) {
TerminateCardIntr();
*sequenceNop = 2;
}
break;
case 2:
#ifdef TEST_CARD_BY_MAINP
NotifyMainpIntf(5); // カードバス切り換え検証の通知
WaitMainpIntf(5);
#endif // TEST_CARD_BY_MAINP
{ u8 *arm7LoadStartp = rmhp->arm7.romAddr;
u8 *arm7LoadDestp = rmhp->arm7.ramAddr;
u8 *arm7LoadDestEndp = NULL;
s32 arm7LoadSize = rmhp->arm7.romSize;
// 内部ワークRAM ロードサイズ調整
if ((arm7LoadDestp >= (u8 *)CPU_WRAM) && (arm7LoadDestp < (u8 *)MON_WRAM_LOAD_LIMIT)) {
arm7LoadDestEndp = arm7LoadDestp + arm7LoadSize;
if (arm7LoadDestEndp > (u8 *)MON_WRAM_LOAD_LIMIT)
arm7LoadSize -= (arm7LoadDestEndp - (u8 *)MON_WRAM_LOAD_LIMIT);
}
// メインメモリ ロードサイズ調整
if ((arm7LoadDestp >= (u8 *)MAIN_MEM) && (arm7LoadDestp < (u8 *)MON_MMEM_LOAD_LIMIT)) {
arm7LoadDestEndp = arm7LoadDestp + arm7LoadSize;
if (arm7LoadDestEndp > (u8 *)MON_MMEM_LOAD_LIMIT)
arm7LoadSize -= (arm7LoadDestEndp - (u8 *)MON_MMEM_LOAD_LIMIT);
}
if (arm7LoadDestEndp) {
if (arm7LoadSize > 0) { // ARM7実行イメージ読み込み
SetCardIntr4Game(arm7LoadStartp, arm7LoadDestp, arm7LoadSize);
*sequenceNop = 3;
} else {
*sequenceNop = 4;
}
} else {
*sequenceNop = 4;
}
}
break;
case 3: if (*(vu32 *)INTR_CHECK_BUF & CARD_DATA_INTR_FLAG) {
TerminateCardIntr();
*sequenceNop = 4;
}
break;
case 4:
#ifdef TEST_CARD_BY_MAINP
NotifyMainpIntf(6); // カードバス切り換え検証の通知
WaitMainpIntf(6);
#endif // TEST_CARD_BY_MAINP
if ((shwp->isOnDebugger == 1) && IsMmem8MB()) {
u8 *dbgLoadStartp = rmhp->dbgRomAddr;
u8 *dbgLoadDestp = rmhp->dbgArm9RamAddr;
u8 *dbgLoadDestEndp;
s32 dbgLoadSize = rmhp->dbgRomSize;
if ((dbgLoadDestp >= (u8 *)MAIN_MEM_END) && (dbgLoadDestp < (u8 *)MON_DBG_LOAD_LIMIT)) {
dbgLoadDestEndp = dbgLoadDestp + dbgLoadSize;
if (dbgLoadDestEndp > (u8 *)MON_DBG_LOAD_LIMIT)
dbgLoadSize -= (dbgLoadDestEndp - (u8 *)MON_DBG_LOAD_LIMIT);
if (dbgLoadSize > 0) { // デバッガモニタ読み込み
(u32 )dbgLoadStartp &= 0x7fffffff; // アドレス修正
SetCardIntr4Game(dbgLoadStartp, dbgLoadDestp, dbgLoadSize);
*sequenceNop = 5;
} else {
*sequenceNop = 6;
}
} else {
*sequenceNop = 6;
}
} else {
*sequenceNop = 6;
}
break;
case 5: if (*(vu32 *)INTR_CHECK_BUF & CARD_DATA_INTR_FLAG) {
TerminateCardIntr();
*sequenceNop = 6;
}
break;
case 6: SetPauseCheckFlag(); // チェックフラグ セット
*sequenceNop = -1;
break;
}
return *sequenceNop;
}
#else // DISABLE_READ_CARD_4_IPL2
s32 CalledFormIPL2(void)
{
SharedWork *shwp = GetSharedWorkAddr();
s16 *sequenceNop = &shwp->cardSequenceNo;
if (!shwp->cardHeaderError) { // カード・ヘッダのチェック
LoadGame4Card(); // カードゲーム領域
} else {
#ifdef BOOT_FROM_CARTRIDGE
WaitVBlank(20); // UICアクセス遅延
LoadHeader4Cartridge(); // カートリッジ・ヘッダ領域のロード
if (!CheckCartridgeHeader()) { // カートリッジ・ヘッダのチェック
LoadSecure4Cartridge(); // カートリッジ・セキュア領域のロード
LoadGame4Cartridge(); // カートリッジ・ゲーム領域
} else {
#endif // BOOT_FROM_CARTRIDGE
#ifdef TEST_AGB_MODE
ReadNintendoLogo4AGB(); // AGBカートリッジのロゴ読み込み
if (!CheckNintendoLogo(&NinLogoBak[36/2])) { //(u16 *)(CARTRIDGE + 4)))
Iris2Agb(); // AGBモード遷移
#ifdef DISP_AGB_HEADER_ERROR
} else {
NotifyMainpIntf(8); // AGBヘッダエラー通知
WaitMainpIntf(8); // AGBヘッダエラー表示待ち
Iris2Agb(); // AGBモード遷移
#endif // DISP_AGB_HEADER_ERROR
}
#else
while(1) ; // AGBモード非対応時 無限ループ
#endif // TEST_AGB_MODE
#ifdef BOOT_FROM_CARTRIDGE
}
#endif // BOOT_FROM_CARTRIDGE
}
// ReadNintendoLogo4AGB(); // AGBカートリッジのロゴ読み込み
//IRISモードでAGBカートリッジをアクセスできるようにするため
// LoadDebugger(); // デバッガ領域
TerminateIntr(CARD_DATA_INTR_FLAG);
*sequenceNop = -1;
return *sequenceNop;
}
#endif // DISABLE_READ_CARD_4_IPL2
//----------------------------------------------------------------------
// ROMイメージ後半のロード
//----------------------------------------------------------------------
#ifdef DISABLE_READ_CARD_4_IPL2
void LoadGame4Card(void)
{
{ u8 *Arm9LoadStartp = *(u8 **)(ROM_HEADER_BUF + 0x20);
u8 *Arm9LoadDestp = *(u8 **)(ROM_HEADER_BUF + 0x28);
s32 Arm9LoadSize = *(s32 * )(ROM_HEADER_BUF + 0x2c) & (MAIN_MEM_SIZE - 1);
s32 Arm9SecureSize = (u8 *)MROM_GAME_AREA - Arm9LoadStartp;
if (Arm9SecureSize < 0) Arm9SecureSize = 0;
SetCardIntr4Game(Arm9LoadStartp + Arm9SecureSize, // GAMEモード読み込み
Arm9LoadDestp + Arm9SecureSize,
Arm9LoadSize - Arm9SecureSize);
WaitCardIntr();
}
{ u8 *Arm7LoadStartp = *(u8 **)(ROM_HEADER_BUF + 0x30);
u8 *Arm7LoadDestp = *(u8 **)(ROM_HEADER_BUF + 0x38);
s32 Arm7LoadSize = *(s32 * )(ROM_HEADER_BUF + 0x3c) & (CPU_WRAM_SIZE - 1);
while (!Arm7LoadSize) ;
SetCardIntr4Game(Arm7LoadStartp, Arm7LoadDestp, Arm7LoadSize);// ARM7実行イメージ読み込み
WaitCardIntr();
}
}
#ifdef BOOT_FROM_CARTRIDGE
void LoadGame4Cartridge(void)
{
{ u32 Arm7LoadStartp = *(u32 *)(ROM_HEADER_BUF + 0x30) | CTRDG_AD16_BANK0;
u32 Arm7LoadSize = *(u32 *)(ROM_HEADER_BUF + 0x3c) & (MAIN_MEM_SIZE - 1);
u32 Arm7LoadDestp = *(u32 *)(ROM_HEADER_BUF + 0x38);
while (!Arm7LoadStartp || !Arm7LoadDestp) ;
CpuCopy16_32(Arm7LoadStartp, Arm7LoadDestp, Arm7LoadSize, 32); // ARM7実行イメージ読み込み
}
}
#endif // BOOT_FROM_CARTRIDGE
#endif // DISABLE_READ_CARD_4_IPL2
//----------------------------------------------------------------------
// デバッガモニタのロード
//----------------------------------------------------------------------
#ifdef DISABLE_READ_CARD_4_IPL2
void LoadDebugger(void)
{
if (IsMmem8MB()) {
u8 *DbgLoadStartp = *(u8 **)(ROM_HEADER_BUF + 0x160);
u8 *DbgLoadDestp = *(u8 **)(ROM_HEADER_BUF + 0x168);
s32 DbgLoadSize = *(u32 * )(ROM_HEADER_BUF + 0x164) & (MAIN_MEM_SIZE - 1);
if (DbgLoadSize > 0 && DbgLoadSize < (MAIN_MEM_SIZE - 512)) {
if ((s32 )DbgLoadStartp < 0) { // デバッガモニタ読み込み
(u32 )DbgLoadStartp &= 0x7fffffff; // アドレス修正
SetCardIntr4Game(DbgLoadStartp, DbgLoadDestp, DbgLoadSize);
WaitCardIntr();
} else {
CpuCopy16_32(DbgLoadStartp, DbgLoadDestp, DbgLoadSize, 32);
}
}
}
}
#endif // DISABLE_READ_CARD_4_IPL2
//----------------------------------------------------------------------
// メインプロセッサ・インタフェース通知
//----------------------------------------------------------------------
void NotifyMainpIntf(u32 param)
{
*(vu16 *)REG_MAINPINTF = param <<MAINP_SEND_STATUS_SHIFT;
}
//----------------------------------------------------------------------
// メインプロセッサ・インタフェース受信待ち
//----------------------------------------------------------------------
void WaitMainpIntf(u32 param)
{
while (RecvMainpIntf() != param) ;
}

View File

@ -0,0 +1,20 @@
//======================================================================
// IRISサブプロセッサ・ヘッダファイル郡
//======================================================================
#ifndef _IRIS_SUBP_MON_H
#define _IRIS_SUBP_MON_H
#include <IrisSubp.h>
#include <IrisCardDefine.h>
#include <IrisRtcDefine.h>
#include <IrisSpiDefine.h>
#include <IrisSioDefine.h>
#include <IrisMainMemeoryDefine.h>
#include "IrisSubpMonDefine.h"
#include "IrisSubpMonMemeoryMap.h"
#include "IrisSubpMonMacro.h"
#include "IrisSubpMonSub.h"
#endif /* _IRIS_SUBP_MON_H */

Binary file not shown.

View File

@ -0,0 +1,288 @@
[CLI]
dwParse=1
dwEcho=1
dwUpdate=1
dwHistorySize=16
dwInstructionSize=1
dwMemBytes=32
dwMemSize=0
dwStepSize=0
Format=hex
FormatPar=-1
dwLogFile=0
dwRecordFile=0
[Control]
dwActiveTab=0
[DebugEnvironment]
biDebugEnvironment=EECEFEDDABAAAAAABAAAAAAADEKDMFAFCHPGHGCHBGNGACGEJGMGFGDHMFBECFNEMFNEFHMGEHJGNCJEDEFEMFNEFHMGEHJGNCJEDEFEOCEGMGMGAANEFHMGEHJGNCJEDEFEAADCFJBAAAAANEFFMEEFJENCJEDEFEPFEECFJEGFFECFADPFOEBENEFENDBECFNEHDEFEENEJENAKANEFFMEEFJENCJEDEFEPFDEPEOEOEFEDEEFJEPEOEPFOEBENEFENDNAKANEFFMEEFJENCJEDEFEPFDFFECFGFFECFPFMEPEDEBEEFJEPEOENDMGPGDGBGMGIGPGDHEHNAKANEFFMEEFJENCJEDEFEPFEEMEMEPFDFFEEFEFJEOEHEDFNDADNAKAEFBECFHEFEEFPFEEJECFNDDEKDMFAFCHPGHGCHBGNGACGEJGMGFGDHMFBECFNEMFNEFHMGEHJGNCJEDEFENAKANEFFMEEFJENCJEDEFEPFIEBEOEEEMEFECFCEBEDFFEBEEEEECFNDGEGEADADADADADADNAKANEFFMEEFJENCJEDEFEPFDEMEFEBEOEDEPEEEFEBEEEEECFNDADADADADADADFDADNAKAEFCFBEDEFEEEMEMEPFEFCFBEDEFEDEPEOEEFCFPEMEMEJEDFEFJEEFFENEADNDNAKAEFCFBEDEFEEEMEMEPFEFCFBEDEFEDEPEOEEFCFPEMEOEBENEFENDNAKADEPEOEEFCFPEMEMEFECFPFCFEEJEGFFECFDFJEPEOENDBDFDBDNAKANEFFMEEFJENCJEDEFEPFIFDFIEPEEFAFMEFFHEHEJEOEHEFEOEBECEMEFEEENDEFCFFFFENAKACEJFEFFEDFFEIFNDMEJGEHEHMGFGNAKANEFFMEEFJENCJEDEFEPFEFBEAFADPFAFPEDFJEEFJEPEOENDBDNAKADCDCDC
[Docking]
biBarID_0=AMAAAAAABJAAAAAAAMAAAAAAIEAAAAAAAMAAAAAAHOBAAAAAOPPPPPPPMBAAAAAAAAAAAAAAAAPBAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_4=AMAAAAAABJAAAAAAAOAAAAAABJAAAAAAMGAAAAAAAIAAAAAAHNCAAAAAJACAAAAAAAAAAAAAAAPIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_65539=LCCAAAAAKJBAAAAAILDAAAAABJAAAAAAMGAAAAAAAIAAAAAAPGAAAAAANCCAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_1114115=AMAAAAAABJAAAAAABNCAAAAABJAAAAAAMGAAAAAAAIAAAAAAOPPPPPPPJACAAAAAAAAAAAAAAAPIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_65538=LMAAAAAAIGBAAAAAAMAAAAAAIEAAAAAAAMAAAAAAICAAAAAAKODAAAAABMAAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_1=AMAAAAAABJAAAAAAILDAAAAABJAAAAAAMGAAAAAAAIAAAAAAOPPPPPPPCHBAAAAAAAAAAAAAAAPIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_65540=IMBAAAAADIBAAAAAILDAAAAAIEAAAAAAAMAAAAAAEMAAAAAAGPCAAAAAEDCAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_7=HIBAAAAABJAAAAAAJLDAAAAABJAAAAAAMGAAAAAAAIAAAAAAENBAAAAABHCAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
[Docking\OpenStates]
biBarID_0=BAAAAAAA
biBarID_4=BAAAAAAA
biBarID_7=BAAAAAAA
biBarID_65538=BAAAAAAA
biBarID_65539=BAAAAAAA
biBarID_1114115=BAAAAAAA
biBarID_65540=BAAAAAAA
[Images\Image_0]
Filename=D:\IrisSubp\IrisSubpMon\IrisSubpMon_Data\ThumbRelease\IrisSubpMon.axf
Processor=ARM7TDMI_1
dwProfileState=0
[Interface\AutoRefresh]
dwEnabled=0
dwInterval=100
dwTerminateOnSuspend=0
[Interface\Formatting]
dwDecIsUser=0
DecFormat=%d
dwHexIsUser=0
HexFormat=%0X
dwFloatIsUser=0
FloatFormat=%.7g
dwDbleIsUser=0
DbleFormat=%.10g
dwQ15IsUser=0
Q15Format=%.6g
dwQ31IsUser=0
Q31Format=%.12g
dwArrayThreshold=16
[Interface\General]
dwTarget Connection=1
dwReport All Warnings=0
dwReport Exceptions=1
[Interface\SessionFiles]
dwReselect Target=1
dwReload Images=0
dwRun Config Script=0
Config Script Name=D:\Iris\geometry\geometry.ses
[Interface\Toolbars]
dwTBFile=1
dwTBSearch=1
dwTBExecute=1
dwTBSystemView=1
dwTBProcView=1
dwTBHelp=1
[Interface\Views]
biDefault Fixed Font=EPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAJBAAAAAAAAAAAAADACABABBCIMGCICHACGJOLCJJKAAHHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biDefault General Font=EPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAJBAAAAAAAAAAAAADACABABBCIMGCICHACGJOLCJJKAACHJGGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
dwTab Size=4
dwInterleave=0
dwShow Line Numbers=1
dwShow Margin=1
dwShow Tooltips=1
dwInitViewState=0
[MainWnd]
biWndPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPFJAAAAAABHAAAAAAGFEAAAAAKEDAAAAA
[Memory]
dwActiveTab=0
dwApplyToAllTabs=0
[Memory\Tab_0]
dwStartAddress=0
Format=hex_noprefix_8
dwFormatID=-1
dwListBigEndian=0
dwDisplayOffset=0
dwPageSize=1024
dwListSize=1
dwTargetAccessSize=0
dwAutoRefresh=1
[Memory\Tab_1]
dwStartAddress=0
Format=hex_noprefix_8
dwFormatID=-1
dwListBigEndian=0
dwDisplayOffset=0
dwPageSize=1024
dwListSize=1
dwTargetAccessSize=0
dwAutoRefresh=1
[Memory\Tab_2]
dwStartAddress=0
Format=hex_noprefix_8
dwFormatID=-1
dwListBigEndian=0
dwDisplayOffset=0
dwPageSize=1024
dwListSize=1
dwTargetAccessSize=0
dwAutoRefresh=1
[Memory\Tab_3]
dwStartAddress=0
Format=hex_noprefix_8
dwFormatID=-1
dwListBigEndian=0
dwDisplayOffset=0
dwPageSize=1024
dwListSize=1
dwTargetAccessSize=0
dwAutoRefresh=1
[Memory1]
dwActiveTab=1
dwApplyToAllTabs=0
[Memory1\Tab_0]
dwStartAddress=58687488
Format=hex_noprefix_32
dwFormatID=-1
dwListBigEndian=0
dwDisplayOffset=0
dwPageSize=1024
dwListSize=4
dwTargetAccessSize=0
dwAutoRefresh=1
[Memory1\Tab_1]
dwStartAddress=58720256
Format=hex_noprefix_32
dwFormatID=-1
dwListBigEndian=0
dwDisplayOffset=0
dwPageSize=1024
dwListSize=4
dwTargetAccessSize=0
dwAutoRefresh=1
[Memory1\Tab_2]
dwStartAddress=41811968
Format=hex_noprefix_32
dwFormatID=-1
dwListBigEndian=0
dwDisplayOffset=0
dwPageSize=1024
dwListSize=4
dwTargetAccessSize=0
dwAutoRefresh=1
[Memory1\Tab_3]
dwStartAddress=67108864
Format=hex_noprefix_32
dwFormatID=-1
dwListBigEndian=0
dwDisplayOffset=0
dwPageSize=1024
dwListSize=4
dwTargetAccessSize=0
dwAutoRefresh=1
[Output]
dwActiveTab=0
[ProcessorRegisters\ARM7TDMI_1]
dwFormatID=-1
dwRefresh=0
[ProcessorRegisters\ARM7_1]
dwFormatID=-1
dwRefresh=1
[ProcessorRegisters\ARM9_0]
dwFormatID=-1
dwRefresh=1
[RecentFileList]
dwFileCount=4
[RecentImageList]
File_1=D:\IrisSubp\IrisSubpMon\IrisSubpMon_Data\ThumbRelease\IrisSubpMon.axf
File_2=D:\Iris\IrisMon\IrisMon_Data\ThumbRelease\IrisMon.axf
File_3=D:\Iris\IrisMon\IrisMon_Data\ThumbDebugRel\IrisMon.axf
File_4=D:\Iris\geometry\geometry_Data\ThumbDebugRel\geometry.axf
dwFileCount=4
[RecentSymbolsList]
dwFileCount=4
[Target\ARM7TDMI_1]
dwMode=0
dwCommsChannel=0
dwArmSWI=1193046
dwThumbSWI=171
dwSHVector=8
dwDCCSHVector=458752
dwECVector=26
dwTopOfMemory=524288
dwTopOfMemoryExists=1
[ToolBars\ToolBarID-Bar0]
dwBarID=59419
dwBars=12
dwBar#0=0
dwBar#1=171
dwBar#2=173
dwBar#3=175
dwBar#4=179
dwBar#5=177
dwBar#6=128
dwBar#7=65543
dwBar#8=65538
dwBar#9=65539
dwBar#10=65540
dwBar#11=0
[ToolBars\ToolBarID-Bar1]
dwBarID=59422
dwBars=4
dwBar#0=0
dwBar#1=3
dwBar#2=4
dwBar#3=0
[ToolBars\ToolBarID-Bar2]
dwBarID=59423
dwHorz=1
dwFloating=1
dwXPos=472
dwYPos=644
dwBars=3
dwBar#0=0
dwBar#1=7
dwBar#2=0
[ToolBars\ToolBarID-Bar3]
dwBarID=59423
dwHorz=1
dwFloating=1
dwXPos=1006
dwYPos=212
dwBars=3
dwBar#0=0
dwBar#1=2
dwBar#2=0
[ToolBars\ToolBarID-Bar4]
dwBarID=59423
dwHorz=1
dwFloating=1
dwXPos=115
dwYPos=576
dwBars=3
dwBar#0=0
dwBar#1=3
dwBar#2=0
[ToolBars\ToolBarID-Bar5]
dwBarID=59423
dwHorz=1
dwFloating=1
dwXPos=762
dwYPos=583
dwBars=3
dwBar#0=0
dwBar#1=4
dwBar#2=0
[ToolBars\ToolBarID-Summary]
dwBars=6
dwScreenCX=1280
dwScreenCY=1024
[Variables]
dwActiveTab=1
[Variables\Tab_0]
dwFormatID=-1
dwRefresh=1
[Variables\Tab_1]
dwFormatID=-1
dwRefresh=1
[Variables\Tab_2]
dwFormatID=-1
dwRefresh=1
[Views]
dwLastView=0
[Views\View_0]
UnitName=ARM7TDMI_1
ImageName=D:\IrisSubp\IrisSubpMon\IrisSubpMon_Data\ThumbRelease\IrisSubpMon.axf
dwDisassembly=0
FileName=D:\IrisSubp\IrisSubpMon\IrisSubpMon.c
dwMixedView=0
dwShowMargin=1
dwShowLineNumbers=1
biWndPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPAAAAAAAAAAAAAAAAHFCAAAAAJEBAAAAA

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,47 @@
//======================================================================
// IRISサブプロセッサ・モニタプログラム用定義
//======================================================================
#ifndef _IRIS_SUBP_MON_DEFINE_H
#define _IRIS_SUBP_MON_DEFINE_H
#include "IrisSubpMonTarget.h"
//----------------------------------------------------------------------
// DMA割り当て
//----------------------------------------------------------------------
#define V_DMA_NO 2
#define M_DMA_NO 3
//----------------------------------------------------------------------
// モニタ専用SPIコントロール定義
//----------------------------------------------------------------------
#define MON_SPI_CONTINUOUS_ON 0x1800 // コンティニュアスモード
#define MON_SPI_TARGET_FLASH 0x2100 // フラッシュメモリ選択
//----------------------------------------------------------------------
// レジスタ&RAM リセット システムコール
//----------------------------------------------------------------------
#define RESET_ALL_FLAGS 0xff // 全リセット
#define RESET_ALL_REG_FLAGS 0xe0 // 全レジスタ リセット
#define RESET_REG_FLAG 0x80 // レジスタ(下記以外)リセット
#define RESET_REG_SOUND_FLAG 0x40 // サウンドレジスタ リセット
#define RESET_REG_SIO_FLAG 0x20 // SIOレジスタ リセット
#define RESET_ALL_RAM_FLAGS 0x1f // 全RAM クリア
#define RESET_MMEM_FLAG 0x01 // メインメモリ クリア
#define RESET_CPU_WRAM_FLAG 0x02 // CPU内部RAM クリア
#define RESET_PLTT_FLAG 0x04 // パレット クリア
#define RESET_VRAM_FLAG 0x08 // クリア
#define RESET_OAM_FLAG 0x10 // クリア
#endif // _IRIS_SUBP_MON_DEFINE_H

View File

@ -0,0 +1,37 @@
;********************************************************************
; IRIS-SUBPモニタプログラム用定義
;********************************************************************
IF :DEF: _IRIS_SUBP_MON_DEFINE_H
ELSE
_IRIS_SUBP_MON_DEFINE_H * 1
INCLUDE IrisSubpMonTargetArm.s
;-----------------------------------------------------------------------
; レジスタ&RAM リセット システムコール
;-----------------------------------------------------------------------
RESET_ALL_FLAGS * 0xff ; 全リセット
RESET_ALL_REG_FLAGS * 0xe0 ; 全レジスタ リセット
RESET_REG_FLAG * 0x80 ; レジスタ(下記以外)リセット
RESET_REG_SOUND_FLAG * 0x40 ; サウンドレジスタ リセット
RESET_REG_SIO_FLAG * 0x20 ; SIOレジスタ リセット
RESET_ALL_RAM_FLAGS * 0x1f ; 全RAM クリア
RESET_MMEM_FLAG * 0x01 ; メインメモリ クリア
RESET_CPU_WRAM_FLAG * 0x02 ; CPU内部RAM クリア
RESET_PLTT_FLAG * 0x04 ; パレット クリア
RESET_VRAM_FLAG * 0x08 ; クリア
RESET_OAM_FLAG * 0x10 ; クリア
ENDIF ; _IRIS_SUBP_MON_DEFINE_H
END

View File

@ -0,0 +1,97 @@
//======================================================================
// IRISサブプロセッサ マクロ関数
//======================================================================
#ifndef _IRIS_SUBP_MON_MACRO_H
#define _IRIS_SUBP_MON_MACRO_H
#include <IrisSubpTypes.h>
#include "IrisSubpMonTarget.h"
//----------------------------------------------------------------------
// CRC16bit初期値 0xffff 算出
//----------------------------------------------------------------------
#define GetInvCRC16(datap, size) \
\
GetCRC16(0xffff, datap, size)
//----------------------------------------------------------------------
// メインプロセッサ・インタフェース受信
//----------------------------------------------------------------------
#define RecvMainpIntf() \
\
((*(vMainpIntf *)REG_MAINPINTF).recvStatus)
//----------------------------------------------------------------------
// クリア
//----------------------------------------------------------------------
#define CpuClear16_32(data, destp, size, bit) \
{ \
u##bit tmp = (vu##bit )(data); \
CpuSet16_32((u8 *)&(tmp), (u8 *)(destp), ( \
DMA_SRC_FIX | \
DMA_##bit##BIT_BUS | (size)/((bit)/8))); \
}
#define CpuArrayClear16_32( data, destp, bit) \
CpuClear16_32( data, destp, sizeof(destp), bit)
//----------------------------------------------------------------------
// コピー
//----------------------------------------------------------------------
#define CpuCopy16_32(srcp, destp, size, bit) \
\
CpuSet16_32((u8 *)(srcp), (u8 *)(destp), ( \
DMA_SRC_INC | \
DMA_##bit##BIT_BUS | (size)/((bit)/8)))
#define CpuArrayCopy16_32( srcp, destp, bit) \
CpuCopy16_32( srcp, destp, sizeof(srcp), bit)
//----------------------------------------------------------------------
// 高速クリア(32Byte単位)
//----------------------------------------------------------------------
#define CpuClearFast32(data, destp, size) \
{ \
u32 tmp = (vu32 )(data); \
CpuSetFast32((u8 *)&(tmp), (u8 *)(destp), ( \
DMA_SRC_FIX | (size)/(32/8))); \
}
#define CpuArrayFastClear32( data, destp) \
CpuFastClear32( data, destp, sizeof(destp))
//----------------------------------------------------------------------
// 高速コピー(32Byte単位)
//----------------------------------------------------------------------
#define CpuCopyFast32(srcp, destp, size) \
\
CpuSetFast32((u8 *)(srcp), (u8 *)(destp), ( \
DMA_SRC_INC | (size)/(32/8)))
#define CpuCopyFast32Fook(srcp, destp, size) \
\
CpuSetFast32Fook((u8 *)(srcp), (u8 *)(destp), ( \
DMA_SRC_INC | (size)/(32/8)))
#define CpuArrayFastCopy32( srcp, destp) \
CpuFastCopy32( srcp, destp, sizeof(srcp))
#define CpuArrayFastCopy32Fook( srcp, destp) \
CpuFastCopy32Fook( srcp, destp, sizeof(srcp))
#endif /* _IRIS_SUBP_MON_MACRO_H */

View File

@ -0,0 +1,73 @@
//======================================================================
// IRIS-SUBPメモリマップ定義
//======================================================================
#ifndef _IRIS_SUBP_MON_MEMORY_MAP_H
#define _IRIS_SUBP_MON_MEMORY_MAP_H
#include "IrisSubpMonTarget.h"
//----------------------------------------------------------------------
// メモリ・マップ
//----------------------------------------------------------------------
#define MON_CPU_WRAM CPU_WRAM // CPU内部ワークRAM
#define MON_CPU_WRAM_END (MON_CPU_WRAM + 0x18000)
#ifdef ENABLE_DEBUGGER_ON_4MB
#define MON_MMEM_LOAD_LIMIT (MAIN_MEM_END - (0x100000 + MROM_PAGE_SIZE - 1))
#else
#define MON_MMEM_LOAD_LIMIT (MAIN_MEM_END - (0x40000 + MROM_PAGE_SIZE - 1))
#endif
#define MON_WRAM_LOAD_LIMIT (MON_CPU_WRAM_END - (0x8000 + MROM_PAGE_SIZE - 1))
#define MON_DBG_LOAD_LIMIT (MAIN_MEM_EX_END - (0x40000 + MROM_PAGE_SIZE - 1))
#define FLH_MMEM_LOAD_LIMIT (MAIN_MEM_EX_END - (0x1000 + 0x20)) // LZで17バイト余分に展開する場合への対応
#define FLH_WRAM_LOAD_BASE (MON_CPU_WRAM + 0x2200) // セキュアワーク領域の保護
#define FLH_WRAM_LOAD_LIMIT (MON_CPU_WRAM_END - (0x400 + 0x20)) // LZで17バイト余分に展開する場合への対応
#define PNA_INDEX (ROM_HEADER_BUF + 0x12) // PNAテーブル・インデックス
#define MMEM_CHK_SIZE_READ_BUF (MAIN_MEM_END - 0x6) // メインメモリ・サイズチェック書き込みバッファ
#define MMEM_CHK_SIZE_WRITE_BUF (MAIN_MEM_EX_END - 0x6) // 読み込みバッファ
#define AGB_ROM_HEADER 0x08000004 // AGB-ROM内登録データ
#define MON_NINLOGO (AGB_ROM_HEADER + 0x0 ) // NINTENDOロゴ・データ
#define MON_FIQ_FLAG (AGB_ROM_HEADER + 0x9c - 4) // FIQフラグ
#define MON_KEY_GROUP_NO (AGB_ROM_HEADER + 0x9e - 4) // キーグループNo
#define MON_SOFT_NAME (AGB_ROM_HEADER + 0xa0 - 4) // ソフト名
#define MON_COMPLEMENT (AGB_ROM_HEADER + 0xbd - 4) // 補数チェック・データ
#define AGB_DACS_KEY_REG0 0x09fe2000 - 32 // DACSキーレジスタ
#define AGB_DACS_KEY_REG1 0x0a000000 - 32
#define REG_PAUSE (REG_BASE + 0x300) //
#define REG_BIOS_PROTECT_ADDR (REG_BASE + 0x308) // BIOSプロテクトアドレス
//----------------------------------------------------------------------
// メモリ・サイズ
//----------------------------------------------------------------------
#define BIOS_SIZE 0x4000 // システムROM
#define ROM_HEADER_SIZE (0xc0 - 4 + OFFSET_MON_NINLOGO) // ROM内登録データ
#define MON_NINLOGO_SIZE (MON_SOFT_NAME - MON_NINLOGO) // NINTENDOロゴ・データ
//----------------------------------------------------------------------
// 登録データ・オフセット
//----------------------------------------------------------------------
#define OFFSET_MON_NINLOGO (MON_NINLOGO - MON_NINLOGO) // NINTENDOロゴ・データ
#define OFFSET_MON_FIQ_FLAG (MON_FIQ_FLAG - MON_NINLOGO) // FIQフラグ
#define OFFSET_MON_KEY_GROUP_NO (MON_KEY_GROUP_NO - MON_NINLOGO) // キーグループNo
#define OFFSET_MON_SOFT_NAME (MON_SOFT_NAME - MON_NINLOGO) // ソフト名
#define OFFSET_MON_COMPLEMENT (MON_COMPLEMENT - MON_NINLOGO) // 補数チェック・データ
#define OFFSET_REG_PAUSE 0x300 //
#endif // _IRIS_SUBP_MON_MEMORY_MAP_H

View File

@ -0,0 +1,74 @@
;********************************************************************
; IRIS-SUBPモニタプログラム用定義
;********************************************************************
IF :DEF: _IRIS_SUBP_MON_MEMORY_MAP_H
ELSE
_IRIS_SUBP_MON_MEMORY_MAP_H * 1
INCLUDE IrisSubpMonTargetArm.s
INCLUDE IrisMainMemoryDefineArm.s
;--------------------------------------------------------------------
; メモリ・マップ
;--------------------------------------------------------------------
IMG_CPU_WRAM * 0x03000000 ; CPU内部ワークRAM
IMG_CPU_WRAM_END * (IMG_CPU_WRAM + 0x01000000)
IMG_WRAM * MAIN_MEM ; ワークRAM全体
IMG_WRAM_END * IMG_CPU_WRAM_END
IMG_USR_BUF * MAIN_MEM ; ユーザ領域
IMG_USR_BUF_END * (IMG_CPU_WRAM_END - 4*32)
IMG_SYS_BUF * (IMG_CPU_WRAM_END - 4*32) ;システム領域
IMG_SYS_BUF_END * IMG_CPU_WRAM_END
IMG_FIQ_VECTOR_BUF * (IMG_CPU_WRAM_END - 4*5 ) ; FIQ割り込み分岐アドレス
IMG_INTR_VECTOR_BUF * (IMG_CPU_WRAM_END - 4*1 ) ; 割り込み分岐アドレス
ROM_HEADER * 0x08000004 ; ROM内登録データ
MON_NINLOGO * (ROM_HEADER + 0x0 ) ; NINTENDOロゴ・データ
MON_FIQ_FLAG * (ROM_HEADER + 0x9c - 4) ; FIQフラグ
MON_KEY_GROUP_NO * (ROM_HEADER + 0x9e - 4) ; キーグループNo
MON_SOFT_NAME * (ROM_HEADER + 0xa0 - 4) ; ソフト名
MON_COMPLEMENT * (ROM_HEADER + 0xbd - 4) ; 補数チェック・データ
ICE_ROM0 * 0x09fe2000 ;
ICE_ROM0_END * 0x09fe4000
ICE_ROM1 * 0x09ffc000
ICE_ROM1_END * 0x09ffe000
DACS_KEY_REG0 * 0x09fe2000 - 32 ; DACSキーレジスタ
DACS_KEY_REG1 * 0x0a000000 - 32
REG_PAUSE * (REG_BASE + 0x300) ;
REG_OBJ_CENTER * (REG_BASE + 0x410) ; OBJ中心位置
;--------------------------------------------------------------------
; メモリ・サイズ
;--------------------------------------------------------------------
ROM_HEADER_SIZE * (0xc0 - 4 + OFFSET_MON_NINLOGO) ; ROM内登録データ
MON_NINLOGO_SIZE * (MON_SOFT_NAME - MON_NINLOGO) ; NINTENDOロゴ・データ
ICE_ROM_SIZE * 0x2000 ;
;--------------------------------------------------------------------
; 登録データ・オフセット
;--------------------------------------------------------------------
OFFSET_MON_NINLOGO * (MON_NINLOGO - MON_NINLOGO) ; NINTENDOロゴ・データ
OFFSET_MON_FIQ_FLAG * (MON_FIQ_FLAG - MON_NINLOGO) ; FIQフラグ
OFFSET_MON_KEY_GROUP_NO * (MON_KEY_GROUP_NO - MON_NINLOGO) ; キーグループNo
OFFSET_MON_SOFT_NAME * (MON_SOFT_NAME - MON_NINLOGO) ; ソフト名
OFFSET_MON_COMPLEMENT * (MON_COMPLEMENT - MON_NINLOGO) ; 補数チェック・データ
OFFSET_REG_PAUSE * 0x300 ;
ENDIF ; _IRIS_SUBP_MON_MEMORY_MAP_H
END

View File

@ -0,0 +1,180 @@
//*******************************************************************
// IRIS-SUBPモニタプログラム RTC関数
//*******************************************************************
#include "IrisSubpMon.h"
//--------------------- グローバル 変数 -------------------------------
//======================================================================
// RTC初期化 & リード共用ワークRAM使用
//======================================================================
void InitRtc(void)
{
SharedWork *shwp = GetSharedWorkAddr();
SecureWork *scwp = GetSecureWorkAddr();
u8 rtcInitBuf[8];
u8 rtcSendIPL2Buf[8];
rtcInitBuf[0] = ReadRtcStatus1(); // RTCステータス1 チェック
SendRtcOp(RTCOP_READ | RTCOP_YEAR | RTCOP_FIX_BITS); // RTC曜日読み込み
RecvRtcDataBuf(&rtcInitBuf[1], 7);
if (rtcInitBuf[0] & (RTCSTAT1_RESET_REQUEST | RTCSTAT1_BATTERY_DOWN)) {
rtcInitBuf[0] |= RTCSTAT1_RESET; // RTCリセット要求パワーダウン対応
SendRtcOp(RTCOP_WRITE | RTCOP_STAT1 | RTCOP_FIX_BITS);
SendRtcDataBuf(&rtcInitBuf[0], 1);
}
rtcSendIPL2Buf[0] = rtcInitBuf[0]; // RTCステータス1 コピー
SendRtcOp(RTCOP_READ | RTCOP_YEAR | RTCOP_FIX_BITS); // RTC曜日読み込み
RecvRtcDataBuf(&rtcSendIPL2Buf[1], 7);
// RTCエラーチェックステータス1 & 月データ)
if ((ReadRtcStatus1() & (RTCSTAT1_RESET_REQUEST | RTCSTAT1_RESET))
|| !rtcSendIPL2Buf[2])
shwp->rtcError = 1;
// RTCリードデータ IPL2 へ通知
CpuCopyFast32(&rtcSendIPL2Buf, &shwp->recvRtc, sizeof(rtcSendIPL2Buf));
// RTC初期データ セキュアワークへコピー
CpuCopyFast32(&rtcInitBuf, &scwp->recvRtcBuf, sizeof(rtcInitBuf));
}
//----------------------------------------------------------------------
// R1レジスタ・アクセスウェイト
//----------------------------------------------------------------------
__inline void WaitRtcFor5us(void)
{
WaitByLoop(200/4);
}
//----------------------------------------------------------------------
// コマンド送信
//----------------------------------------------------------------------
void SendRtcData(u32 data);
u8 RecvRtcData(void);
void SendRtcOp(u32 op)
{
int i;
*(vu8 *)REG_R1_CNT = 1 // クロックHI
| R1_RTC_DATA_DIR_OUT
| R1_RTC_SCK;
WaitRtcFor5us();
*(vu8 *)REG_R1_CNT = 1 // チップイネーブル
| R1_RTC_DATA_DIR_OUT
| R1_RTC_CS | R1_RTC_SCK;
WaitRtcFor5us();
SendRtcData(op);
}
//----------------------------------------------------------------------
// データ送信1Byte
//----------------------------------------------------------------------
void SendRtcData(u32 data)
{
int i;
for (i=0; i<8; i++) {
u32 dataBit = (data >>7) & R1_RTC_DATA_BIT;
*(vu8 *)REG_R1_CNT = dataBit
| R1_RTC_DATA_DIR_OUT
| R1_RTC_CS;
WaitRtcFor5us();
*(vu8 *)REG_R1_CNT = dataBit
| R1_RTC_DATA_DIR_OUT
| R1_RTC_CS | R1_RTC_SCK;
WaitRtcFor5us();
data <<= 1;
}
}
//----------------------------------------------------------------------
// データバッファ送信
//----------------------------------------------------------------------
void SendRtcDataBuf(u8 *srcp, s32 count)
{
u8 *srcEndp = srcp + count;
while (srcp < srcEndp) {
SendRtcData(*srcp++);
}
*(vu8 *)REG_R1_CNT = R1_RTC_DATA_DIR_IN // チップディセーブル
| R1_RTC_SCK;
WaitRtcFor5us();
}
//----------------------------------------------------------------------
// データバッファ受信
//----------------------------------------------------------------------
void RecvRtcDataBuf(u8 *destp, s32 count)
{
u8 *destEndp = destp + count;
while (destp < destEndp) {
u8 data = 0;
int i;
for (i=0; i<8; i++) {
*(vu8 *)REG_R1_CNT = R1_RTC_DATA_DIR_IN
| R1_RTC_CS;
WaitRtcFor5us();
*(vu8 *)REG_R1_CNT = R1_RTC_DATA_DIR_IN
| R1_RTC_CS | R1_RTC_SCK;
WaitRtcFor5us();
data |= (*(vu8 *)REG_R1_CNT & R1_RTC_DATA_BIT) <<i;
}
*destp++ = data;
}
*(vu8 *)REG_R1_CNT = R1_RTC_DATA_DIR_IN // チップディセーブル
| R1_RTC_SCK;
WaitRtcFor5us();
}
//======================================================================
// RTCステータス読み込み
//======================================================================
u8 ReadRtcStatusBase(u32 op)
{
u8 status;
SendRtcOp(op |RTCOP_READ | RTCOP_FIX_BITS); // RTCステータス チェック
RecvRtcDataBuf(&status, 1);
return status;
}
u8 ReadRtcStatus1(void)
{
return ReadRtcStatusBase(RTCOP_STAT1);
}

View File

@ -0,0 +1,450 @@
//*******************************************************************
// IRIS-SUBPモニタプログラム FLASH関数
//*******************************************************************
#include "IrisSubpMon.h"
//--------------------- グローバル 変数 -------------------------------
//======================================================================
// フラッシュメモリヘッダのロード
//======================================================================
extern u8 flashTestHeader[];
extern u8 arm9ipl2[];
extern u8 arm9ipl2_end[];
extern u8 arm7ipl2[];
extern u8 arm7ipl2_end[];
void LoadFlashHeader(void)
{
#ifndef DISABLE_FLASH
FlashHeader *fhp = GetFlashHeaderAddr();
#ifdef ENABLE_WRITE_FLASH
WriteFlash((void *)flashTestHeader, NULL, FLH_PAGE_SIZE);
#endif // ENABLE_WRITE_FLASH
ReadFlash(NULL, (u32 *)fhp, sizeof(FlashHeader));
#endif // DISABLE_FLASH
#ifdef ENABLE_WRITE_FLASH
LoadFlashDemo();
#endif // ENABLE_WRITE_FLASH
}
//======================================================================
// フラッシュメモリデモのロード
//======================================================================
void LoadFlashDemo(void)
{
#if !defined(DISABLE_FLASH)
#ifndef ENABLE_TEST_BLOWFISH
const BLOWFISH_CTX *blowfishInitTablep = &blowfishInitTable;
#else
const BLOWFISH_CTX *blowfishInitTablep = &blowfishTestTable;
#endif // ENABLE_TEST_BLOWFISH
SharedWork *shwp = GetSharedWorkAddr();
SecureWork *scwp = GetSecureWorkAddr();
FlashHeader *fhp = GetFlashHeaderAddr();
// Blowfish 初期化
MakeBlowfishFlashTable(&scwp->blowfishFlashTable, &fhp->blowfishKey, scwp->flashKeyBuf);
// デモ読み込み
{ u8 *srcp = (void *) ( fhp->arm9RomOffset * (4 << fhp->arm9RomAlign));
u8 *destp = (void *)((-fhp->arm9RamInvOffset * (4 << fhp->arm9RamAlign)) + MAIN_MEM_EX_END);
s32 size;
u16 crc16;
static const UC_InternalFuncp ucif = {InitReadFlash, TerminateReadFlash,
#ifndef TEST_HUFFMAN
ReadByte4SucureFlash, NULL, NULL};
#else
ReadByte4SucureFlash, NULL, ReadWord4SucureFlash};
#endif // TEST_HUFFMAN
#ifdef ENABLE_WRITE_FLASH
WriteFlash((void *)arm9ipl2, (u32 *)srcp, arm9ipl2_end - arm9ipl2);
#endif // ENABLE_WRITE_FLASH
shwp->flashArm9RamAddr = destp;
size = UnCompLZ77Short((u8 *)srcp, (u16 *)destp, &ucif, &ucif);
if (size > 0)
scwp->flashCrc16 = GetInvCRC16((u16 *)destp, size);
else shwp->flashArm9HeaderError = size;
srcp = (void *)( fhp->arm7RomOffset * (4 << fhp->arm7RomAlign));
destp = (void *)(-fhp->arm7RamInvOffset * (4 << fhp->arm7RamAlign));
if (!fhp->arm7PlaceMmem) (u8 *)destp += MON_CPU_WRAM_END;
else (u8 *)destp += MAIN_MEM_EX_END;
shwp->flashArm7RamAddr = destp;
#ifdef ENABLE_WRITE_FLASH
WriteFlash((void *)arm7ipl2, (u32 *)srcp, arm7ipl2_end - arm7ipl2);
#endif // ENABLE_WRITE_FLASH
#ifndef TEST_HUFFMAN
size = UnCompLZ77Short((u8 *)srcp, (u16 *)destp, &ucif, &ucif);
// size = UnCompRLShort((u8 *)srcp, (u16 *)destp, &ucif, &ucif);
#else
size = UnCompHuffman32((u8 *)srcp, (u32 *)destp, scwp->huffTableBuf, &ucif);
#endif // TEST_HUFFMAN
if (size > 0)
scwp->flashCrc16 = GetCRC16(scwp->flashCrc16, (u16 *)destp, size);
else shwp->flashArm7HeaderError = size;
if (fhp->crc16 != scwp->flashCrc16) shwp->flashCrcError = 1;
}
#endif // DISABLE_FLASH
}
//======================================================================
// サブルーチン群
//======================================================================
//----------------------------------------------------------------------
// FLASHアクセスウェイト
//----------------------------------------------------------------------
__inline void WaitFlashFor300ns(void)
{
WaitByLoop(12/4);
}
//----------------------------------------------------------------------
// データ送信1Byte
//----------------------------------------------------------------------
void SendSpiData(u32 target, u32 data, u32 continueFlag)
{
u16 spiCntData = target
| (MON_SPI_CONTINUOUS_ON * continueFlag)
| SPI_ENABLE;
WaitSpi();
*(vu16 *)REG_SPICNT = spiCntData;
*(vu8 *)REG_SPIDATA = data;
}
__inline void SendFlashData(u32 data, u32 continueFlag)
{
SendSpiData(MON_SPI_TARGET_FLASH | SPI_SCK_4M, data, continueFlag);
if (!continueFlag) WaitFlashFor300ns();
}
//----------------------------------------------------------------------
// データ受信1Byte
//----------------------------------------------------------------------
u8 RecvSpiData(u32 target, u32 continueFlag)
{
u16 spiCntData = target
| (MON_SPI_CONTINUOUS_ON * continueFlag)
| SPI_ENABLE;
WaitSpi();
*(vu16 *)REG_SPICNT = spiCntData;
*(vu16 *)REG_SPIDATA = spiCntData; // ダミーデータ書き込み
WaitSpi();
return *(vu8 *)REG_SPIDATA;
}
u8 RecvFlashData(u32 continueFlag)
{
u8 data;
data = RecvSpiData(MON_SPI_TARGET_FLASH | SPI_SCK_4M, continueFlag);
if (!continueFlag) WaitFlashFor300ns();
return data;
}
//----------------------------------------------------------------------
// データ送信4Byte単位
//----------------------------------------------------------------------
void SendSpiDataBuf(u32 target, u32 *ramp, s32 size)
{
u32 *ramEndp = ramp + size/4;
int i, ii;
WaitSpi();
while (ramp < ramEndp) {
u32 dataTmp = *ramp++;
u32 continueFlag = 1;
for (i=0; i<4; i++) {
if ((ramp >= ramEndp) && (i == 3)) // 最終アドレス対応
continueFlag = 0;
SendSpiData(target, dataTmp, continueFlag);
dataTmp >>= 8;
}
}
}
__inline void SendFlashDataBuf(u32 *ramp, s32 size)
{
SendSpiDataBuf(MON_SPI_TARGET_FLASH | SPI_SCK_4M, ramp, size);
WaitFlashFor300ns();
}
//----------------------------------------------------------------------
// データ受信4Byte単位
//----------------------------------------------------------------------
void RecvSpiDataBuf(u32 target, u32 *ramp, s32 size, u32 nEndFlag)
{
u32 *ramEndp = ramp + size/4;
int i, ii;
WaitSpi();
while (ramp < ramEndp) {
u32 dataTmp = 0;
u32 continueFlag = 1;
for (i=0; i<4; i++) {
if ((ramp >= ramEndp - 1) && (i == 3)) // 最終アドレス対応
continueFlag = nEndFlag;
dataTmp |= RecvSpiData(target, continueFlag) <<(i*8);
}
*ramp++ = dataTmp;
}
}
__inline void RecvFlashDataBuf(u32 *ramp, s32 size, u32 nEndFlag)
{
RecvSpiDataBuf(MON_SPI_TARGET_FLASH | SPI_SCK_4M, ramp, size, nEndFlag);
WaitFlashFor300ns();
}
//======================================================================
// FLASHステータス読み込み
//======================================================================
u8 ReadFlashStatus(void)
{
SendFlashData(FLHOP_STAT, 1);
return RecvFlashData(0);
}
//======================================================================
// FLASHデータ読み込み
//======================================================================
void ReadFlash(const u8 *flashp, u32 *ramp, s32 size)
{
u32 *ramEndp = ramp + size/4;
InitReadFlash(flashp, NULL, NULL); // 初期化(アドレス送信)
RecvFlashDataBuf(ramp, size, 1);
TerminateReadFlash(NULL); // 終了ダミー読み込み
}
s32 InitReadFlash(const u8 *flashp, void *ramp, const void *paramp)
{
SecureWork *scwp = GetSecureWorkAddr();
s32 retval = 0;
int i;
scwp->flashCount = 0; // 8バイト読み込みカウンタ クリア
#ifdef ENABLE_WRITE_FLASH
while (ReadFlashStatus() & FLHSTAT_WRITING) ; // 書き込み完了待ち
#endif // ENABLE_WRITE_FLASH
SendFlashData(FLHOP_READ, 1);
for (i=3; --i>=0; )
SendFlashData(((u32 )flashp) >>(i*8), 1);
if (paramp) {
u8 *ramEndp;
s32 size;
for (i=0; i<8*4; i+=8) {
retval |= ReadByte4SucureFlash(NULL) <<i;
}
if ((retval & 0xff) != 0x10) return -1;
size = retval >>8;
if (size < 0) return -2;
if (!((ramp >= (void *)MAIN_MEM) && (ramp < (void *)FLH_MMEM_LOAD_LIMIT))
&& !((ramp >= (void *)CPU_WRAM) && (ramp < (void *)FLH_WRAM_LOAD_LIMIT)))
return -3;
ramEndp = (u8 *)ramp + size;
// メインメモリ ロードサイズ調整
if ((ramp >= (void *)MAIN_MEM) && (ramp < (void *)FLH_MMEM_LOAD_LIMIT)) {
if (ramEndp > (u8 *)FLH_MMEM_LOAD_LIMIT)
size -= (ramEndp - (u8 *)FLH_MMEM_LOAD_LIMIT);
}
// 内部ワークRAM ロードサイズ調整
if ((ramp >= (void *)FLH_WRAM_LOAD_BASE) && (ramp < (void *)FLH_WRAM_LOAD_LIMIT)) {
if (ramEndp > (u8 *)FLH_WRAM_LOAD_LIMIT)
size -= (ramEndp - (u8 *)FLH_WRAM_LOAD_LIMIT);
}
retval = (size <<8) | (retval & 0xff);
}
return retval;
}
s32 TerminateReadFlash(const u8 *flashp)
{
RecvFlashData(0); // 終了ダミー読み込み
return 0;
}
u8 ReadByte4SucureFlash(const u8 *flashp)
{
SecureWork *scwp = GetSecureWorkAddr();
u8 retval;
if (!scwp->flashCount) { RecvFlashDataBuf(scwp->flashBuf, 8, 1);
#ifndef DISABLE_SECURE_CODE
DecryptByBlowfishFook(&scwp->blowfishFlashTable, scwp->flashBuf);
#endif // DISABLE_SECURE_CODE
}
retval = ((u8 *)(scwp->flashBuf))[scwp->flashCount++];
scwp->flashCount &= 0x7;
return retval;
}
#ifdef TEST_HUFFMAN
u32 ReadWord4SucureFlash(const u8 *flashp)
{
SecureWork *scwp = GetSecureWorkAddr();
u32 retval;
if (!scwp->flashCount) { RecvFlashDataBuf(scwp->flashBuf, 8, 1);
#ifndef DISABLE_SECURE_CODE
DecryptByBlowfishFook(&scwp->blowfishFlashTable, scwp->flashBuf);
#endif // DISABLE_SECURE_CODE
}
retval = ((u32 *)(scwp->flashBuf))[scwp->flashCount/4];
scwp->flashCount += 4;
scwp->flashCount &= 0x7;
return retval;
}
#endif // TRACE_SECURE_OP
//======================================================================
// FLASHデータ書き込み
//======================================================================
#if defined(ENABLE_WRITE_FLASH) || defined(ENABLE_WRITE_YOSHIOKA)
void WriteFlashPage(u32 *ramp, u32 *flashp, s32 size)
{
int i;
while (ReadFlashStatus() & FLHSTAT_WRITING) ; // 書き込み完了待ち
SendFlashData(FLHOP_WRITE_ENABLE, 0); // 書き込みイネーブル
SendFlashData(FLHOP_WRITE_PAGE, 1);
for (i=3; --i>=0; )
SendFlashData(((u32 )flashp) >>(i*8), 1);
SendFlashDataBuf(ramp, size);
while (ReadFlashStatus() & FLHSTAT_WRITING) ; // 書き込み完了待ち
SendFlashData(FLHOP_WRITE_DISABLE, 0); // 書き込みディセーブル
}
void WriteFlash(u32 *ramp, u32 *flashp, s32 size)
{
u32 *ramEndp = ramp + size/4;
s32 restSize;
int i;
while (ramp < ramEndp) {
WriteFlashPage(ramp, flashp, FLH_PAGE_SIZE);
ramp += FLH_PAGE_SIZE/4;
flashp += FLH_PAGE_SIZE/4;
}
}
#endif // ENABLE_WRITE_FLASH || ENABLE_WRITE_YOSHIOKA

View File

@ -0,0 +1,723 @@
//*******************************************************************
// IRIS-SUBPモニタプログラム サブルーチン
//*******************************************************************
#include "IrisSubpMon.h"
//--------------------- グローバル 変数 -------------------------------
SharedWork *sharedWorkp; // 共有ワークポインタ
SecureWork *secureWorkp; // セキュア情報ワークポインタ
IntrFuncp intrTable[4]; // 割り込みテーブル
u32 CharTmpBuf[0x200/4];
u16 NinLogoBak[256/2];
//----------------------------------------------------------------------
// レジスタ初期化
//----------------------------------------------------------------------
void InitReg(void)
{
*(vu32 *)REG_IME = 0; // IME クリア
*(vu32 *)REG_IE = 0; // IE クリア
*(vu32 *)REG_IF = -1; // IF クリア
#ifdef BOOT_FROM_CARTRIDGE
*(vu16 *)REG_POWCNT = POW_SOUND_ON; // サウンドON
ChangeSoundBias16(1, 8) ; // サウンドバイアス セット
#endif // BOOT_FROM_CARTRIDGE
}
//----------------------------------------------------------------------
// メモリ初期化
//----------------------------------------------------------------------
void PreInitRam(void)
{
CpuClearFast32(0, CPU_WRAM_END - 0x4000, 0x4000 - 512); // ARM7用ワーク領域 後半16KBクリア
}
void PostInitRam(void)
{
CpuClearFast32(0, CPU_WRAM, 0x4000); // ARM7用ワーク領域 前半16KBクリア
}
//----------------------------------------------------------------------
// メインメモリSECURE領域先頭64KB クリア
//----------------------------------------------------------------------
void ClearMmemSecureArea(void)
{
CpuClearFast32(0, MAIN_MEM, MROM_SECURE_SIZE * 4);
}
//----------------------------------------------------------------------
// CRC16bit 算出
//----------------------------------------------------------------------
const u16 crc16_table[16] = {
0x0000, 0xCC01, 0xD801, 0x1400,
0xF001, 0x3C00, 0x2800, 0xE401,
0xA001, 0x6C00, 0x7800, 0xB401,
0x5000, 0x9C01, 0x8801, 0x4400
};
u16 GetCRC16(u32 start, u16 *datap, u32 size)
{
u16 *dataEndp = datap + size/2;
u16 data16;
u32 shift = 0;
u16 r1, total = start;
while(datap < dataEndp) {
if (!shift) data16 = *datap;
// 4bit単位
r1 = crc16_table[total & 0xf];
total = (total >>4);
total = total ^ r1 ^ crc16_table[(data16 >>shift) & 0xf];
shift += 4;
if (shift >= 0x10) {
shift = 0;
datap++;
}
}
return total;
}
//----------------------------------------------------------------------
// メインメモリ 拡張チェック
//----------------------------------------------------------------------
const u16 mmemSizeCheckTable[] = {0x56a9, 0x695a, 0xa695, 0x96a5};
s32 IsMmem8MB(void)
{
u32 mmemExFlag = 0;
int i;
#ifdef ENABLE_DEBUGGER_ON_4MB
return 1;
#endif // ENABLE_DEBUGGER_ON_4MB
for (i=0; i<4; i++) {
*(vu16 *)MMEM_CHK_SIZE_WRITE_BUF = mmemSizeCheckTable[i];
if (*(vu16 *)MMEM_CHK_SIZE_READ_BUF != mmemSizeCheckTable[i]) mmemExFlag++;
}
*(vu16 *)MMEM_CHK_SIZE_WRITE_BUF = 0;
return (mmemExFlag >= 3);
}
//----------------------------------------------------------------------
// デバッガ上か?
//----------------------------------------------------------------------
extern u16 sio_handshake_data[];
extern u16 sio_send_code;
extern u16 sio_recv_code;
extern u16 sio_add_code;
#define SIO_SEND_CODE 0x4e54
#define SIO_RECV_CODE 0x4944
#define SIO_ADD_CODE 0x524f
#define SYSROM_VERSION 0x0100
void SendSioData(u32 data) // SIOデータ送信
{
*(vu32 *)REG_SIODATA32 = data;
StartSio();
WaitSio();
WaitByLoop(0x8000/4); // 0.97ms待ち
while (!IsSioSendEnable()) ;
}
s32 CheckSioData(u32 data, u32 checkMask) // SIO戻り値チェック
{
#ifndef DISABLE_SECURE_CODE
if ((*(vu32 *)REG_SIODATA32 & checkMask)
!= ((((data + sio_add_code) & 0xffff) | (~data & 0xffff0000)) & checkMask))
return 0;
#endif // DISABLE_SECURE_CODE
return 1;
}
void CheckDebugger(void)
{
SharedWork *shwp = GetSharedWorkAddr();
u32 sioData[2];
int i;
shwp->isOnDebugger = 0;
if (!IsMmem8MB()) return; // メインメモリが 4MB ならデバッガではない
#ifndef DISABLE_SECURE_CODE
sioData[0] = shwp->recvRtc[0] | 0x80000000;
sioData[1] = shwp->recvRtc[1] | 0x80000000;
*(vu16 *)REG_RCNT = R_SIO_MASTER_MODE; // SIOハンドシェイク
*(vu16 *)REG_SIOCNT = SIO_32BIT_MODE | SIO_IN_SCK_256K;
if (!IsSioSendEnable()) {
return; // 初めに SI が Low で無ければデバッガではない
} else {
*(vu16 *)REG_SIOCNT |= SIO_SCK_IN; // 応答が正しくなければデバッガではない
SendSioData((sio_send_code <<16) | SYSROM_VERSION);
if (!CheckSioData((~sio_recv_code <<16), 0xffff0000)) return;
SendSioData(sioData[1]);
SendSioData(sioData[0]);
if (!CheckSioData(sioData[1], -1)) return;
SendSioData(sioData[1]);
if (!CheckSioData(sioData[0], -1)) return;
}
*(vu32 *)REG_SIODATA32 = 0;
*(vu32 *)REG_SIOCNT = 0;
shwp->isOnDebugger = 1;
#endif // DISABLE_SECURE_CODE
}
//----------------------------------------------------------------------
// Blowfishテーブル生成
//----------------------------------------------------------------------
void InitBlowfishKeyAnaTableFook(BLOWFISH_CTX *tableBufp, u32 *keyBufp, u32 keyLen);
u32 ChangeEncryptKey1(u32 key);
u32 ChangeEncryptKey2(u32 key);
u32 ChangeEncryptKey3(u32 key);
u32 ChangeEncryptKey4(u32 key);
void MakeBlowfishTable(BLOWFISH_CTX *tableBufp, const u32 *keyp, u32 *keyBufp, u32 keyLen)
{
#ifndef DISABLE_SECURE_CODE
#ifndef ENABLE_TEST_BLOWFISH
const BLOWFISH_CTX *blowfishInitTablep = &blowfishInitTable;
#else
const BLOWFISH_CTX *blowfishInitTablep = &blowfishTestTable;
#endif // ENABLE_TEST_BLOWFISH
u32 keyBuf[3];
#ifndef NDEBUG
*(u32 *)REG_TM2CNT = TMR_PRESCALER_256CK | TMR_ENABLE; // タイマー スタート
#endif // NDEBUG
CopyBiosAreaFook(blowfishInitTablep, tableBufp, sizeof(BLOWFISH_CTX));
keyBufp[0] = *keyp;
keyBufp[1] = ChangeEncryptKey1(*keyp);
keyBufp[2] = ChangeEncryptKey2(*keyp);
InitBlowfishKeyAnaTableFook(tableBufp, keyBufp, keyLen);
{ SecureWork *scwp = GetSecureWorkAddr();
RomHeader *rmhp = GetRomHeaderAddr();
FlashHeader *fhp = GetFlashHeaderAddr();
u32 *blowfishedKeyp;
if (keyLen == 8) {
*(u64 *)scwp->cardNormalModeKey = *(u64 *)rmhp->romNormalModeKey;
blowfishedKeyp = scwp->cardNormalModeKey;
} else {
*(u64 *)scwp->unScrambleKey = *(u64 *)fhp->unScrambleKey;
blowfishedKeyp = scwp->unScrambleKey;
}
DecryptByBlowfishFook(tableBufp, blowfishedKeyp);
if (keyLen > 8)
scwp->isGenUnScrambleKey = 1;
}
#ifndef NDEBUG
*(u16 *)REG_TM2CNT_H = 0;
#endif // NDEBUG
InitBlowfishKeyAnaTableFook(tableBufp, keyBufp, keyLen);
#endif // DISABLE_SECURE_CODE
}
//----------------------------------------------------------------------
// Blowfishキーテーブル単位初期化
//----------------------------------------------------------------------
void InitBlowfishKeyAnaTable(BLOWFISH_CTX *tableBufp, u32 *keyBufp, u32 keyLen)
{
#ifndef DISABLE_SECURE_CODE
EncryptByBlowfishFook2(tableBufp, keyBufp); // EncryptByBlowfish(tableBufp, &keyBufp[2], &keyBufp[1]);
EncryptByBlowfishFook1(tableBufp, keyBufp); // EncryptByBlowfish(tableBufp, &keyBufp[1], &keyBufp[0]);
InitBlowfishFook(tableBufp, (u8 *)keyBufp, keyLen);
#endif // DISABLE_SECURE_CODE
}
//----------------------------------------------------------------------
// 暗号化オブジェクトの復号
//----------------------------------------------------------------------
#ifndef DISABLE_SECURE_CODE
extern const u32 encrypt_object_key[];
#else
const u32 encrypt_object_key[2] = {0x01234567, 0x89abcdef};
#endif // DISABLE_SECURE_CODE
#define UNDEF_CODE 0xe7ffdeff
#define ENCRYPT_DEF_SIZE 0x800
void DecryptObjectFile(void)
{
SharedWork *shwp = GetSharedWorkAddr();
SecureWork *scwp = GetSecureWorkAddr();
RomHeader *rmhp = GetRomHeaderAddr();
BLOWFISH_CTX *tableBufp = &scwp->blowfishCardTable;
u32 *encBufp = (u32 *)&scwp->blowfishFlashTable;
u32 *encDestp = (u32 *)rmhp->arm9.ramAddr;
s32 size = scwp->secureSize;
s32 restSize;
if (size > ENCRYPT_DEF_SIZE) size = ENCRYPT_DEF_SIZE;
restSize = size;
if (scwp->enableReadSecure) {
CpuCopyFast32Fook(encDestp, encBufp, size); // 暗号化オブジェクト 退避
DecryptByBlowfishFook(tableBufp, encBufp); // 暗号化オブジェクトヘッダ プリ復号
}
ChangeObjectTableFook(); // Blowfishテーブル変換
if (scwp->enableReadSecure) {
DecryptByBlowfishFook(tableBufp, encBufp); // 暗号化オブジェクトヘッダ ポスト復号
#ifndef DISABLE_SECURE_CODE
if ((encBufp[0] == encrypt_object_key[0]) // 暗号化オブジェクト有効時
&& (encBufp[1] == encrypt_object_key[1])) {
u32 *bufp = encBufp;
bufp[0] = UNDEF_CODE;
bufp[1] = UNDEF_CODE;
while ((restSize -= 8) > 0) {
bufp += 2; // 復号処理
DecryptByBlowfishFook(tableBufp, bufp);
}
} else
#endif // DISABLE_SECURE_CODE
{
CpuClearFast32(UNDEF_CODE, encBufp, size); // 未定義コードでクリア
shwp->disableEncryptedCardData = 1; // 暗号化オブジェクト無効 通知
}
CpuCopyFast32Fook(encBufp, encDestp, size); // 暗号化オブジェクト 復帰
}
}
//----------------------------------------------------------------------
// 暗号化オブジェクト用Blowfishテーブル変換
//----------------------------------------------------------------------
void ChangeObjectTable(u32 keyLen)
{
#ifndef DISABLE_SECURE_CODE
SecureWork *scwp = GetSecureWorkAddr();
BLOWFISH_CTX *tableBufp = &scwp->blowfishCardTable;
u32 *keyBufp = scwp->cardKeyBuf;
keyBufp[1] = ChangeEncryptKey3(keyBufp[1]);
keyBufp[2] = ChangeEncryptKey4(keyBufp[2]);
InitBlowfishKeyAnaTableFook(tableBufp, keyBufp, keyLen);
#endif // DISABLE_SECURE_CODE
}
//----------------------------------------------------------------------
// ハフマンデータ展開32Bit→32Bit
//----------------------------------------------------------------------
#define TREE_END 0x80
s32 UnCompHuffman32(const u8 *srcp, u32 *destp, u8 *tableBufp, const UC_InternalFuncp *ifp)
{
u8 *treep;// = (u8 *)srcp + 4;
s32 treeSize;// = (*treep + 1) * 2;
u32 treeCheck;
u32 treeShift;
u32 srcTmp;
u32 destTmp = 0;
u32 destTmpCount = 0;
s32 srcCount;
s32 error;
int i;
s32 header = ifp->InitFuncp(srcp, destp, tableBufp); // 初期化(アドレス送信)
s32 size = header >>8;
s32 destCount = size;
s32 dataBit = header & 0x0f;
u32 destTmpDataNum = 4 + (dataBit & 0x7);
u32 destTopShift = 32 - dataBit;
if (header < 0) { size = header;
goto terminate;
}
srcp += 3;
tableBufp[0] = ifp->ByteStreamFuncp(++srcp);
treeSize = (tableBufp[0] + 1) * 2;
for (i=1; i<treeSize; i++)
tableBufp[i] = ifp->ByteStreamFuncp(++srcp);
srcp++;
treep = tableBufp + 1;
while (destCount > 0) {
srcCount = 32;
srcTmp = ifp->WordStreamFuncp(srcp);
srcp += 4;
while (--srcCount >= 0) {
treeShift = (srcTmp >> 31) & 0x1;
treeCheck = *treep;
treeCheck <<= treeShift;
treep = (u8 *)((((u32 )treep>>1) <<1) + (((*treep & 0x3f)+1) <<1) + treeShift);
if (treeCheck & TREE_END) {
destTmp >>= dataBit;
destTmp |= *treep << destTopShift;
treep = tableBufp + 1;
if (++destTmpCount == destTmpDataNum) {
*destp++ = destTmp;
destCount -= 4;
destTmpCount = 0;
}
}
if (destCount <= 0) break;
srcTmp <<= 1;
}
}
terminate:
if (ifp->TerminateFuncp) { // 終了ダミー読み込み
if ((error = ifp->TerminateFuncp(srcp)) < 0) return error;
}
return size;
}
//----------------------------------------------------------------------
// LZバイトデータ展開8Bit→16Bit
//----------------------------------------------------------------------
s32 UnCompLZ77Short(const u8 *srcp, u16 *destp, const void *paramp, const UC_InternalFuncp *ifp)
{
u32 destTmp = 0;
u32 flags;
s32 offset;
s32 offset0_8;
s32 length;
u32 shift = 0;
u8 src;
s32 error;
int i;
s32 header = ifp->InitFuncp(srcp, destp, paramp); // 初期化(アドレス送信)
s32 size = header >>8;
s32 destCount = size;
if (header < 0) { size = header;
goto terminate;
}
srcp += 3;
while (destCount > 0) {
flags = ifp->ByteStreamFuncp(++srcp);
for (i=8; --i>=0; ) {
if (!(flags & 0x80)){ destTmp |= ifp->ByteStreamFuncp(++srcp) <<shift;
destCount--;
if (!(shift ^= 8)){
*destp = destTmp;
destp++;
destTmp = 0;
}
} else { length = ((src = ifp->ByteStreamFuncp(++srcp)) >>4) + 3;
offset = ( src & 0x0f) << 8;
offset = (offset | ifp->ByteStreamFuncp(++srcp)) + 1;
offset0_8 = (8 - shift) ^ ((offset & 1) <<3);
destCount -= length;
while (--length >= 0) { offset0_8 ^= 8;
destTmp |= (destp[-((offset + ((8 - shift) >>3)) >>1)]
& (0xff <<offset0_8)) >>offset0_8 <<shift;
if (!(shift ^= 8)){
*destp = destTmp;
destp++;
destTmp = 0;
}
}
}
if (destCount <= 0) break;
flags <<= 1;
}
}
terminate:
if (ifp->TerminateFuncp) { // 終了ダミー読み込み
if ((error = ifp->TerminateFuncp(++srcp)) < 0) return error;
}
return size;
}
//----------------------------------------------------------------------
// ランレングスデータ展開8Bit→16Bit
//----------------------------------------------------------------------
s32 UnCompRLShort(const u8 *srcp, u16 *destp, const void *paramp, const UC_InternalFuncp *ifp)
{
s32 srcTmp;
s32 destTmp = 0;
u32 flags;
s32 offset;
s32 length;
u32 shift = 0;
s32 error;
s32 header = ifp->InitFuncp(srcp, destp, paramp); // 初期化(アドレス送信)
s32 size = header >>8;
s32 destCount = size;
if (header < 0) { size = header;
goto terminate;
}
srcp += 3;
while (destCount > 0) {
flags = ifp->ByteStreamFuncp(++srcp);
length = flags & 0x7f;
if (!(flags & 0x80)) { length++;
destCount -= length;
while (--length >= 0){ destTmp |= ifp->ByteStreamFuncp(++srcp) << shift;
if (!(shift ^= 8)){ *destp++ = destTmp;
destTmp = 0;
}
}
} else { length += 3;
destCount -= length;
srcTmp = ifp->ByteStreamFuncp(++srcp);
while (--length >= 0){ destTmp |= srcTmp << shift;
if (!(shift ^= 8)){ *destp++ = destTmp;
destTmp = 0;
}
}
}
}
terminate:
if (ifp->TerminateFuncp) { // 終了ダミー読み込み
if ((error = ifp->TerminateFuncp(++srcp)) < 0) return error;
}
return size;
}
//----------------------------------------------------------------------
// サウンドテーブルデータ取得
//----------------------------------------------------------------------
extern s16 snd_sin_table[];
extern u16 snd_ptable[];
extern u8 snd_vtable[];
extern u8 snd_data_start[];
extern u8 snd_data_end[];
static s32 CheckSoundTablep(void *tablep)
{
if ((tablep < (void *)snd_data_start) || (tablep >= (void *)snd_data_end))
return -1;
return 0;
}
u32 GetSoundSinTable(s32 index)
{
s16 *tablep = &snd_sin_table[index];
s32 retval;
if ((retval = CheckSoundTablep(tablep)) != 0) return retval;
return *tablep;
}
u32 GetSoundPitchTable(s32 index)
{
u16 *tablep = &snd_ptable[index];
s32 retval;
if ((retval = CheckSoundTablep(tablep)) != 0) return retval;
return *tablep;
}
u32 GetSoundVolumeTable(s32 index)
{
u8 *tablep = &snd_vtable[index];
s32 retval;
if ((retval = CheckSoundTablep(tablep)) != 0) return retval;
return *tablep;
}
//----------------------------------------------------------------------
// 割り込み終了処理
//----------------------------------------------------------------------
void TerminateIntr(u32 inrtFlags)
{
u32 bakIE = *(vu32 *)REG_IME;
*(vu32 *)REG_IME = 0;
*(vu32 *)REG_IE &= ~inrtFlags;
*(vu32 *)REG_IF = inrtFlags;
*(vu32 *)REG_IME = bakIE;
}
//----------------------------------------------------------------------
// Vブランク待ち
//----------------------------------------------------------------------
#ifdef BOOT_FROM_CARTRIDGE
void WaitVBlank(s32 count)
{
int i;
for (i=0; i<count; i++) {
while (((vDispStat *)REG_DISPSTAT)->blankingV == 1) ;
while (((vDispStat *)REG_DISPSTAT)->blankingV != 1) ;
}
}
#endif // BOOT_FROM_CARTRIDGE
//----------------------------------------------------------------------
// NINTENDOロゴチェック
//----------------------------------------------------------------------
extern const u16 Nin_Char_Diff_Huff[];
#ifdef TEST_AGB_MODE
u8 CheckNintendoLogo(u16 *datap)
{
int i;
for (i=0; i<OFFSET_MON_SOFT_NAME/2; i++) {
u16 cmpMask = 0xffff;
if ( i == OFFSET_MON_FIQ_FLAG/2) cmpMask = 0x84 ^ 0xffff;
else if (i == OFFSET_MON_KEY_GROUP_NO/2) cmpMask = 0x03 ^ 0xffff;
if ((datap[i] & cmpMask) != Nin_Char_Diff_Huff[i]) return 1;
}
return 0;
}
#endif // TEST_AGB_MODE
//----------------------------------------------------------------------
// AGBのNINTENDOロゴ読み込み
//----------------------------------------------------------------------
void key_unlock__nin_logo_copy(void);
#ifdef TEST_AGB_MODE
void ReadNintendoLogo4AGB(void)
{
u8 *srcp;
if (*(u8 *)(CARTRIDGE + 0xb4) & 0x80) srcp = (u8 *)AGB_DACS_KEY_REG0;
else srcp = (u8 *)AGB_DACS_KEY_REG1;
CpuCopy16_32(srcp, CharTmpBuf, 2*10, 16); // セキュリティ解除 前処理
key_unlock__nin_logo_copy(); // DACSセキュリティ解除 ロゴ コピー
}
#endif // TEST_AGB_MODE
//----------------------------------------------------------------------
// AGBモード遷移
//----------------------------------------------------------------------
void SetPause2Agb(void);
#ifdef TEST_AGB_MODE
void Iris2Agb(void)
{
int i;
*(vu32 *)REG_IME = 0;
*(vu16 *)REG_POWCNT = 0; // サウンドOFF
NotifyMainpIntf(7); // モード遷移通知
WaitMainpIntf(7);
WaitByLoop(4096/4); // ARM9 ホールト待ち
SetPause2Agb();
}
#endif // TEST_AGB_MODE

View File

@ -0,0 +1,172 @@
//======================================================================
// IRISモニタプログラム サブルーチン
//======================================================================
#ifndef _IRIS_SUBP_MON_SUB_H
#define _IRIS_SUBP_MON_SUB_H
#include "IrisSubpMonTarget.h"
#include <IrisSubp.h>
#include "Blowfish.h"
#include "IrisSubpMonMacro.h"
#include "IrisMonSharedArea.h"
//--------------------- グローバル 変数 -------------------------------
extern SharedWork *sharedWorkp; // 共有ワークポインタ
extern SecureWork *secureWorkp; // セキュア情報ワークポインタ
extern IntrFuncp intrTable[4];
extern u32 CharTmpBuf[0x200/4];
extern u16 NinLogoBak[256/2];
//--------------------- 汎用サブルーチン -------------------------------
void NotifyMainpIntf(u32 param);
void WaitMainpIntf(u32 param);
void WaitVBlank(s32 count);
s32 IsMmem8MB(void);
s32 IsOnDebugger(void);
void CheckDebugger(void);
void InitRtc(void);
u8 ReadRtcStatus1(void);
u8 ReadRtcStatus2(void);
void SendRtcOp(u32 op);
void SendRtcDataBuf(u8 *srcp, s32 count);
void RecvRtcDataBuf(u8 *datap, s32 count);
void LoadFlashHeader(void);
void LoadFlashDemo(void);
u8 ReadFlashStatus(void);
void ReadFlash(const u8 *eepromp, u32 *ramp, s32 size);
void WriteFlash(u32 *ramp, u32 *eepromp, s32 size);
// 圧縮展開関数型宣言
typedef s32 (* UC_InitFuncp)(const u8 *devicep, void *ramp, const void *paramp);
typedef s32 (* UC_TerminateFuncp)(const u8 *devicep);
typedef u8 (* UC_ByteStreamFuncp)(const u8 *devicep);
typedef u16 (* UC_ShortStreamFuncp)(const u8 *devicep);
typedef u32 (* UC_WordStreamFuncp)(const u8 *devicep);
// 圧縮展開関数指定
typedef struct {
UC_InitFuncp InitFuncp; // 初期化関数
UC_TerminateFuncp TerminateFuncp; // 終了関数
UC_ByteStreamFuncp ByteStreamFuncp; // バイトストリーム読み込み関数
UC_ShortStreamFuncp ShortStreamFuncp; // ハーフワードストリーム読み込み関数
UC_WordStreamFuncp WordStreamFuncp; // ワードストリーム読み込み関数
} UC_InternalFuncp;
s32 InitReadFlash(const u8 *flashp, void *ramp, const void *paramp);
s32 TerminateReadFlash(const u8 *flashp);
u8 ReadByte4SucureFlash(const u8 *flashp);
u32 ReadWord4SucureFlash(const u8 *flashp);
#ifndef DISABLE_SECURE_CODE
void InitSecureParamFook(void);
void MakeBlowfishCardTable( BLOWFISH_CTX *tableBufp, const u32 *keyp, u32 *keyBufp);
void MakeBlowfishFlashTable(BLOWFISH_CTX *tableBufp, const u32 *keyp, u32 *keyBufp);
void DecryptObjectFileFook(void);
void ChangeObjectTableFook(void);
void CopyBiosAreaFook(const void *srcp, void *destp, s32 size);
void CpuSetFast32Fook(const void *srcp, void *destp, u32 dmaCntData);
#else
void InitSecureParam(void);
void MakeBlowfishTable(BLOWFISH_CTX *tableBufp, const u32 *keyp, u32 *keyBufp, u32 keyLen);
void DecryptObjectFile(void);
void ChangeObjectTable(u32 keyLen);
void CopyBiosArea(const void *srcp, void *destp, s32 size);
void CpuSetFast32(const void *srcp, void *destp, u32 dmaCntData);
#define InitSecureParamFook() InitSecureParam()
#define MakeBlowfishCardTable( tableBufp, keyp, keyBufp) MakeBlowfishTable( tableBufp, keyp, keyBufp, 8)
#define MakeBlowfishFlashTable(tableBufp, keyp, keyBufp) MakeBlowfishTable( tableBufp, keyp, keyBufp, 12)
#define DecryptObjectFileFook() DecryptObjectFile()
#define ChangeObjectTableFook() ChangeObjectTable(8)
#define CopyBiosAreaFook(srcp, destp, size) CopyBiosArea(srcp, destp, size)
#define CpuSetFast32Fook(srcp, destp, dmaCntData) CpuSetFast32(srcp, destp, dmaCntData)
#endif // DISABLE_SECURE_CODE
void InitCardParam4Secure(void);
void TerminateCardParam4Secure(void);
void InitCardOpBlowfish(void);
void InitCardPN_Intf(void);
void InitVA_VB_VD(void);
void LoadCardTable(void);
void ReadCardHeader(void);
void Encrypt2SetTimer4Secure(CardCtrlParam *paramp);
void TraceCardCnt(u32 cardCnt);
void SendCardPNG_ON(void);
void SendCardPNG_OFF(void);
void ReadCardAsync(void *romp, void *ramp, s32 size, CardCtrlParam *paramp);
void ReadCardAsync4Normal(void *romp, void *ramp, s32 size, CardCtrlParam *paramp);
void ReadCardAsync4Secure(void *romp, CardCtrlParam *paramp);
void ReadCardAsync4Game(void *romp, void *ramp, s32 size, CardCtrlParam *paramp);
void ReadCard4Game(void *romp, void *ramp, s32 size, u32 cntParam);
void SetCardIntr(void *romp, void *ramp, s32 size, CardIntrWork *ciwp);
void SetCardIntr4Normal(void *romp, void *ramp, s32 size);
void SetCardIntr4Secure(void *romp, void *ramp, s32 size);
void SetCardIntr4Game(void *romp, void *ramp, s32 size);
void CardTimerIntr4Secure(void);
void CardIntr(void);
void CardIntr4Secure(void);
void EnableCardIntr(void);
void TerminateCardIntr(void);
void WaitCardIntr(void);
u32 ReadCardID4Normal(void);
void ReadCardID4Secure(void);
void ChangeCardMode4Normal(void);
void ChangeCardMode4Secure(void);
s32 GetBlockSizeFromCardCnt(CardCnt *paramp);
void WaitCardDma(u32 dmaNo);
void SetVAE(CardCtrlParam *paramp);
void SetVBI(CardCtrlParam *paramp);
void SetVA(CardCtrlParam *paramp);
void SetVB(CardCtrlParam *paramp);
void OverWriteTestVB(CardCtrlParam *paramp);
void SetDummyVC(CardCtrlParam *paramp);
void SetVD(CardCtrlParam *paramp);
void PreInitRam(void);
void PostInitRam(void);
void ClearMmemSecureArea(void);
void InitReg(void);
void CopyBiosArea(const void *srcp, void *destp, s32 size);
u8 CheckAgbRomHeader(void *datap);
void ReadNintendoLogo4AGB(void);
u8 CheckNintendoLogo(u16 *datap);
void SetPauseCheckFlag(void);
u16 GetCRC16(u32 start, u16 *datap, u32 length);
void WaitIntr(u32 InitIfClear, u32 IfFlags);
void WaitVBlankIntr(void);
void TerminateIntr(u32 inrtFlags);
void WaitByLoop(s32 count);
void CpuSet16_32(const void *srcp, void *destp, u32 dmaCntData);
void CpuSetFast32(const void *srcp, void *destp, u32 dmaCntData);
void UnPackBits32(const u8 *srcp, u32 *destp, const UnPackBitsParam *UnPackBitsParamp);
void UnCompRLByte( u8 *srcp, u8 *destp);
s32 UnCompRLShort(const u8 *srcp, u16 *destp, const void *paramp, const UC_InternalFuncp *ifp);
void UnCompLZ77Byte( u8 *Srcp, u8 *Destp);
s32 UnCompLZ77Short(const u8 *srcp, u16 *destp, const void *paramp, const UC_InternalFuncp *ifp);
s32 UnCompHuffman32(const u8 *srcp, u32 *destp, u8 *tableBufp, const UC_InternalFuncp *ifp);
void ChangeSoundBias16(u32 UpDown, u32 stepLoops);
#endif // _IRIS_SUBP_MON_SUB_H

View File

@ -0,0 +1,53 @@
//======================================================================
// IRISサブプロセッサ・モニタプログラム用定義
//======================================================================
#ifndef _IRIS_SUBP_MON_TARGET_H
#define _IRIS_SUBP_MON_TARGET_H
#include <IrisSubpTarget.h>
//#define BB_MON // ブレッドボード専用定義への切り換え
//#define TEG_MON // TEGボード専用定義への切り換え
#define TS_MON // TS専用定義への切り換え
#define NDEBUG
//#define DISABLE_SECURE_CODE // セキュアコード無効化
//#define BOOT_FROM_CARTRIDGE // カートリッジ・ブート
//#define DISABLE_ENCRYPT // 暗号化無効化
//#define DISABLE_BOOT_IPL2 // IPL2ブート無効化
//#define DISP_READY_CARD_4_IPL2 // IPL2カード読み込み準備完了表示
//#define DISABLE_READ_CARD_4_IPL2 // IPL2カード読み込み無効化
//#define ENABLE_DEBUGGER_ON_4MB // デバッガ BB2動作確認
//#define TEST_HUFFMAN // ハフマンコード・テスト
//#define TEST_AGB_MODE // AGBモード・テスト
//#define DISP_AGB_HEADER_ERROR // AGBヘッダエラー表示
//#define ENABLE_WRITE_FLASH // FLASHデータ書き込み
//#define DISABLE_FLASH // FLASH処理無効化
//#define TRACE_SECURE_OP // SECUREコマンドのトレース
//#define MOVE_TRACE_SECURE_BUF // SECUREコマンドのトレース領域の移動
//#define ENABLE_TEST_BLOWFISH // Blowfish テスト版
//#define TEST_CARD_BY_MAINP // メインプロセッサでのカードアクセス・テスト
#endif // _IRIS_SUBP_MON_TARGET_H

View File

@ -0,0 +1,36 @@
;=======================================================================
; IrisSubpMonTargetArm.s
; IRISターゲット選択ARMASM用
;
; Copyright (C) 2003 NINTENDO Co.,Ltd.
;=======================================================================
IF :DEF: _IRIS_SUBP_MON_TARGET_H
ELSE
_IRIS_SUBP_MON_TARGET_H * 1
INCLUDE IrisSubpTargetArm.s
; BB_MON * 1 ; ブレッドボード専用定義への切り換え
; TEG_MON * 1 ; TEGボード専用定義への切り換え
TS_MON * 1 ; TS専用定義への切り換え
; DISABLE_SECURE_CODE * 1 ; セキュアコード無効化
; CHECK_PROT_ADDR * 1 ; プロテクションアドレスレジスタのチェック
; DISABLE_BOOT_IPL2 * 1 ; IPL2ブート無効化
; TEST_AGB_MODE ; AGBモード・テスト
; ENABLE_WRITE_FLASH * 1 ; FLASHデータ書き込み
; ENABLE_TEST_BLOWFISH * 1 ; Blowfish テスト版
; DISABLE_ENTRY_OF_ROM_HEADER * 1 ; ROMヘッダのエントリ情報無効化TEG用
ENDIF ; _IRIS_SUBP_MON_TARGET_H
END

View File

@ -0,0 +1,25 @@
;********************************************************************
; NINTENDOƒ<4F>ƒSƒf<C692>[ƒ^
;********************************************************************
AREA Init, CODE, READONLY
ALIGN
GLOBAL Nin_Char_Diff_Huff
Nin_Char_Diff_Huff
DCB 0x24,0xff,0xae,0x51,0x69,0x9a,0xa2,0x21,0x3d,0x84,0x82,0x0a,0x84,0xe4,0x09,0xad
DCB 0x11,0x24,0x8b,0x98,0xc0,0x81,0x7f,0x21,0xa3,0x52,0xbe,0x19,0x93,0x09,0xce,0x20
DCB 0x10,0x46,0x4a,0x4a,0xf8,0x27,0x31,0xec,0x58,0xc7,0xe8,0x33,0x82,0xe3,0xce,0xbf
DCB 0x85,0xf4,0xdf,0x94,0xce,0x4b,0x09,0xc1,0x94,0x56,0x8a,0xc0,0x13,0x72,0xa7,0xfc
DCB 0x9f,0x84,0x4d,0x73,0xa3,0xca,0x9a,0x61,0x58,0x97,0xa3,0x27,0xfc,0x03,0x98,0x76
DCB 0x23,0x1d,0xc7,0x61,0x03,0x04,0xae,0x56,0xbf,0x38,0x84,0x00,0x40,0xa7,0x0e,0xfd
DCB 0xff,0x52,0xfe,0x03,0x6f,0x95,0x30,0xf1,0x97,0xfb,0xc0,0x85,0x60,0xd6,0x80,0x25
DCB 0xa9,0x63,0xbe,0x03,0x01,0x4e,0x38,0xe2,0xf9,0xa2,0x34,0xff,0xbb,0x3e,0x03,0x44
DCB 0x78,0x00,0x90,0xcb,0x88,0x11,0x3a,0x94,0x65,0xc0,0x7c,0x63,0x87,0xf0,0x3c,0xaf
DCB 0xd6,0x25,0xe4,0x8b,0x38,0x0a,0xac,0x72,0x21,0xd4,0xf8,0x07,0x56,0xcf,0x00,0x00
END

View File

@ -0,0 +1,35 @@
;********************************************************************
; IRIS-SUBPモニタプログラム サウンドテーブルデータ
;********************************************************************
AREA SoundData, DATA, READONLY
INCLUDE IrisSubpDefineArm.s
INCLUDE IrisSubpMemoryMapArm.s
INCLUDE IrisSubpMonDefineArm.s
INCLUDE IrisSubpMonMemoryMapArm.s
;====================================================================
; サウンドテーブルデータ
;====================================================================
GLOBAL snd_sin_table
GLOBAL snd_ptable
GLOBAL snd_vtable
GLOBAL snd_data_start
GLOBAL snd_data_end
snd_data_start
snd_ptable
INCBIN snd_ptable.bin
snd_vtable
INCBIN snd_vtable.bin
snd_sin_table
INCBIN snd_sinetable.bin
snd_data_end
END

View File

@ -0,0 +1,370 @@
;********************************************************************
; IRIS-SUBPモニタプログラム スタートアップルーチン
;********************************************************************
AREA Init, CODE, READONLY
INCLUDE IrisSubpDefineArm.s
INCLUDE IrisSubpMemoryMapArm.s
INCLUDE IrisSubpMonDefineArm.s
INCLUDE IrisSubpMonMemoryMapArm.s
ENTRY
;====================================================================
; 割り込み領域
;====================================================================
EXTERN start_handler
EXTERN swi_handler
EXTERN irq_handler
EXTERN fiq_handler
CODE32
start_v b start_m ; NULLポインタ位置のコードを不変にするため
undef_v b fiq_handler
swi_v b swi_handler
code_abort_v b fiq_handler
data_abort_v b fiq_handler
reserve_v b fiq_handler
irq_v b irq_handler
fiq_v b fiq_handler
start_m b start_handler
IF :DEF: DISABLE_SECURE_CODE
ELSE
; PNデータ
GLOBAL default_pnB_l
GLOBAL default_pnB_h
GLOBAL default_pnA_l_0_table
GLOBAL default_pnA_l_1
default_pnB_l
DCD 0x879b9b05
default_pnB_h
DCB 0x5c
default_pnA_l_1
DCB 0x60
default_pnA_l_0_table
DCB 0xe8, 0x4d, 0x5a, 0xb1, 0x17, 0x8f
; Blowfishデータ
IF :DEF: ENABLE_TEST_BLOWFISH
INCLUDE BlowfishTestTable.s
ELSE
INCLUDE BlowfishInitTable.s
ENDIF ; ENABLE_TEST_BLOWFISH
GLOBAL segmentIndexTable4Secure
segmentIndexTable4Secure
DCB 4_0132, 4_0213, 4_0231, 4_0312 ; - 4_0123, 4_0321
DCB 4_1023, 4_1203, 4_1302, 4_1320 ; - 4_1032, 4_1230
DCB 4_2103, 4_2130, 4_2301, 4_2310 ; - 4_2013, 4_2031
DCB 4_3012, 4_3021, 4_3120, 4_3201 ; - 4_3102, 4_3210
GLOBAL normal_mode_key
normal_mode_key
DCB "NmMdOnly"
GLOBAL png_off_key
png_off_key
DCB "enPngOFF"
GLOBAL encrypt_object_key
encrypt_object_key
DCB "encryObj"
; SIOハンドシェイクデータ
ALIGN
GLOBAL sio_send_code
GLOBAL sio_recv_code
GLOBAL sio_add_code
sio_send_code
DCW 0x4e54
sio_recv_code
DCW 0x4944
sio_add_code
DCW 0x524f
ENDIF ; DISABLE_SECURE_CODE
;--------------------------------------------------------------------
; 暗号キー変換r0=暗号キー)
;--------------------------------------------------------------------
IF :DEF: DISABLE_SECURE_CODE
ELSE
GLOBAL ChangeEncryptKey1
GLOBAL ChangeEncryptKey2
GLOBAL ChangeEncryptKey3
GLOBAL ChangeEncryptKey4
ALIGN
CODE32
ChangeEncryptKey1
mov r0, r0, lsr #1
b CheckLR2Return
ChangeEncryptKey2
mov r0, r0, lsl #1
b CheckLR2Return
ChangeEncryptKey3
mov r0, r0, lsl #1
b CheckLR2Return
ChangeEncryptKey4
mov r0, r0, lsr #1
b CheckLR2Return
CheckLR2Return
tst lr, #0xff000000
movne r0, #0
movne lr, #4
bx lr
ENDIF ; DISABLE_SECURE_CODE
;--------------------------------------------------------------------
; 暗号処理フック関数群
;--------------------------------------------------------------------
IF :DEF: DISABLE_SECURE_CODE
ELSE
EXTERN InitSecureParam
EXTERN MakeBlowfishTable
EXTERN InitBlowfishKeyAnaTable
EXTERN InitBlowfish
EXTERN EncryptByBlowfish
EXTERN DecryptByBlowfish
EXTERN DecryptObjectFile
EXTERN ChangeObjectTable
EXTERN CopyBiosArea
EXTERN CpuSetFast32
GLOBAL InitSecureParamFook
GLOBAL MakeBlowfishCardTable
GLOBAL MakeBlowfishFlashTable
GLOBAL InitBlowfishKeyAnaTableFook
GLOBAL InitBlowfishFook
GLOBAL EncryptByBlowfishFook0
GLOBAL EncryptByBlowfishFook1
GLOBAL EncryptByBlowfishFook2
GLOBAL DecryptByBlowfishFook
GLOBAL DecryptObjectFileFook
GLOBAL ChangeObjectTableFook
GLOBAL CopyBiosAreaFook
GLOBAL CpuSetFast32Fook
ALIGN
CODE32
InitSecureParamFook
ldr r12, =InitSecureParam
b CheckLR2CallR12
MakeBlowfishCardTable
mov r3, #8
ldr r12, =MakeBlowfishTable
b CheckLR2CallR12
MakeBlowfishFlashTable
mov r3, #12
ldr r12, =MakeBlowfishTable
b CheckLR2CallR12
InitBlowfishKeyAnaTableFook
ldr r12, =InitBlowfishKeyAnaTable
b CheckLR2CallR12
InitBlowfishFook
ldr r12, =InitBlowfish
b CheckLR2CallR12
EncryptByBlowfishFook0
ldr r12, =EncryptByBlowfish
b CheckLR2CallR12
EncryptByBlowfishFook1
mov r2, r1
add r1, r1, #4
ldr r12, =EncryptByBlowfish
b CheckLR2CallR12
EncryptByBlowfishFook2
add r2, r1, #4
add r1, r1, #8
ldr r12, =EncryptByBlowfish
b CheckLR2CallR12
DecryptByBlowfishFook
mov r2, r1
add r1, r1, #4
ldr r12, =DecryptByBlowfish
b CheckLR2CallR12
DecryptObjectFileFook
ldr r12, =DecryptObjectFile
b CheckLR2CallR12
ChangeObjectTableFook
mov r0, #8
ldr r12, =ChangeObjectTable
b CheckLR2CallR12
CopyBiosAreaFook
ldr r12, =CopyBiosArea
b CheckLR2CallR12
CpuSetFast32Fook
ldr r12, =CpuSetFast32
b CheckLR2CallR12
CheckLR2CallR12
tst lr, #0xff000000
bxeq r12
mov r12,#0
mov r3, #0
mov r2, #0
mov r1, #0
mov r0, #0
mov lr, #4
bx lr
ENDIF ; DISABLE_SECURE_CODE
;--------------------------------------------------------------------
; IPL2呼び出し関数ポインタ獲得
;--------------------------------------------------------------------
EXTERN CalledFormIPL2
EXTERN CardIntr
GLOBAL GetFuncp4IPL2
CODE16
GetFuncp4IPL2
ldr r2, eor_code
ldr r0, =CalledFormIPL2
ldr r1, =CardIntr
ldr r3, =SetPause2Agb
eor r3, r3, r0
eor r0, r0, r1
eor r1, r1, r2
bx lr
ALIGN
eor_code
DCB "I2\0\0" ; EORコード
;--------------------------------------------------------------------
; チェックフラグ セット
;--------------------------------------------------------------------
GLOBAL SetPauseCheckFlag
CODE16
SetPauseCheckFlag
mov r1, #1
ldr r2, =REG_PAUSE
strb r1, [r2, #0]
bx lr
;--------------------------------------------------------------------
; AGBモード遷移
;--------------------------------------------------------------------
GLOBAL SetPause2Agb
ALIGN
CODE32
SetPause2Agb mov r2, #0x40
b SetPauseHi
;--------------------------------------------------------------------
;
;--------------------------------------------------------------------
GLOBAL Halt
CODE32
Halt mov r2, #0x80
b SetPauseHi
;--------------------------------------------------------------------
;
;--------------------------------------------------------------------
GLOBAL Stop
GLOBAL SetPauseHi
CODE32
Stop mov r2, #0xc0
SetPauseHi mov r12, #REG_BASE
strb r2, [r12, #OFFSET_REG_PAUSE + 1]
nop
nop
bx lr
LTORG ; 上記のリテラルプールを隠す
GLOBAL SecureAreaEndp
SecureAreaEndp
IF :DEF: ENABLE_WRITE_FLASH
GLOBAL flashTestHeader
flashTestHeader
DCD 0 ; MACアドレス Low
DCW 0 ; High
DCW 0xc401 ; CRC16bit
DCB "MACP" ; Blowfishキーデータ
DCW 0x100/8 ; ARM9-FLASHオフセット
DCW 0x20000/8 ; ARM9-RAM負オフセット
DCW 0x10000/8 ; ARM7-FLASHオフセット
DCW 0x8000/8 ; ARM7-RAM負オフセット
DCW 8_01111 ; 境界2bit x 4 & ARM7-ARM配置フラグ & 予約7bit
DCW 0 ; 予約2Byte
DCD 0 ; 0x9e0d35bd ; スクランブル解除キー8バイト
DCD 0 ; 0x2560ac91
GLOBAL arm9ipl2
GLOBAL arm9ipl2_end
ALIGN
arm9ipl2
IF :DEF: DISABLE_SECURE_CODE
INCBIN ipl2_test.lz
ELSE
INCBIN ipl2_test.ipl2
ENDIF ; DISABLE_SECURE_CODE
arm9ipl2_end
GLOBAL arm7ipl2
GLOBAL arm7ipl2_end
ALIGN
arm7ipl2
IF :DEF: DISABLE_SECURE_CODE
INCBIN subp_ipl2_test.lz
ELSE
INCBIN subp_ipl2_test.ipl2
ENDIF ; DISABLE_SECURE_CODE
arm7ipl2_end
ENDIF ; ENABLE_WRITE_FLASH
END

View File

@ -0,0 +1,725 @@
;********************************************************************
; IRIS-SUBPモニタプログラム サブルーチン群
;********************************************************************
AREA IrisSubpCrt0Sub, CODE, READONLY
INCLUDE IrisSubpDefineArm.s
INCLUDE IrisSubpMemoryMapArm.s
INCLUDE IrisSubpMonDefineArm.s
INCLUDE IrisSubpMonMemoryMapArm.s
MON_ONLY
NDEBUG2
;--------------------------------------------------------------------
; 割り込み分岐処理
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL intr_main
EXTERN intrTable
ALIGN
CODE32
intr_main
mov r12, #REG_BASE ; IE/IF
add r3, r12, #OFFSET_REG_IE ; r3: REG_IE
ldmia r3, {r1-r2}
and r1, r1, r2 ; r1: IE & IF
mov r2, #0
ands r0, r1, #CARD_DATA_INTR_FLAG ;
bne jump_intr
add r2, r2, #4
ands r0, r1, #TIMER3_INTR_FLAG ; カードタイマー 割り込み
bne jump_intr
add r2, r2, #4
ands r0, r1, #V_BLANK_INTR_FLAG ; V
jump_intr
str r0, [r3, #REG_IF - REG_IE] ; IF
ldr r1, =intrTable ; ユーザIRQ処理へジャンプ
add r1, r1, r2
ldr r0, [r1]
bx r0
;-----------------------------------------------------------------------
; ループ待ちr0=loopCount
;-----------------------------------------------------------------------
GLOBAL WaitByLoop
ALIGN
CODE16
WaitByLoop
sub r0, #1
bgt WaitByLoop
bx lr
;--------------------------------------------------------------------
;- Vブランク割り込みウェイト -
;--------------------------------------------------------------------
GLOBAL WaitVBlankIntr
ALIGN
CODE32
WaitVBlankIntr mov r0, #1
mov r1, #V_BLANK_INTR_FLAG
;--------------------------------------------------------------------
; 割り込みウェイトr0=initCheckClear, r1=intrFlag
;--------------------------------------------------------------------
GLOBAL WaitIntr
CODE32
WaitIntr stmfd sp!, {lr}
cmp r0, #0
blne WaitIntr_sub ; IfCheck クリア
0
mov lr, #0x80
strb lr, [r12,#REG_PAUSE+1 - REG_BASE] ; SVC_Halt() REG_PAUSE = 0x80
nop
nop
bl WaitIntr_sub
beq %b0 ; while (!(IfCheck & IfFlags))
ldmfd sp!, {lr}
bx lr
WaitIntr_sub
IF :DEF: BB_MON
ldr r12,=CPU_WRAM_END
ELSE
mov r12,#REG_BASE ; r12: #REG_BASE
ENDIF
str r12,[r12,#REG_IME - REG_BASE] ; IME = 0
ldr r2, [r12, #INTR_CHECK_BUF - CPU_WRAM_END]
ands r0, r1, r2 ; IfCheck 判定
eorne r2, r2, r0 ; IfCheck クリア
strne r2, [r12, #INTR_CHECK_BUF - CPU_WRAM_END]
mov r0, #1
str r0, [r12,#REG_IME - REG_BASE] ; IME = 1
bx lr
;--------------------------------------------------------------------
; サウンドBIAS 変更 (r0=up_down, r1=stepLoops)
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL ChangeSoundBias16
CODE16
ChangeSoundBias16
1 mov r2, #2 ; r12: 0x200
lsl r2, #8
mov r12, r2
ldr r3, =REG_SOUNDBIAS ; r3: soundBiasp = REG_SOUNDBIAS
ldrh r2, [r3, #0] ; r2: *soundBiasp
ldr r3, =REG_SOUNDBIAS
cmp r0, #0 ; if (up_down)
beq %f2
cmp r2, r12 ; if (*soundBiasp >= 0x200) break;
bge %f5
add r2, #1 ; *soundBiasp += 1
b %f3
2 cmp r2, #0 ; if (*soundBiasp <= 0) break;
ble %f5
sub r2, #1 ; *soundBiasp -= 1
3 strh r2, [r3, #0]
mov r2, r1 ; for (i=stepLoops; --i>=0; ) ;
4 sub r2,#1
bpl %b4
b %b1
5 bx lr
; ENDIF
;--------------------------------------------------------------------
; BIOS領域専用コピー (r0=srcp, r1=destp, r2=size)
;--------------------------------------------------------------------
EXTERN SecureAreaEndp
GLOBAL CopyBiosArea
CopyBiosArea
add r2, r1
1
ldr r3, =SecureAreaEndp
cmp r0, r3
bge %b2
ldmia r0!, {r3} ; *((vu32 *)(destp))++ = *((vu32 *)(srcp))++
stmia r1!, {r3}
cmp r1, r2
blt %b1
2 mov pc, lr
;--------------------------------------------------------------------
; セキュリティ・キー解除  Nintendoロゴ コピー
;--------------------------------------------------------------------
IF :DEF: TEST_AGB_MODE
KEY_START_BLOCK_NO * 3 ; キー・スタート ブロックNo
EXTERN NinLogoBak
; EXTERN NinLogoCopy
EXTERN DacsCheck
GLOBAL key_unlock__nin_logo_copy
CODE16
key_unlock__nin_logo_copy
push {r3, r4-r6, lr}
mov r6, #0x8 ; r6: ROM_BANK0
lsl r6, #24
mov r5, #MON_KEY_GROUP_NO - CARTRIDGE
add r5, r6 ; r5: MON_KEY_GROUP_NO
sub r0, r5, #1 ; r4: キー No オフセット 算出
mov r1, #27 ; Srcp=MON_KEY_GROUP_NO-1,Count=27
bl GetKeyNo
; mov r0, #2 ; ダミー キー No
mov r4, #2*6
mul r4, r0
ldrb r3, [r5] ; r3: キーグループ No(0-3) * 48
; lsl r3, #32-2 ;(r2: キーグループ オフセット固定 ダミー読み込み)
; lsr r3, #32-2
; mov r2, #2*6*4
; mul r2, r3
; add r4, r2 ; r4: キー No 算出 (キーグループ オフセット加算無し)
adr r5, key_addr ; r5: キー・アドレス
add r5, r4
mov r4, #0
nin_copy mov r0, r4
bl NinLogoCopy ; Nintendoロゴ コピー (20*10Byte)
cmp r4, #KEY_START_BLOCK_NO
blt key_unlock_end
cmp r4, #KEY_START_BLOCK_NO + 6
bge key_unlock_end
key_unlock ldrh r1, [r5] ; r1: キー・アドレス 読み込み
lsl r1, #1
orr r1, r6
ldrh r0, [r1]
add r5, #2
key_unlock_end add r4, #1
cmp r4, #11
bne nin_copy
pop {r3, r4-r6, pc}
INCLUDE crt0KeyAddr.s
ENDIF
;--------------------------------------------------------------------
; キーNo 算出 (r0=Srcp, r1=Count → r0=KeyNo:2)
;--------------------------------------------------------------------
IF :DEF: TEST_AGB_MODE
GLOBAL GetKeyNo
CODE16
GetKeyNo push {r4, r5, lr}
mov r4, #3 ; r4: Ror
mov r3, #0 ; r3: KeyNo
GetKeyNo_10 ldrb r2, [r0, #0] ; r2: *Srcp
ror r3, r4
mov r5, #4 ; r5: RorCount
GetKeyNo_20 eor r3, r2
lsl r2, #8
sub r5, #1 ; while (--RorCount > 0)
bgt GetKeyNo_20
add r0, #1
sub r1, #1 ; while (--Count > 0)
bgt GetKeyNo_10
mov r0, r3
lsl r0, #32-5
lsr r0, #32-2
pop {r4, r5, pc}
ENDIF
;--------------------------------------------------------------------
; NINTENDOロゴ コピー (r0=BlockNo)
;--------------------------------------------------------------------
IF :DEF: TEST_AGB_MODE
GLOBAL NinLogoCopy
CODE16
NinLogoCopy push {r4, lr}
mov r4, #20 ; r4: BlockOffset = BlockNo * 20
mul r4, r0
mov r3, #0x8 ; r3: ROM_BANK0
lsl r3, #24
add r0, r3, #4 ; r0: &((u8 *)ROM_BANK0)[BlockOffset + OFFSET_MON_NINLOGO]
add r0, r4
ldr r1, =NinLogoBak+36 ; r1: &NinLogoBak[BlockOffset + 36]
add r1, r4
mov r2, #10 ; r2: 0x0000000A (16bit転送10回)
bl CpuSet16_32 ; CpuCopy16_32()
pop {r4, pc}
ENDIF
LTORG
;--------------------------------------------------------------------
; 汎用符号付き割り算r0/r1→r0',r0%r1→r1',|r0'|→r3'
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL DivS32
ALIGN
CODE32
DivS32 ands r3, r1, #0x80000000 ; r1: 除数の絶対値
rsbmi r1, r1, #0
eors r12,r3, r0, asr #32 ; r12: d31=結果の符合,d30=被除数の符号
rsbcs r0, r0, #0 ; r0: 被除数の絶対値
movs r2, r1 ; r2: コントロール・ビット
; beq devide_by_zero
divide_just_l cmp r2, r0, lsr #1
movls r2, r2, lsl #1
blo divide_just_l
divide_div_l cmp r0, r2 ; 減算できるかチェック
adc r3, r3, r3 ; r3*2 + キャリー
subcs r0, r0, r2 ; 減算可能なら減算
teq r2, r1 ; 終了チェック
movne r2, r2, lsr #1 ; 終了でなければ2で割り再チェック
bne divide_div_l
mov r1, r0
mov r0, r3
movs r12,r12,lsl #1
rsbcs r0, r0, #0
rsbmi r1, r1, #0
bx lr
; ENDIF
;--------------------------------------------------------------------
; 平方根算出r0=param
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL SqrtU32
ALIGN
CODE32
SqrtU32 stmfd sp!, {r4}
mov r12,r0 ; r12: ParamBak
mov r1, #1
1 cmp r0, r1
movhi r0, r0, lsr #1
movhi r1, r1, lsl #1
bhi %b1
2 mov r0, r12 ; r0: 被除数
mov r4, r1 ; r1: 除数
mov r3, #0 ; r3: 商
mov r2, r1 ; r2: コントロール・ビット
3 cmp r2, r0, lsr #1
movls r2, r2, lsl #1
blo %b3
4 cmp r0, r2 ; 減算できるかチェック
adc r3, r3, r3 ; r3*2 + キャリー
subcs r0, r0, r2 ; 減算可能なら減算
teq r2, r1 ; 終了チェック
movne r2, r2, lsr #1 ; 終了でなければ2で割り再チェック
bne %b4
add r1, r1, r3
movs r1, r1, lsr #1
cmp r1, r4
bcc %b2
mov r0, r4
ldmfd sp!, {r4}
bx lr
; ENDIF
;--------------------------------------------------------------------
; セット (r0=srcp, r1=destp, r2=dmaCntData)
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL CpuSet16_32
CODE16
CpuSet16_32 push {r4, r5, lr}
lsl r4, r2, #11 ; r4: size = (dmaCntData & 0x1fffff)*4
lsr r4, #11-2
bl CheckSrcp16_32 ; ソースアドレス チェック
IF :DEF: CHECK_PROT_ADDR
ELSE
beq %f6
ENDIF
0 mov r5, #0 ; r5: i = 0
lsr r3, r2, #27 ; if ((dmaCntData) & DMA_32BIT_BUS)
bcc %f3
add r5, r1, r4 ; r5: destEndp = destp + size
lsr r3, r2, #25 ; if ((dmaCntData) & DMA_SRC_FIX)
bcc %f2
ldmia r0!, {r3}
1 cmp r1, r5 ; while (destp < destEndp)
bge %f6
stmia r1!, {r3} ; *((vu32 *)(destp))++ = *((vu32 *)(srcp))
b %b1
2 cmp r1, r5 ; while (destp < destEndp)
bge %f6
ldmia r0!, {r3} ; *((vu32 *)(destp))++ = *((vu32 *)(srcp))++
stmia r1!, {r3}
b %b2
3 lsr r4, #1
lsr r3, r2, #25 ; if ((dmaCntData) & DMA_SRC_FIX)
bcc %f5
ldrh r3, [r0, #0]
4 cmp r5, r4 ; for ( ; i<count; i++)
bge %f6
strh r3, [r1, r5] ; ((vu16 *)(destp))[i] = ((vu16 *)(srcp))[0]
add r5, #2
b %b4
5 cmp r5, r4 ; for ( ; i<count; i++)
bge %f6
ldrh r3, [r0, r5] ; ((vu16 *)(destp))[i] = ((vu16 *)(srcp))[i]
strh r3, [r1, r5]
add r5, #2
b %b5
6 pop {r4, r5}
pop {r3}
bx r3
; ENDIF
;--------------------------------------------------------------------
; ソースアドレス チェック 16bitインタフェース(r4=size → r12)
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL CheckSrcp16_32
CODE16
CheckSrcp16_32 adr r3, CheckSrcp
mov r12,r4
bx r3
;--------------------------------------------------------------------
; ソースアドレス チェック (r0=srcp,r12=size → Zフラグ)
;--------------------------------------------------------------------
GLOBAL CheckSrcp
ALIGN
CODE32
CheckSrcp cmp r12, #0 ; if (!size)
beq CheckSrcp_End
bic r12, r12,#0xfe000000
add r12, r0, r12 ; r12: srcEndp = srcp + size
tst r0, #0x0e000000 ; srcp チェック
tstne r12,#0x0e000000 ; srcEndp チェック
CheckSrcp_End bx lr
; ENDIF
;--------------------------------------------------------------------
; 高速セット(32Byte) (r0=srcp, r1=destp, r2=dmaCntData)
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL CpuSetFast32_T
GLOBAL CpuSetFast32
CODE16
CpuSetFast32_T mov r3, pc
bx r3
ALIGN
CODE32
CpuSetFast32 stmfd sp!, {r4-r10, lr}
mov r10, r2, lsl #11 ; r10: count = (dmaCntData & 0x1fffff)*4
movs r12, r10, lsr #11-2 ; r12: size = count * 4
bl CheckSrcp ; ソースアドレス チェック
IF :DEF: CHECK_PROT_ADDR
ELSE
beq %f5
ENDIF
add lr, r1, r10, lsr #11-2 ; lr: destEndp = destp + size
mov r10, r10, lsr #11+3 ; r10: blockEndp = srcp + size/32*32
add r10, r1, r10,lsl #3
0 movs r2, r2, lsr #25 ; if ((dmaCntData) & DMA_SRC_FIX)
bcc %f3
ldr r2, [r0, #0]
mov r3, r2
mov r4, r2
mov r5, r2
mov r6, r2
mov r7, r2
mov r8, r2
mov r9, r2
1 cmp r1, r10 ; while (destp < destEndp)
stmltia r1!, {r2-r9} ; *((vu32 *)(destp++)) = *((vu32 *)(srcp))
blt %b1
2 cmp r1, lr
stmltia r1!, {r2}
blt %b2
b %f5
3 cmp r1, r10 ; while (destp < destEndp)
ldmltia r0!, {r2-r9} ; *((vu32 *)(destp)++) = *((vu32 *)(srcp)++)
stmltia r1!, {r2-r9}
blt %b3
4 cmp r1, lr
ldmltia r0!, {r2}
stmltia r1!, {r2}
blt %b4
5 ldmfd sp!, {r4-r10, lr}
bx lr
; ENDIF
;--------------------------------------------------------------------
; Bit圧縮データ展開 (r0=srcp, r1=destp, r2=unPackBitsParamp)
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL UnPackBits32
ALIGN
CODE32
UnPackBits32
stmfd sp!, {r4-r11, lr}
sub sp, sp, #4
ldrh r7, [r2, #0] ; r7: srcNum = unPackBitsParamp->srcNum
movs r12, r7 ; r12: srcCount
bl CheckSrcp ; ソースアドレス チェック
beq %f6
0 ldrb r6, [r2, #2] ; r6: srcBitNum = unPackBitsParamp->srcBitNum
rsb r10, r6, #8 ; r10: srcBitNumInv = 8 - srcBitNum
mov r14, #0 ; r14: destBak = 0
ldr r11, [r2, #4] ; r8: destOffset0_On
mov r8, r11, lsr #31 ; = unPackBitsParamp->destOffset0_On
ldr r11,[r2, #4] ; destOffset = unPackBitsParamp->destOffset
mov r11,r11, lsl #1
mov r11,r11, lsr #1
str r11,[sp, #0]
ldrb r2, [r2, #3] ; r2: destBitNum = unPackBitsParamp->destBitNum
mov r3, #0 ; r3: destBitCount = 0
1 subs r7, r7, #1 ; while (--srcNum >= 0)
blt %f6
mov r11, #0xff ; r5: srcMask = 0xff >> srcBitNumInv
mov r5, r11, asr r10
ldrb r9, [r0], #1 ; r9: srcTmp = *srcp++
mov r4, #0 ; r4: srcBitCount = 0
2 cmp r4, #8 ; while (srcBitCount < 8)
bge %b1
and r11, r9, r5 ; r12: destTmp = ((srcTmp&srcMask) >>srcBitCount)
movs r12, r11, lsr r4
cmpeq r8, #0
beq %f4
3 ldr r11, [sp, #0] ; destTmp += destOffset
add r12, r12, r11
4 orr r14, r14, r12, lsl r3 ; destBak |= destTmp << destBitCount
add r3, r3, r2 ; destBitCount += destBitNum
cmp r3, #0x20 ; if (destBitCount >= 32)
blt %f5
str r14, [r1], #4 ; *destp++ = destBak
mov r14, #0 ; destBak = 0
mov r3, #0 ; destBitCount = 0
5 mov r5, r5, lsl r6 ; srcMask <<= srcBitNum
add r4, r4, r6 ; srcBitCount += srcBitNum
b %b2
6 add sp, sp, #4
ldmfd sp!, {r4-r11, lr}
bx lr
; ENDIF
;--------------------------------------------------------------------
; データ展開8Bit→8Bit(r0=srcp, r1=destp)
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL UnCompLZ77Byte
ALIGN
CODE32
UnCompLZ77Byte
stmfd sp!, {r4-r6, lr}
ldr r5, [r0], #4 ; r2: destCount = *(u32 *)srcp >> 8
mov r2, r5, lsr #8 ; r0: srcp += 4
movs r12, r2 ; r12: srcCount
bl CheckSrcp ; ソースアドレス チェック
beq %f6
1 cmp r2, #0 ; while (destCount > 0)
ble %f6
ldrb r14, [r0], #1 ; r14: flags = *srcp++
mov r4, #8 ; for (i=8; --i>=0; )
2 subs r4, r4, #1
blt %b1
tst r14, #0x80 ; if (!(flags & 0x80))
bne %f3
ldrb r6, [r0], #1 ; *srcp++
strb r6, [r1], #1 ; r1: *destp++
sub r2, r2, #1 ; destCount--
b %f5
3 ldrb r5, [r0, #0] ; r3: length = (*srcp >> 4) + 3
mov r6, #3
add r3, r6, r5, asr #4
ldrb r6, [r0], #1 ; r12: offset = (*srcp++ & 0x0f) << 8
and r5, r6, #0xf
mov r12,r5, lsl #8
ldrb r6, [r0], #1 ; offset = (offset | *srcp++) + 1
orr r5, r6, r12
add r12, r5, #1
sub r2, r2, r3 ; destCount -= length
4 ldrb r5, [r1, -r12] ; *destp++ = destp[-offset]
strb r5, [r1], #1
subs r3, r3, #1 ; while (--length > 0)
bgt %b4
5 cmp r2, #0 ; if (destCount <= 0) break;
movgt r14, r14, lsl #1 ; flags <<= 1
bgt %b2
b %b1
6 ldmfd sp!, {r4-r6, lr}
bx lr
; ENDIF
;--------------------------------------------------------------------
; ランレングスデータ展開8Bit→8Bit(r0=srcp, r1=destp)
;--------------------------------------------------------------------
; IF :DEF: SYSCALL_ASM
GLOBAL UnCompRLByte
CODE16
UnCompRLByte
push {r4-r7, lr}
ldmia r0!, {r3} ; r7: destCount = *(u32 *)srcp >> 8
lsr r7, r3, #8 ; r0: srcp += 4
mov r4, r7 ; r4: count
bl CheckSrcp16_32 ; ソースアドレス チェック
beq %f5
1 cmp r7, #0 ; while (destCount > 0)
ble %f5
ldrb r4, [r0, #0] ; r4: flags = *srcp++
add r0, #1
lsl r2, r4, #25 ; r2: length = flags & 0x7f
lsr r2, #25
lsr r3, r4, #8 ; if (!(flags & 0x80))
bcs %f3
add r2, #1 ; length++
sub r7, r2 ; destCount -= length
2 ldrb r3, [r0, #0] ; *destp++ = *srcp++
strb r3, [r1, #0]
add r0, #1
add r1, #1
sub r2, r2, #1 ; while (--length > 0)
bgt %b2
b %b1
3 add r2, #3 ; length += 3
sub r7, r2 ; destCount -= length
ldrb r5, [r0, #0] ; srcTmp = *srcp++
add r0, #1
4 strb r5, [r1, #0] ; *destp++ = srcTmp
add r1, #1
sub r2, r2, #1 ; while (--length > 0)
bgt %b4
b %b1
5 pop {r4-r7}
pop {r0}
; ENDIF
;--------------------------------------------------------------------
; r0レジスタによるルーチン呼び出し
;--------------------------------------------------------------------
GLOBAL __call_via_r0
CODE16
__call_via_r0 bx r0
;--------------------------------------------------------------------
; r1レジスタによるルーチン呼び出し
;--------------------------------------------------------------------
GLOBAL __call_via_r1
CODE16
__call_via_r1 bx r1
;--------------------------------------------------------------------
; r2レジスタによるルーチン呼び出し
;--------------------------------------------------------------------
GLOBAL __call_via_r2
CODE16
__call_via_r2 bx r2
;--------------------------------------------------------------------
; r3レジスタによるルーチン呼び出し
;--------------------------------------------------------------------
GLOBAL __call_via_r3
CODE16
__call_via_r3 bx r3
;--------------------------------------------------------------------
; r4レジスタによるルーチン呼び出し
;--------------------------------------------------------------------
GLOBAL __call_via_r4
CODE16
__call_via_r4 bx r4
;--------------------------------------------------------------------
; r5レジスタによるルーチン呼び出し
;--------------------------------------------------------------------
GLOBAL __call_via_r5
CODE16
__call_via_r5 bx r5
END

View File

@ -0,0 +1,336 @@
;********************************************************************
; IRIS-SUBPモニタ例外ハンドラ
;********************************************************************
AREA Init, CODE, READONLY
INCLUDE IrisSubpDefineArm.s
INCLUDE IrisSubpMemoryMapArm.s
INCLUDE IrisSubpMonDefineArm.s
INCLUDE IrisSubpMonMemoryMapArm.s
;====================================================================
; 例外ハンドラ群
;====================================================================
;--------------------------------------------------------------------
; デバッガモニタへジャンプ
;--------------------------------------------------------------------
GLOBAL fiq_handler
CODE32
fiq_handler
mrs sp, cpsr ; IRQ/FIQ不許可
orr sp, sp, #PSR_IRQ_DISABLE | PSR_FIQ_DISABLE
msr cpsr_cxsf, sp
ldr sp, fiq_sp ; SP のセット
add sp, sp, #1
fiq_m stmfd sp!, {r12, lr} ; レジスタ の退避合計3ワード
mrs lr, spsr
stmfd sp!, {lr}
bic r12, sp, #1 ; デバッガ処理へジャンプ
ldr r12, [r12, #12]
adr lr, fiq_return
cmp r12, #0
bxne r12
;--------------------------------------------------------------------
; デバッガモニタからの復帰
;--------------------------------------------------------------------
CODE32
fiq_return
ldmfd sp!, {lr} ; レジスタ の復帰
msr spsr_sxcf, lr
ldmfd sp!, {r12, lr}
subs pc, lr, #4
;--------------------------------------------------------------------
; 初期化
;--------------------------------------------------------------------
EXTERN IrisSubpMonMain
EXTERN intr_main
GLOBAL start_handler
CODE32
start_handler
cmp lr, #0 ; fiq_return => pc = -4 対策
moveq lr, #4
mov r12, #REG_BASE ; /
ldrb r12, [r12, #OFFSET_REG_PAUSE]
teq r12, #1
mrseq r12, cpsr ; IRQ/FIQ不許可
orreq r12, r12, #PSR_IRQ_DISABLE | PSR_FIQ_DISABLE
msreq cpsr_cxsf, r12
ldreq sp, fiq_sp ; SP のセット
beq fiq_m ; デバッガモニタへジャンプ
restart_v mov r0, #0xc0 | PSR_SYS_MODE ; システムモードへ切り換え & IRQ/FIQ不許可
msr cpsr_cxsf, r0
mov r4, #REG_BASE ; IME
strb r4, [r4, #OFFSET_REG_IME]
bl bankreg_init_stack_clear ; バンクレジスタ リセット & スタック領域 クリア
ldr r0, =intr_main ; 割り込みアドレスのセット
str r0, [r4, #INTR_VECTOR_BUF - CPU_WRAM_END]
; str r0, [sp, #0x100-4]
ldr r0, =IrisSubpMonMain ; Cルーチン処理
adr lr, main_return
bx r0
main_return
bl terminate_mon ; モニタ終了処理
ldr r12, =MAIN_MEM_EX_END ; ユーザ・エントリポイント 獲得
IF :DEF: DISABLE_ENTRY_OF_ROM_HEADER
ldr lr, [r12, #-(0x200 - 0x38)] ; rmhp->arm7->ramAddr
ELSE
ldr lr, [r12, #-(0x200 - 0x34)] ; rmhp->arm7->entryAddr
ENDIF
IF :DEF: DISABLE_BOOT_IPL2
ldrh r0, [r12, #-4] ; ROMヘッダ チェック
cmp r0, #1
0 beq %b0 ; ROMヘッダ不整合時
sub r12, r12, #0x800
ldrh r0, [r12, #0x14] ; デバッガチェック
add r12, r12, #0x800
cmp r0, #1 ; if (!shwp->isOnDebugger)
mov r0, #0
ldreq r12, [r12, #-(0x200 - 0x16c)]; デバッガエントリポイント 獲得
; cmpeq r12, #0 ; rmhp->dbgArm7RamAddr
; cmpeq r12, #-1
bxeq r12
IF :DEF: IRIS_BB
0 b %b0 ; ブレッドボード開発用
ENDIF
mov r0, #0
bx lr
ELSE
sub r12, r12, #0x800
ldrh r0, [r12, #0x2c] ; IPL2・CRCチェック
cmp r0, #0 ; if (!shwp->flashCrcError)
0 bne %b0
ldr r12, [r12, #0x24] ; IPL2・エントリポイント 獲得
cmp r12, #0 ; shwp->flashArm7RamAddr
0 beq %b0
bx r12
ENDIF
;--------------------------------------------------------------------
; ソフトリセット
;--------------------------------------------------------------------
CODE32
soft_reset
bl terminate_mon ; 終了処理
ldr r12, =MAIN_MEM_EX_END ; ユーザ・エントリポイント 獲得
ldr lr, [r12, #-(0x200 - 0x34)]
mov r12, #0
bx lr
;--------------------------------------------------------------------
; モニタプログラム終了処理
;--------------------------------------------------------------------
CODE32
terminate_mon
mov r12, lr
mov r0, #PSR_SYS_MODE ; IRQ/FIQ
msr cpsr_cxsf, r0
bl bankreg_init_stack_clear ; バンクレジスタ リセット & スタック領域 クリア
ldmea r4, {r0-r11} ; 汎用レジスタ クリア
bx r12
;--------------------------------------------------------------------
; バンクレジスタ リセット スタック領域 クリア
;--------------------------------------------------------------------
GLOBAL bankreg_init_stack_clear
CODE32
bankreg_init_stack_clear
mov r0, #0xc0 | PSR_SVC_MODE ; SVCモードへ切り換え & IRQ/FIQ不許可
msr cpsr_cxsf, r0
ldr sp, svc_sp ; SP のセット
mov lr, #0
msr spsr_csxf, lr
mov r0, #0xc0 | PSR_IRQ_MODE ; IRQモードへ切り換え & IRQ/FIQ不許可
msr cpsr_cxsf, r0
ldr sp, irq_sp ; SP のセット
mov lr, #0
msr spsr_cxsf, lr
mov r0, #0x40 | PSR_SYS_MODE ; システムモードへ切り換え & IRQ許可/FIQ不許可
msr cpsr_cxsf, r0
ldr sp, usr_sp ; SP のセット
stack_clear
IF :DEF: BB_MON
ldr r4, =CPU_WRAM_END
ELSE
mov r4, #REG_BASE ; r4: REG_BASE
ENDIF ; BB_MON
adr r0, stack_clear_10 + 1
bx r0
CODE16
stack_clear_10 mov r0, #0
ldr r1, =-4*128
1 str r0, [r4, r1]
add r1, #4
blt %b1
bx lr
;--------------------------------------------------------------------
; IRQ処理へジャンプ
;--------------------------------------------------------------------
GLOBAL irq_handler
ALIGN
CODE32
irq_handler
stmfd sp!, {r0-r3,r12,lr} ; レジスタ の退避6ワード
; ldr r0, =CPU_WRAM_END
mov r0, #REG_BASE
adr lr, irq_return
ldr pc, [r0, #-4] ; 32bitコードでジャンプ
; ldr r1, [r0, #-4] ; 32bitコードでジャンプ
; bx r1
;--------------------------------------------------------------------
; IRQからの復帰
;--------------------------------------------------------------------
CODE32
irq_return ldmfd sp!, {r0-r3,r12,lr} ; レジスタ の復帰
subs pc, lr, #4
;--------------------------------------------------------------------
; システムコールへジャンプ
;--------------------------------------------------------------------
GLOBAL swi_handler
CODE32
swi_handler
stmfd sp!, {r11, r12, lr} ; SVCモード レジスタ退避
ldrh r12, [lr, #-2] ; システムコールNo 取得ハーフワードアクセス対応サウンドBB時
and r12, r12, #0xff
adr r11, sys_table ; システムコール・アドレス 取得
ldr r12, [r11, r12, lsl #2]
mrs r11, spsr ; SVCモード SPSR退避合計4ワード
stmfd sp!, {r11}
and r11, r11, #PSR_IRQ_DISABLE ; IRQ
orr r11, r11, #PSR_SYS_MODE ; & FIQ
msr cpsr_cxsf,r11
stmfd sp!, {r2, lr} ; システムモード レジスタ退避2ワード
adr lr, swi_return
bx r12 ; コードの切換とジャンプ
;--------------------------------------------------------------------
;- システムコールからの復帰 18c -
;--------------------------------------------------------------------
GLOBAL swi_return
CODE32
swi_return ldmfd sp!, {r2, lr} ; システムモード レジスタ復帰
mov r12, #0xc0 | PSR_SVC_MODE ; SVCモードへ切り換え
msr cpsr_cxsf, r12 ; & IRQ/FIQ不許可
ldmfd sp!, {r11} ; SVCモード レジスタ復帰
msr spsr_cxsf, r11
ldmfd sp!, {r11, r12, lr}
movs pc, lr
;====================================================================
; アドレステーブル
;====================================================================
ALIGN
usr_sp DCD CPU_WRAM_END - 0x100
irq_sp DCD CPU_WRAM_END - 0x50
svc_sp
fiq_sp DCD CPU_WRAM_END - 0x24
EXTERN AccessCard
EXTERN WaitByLoop
EXTERN WaitIntr
EXTERN WaitVBlankIntr
EXTERN Halt
EXTERN Stop
EXTERN SetPauseHi
EXTERN ChangeSoundBias16
EXTERN IsMmem8MB
EXTERN GetCRC16
EXTERN DivS32
EXTERN SqrtU32
EXTERN CpuSet16_32
EXTERN CpuSetFast32
EXTERN UnPackBits32
EXTERN UnCompLZ77Byte
EXTERN UnCompLZ77Short
EXTERN UnCompHuffman32
EXTERN UnCompRLByte
EXTERN UnCompRLShort
EXTERN GetSoundSinTable
EXTERN GetSoundPitchTable
EXTERN GetSoundVolumeTable
EXTERN GetFuncp4IPL2
sys_table
DCD soft_reset ; 0
DCD 0 ; 1
DCD 0 ; 2
DCD WaitByLoop ; 3
DCD WaitIntr ; 4
DCD WaitVBlankIntr ; 5
DCD Halt ; 6
DCD Stop ; 7
DCD ChangeSoundBias16 ; 8
DCD DivS32 ; 9
DCD 0 ; 10
DCD CpuSet16_32 ; 11
DCD CpuSetFast32 ; 12
DCD SqrtU32 ; 13
DCD GetCRC16 ; 14
DCD IsMmem8MB ; 15
DCD UnPackBits32 ; 16
DCD UnCompLZ77Byte ; 17
DCD UnCompLZ77Short ; 18
DCD UnCompHuffman32 ; 19
DCD UnCompRLByte ; 20
DCD UnCompRLShort ; 21
DCD 0 ; 22
DCD 0 ; 23
DCD 0 ; 24
DCD 0 ; 25
DCD GetSoundSinTable ; 26
DCD GetSoundPitchTable ; 27
DCD GetSoundVolumeTable ; 28
DCD GetFuncp4IPL2 ; 29
DCD 0 ; 30
DCD SetPauseHi ; 31
END

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,28 @@
//======================================================================
// IrisSubp.h
// IRISサブプロセッサ 標準ヘッダファイル群
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_SUBP_H
#define _IRIS_SUBP_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisSubpTypes.h>
#include <IrisSubpDefine.h>
#include <IrisSubpMemoryMap.h>
#include <IrisSubpMacro.h>
#include <IrisSubpSystemCall.h>
#include <IrisSubpUTL.h>
#include <IrisSubpOS.h>
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_SUBP_H

View File

@ -0,0 +1,522 @@
//======================================================================
// IrisSubpDefine.h
// IRISサブプロセッサ 標準定数
//
// Copyright (C) 2002-2004 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_SUBP_DEFINE_H
#define _IRIS_SUBP_DEFINE_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisSubpTarget.h>
//----------------------------------------------------------------------
// 定数
//----------------------------------------------------------------------
#define SYSTEM_CLOCK 33513982 // システムクロック
#define MAINP 0 // メインプロセッサ
#define SUBP 1 // サブプロセッサ
#define ON 1
#define OFF 0
#define ENABLE 1
#define DISABLE 0
#define TRUE 1
#define FALSE 0
//**********************************************************************
// IRISサブプロセッサレジスタ・コントロールビット
//**********************************************************************
//----------------------------------------------------------------------
// プログラムステータスレジスタ
//----------------------------------------------------------------------
#define PSR_CPU_MODE_MASK 0x1f // CPUモード
#define PSR_USER_MODE 0x10 // ユーザ
#define PSR_FIQ_MODE 0x11 //
#define PSR_IRQ_MODE 0x12 //
#define PSR_SVC_MODE 0x13 // スーパバイザ
#define PSR_ABORT_MODE 0x17 // アボート(プリフェッチ/データ)
#define PSR_UNDEF_MODE 0x1b // 未定義命令
#define PSR_SYS_MODE 0x1f // システム
#define PSR_THUMB_STATE 0x20 // THUMBステート
#define PSR_FIQ_DISABLE 0x40 // FIQ不許可
#define PSR_IRQ_DISABLE 0x80 // IRQ不許可
#define PSR_IRQ_FIQ_DISABLE 0xc0 // IRQ&FIQ不許可
#define PSR_V_FLAG 0x10000000 // オーバーフロー
#define PSR_C_FLAG 0x20000000 // キャリー/ボロー/拡張
#define PSR_Z_FLAG 0x40000000 // ゼロ
#define PSR_N_FLAG 0x80000000 // 負/未満
// 構造体メンバ用定数
#define ST_PSR_USER_MODE 0x10 // ユーザ
#define ST_PSR_FIQ_MODE 0x11 //
#define ST_PSR_IRQ_MODE 0x12 //
#define ST_PSR_SVC_MODE 0x13 // スーパバイザ
#define ST_PSR_ABORT_MODE 0x17 // アボート(プリフェッチ/データ)
#define ST_PSR_UNDEF_MODE 0x1b // 未定義命令
#define ST_PSR_SYS_MODE 0x1f // システム
//----------------------------------------------------------------------
// 割り込み要求/許可フラグ
//----------------------------------------------------------------------
#define V_BLANK_INTR_FLAG 0x00000001 // Vブランク割り込み
#define H_BLANK_INTR_FLAG 0x00000002 // Hブランク割り込み
#define V_COUNT_INTR_FLAG 0x00000004 // Vカウンタ一致割り込み
#define TIMER0_INTR_FLAG 0x00000008 // タイマー0割り込み
#define TIMER1_INTR_FLAG 0x00000010 // タイマー1割り込み
#define TIMER2_INTR_FLAG 0x00000020 // タイマー2割り込み
#define TIMER3_INTR_FLAG 0x00000040 // タイマー3割り込み
#define SIO_INTR_FLAG 0x00000080 // シリアル通信割り込み
#define DMA0_INTR_FLAG 0x00000100 // DMA0割り込み
#define DMA1_INTR_FLAG 0x00000200 // DMA1割り込み
#define DMA2_INTR_FLAG 0x00000400 // DMA2割り込み
#define DMA3_INTR_FLAG 0x00000800 // DMA3割り込み
#define KEY_INTR_FLAG 0x00001000 // キー割り込み
#define CARTRIDGE_INTR_FLAG 0x00002000 // カートリッジ割り込み
#define MAINP_INTR_FLAG 0x00010000 // メインプロセッサ割り込み
#define MPFIFO_SEND_INTR_FLAG 0x00020000 // メインプロセッサ間送信FIFOエンプティ割り込み
#define MPFIFO_RECV_INTR_FLAG 0x00040000 // メインプロセッサ間受信FIFOノットエンプティ割り込み
#define CARD_DATA_INTR_FLAG 0x00080000 // カードデータ転送終了割り込み
#define CARD_IREQ_INTR_FLAG 0x00100000 // カードIREQ割り込み
#define PMIC_RTC_INTR_FLAG 0x00400000 // パワーマネージメントIC割り込み 又は RTC割り込み
#define SPI_INTR_FLAG 0x00800000 // SPI割り込み
#define WIRELESS_INTR_FLAG 0x01000000 // 無線通信割り込み
//----------------------------------------------------------------------
// メインプロセッサ インタフェース
//----------------------------------------------------------------------
#define MAINP_RECV_STATUS_MASK 0x000f // 受信ステータス
#define MAINP_SEND_STATUS_MASK 0x0f00 // 送信ステータス
#define MAINP_RECV_STATUS_SHIFT 0
#define MAINP_SEND_STATUS_SHIFT 8
#define MAINP_SEND_IF 0x2000 // 割り込み要求送信
#define MAINP_RECV_IF_ENABLE 0x4000 // 割り込み要求受信 許可
//----------------------------------------------------------------------
// メイン通信プロセッサFIFO コントロール
//----------------------------------------------------------------------
#define MPFIFO_SEND_EMPTY 0x0001 // 送信FIFO エンプティ
#define MPFIFO_SEND_FULL 0x0002 // フル
#define MPFIFO_SEND_IF_ENABLE 0x0004 // 割り込み要求 許可
#define MPFIFO_SEND_CLEAR 0x0008 // クリア
#define MPFIFO_RECV_EMPTY 0x0100 // 受信FIFO エンプティ
#define MPFIFO_RECV_FULL 0x0200 // フル
#define MPFIFO_RECV_IF_ENABLE 0x0400 // 割り込み要求 許可
#define MPFIFO_ENABLE 0x8000 // I/OプロセッサFIFO イネーブル
//----------------------------------------------------------------------
// パワーコントロール
//----------------------------------------------------------------------
#define POW_SOUND_ON 0x0001 // サウンド
#define POW_WIRELESS_ON 0x0002 // 無線通信
#define POW_ALL_ON 0x0003 // 全部
//----------------------------------------------------------------------
// ステータス
//----------------------------------------------------------------------
#define VRAM_MAINP_ALL 0x00 // VRAM-C・D → メインプロセッサ
#define VRAM_MAINP_D_SUBP_C 0x01 // → メインプロセッサ
// → サブプロセッサ
#define VRAM_MAINP_C_SUBP_D 0x02 // → メインプロセッサ
// → サブプロセッサ
#define VRAM_SUBP_ALL 0x03 // C・D → サブプロセッサ
//----------------------------------------------------------------------
// 内部ワークRAM ステータス
//----------------------------------------------------------------------
#define WRAM_MAINP_ALL 0x00 // 共有内部ワークRAMブロック0・1 → メインプロセッサ
#define WRAM_MAINP_B1_SUBP_B0 0x01 // ブロック1 → メインプロセッサ
// ブロック0 → サブプロセッサ
#define WRAM_MAINP_B0_SUBP_B1 0x02 // ブロック0 → メインプロセッサ
// ブロック1 → サブプロセッサ
#define WRAM_SUBP_ALL 0x03 // ブロック0・1 → サブプロセッサ
//----------------------------------------------------------------------
// 表示ステータス
//----------------------------------------------------------------------
#define DPSTAT_V_SET_LO_MASK 0xff00 // Vカウンタ比較値設定
#define DPSTAT_V_SET_D8 0x0080 // Vカウンタ比較値設定8ビット目
#define DPSTAT_V_SET_LO_SHIFT 8
#define DPSTAT_V_BLANK 0x0001 // Vブランク期間中
#define DPSTAT_H_BLANK 0x0002 // Hブランク期間中
#define DPSTAT_V_COUNT 0x0004 // Vカウンタ一致中
#define DPSTAT_V_BLANK_IF_ENABLE 0x0008 // Vブランク割り込み要求 許可
#define DPSTAT_H_BLANK_IF_ENABLE 0x0010 // Hブランク割り込み要求 許可
#define DPSTAT_V_COUNT_IF_ENABLE 0x0020 // Vカウンタ一致割り込み要求 許可
//----------------------------------------------------------------------
// サウンドマスタ コントロール
//----------------------------------------------------------------------
#define SOUND_VOLUME_MASK 0x007f // マスタ出力レベル
#define SOUND_VOLUME_SHIFT 0
#define SOUND_LOUT_MIXER 0x0000 // L側最終段出力 ミキサー
#define SOUND_LOUT_CH1 0x0100 // チャンネル1
#define SOUND_LOUT_CH3 0x0200 // チャンネル3
#define SOUND_LOUT_CH1_CH3 0x0300 // チャンネル1+3
#define SOUND_ROUT_MIXER 0x0000 // R側最終段出力 ミキサー
#define SOUND_ROUT_CH1 0x0400 // チャンネル1
#define SOUND_ROUT_CH3 0x0800 // チャンネル3
#define SOUND_ROUT_CH1_CH3 0x0C00 // チャンネル1+3
#define SOUND_CH1_MIXOFF 0x1000 // チャンネル1・ミックス
#define SOUND_CH1_MIX 0x0000 //
#define SOUND_CH3_MIXOFF 0x2000 // チャンネル3・ミックス
#define SOUND_CH3_MIX 0x0000 //
#define SOUND_MIC_MIXOFF 0x0000 // マイク・ミックス
#define SOUND_MIC_MIX 0x4000 //
#define SOUND_ENABLE 0x8000 // イネーブル
//----------------------------------------------------------------------
// サウンドチャンネル コントロール
//----------------------------------------------------------------------
#define SOUND_CHAN_VOLUME_MASK 0x000000ff // 出力レベル
#define SOUND_SHIFT_MASK 0x00000300 // データシフト量
#define SOUND_PANPOT_MASK 0x00ff0000 // パンポット
#define SOUND_DUTY_MASK 0x07000000 // デューティ
#define SOUND_PEPEAT_TYPE_MASK 0x18000000 // リピート方法
#define SOUND_FORMAT_MASK 0x60000000 // フォーマット
#define SOUND_CHAN_VOLUME_SHIFT 0
#define SOUND_SHIFT_SHIFT 8
#define SOUND_PANPOT_SHIFT 16
#define SOUND_DUTY_SHIFT 24
#define SOUND_PEPEAT_TYPE_SHIFT 27
#define SOUND_FORMAT_SHIFT 29
#define SOUND_OUTPUT_HOLD 0x00008000 // ディセーブル時の出力保持
#define SOUND_DUTY_1_8 0x00000000 // デューティ
#define SOUND_DUTY_2_8 0x01000000 //
#define SOUND_DUTY_3_8 0x02000000 //
#define SOUND_DUTY_4_8 0x03000000 //
#define SOUND_DUTY_5_8 0x04000000 //
#define SOUND_DUTY_6_8 0x05000000 //
#define SOUND_DUTY_7_8 0x06000000 //
#define SOUND_DUTY_XX 0x07000000 // 設定禁止
#define SOUND_LINEAR 0x00000000 // リニア再生
#define SOUND_REPEAT 0x08000000 // リピート再生
#define SOUND_1SHOT 0x10000000 // 1ショット再生
#define SOUND_PCM8 0x00000000 //
#define SOUND_PCM16 0x20000000 //
#define SOUND_ADPCM 0x40000000 //
#define SOUND_PSG_NOISE 0x60000000 // PSG(8~13)または ノイズ(14~15)
#define SOUND_CHAN_ENABLE 0x80000000 // イネーブル
// 構造体メンバ用定数
#define ST_SOUND_PCM8 0 //
#define ST_SOUND_PCM16 1 //
#define ST_SOUND_ADPCM 2 //
#define ST_SOUND_PSG_NOISE 3 // PSG(8~13)または ノイズ(14~15)
#define ST_SOUND_DUTY_1_8 0 // デューティ
#define ST_SOUND_DUTY_2_8 1 //
#define ST_SOUND_DUTY_3_8 2 //
#define ST_SOUND_DUTY_4_8 3 //
#define ST_SOUND_DUTY_5_8 4 //
#define ST_SOUND_DUTY_6_8 5 //
#define ST_SOUND_DUTY_7_8 6 //
#define ST_SOUND_DUTY_XX 7 // 設定禁止
//----------------------------------------------------------------------
// サウンドキャプチャ コントロール
//----------------------------------------------------------------------
#define SNDCAP_PREMIXING_ON 0x01 // ミキサー前合成
#define SNDCAP_SRC 0x02 // キャプチャ元選択
#define SNDCAP_MIXER 0x00 // ミキサー出力データをキャプチャ
#define SNDCAP_CHAN 0x02 // 単一チャンネルをキャプチャ
#define SNDCAP_REPEAT_OFF 0x04 // リピート
#define SNDCAP_FORMAT 0x08 // キャプチャフォーマット
#define SNDCAP_PCM16 0x00 //
#define SNDCAP_PCM8 0x08 //
#define SNDCAP_ENABLE 0x80 // イネーブル
//----------------------------------------------------------------------
// SPIコントロール
//----------------------------------------------------------------------
#define SPI_SCK_MASK 0x0003 // シフトクロック
#ifdef IRIS_TS
#define SPI_TARGET_MASK 0x0300 // 通信ターゲット指定
#else
#define SPI_TARGET_MASK 0x2000
#endif
#define SPI_SCK_SHIFT 0
#define SPI_SCK_4M 0x0000 // シフトクロック 4MHz選択
#define SPI_SCK_2M 0x0001 //
#define SPI_SCK_1M 0x0002 //
#define SPI_SCK_524K 0x0003 //
#define SPI_BUSY 0x0080 // ビジー
#define SPI_8BIT_MODE 0x0000 // 8ビットモード
#ifdef IRIS_TS
#define SPI_16BIT_MODE 0x0400 // 16ビットモード
#define SPI_CONTINUOUS_ON 0x0800 // コンティニュアスモード
#define SPI_TARGET_PMIC 0x0000 // PMIC選択
#define SPI_TARGET_FLASH 0x0100 // フラッシュメモリ選択
#define SPI_TARGET_TOUCHPANEL 0x0200 // タッチパネル選択
#else
#define SPI_CONTINUOUS_ON 0x1000 // コンティニュアスモード
#define SPI_TARGET_PMIC 0x0000 // PMIC選択
#define SPI_TARGET_FLASH 0x2000 // フラッシュメモリ選択
#endif
#define SPI_IF_ENABLE 0x4000 // 割り込み要求 許可
#define SPI_ENABLE 0x8000 // SPI許可
// 構造体メンバ用定数
#define ST_SPI_SCK_4M 0 // シフトクロック 4MHz選択
#define ST_SPI_SCK_2M 1 //
#define ST_SPI_SCK_1M 2 //
#define ST_SPI_SCK_524K 3 //
#ifdef IRIS_TS
#define ST_SPI_TARGET_PMIC 0 // PMIC選択
#define ST_SPI_TARGET_FLASH 1 // フラッシュメモリ選択
#define ST_SPI_TARGET_TOUCHPANEL 2 // タッチパネル選択
#else
#define ST_SPI_TARGET_PMIC 0 // PMIC選択
#define ST_SPI_TARGET_FLASH 1 // フラッシュメモリ選択
#endif
//----------------------------------------------------------------------
// 汎用入出力コントロール
//----------------------------------------------------------------------
#define R_SIO_MODE_MASTER_MASK 0xc000 // SIOモード・マスタ
#define R_SIO_MODE_MASTER_SHIFT 14
#define R_SIO_MASTER_MODE 0x0000 // SIOマスタ・モード
#define R_DIRECT_MODE 0x8000 // 汎用入出力通信モード
#define R_SC 0x0001 // データ
#define R_SD 0x0002
#define R_SI 0x0004
#define R_SO 0x0008
#define R_SC_I_O 0x0010 // /O選択
#define R_SD_I_O 0x0020
#define R_SI_I_O 0x0040
#define R_SO_I_O 0x0080
#define R_SC_IN 0x0000 // 入力設定
#define R_SD_IN 0x0000
#define R_SI_IN 0x0000
#define R_SO_IN 0x0000
#define R_SC_OUT 0x0010 // 出力設定
#define R_SD_OUT 0x0020
#define R_SI_OUT 0x0040
#define R_SO_OUT 0x0080
#define R_IF_ENABLE 0x0100 // 割り込み要求 許可
// 構造体メンバ用定数
#define ST_R_SIO_MASTER_MODE 0 // SIOマスタ・モード
#define ST_R_DIRECT_MODE 2 // 汎用入出力通信モード
#define ST_R_IN 0 // 入力選択
#define ST_R_OUT 1 // 出力選択
//----------------------------------------------------------------------
// DMAコントロール
//----------------------------------------------------------------------
#define DMA_TIMMING_MASK 0x30000000 // 開始タイミング
#define DMA_COUNT_MASK 0x0000ffff // 転送数
#define DMA_TIMMING_SHIFT 30
#define DMA_COUNT_SHIFT 0
#define DMA_ENABLE 0x80000000 // DMA許可
#define DMA_IF_ENABLE 0x40000000 // 割り込み要求 許可
#define DMA_TIMMING_IMM 0x00000000 // 直ちに起動
#define DMA_TIMMING_V_BLANK 0x10000000 // Vブランク起動
#define DMA_TIMMING_CARD 0x20000000 // カード
#define DMA_TIMMING_WIRELESS 0x30000000 // 無線通信
#define DMA_TIMMING_CARTRIDGE 0x30000000 // カートリッジ
#define DMA_16BIT_BUS 0x00000000 // バスサイズ16Bit選択
#define DMA_32BIT_BUS 0x04000000 // バスサイズ32Bit選択
#define DMA_CONTINUOUS_ON 0x02000000 // コンティニュアスモード
#define DMA_SRC_INC 0x00000000 // 転送元 インクリメント 選択
#define DMA_SRC_DEC 0x00800000 // 転送元 デクリメント 選択
#define DMA_SRC_FIX 0x01000000 // 転送元 固定 選択
#define DMA_DEST_INC 0x00000000 // 転送先 インクリメント 選択
#define DMA_DEST_DEC 0x00200000 // 転送先 デクリメント 選択
#define DMA_DEST_FIX 0x00400000 // 転送先 固定 選択
#define DMA_DEST_RELOAD 0x00600000 // 転送先 インクリメント/リロード 選択
// 構造体メンバ用定数
#define ST_DMA_TIMMING_IMM 0 // 直ちに起動
#define ST_DMA_TIMMING_V_BLANK 1 // Vブランク起動
#define ST_DMA_TIMMING_CARD 2 // カード
#define ST_DMA_TIMMING_CARTRIDGE 3 // カートリッジ
#define ST_DMA_16BIT_BUS 0 // バスサイズ16bit選択
#define ST_DMA_32BIT_BUS 1 // バスサイズ32bit選択
#define ST_DMA_INC 0 // アドレス・インクリメント 選択
#define ST_DMA_DEC 1 // アドレス・デクリメント 選択
#define ST_DMA_FIX 2 // アドレス固定 選択
#define ST_DMA_RELOAD 3 // アドレス・インクリメント/リロード 選択
//----------------------------------------------------------------------
// タイマー コントロール
//----------------------------------------------------------------------
#define TMR_PRESCALER_MASK 0x00030000 // プリスケーラ クロック
#define TMR_PRESCALER_SHIFT 16
#define TMR_PRESCALER_1CK 0x00000000 // プリスケーラ 1分周
#define TMR_PRESCALER_64CK 0x00010000 // 64分周
#define TMR_PRESCALER_256CK 0x00020000 // 256分周
#define TMR_PRESCALER_1024CK 0x00030000 // 1024分周
#define TMR_CONNECT 0x00040000 // 下位タイマー接続
#define TMR_IF_ENABLE 0x00400000 // 割り込み要求 許可
#define TMR_ENABLE 0x00800000 // タイマー起動
// 構造体メンバ用定数
#define ST_TMR_PRESCALER_1CK 0 // プリスケーラ 1分周
#define ST_TMR_PRESCALER_64CK 1 // 64分周
#define ST_TMR_PRESCALER_256CK 2 // 256分周
#define ST_TMR_PRESCALER_1024CK 3 // 1024分周
//----------------------------------------------------------------------
// キー
//----------------------------------------------------------------------
#define BUTTON_MASK 0x030f // ボタン
#define PLUS_KEY_MASK 0x00f0 // 十字キー
#define ALL_KEY_MASK 0x03ff // 全てのキー
#define A_BUTTON 0x0001 // Aボタン
#define B_BUTTON 0x0002 // Bボタン
#define SELECT_BUTTON 0x0004 // セレクトボタン
#define START_BUTTON 0x0008 // スタートボタン
#define R_KEY 0x0010 // 右ボタン
#define L_KEY 0x0020 // 左ボタン
#define U_KEY 0x0040 // 上ボタン
#define D_KEY 0x0080 // 下ボタン
#define R_BUTTON 0x0100 // Rボタン
#define L_BUTTON 0x0200 // Lボタン
#define KEY_IF_ENABLE 0x4000 // 割り込み要求 許可
#define KEY_OR_INTR 0x0000 // 通常キー割り込み
#define KEY_AND_INTR 0x8000 // ANDキー割り込み
// 構造体メンバ用定数
#define ST_KEY_OR_INTR 0 // 通常キー割り込み
#define ST_KEY_AND_INTR 1 // ANDキー割り込み
//----------------------------------------------------------------------
// 外部メモリ コントロール
//----------------------------------------------------------------------
#define CTRDG_DT8_10CYC 0x0000 // カートリッジ 8bitデータバス 10サイクル
#define CTRDG_DT8_8CYC 0x0001 // 8サイクル
#define CTRDG_DT8_6CYC 0x0002 // 6サイクル
#define CTRDG_DT8_18CYC 0x0003 // 18サイクル
#define CTRDG_AD16_1ST_10CYC 0x0000 // カートリッジ AD16バス 10サイクル
#define CTRDG_AD16_1ST_8CYC 0x0004 // 8サイクル
#define CTRDG_AD16_1ST_6CYC 0x0008 // 6サイクル
#define CTRDG_AD16_1ST_18CYC 0x000c // 18サイクル
#define CTRDG_AD16_2ND_6CYC 0x0000 // 6サイクル
#define CTRDG_AD16_2ND_4CYC 0x0010 // 4サイクル
#define CTRDG_PHI_OUT_NONE 0x0000 // φ端子出力クロック Lo固定
#define CTRDG_PHI_OUT_4MCK 0x0020 //
#define CTRDG_PHI_OUT_8MCK 0x0040 //
#define CTRDG_PHI_OUT_16MCK 0x0060 //
#define CTRDG_ACCESS 0x0080 // カートリッジアクセス権
#define CTRDG_ACCESS_MAINP 0x0000 // メインプロセッサ
#define CTRDG_ACCESS_SUBP 0x0080 // サブプロセッサ
#define CARD_ACCESS 0x0800 // カードアクセス権
#define CARD_ACCESS_MAINP 0x0000 // メインプロセッサ
#define CARD_ACCESS_SUBP 0x0800 // サブプロセッサ
#define MMEM_CE2_OUT 0x2000 // CE2信号確認
#define MMEM_INTF 0x4000 // メインメモリインタフェース(TEGでは常にセットして同期モードにする)
#define MMEM_INTF_ASYNC 0x0000 // 非同期モード
#define MMEM_INTF_SYNC 0x4000 // 同期モード
#define MMEM_PRIORITY 0x8000 // メインメモリ優先権
#define MMEM_PRIORITY_MAINP 0x0000 // メインプロセッサ
#define MMEM_PRIORITY_SUBP 0x8000 // サブプロセッサ
// 構造体メンバ用定数
#define ST_CTRDG_DT8_10CYC 0 // カートリッジ 8bitデータバス 10サイクル
#define ST_CTRDG_DT8_8CYC 1 // 8サイクル
#define ST_CTRDG_DT8_6CYC 2 // 6サイクル
#define ST_CTRDG_DT8_18CYC 3 // 18サイクル
#define ST_CTRDG_AD16_1ST_10CYC 0 // カートリッジ AD16バス 10サイクル
#define ST_CTRDG_AD16_1ST_8CYC 1 // 8サイクル
#define ST_CTRDG_AD16_1ST_6CYC 2 // 6サイクル
#define ST_CTRDG_AD16_1ST_18CYC 3 // 18サイクル
#define ST_CTRDG_AD16_2ND_6CYC 0 // 6サイクル
#define ST_CTRDG_AD16_2ND_4CYC 1 // 4サイクル
#define ST_CTRDG_PHI_OUT_NONE 0 // φ端子出力クロック Lo固定
#define ST_CTRDG_PHI_OUT_4MCK 1 //
#define ST_CTRDG_PHI_OUT_8MCK 2 //
#define ST_CTRDG_PHI_OUT_16MCK 3 //
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_SUBP_DEFINE_H

View File

@ -0,0 +1,513 @@
;=======================================================================
; IrisSubpDefineArm.s
; IRISサブプロセッサ 標準定数ARMASM用
;
; Copyright (C) 2002-2004 NINTENDO Co.,Ltd.
;=======================================================================
IF :DEF: _IRIS_SUBP_DEFINE_H
ELSE
_IRIS_SUBP_DEFINE_H * 1
INCLUDE IrisSubpTargetArm.s
;-----------------------------------------------------------------------
; 定数
;-----------------------------------------------------------------------
SYSTEM_CLOCK * 33513982 ; システムクロック
MAINP * 0 ; メインプロセッサ
SUBP * 1 ; サブプロセッサ
ON * 1
OFF * 0
ENABLE * 1
DISABLE * 0
TRUE * 1
FALSE * 0
;***********************************************************************
; IRIS-IOPレジスタ・コントロールビット
;***********************************************************************
;-----------------------------------------------------------------------
; プログラムステータスレジスタ
;-----------------------------------------------------------------------
PSR_CPU_MODE_MASK * 0x1f ; CPUモード
PSR_USER_MODE * 0x10 ; ユーザ
PSR_FIQ_MODE * 0x11 ;
PSR_IRQ_MODE * 0x12 ;
PSR_SVC_MODE * 0x13 ; スーパバイザ
PSR_ABORT_MODE * 0x17 ; アボート(プリフェッチ/データ)
PSR_UNDEF_MODE * 0x1b ; 未定義命令
PSR_SYS_MODE * 0x1f ; システム
PSR_THUMB_STATE * 0x20 ; THUMBステート
PSR_FIQ_DISABLE * 0x40 ; FIQ不許可
PSR_IRQ_DISABLE * 0x80 ; IRQ不許可
PSR_IRQ_FIQ_DISABLE * 0xc0 ; IRQ&FIQ不許可
PSR_V_FLAG * 0x10000000 ; オーバーフロー
PSR_C_FLAG * 0x20000000 ; キャリー/ボロー/拡張
PSR_Z_FLAG * 0x40000000 ; ゼロ
PSR_N_FLAG * 0x80000000 ; 負/未満
; 構造体メンバ用定数
ST_PSR_USER_MODE * 0x10 ; ユーザ
ST_PSR_FIQ_MODE * 0x11 ;
ST_PSR_IRQ_MODE * 0x12 ;
ST_PSR_SVC_MODE * 0x13 ; スーパバイザ
ST_PSR_ABORT_MODE * 0x17 ; アボート(プリフェッチ/データ)
ST_PSR_UNDEF_MODE * 0x1b ; 未定義命令
ST_PSR_SYS_MODE * 0x1f ; システム
;-----------------------------------------------------------------------
; 割り込み要求/許可フラグ
;-----------------------------------------------------------------------
V_BLANK_INTR_FLAG * 0x00000001 ; Vブランク割り込み
H_BLANK_INTR_FLAG * 0x00000002 ; Hブランク割り込み
V_COUNT_INTR_FLAG * 0x00000004 ; Vカウンタ一致割り込み
TIMER0_INTR_FLAG * 0x00000008 ; タイマー0割り込み
TIMER1_INTR_FLAG * 0x00000010 ; タイマー1割り込み
TIMER2_INTR_FLAG * 0x00000020 ; タイマー2割り込み
TIMER3_INTR_FLAG * 0x00000040 ; タイマー3割り込み
SIO_INTR_FLAG * 0x00000080 ; シリアル通信割り込み
DMA0_INTR_FLAG * 0x00000100 ; DMA0割り込み
DMA1_INTR_FLAG * 0x00000200 ; DMA1割り込み
DMA2_INTR_FLAG * 0x00000400 ; DMA2割り込み
DMA3_INTR_FLAG * 0x00000800 ; DMA3割り込み
KEY_INTR_FLAG * 0x00001000 ; キー割り込み
CARTRIDGE_INTR_FLAG * 0x00002000 ; カートリッジ割り込み
MAINP_INTR_FLAG * 0x00010000 ; メインプロセッサ割り込み
MPFIFO_SEND_INTR_FLAG * 0x00020000 ; メインプロセッサ間送信FIFOエンプティ割り込み
MPFIFO_RECV_INTR_FLAG * 0x00040000 ; メインプロセッサ間受信FIFOノットエンプティ割り込み
CARD_DATA_INTR_FLAG * 0x00080000 ; カードデータ転送終了割り込み
CARD_IREQ_INTR_FLAG * 0x00100000 ; カードIREQ割り込み
PMIC_RTC_INTR_FLAG * 0x00400000 ; パワーマネージメントIC割り込み 又は RTC割り込み
SPI_INTR_FLAG * 0x00800000 ; SPI割り込み
WIRELESS_INTR_FLAG * 0x01000000 ; 無線通信割り込み
;-----------------------------------------------------------------------
; メインプロセッサ インタフェース
;-----------------------------------------------------------------------
MAINP_RECV_STATUS_MASK * 0x000f ; 受信ステータス
MAINP_SEND_STATUS_MASK * 0x0f00 ; 送信ステータス
MAINP_RECV_STATUS_SHIFT * 0
MAINP_SEND_STATUS_SHIFT * 8
MAINP_SEND_IF * 0x2000 ; 割り込み要求送信
MAINP_RECV_IF_ENABLE * 0x4000 ; 割り込み要求受信 許可
;-----------------------------------------------------------------------
; メインプロセッサ通信FIFO コントロール
;-----------------------------------------------------------------------
MPFIFO_SEND_EMPTY * 0x0001 ; 送信FIFO エンプティ
MPFIFO_SEND_FULL * 0x0002 ; フル
MPFIFO_SEND_IF_ENABLE * 0x0004 ; 割り込み要求 許可
MPFIFO_SEND_CLEAR * 0x0008 ; クリア
MPFIFO_RECV_EMPTY * 0x0100 ; 受信FIFO エンプティ
MPFIFO_RECV_FULL * 0x0200 ; フル
MPFIFO_RECV_IF_ENABLE * 0x0400 ; 割り込み要求 許可
MPFIFO_ENABLE * 0x8000 ; I/OプロセッサFIFO イネーブル
;-----------------------------------------------------------------------
; パワーコントロール
;-----------------------------------------------------------------------
POW_SOUND_ON * 0x0001 ; サウンド
;-----------------------------------------------------------------------
; ステータス
;-----------------------------------------------------------------------
VRAM_MAINP_ALL * 0x00 ; VRAM-C・D → メインプロセッサ
VRAM_MAINP_D_SUBP_C * 0x01 ; → メインプロセッサ
; → サブプロセッサ
VRAM_MAINP_C_SUBP_D * 0x02 ; → メインプロセッサ
; → サブプロセッサ
VRAM_SUBP_ALL * 0x03 ; C・D → サブプロセッサ
;-----------------------------------------------------------------------
; 内部ワークRAM ステータス
;-----------------------------------------------------------------------
WRAM_MAINP_ALL * 0x00 ; 共有内部ワークRAMブロック0・1 → メインプロセッサ
WRAM_MAINP_B1_SUBP_B0 * 0x01 ; ブロック1 → メインプロセッサ
; ブロック0 → サブプロセッサ
WRAM_MAINP_B0_SUBP_B1 * 0x02 ; ブロック0 → メインプロセッサ
; ブロック1 → サブプロセッサ
WRAM_SUBP_ALL * 0x03 ; ブロック0・1 → サブプロセッサ
;-----------------------------------------------------------------------
; 表示ステータス
;-----------------------------------------------------------------------
DPSTAT_V_SET_LO_MASK * 0xff00 ; Vカウンタ比較値設定
DPSTAT_V_SET_D8 * 0x0080 ; Vカウンタ比較値設定8ビット目
DPSTAT_V_SET_LO_SHIFT * 8
DPSTAT_V_BLANK * 0x0001 ; Vブランク期間中
DPSTAT_H_BLANK * 0x0002 ; Hブランク期間中
DPSTAT_V_COUNT * 0x0004 ; Vカウンタ一致中
DPSTAT_V_BLANK_IF_ENABLE * 0x0008 ; Vブランク割り込み要求 許可
DPSTAT_H_BLANK_IF_ENABLE * 0x0010 ; Hブランク割り込み要求 許可
DPSTAT_V_COUNT_IF_ENABLE * 0x0020 ; Vカウンタ一致割り込み要求 許可
;-----------------------------------------------------------------------
; サウンドマスタ コントロール
;-----------------------------------------------------------------------
SOUND_VOLUME_MASK * 0x007f ; マスタ出力レベル
SOUND_VOLUME_SHIFT * 0
SOUND_LOUT_MIXER * 0x0000 ; L側最終段出力 ミキサー
SOUND_LOUT_CH1 * 0x0100 ; チャンネル1
SOUND_LOUT_CH3 * 0x0200 ; チャンネル3
SOUND_LOUT_CH1_CH3 * 0x0300 ; チャンネル1+3
SOUND_ROUT_MIXER * 0x0000 ; R側最終段出力 ミキサー
SOUND_ROUT_CH1 * 0x0400 ; チャンネル1
SOUND_ROUT_CH3 * 0x0800 ; チャンネル3
SOUND_ROUT_CH1_CH3 * 0x0C00 ; チャンネル1+3
SOUND_CH1_MIXOFF * 0x1000 ; チャンネル1・ミックス
SOUND_CH1_MIX * 0x0000 ;
SOUND_CH3_MIXOFF * 0x2000 ; チャンネル3・ミックス
SOUND_CH3_MIX * 0x0000 ;
SOUND_ENABLE * 0x8000 ; イネーブル
;-----------------------------------------------------------------------
; サウンドチャンネル コントロール
;-----------------------------------------------------------------------
SOUND_CHAN_VOLUME_MASK * 0x000000ff ; 出力レベル
SOUND_SHIFT_MASK * 0x00000300 ; データシフト量
SOUND_PANPOT_MASK * 0x00ff0000 ; パンポット
SOUND_DUTY_MASK * 0x07000000 ; デューティ
SOUND_PEPEAT_TYPE_MASK * 0x18000000 ; リピート方法
SOUND_FORMAT_MASK * 0x60000000 ; フォーマット
SOUND_CHAN_VOLUME_SHIFT * 0
SOUND_SHIFT_SHIFT * 8
SOUND_PANPOT_SHIFT * 16
SOUND_DUTY_SHIFT * 24
SOUND_PEPEAT_TYPE_SHIFT * 27
SOUND_FORMAT_SHIFT * 29
SOUND_OUTPUT_HOLD * 0x00008000 ; ディセーブル時の出力保持
SOUND_DUTY_1_8 * 0x00000000 ; デューティ
SOUND_DUTY_2_8 * 0x01000000 ;
SOUND_DUTY_3_8 * 0x02000000 ;
SOUND_DUTY_4_8 * 0x03000000 ;
SOUND_DUTY_5_8 * 0x04000000 ;
SOUND_DUTY_6_8 * 0x05000000 ;
SOUND_DUTY_7_8 * 0x06000000 ;
SOUND_DUTY_XX * 0x07000000 ; 設定禁止
SOUND_LINEAR * 0x00000000 ; リニア再生
SOUND_REPEAT * 0x08000000 ; リピート再生
SOUND_1SHOT * 0x10000000 ; 1ショット再生
SOUND_PCM8 * 0x00000000 ;
SOUND_PCM16 * 0x20000000 ;
SOUND_ADPCM * 0x40000000 ;
SOUND_PSG_NOISE * 0x60000000 ; PSG(8~13)または ノイズ(14~15)
SOUND_CHAN_ENABLE * 0x80000000 ; イネーブル
; 構造体メンバ用定数
ST_SOUND_PCM8 * 0 ;
ST_SOUND_PCM16 * 1 ;
ST_SOUND_ADPCM * 2 ;
ST_SOUND_PSG_NOISE * 3 ; PSG(8~13)または ノイズ(14~15)
ST_SOUND_DUTY_1_8 * 0 ; デューティ
ST_SOUND_DUTY_2_8 * 1 ;
ST_SOUND_DUTY_3_8 * 2 ;
ST_SOUND_DUTY_4_8 * 3 ;
ST_SOUND_DUTY_5_8 * 4 ;
ST_SOUND_DUTY_6_8 * 5 ;
ST_SOUND_DUTY_7_8 * 6 ;
ST_SOUND_DUTY_XX * 7 ; 設定禁止
;-----------------------------------------------------------------------
; サウンドキャプチャ コントロール
;-----------------------------------------------------------------------
SNDCAP_PREMIXING_ON * 0x01 ; ミキサー前合成
SNDCAP_SRC * 0x02 ; キャプチャ元選択
SNDCAP_MIXER * 0x00 ; ミキサー出力データをキャプチャ
SNDCAP_CHAN * 0x02 ; 単一チャンネルをキャプチャ
SNDCAP_REPEAT_OFF * 0x04 ; リピート
SNDCAP_FORMAT * 0x08 ; キャプチャフォーマット
SNDCAP_PCM16 * 0x00 ;
SNDCAP_PCM8 * 0x08 ;
SNDCAP_ENABLE * 0x80 ; イネーブル
;-----------------------------------------------------------------------
; SPIコントロール
;-----------------------------------------------------------------------
SPI_SCK_MASK * 0x0003 ; シフトクロック
IF :DEF: IRIS_TS
SPI_TARGET_MASK * 0x0300 ; 通信ターゲット指定
ELSE
SPI_TARGET_MASK * 0x2000
ENDIF
SPI_SCK_SHIFT * 0
SPI_SCK_4M * 0x0000 ; シフトクロック 4MHz選択
SPI_SCK_2M * 0x0001 ;
SPI_SCK_1M * 0x0002 ;
SPI_SCK_524K * 0x0003 ;
SPI_BUSY * 0x0080 ; ビジー
SPI_8BIT_MODE * 0x0000 ; 8ビットモード
IF :DEF: IRIS_TS
SPI_16BIT_MODE * 0x0400 ; 16ビットモード
SPI_CONTINUOUS_ON * 0x1000 ; コンティニュアスモード
SPI_TARGET_PMIC * 0x0000 ; PMIC選択
SPI_TARGET_FLASH * 0x1000 ; フラッシュメモリ選択
SPI_TARGET_TOUCHPANEL * 0x2000 ; タッチパネル選択
ELSE
SPI_CONTINUOUS_ON * 0x1000 ; コンティニュアスモード
SPI_TARGET_PMIC * 0x0000 ; PMIC選択
SPI_TARGET_FLASH * 0x2000 ; フラッシュメモリ選択
ENDIF
SPI_IF_ENABLE * 0x4000 ; 割り込み要求 許可
SPI_ENABLE * 0x8000 ; SPI許可
; 構造体メンバ用定数
ST_SPI_SCK_4M * 0 ; シフトクロック 4MHz選択
ST_SPI_SCK_2M * 1 ;
ST_SPI_SCK_1M * 2 ;
ST_SPI_SCK_524K * 3 ;
IF :DEF: IRIS_TS
ST_SPI_TARGET_PMIC * 0 ; PMIC選択
ST_SPI_TARGET_FLASH * 1 ; フラッシュメモリ選択
ELSE
ST_SPI_TARGET_PMIC * 0 ; PMIC選択
ST_SPI_TARGET_FLASH * 1 ; フラッシュメモリ選択
ENDIF
;-----------------------------------------------------------------------
; 汎用入出力コントロール
;-----------------------------------------------------------------------
R_SIO_MODE_MASTER_MASK * 0xc000 ; SIOモード・マスタ
R_SIO_MODE_MASTER_SHIFT * 14
R_SIO_MASTER_MODE * 0x0000 ; SIOマスタ・モード
R_DIRECT_MODE * 0x8000 ; 汎用入出力通信モード
R_SC * 0x0001 ; データ
R_SD * 0x0002
R_SI * 0x0004
R_SO * 0x0008
R_SC_I_O * 0x0010 ; /O選択
R_SD_I_O * 0x0020
R_SI_I_O * 0x0040
R_SO_I_O * 0x0080
R_SC_IN * 0x0000 ; 入力設定
R_SD_IN * 0x0000
R_SI_IN * 0x0000
R_SO_IN * 0x0000
R_SC_OUT * 0x0010 ; 出力設定
R_SD_OUT * 0x0020
R_SI_OUT * 0x0040
R_SO_OUT * 0x0080
R_IF_ENABLE * 0x0100 ; 割り込み要求 許可
; 構造体メンバ用定数
ST_R_SIO_MASTER_MODE * 0 ; SIOマスタ・モード
ST_R_DIRECT_MODE * 2 ; 汎用入出力通信モード
ST_R_IN * 0 ; 入力選択
ST_R_OUT * 1 ; 出力選択
;-----------------------------------------------------------------------
; DMAコントロール
;-----------------------------------------------------------------------
DMA_TIMMING_MASK * 0x30000000 ; 開始タイミング
DMA_COUNT_MASK * 0x0000ffff ; 転送数
DMA_TIMMING_SHIFT * 30
DMA_COUNT_SHIFT * 0
DMA_ENABLE * 0x80000000 ; DMA許可
DMA_IF_ENABLE * 0x40000000 ; 割り込み要求 許可
DMA_TIMMING_IMM * 0x00000000 ; 直ちに起動
DMA_TIMMING_V_BLANK * 0x10000000 ; Vブランク起動
DMA_TIMMING_CARD * 0x20000000 ; カード
DMA_TIMMING_WIRELESS * 0x30000000 ; 無線通信
DMA_TIMMING_CARTRIDGE * 0x30000000 ; カートリッジ
DMA_16BIT_BUS * 0x00000000 ; バスサイズ16Bit選択
DMA_32BIT_BUS * 0x04000000 ; バスサイズ32Bit選択
DMA_CONTINUOUS_ON * 0x02000000 ; コンティニュアスモード
DMA_SRC_INC * 0x00000000 ; 転送元 インクリメント 選択
DMA_SRC_DEC * 0x00800000 ; 転送元 デクリメント 選択
DMA_SRC_FIX * 0x01000000 ; 転送元 固定 選択
DMA_DEST_INC * 0x00000000 ; 転送先 インクリメント 選択
DMA_DEST_DEC * 0x00200000 ; 転送先 デクリメント 選択
DMA_DEST_FIX * 0x00400000 ; 転送先 固定 選択
DMA_DEST_RELOAD * 0x00600000 ; 転送先 インクリメント/リロード 選択
; 構造体メンバ用定数
ST_DMA_TIMMING_IMM * 0 ; 直ちに起動
ST_DMA_TIMMING_V_BLANK * 1 ; Vブランク起動
ST_DMA_TIMMING_CARD * 2 ; カード
ST_DMA_TIMMING_CARTRIDGE * 3 ; カートリッジ
ST_DMA_16BIT_BUS * 0 ; バスサイズ16bit選択
ST_DMA_32BIT_BUS * 1 ; バスサイズ32bit選択
ST_DMA_INC * 0 ; アドレス・インクリメント 選択
ST_DMA_DEC * 1 ; アドレス・デクリメント 選択
ST_DMA_FIX * 2 ; アドレス固定 選択
ST_DMA_RELOAD * 3 ; アドレス・インクリメント/リロード 選択
;-----------------------------------------------------------------------
; タイマー コントロール
;-----------------------------------------------------------------------
TMR_PRESCALER_MASK * 0x00030000 ; プリスケーラ クロック
TMR_PRESCALER_SHIFT * 16
TMR_PRESCALER_1CK * 0x00000000 ; プリスケーラ 1分周
TMR_PRESCALER_64CK * 0x00010000 ; 64分周
TMR_PRESCALER_256CK * 0x00020000 ; 256分周
TMR_PRESCALER_1024CK * 0x00030000 ; 1024分周
TMR_CONNECT * 0x00040000 ; 下位タイマー接続
TMR_IF_ENABLE * 0x00400000 ; 割り込み要求 許可
TMR_ENABLE * 0x00800000 ; タイマー起動
; 構造体メンバ用定数
ST_TMR_PRESCALER_1CK * 0 ; プリスケーラ 1分周
ST_TMR_PRESCALER_64CK * 1 ; 64分周
ST_TMR_PRESCALER_256CK * 2 ; 256分周
ST_TMR_PRESCALER_1024CK * 3 ; 1024分周
;-----------------------------------------------------------------------
; キー
;-----------------------------------------------------------------------
BUTTON_MASK * 0x030f ; ボタン
PLUS_KEY_MASK * 0x00f0 ; 十字キー
ALL_KEY_MASK * 0x03ff ; 全てのキー
A_BUTTON * 0x0001 ; Aボタン
B_BUTTON * 0x0002 ; Bボタン
SELECT_BUTTON * 0x0004 ; セレクトボタン
START_BUTTON * 0x0008 ; スタートボタン
R_KEY * 0x0010 ; 右ボタン
L_KEY * 0x0020 ; 左ボタン
U_KEY * 0x0040 ; 上ボタン
D_KEY * 0x0080 ; 下ボタン
R_BUTTON * 0x0100 ; Rボタン
L_BUTTON * 0x0200 ; Lボタン
KEY_IF_ENABLE * 0x4000 ; 割り込み要求 許可
KEY_OR_INTR * 0x0000 ; 通常キー割り込み
KEY_AND_INTR * 0x8000 ; ANDキー割り込み
; 構造体メンバ用定数
ST_KEY_OR_INTR * 0 ; 通常キー割り込み
ST_KEY_AND_INTR * 1 ; ANDキー割り込み
;-----------------------------------------------------------------------
; 外部メモリ コントロール
;-----------------------------------------------------------------------
CTRDG_DT8_10CYC * 0x0000 ; カートリッジ 8bitデータバス 10サイクル
CTRDG_DT8_8CYC * 0x0001 ; 8サイクル
CTRDG_DT8_6CYC * 0x0002 ; 6サイクル
CTRDG_DT8_18CYC * 0x0003 ; 18サイクル
CTRDG_AD16_1ST_10CYC * 0x0000 ; カートリッジ AD16バス 10サイクル
CTRDG_AD16_1ST_8CYC * 0x0004 ; 8サイクル
CTRDG_AD16_1ST_6CYC * 0x0008 ; 6サイクル
CTRDG_AD16_1ST_18CYC * 0x000c ; 18サイクル
CTRDG_AD16_2ND_6CYC * 0x0000 ; 6サイクル
CTRDG_AD16_2ND_4CYC * 0x0010 ; 4サイクル
CTRDG_PHI_OUT_NONE * 0x0000 ; φ端子出力クロック Lo固定
CTRDG_PHI_OUT_4MCK * 0x0020 ;
CTRDG_PHI_OUT_8MCK * 0x0040 ;
CTRDG_PHI_OUT_16MCK * 0x0060 ;
CTRDG_ACCESS * 0x0080 ; カートリッジアクセス権
CTRDG_ACCESS_MAINP * 0x0000 ; メインプロセッサ
CTRDG_ACCESS_SUBP * 0x0080 ; サブプロセッサ
CARD_ACCESS * 0x0800 ; カードアクセス権
CARD_ACCESS_MAINP * 0x0000 ; メインプロセッサ
CARD_ACCESS_SUBP * 0x0800 ; サブプロセッサ
MMEM_CE2_OUT * 0x2000 ; CE2信号確認
MMEM_INTF * 0x4000 ; メインメモリインタフェース(TEGでは常にセットして同期モードにする)
MMEM_INTF_ASYNC * 0x0000 ; 非同期モード
MMEM_INTF_SYNC * 0x4000 ; 同期モード
MMEM_PRIORITY * 0x8000 ; メインメモリ優先権
MMEM_PRIORITY_MAINP * 0x0000 ; メインプロセッサ
MMEM_PRIORITY_SUBP * 0x8000 ; サブプロセッサ
; 構造体メンバ用定数
ST_CTRDG_DT8_10CYC * 0 ; カートリッジ 8bitデータバス 10サイクル
ST_CTRDG_DT8_8CYC * 1 ; 8サイクル
ST_CTRDG_DT8_6CYC * 2 ; 6サイクル
ST_CTRDG_DT8_18CYC * 3 ; 18サイクル
ST_CTRDG_AD16_1ST_10CYC * 0 ; カートリッジ AD16バス 10サイクル
ST_CTRDG_AD16_1ST_8CYC * 1 ; 8サイクル
ST_CTRDG_AD16_1ST_6CYC * 2 ; 6サイクル
ST_CTRDG_AD16_1ST_18CYC * 3 ; 18サイクル
ST_CTRDG_AD16_2ND_6CYC * 0 ; 6サイクル
ST_CTRDG_AD16_2ND_4CYC * 1 ; 4サイクル
ST_CTRDG_PHI_OUT_NONE * 0 ; φ端子出力クロック Lo固定
ST_CTRDG_PHI_OUT_4MCK * 1 ;
ST_CTRDG_PHI_OUT_8MCK * 2 ;
ST_CTRDG_PHI_OUT_16MCK * 3 ;
ENDIF ; _IRIS_SUBP_DEFINE_H
END

View File

@ -0,0 +1,410 @@
//======================================================================
// IrisSubpMacro.h
// IRISサブプロセッサ 標準マクロ関数
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_SUBP_MACRO_H
#define _IRIS_SUBP_MACRO_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisSubpTarget.h>
#include <IrisSubpTypes.h>
#include <IrisSubpSystemCall.h>
//----------------------------------------------------------------------
// データ読み込み
//----------------------------------------------------------------------
#define ReadData(readp, bit) (*(vu##bit *)(readp))
//----------------------------------------------------------------------
// データ書き込み
//----------------------------------------------------------------------
#define WriteData(writep, data, bit) \
\
(*(vu##bit *)(writep) = (data))
//----------------------------------------------------------------------
// データ コピー
//----------------------------------------------------------------------
#define CopyData(readp, writep, bit) \
\
(*(vu##bit *)(writep) = *(vu##bit *)(readp))
//----------------------------------------------------------------------
// アドレス境界整列バッファの有効化
//----------------------------------------------------------------------
#ifdef __CC_ARM
#define EnableAlignBuf(alignBuf) \
{ \
vu16 alignBufTmp = *(vu16 *)alignBuf; \
}
#else
#define EnableAlignBuf(alignBuf) ((void) 0)
#endif
//----------------------------------------------------------------------
// 割り込みアドレス セット
//----------------------------------------------------------------------
#define SetIntrAddr(intrp) \
\
(*(vu32 *)INTR_VECTOR_BUF = (vu32 )intrp)
//・割り込み処理のアドレスをセットします。
//----------------------------------------------------------------------
// セット
//----------------------------------------------------------------------
//#define SIMULATOR
#ifndef SIMULATOR
#define DmaSet(dmaNo, srcp, destp, dmaCntData) \
{ \
vu32 *dmaCntp = &((vu32 *)REG_DMA0)[dmaNo * 3]; \
dmaCntp[0] = (vu32 )(srcp); \
dmaCntp[1] = (vu32 )(destp); \
dmaCntp[2] = (vu32 )(dmaCntData); \
{u32 dummy = dmaCntp[2];} \
}
#define DmaSetAsync(dmaNo, srcp, destp, dmaCntData) \
{ \
vu32 *dmaCntp = &((vu32 *)REG_DMA0)[dmaNo * 3]; \
dmaCntp[0] = (vu32 )(srcp); \
dmaCntp[1] = (vu32 )(destp); \
dmaCntp[2] = (vu32 )(dmaCntData); \
}
#else
#define DmaSet(dmaNo, srcp, destp, dmaCntData) \
{ \
int i; \
for (i=0; i<(dmaCntData & 0x1ffff); i++) \
if ((dmaCntData) & DMA_SRC_FIX) { \
if ((dmaCntData) & DMA_32BIT_BUS) \
((vu32 *)(destp))[i] = ((vu32 *)(srcp))[0]; \
else ((vu16 *)(destp))[i] = ((vu16 *)(srcp))[0]; \
} else { \
if ((dmaCntData) & DMA_32BIT_BUS) \
((vu32 *)(destp))[i] = ((vu32 *)(srcp))[i]; \
else ((vu16 *)(destp))[i] = ((vu16 *)(srcp))[i]; \
} \
}
#define DmaSetAsync(dmaNo, srcp, destp, dmaCntData) \
DmaSet( dmaNo, srcp, destp, dmaCntData)
#endif
//・DMAコントローラにパラメータをセットします。
//・SIMULATERを定義するとCPUでシミュレートします。
// GDBでデバッグする場合などに有効です。
//・最後にDMA起動待ちのために"LDR"命令が挿入されます。
//
//・引数:
// dmaNo DMA番号
// srcp ソースアドレス
// destp デスティネーションアドレス
// dmaCntData パラメータデータ
//
//※CPU内部RAM上のプログラムにてDMAを起動すると
// その次の命令が先に実行されます。
// よって、DMA直後に転送先をCPUにて変更しようとした場合、
// 読み込み書き戻しの間にDMAが起動されてしまいますので、
// DMAの転送先のデータが意図していない値になる場合があります。
// その場合にはWaitDma()を直後に挿入して、DMAが終了したか
// どうかをチェックすると続くコードへの影響を確実に回避できます。
//----------------------------------------------------------------------
// クリア
//----------------------------------------------------------------------
#define DmaClear(dmaNo, data, destp, size, bit) \
{ \
vu##bit tmp = (data); \
DmaSet(dmaNo, &tmp, destp, ( \
DMA_ENABLE | DMA_TIMMING_IMM | \
DMA_SRC_FIX | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8)))); \
}
#define DmaClearIf(dmaNo, data, destp, size, bit) \
{ \
vu##bit tmp = (data); \
DmaSet(dmaNo, &tmp, destp, ( \
DMA_ENABLE | DMA_TIMMING_IMM | \
DMA_IF_ENABLE | \
DMA_SRC_FIX | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8)))); \
}
#define DmaClearArray( dmaNo, data, destp, bit) \
DmaClear( dmaNo, data, destp, sizeof(destp), bit)
#define DmaClearArrayIf(dmaNo, data, destp, bit) \
DmaClearIf( dmaNo, data, destp, sizeof(destp), bit)
//・DMAでRAMクリアします。
//・クリアデータはスタックに置かれ、それをデスティネーションへコピーします。
//・DmaClearIfDmaClearArrayIfは終了時に割り込み要求を発生します。
//・DmaClearArrayDmaClearArrayIfはデスティネーション配列全体をクリアします。
//
//・引数:
// dmaNo DMA番号
// data クリアデータ
// destp デスティネーションアドレス
// size クリアバイト数
// bit 転送ビット幅16|32
//
//
//※CPU内部RAM上のプログラムにてDMAを起動すると
// その次の命令が先に実行されます。
// よって、DMA直後に転送先をCPUにて変更しようとした場合、
// 読み込み書き戻しの間にDMAが起動されてしまいますので、
// DMAの転送先のデータが意図していない値になる場合があります。
// その場合にはWaitDma()を直後に挿入して、DMAが終了したか
// どうかをチェックすると続くコードへの影響を確実に回避できます。
//----------------------------------------------------------------------
// コピー
//----------------------------------------------------------------------
#define DmaCopy(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_IMM | \
DMA_SRC_INC | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/((bit)/8))))
#define DmaCopyIf(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_IMM | \
DMA_IF_ENABLE | \
DMA_SRC_INC | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8))))
#define DmaCopyArray( dmaNo, srcp, destp, bit) \
DmaCopy( dmaNo, srcp, destp, sizeof(srcp), bit)
#define DmaCopyArrayIf(dmaNo, srcp, destp, bit) \
DmaCopyIf( dmaNo, srcp, destp, sizeof(srcp), bit)
//・DMAでコピーします。
//・DmaCopyIfDmaCopyArrayIfは終了時に割り込み要求を発生します。
//・DmaCopyArrayDmaCopyArrayIfはソース配列全体をコピーします。
//
//・引数:
// dmaNo DMA番号
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
// bit 転送ビット幅16|32
//
//
//※CPU内部RAM上のプログラムにてDMAを起動すると
// その次の命令が先に実行されます。
// よって、DMA直後に転送先をCPUにて変更しようとした場合、
// 読み込み書き戻しの間にDMAが起動されてしまいますので、
// DMAの転送先のデータが意図していない値になる場合があります。
// その場合にはWaitDma()を直後に挿入して、DMAが終了したか
// どうかをチェックすると続くコードへの影響を確実に回避できます。
//----------------------------------------------------------------------
// HブランクDMA コピー
//----------------------------------------------------------------------
#define H_DmaCopy(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_H_BLANK | \
DMA_SRC_INC | DMA_DEST_RELOAD | \
DMA_CONTINUOUS_ON | \
DMA_##bit##BIT_BUS | ((size)/((bit)/8))))
#define H_DmaCopyIf(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_H_BLANK | \
DMA_IF_ENABLE | \
DMA_SRC_INC | DMA_DEST_RELOAD | \
DMA_CONTINUOUS_ON | \
DMA_##bit##BIT_BUS | ((size)/(bit/8))))
#define H_DmaCopyArray( dmaNo, srcp, destp, bit) \
H_DmaCopy( dmaNo, srcp, destp, sizeof(srcp), bit)
#define H_DmaCopyArrayIf(dmaNo, srcp, destp, bit) \
H_DmaCopyIf( dmaNo, srcp, destp, sizeof(srcp), bit)
//・Hブランクに同期してDMAでコピーします。
//・H_DmaCopyIfH_DmaCopyArrayIfは終了時に割り込み要求を発生します。
//・H_DmaCopyArrayH_DmaCopyArrayIfはソース配列全体をコピーします。
//
//・引数:
// dmaNo DMA番号
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
// bit 転送ビット幅16|32
//----------------------------------------------------------------------
// VブランクDMA コピー
//----------------------------------------------------------------------
#define V_DmaCopy(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_V_BLANK | \
DMA_SRC_INC | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8))))
#define V_DmaCopyIf(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_V_BLANK | \
DMA_IF_ENABLE | \
DMA_SRC_INC | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8))))
#define V_DmaCopyArray( dmaNo, srcp, destp, bit) \
V_DmaCopy( dmaNo, srcp, destp, sizeof(srcp), bit)
#define V_DmaCopyArrayIf(dmaNo, srcp, destp, bit) \
V_DmaCopyIf( dmaNo, srcp, destp, sizeof(srcp), bit)
//・Vブランクに同期してDMAでコピーします。
//・V_DmaCopyIfV_DmaCopyArrayIfは終了時に割り込み要求を発生します。
//・V_DmaCopyArrayV_DmaCopyArrayIfはソース配列全体をコピーします。
//
//・引数:
// dmaNo DMA番号
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
// bit 転送ビット幅16|32
//----------------------------------------------------------------------
// 終了待ち
//----------------------------------------------------------------------
#define WaitDma(dmaNo) \
{ \
vu32 *(dmaCntp) = (vu32 *)REG_DMA##dmaNo; \
while (dmaCntp[2] & DMA_ENABLE) ; \
}
//・DMAの終了を待ちます。
//
//・引数:
// dmaNo DMA番号
//----------------------------------------------------------------------
// ストップ
//----------------------------------------------------------------------
#define StopDma(dmaNo) \
{ \
vu16 *(dmaCntp) = &((vu16 *)REG_DMA0)[dmaNo * 6]; \
dmaCntp[5] &= ~((DMA_TIMMING_MASK | DMA_CONTINUOUS_ON) \
>> 16); \
dmaCntp[5] &= ~( DMA_ENABLE >> 16); \
{u32 dummy = dmaCntp[5];} \
}
//・DMAを停止します。
//・但し、処理中にDMAの自動起動が掛かった場合は一度だけDMAが実行されます。
//
//・引数:
// dmaNo DMA番号
//----------------------------------------------------------------------
// クリア
//----------------------------------------------------------------------
#define CpuClear(data, destp, size, bit) SVC_CpuClear(data, (void *)(destp), size, bit)
#define CpuClearArray(data, destp, bit) \
CpuClear( data, destp, sizeof(destp), bit)
//・CPUでRAMクリアするシステムコールを呼び出します。
//・クリアデータはスタックに置かれ、それをデスティネーションへコピーします。
//・CpuClearArrayはデスティネーション配列全体をクリアします。
//
//・引数:
// data クリアデータ
// destp デスティネーションアドレス
// size クリアバイト数
// bit 転送ビット幅16|32
//----------------------------------------------------------------------
// コピー
//----------------------------------------------------------------------
#define CpuCopy(srcp, destp, size, bit) SVC_CpuCopy((void *)(srcp), (void *)(destp), size, bit)
#define CpuCopyArray(srcp, destp, bit) \
CpuCopy( srcp, destp, sizeof(srcp), bit)
//・CPUでコピーするシステムコールを呼び出します。
//・CpuCopyArrayはソース配列全体をコピーします。
//
//・引数:
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
// bit 転送ビット幅16|32
//----------------------------------------------------------------------
// 高速クリア
//----------------------------------------------------------------------
#define CpuClearFast(data, destp, size) SVC_CpuClearFast(data, (void *)(destp), size)
#define CpuClearArrayFast(data, destp) \
CpuClearFast( data, destp, sizeof(destp))
//・CPUで高速にRAMクリアするシステムコールを呼び出します。
//・クリアデータはスタックに置かれ、それをデスティネーションへコピーします。
//・CpuClearArrayFastはデスティネーション配列全体をクリアします。
//
//・引数:
// data クリアデータ
// destp デスティネーションアドレス
// size クリアバイト数
//----------------------------------------------------------------------
// 高速コピー
//----------------------------------------------------------------------
#define CpuCopyFast(srcp, destp, size) SVC_CpuCopyFast((void *)(srcp), (void *)(destp), size)
#define CpuCopyArrayFast(srcp, destp) \
CpuCopyFast( srcp, destp, sizeof(srcp))
//・CPUで高速にコピーするシステムコールを呼び出します。
//・CpuCopyArrayFastはソース配列全体をコピーします。
//
//・引数:
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_SUBP_MACRO_H

View File

@ -0,0 +1,42 @@
;=======================================================================
; IrisSubpMacroArm.s
; IRISサブプロセッサ 標準マクロ関数ARMASM用
;
; Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
;=======================================================================
IF :DEF: _IRIS_SUBP_MACRO_H
ELSE
_IRIS_SUBP_MACRO_H * 1
INCLUDE IrisSubpTargetArm.s
;-----------------------------------------------------------------------
; システムコール
;-----------------------------------------------------------------------
MACRO
SystemCall16 $No
swi $No
MEND
MACRO
SystemCall32 $No
swi $No << 16
MEND
MACRO
Halt $Bits ;
SystemCall$Bits 2
MEND
MACRO
Stop $Bits ;
SystemCall$Bits 3
MEND
ENDIF ; _IRIS_SUBP_MACRO_H
END

View File

@ -0,0 +1,28 @@
;=======================================================================
; IrisSubpMacroMw.s
; IRIS 標準マクロ関数MWASMARM用
;
; Copyright (C) 2003 NINTENDO Co.,Ltd.
;=======================================================================
#ifndef _IRIS_SUBP_MACRO_H
#define _IRIS_SUBP_MACRO_H
.INCLUDE IrisSubpTarget.h
;-----------------------------------------------------------------------
; システムコール
;-----------------------------------------------------------------------
SystemCall16: .MACRO No
swi No
.ENDM
SystemCall32: .MACRO No
swi No << 16
.ENDM
#endif // _IRIS_SUBP_MACRO_H

View File

@ -0,0 +1,530 @@
//======================================================================
// IrisSubpMemoryMap.h
// IRISサブプロセッサ メモリマップ定数
//
// Copyright (C) 2002-2004 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_SUBP_MEMORY_MAP_H
#define _IRIS_SUBP_MEMORY_MAP_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisSubpTarget.h>
//----------------------------------------------------------------------
// メモリ・マップ
//----------------------------------------------------------------------
#define SHARED_WORK 0x027ff000 // CPU間共有ワーク領域
#define SHARED_WORK_END 0x02800000
#if defined(NDEBUG)
#define SUBP_PRV 0x02380000 // サブプロセッサ専有領域(リリースバージョン)
#elif defined(MMEM_4M)
#define SUBP_PRV 0x02300000 // (デバッグバージョン<メインメモリ4M本体>)
#else
#define SUBP_PRV 0x02600000 // (デバッグバージョン<メインメモリ8M本体>)
#endif
#define SUBP_PRV_END SHARED_WORK
#define MAIN_MEM 0x02000000 // メインメモリ
#define MAIN_MEM_END (MAIN_MEM + 0x400000)
#define MAIN_MEM_EX_END (MAIN_MEM + 0x800000) //(拡張時の最終アドレス)
#define MAIN_MEM_CMD_AREA (MAIN_MEM_EX_END - 0x2) // メインメモリコマンド発行エリア(使用禁止エリア)
#define SHARED_LOCK_BUF (MAIN_MEM_EX_END - 0x40) // 共有リソース・ロックバッファ
#define SHARED_LOCK_BUF_END (MAIN_MEM_EX_END - 0x10)
#define INIT_LOCK_BUF (MAIN_MEM_EX_END - 0x10) // 初期化ロックバッファ
#define CARTRIDGE_LOCK_BUF (MAIN_MEM_EX_END - 0x18) // カートリッジ・ロックバッファ
#define CARD_LOCK_BUF (MAIN_MEM_EX_END - 0x20) // カード・ロックバッファ
#define WRAM_BLOCK1_LOCK_BUF (MAIN_MEM_EX_END - 0x28) // CPU内部ワークRAM・ブロック1・ロックバッファ
#define WRAM_BLOCK0_LOCK_BUF (MAIN_MEM_EX_END - 0x30) // ブロック0・ロックバッファ
#define VRAM_D_LOCK_BUF (MAIN_MEM_EX_END - 0x38) // VRAM-D・ロックバッファ
#define VRAM_C_LOCK_BUF (MAIN_MEM_EX_END - 0x40) // C・ロックバッファ
#define TO_MAINP_IF_BUF (MAIN_MEM_EX_END - 0x50) // サブ→メインプロセッサ割り込み要求フラグ(2Byte×8)
#define WM_TO_MAINP_IF_BUF (MAIN_MEM_EX_END - 0x50) // ワイヤレスマネージャ予約
#define FROM_MAINP_IF_BUF (MAIN_MEM_EX_END - 0x60) // メイン→サブプロセッサ割り込み要求フラグ(2Byte×8)
#define WM_FROM_MAINP_IF_BUF (MAIN_MEM_EX_END - 0x60) // ワイヤレスマネージャ予約
#define ROM_HEADER_BUF (MAIN_MEM_EX_END - 0x200)// ROM内登録エリアデータ・バッファ
#ifdef IRIS_TS
#define PRV_WRAM_DF_SIZE 0x8000 // CPU内部専有ワークRAM TS-TEG差分サイズ
#else
#define PRV_WRAM_DF_SIZE 0
#endif
#define CPU_WRAM 0x037f8000 // CPU内部ワークRAM 3ブロック構成時(デフォルト)
#define CPU_WRAM_END (CPU_WRAM + PRV_WRAM_DF_SIZE + 0x10000)
#define CPU_WRAM_2B 0x037fc000 // 2ブロック構成時
#define CPU_WRAM_2B_END (CPU_WRAM_2B + PRV_WRAM_DF_SIZE + 0xc000)
#define CPU_WRAM_BLOCK0 0x037f8000 // ブロック0
#define CPU_WRAM_BLOCK0_END (CPU_WRAM_BLOCK0 + 0x4000)
#define CPU_WRAM_BLOCK1 0x037fc000 // ブロック1
#define CPU_WRAM_BLOCK1_END (CPU_WRAM_BLOCK1 + 0x4000)
#define PRV_WRAM 0x03800000 // CPU内部専有ワークRAM
#define PRV_WRAM_END (PRV_WRAM + PRV_WRAM_DF_SIZE + 0x8000)
#define CPU_XWRAM 0x06000000 // CPU内部拡張ワークRAM
#define CPU_XWRAM_END (CPU_XWRAM +0x40000)
#define INTR_VECTOR_BUF (CPU_WRAM_END - 0x4)// 割り込み分岐アドレス
#define INTR_CHECK_BUF (CPU_WRAM_END - 0x8)// 割り込みチェック
#define SEND_FIFO_LOCK_BUF (CPU_WRAM_END - 0x10)// CPU間送信FIFO・ロックバッファ
#define TIMER3_LOCK_BUF (CPU_WRAM_END - 0x12)// タイマー3・ロックバッファ
#define TIMER2_LOCK_BUF (CPU_WRAM_END - 0x14)// タイマー2
#define TIMER1_LOCK_BUF (CPU_WRAM_END - 0x16)// タイマー1
#define TIMER0_LOCK_BUF (CPU_WRAM_END - 0x18)// タイマー0
#define DMA3_LOCK_BUF (CPU_WRAM_END - 0x1a)// DMA3・ロックバッファ
#define DMA2_LOCK_BUF (CPU_WRAM_END - 0x1c)//
#define DMA1_LOCK_BUF (CPU_WRAM_END - 0x1e)//
#define DMA0_LOCK_BUF (CPU_WRAM_END - 0x20)//
#define REG_BASE 0x04000000 // レジスタ群
#define WIRELESS_INTF 0x04800000 // 無線通信インタフェース
#define WIRELESS_INTF0 0x04800000 // インタフェース0
#define WIRELESS_INTF1 0x04808000 // インタフェース1
#define WIRELESS_INTF0_END (WIRELESS_INTF0 + 0x8000)
#define WIRELESS_INTF1_END (WIRELESS_INTF1 + 0x8000)
#define WIRELESS_INTF_END (WIRELESS_INTF + 0x10000)
#define CARTRIDGE 0x08000000 // カートリッジ
#define CTRDG_AD16_BANK0 0x08000000 // カートリッジ AD16バス バンク0
#define CTRDG_AD16_BANK0_END 0x0a000000
#define CTRDG_AD16_BANK1 0x0a000000 // バンク1
#define CTRDG_AD16_BANK1_END 0x0c000000
#define CTRDG_AD16_BANK2 0x0c000000 // バンク2
#define CTRDG_AD16_BANK2_END 0x0e000000
#define CTRDG_DT8 0x0e000000 // カートリッジ 8bitデータバス
#define CTRDG_DT8_END 0x10000000
//----------------------------------------------------------------------
// メモリ・サイズ
//----------------------------------------------------------------------
#define SHARED_WORK_SIZE (SHARED_WORK_END - SHARED_WORK) // CPU間共有ワーク領域(4KB以上、2のべき乗サイズ)
#define SUBP_PRV_SIZE (SUBP_PRV_END - SUBP_PRV) // サブプロセッサ専有領域(32KB以上、2のべき乗サイズ)
#define SHARED_LOCK_BUF_SIZE (SHARED_LOCK_BUF_END - SHARED_LOCK_BUF) // 共有リソース・ロックバッファ
#define MAIN_MEM_SIZE 0x400000 // メインメモリ
#define MAIN_MEM_EX_SIZE 0x800000 // (拡張時)
#define CPU_WRAM_SIZE (0x10000 + PRV_WRAM_DF_SIZE) // CPU内部ワークRAM 3ブロック構成時(デフォルト)
#define CPU_WRAM_2B_SIZE (0xc000 + PRV_WRAM_DF_SIZE) // 2ブロック構成時
#define CPU_WRAM_BLOCK0_SIZE 0x4000 // ブロック0
#define CPU_WRAM_BLOCK1_SIZE 0x4000 // ブロック1
#define PRV_WRAM_SIZE (0x8000 + PRV_WRAM_DF_SIZE) // CPU内部専有ワークRAM
#define CPU_XWRAM_SIZE 0x40000 // CPU内部拡張ワークRAM
#define MROM_PAGE_SIZE 512 // マスクROM・ページ
#define CARTRIDGE_SIZE 0x02000000 // カートリッジ
#define CTRDG_AD16_BANK_SIZE 0x02000000 // カートリッジ AD16バス バンク
#define CTRDG_AD16_BANK0_SIZE 0x02000000 // バンク0
#define CTRDG_AD16_BANK1_SIZE 0x02000000 // バンク1
#define CTRDG_AD16_BANK2_SIZE 0x02000000 // バンク2
#define CTRDG_DT8_SIZE 0x02000000 // カートリッジ 8bitデータバス
//----------------------------------------------------------------------
// レジスタ・アドレス
//----------------------------------------------------------------------
#define REG_IME (REG_BASE + 0x208) // 割り込みマスタイネーブル
#define REG_IE (REG_BASE + 0x210) // 割り込み許可
#define REG_IF (REG_BASE + 0x214) // 割り込み要求
#define REG_MAINPINTF (REG_BASE + 0x180) // メインプロセッサインタフェース
#define REG_MAINP_FIFO_CNT (REG_BASE + 0x184) // CPU間FIFOコントロール
#define REG_SEND_FIFO (REG_BASE + 0x188) // 送信FIFO
#define REG_RECV_FIFO (REG_BASE + 0x100000) // 受信FIFO
#define REG_POWCNT (REG_BASE + 0x304) // パワーコントロール
#define REG_EXMEMCNT (REG_BASE + 0x204) // 外部メモリコントロール
#define REG_VRAMSTAT (REG_BASE + 0x240) // VRAMステータス
#define REG_WRAMSTAT (REG_BASE + 0x241) // 内部ワークRAMステータス
#define REG_WVRAMSTAT (REG_BASE + 0x240) // C・D 内部ワークRAM ステータス
#define REG_DISPSTAT (REG_BASE + 0x4) // 表示ステータス
#define REG_VCOUNT (REG_BASE + 0x6) // Vカウンタ
#define REG_SPICNT (REG_BASE + 0x1c0) // SPIコントロール
#define REG_SPIDATA (REG_BASE + 0x1c2) // SPIデータ
#define REG_RCNT (REG_BASE + 0x134) // 汎用入出力コントロール
#define REG_KEYINPUT (REG_BASE + 0x130) // キー入力
#define REG_KEYCNT (REG_BASE + 0x132) // キーコントロール
#define REG_DMA0 (REG_BASE + 0xb0) //
#define REG_DMA0SAD (REG_BASE + 0xb0)
#define REG_DMA0DAD (REG_BASE + 0xb4)
#define REG_DMA0CNT (REG_BASE + 0xb8)
#define REG_DMA0CNT_L (REG_BASE + 0xb8)
#define REG_DMA0CNT_H (REG_BASE + 0xba)
#define REG_DMA1 (REG_BASE + 0xbc) //
#define REG_DMA1SAD (REG_BASE + 0xbc)
#define REG_DMA1DAD (REG_BASE + 0xc0)
#define REG_DMA1CNT (REG_BASE + 0xc4)
#define REG_DMA1CNT_L (REG_BASE + 0xc4)
#define REG_DMA1CNT_H (REG_BASE + 0xc6)
#define REG_DMA2 (REG_BASE + 0xc8) //
#define REG_DMA2SAD (REG_BASE + 0xc8)
#define REG_DMA2DAD (REG_BASE + 0xcc)
#define REG_DMA2CNT (REG_BASE + 0xd0)
#define REG_DMA2CNT_L (REG_BASE + 0xd0)
#define REG_DMA2CNT_H (REG_BASE + 0xd2)
#define REG_DMA3 (REG_BASE + 0xd4) //
#define REG_DMA3SAD (REG_BASE + 0xd4)
#define REG_DMA3DAD (REG_BASE + 0xd8)
#define REG_DMA3CNT (REG_BASE + 0xdc)
#define REG_DMA3CNT_L (REG_BASE + 0xdc)
#define REG_DMA3CNT_H (REG_BASE + 0xde)
#define REG_TM0CNT (REG_BASE + 0x100) // タイマー0
#define REG_TM0CNT_L (REG_BASE + 0x100)
#define REG_TM0CNT_H (REG_BASE + 0x102)
#define REG_TM1CNT (REG_BASE + 0x104) // タイマー1
#define REG_TM1CNT_L (REG_BASE + 0x104)
#define REG_TM1CNT_H (REG_BASE + 0x106)
#define REG_TM2CNT (REG_BASE + 0x108) // タイマー2
#define REG_TM2CNT_L (REG_BASE + 0x108)
#define REG_TM2CNT_H (REG_BASE + 0x10a)
#define REG_TM3CNT (REG_BASE + 0x10c) // タイマー3
#define REG_TM3CNT_L (REG_BASE + 0x10c)
#define REG_TM3CNT_H (REG_BASE + 0x10e)
#define REG_SOUNDCNT (REG_BASE + 0x500) // サウンド・マスタコントロール
#define REG_SOUNDBIAS (REG_BASE + 0x504) // サウンドBIAS
#define REG_SNDCAPCNT (REG_BASE + 0x508) // サウンドキャプチャコントロール
#define REG_SNDCAP0DAD (REG_BASE + 0x510) // サウンドキャプチャ0パラメータ
#define REG_SNDCAP0LEN (REG_BASE + 0x514)
#define REG_SNDCAP1DAD (REG_BASE + 0x518) // サウンドキャプチャ1パラメータ
#define REG_SNDCAP1LEN (REG_BASE + 0x51c)
#define REG_SOUND0CNT (REG_BASE + 0x400) // サウンド0コントロール
#define REG_SOUND0CNT_L (REG_BASE + 0x400)
#define REG_SOUND0CNT_H (REG_BASE + 0x402)
#define REG_SOUND0SAD (REG_BASE + 0x404)
#define REG_SOUND0TMR (REG_BASE + 0x408)
#define REG_SOUND0RPT_PT (REG_BASE + 0x40a)
#define REG_SOUND0RPT_LEN (REG_BASE + 0x40c)
#define REG_SOUND1CNT (REG_BASE + 0x410) // サウンド1コントロール
#define REG_SOUND1CNT_L (REG_BASE + 0x410)
#define REG_SOUND1CNT_H (REG_BASE + 0x412)
#define REG_SOUND1SAD (REG_BASE + 0x414)
#define REG_SOUND1TMR (REG_BASE + 0x418)
#define REG_SOUND1RPT_PT (REG_BASE + 0x41a)
#define REG_SOUND1RPT_LEN (REG_BASE + 0x41c)
#define REG_SOUND2CNT (REG_BASE + 0x420) // サウンド2コントロール
#define REG_SOUND2CNT_L (REG_BASE + 0x420)
#define REG_SOUND2CNT_H (REG_BASE + 0x422)
#define REG_SOUND2SAD (REG_BASE + 0x424)
#define REG_SOUND2TMR (REG_BASE + 0x428)
#define REG_SOUND2RPT_PT (REG_BASE + 0x42a)
#define REG_SOUND2RPT_LEN (REG_BASE + 0x42c)
#define REG_SOUND3CNT (REG_BASE + 0x430) // サウンド3コントロール
#define REG_SOUND3CNT_L (REG_BASE + 0x430)
#define REG_SOUND3CNT_H (REG_BASE + 0x432)
#define REG_SOUND3SAD (REG_BASE + 0x434)
#define REG_SOUND3TMR (REG_BASE + 0x438)
#define REG_SOUND3RPT_PT (REG_BASE + 0x43a)
#define REG_SOUND3RPT_LEN (REG_BASE + 0x43c)
#define REG_SOUND4CNT (REG_BASE + 0x440) // サウンド4コントロール
#define REG_SOUND4CNT_L (REG_BASE + 0x440)
#define REG_SOUND4CNT_H (REG_BASE + 0x442)
#define REG_SOUND4SAD (REG_BASE + 0x444)
#define REG_SOUND4TMR (REG_BASE + 0x448)
#define REG_SOUND4RPT_PT (REG_BASE + 0x44a)
#define REG_SOUND4RPT_LEN (REG_BASE + 0x44c)
#define REG_SOUND5CNT (REG_BASE + 0x450) // サウンド5コントロール
#define REG_SOUND5CNT_L (REG_BASE + 0x450)
#define REG_SOUND5CNT_H (REG_BASE + 0x452)
#define REG_SOUND5SAD (REG_BASE + 0x454)
#define REG_SOUND5TMR (REG_BASE + 0x458)
#define REG_SOUND5RPT_PT (REG_BASE + 0x45a)
#define REG_SOUND5RPT_LEN (REG_BASE + 0x45c)
#define REG_SOUND6CNT (REG_BASE + 0x460) // サウンド6コントロール
#define REG_SOUND6CNT_L (REG_BASE + 0x460)
#define REG_SOUND6CNT_H (REG_BASE + 0x462)
#define REG_SOUND6SAD (REG_BASE + 0x464)
#define REG_SOUND6TMR (REG_BASE + 0x468)
#define REG_SOUND6RPT_PT (REG_BASE + 0x46a)
#define REG_SOUND6RPT_LEN (REG_BASE + 0x46c)
#define REG_SOUND7CNT (REG_BASE + 0x470) // サウンド7コントロール
#define REG_SOUND7CNT_L (REG_BASE + 0x470)
#define REG_SOUND7CNT_H (REG_BASE + 0x472)
#define REG_SOUND7SAD (REG_BASE + 0x474)
#define REG_SOUND7TMR (REG_BASE + 0x478)
#define REG_SOUND7RPT_PT (REG_BASE + 0x47a)
#define REG_SOUND7RPT_LEN (REG_BASE + 0x47c)
#define REG_SOUND8CNT (REG_BASE + 0x480) // サウンド8コントロール
#define REG_SOUND8CNT_L (REG_BASE + 0x480)
#define REG_SOUND8CNT_H (REG_BASE + 0x482)
#define REG_SOUND8SAD (REG_BASE + 0x484)
#define REG_SOUND8TMR (REG_BASE + 0x488)
#define REG_SOUND8RPT_PT (REG_BASE + 0x48a)
#define REG_SOUND8RPT_LEN (REG_BASE + 0x48c)
#define REG_SOUND9CNT (REG_BASE + 0x490) // サウンド9コントロール
#define REG_SOUND9CNT_L (REG_BASE + 0x490)
#define REG_SOUND9CNT_H (REG_BASE + 0x492)
#define REG_SOUND9SAD (REG_BASE + 0x494)
#define REG_SOUND9TMR (REG_BASE + 0x498)
#define REG_SOUND9RPT_PT (REG_BASE + 0x49a)
#define REG_SOUND9RPT_LEN (REG_BASE + 0x49c)
#define REG_SOUND10CNT (REG_BASE + 0x4a0) // サウンド10コントロール
#define REG_SOUND10CNT_L (REG_BASE + 0x4a0)
#define REG_SOUND10CNT_H (REG_BASE + 0x4a2)
#define REG_SOUND10SAD (REG_BASE + 0x4a4)
#define REG_SOUND10TMR (REG_BASE + 0x4a8)
#define REG_SOUND10RPT_PT (REG_BASE + 0x4aa)
#define REG_SOUND10RPT_LEN (REG_BASE + 0x4ac)
#define REG_SOUND11CNT (REG_BASE + 0x4b0) // サウンド11コントロール
#define REG_SOUND11CNT_L (REG_BASE + 0x4b0)
#define REG_SOUND11CNT_H (REG_BASE + 0x4b2)
#define REG_SOUND11SAD (REG_BASE + 0x4b4)
#define REG_SOUND11TMR (REG_BASE + 0x4b8)
#define REG_SOUND11RPT_PT (REG_BASE + 0x4ba)
#define REG_SOUND11RPT_LEN (REG_BASE + 0x4bc)
#define REG_SOUND12CNT (REG_BASE + 0x4c0) // サウンド12コントロール
#define REG_SOUND12CNT_L (REG_BASE + 0x4c0)
#define REG_SOUND12CNT_H (REG_BASE + 0x4c2)
#define REG_SOUND12SAD (REG_BASE + 0x4c4)
#define REG_SOUND12TMR (REG_BASE + 0x4c8)
#define REG_SOUND12RPT_PT (REG_BASE + 0x4ca)
#define REG_SOUND12RPT_LEN (REG_BASE + 0x4cc)
#define REG_SOUND13CNT (REG_BASE + 0x4d0) // サウンド13コントロール
#define REG_SOUND13CNT_L (REG_BASE + 0x4d0)
#define REG_SOUND13CNT_H (REG_BASE + 0x4d2)
#define REG_SOUND13SAD (REG_BASE + 0x4d4)
#define REG_SOUND13TMR (REG_BASE + 0x4d8)
#define REG_SOUND13RPT_PT (REG_BASE + 0x4da)
#define REG_SOUND13RPT_LEN (REG_BASE + 0x4dc)
#define REG_SOUND14CNT (REG_BASE + 0x4e0) // サウンド14コントロール
#define REG_SOUND14CNT_L (REG_BASE + 0x4e0)
#define REG_SOUND14CNT_H (REG_BASE + 0x4e2)
#define REG_SOUND14SAD (REG_BASE + 0x4e4)
#define REG_SOUND14TMR (REG_BASE + 0x4e8)
#define REG_SOUND14RPT_PT (REG_BASE + 0x4ea)
#define REG_SOUND14RPT_LEN (REG_BASE + 0x4ec)
#define REG_SOUND15CNT (REG_BASE + 0x4f0) // サウンド15コントロール
#define REG_SOUND15CNT_L (REG_BASE + 0x4f0)
#define REG_SOUND15CNT_H (REG_BASE + 0x4f2)
#define REG_SOUND15SAD (REG_BASE + 0x4f4)
#define REG_SOUND15TMR (REG_BASE + 0x4f8)
#define REG_SOUND15RPT_PT (REG_BASE + 0x4fa)
#define REG_SOUND15RPT_LEN (REG_BASE + 0x4fc)
//----------------------------------------------------------------------
// レジスタ・オフセット
//----------------------------------------------------------------------
#define OFFSET_REG_IME 0x208 // 割り込みマスタイネーブル
#define OFFSET_REG_IE 0x210 // 割り込み許可
#define OFFSET_REG_IF 0x214 // 割り込み要求
#define OFFSET_REG_MAINPINTF 0x180 // メインプロセッサインタフェース
#define OFFSET_REG_MAINP_FIFO_CNT 0x184 // CPU間FIFOコントロール
#define OFFSET_REG_SEND_FIFO 0x188 // 送信FIFO
#define OFFSET_REG_RECV_FIFO 0x100000 // 受信FIFO
#define OFFSET_REG_POWCNT 0x304 // パワーコントロール
#define OFFSET_REG_EXMEMCNT 0x204 // 外部メモリコントロール
#define OFFSET_REG_VRAMSTAT 0x240 // VRAMステータス
#define OFFSET_REG_WRAMSTAT 0x241 // 内部ワークRAMステータス
#define OFFSET_REG_WVRAMSTAT 0x240 // C・D 内部ワークRAM ステータス
#define OFFSET_REG_DISPSTAT 0x4 // ステータス
#define OFFSET_REG_VCOUNT 0x6 // Vカウンタ
#define OFFSET_REG_SPICNT 0x1c0 // SPIコントロール
#define OFFSET_REG_SPIDATA 0x1c2 // SPIデータ
#define OFFSET_REG_RCNT 0x134 // 汎用入出力コントロール
#define OFFSET_REG_KEYINPUT 0x130 // キー入力
#define OFFSET_REG_KEYCNT 0x132 // キーコントロール
#define OFFSET_REG_DMA0 0xb0 //
#define OFFSET_REG_DMA0SAD 0xb0
#define OFFSET_REG_DMA0DAD 0xb4
#define OFFSET_REG_DMA0CNT 0xb8
#define OFFSET_REG_DMA0CNT_L 0xb8
#define OFFSET_REG_DMA0CNT_H 0xba
#define OFFSET_REG_DMA1 0xbc //
#define OFFSET_REG_DMA1SAD 0xbc
#define OFFSET_REG_DMA1DAD 0xc0
#define OFFSET_REG_DMA1CNT 0xc4
#define OFFSET_REG_DMA1CNT_L 0xc4
#define OFFSET_REG_DMA1CNT_H 0xc6
#define OFFSET_REG_DMA2 0xc8 //
#define OFFSET_REG_DMA2SAD 0xc8
#define OFFSET_REG_DMA2DAD 0xcc
#define OFFSET_REG_DMA2CNT 0xd0
#define OFFSET_REG_DMA2CNT_L 0xd0
#define OFFSET_REG_DMA2CNT_H 0xd2
#define OFFSET_REG_DMA3 0xd4 //
#define OFFSET_REG_DMA3SAD 0xd4
#define OFFSET_REG_DMA3DAD 0xd8
#define OFFSET_REG_DMA3CNT 0xdc
#define OFFSET_REG_DMA3CNT_L 0xdc
#define OFFSET_REG_DMA3CNT_H 0xde
#define OFFSET_REG_TM0CNT 0x100 // タイマー0
#define OFFSET_REG_TM0CNT_L 0x100
#define OFFSET_REG_TM0CNT_H 0x102
#define OFFSET_REG_TM1CNT 0x104 // タイマー1
#define OFFSET_REG_TM1CNT_L 0x104
#define OFFSET_REG_TM1CNT_H 0x106
#define OFFSET_REG_TM2CNT 0x108 // タイマー2
#define OFFSET_REG_TM2CNT_L 0x108
#define OFFSET_REG_TM2CNT_H 0x10a
#define OFFSET_REG_TM3CNT 0x10c // タイマー3
#define OFFSET_REG_TM3CNT_L 0x10c
#define OFFSET_REG_TM3CNT_H 0x10e
#define OFFSET_REG_SOUNDCNT 0x500 // サウンド・マスタコントロール
#define OFFSET_REG_SOUNDBIAS 0x504 // サウンドBIAS
#define OFFSET_REG_SNDCAPCNT 0x508 // サウンドキャプチャコントロール
#define OFFSET_REG_SNDCAP0DAD 0x510 // サウンドキャプチャ0パラメータ
#define OFFSET_REG_SNDCAP0LEN 0x514
#define OFFSET_REG_SNDCAP1DAD 0x518 // サウンドキャプチャ1パラメータ
#define OFFSET_REG_SNDCAP1LEN 0x51c
#define OFFSET_REG_SOUND0CNT 0x400 // サウンド0コントロール
#define OFFSET_REG_SOUND0CNT_L 0x400
#define OFFSET_REG_SOUND0CNT_H 0x402
#define OFFSET_REG_SOUND0SAD 0x404
#define OFFSET_REG_SOUND0TMR 0x408
#define OFFSET_REG_SOUND0REPLEN 0x40c
#define OFFSET_REG_SOUND1CNT 0x410 // サウンド1コントロール
#define OFFSET_REG_SOUND1CNT_L 0x410
#define OFFSET_REG_SOUND1CNT_H 0x412
#define OFFSET_REG_SOUND1SAD 0x414
#define OFFSET_REG_SOUND1TMR 0x418
#define OFFSET_REG_SOUND1REPLEN 0x41c
#define OFFSET_REG_SOUND2CNT 0x420 // サウンド2コントロール
#define OFFSET_REG_SOUND2CNT_L 0x420
#define OFFSET_REG_SOUND2CNT_H 0x422
#define OFFSET_REG_SOUND2SAD 0x424
#define OFFSET_REG_SOUND2TMR 0x428
#define OFFSET_REG_SOUND2REPLEN 0x42c
#define OFFSET_REG_SOUND3CNT 0x430 // サウンド3コントロール
#define OFFSET_REG_SOUND3CNT_L 0x430
#define OFFSET_REG_SOUND3CNT_H 0x432
#define OFFSET_REG_SOUND3SAD 0x434
#define OFFSET_REG_SOUND3TMR 0x438
#define OFFSET_REG_SOUND3REPLEN 0x43c
#define OFFSET_REG_SOUND4CNT 0x440 // サウンド4コントロール
#define OFFSET_REG_SOUND4CNT_L 0x440
#define OFFSET_REG_SOUND4CNT_H 0x442
#define OFFSET_REG_SOUND4SAD 0x444
#define OFFSET_REG_SOUND4TMR 0x448
#define OFFSET_REG_SOUND4REPLEN 0x44c
#define OFFSET_REG_SOUND5CNT 0x450 // サウンド5コントロール
#define OFFSET_REG_SOUND5CNT_L 0x450
#define OFFSET_REG_SOUND5CNT_H 0x452
#define OFFSET_REG_SOUND5SAD 0x454
#define OFFSET_REG_SOUND5TMR 0x458
#define OFFSET_REG_SOUND5REPLEN 0x45c
#define OFFSET_REG_SOUND6CNT 0x460 // サウンド6コントロール
#define OFFSET_REG_SOUND6CNT_L 0x460
#define OFFSET_REG_SOUND6CNT_H 0x462
#define OFFSET_REG_SOUND6SAD 0x464
#define OFFSET_REG_SOUND6TMR 0x468
#define OFFSET_REG_SOUND6REPLEN 0x46c
#define OFFSET_REG_SOUND7CNT 0x470 // サウンド7コントロール
#define OFFSET_REG_SOUND7CNT_L 0x470
#define OFFSET_REG_SOUND7CNT_H 0x472
#define OFFSET_REG_SOUND7SAD 0x474
#define OFFSET_REG_SOUND7TMR 0x478
#define OFFSET_REG_SOUND7REPLEN 0x47c
#define OFFSET_REG_SOUND8CNT 0x480 // サウンド8コントロール
#define OFFSET_REG_SOUND8CNT_L 0x480
#define OFFSET_REG_SOUND8CNT_H 0x482
#define OFFSET_REG_SOUND8SAD 0x484
#define OFFSET_REG_SOUND8TMR 0x488
#define OFFSET_REG_SOUND8REPLEN 0x48c
#define OFFSET_REG_SOUND9CNT 0x490 // サウンド9コントロール
#define OFFSET_REG_SOUND9CNT_L 0x490
#define OFFSET_REG_SOUND9CNT_H 0x492
#define OFFSET_REG_SOUND9SAD 0x494
#define OFFSET_REG_SOUND9TMR 0x498
#define OFFSET_REG_SOUND9REPLEN 0x49c
#define OFFSET_REG_SOUND10CNT 0x4a0 // サウンド10コントロール
#define OFFSET_REG_SOUND10CNT_L 0x4a0
#define OFFSET_REG_SOUND10CNT_H 0x4a2
#define OFFSET_REG_SOUND10SAD 0x4a4
#define OFFSET_REG_SOUND10TMR 0x4a8
#define OFFSET_REG_SOUND10REPLEN 0x4ac
#define OFFSET_REG_SOUND11CNT 0x4b0 // サウンド11コントロール
#define OFFSET_REG_SOUND11CNT_L 0x4b0
#define OFFSET_REG_SOUND11CNT_H 0x4b2
#define OFFSET_REG_SOUND11SAD 0x4b4
#define OFFSET_REG_SOUND11TMR 0x4b8
#define OFFSET_REG_SOUND11REPLEN 0x4bc
#define OFFSET_REG_SOUND12CNT 0x4c0 // サウンド12コントロール
#define OFFSET_REG_SOUND12CNT_L 0x4c0
#define OFFSET_REG_SOUND12CNT_H 0x4c2
#define OFFSET_REG_SOUND12SAD 0x4c4
#define OFFSET_REG_SOUND12TMR 0x4c8
#define OFFSET_REG_SOUND12REPLEN 0x4cc
#define OFFSET_REG_SOUND13CNT 0x4d0 // サウンド13コントロール
#define OFFSET_REG_SOUND13CNT_L 0x4d0
#define OFFSET_REG_SOUND13CNT_H 0x4d2
#define OFFSET_REG_SOUND13SAD 0x4d4
#define OFFSET_REG_SOUND13TMR 0x4d8
#define OFFSET_REG_SOUND13REPLEN 0x4dc
#define OFFSET_REG_SOUND14CNT 0x4e0 // サウンド14コントロール
#define OFFSET_REG_SOUND14CNT_L 0x4e0
#define OFFSET_REG_SOUND14CNT_H 0x4e2
#define OFFSET_REG_SOUND14SAD 0x4e4
#define OFFSET_REG_SOUND14TMR 0x4e8
#define OFFSET_REG_SOUND14REPLEN 0x4ec
#define OFFSET_REG_SOUND15CNT 0x4f0 // サウンド15コントロール
#define OFFSET_REG_SOUND15CNT_L 0x4f0
#define OFFSET_REG_SOUND15CNT_H 0x4f2
#define OFFSET_REG_SOUND15SAD 0x4f4
#define OFFSET_REG_SOUND15TMR 0x4f8
#define OFFSET_REG_SOUND15REPLEN 0x4fc
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_SUBP_MEMORY_MAP_H

View File

@ -0,0 +1,529 @@
;=======================================================================
; IrisSubpMemoryMapArm.s
; IRISサブプロセッサ メモリマップ定数ARMASM用
;
; Copyright (C) 2002-2004 NINTENDO Co.,Ltd.
;=======================================================================
IF :DEF: _IRIS_SUBP_MEMORY_MAP_H
ELSE
_IRIS_SUBP_MEMORY_MAP_H * 1
INCLUDE IrisSubpTargetArm.s
;-----------------------------------------------------------------------
; メモリ・マップ
;-----------------------------------------------------------------------
SHARE_WORK * 0x027ff000 ; CPU間共有ワーク領域
SHARE_WORK_END * 0x02800000
IF :DEF: NDEBUG
SUBP_PRV * 0x02380000 ; サブプロセッサ専有領域(リリースバージョン)
ELSE
IF :DEF: MMEM_4M
SUBP_PRV * 0x02300000 ; (デバッグバージョン<メインメモリ4M本体>)
ELSE
SUBP_PRV * 0x02600000 ; (デバッグバージョン<メインメモリ8M本体>)
ENDIF
ENDIF
SUBP_PRV_END * SHARED_WORK
MAIN_MEM * 0x02000000 ; メインメモリ
MAIN_MEM_END * (MAIN_MEM + 0x400000)
MAIN_MEM_EX_END * (MAIN_MEM + 0x800000) ;(拡張時の最終アドレス)
MAIN_MEM_CMD_AREA * (MAIN_MEM_EX_END - 0x2) ; メインメモリコマンド発行エリア(使用禁止エリア)
SHARED_LOCK_BUF * (MAIN_MEM_EX_END - 0x40) ; 共有リソース・ロックバッファ
SHARED_LOCK_BUF_END * (MAIN_MEM_EX_END - 0x10)
INIT_LOCK_BUF * (MAIN_MEM_EX_END - 0x10) ; 初期化ロックバッファ
CARTRIDGE_LOCK_BUF * (MAIN_MEM_EX_END - 0x18) ; カートリッジ・ロックバッファ
CARD_LOCK_BUF * (MAIN_MEM_EX_END - 0x20) ; カード・ロックバッファ
WRAM_BLOCK1_LOCK_BUF * (MAIN_MEM_EX_END - 0x28) ; CPU内部ワークRAM・ブロック1・ロックバッファ
WRAM_BLOCK0_LOCK_BUF * (MAIN_MEM_EX_END - 0x30) ; ブロック0・ロックバッファ
VRAM_D_LOCK_BUF * (MAIN_MEM_EX_END - 0x38) ; VRAM-D・ロックバッファ
VRAM_C_LOCK_BUF * (MAIN_MEM_EX_END - 0x40) ; C・ロックバッファ
TO_MAINP_IF_BUF * (MAIN_MEM_EX_END - 0x50) ; サブ→メインプロセッサ割り込み要求フラグ(2Byte×8)
WM_TO_MAINP_IF_BUF * (MAIN_MEM_EX_END - 0x50) ; ワイヤレスマネージャ予約
FROM_MAINP_IF_BUF * (MAIN_MEM_EX_END - 0x60) ; メイン→サブプロセッサ割り込み要求フラグ(2Byte×8)
WM_FROM_MAINP_IF_BUF * (MAIN_MEM_EX_END - 0x60) ; ワイヤレスマネージャ予約
ROM_HEADER_BUF * (MAIN_MEM_EX_END - 0x200); ROM内登録エリアデータ・バッファ
IF :DEF: IRIS_TS
PRV_WRAM_DF_SIZE * 0x8000 ; CPU内部専有ワークRAM TS-TEG差分サイズ
ELSE
PRV_WRAM_DF_SIZE * 0
ENDIF
CPU_WRAM * 0x037f8000 ; CPU内部ワークRAM 3ブロック構成時(デフォルト)
CPU_WRAM_END * (CPU_WRAM + PRV_WRAM_DF_SIZE + 0x10000)
CPU_WRAM_2B * 0x037fc000 ; 2ブロック構成時
CPU_WRAM_2B_END * (CPU_WRAM_2B + PRV_WRAM_DF_SIZE + 0xc000)
CPU_WRAM_BLOCK0 * 0x037f8000 ; ブロック0
CPU_WRAM_BLOCK0_END * (CPU_WRAM_BLOCK0 + 0x4000)
CPU_WRAM_BLOCK1 * 0x037fc000 ; ブロック1
CPU_WRAM_BLOCK1_END * (CPU_WRAM_BLOCK1 + 0x4000)
PRV_WRAM * 0x03800000 ; CPU内部専有ワークRAM
PRV_WRAM_END * (PRV_WRAM + PRV_WRAM_DF_SIZE + 0x8000)
CPU_XWRAM * 0x06000000 ; CPU内部拡張ワークRAM
CPU_XWRAM_END * (CPU_XWRAM +0x40000)
INTR_VECTOR_BUF * (CPU_WRAM_END - 0x4); 割り込み分岐アドレス
INTR_CHECK_BUF * (CPU_WRAM_END - 0x8); 割り込みチェック
SEND_FIFO_LOCK_BUF * (CPU_WRAM_END - 0x10); CPU間送信FIFO・ロックバッファ
TIMER3_LOCK_BUF * (CPU_WRAM_END - 0x12); タイマー3・ロックバッファ
TIMER2_LOCK_BUF * (CPU_WRAM_END - 0x14); タイマー2
TIMER1_LOCK_BUF * (CPU_WRAM_END - 0x16); タイマー1
TIMER0_LOCK_BUF * (CPU_WRAM_END - 0x18); タイマー0
DMA3_LOCK_BUF * (CPU_WRAM_END - 0x1a); DMA3・ロックバッファ
DMA2_LOCK_BUF * (CPU_WRAM_END - 0x1c);
DMA1_LOCK_BUF * (CPU_WRAM_END - 0x1e);
DMA0_LOCK_BUF * (CPU_WRAM_END - 0x20);
REG_BASE * 0x04000000 ; レジスタ群
WIRELESS_INTF * 0x04800000 ; 無線通信インタフェース
WIRELESS_INTF0 * 0x04800000 ; インタフェース0
WIRELESS_INTF1 * 0x04808000 ; インタフェース1
WIRELESS_INTF0_END * (WIRELESS_INTF0 + 0x8000)
WIRELESS_INTF1_END * (WIRELESS_INTF1 + 0x8000)
WIRELESS_INTF_END * (WIRELESS_INTF + 0x10000)
CARTRIDGE * 0x08000000 ; カートリッジ
CTRDG_AD16_BANK0 * 0x08000000 ; カートリッジ AD16バス バンク0
CTRDG_AD16_BANK0_END * 0x0a000000
CTRDG_AD16_BANK1 * 0x0a000000 ; バンク1
CTRDG_AD16_BANK1_END * 0x0c000000
CTRDG_AD16_BANK2 * 0x0c000000 ; バンク2
CTRDG_AD16_BANK2_END * 0x0e000000
CTRDG_DT8 * 0x0e000000 ; カートリッジ 8bitデータバス
CTRDG_DT8_END * 0x10000000
;-----------------------------------------------------------------------
; メモリ・サイズ
;-----------------------------------------------------------------------
SHARED_WORK_SIZE * (SHARED_WORK_END - SHARED_WORK) ; CPU間共有ワーク領域(4KB以上、2のべき乗サイズ)
SUBP_PRV_SIZE * (SUBP_PRV_END - SUBP_PRV) ; サブプロセッサ専有領域(32KB以上、2のべき乗サイズ)
SHARED_LOCK_BUF_SIZE * (SHARED_LOCK_BUF_END - SHARED_LOCK_BUF) ; 共有リソース・ロックバッファ
MAIN_MEM_SIZE * 0x400000 ; メインメモリ
MAIN_MEM_EX_SIZE * 0x800000 ; (拡張時)
CPU_WRAM_SIZE * (0x10000 + PRV_WRAM_DF_SIZE) ; CPU内部ワークRAM 3ブロック構成時(デフォルト)
CPU_WRAM_2B_SIZE * (0xc000 + PRV_WRAM_DF_SIZE) ; 2ブロック構成時
CPU_WRAM_BLOCK0_SIZE * 0x4000 ; ブロック0
CPU_WRAM_BLOCK1_SIZE * 0x4000 ; ブロック1
PRV_WRAM_SIZE * (0x8000 + PRV_WRAM_DF_SIZE) ; CPU内部専有ワークRAM
CPU_XWRAM_SIZE * 0x40000 ; CPU内部拡張ワークRAM
MROM_PAGE_SIZE * 512 ; マスクROM・ページ
CARTRIDGE_SIZE * 0x02000000 ; カートリッジ
CTRDG_AD16_BANK_SIZE * 0x02000000 ; カートリッジ AD16バス バンク
CTRDG_AD16_BANK0_SIZE * 0x02000000 ; バンク0
CTRDG_AD16_BANK1_SIZE * 0x02000000 ; バンク1
CTRDG_AD16_BANK2_SIZE * 0x02000000 ; バンク2
CTRDG_DT8_SIZE * 0x02000000 ; カートリッジ 8bitデータバス
;-----------------------------------------------------------------------
; レジスタ・アドレス
;-----------------------------------------------------------------------
REG_IME * (REG_BASE + 0x208) ; 割り込みマスタイネーブル
REG_IE * (REG_BASE + 0x210) ; 割り込み許可
REG_IF * (REG_BASE + 0x214) ; 割り込み要求
REG_MAINPINTF * (REG_BASE + 0x180) ; メインプロセッサインタフェース
REG_MAINP_FIFO_CNT * (REG_BASE + 0x184) ; CPU間FIFOコントロール
REG_SEND_FIFO * (REG_BASE + 0x188) ; 送信FIFO
REG_RECV_FIFO * (REG_BASE + 0x100000) ; 受信FIFO
REG_POWCNT * (REG_BASE + 0x304) ; パワーコントロール
REG_EXMEMCNT * (REG_BASE + 0x204) ; 外部メモリコントロール
REG_VRAMSTAT * (REG_BASE + 0x240) ; VRAMステータス
REG_WRAMSTAT * (REG_BASE + 0x241) ; 内部ワークRAMステータス
REG_WVRAMSTAT * (REG_BASE + 0x240) ; C・D 内部ワークRAM ステータス
REG_DISPSTAT * (REG_BASE + 0x4) ; 表示ステータス
REG_VCOUNT * (REG_BASE + 0x6) ; Vカウンタ
REG_SPICNT * (REG_BASE + 0x1c0) ; SPIコントロール
REG_SPIDATA * (REG_BASE + 0x1c2) ; SPIデータ
REG_RCNT * (REG_BASE + 0x134) ; 汎用入出力コントロール
REG_KEYINPUT * (REG_BASE + 0x130) ; キー入力
REG_KEYCNT * (REG_BASE + 0x132) ; キーコントロール
REG_DMA0 * (REG_BASE + 0xb0) ;
REG_DMA0SAD * (REG_BASE + 0xb0)
REG_DMA0DAD * (REG_BASE + 0xb4)
REG_DMA0CNT * (REG_BASE + 0xb8)
REG_DMA0CNT_L * (REG_BASE + 0xb8)
REG_DMA0CNT_H * (REG_BASE + 0xba)
REG_DMA1 * (REG_BASE + 0xbc) ;
REG_DMA1SAD * (REG_BASE + 0xbc)
REG_DMA1DAD * (REG_BASE + 0xc0)
REG_DMA1CNT * (REG_BASE + 0xc4)
REG_DMA1CNT_L * (REG_BASE + 0xc4)
REG_DMA1CNT_H * (REG_BASE + 0xc6)
REG_DMA2 * (REG_BASE + 0xc8) ;
REG_DMA2SAD * (REG_BASE + 0xc8)
REG_DMA2DAD * (REG_BASE + 0xcc)
REG_DMA2CNT * (REG_BASE + 0xd0)
REG_DMA2CNT_L * (REG_BASE + 0xd0)
REG_DMA2CNT_H * (REG_BASE + 0xd2)
REG_DMA3 * (REG_BASE + 0xd4) ;
REG_DMA3SAD * (REG_BASE + 0xd4)
REG_DMA3DAD * (REG_BASE + 0xd8)
REG_DMA3CNT * (REG_BASE + 0xdc)
REG_DMA3CNT_L * (REG_BASE + 0xdc)
REG_DMA3CNT_H * (REG_BASE + 0xde)
REG_TM0CNT * (REG_BASE + 0x100) ; タイマー0
REG_TM0CNT_L * (REG_BASE + 0x100)
REG_TM0CNT_H * (REG_BASE + 0x102)
REG_TM1CNT * (REG_BASE + 0x104) ; タイマー1
REG_TM1CNT_L * (REG_BASE + 0x104)
REG_TM1CNT_H * (REG_BASE + 0x106)
REG_TM2CNT * (REG_BASE + 0x108) ; タイマー2
REG_TM2CNT_L * (REG_BASE + 0x108)
REG_TM2CNT_H * (REG_BASE + 0x10a)
REG_TM3CNT * (REG_BASE + 0x10c) ; タイマー3
REG_TM3CNT_L * (REG_BASE + 0x10c)
REG_TM3CNT_H * (REG_BASE + 0x10e)
REG_SOUNDCNT * (REG_BASE + 0x500) ; サウンド・マスタコントロール
REG_SOUNDBIAS * (REG_BASE + 0x504) ; サウンドBIAS
REG_SNDCAPCNT * (REG_BASE + 0x508) ; サウンドキャプチャコントロール
REG_SNDCAP0DAD * (REG_BASE + 0x510) ; サウンドキャプチャ0パラメータ
REG_SNDCAP0LEN * (REG_BASE + 0x514)
REG_SNDCAP1DAD * (REG_BASE + 0x518) ; サウンドキャプチャ1パラメータ
REG_SNDCAP1LEN * (REG_BASE + 0x51c)
REG_SOUND0CNT * (REG_BASE + 0x400) ; サウンド0コントロール
REG_SOUND0CNT_L * (REG_BASE + 0x400)
REG_SOUND0CNT_H * (REG_BASE + 0x402)
REG_SOUND0SAD * (REG_BASE + 0x404)
REG_SOUND0TMR * (REG_BASE + 0x408)
REG_SOUND0RPT_PT * (REG_BASE + 0x40a)
REG_SOUND0RPT_LEN * (REG_BASE + 0x40c)
REG_SOUND1CNT * (REG_BASE + 0x410) ; サウンド1コントロール
REG_SOUND1CNT_L * (REG_BASE + 0x410)
REG_SOUND1CNT_H * (REG_BASE + 0x412)
REG_SOUND1SAD * (REG_BASE + 0x414)
REG_SOUND1TMR * (REG_BASE + 0x418)
REG_SOUND1RPT_PT * (REG_BASE + 0x41a)
REG_SOUND1RPT_LEN * (REG_BASE + 0x41c)
REG_SOUND2CNT * (REG_BASE + 0x420) ; サウンド2コントロール
REG_SOUND2CNT_L * (REG_BASE + 0x420)
REG_SOUND2CNT_H * (REG_BASE + 0x422)
REG_SOUND2SAD * (REG_BASE + 0x424)
REG_SOUND2TMR * (REG_BASE + 0x428)
REG_SOUND2RPT_PT * (REG_BASE + 0x42a)
REG_SOUND2RPT_LEN * (REG_BASE + 0x42c)
REG_SOUND3CNT * (REG_BASE + 0x430) ; サウンド3コントロール
REG_SOUND3CNT_L * (REG_BASE + 0x430)
REG_SOUND3CNT_H * (REG_BASE + 0x432)
REG_SOUND3SAD * (REG_BASE + 0x434)
REG_SOUND3TMR * (REG_BASE + 0x438)
REG_SOUND3RPT_PT * (REG_BASE + 0x43a)
REG_SOUND3RPT_LEN * (REG_BASE + 0x43c)
REG_SOUND4CNT * (REG_BASE + 0x440) ; サウンド4コントロール
REG_SOUND4CNT_L * (REG_BASE + 0x440)
REG_SOUND4CNT_H * (REG_BASE + 0x442)
REG_SOUND4SAD * (REG_BASE + 0x444)
REG_SOUND4TMR * (REG_BASE + 0x448)
REG_SOUND4RPT_PT * (REG_BASE + 0x44a)
REG_SOUND4RPT_LEN * (REG_BASE + 0x44c)
REG_SOUND5CNT * (REG_BASE + 0x450) ; サウンド5コントロール
REG_SOUND5CNT_L * (REG_BASE + 0x450)
REG_SOUND5CNT_H * (REG_BASE + 0x452)
REG_SOUND5SAD * (REG_BASE + 0x454)
REG_SOUND5TMR * (REG_BASE + 0x458)
REG_SOUND5RPT_PT * (REG_BASE + 0x45a)
REG_SOUND5RPT_LEN * (REG_BASE + 0x45c)
REG_SOUND6CNT * (REG_BASE + 0x460) ; サウンド6コントロール
REG_SOUND6CNT_L * (REG_BASE + 0x460)
REG_SOUND6CNT_H * (REG_BASE + 0x462)
REG_SOUND6SAD * (REG_BASE + 0x464)
REG_SOUND6TMR * (REG_BASE + 0x468)
REG_SOUND6RPT_PT * (REG_BASE + 0x46a)
REG_SOUND6RPT_LEN * (REG_BASE + 0x46c)
REG_SOUND7CNT * (REG_BASE + 0x470) ; サウンド7コントロール
REG_SOUND7CNT_L * (REG_BASE + 0x470)
REG_SOUND7CNT_H * (REG_BASE + 0x472)
REG_SOUND7SAD * (REG_BASE + 0x474)
REG_SOUND7TMR * (REG_BASE + 0x478)
REG_SOUND7RPT_PT * (REG_BASE + 0x47a)
REG_SOUND7RPT_LEN * (REG_BASE + 0x47c)
REG_SOUND8CNT * (REG_BASE + 0x480) ; サウンド8コントロール
REG_SOUND8CNT_L * (REG_BASE + 0x480)
REG_SOUND8CNT_H * (REG_BASE + 0x482)
REG_SOUND8SAD * (REG_BASE + 0x484)
REG_SOUND8TMR * (REG_BASE + 0x488)
REG_SOUND8RPT_PT * (REG_BASE + 0x48a)
REG_SOUND8RPT_LEN * (REG_BASE + 0x48c)
REG_SOUND9CNT * (REG_BASE + 0x490) ; サウンド9コントロール
REG_SOUND9CNT_L * (REG_BASE + 0x490)
REG_SOUND9CNT_H * (REG_BASE + 0x492)
REG_SOUND9SAD * (REG_BASE + 0x494)
REG_SOUND9TMR * (REG_BASE + 0x498)
REG_SOUND9RPT_PT * (REG_BASE + 0x49a)
REG_SOUND9RPT_LEN * (REG_BASE + 0x49c)
REG_SOUND10CNT * (REG_BASE + 0x4a0) ; サウンド10コントロール
REG_SOUND10CNT_L * (REG_BASE + 0x4a0)
REG_SOUND10CNT_H * (REG_BASE + 0x4a2)
REG_SOUND10SAD * (REG_BASE + 0x4a4)
REG_SOUND10TMR * (REG_BASE + 0x4a8)
REG_SOUND10RPT_PT * (REG_BASE + 0x4aa)
REG_SOUND10RPT_LEN * (REG_BASE + 0x4ac)
REG_SOUND11CNT * (REG_BASE + 0x4b0) ; サウンド11コントロール
REG_SOUND11CNT_L * (REG_BASE + 0x4b0)
REG_SOUND11CNT_H * (REG_BASE + 0x4b2)
REG_SOUND11SAD * (REG_BASE + 0x4b4)
REG_SOUND11TMR * (REG_BASE + 0x4b8)
REG_SOUND11RPT_PT * (REG_BASE + 0x4ba)
REG_SOUND11RPT_LEN * (REG_BASE + 0x4bc)
REG_SOUND12CNT * (REG_BASE + 0x4c0) ; サウンド12コントロール
REG_SOUND12CNT_L * (REG_BASE + 0x4c0)
REG_SOUND12CNT_H * (REG_BASE + 0x4c2)
REG_SOUND12SAD * (REG_BASE + 0x4c4)
REG_SOUND12TMR * (REG_BASE + 0x4c8)
REG_SOUND12RPT_PT * (REG_BASE + 0x4ca)
REG_SOUND12RPT_LEN * (REG_BASE + 0x4cc)
REG_SOUND13CNT * (REG_BASE + 0x4d0) ; サウンド13コントロール
REG_SOUND13CNT_L * (REG_BASE + 0x4d0)
REG_SOUND13CNT_H * (REG_BASE + 0x4d2)
REG_SOUND13SAD * (REG_BASE + 0x4d4)
REG_SOUND13TMR * (REG_BASE + 0x4d8)
REG_SOUND13RPT_PT * (REG_BASE + 0x4da)
REG_SOUND13RPT_LEN * (REG_BASE + 0x4dc)
REG_SOUND14CNT * (REG_BASE + 0x4e0) ; サウンド14コントロール
REG_SOUND14CNT_L * (REG_BASE + 0x4e0)
REG_SOUND14CNT_H * (REG_BASE + 0x4e2)
REG_SOUND14SAD * (REG_BASE + 0x4e4)
REG_SOUND14TMR * (REG_BASE + 0x4e8)
REG_SOUND14RPT_PT * (REG_BASE + 0x4ea)
REG_SOUND14RPT_LEN * (REG_BASE + 0x4ec)
REG_SOUND15CNT * (REG_BASE + 0x4f0) ; サウンド15コントロール
REG_SOUND15CNT_L * (REG_BASE + 0x4f0)
REG_SOUND15CNT_H * (REG_BASE + 0x4f2)
REG_SOUND15SAD * (REG_BASE + 0x4f4)
REG_SOUND15TMR * (REG_BASE + 0x4f8)
REG_SOUND15RPT_PT * (REG_BASE + 0x4fa)
REG_SOUND15RPT_LEN * (REG_BASE + 0x4fc)
;-----------------------------------------------------------------------
; レジスタ・オフセット
;-----------------------------------------------------------------------
OFFSET_REG_IME * 0x208 ; 割り込みマスタイネーブル
OFFSET_REG_IE * 0x210 ; 割り込み許可
OFFSET_REG_IF * 0x214 ; 割り込み要求
OFFSET_REG_MAINPINTF * 0x180 ; メインプロセッサインタフェース
OFFSET_REG_MAINP_FIFO_CNT * 0x184 ; CPU間FIFOコントロール
OFFSET_REG_SEND_FIFO * 0x188 ; 送信FIFO
OFFSET_REG_RECV_FIFO * 0x100000 ; 受信FIFO
OFFSET_REG_POWCNT * 0x304 ; パワーコントロール
OFFSET_REG_EXMEMCNT * 0x204 ; 外部メモリコントロール
OFFSET_REG_VRAMSTAT * 0x240 ; VRAMステータス
OFFSET_REG_WRAMSTAT * 0x241 ; 内部ワークRAMステータス
OFFSET_REG_WVRAMSTAT * 0x240 ; C・D 内部ワークRAM ステータス
OFFSET_REG_DISPSTAT * 0x4 ; ステータス
OFFSET_REG_VCOUNT * 0x6 ; Vカウンタ
OFFSET_REG_SPICNT * 0x1c0 ; SPIコントロール
OFFSET_REG_SPIDATA * 0x1c2 ; SPIデータ
OFFSET_REG_RCNT * 0x134 ; 汎用入出力コントロール
OFFSET_REG_KEYINPUT * 0x130 ; キー入力
OFFSET_REG_KEYCNT * 0x132 ; キーコントロール
OFFSET_REG_DMA0 * 0xb0 ;
OFFSET_REG_DMA0SAD * 0xb0
OFFSET_REG_DMA0DAD * 0xb4
OFFSET_REG_DMA0CNT * 0xb8
OFFSET_REG_DMA0CNT_L * 0xb8
OFFSET_REG_DMA0CNT_H * 0xba
OFFSET_REG_DMA1 * 0xbc ;
OFFSET_REG_DMA1SAD * 0xbc
OFFSET_REG_DMA1DAD * 0xc0
OFFSET_REG_DMA1CNT * 0xc4
OFFSET_REG_DMA1CNT_L * 0xc4
OFFSET_REG_DMA1CNT_H * 0xc6
OFFSET_REG_DMA2 * 0xc8 ;
OFFSET_REG_DMA2SAD * 0xc8
OFFSET_REG_DMA2DAD * 0xcc
OFFSET_REG_DMA2CNT * 0xd0
OFFSET_REG_DMA2CNT_L * 0xd0
OFFSET_REG_DMA2CNT_H * 0xd2
OFFSET_REG_DMA3 * 0xd4 ;
OFFSET_REG_DMA3SAD * 0xd4
OFFSET_REG_DMA3DAD * 0xd8
OFFSET_REG_DMA3CNT * 0xdc
OFFSET_REG_DMA3CNT_L * 0xdc
OFFSET_REG_DMA3CNT_H * 0xde
OFFSET_REG_TM0CNT * 0x100 ; タイマー0
OFFSET_REG_TM0CNT_L * 0x100
OFFSET_REG_TM0CNT_H * 0x102
OFFSET_REG_TM1CNT * 0x104 ; タイマー1
OFFSET_REG_TM1CNT_L * 0x104
OFFSET_REG_TM1CNT_H * 0x106
OFFSET_REG_TM2CNT * 0x108 ; タイマー2
OFFSET_REG_TM2CNT_L * 0x108
OFFSET_REG_TM2CNT_H * 0x10a
OFFSET_REG_TM3CNT * 0x10c ; タイマー3
OFFSET_REG_TM3CNT_L * 0x10c
OFFSET_REG_TM3CNT_H * 0x10e
OFFSET_REG_SOUNDCNT * 0x500 ; サウンドマスタコントロール
OFFSET_REG_SOUNDBIAS * 0x504 ; サウンドBIAS
OFFSET_REG_SNDCAPCNT * 0x508 ; サウンドキャプチャコントロール
OFFSET_REG_SNDCAP0DAD * 0x510 ; サウンドキャプチャ0パラメータ
OFFSET_REG_SNDCAP0LEN * 0x514
OFFSET_REG_SNDCAP1DAD * 0x518 ; サウンドキャプチャ1パラメータ
OFFSET_REG_SNDCAP1LEN * 0x51c
OFFSET_REG_SOUND0CNT * 0x400 ; サウンド0コントロール
OFFSET_REG_SOUND0CNT_L * 0x400
OFFSET_REG_SOUND0CNT_H * 0x402
OFFSET_REG_SOUND0SAD * 0x404
OFFSET_REG_SOUND0TMR * 0x408
OFFSET_REG_SOUND0REPLEN * 0x40c
OFFSET_REG_SOUND1CNT * 0x410 ; サウンド1コントロール
OFFSET_REG_SOUND1CNT_L * 0x410
OFFSET_REG_SOUND1CNT_H * 0x412
OFFSET_REG_SOUND1SAD * 0x414
OFFSET_REG_SOUND1TMR * 0x418
OFFSET_REG_SOUND1REPLEN * 0x41c
OFFSET_REG_SOUND2CNT * 0x420 ; サウンド2コントロール
OFFSET_REG_SOUND2CNT_L * 0x420
OFFSET_REG_SOUND2CNT_H * 0x422
OFFSET_REG_SOUND2SAD * 0x424
OFFSET_REG_SOUND2TMR * 0x428
OFFSET_REG_SOUND2REPLEN * 0x42c
OFFSET_REG_SOUND3CNT * 0x430 ; サウンド3コントロール
OFFSET_REG_SOUND3CNT_L * 0x430
OFFSET_REG_SOUND3CNT_H * 0x432
OFFSET_REG_SOUND3SAD * 0x434
OFFSET_REG_SOUND3TMR * 0x438
OFFSET_REG_SOUND3REPLEN * 0x43c
OFFSET_REG_SOUND4CNT * 0x440 ; サウンド4コントロール
OFFSET_REG_SOUND4CNT_L * 0x440
OFFSET_REG_SOUND4CNT_H * 0x442
OFFSET_REG_SOUND4SAD * 0x444
OFFSET_REG_SOUND4TMR * 0x448
OFFSET_REG_SOUND4REPLEN * 0x44c
OFFSET_REG_SOUND5CNT * 0x450 ; サウンド5コントロール
OFFSET_REG_SOUND5CNT_L * 0x450
OFFSET_REG_SOUND5CNT_H * 0x452
OFFSET_REG_SOUND5SAD * 0x454
OFFSET_REG_SOUND5TMR * 0x458
OFFSET_REG_SOUND5REPLEN * 0x45c
OFFSET_REG_SOUND6CNT * 0x460 ; サウンド6コントロール
OFFSET_REG_SOUND6CNT_L * 0x460
OFFSET_REG_SOUND6CNT_H * 0x462
OFFSET_REG_SOUND6SAD * 0x464
OFFSET_REG_SOUND6TMR * 0x468
OFFSET_REG_SOUND6REPLEN * 0x46c
OFFSET_REG_SOUND7CNT * 0x470 ; サウンド7コントロール
OFFSET_REG_SOUND7CNT_L * 0x470
OFFSET_REG_SOUND7CNT_H * 0x472
OFFSET_REG_SOUND7SAD * 0x474
OFFSET_REG_SOUND7TMR * 0x478
OFFSET_REG_SOUND7REPLEN * 0x47c
OFFSET_REG_SOUND8CNT * 0x480 ; サウンド8コントロール
OFFSET_REG_SOUND8CNT_L * 0x480
OFFSET_REG_SOUND8CNT_H * 0x482
OFFSET_REG_SOUND8SAD * 0x484
OFFSET_REG_SOUND8TMR * 0x488
OFFSET_REG_SOUND8REPLEN * 0x48c
OFFSET_REG_SOUND9CNT * 0x490 ; サウンド9コントロール
OFFSET_REG_SOUND9CNT_L * 0x490
OFFSET_REG_SOUND9CNT_H * 0x492
OFFSET_REG_SOUND9SAD * 0x494
OFFSET_REG_SOUND9TMR * 0x498
OFFSET_REG_SOUND9REPLEN * 0x49c
OFFSET_REG_SOUND10CNT * 0x4a0 ; サウンド10コントロール
OFFSET_REG_SOUND10CNT_L * 0x4a0
OFFSET_REG_SOUND10CNT_H * 0x4a2
OFFSET_REG_SOUND10SAD * 0x4a4
OFFSET_REG_SOUND10TMR * 0x4a8
OFFSET_REG_SOUND10REPLEN * 0x4ac
OFFSET_REG_SOUND11CNT * 0x4b0 ; サウンド11コントロール
OFFSET_REG_SOUND11CNT_L * 0x4b0
OFFSET_REG_SOUND11CNT_H * 0x4b2
OFFSET_REG_SOUND11SAD * 0x4b4
OFFSET_REG_SOUND11TMR * 0x4b8
OFFSET_REG_SOUND11REPLEN * 0x4bc
OFFSET_REG_SOUND12CNT * 0x4c0 ; サウンド12コントロール
OFFSET_REG_SOUND12CNT_L * 0x4c0
OFFSET_REG_SOUND12CNT_H * 0x4c2
OFFSET_REG_SOUND12SAD * 0x4c4
OFFSET_REG_SOUND12TMR * 0x4c8
OFFSET_REG_SOUND12REPLEN * 0x4cc
OFFSET_REG_SOUND13CNT * 0x4d0 ; サウンド13コントロール
OFFSET_REG_SOUND13CNT_L * 0x4d0
OFFSET_REG_SOUND13CNT_H * 0x4d2
OFFSET_REG_SOUND13SAD * 0x4d4
OFFSET_REG_SOUND13TMR * 0x4d8
OFFSET_REG_SOUND13REPLEN * 0x4dc
OFFSET_REG_SOUND14CNT * 0x4e0 ; サウンド14コントロール
OFFSET_REG_SOUND14CNT_L * 0x4e0
OFFSET_REG_SOUND14CNT_H * 0x4e2
OFFSET_REG_SOUND14SAD * 0x4e4
OFFSET_REG_SOUND14TMR * 0x4e8
OFFSET_REG_SOUND14REPLEN * 0x4ec
OFFSET_REG_SOUND15CNT * 0x4f0 ; サウンド15コントロール
OFFSET_REG_SOUND15CNT_L * 0x4f0
OFFSET_REG_SOUND15CNT_H * 0x4f2
OFFSET_REG_SOUND15SAD * 0x4f4
OFFSET_REG_SOUND15TMR * 0x4f8
OFFSET_REG_SOUND15REPLEN * 0x4fc
ENDIF ; _IRIS_SUBP_MEMORY_MAP_H
END

View File

@ -0,0 +1,455 @@
//====================================================================
// IrisSubpOS.h
// OSライブラリ
//
// Copyright (C) 2003-2004 NINTENDO Co.,Ltd.
//====================================================================
#ifndef _IRIS_SUBP_OS_H
#define _IRIS_SUBP_OS_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdlib.h>
#include <IrisSubpTarget.h>
#include <IrisSubpTypes.h>
//======================================================================
// ロック変数
//
//・カード/カートリッジ/CPU間共有内部ワークRAM/VRAM-C/D
// などのCPU間での共有リスースや、CPU間送信FIFO 等の専有リソース
// の排他制御ためにこの関数をご使用下さい。
//======================================================================
// ロックID
#define OS_UNLOCK_ID 0 // ロック変数がロックされていない場合のID
#define OS_MAINP_LOCKED_FLAG 0x40 // メインプロセッサによるロック確認フラグ
#define OS_MAINP_LOCK_ID_START 0x40 // メインプロセッサ用ロックIDの割り当て開始番号
#define OS_MAINP_LOCK_ID_END 0x6f // 割り当て終了番号
#define OS_MAINP_DBG_LOCK_ID 0x70 // デバッガ予約番号
#define OS_MAINP_SYSTEM_LOCK_ID 0x7f // システム予約番号
#define OS_SUBP_LOCKED_FLAG 0x80 // サブプロセッサによるロック確認フラグ
#define OS_SUBP_LOCK_ID_START 0x80 // サブプロセッサ用ロックIDの割り当て開始番号
#define OS_SUBP_LOCK_ID_END 0xaf // 割り当て終了番号
#define OS_SUBP_DBG_LOCK_ID 0xb0 // デバッガ予約番号
#define OS_SUBP_SYSTEM_LOCK_ID 0xbf // システム予約番号
#define OS_LOCK_SUCCESS 0 // ロック成功
#define OS_LOCK_ERROR -1 // ロックエラー
#define OS_UNLOCK_SUCCESS 0 // ロック解除成功
#define OS_UNLOCK_ERROR -2 // ロック解除エラー
#define OS_LOCK_FREE 0 // ロック解除中
#define OS_LOCK_ID_ERROR -3 // ロックIDエラー
// ロック変数構造体
typedef struct {
u32 lockFlag; // ロックフラグ試行モジュールID格納
u16 ownerID; // 取得モジュールID
u16 extension; // 拡張情報
} LockWord;
typedef vl LockWord vLockWord;
typedef struct {
u8 lockFlag; // ロックフラグ試行モジュールID格納
u8 ownerID; // 取得モジュールID
} LockByte;
typedef vl LockByte vLockByte;
//----------------------------------------------------------------------
// システムロック変数の初期化
//
//・システムロック変数を初期化します。
//
//・引数: なし
//
//・戻り値:なし
//
//※NSYNC_MAINP定義時であっても、カートリッジ排他制御領域は
// デバッガも使用するためクリアされません。
//----------------------------------------------------------------------
void OS_InitLock(void);
//----------------------------------------------------------------------
// ロックIDの獲得
//
//・ロック変数へ設定するIDを獲得します。
//
//・引数: なし
//
//・戻り値:
// 0x80 0xaf ロックID
// OS_LOCK_ID_ERROR ロックID獲得失敗
//
//※IDは48種類までしか割り当てることができません。
// モジュール内にて複数のロック変数を制御する場合は
// できるだけ1つのIDを使用するようにして下さい。
//----------------------------------------------------------------------
s32 OS_GetLockID(void);
//----------------------------------------------------------------------
// スピンロック(ワード/バイト)
//
//・プロセッサ間やモジュール間で共有リソースを排他制御するための
// ロック変数のスピンロックを行います。
//・ロックが成功するまで試行し続けます。
//・プロセッサ間の共有リソースは必ずロック後に使用して下さい。
//・プロセッサ専有のリソースはタイミング的に調整できるのであれば
// ロックしなくても構いません。
// 専有リソースはデバッグ時に限定してロックすることもできます。
//
//・引数:
// lockID ロックID
// lockp ロック変数のポインタ
// CtrlFuncp リソース制御関数のポインタ
//
//・戻り値:
// OS_LOCK_SUCCESS ロック成功
// OS_LOCK_ID_ERROR ロックIDエラー
//
//※但し、メインメモリに対してはキャッシュ経由でなければ
// バイトアクセスはできないことに注意して下さい。
// ですので、メインメモリ上では基本的に OS_LockWord() を使用して下さい。
//----------------------------------------------------------------------
s32 OS_LockWord(u32 lockID, volatile LockWord *lockp, void (*CtrlFuncp)(void));
s32 OS_LockByte(u32 lockID, volatile LockByte *lockp, void (*CtrlFuncp)(void));
s32 OS_LockCard(u32 lockID); // カード
s32 OS_LockCartridge(u32 lockID); // カートリッジ
s32 OS_LockWramBlock0(u32 lockID); // CPU内部ワークRAM・ブロック0
s32 OS_LockWramBlock1(u32 lockID); // CPU内部ワークRAM・ブロック1
s32 OS_LockVramC(u32 lockID); //
s32 OS_LockVramD(u32 lockID); //
s32 OS_LockSendFifo(u32 lockID); // CPU間送信FIFO
s32 OS_LockDma0(u32 lockID); //
s32 OS_LockDma1(u32 lockID); //
s32 OS_LockDma2(u32 lockID); //
s32 OS_LockDma3(u32 lockID); //
s32 OS_LockTimer0(u32 lockID); // タイマー0
s32 OS_LockTimer1(u32 lockID); // タイマー1
s32 OS_LockTimer2(u32 lockID); // タイマー2
s32 OS_LockTimer3(u32 lockID); // タイマー3
//----------------------------------------------------------------------
// ロックの解除(ワード/バイト)
//
//・ロックを解除します。
//・ロックしていないモジュールが実行した場合には解除されず、
// OS_UNLOCK_ERROR が返されます。
//
//・引数:
// lockID ロックID
// lockp ロック変数のポインタ
// CtrlFuncp リソース制御関数のポインタ
//
//・戻り値:
// 正 ロック中直前に格納されていたID
// OS_UNLOCK_ERROR ロック解除エラー
// OS_LOCK_ID_ERROR ロックIDエラー
//
//※但し、メインメモリに対してはキャッシュ経由でなければ
// バイトアクセスはできないことに注意して下さい。
// ですので、メインメモリ上では基本的に OS_UnLockWord() を使用して下さい。
//----------------------------------------------------------------------
s32 OS_UnLockWord(u32 lockID, volatile LockWord *lockp, void (*CtrlFuncp)(void));
s32 OS_UnLockByte(u32 lockID, volatile LockByte *lockp, void (*CtrlFuncp)(void));
s32 OS_UnLockCard(u32 lockID); // カード
s32 OS_UnLockCartridge(u32 lockID); // カートリッジ
s32 OS_UnLockWramBlock0(u32 lockID); // CPU内部ワークRAM・ブロック0
s32 OS_UnLockWramBlock1(u32 lockID); // CPU内部ワークRAM・ブロック1
s32 OS_UnLockVramC(u32 lockID); //
s32 OS_UnLockVramD(u32 lockID); //
s32 OS_UnLockSendFifo(u32 lockID); // CPU間送信FIFO
s32 OS_UnLockDma0(u32 lockID); //
s32 OS_UnLockDma1(u32 lockID); //
s32 OS_UnLockDma2(u32 lockID); //
s32 OS_UnLockDma3(u32 lockID); //
s32 OS_UnLockTimer0(u32 lockID); // タイマー0
s32 OS_UnLockTimer1(u32 lockID); // タイマー1
s32 OS_UnLockTimer2(u32 lockID); // タイマー2
s32 OS_UnLockTimer3(u32 lockID); // タイマー3
//----------------------------------------------------------------------
// ロックの試行(ワード/バイト)
//
//・1回だけスピンロックを試行します。
//・プロセッサ間の共有リソースは必ずロック後に使用して下さい。
//・プロセッサ専有のリソースはタイミング的に調整できるのであれば
// ロックしなくても構いません。
// 専有リソースはデバッグ時に限定してロックすることもできます。
//
//・引数:
// lockID ロックID
// lockp ロック変数のポインタ
// CtrlFuncp リソース制御関数のポインタ
//
//・戻り値:
// 正 ロック中直前に格納されていたID
// OS_LOCK_SUCCESS ロック成功
// OS_LOCK_ID_ERROR ロックIDエラー
//
//※但し、メインメモリに対してはキャッシュ経由でなければ
// バイトアクセスはできないことに注意して下さい。
// ですので、メインメモリ上では基本的に OS_TryLockWord() を使用して下さい。
//----------------------------------------------------------------------
s32 OS_TryLockWord(u32 lockID, volatile LockWord *lockp, void (*CtrlFuncp)(void));
s32 OS_TryLockByte(u32 lockID, volatile LockByte *lockp, void (*CtrlFuncp)(void));
s32 OS_TryLockCard(u32 lockID); // カード
s32 OS_TryLockCartridge(u32 lockID); // カートリッジ
s32 OS_TryLockWramBlock0(u32 lockID); // CPU内部ワークRAM・ブロック0
s32 OS_TryLockWramBlock1(u32 lockID); // CPU内部ワークRAM・ブロック1
s32 OS_TryLockVramC(u32 lockID); //
s32 OS_TryLockVramD(u32 lockID); //
s32 OS_TryLockSendFifo(u32 lockID); // CPU間送信FIFO
s32 OS_TryLockDma0(u32 lockID); //
s32 OS_TryLockDma1(u32 lockID); //
s32 OS_TryLockDma2(u32 lockID); //
s32 OS_TryLockDma3(u32 lockID); //
s32 OS_TryLockTimer0(u32 lockID); // タイマー0
s32 OS_TryLockTimer1(u32 lockID); // タイマー1
s32 OS_TryLockTimer2(u32 lockID); // タイマー2
s32 OS_TryLockTimer3(u32 lockID); // タイマー3
//----------------------------------------------------------------------
// ロックフラグの読み込み(ワード/バイト)
//
//・ロックフラグを読み込みます。
//・ロック変数が解除されているかどうかを確認することができます。
//
//・引数:
// lockp ロック変数のポインタ
//
//・戻り値:
// 非0 ロック中直前に格納されていたID
// OS_LOCK_FREE ロック解除中
//
//※但し、メインメモリに対してはキャッシュ経由でなければ
// バイトアクセスはできないことに注意して下さい。
// ですので、メインメモリ上では基本的に OS_ReadLockWord() を使用して下さい。
//----------------------------------------------------------------------
s32 OS_ReadLockWord(volatile LockWord *lockp);
s32 OS_ReadLockByte(volatile LockByte *lockp);
// カード
#ifdef IRIS_TS
#define OS_ReadLockCard() OS_ReadLockWord((LockWord *)(CARD_LOCK_BUF))
#else
#define OS_ReadLockCard() OS_ReadLockCartridge() // カートリッジで代用
#endif
// カートリッジ
#define OS_ReadLockCartridge() OS_ReadLockWord((LockWord *)(CARTRIDGE_LOCK_BUF))
// CPU内部ワークRAM・ブロック0
#define OS_ReadLockWramBlock0() OS_ReadLockWord((LockWord *)(WRAM_BLOCK0_LOCK_BUF))
// CPU内部ワークRAM・ブロック1
#define OS_ReadLockWramBlock1() OS_ReadLockWord((LockWord *)(WRAM_BLOCK1_LOCK_BUF))
//
#define OS_ReadLockVramC() OS_ReadLockWord((LockWord *)(VRAM_C_LOCK_BUF))
//
#define OS_ReadLockVramD() OS_ReadLockWord((LockWord *)(VRAM_D_LOCK_BUF))
// CPU間送信FIFO
#define OS_ReadLockSendFifo() OS_ReadLockByte((LockByte *)(SEND_FIFO_LOCK_BUF))
//
#define OS_ReadLockDma0() OS_ReadLockByte((LockByte *)(DMA0_LOCK_BUF))
//
#define OS_ReadLockDma1() OS_ReadLockByte((LockByte *)(DMA1_LOCK_BUF))
//
#define OS_ReadLockDma2() OS_ReadLockByte((LockByte *)(DMA2_LOCK_BUF))
//
#define OS_ReadLockDma3() OS_ReadLockByte((LockByte *)(DMA3_LOCK_BUF))
// タイマー0
#define OS_ReadLockTimer0() OS_ReadLockByte((LockByte *)(TIMER0_LOCK_BUF))
// タイマー1
#define OS_ReadLockTimer1() OS_ReadLockByte((LockByte *)(TIMER1_LOCK_BUF))
// タイマー2
#define OS_ReadLockTimer2() OS_ReadLockByte((LockByte *)(TIMER2_LOCK_BUF))
// タイマー3
#define OS_ReadLockTimer3() OS_ReadLockByte((LockByte *)(TIMER3_LOCK_BUF))
//----------------------------------------------------------------------
// ロック変数の所有モジュールIDの読み込みワードバイト
//
//・ロック変数の所有モジュールID を読み込みます。
//・モジュールID が非0 の場合はその時点でどちらのプロセッサ側が
// 所有権を持っているのかを確認できます。
//・共有リソースの場合は「サブプロセッサ側が所有権を持っている状態」
// のみを割り込みを禁止することによって維持することができます。
// その他の状態はメインプロセッサが変化させてしまう可能性があります。
//・所有モジュールID が 0 であってもロック変数が解除されているとは限りません。
//
//・引数:
// lockp ロック変数のポインタ
//
//・戻り値: 所有モジュールID
//
//※但し、メインメモリに対してはキャッシュ経由でなければ
// バイトアクセスはできないことに注意して下さい。
// ですので、メインメモリ上では基本的に OS_ReadOwnerOfLockWord() を使用して下さい。
//----------------------------------------------------------------------
s32 OS_ReadOwnerOfLockWord(volatile LockWord *lockp);
s32 OS_ReadOwnerOfLockByte(volatile LockByte *lockp);
// カード
#ifdef IRIS_TS
#define OS_ReadOwnerOfLockCard() OS_ReadOwnerOfLockWord((LockWord *)(CARD_LOCK_BUF))
#else
#define OS_ReadOwnerOfLockCard() OS_ReadOwnerOfLockCartridge() // カートリッジで代用
#endif
// カートリッジ
#define OS_ReadOwnerOfLockCartridge() OS_ReadOwnerOfLockWord((LockWord *)(CARTRIDGE_LOCK_BUF))
// CPU内部ワークRAM・ブロック0
#define OS_ReadOwnerOfLockWramBlock0() OS_ReadOwnerOfLockWord((LockWord *)(WRAM_BLOCK0_LOCK_BUF))
// CPU内部ワークRAM・ブロック1
#define OS_ReadOwnerOfLockWramBlock1() OS_ReadOwnerOfLockWord((LockWord *)(WRAM_BLOCK1_LOCK_BUF))
//
#define OS_ReadOwnerOfLockVramC() OS_ReadOwnerOfLockWord((LockWord *)(VRAM_C_LOCK_BUF))
//
#define OS_ReadOwnerOfLockVramD() OS_ReadOwnerOfLockWord((LockWord *)(VRAM_D_LOCK_BUF))
// CPU間送信FIFO
#define OS_ReadOwnerOfLockSendFifo() OS_ReadOwnerOfLockByte((LockByte *)(SEND_FIFO_LOCK_BUF))
//
#define OS_ReadOwnerOfLockDma0() OS_ReadOwnerOfLockByte((LockByte *)(DMA0_LOCK_BUF))
//
#define OS_ReadOwnerOfLockDma1() OS_ReadOwnerOfLockByte((LockByte *)(DMA1_LOCK_BUF))
//
#define OS_ReadOwnerOfLockDma2() OS_ReadOwnerOfLockByte((LockByte *)(DMA2_LOCK_BUF))
//
#define OS_ReadOwnerOfLockDma3() OS_ReadOwnerOfLockByte((LockByte *)(DMA3_LOCK_BUF))
// タイマー0
#define OS_ReadOwnerOfLockTimer0() OS_ReadOwnerOfLockByte((LockByte *)(TIMER0_LOCK_BUF))
// タイマー1
#define OS_ReadOwnerOfLockTimer1() OS_ReadOwnerOfLockByte((LockByte *)(TIMER1_LOCK_BUF))
// タイマー2
#define OS_ReadOwnerOfLockTimer2() OS_ReadOwnerOfLockByte((LockByte *)(TIMER2_LOCK_BUF))
// タイマー3
#define OS_ReadOwnerOfLockTimer3() OS_ReadOwnerOfLockByte((LockByte *)(TIMER3_LOCK_BUF))
//======================================================================
// プログラムステータスレジスタ
//======================================================================
//----------------------------------------------------------------------
// カレント・プログラムステータスレジスタ セット
//
//・カレント・プログラムステータスレジスタに値をセットします。
//
//・引数: セットするカレント・プログラムステータスレジスタの値
//
//・戻り値:なし
//----------------------------------------------------------------------
void OS_SetCpsr(u32 param);
//----------------------------------------------------------------------
// カレント・プログラムステータスレジスタ値 獲得
//
//・カレント・プログラムステータスレジスタの値を獲得します。
//
//・引数: なし
//
//・戻り値:カレント・プログラムステータスレジスタの値
//----------------------------------------------------------------------
u32 OS_GetCpsr(void);
//----------------------------------------------------------------------
// イネーブル/ディセーブル
//
//・カレント・プログラムステータスレジスタのIRQを
// イネーブル/ディセーブルにします。
//
//・引数: なし
//
//・戻り値:変更前のカレント・プログラムステータスレジスタの値
//----------------------------------------------------------------------
u32 OS_EnableCpsrIRQ(void);
u32 OS_DisableCpsrIRQ(void);
//----------------------------------------------------------------------
// イネーブル/ディセーブル
//
//・カレント・プログラムステータスレジスタのFIQ&IRQを
// イネーブル/ディセーブルにします。
//
//・引数: なし
//
//・戻り値:変更前のカレント・プログラムステータスレジスタの値
//----------------------------------------------------------------------
u32 OS_EnableCpsrFIQ_IRQ(void);
u32 OS_DisableCpsrFIQ_IRQ(void);
#ifdef __cplusplus
}
#endif
#endif // _IRIS_SUBP_OS_H

View File

@ -0,0 +1,165 @@
;=====================================================================
; IrisSubpOS_Arm.s
; OSライブラリARMASM用
;
; Copyright (C) 2003-2004 NINTENDO Co.,Ltd.
;=====================================================================
IF :DEF: _IRIS_SUBP_OS_H
ELSE
_IRIS_SUBP_OS_H * 1
INCLUDE IrisSubpTargetArm.s
INCLUDE IrisSubpDefineArm.s
;=======================================================================
; ロック変数
;=======================================================================
; ロックID
OS_UNLOCK_ID * 0 ; ロック変数がロックされていない場合のID
OS_MAINP_LOCKED_FLAG * 0x40 ; メインプロセッサによるロック確認フラグ
OS_MAINP_LOCK_ID_START * 0x40 ; メインプロセッサ用ロックIDの割り当て開始番号
OS_MAINP_LOCK_ID_END * 0x6f ; 割り当て終了番号
OS_MAINP_DBG_LOCK_ID * 0x70 ; デバッガ予約番号
OS_MAINP_SYSTEM_LOCK_ID * 0x7f ; システム予約番号
OS_SUBP_LOCKED_FLAG * 0x80 ; サブプロセッサによるロック確認フラグ
OS_SUBP_LOCK_ID_START * 0x80 ; サブプロセッサ用ロックIDの割り当て開始番号
OS_SUBP_LOCK_ID_END * 0xaf ; 割り当て終了番号
OS_SUBP_DBG_LOCK_ID * 0xb0 ; デバッガ予約番号
OS_SUBP_SYSTEM_LOCK_ID * 0xbf ; システム予約番号
OS_LOCK_SUCCESS * 0 ; ロック成功
OS_LOCK_ERROR * -1 ; ロックエラー
OS_UNLOCK_SUCCESS * 0 ; ロック解除成功
OS_UNLOCK_ERROR * -2 ; ロック解除エラー
OS_LOCK_FREE * 0 ; ロック解除中
OS_LOCK_ID_ERROR * -3 ; ロックIDエラー
;-----------------------------------------------------------------------
; ロック関数の初期化
;-----------------------------------------------------------------------
EXTERN OS_InitLock
;-----------------------------------------------------------------------
; ロックIDの獲得
;-----------------------------------------------------------------------
EXTERN OS_GetLockID
;-----------------------------------------------------------------------
; スピンロック(ワード/バイト)
;-----------------------------------------------------------------------
EXTERN OS_LockWord
EXTERN OS_LockByte
EXTERN OS_LockCard
EXTERN OS_LockCartridge
EXTERN OS_LockWramBlock0
EXTERN OS_LockWramBlock1
EXTERN OS_LockVramC
EXTERN OS_LockVramD
EXTERN OS_LockSendFifo
;-----------------------------------------------------------------------
; ロックの解除(ワード/バイト)
;-----------------------------------------------------------------------
EXTERN OS_UnLockWord
EXTERN OS_UnLockByte
EXTERN OS_UnLockCard
EXTERN OS_UnLockCartridge
EXTERN OS_UnLockWramBlock0
EXTERN OS_UnLockWramBlock1
EXTERN OS_UnLockVramC
EXTERN OS_UnLockVramD
EXTERN OS_UnLockSendFifo
;-----------------------------------------------------------------------
; ロックの試行(ワード/バイト)
;-----------------------------------------------------------------------
EXTERN OS_TryLockWord
EXTERN OS_TryLockByte
EXTERN OS_TryLockCard
EXTERN OS_TryLockCartridge
EXTERN OS_TryLockWramBlock0
EXTERN OS_TryLockWramBlock1
EXTERN OS_TryLockVramC
EXTERN OS_TryLockVramD
EXTERN OS_TryLockSendFifo
;-----------------------------------------------------------------------
; ロックフラグの読み込み(ワード/バイト)
;-----------------------------------------------------------------------
EXTERN OS_ReadLockWord
EXTERN OS_ReadLockByte
;-----------------------------------------------------------------------
; ロック変数の所有モジュールIDの読み込みワードバイト
;-----------------------------------------------------------------------
EXTERN OS_ReadOwnerOfLockWord
EXTERN OS_ReadOwnerOfLockByte
;=======================================================================
; プログラムステータスレジスタ
;=======================================================================
;-----------------------------------------------------------------------
; プログラムステータスレジスタ セットr0=パラメータ)
;-----------------------------------------------------------------------
EXTERN OS_SetCpsr
;-----------------------------------------------------------------------
; カレント・プログラムステータスレジスタ値 獲得
;-----------------------------------------------------------------------
EXTERN OS_GetCpsr
;-----------------------------------------------------------------------
; イネーブル/ディセーブル
;-----------------------------------------------------------------------
EXTERN OS_EnableCpsrIRQ
EXTERN OS_DisableCpsrIRQ
;-----------------------------------------------------------------------
; イネーブル/ディセーブル
;-----------------------------------------------------------------------
EXTERN OS_EnableCpsrFIQ_IRQ
EXTERN OS_DisableCpsrFIQ_IRQ
ENDIF ; _IRIS_SUBP_OS_H
END

Some files were not shown because too many files have changed in this diff Show More