# 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*()` を使用しています。

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

除算モード | 計算 | 結果 | 計算サイクル | 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 初版