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) |
|
|
|
|
|
|
|
|
|
図 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 | ユーザー拡張ブロック |