CP_SetDiv*

構文

#include <nitro/cp.h>

void CP_SetDiv32_32( u32 numer, u32 denom );
void CP_SetDiv64_32( u64 numer, u32 denom );
void CP_SetDiv64_64( u64 numer, u64 denom );

引数

numer numerator。分数の分子という意味で、ここでは除算の被除数を表します。
denom denominator。分数の分母という意味で、ここでは除算の除数を表します。

返り値

なし。

説明

除算のパラメータを設定します。
除算モードの設定をまず行い、それから被除数、除数をそれぞれのレジスタに格納します。
被除数、除数の格納には、CP_SetDivImm*() を使用しています。

除算モードは3つあり以下のものがあります。

除算モード 計算 結果 計算サイクル CPUサイクル換算
CP_DIV_32_32BIT_MODE 32ビット 割る 32ビット 商32ビット、余り32ビット 18サイクル 36サイクル
CP_DIV_64_32BIT_MODE 64ビット 割る 32ビット 商64ビット、余り32ビット 34サイクル 68サイクル
CP_DIV_64_64BIT_MODE 64ビット 割る 64ビット 商64ビット、余り64ビット 34サイクル 68サイクル


CP_SetDiv32_32() では、モードを CP_DIV_32_32BIT_MODE にします。
CP_SetDiv64_32() では、モードを CP_DIV_64_32BIT_MODE にします。
CP_SetDiv64_64() では、モードを CP_DIV_64_64BIT_MODE にします。

(注意)
除算器は割り込み内で値が上書きされることがあります。除算パラメータを設定して除算を行っている最中に割り込みが発生し除算器が使用された場合に、元の演算結果が破壊されてしまいます。従って割り込み内で除算器を使用する場合にはCP_SaveContext(), CP_RestoreContext() を用いて除算器の状態を退避・復元する必要があります。
スレッド切り替え時には、除算器の状態も自動的に保存・復元されます。


 除算器の状態を復元する

intr_func( void )
{
 CPContext context;
 
 CP_SaveContext( &context );
 CP_SetDiv32_32( 1000, 5 );
 CP_WaitDiv();
 result = CP_GetDivResult();
 CP_RestoreContext( &context );
}

内部動作

IOレジスタの、DIVCNT(0x4000280)、DIV_NUMER(0x4000290)、DIV_DENOM(0x4000298) に値を格納します。

参照

CP_SetDivImm*, CP_IsDivBusy, CP_WaitDiv, CP_GetDivResult*, CP_GetDivRemainder*
CP_SaveContext, CP_RestoreContext

履歴

2006/08/09 計算サイクル数の説明を追加 2005/03/08 用語統一 [割込み] → [割り込み]
2004/11/02 内部動作のIOレジスタアドレスを修正
2004/05/06 スレッドセーフ化された事により記述の変更
2004/03/31 スレッドセーフでないことについて記述
2004/01/09 内容を追加
2003/12/01 初版