//====================================================================== // IrisSubpSystemCall.h // IRISサブプロセッサ システムコール // // Copyright (C) 2002-2003 NINTENDO Co.,Ltd. //====================================================================== #ifndef _IRIS_SUBP_SYSTEM_CALL_H #define _IRIS_SUBP_SYSTEM_CALL_H #ifdef __cplusplus extern "C" { #endif #include #include #include #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番号(0〜3 以外の値が渡された時はCPUで読み込みます) // (TEGボードでは無視され、常にCPUにて転送されます) // void *srcp カード上のソースアドレス // void *destp 本体側のデスティネーションアドレス // s32 size 転送サイズ //---------------------------------------------------------------------- // ループウェイト //---------------------------------------------------------------------- void SVC_WaitByLoop(s32 count); //・システムROM上で指定回数ループ処理を行います。 //・1回のループに4サイクルかかります。 //・サブプロセッサがメインメモリへの優先権を持っている場合に、 // メインメモリ上でプログラムを動作させることが原因で // メインプロセッサがストールする現象を軽減することができます。 // //・引数: // s32 count ループ回数 //---------------------------------------------------------------------- // 割り込みウェイト //---------------------------------------------------------------------- void SVC_WaitIntr(u32 clearEnable, u32 intrFlags); //・IntrFlagsで指定した割り込みが発生するまでHalt状態で待ち続けます。 //・割り込み処理にてINTR_CHECK_BUF(0x3007ff8)へ該当するフラグをセットして下さい。 //・複数の割り込みを併用した時、SVC_Halt()が繰り返し呼び出される場合と比べて // システムコール呼び出しのオーバーヘッドを軽減することができます。 // //・引数: // u8 clearEnable 既に該当フラグがセットされている場合にクリアするかどうかの指定 // u16 intrFlags ウェイトする割り込みの指定(IrisSubpSystemCallDefine.h参照) //---------------------------------------------------------------------- // Vブランク割り込みウェイト //---------------------------------------------------------------------- void SVC_WaitVBlankIntr(void); //・Vブランク割り込みが発生するまでHalt状態で待ち続けます。 //・割り込み処理にてINTR_CHECK_BUF(0x3007ff8)へ該当するフラグをセットして下さい。 //・複数の割り込みを併用した時、SVC_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_FIX/DMA_32BIT_BUS/DMA_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_FIX/DMA_COUNT_MASKのみ有効 // DMA_SRC_FIX(0, 1) = (ソースアドレス・インクリメント, ソースアドレス固定) // DMA_COUNT_MASK & dmaCntData = 転送回数 // //・上位マクロ: // SVC_CpuClearFast, SVC_CpuClearArrayFast, SVC_CpuCopyFast, SVC_CpuCopyArrayFast //---------------------------------------------------------------------- // CPU クリア //---------------------------------------------------------------------- #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) //---------------------------------------------------------------------- // CPU コピー //---------------------------------------------------------------------- #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) //---------------------------------------------------------------------- // CPU 高速クリア //---------------------------------------------------------------------- #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 クリアバイト数 //---------------------------------------------------------------------- // CPU 高速コピー //---------------------------------------------------------------------- #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 転送バイト数 //---------------------------------------------------------------------- // Bit圧縮データ展開 //---------------------------------------------------------------------- void SVC_UnPackBits(const void *srcp, void *destp, UnPackBitsParam *paramp); //・0固定のビットを詰めたデータを展開します。 //・TEGバージョンではデスティネーションアドレスのみ // メインメモリを指定することができます。 //・デスティネーションアドレスは4Byte境界に合わせて下さい。 // //・引数: // void *srcp ソースアドレス // void *destp デスティネーションアドレス // UnPackBitsParam *paramp UnPackBitsParam構造体データのアドレス // //・UnPackBitsParam構造体 // u16 srcNum ソースデータ・バイト数 // u8 srcBitNum 1ソースデータ・ビット数 // u8 destBitNum 1デスティネーションデータ・ビット数 // u32 destOffset:31 ソースデータに加算するオフセット数 // destOffset0_On:1 0のデータにオフセットを加算するか否かのフラグ // //・戻り値:なし //---------------------------------------------------------------------- // LZ77圧縮データ8bit展開 //---------------------------------------------------------------------- void SVC_UnCompLZ77Byte(const void *srcp, void *destp); //・LZ77圧縮データを展開し、8bit単位で書き込みます。 //・メインメモリへ直接展開することはできません。 //・圧縮データのサイズが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 // //・戻り値:なし //---------------------------------------------------------------------- // LZ77圧縮データ16bit展開 //---------------------------------------------------------------------- void SVC_UnCompLZ77Short(const void *srcp, void *destp); //・LZ77圧縮データを展開し、16bit単位で書き込みます。 //・メインメモリにも内部ワークRAMにも展開できますが、 // SVC_UnCompLZ77Byte()より低速です。 //・TEGバージョンではデスティネーションアドレスのみ // メインメモリを指定することができます。 //・圧縮データは一致文字列を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 SVC_UnCompHuffman(const void *srcp, void *destp); //・ハフマン圧縮データを展開し、32bit単位で書き込みます。 //・TEGバージョンではデスティネーションアドレスのみ // メインメモリを指定することができます。 //・圧縮データのサイズが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 次ノードデータへのオフセット - 1(2Byte単位) // rightEndFlag:1 右ノード終了フラグ // leftEndzflag:1 左ノード終了フラグ // 終了フラグがセットされている場合 // 次ノードにデータがある // //・戻り値:なし //---------------------------------------------------------------------- // ランレングス圧縮データ8bit展開 //---------------------------------------------------------------------- void SVC_UnCompRLByte(const void *srcp, void *destp); //・ランレングス圧縮データを展開し、8bit単位で書き込みます。 //・メインメモリへ直接展開することはできません。 //・圧縮データのサイズが4の倍数にならなかった場合は // 出来るだけ0で詰めて調整して下さい。 //・ソースアドレスは4Byte境界に合わせて下さい。 // //・引数: // void *srcp ソースアドレス // void *destp デスティネーションアドレス // //・データヘッダ // u32 :4 予約 // compType:4 圧縮タイプ( = 3) // destSize:24 展開後のデータサイズ // //・フラグデータフォーマット // u8 length:7 展開データ長 - 1(無圧縮時) // 展開データ長 - 3(連続長3Byte以上時のみ圧縮) // flag:1 (0, 1) = (無圧縮データ, 圧縮データ) // //・戻り値:なし //---------------------------------------------------------------------- // ランレングス圧縮データ16bit展開 //---------------------------------------------------------------------- void SVC_UnCompRLShort(const void *srcp, void *destp); //・ランレングス圧縮データを展開し、16bit単位で書き込みます。 //・メインメモリにも内部ワークRAMにも展開できますが、 // SVC_UnCompRLByte()より低速です。 //・TEGバージョンではデスティネーションアドレスのみ // メインメモリを指定することができます。 //・圧縮データのサイズが4の倍数にならなかった場合は // 出来るだけ0で詰めて調整して下さい。 //・ソースアドレスは4Byte境界に合わせて下さい。 // //・引数: // void *srcp ソースアドレス // void *destp デスティネーションアドレス // //・データヘッダ // u32 :4 予約 // compType:4 圧縮タイプ( = 3) // destSize:24 展開後のデータサイズ // //・フラグデータフォーマット // u8 length:7 展開データ長 - 1(無圧縮時) // 展開データ長 - 3(連続長3Byte以上時のみ圧縮) // flag:1 (0, 1) = (無圧縮データ, 圧縮データ) // //・戻り値:なし #ifdef __cplusplus } // extern "C" #endif #endif // _IRIS_SUBP_SYSTEM_CALL_H