# ヘッダファイル解説 (TWL-SDK)

### TWL-SDK システムヘッダ

twl.h | TWL-SDK 標準ライブラリに関する定義ファイルです。
twl_win32.h | TWL-SDK における特殊な変数型など Windows PC 上でツールを作成するときに必要な定義を集めたファイルです。

TWL-SDK を使用するモジュールがインクルードする必要のあるヘッダファイルです。

### モジュール初期化関数

nitro/sinit.h | モジュール初期化関数 `NitroStaticInit()` を使用可能にします。

C 言語においてスタティックイニシャライザ `NitroStaticInit()` を利用するためのヘッダファイルです。

`NitroStaticInit()` の本体を定義しているモジュールでのみインクルードします。オーバーレイモジュールのスタティックイニシャライザはオーバーレイのリンク時に起動されるので、この仕組みを利用することで、関数のポインタ用のエントリを用意しておき、オーバーレイモジュールのリンク時に `NitroStaticInit()` 内で対応する関数を登録するといった処理が可能となります。

### ARM/THUMB 命令セット切り替え

twl/code32.h | これ以降のコードを ARM 命令(32bitコード)で出力します。
twl/code16.h | これ以降のコードを THUMB 命令(16bitコード)で出力します。
twl/codereset.h | これ以降のコードをコンパイル時にオプションで指定した命令セットで出力します。

TWL の ARM9, ARM7 の CPU では 2 種類の命令セット(ARM 命令, THUMB 命令) を利用することが出来ます。この2つの命令セットを幾つかのジャンプ命令によって相互に切り替えることが出来ます。C 言語においてこのジャンプ命令による切り替えは関数呼び出しという形で行われるため、通常どちらの命令セットを使用するかは関数単位で選択されます。

code32.h および code16.h は codereset.h と組にして使用します。命令セットを ARM で固定したい関数を code32.h と codereset.h で囲み、THUMB で固定したい関数を code16.h と codereset.h で囲みます。特にアセンブラコードを使用するときは、必ず命令セットに応じて code32.h か code16.h で囲むようにしてください。

>     #include <twl/code32.h>     // 以下の arm_inst() を ARM 命令セットで出力する
>     int arm_inst(int n)
>     {
>         // 32bit code area
>         return n * n;
>     }
>     #include <twl/codereset.h>  // 命令セットを元に(コンパイラのオプション通りに)戻す

### TCM メモリの利用(TCMセクションの指定)

twl/dtcm_begin.h twl/dtcm_end.h | この間のコードを `.dtcm` セクションに出力します。SDK 標準の設定では `.dtcm` セクションは ARM9 の DTCM (データ用 TCM)へ配置されます。
twl/itcm_begin.h twl/itcm_end.h | この間のコードを `.itcm` セクションに出力します。SDK 標準の設定では `.itcm` セクションは ARM9 の ITCM (命令用 TCM)へ配置されます。

TWL の ARM9 プロセッサには TCM と呼ばれる CPU 内部におけるスクラッチパッド領域(メモリマップ上に固定された高速なバッファ領域) が用意されています。この領域は CPU 内部キャッシュと同等速度でのアクセスが可能であるため、この領域をうまく利用することでキャッシュミスに伴う処理速度低下を抑えられる可能性があります。

TCM 領域に配置したい関数を定義するときに以下のように twl/itcm_begin.h と twl/itcm_end.h で囲みます。こうして囲まれた関数領域は起動時に命令用 TCM(ITCM) 領域へ転送されます。

>     #include <twl/itcm_begin.h>  // 以下の tcm_inst() を ITCM に配置する
>     int tcm_inst(int n)
>     {
>         // 32bit code area
>         return n * n;
>     }
>     #include <twl/itcm_end.h>    // 配置先を通常に戻す

またデータブロックを、データ用 TCM (DTCM) 領域へ配置したいときは以下のように twl/dtcm_begin.h と twl/dtcm_end.h で囲みます。

>     #include <twl/dtcm_begin.h>  // 以下の tcm_data() を DTCM に配置する
>     u32  tcm_data[] =
>     {
>         0, 1, 2, 3, 4, 5, 6, 7, 8, 9
>     }
>     #include <twl/dtcm_end.h>    // 配置先を通常に戻す

### 特殊セクションの指定

nitro/parent_begin.h nitro/parent_end.h | この間のコードを `.parent` セクションに出力します。クローンブート動作時に使用します。
twl/ltdmain_begin.h twl/ltdmain_end.h | この間のコードを `.ltdmain` セクションに出力します。HYBRID アプリで使用します。
nitro/version_begin.h nitro/version_end.h | この間のコードを `.version` セクションに出力します。TWL-SDK ライブラリで予約されていますので使用しないでください。
twl/wram_begin.h twl/wram_end.h | この間のコードを `.wram` セクションに出力します。ARM7 においてのみ有効です。

TCM セクション以外にも特殊なセクションがあります。

.parent セクションについてはDSダウンロードプレイの一形態であるクローンブートを行なうときに重要となります。

.ltdmain セクションは HYBRID アプリで使用され、ニンテンドー DS 上での実行時にはロードされず TWL 上での実行時にのみロードされるセクションになります。

. version セクションおよび .wram セクションに関しては TWL-SDK 実装において内部で使用されるセクションですのでご利用される際に意識していただく必要はございません。

### TWL-SDK バージョン情報

twl/version.h | TWL-SDK のバージョン情報です。 マクロ `SDK_VERSION_NUMBER`, 定数 `SDK_CURRENT_VERSION_NUMBER` が定義されています。

TWL-SDK のバージョン情報を定義しています。