マルチブート環境について
作成者：有泉　信彦
作成日：10/09/16

●環境の構築について
マルチブートは親機のDSに子機のsrlをファイルとして置いておいた物を
TWL-SDKのMB関数を使用して別のDSに転送し、起動するプログラムのことです。
なので、子機のsrlをmakeする環境が必要になります。
シャチではpokemon_wb/multibootがポケシフター。
pokemon_wb/multiboot2が転送マシンのsrlを作る環境になります。
pokemon_wb/progの下にあるmakefileを基本にmakefileを作成します。
だた、ここに共通で使うプログラム(文字描画等)をコピーして入れてしまうと、
片方が更新されたのにもう片方が更新されないといった状態になってしまうため、
makefileに以下のような記述をし、
PARENT_SRC		=	../prog/src
make_prog_filesを以下のように記述します。
$(PARENT_SRC)/print/printsys.c
こうすると、ソースを共用することができます。
なのでpokemon_wb/multibootの下にあるソースは基本的にmain.cのみになります。
bugfix.hとpm_version.hはプリコンパイルで必要なので、multibootディレクトリの
下に置いていますが、中でprogの下のものをincludeしています。
また、arcの扱いも変わります。
親機ではfiletreeの下にあるものがロムのデータ領域にのりますが、
マルチブート子機の場合はオブジェクトファイル(拡張子.o)のファイルとして
プログラム領域に乗ります。
arcの作成ツールとgflibの方で処理を行ってくれいているので特に問題はありませんが、
arcの名前とソースの名前が同じ場合、.oファイルが被ってしまうのでコンパイルに失敗します。
multiboot/srcの下にあるnet_err_dl.cとfatal_error_dl.cはこれを回避するために
net_err.cとfatal_error.cを内部でincludeしています。

●デバッグについて
srlを実機に転送してプレイするにはsrlに認証を通す必要があります。
まずできたsrlを任天堂の「Nintendo DS 電子署名発行システム」というサイトを使って
認証ファイル(拡張子sgn)を取得する必要があります。
取得したsgnファイルを以下のattachsignというコマンドでsrlにつけた物ではないと実機では読み込むことができません。
multibootフォルダの下にあるattach_rom.batが製品版srlに認証ファイルをつけるバッチファイルです。
認証ファイルはmultiboot/specフォルダの中にコミットされています。
認証ファイルはsrlが変わるたびに発行しなおす必要があります。
デバッグや、認証ファイルが発行可能になる前の場合、以下のsrlを使うと認証を通さなくても
srlをダウンロード、実行可能です。
TwlSDK\bin\ARM9-TS\Rom\mb_child_TWL.srl
TwlSDK\bin\ARM9-TS\Rom\mb_child_NITRO.srl
また、デバッガーで読み込むこともできます。
普通のデバッグ時と同じように子機のtlf(nlf)ファイルを開く時に、ダイアログの一番下の
「DSダウンロードプレイの子機側デバッグ機能を有効にする」にチェックを入れて読み込むと
ダウンロードプレイの画面が開き、親機からの子機イメージを転送してきて実行できます。
この方法で実行すると子機側でもブレークポイントやウォッチ機能を使うことができます。
ただし、親機に乗っているsrlと読み込んだtlfに差があると正しくブレークポイントやウォッチが
使えないので注意してください。
この2つの方法の注意点として、RomHeaderがmb_child_TWL.srlの物になってしまうという問題があります。
これにより、子機側に何のソフトが刺さっているか判別する時にRomHeaderファイルを使うので判別ができません。
なので今回はmb_child_TWL.srlのRomHeaderを検出した場合、手動でささっているROMを選ぶ(セーブデータ読み込みのため)と
アイコンダミー表示(子機ROMのアイコンデータが読めないため)の処理を入れています。

●プログラム上の注意(親機)
ダウンロードプレイの画面で表示されるタイトルと説明文は表示できる文字が限られています。
詳しくはDSバナーガイドラインに書いてありますが、漢字・特殊記号は使えません。
また、gmmファイルから置き換えるときに改行コードと終端コードを置き換える必要があります。
改行コードが0xFFFEから0x000aへ。終端コードが0xFFFFから0x0000へ置き換えてください。
具体的な処理はMP_PARENT_SendImage_Init関数で行っています。

シャチでは子機にsrlを転送中にカード抜けのエラーが発生してしまう不具合がありました。
これはライブラリでARM7周りやスレッド周りの取り扱いがまずいとカード抜けのフラグが
立ってしまい、結果としてカード抜けで無音の停止状態になってしまうという症状が発生します。
原因が分からないため、現在はカード抜けのコールバックを設定し、事前に展開しておいた
エラー画面を表示するようにしています。

子機srl転送中にソフトリセットをした場合、GFLibの通信を使っていないため、
正しく通信周りが開放されません。
このため、なんども子機srl転送中にソフトリセットを繰り返すと通信ができなくなってしまう
状態になりました。
対処として、コールバックでWH_Endを呼ぶようにしています。

●プログラム上の注意(子機)
親機と共通のソースを使う箇所はできるだけ少なくする必要があります。
ファイルが増えるとsrlのサイズが大きくなり、srlの転送制限に引っかかったり、
純粋に転送時間が増えてしまいます。
なので関係ないソースはmake_prog_filesに追加しない。
また、リンクエラーが発生してしまう場合は子機だけで有効なdefineを作り
囲ってしまうのも手です。シャチではMULTI_BOOT_MAKEと言う定義があります。

子機でカード抜けのコールバックは正しく動かない場合があります。
バックアップにアクセスする際は念のためロード時とセーブ時でCRCを保持しておいて
比較するなど対処を入れておいたほうが安全です。

ポケシフターでは子機側のポケモンアイコンのグラフィックをを子機にささっている
ソフトから取得していますが、原則禁止されている方法です。
使用する際は任天堂の許可が必要となります。
