# OS_GetConsoleType

## 構文

  `#include <nitro/os.h>`
  `u32 OS_GetConsoleType( void );`

## 引数

なし。

## 返り値

プログラムの実行環境による u32 型の値です。
説明の項を参照してください。

## 説明

プログラムの実行環境を表す u32 型の値を返します。

この `OS_GetConsoleType()` は動作環境によって処理を動的に切り替えたい場合に有効です。この関数によって複数の動作環境で共通のプログラムを作成することができます。

`OS_GetConsoleType()` は、「動作している環境」を取得するための関数であり、「動作しているモード」を調べるための関数ではありません。動作モードを調べる関数は、`OS_IsRunOnTwl()` です。　例えばNTR 用のゲームは　NTRでも遊べますし、TWL で遊ぶことも出来ます。どちらの場合でも「NTRモード」でプログラムは動いていますが、動作しているハードウェアはNTR であったり TWL であったりと異なります。

> ・`OS_IsRunOnTwl()` では、「動作モードがNTRモードか、TWLモードか」はわかります。しかしどちらのハードウェア上で動作しているかはわかりません。
> ・`OS_GetConsoleType()` では、「NTRで動作しているか、TWLで動作しているか」はわかります。しかし動作モードはわかりません。
> (但し、NITRO専用ROMの FINALROM版を TWL で動作させる場合、"NTR で動作している" ことを表す値が返ります。)

`OS_GetConsoleType()` は、1回目の呼び出しではデバイスやメモリ等を調査して値を決定しますが、2回目の呼び出しからは以前返した値と同じものをそのまま返しますので呼び出しによるオーバーヘッドは殆どありません。

最終版ROM (FINALROM) ライブラリでは返る値が限定されています。デバッガ上など実機以外で動作させていたときに、その環境を表す値以外の値を返すことがあります。

###
類似の関数

同様の関数として、`OS_GetRunningConsoleType()` があります。こちらはは 最終版ROM (FINALROM)　でも実際にハードウェア構成を調べて値を返す点が違います。

この違いは、例えば TWL 最終版ROM を IS-TWL-DEBUGGER で動作させた場合などに見ることが出来ます。IS-TWL-DEBUGGER にはメモリが 32MB 搭載されていますので`OS_GetRunningConsoleType()` & `OS_CONSOLE_SIZE_MASK` の値は `OS_CONSOLE_SIZE_32MB` となりますが、`OS_GetConsoleType()` & `OS_CONSOLE_SIZE_MASK` は `OS_CONSOLE_SIZE_16MB` となります。

最終版ROM にこれらの動作環境取得の関数が残る場合、`OS_GetRunningConsoleType()` よりは `OS_GetConsoleType()` の方が無難です。製品となった状況を想定すると、最終ROM は実機でしか動作しないはずなので、「動作している環境はデバッガである」など実機で有りえない値が返る可能性は排除しておきたいからです。そういう意味では `OS_GetRunningConsoleType()` はデバッグ用途にのみ使用するのに留めておくのがよいでしょう。

###
取得できる値について

> ・動作環境
> 返り値と`OS_CONSOLE_MASK` の論理積は、動作環境によって以下の値を取ります。

> 値 | 動作環境
> --- | ---
> `OS_CONSOLE_TWL` | TWL 実機で動作*1
> `OS_CONSOLE_NITRO` | NITRO 実機で動作
> `OS_CONSOLE_TWLDEBUGGER` | IS-TWL-DEBUGGER 上で動作*2
> `OS_CONSOLE_ISDEBUGGER` | IS-NITRO-DEBUGGER 上で動作
> `OS_CONSOLE_ENSATA` | ensata NITRO Software Emulator 上で動作

> TWL実機で動作していると判定された *1 の場合、`OS_CONSOLE_TWLTYPE_MASK` との論理積でさらに分類されます。
> 但し通常は `OS_CONSOLE_TWLTYPE_DEV` の考慮は不要です。`OS_CONSOLE_TWL` だけで TWL実機と見なして問題ありません。
> なお、TWLデバッガをデバッガソフトウェア非接続で使用する場合、動作環境は `OS_CONSOLE_TWL` となり、TWL実機の種類は `OS_CONSOLE_TWLTYPE_DEV` となります。
> 但し NITROデバッガをデバッガソフトウェア非接続で使用する場合は、動作環境は `OS_CONSOLE_IS_DEBUGGER` で、接続使用する場合と変わりません。

> 値 | TWL実機の種類
> --- | ---
> `OS_CONSOLE_TWLTYPE_RETAIL` | TWL 製品実機
> `OS_CONSOLE_TWLTYPE_DEV` | 開発用途にセキュリティー用の鍵が異なる TWL 実機　/ TWLデバッガのソフトウェア非接続使用時

