# CP_SetDiv*

## C Specification

  `#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 );`

## Arguments

numer | Numerator of fraction. Represents dividend of division here.
denom | Denominator of fraction. Represents divisor of division here.

## Return Values

None.

## Description

Sets parameters for division. Sets division mode first, and then stores dividend and divisor in each register. `CP_SetDivImm*` is used to store dividend and divisor.

There are three division modes as follows:

Division Mode | Calculation | Results | Calculation Cycles | CPU Cycle Conversion
--- | --- | --- | --- | ---
CP_DIV_32_32BIT_MODE | 32-bit divided by 32-bit | Quotient 32-bit, remainder 32-bit | 18 cycles | 36 cycles
CP_DIV_64_32BIT_MODE | 64-bit divided by 32-bit | Quotient 64-bit, remainder 32-bit | 34 cycles | 68 cycles
CP_DIV_64_64BIT_MODE | 64-bit divided by 64-bit | Quotient 64-bit, remainder 64-bit | 34 cycles | 68 cycles

`Set mode to `CP_DIV_32_32BIT_MODE` with `CP_SetDiv32_32()`.
Set mode to `CP_DIV_64_32BIT_MODE` with `CP_SetDiv64_32()`.
Set mode to `CP_DIV_64_64BIT_MODE` with `CP_SetDiv64_64()`.`

Caution: With the Divider, sometimes the value is overwritten in the interrupt. If the division parameters are set up and an interrupt occurs during division when using a divider, the original calculated result will be broken. Therefore, if you are using the divider in an interrupt, the status of the divider needs to be temporarily stored/restored using `CP_SaveContext()` and `CP_RestoreContext()`.
The status of dividers is also automatically saved/restored when threads are switched.

> Example: Restore the Divider status

>     intr_func( void )
>           {
>             CPContext context;

>             CP_SaveContext( &context );
>             CP_SetDiv32_32( 1000, 5 );
>             CP_WaitDiv();
>             result = CP_GetDivResult();
>             CP_RestoreContext( &context );
>           }

## Internal Operation

`Stores values in `DIVCNT(0x4000280)`, `DIV_NUMER(0x4000290)`, and `DIV_DENOM(0x4000298)` of the IO register.
`

## See Also

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

## Revision History

08/09/2006 Added a description of the number of calculation cycles.
03/08/2005 Standardized the Japanese term for "interrupt."
11/02/2004 Corrected IO register address in Internal Operation.
05/06/2004 Changes to description as a result of making process thread-safe.
03/31/2004 Indicated that process is not thread-safe.
01/09/2004 Added content.
12/01/2003 Initial version.

CONFIDENTIAL