にゃごすwiki

DS開発/2010-2-16

  filesystemをハック(ってほどのことでもないが)

filesystem(元efslib)だけど、相変わらず、argv対応されたメニューじゃないと起動出来ない。(HomebrewMenuとか)すぐに何らかの対応がされると思って待ってたんだけど、結局そのままなのでなんとかならないかと調べてみた。

とりあえず、filesystemのソースを見てみたところ、nitroFSInitを呼び出す前にargvに入っていれば良さそうなので、こんな感じにしてみた。

struct __argv *av;
char * avbuf[1];
char * cmdlinebuf = "fat:/nitrodir.nds";
:
:
   if( argc < 1 ){
       av = __system_argv;
       avbuf[0] = cmdlinebuf;
       av->argvMagic = ARGV_MAGIC;
       av->argc = 1;
       av->argv = avbuf;
   }
   if (nitroFSInit()) {
:
:

とりあえず、desmumeとDSTTでは動いているみたい。
argv対応ランチャーであれば、どこにおいても大丈夫です。
argv対応ランチャー以外の起動の場合、この場合だとルートにファイルを入れてもらう必要があります。(ndsファイルのリネームもダメ)

サンプルソース(332)
nds-example/filesystem/nitrofs/nitrodir/source/directory.cのソースを置き換えて、makeしてください。

ついでに、うんちくを書いてみる。
ndsのプログラムにデータ(ファイルシステム)をつなげているので、ndsを起動後に自分自身をオープンしてファイルシステムを読みます。で、起動されたプログラムは自分のファイル名をどうやって知るのかが問題になります。C言語を知っていれば、argv[0]から持ってくればいいと思うでしょうが、argvはOSが設定してくれるんですが(ですよね?)、nds homebrewではOSなんてないのでそんなことはしてくれません。仕方がないので、ndsファイルの起動元(ランチャー等)から受け渡すようになっています。なので、起動元のアプリが対応されていないとダメな訳です。

  ndstoolではまった

maxmodを試してみようと、サンプルのmakeしてみると、ndstoolがエラーになった。

Nintendo DS rom tool 1.46 - Nov 30 2009
by Rafael Vuijk, Dave Murphy, Alexei Karpenko
failed to open input file
make[1]: *** [/c/devkitPro/nds-examples-20091201.tar/audio/maxmod /streaming/streaming.nds] Error 1
make: *** [build] Error 2

うーむ、また64bitの呪いか〜と萎えていた。

自分のソースは問題なくコンパイル出来ているので、環境には問題ないだろうとmakefileとにらめっこ、ds_rulesを見てみたり。特に問題はなさそうだなぁ〜とmake --debug でコマンドラインを表示してみたところ、指定されているファイルは問題なさそう。ふと、arm7バイナリが指定されていないことに気づいた。(-7 スイッチ)おいらの使っているmakefileは昔から使ってたやつを修正して使ってたので、-7でバイナリを直指定してた。ってことは、デフォルトでarm7バイナリが指定されているってことだ!でも、default.arm7はちゃんとlibndsフォルダに入れてあるし、、、
仕方がないので、ndstoolのソースをsvnから落としてきて、眺める。あれ?参照してるのってdefault.elfなのか。確かに、default-arm7のバイナリに入ってたけど、いらないと思って入れてなかったよ。
もうちょっとわかりやすいエラーにしてくれると助かるなぁ。修正して送りつけるか。でも英語が怪しいから、ダメだな。

こんなことで、数時間を費やすとは。うーむ、そろそろ手動はあきらめて、インストーラーでインストールするようにしようかな。