//====================================================================== // 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 #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_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); //・Vブランク割り込みが発生するまで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_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 転送バイト数 #ifdef __cplusplus } // extern "C" #endif #endif // _IRIS_SYSTEM_CALL_H