> IS-TWL-DEBUGGER で動作していると判断された *2 の場合、`OS_CONSOLE_BOARD_MASK` との論理積でさらに分類されます。

> 値 | IS-TWL-DEBUGGER の種類
> --- | ---
> `OS_CONSOLE_BOARD_A9_A7` | コンポーネント開発用 ARM9 / ARM7 両対応デバッガ
> `OS_CONSOLE_BOARD_A9` | アプリケーション開発用 ARM9 専用デバッガ

> ・プログラムの読み込みデバイス
> 返り値と`OS_CONSOLE_DEV_MASK` の論理積は プログラムデータの読み込みデバイスによって以下の値を取ります。

> 値 | 読み込みデバイス
> --- | ---
> `OS_CONSOLE_DEV_CARD` | カードバスから読み込み
> `OS_CONSOLE_DEV_CARTRIDGE` | カートリッジバスから読み込み *3
> `OS_CONSOLE_DEV_NAND` | NANDから読み込み
> `OS_CONSOLE_DEV_SDCARD` | SDカードから読み込み
> `OS_CONSOLE_DEV_MEMORY` | メモリ上から読み込み
> `OS_CONSOLE_DEV_DOWNLOAD` | ダウンロードでの読み込み

> *3 …TWL本体にはカートリッジスロットが無いのでTWL プラットフォームでこの値を取ることはありません。

> ・メモリサイズ
> 返り値と`OS_CONSOLE_SIZE_MASK` の論理積は、実装されているメインメモリサイズによって以下の値を取ります。

> 値 | メインメモリサイズ
> --- | ---
> `OS_CONSOLE_SIZE_4MB` | 4MByte
> `OS_CONSOLE_SIZE_8MB` | 8MByte
> `OS_CONSOLE_SIZE_16MB` | 16MByte
> `OS_CONSOLE_SIZE_32MB` | 32MByte

> TWL実機でNITRO専用ROMを動作させた場合はビルド種類に依らずメモリサイズは 4MB となります。

###
環境やビルドによる実際の値

以下は、`OS_GetConsoleType()` と `OS_GetRunningConsoleType()` で取得できる値を表しています。表の項目の論理和が取得できる値となります。OS_CONSOLE_DEV_xxx は、実際にROMデータを読み込んだデバイスの値となります。

