## 第3章　バイナリフォーマット

### 3-21. SwitchList

#### (2)Switchエリア

> Switchエリアは実際のSwitchノードにあたる部分です。Switchノードは他のノードとは多少異なる性質を持っています。通常、例えばノードA→ノードBというリンクを張る場合に、ある条件化ではノードA→ノードCというリンクに変更したいという場合があります。その場合に、デフォルト値としてノードBをリンクしておき、ノードCに切り替わるためのu32型の定数を決めておくことができます。マッピングは以下のようになっています。

> 尚、各ノードからSwitchノードにリンクする際に指定する方法は、SwitchListエリア中の指定したいSwitchエリアのインデックスがNの場合、0x80000000 | Nとして指定します。このようにすることによってNIFFのコンバータ側で記述されているフィールドの最上位ビットが1の場合に、本来インデックス番号を検索するべきノードのリストではなく、SwitchList中のインデックス番号であると判断します。従って、各リスト中は0x80000000以上のインデックスは存在しないことになります。（もちろん、それほどのインデックスを持つファイルは現実的ではありません。）

u32 | switch_tag
u32 | this_switch_index
u32 | switch_size
u32 | link_list_type
u32 | default_link_index
u32 | case_node_num
u32 | switch_condition
u32 | nintendo_extension_block_size
u32 | user_extension_block_size
u32 | case_val(0)
・・・
u32 | case_val(case_node_num - 1)
case_dest_index(0)
・・・
cese_dest_index(case_node_num - 1)
NintedoExtensionBlock
UserExtensionBlock

図　Switchエリアメモリマップ

u32 switch_tag | Tag indicating Switch
    TAG_SWITCH      0x00130100
u32 this_switch_index | Index number of Switch corresponding to SwitchList
u32 switch_size | Size of this Switch
u32 link_list_type | Index of node linking to this Switch node
u32 default_link_index | デフォルトでリンクするノードのインデックスを記述します。
u32 case_node_num | Number of nodes which branch off
u32 switch_condition | Condition of branching off
u32 nintendo_extension_block_size | 任天堂拡張ブロックサイズ
u32 user_extension_block_size | ユーザー拡張ブロックサイズ
u32 case_val | Constant formula of condition
u32 case_dest_index | Index number of destination when fulfill the case
NintendoExtensionBlock | 任天堂拡張ブロック
UserExtensionBlock | ユーザー拡張ブロック

Copyright 1997 NINTENDO Co.,Ltd. All rights reserved.

目次へ次へ