☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

ペリフェラルデータ取得関数群−拡張ペリフェラル−

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

本ドキュメントは、コントローラ系ペリフェラル以外のペリフェラルを
識別するための関数および構造体を解説しています。

【0. 概要】
	ポートA、B、C、Dに直接接続されたコントローラ系ペリフェラルには、
	従来のpdGetPeripheral()あるいはnjGetPeripheral()関数で十分に
	アクセスすることが可能です。
	しかし、コントローラに接続された拡張ペリフェラルには、それぞれに
	対応したライブラリが必要となってきます。（例えば、VMSであれば
	バックアップライブラリなど）

	ここで解説する関数を使用すれば、それらの拡張ペリフェラル用ライブラリ
	を使用することなく、あるいは使用する前に、どのコントローラにどのような
	拡張ペリフェラルが接続されているかを調べることができます。
	（実際のアクセスにはそれぞれ専用のライブラリを使用してください。）


【1. データ仕様】

《1.1 構造体仕様》

PDS_PERIPHERALINFO	構造体
定義	typedef struct {
	Uint32 type;
	Uint32 reserved[3];
	Uint8 is_root;
	Uint8 area_code;
	Uint8 connector_dir[2];
	Sint8 product_name[32];
	Sint8 license[64];
	Uint16 stdby_pow;
	Uint16 max_pow;
} PDS_PERIPHERALINFO;

説明	ペリフェラルの固有情報を格納する構造体です。

メンバ
	type;                ペリフェラルのタイプ
	reserved[3];         予約
	is_root              ルートデバイスフラグ
	area_code;           エリアコード
	connector_dir[2];    拡張コネクタの向き
	product_name[32];    製品名
	license[64];         ライセンス文字列
	stdby_pow;           スタンバイ消費電流
	max_pow;             最大消費電流

参照	pdGetPeripheralInfo()


《1.2 ペリフェラルのタイプ》

	メンバtypeには、ペリフェラルがどのような機能を持っているかが
格納されています。

+------------------------+------------------------------+
| ビット位置指定マクロ   |     持っている機能           |
+------------------------+------------------------------+
| PDD_DEVTYPE_CONTROLLER |  コントローラ                |
+------------------------+------------------------------+
| PDD_DEVTYPE_STORAGE    |  バックアップRAM             |
+------------------------+------------------------------+
| PDD_DEVTYPE_LCD        |  モノクロ液晶                |
+------------------------+------------------------------+
| PDD_DEVTYPE_TIMER      |  タイマ                      |
+------------------------+------------------------------+
| PDD_DEVTYPE_SOUNDINPUT |  音声入力                    |
+------------------------+------------------------------+
| PDD_DEVTYPE_LIGHTGUN   |  ライトガン                  |
+------------------------+------------------------------+
| PDD_DEVTYPE_KEYBOARD   |  キーボード                  |
+------------------------+------------------------------+
| PDD_DEVTYPE_VIBRATION  |  振動ペリフェラル            |
+------------------------+------------------------------+

	複数の機能を持っているペリフェラルも存在するため、
判定は以下のように行います。

	if (info->type & PDD_DEVTYPE_LCD) {
		/* 液晶を持っている */
	}

	if (info->type == 0) {
		/* 何も接続されていない */
	}

《1.3 ルートデバイスフラグ》

	メンバis_rootは、ペリフェラルがポートA〜Dに直接接続されている場合に
1となり、コントローラ等の拡張コネクタに接続されている場合(VMS等)には0と
なります。
	PDD_PORT_A0/B0/C0/D0の場合は常に1となり、それ以外は常に0となります。


《1.4 エリアコード》

	メンバarea_codeには、そのペリフェラルの仕向地が格納されています。

