//====================================================================== // 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 #include #include //---------------------------------------------------------------------- // データ読み込み //---------------------------------------------------------------------- #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) //・割り込み処理のアドレスをセットします。 //---------------------------------------------------------------------- // DMA セット //---------------------------------------------------------------------- //#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が終了したか // どうかをチェックすると続くコードへの影響を確実に回避できます。 //---------------------------------------------------------------------- // 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クリアします。 //・クリアデータはスタックに置かれ、それをデスティネーションへコピーします。 //・DmaClearIf/DmaClearArrayIfは終了時に割り込み要求を発生します。 //・DmaClearArray/DmaClearArrayIfはデスティネーション配列全体をクリアします。 // //・引数: // dmaNo DMA番号 // data クリアデータ // destp デスティネーションアドレス // size クリアバイト数 // bit 転送ビット幅(16|32) // // //※CPU内部RAM上のプログラムにてDMAを起動すると // その次の命令が先に実行されます。 // よって、DMA直後に転送先をCPUにて変更しようとした場合、 // 読み込み/書き戻しの間にDMAが起動されてしまいますので、 // DMAの転送先のデータが意図していない値になる場合があります。 // その場合にはWaitDma()を直後に挿入して、DMAが終了したか // どうかをチェックすると続くコードへの影響を確実に回避できます。 //---------------------------------------------------------------------- // 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でコピーします。 //・DmaCopyIf/DmaCopyArrayIfは終了時に割り込み要求を発生します。 //・DmaCopyArray/DmaCopyArrayIfはソース配列全体をコピーします。 // //・引数: // 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_DmaCopyIf/H_DmaCopyArrayIfは終了時に割り込み要求を発生します。 //・H_DmaCopyArray/H_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_DmaCopyIf/V_DmaCopyArrayIfは終了時に割り込み要求を発生します。 //・V_DmaCopyArray/V_DmaCopyArrayIfはソース配列全体をコピーします。 // //・引数: // dmaNo DMA番号 // srcp ソースアドレス // destp デスティネーションアドレス // size 転送バイト数 // bit 転送ビット幅(16|32) //---------------------------------------------------------------------- // DMA 終了待ち //---------------------------------------------------------------------- #define WaitDma(dmaNo) \ { \ vu32 *(dmaCntp) = (vu32 *)REG_DMA##dmaNo; \ while (dmaCntp[2] & DMA_ENABLE) ; \ } //・DMAの終了を待ちます。 // //・引数: // dmaNo DMA番号 //---------------------------------------------------------------------- // 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番号 //---------------------------------------------------------------------- // CPU クリア //---------------------------------------------------------------------- #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) //---------------------------------------------------------------------- // CPU コピー //---------------------------------------------------------------------- #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) //---------------------------------------------------------------------- // CPU 高速クリア //---------------------------------------------------------------------- #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 クリアバイト数 //---------------------------------------------------------------------- // CPU 高速コピー //---------------------------------------------------------------------- #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