# OS_InitContext

## 構文

      #include <nitro/os.h>

      void OS_InitContext( OSContext* context,
                           u32         newpc,
                           u32         newsp );

## 引数

context | コンテキスト
newpc | 開始アドレス
newsp | スタック

## 返り値

なし。

## 説明

コンテキストを初期化します。

コンテキスト構造体 `OSContext` は以下のメンバーを持っています。

`u32 cpsr` | CPSR (カレントプログラムステータスレジスタ)
`u32 r[13]` | R0〜R12レジスタ
`u32 sp` | スタックポインタ (R13 レジスタ)
`u32 lr` | リンクレジスタ (R14 レジスタ)
`u32 pc_plus4` | プログラムカウンタ+4 (R15 レジスタ+4)
`u32 sp_svc` | スーパバイザモードのスタック退避用 (*1)
`CPContext cp_context` | 除算器・平方根演算器のコンテキスト (*2)

(*1) … コンパイルオプションによっては存在しません。
(*2) … ARM9にのみ存在します。

`OS_InitContext()`では、newsp から下位方向に SVC 用スタックを確保します。( コンパイルオプションによってはこの処理は行ないません。)`cpsr` は CPSR レジスタからプロセッサモード( ARM、THUMB の区別)を調べ適切に設定されます。`r[0]〜r[12]` ( R0 〜 R12 レジスタ)、`lr` ( R14 レジスタ)はゼロクリアされます。`pc_plus4` は newpc で指定した値+4 となります。

`cp_context` は `CPContext` 構造体型のメンバでARM9 にのみ存在し、除算器・平方根演算器のコンテキストです。`CPContext` 構造体は以下のメンバを保持します。

`u64 div_numer` | 除算器のパラメータ(除数)
`u64 div_denom` | 除算器のパラメータ(被除数)
`u64 sqrt` | 平方根演算器のパラメータ
`u16 div_mode` | 除算器のモード
`u16 sqrt_mode` | 平方根演算器のモード

`OS_InitContext()` では`cp_context` の内容を変更しません。

## 参照

`OS_SaveContext, OS_LoadContext, OS_DumpContext
`

## 履歴

2004/06/30 `cp_context` について記述
2003/12/01 初版