+------------------------+-----------------+
| ビット位置指定マクロ   |  仕向地         |
+------------------------+-----------------+
| PDD_DEVAREA_USA        |  北アメリカ地区 |
+------------------------+-----------------+
| PDD_DEVAREA_JAPAN      |  日本地区       |
+------------------------+-----------------+
| PDD_DEVAREA_ASIA       |  アジア地区     |
+------------------------+-----------------+
| PDD_DEVTYPE_EUROPE     |  ヨーロッパ地区 |
+------------------------+-----------------+

	複数の仕向地を持っているペリフェラルも存在するため、
判定は以下のように行います。

	if (!(info->area_code & PDD_DEVAREA_JAPAN)) {
		/* 日本向けではない */
	}



《1.5 拡張コネクタ方向》

	そのペリフェラルがルートデバイス（ポートに直接接続される）
である場合、拡張コネクタが付いている方向を表します。

+------------------------+-----------------+
|     指定マクロ         |  コネクタ方向   |
+------------------------+-----------------+
| PDD_CONDIR_TOPSIDE     |  上側           |
+------------------------+-----------------+
| PDD_CONDIR_BOTTOMSIDE  |  下側           |
+------------------------+-----------------+
| PDD_CONDIR_LEFTSIDE    |  左側           |
+------------------------+-----------------+
| PDD_CONDIR_RIGHTSIDE   |  右側           |
+------------------------+-----------------+

	標準コントローラの場合は、コネクタは２個とも上向きとなっています。


《1.6 製品名》

	そのペリフェラルの製品名が格納されています。

	標準コントローラの場合は、"Dreamcast Controller<スペース...>"
	となります。


《1.7 ライセンス文字列》

	そのペリフェラルのライセンス文字列が格納されています。


《1.8 スタンバイ消費電流》

	スタンバイ消費電流が格納されています。
	メンバstdby_powの内容x0.1mAが電流値となります。

《1.9 最大消費電流》

	最大消費電流が格納されています。
	メンバmax_powの内容x0.1mAが電流値となります。



【2. 関数仕様】

《2.1関数一覧》
+----------------------+------------------------------------+
|関数                  |機能                                |
+----------------------+------------------------------------+
|pdGetPeripheralInfo   |ペリフェラルの固有情報を取得する    |
+----------------------+------------------------------------+


《2.2 関数API》
［関数］const PDS_PERIPHERALINFO* pdGetPeripheralInfo(Uint32 port)
［入力］port	ポート番号(PDD_PORT_A0-A2/B0-B2/C0-C2/D0-D2)
［出力］なし
［戻り値］PDS_PERIPHERALINFO構造体のアドレス
［機能］ペリフェラルの固有情報を取得します。
［参照］PDS_PERIPHERALINFO構造体、PDS_PERIPHERAL構造体
［使用例］
          const PDS_PERIPHERALINFO* info;

          info = pdGetPeripheralInfo(PDD_PORT_A1);

          if (info->type & PDD_DEVTYPE_LCD) {
            /* このペリフェラルは液晶を持っている */
                  :
          }
          if (info->area_code & PDD_DEVAREA_USA) {
            /* このペリフェラルは北アメリカ向けである */
                  :
          }

          /* 製品名とライセンスを表示する */
          njPrintC(NJM_LOCATION(0, 0), info->product_name);
          njPrintC(NJM_LOCATION(0, 1), info->license);


［備考］本関数を使用せずとも、PDS_PERIPHERAL構造体にもメンバが追加されて
        いますので、従来のpdGetPeripheral()を用いて以下のように同様の
        処理が可能です。

          const PDS_PERIPHERAL* per;

          per = pdGetPeripheral(PDD_PORT_A1);

          if (per->info->type & PDD_DEVTYPE_LCD) {
            /* このペリフェラルは液晶を持っている */
                  :
          }
          if (per->info->area_code & PDD_DEVAREA_USA) {
            /* このペリフェラルは北アメリカ向けである */
                  :
          }

          /* 製品名とライセンスを表示する */
          njPrintC(NJM_LOCATION(0, 0), per->info->product_name);
          njPrintC(NJM_LOCATION(0, 1), per->info->license);