NITRO モードの場合
動作環境 | ビルド | `OS_GetConsoleType()`の値 | `OS_GetRunningConsoleType()`の値 | 備考
--- | --- | --- | --- | ---
NTR実機 | DEBUG RELEASE | OS_CONSOLE_NITRO OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | OS_CONSOLE_NITRO OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | 4つとも 同じです。
FINALROM | OS_CONSOLE_NITRO OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | OS_CONSOLE_NITRO OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB
TWL実機 | DEBUG RELEASE | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_RETAIL OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_RETAIL OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | FINALROMの `OS_GetConsoleType()` だけ異なります。 ビルドに関わらず、メモリ搭載 量は 4MB になります。
FINALROM | OS_CONSOLE_NITRO OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_RETAIL OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB
IS-NITRO-DEBUGGER (デバッガソフトウェア 非接続時を含む) | DEBUG RELEASE | OS_CONSOLE_ISDEBUGGER OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_8MB | OS_CONSOLE_ISDEBUGGER OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_8MB | FINALROMの `OS_GetConsoleType()` だけ異なります。
FINALROM | OS_CONSOLE_NITRO OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | OS_CONSOLE_ISDEBUGGER OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_8MB
ENSATA EMULATOR | DEBUG RELEASE | OS_CONSOLE_ISDEBUGGER OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_8MB | OS_CONSOLE_ISDEBUGGER OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_8MB | FINALROMの `OS_GetConsoleType()` だけ異なります。
FINALROM | OS_CONSOLE_NITRO OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | OS_CONSOLE_ISDEBUGGER OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_8MB
IS-TWL-DEBUGGER (一般開発用: ARM9) | DEBUG RELEASE | OS_CONSOLE_TWLDEBUGGER OS_CONSOLE_BOARD_A9 OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB | OS_CONSOLE_TWLDEBUGGER OS_CONSOLE_BOARD_A9 OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB | FINALROMの `OS_GetConsoleType()` だけ異なります。
FINALROM | OS_CONSOLE_NITRO OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | OS_CONSOLE_TWLDEBUGGER OS_CONSOLE_BOARD_A9 OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB
IS-TWL-DEBUGGER (コンポーネント開発用 ARM9 + ARM7) | DEBUG RELEASE | OS_CONSOLE_TWLDEBUGGER OS_CONSOLE_BOARD_A9_A7 OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB | OS_CONSOLE_TWLDEBUGGER OS_CONSOLE_BOARD_A9_A7 OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB | FINALROMの `OS_GetConsoleType()` だけ異なります。
FINALROM | OS_CONSOLE_NITRO OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | OS_CONSOLE_TWLDEBUGGER OS_CONSOLE_BOARD_A9_A7 OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB
IS-TWL-DEBUGGER (一般開発用: ARM9) の デバッガソフトウェア非接続時 | DEBUG RELEASE | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_DEV OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_DEV OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | FINALROMの `OS_GetConsoleType()` だけ異なります。 ビルドに関わらず、メモリ搭載 量は 4MB になります。
FINALROM | OS_CONSOLE_NITRO OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_DEV OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB
IS-TWL-DEBUGGER (コンポーネント開発用 ARM9 + ARM7) の デバッガソフトウェア非接続時 | DEBUG RELEASE | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_DEV OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_DEV OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | FINALROMの `OS_GetConsoleType()` だけ異なります。 ビルドに関わらず、メモリ搭載 量は 4MB になります。
FINALROM | OS_CONSOLE_NITRO OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_DEV7 OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_4MB
TWL モードの場合
動作環境 | ビルド | `OS_GetConsoleType()`の値 | `OS_GetRunningConsoleType()`の値 | 備考
TWL実機 | DEBUG RELEASE | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_RETAIL OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_16MB | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_RETAIL OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_16MB | 4つとも 同じです。
FINALROM | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_RETAIL OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_16MB | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_RETAIL OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_16MB
IS-TWL-DEBUGGER (一般開発用: ARM9) | DEBUG RELEASE | OS_CONSOLE_TWLDEBUGGER OS_CONSOLE_BOARD_A9 OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB | OS_CONSOLE_TWLDEBUGGER OS_CONSOLE_BOARD_A9 OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB | FINALROMの `OS_GetConsoleType()` だけ異なります。
FINALROM | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_RETAIL OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_16MB | OS_CONSOLE_TWLDEBUGGER OS_CONSOLE_BOARD_A9 OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB
IS-TWL-DEBUGGER (コンポーネント開発用 ARM9 + ARM7) | DEBUG RELEASE | OS_CONSOLE_TWLDEBUGGER OS_CONSOLE_BOARD_A9_A7 OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB | OS_CONSOLE_TWLDEBUGGER OS_CONSOLE_BOARD_A9_A7 OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB | FINALROMの `OS_GetConsoleType()` だけ異なります。
FINALROM | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_RETAIL OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_16MB | OS_CONSOLE_TWLDEBUGGER OS_CONSOLE_BOARD_A9_A7 OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB
IS-TWL-DEBUGGER (一般開発用: ARM9)　の デバッガソフトウェア非接続時 | DEBUG RELEASE | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_DEV OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_DEV OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB | FINALROMの `OS_GetConsoleType()` だけ異なります。
FINALROM | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_RETAIL OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_16MB | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_DEV OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB
IS-TWL-DEBUGGER (コンポーネント開発用 ARM9 + ARM7) の デバッガソフトウェア非接続時 | DEBUG RELEASE | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_DEV OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_DEV OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB | FINALROMの `OS_GetConsoleType()` だけ異なります。
FINALROM | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_RETAIL OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_16MB | OS_CONSOLE_TWL OS_CONSOLE_TWLTYPE_DEV OS_CONSOLE_DEV_xxx OS_CONSOLE_SIZE_32MB

NITRO モードでの動作環境識別

NITRO モードで動作する場合、本関数 `OS_GetConsoleType()` だけではNTR本体と TWL 本体のどちらで動作しているかの判断が出来ません。`OS_GetRunningConsoleType()` の値を調べれば区別できますが、前述の通り `OS_GetRunningConsoleType()` はできればデバッグ用途に留めたい関数です。そもそも通常はどちらのハードウェアで動作しているかを意識する必要はありませんが、どうしても識別したい場合のために`OSi_IsNitroModeOnTwl()` という関数が用意されています。この関数が TRUE を返すときは、TWL上で NITRO モードの ROM が動作していることになります。

`OSi_IsNitroModeOnTwl()` は限られた用途で使われるべきであるという理由と、TWL開発当初は NITRO 開発者がTWL のことを知っているとは限らないという配慮から TWL の名が出ているこの関数は非公開関数の扱いとなっていたという経緯により、現在も非公開関数として扱われています。

## 参照

`OS_IsRunOnDebugger, OS_IsRunOnEmulator, OS_GetRunningConsoleType`

## 履歴

2009/10/30 デバッガ非接続時に関しての情報を追記。NITROモードでの動作環境識別を修正
2008/04/15 モードによって表を分割
2008/03/27 環境やビルドによる実際の値を追加
2007/11/16 記述追加
2007/11/05 `OS_GetRunningConsoleType()` に移行