« USBメモリの厳密なチェック | トップページ | フィギュアスケート »

2010年1月21日 (木)

Wii NTFSからの起動【暫定】


Wii Backup Managerを使って NTFS HDD上に置いた iso ファイル、
Configurable USB Loader (以下、cfg-loader)で起動できることは確認できた。


これがチャンネル起動でもできるようになれば WBFSにさよならできるかもしれない。


ということで、「NTFS ISOのチャンネルからの起動」トライ中のメモ書きである。

以下は「こうするのが正しい」ではなく「私はこうしてみてる」現在進行形メモであるので
変なところがあったら教えてもらえると嬉しいし、
あまり良くわかっていないと自分で思っている人には今の段階では真似して欲しくない。
(なので自分用メモとしての必要以上に細かくは書かないし、成果物も置かない)
わかっている人のヒントくらいにはなるかと。


■方針

・通常通り cfg-loader を起動し、NTFSからの起動状態にして設定をセーブ
 (NTFS決め打ち。この辺を動的にやるつもりは今のところなし)
・cfg-loader のソースを入手
・ソースを改変、GUIを使ってゲームを選択するところをすっとばし、ゲームIDを埋め込み
 (ゲーム個別の起動設定(002他)はConfigurableのものを読み込ませる)
・ビルドしてできたdolをHBCから起動して、直接 NTFS上の指定ゲームが起動できることを確認
・チャンネル化して起動できることを確認
・余力があれば不要なGUIコードの削除によるdolの小型化(たぶんやらない)


■トライ


◆cfg-loader のソース

 ソースは http://code.google.com/p/cfg-loader/から入手できる。
 Source タブから svn を使うと最新状態のものも取れるが、
 Downloads タブから v50 のソースを取ってくることにする。 (Cfg_USB_Loader_50-src.rar)
 ソースファイルは日本語や空白を含まないパスに展開。
  ex) d:/cfg-loader/50/...


◆まずはビルド

 改変以前に、持ってきたままのものがビルドできなければ話にならない。

 開発環境devkitproをインストール。
  Windows Installer
  Choose Components では、devkitARM(NDS向け) と devkitPSP(PSP向け)はチェックから外して良い。
 
 Programmer's Notepad を起動
 File -> Open で、Makefile を開く。 ( d:/cfg-loader/50/Makefile )
 Tools -> Make (Alt+1) で make してみる。

> "make" 
GRRLIB.c
In file included from d:/cfg-loader/50/source/GRRLIB.c:20:
d:/cfg-loader/50/source/GRRLIB.h:74: error: expected ')' before 'v'
d:/cfg-loader/50/source/GRRLIB.h:79: error: expected ')' before 'v'
d:/cfg-loader/50/source/GRRLIB.h:80: error: expected ')' before 'v'
 :

 さっそくエラーに。
 該当行を見ると

  void GRRLIB_NPlot(Vector v[], u32 color, long n);

 Vector でエラーになっているらしい。
 「GRRLIB Vector」で調べたところ、GRRLIBの最新では Vector は guVector に名前が変わったらしい。
 つまり cfg-loader 開発陣の開発環境は最新版ではないということ…むー
 開発環境がずれていると苦労しそうな予感。

 とりあえずは以下を書いて逃げる。

  #define Vector guVector

 


 再度 make

> "make" 
 :
fat.c
d:/cfg-loader/50/source/fat.c:42: error: conflicting type qualifiers for '__io_usbstorage'
d:/devkitPro/libogc/include/ogc/usbstorage.h:67: note: previous declaration of '__io_usbstorage' was here
make[1]: *** [fat.o] Error 1

 定義が違うと言っている。
 fat.c
  extern const DISC_INTERFACE __io_usbstorage;
 usbstorage.h
  extern DISC_INTERFACE __io_usbstorage;

 fat.c 側から const を抜いてみる。
 fat.c 側のこの行をコメントアウト。

 


 再度 make

> "make" 
 :
net.c
d:/cfg-loader/50/source/net.c:85: error: 'EBADFD' undeclared here (not in a function)

 定義がないと言っている。
 EBADFD を grep してみると devkitPPC/powerpc-eabi/include/sys/errno.h に定義されている。

  #define EBADFD 81 /* f.d. invalid for this operation */

 include するのも面倒なのでこの定義を net.c にコピペ。

 


 再度 make

> "make" 
 :
usbstorage.c
d:/cfg-loader/50/source/usbstorage.c:272: error: conflicting type qualifiers for '__io_usbstorage'
d:/devkitPro/libogc/include/ogc/usbstorage.h:67: note: previous declaration of '__io_usbstorage' was here

 見比べて、usbstorage.c の方の const を取る。

 


 再度 make

> "make" 
 :
patchhook.S
stub.S
linking ... 50.elf
output ... 50.dol

> Process Exit Code: 0
> Time Taken: 00:12

 できたらしい。

 50.dol という名前でできたので boot.dol にして、HBCから起動してみる。
 普通に cfg-loader 起動。やれやれ。


◆ソース改変

 ビルドができるようになったのでソースをいじってみる。
 まず見るべきは source/usb-loader.c

 main()関数があるのでつらーっと流れを追ってみる。

 色々やったあとで Menu_Loop() を呼んでいる。 source/menu.c を見てみる。

 __Menu_Controls() でユーザにゲームを選択させ、
  (選択したゲームのインデックスが gameSelected に入る)
 Menu_Boot() でゲームを起動しているらしい。

 Menu_Boot() にて
   header = &gameList[gameSelected];
   game_cfg = CFG_find_game(header->id);
 などしているようなので、
 ここでゲームIDを乗っとってしまえば良さげ。

 ここでふとその下を見ると
   if (!CFG.direct_launch) {

 direct_launch とはなんぞや、ということで調べてみると、
 これがまさに目的のものっぽい。


 というわけで main()の中で CFG_Load() し終わったあとあたりにて
 以下のように設定を改変してみる。

  CFG.direct_launch = 1;
  CFG.confirm_start = 0;
  CFG.device = CFG_DEV_USB;
  strcpy(CFG.launch_discid, "SMNJ01"); // new super mario bros
  CFG.music = 0;
  CFG.gui = 0;
  CFG.intro = 0;
  *CFG.background = 0;
  *CFG.w_background = 0;
  CFG.covers = 0;

 これによって、 Menu_Loop() -> Direct_Launch() の中で gameSelected をセットし、Menu_Boot() してくれる。はず。

    → 起動OK ただし、cfg-loaderのスプラッシュが表示される


 もうちょっと見ていくと、CFG_Load() -> cfg_direct_start() の中で上記と同じことをやっている。
 なのでここを直した方が早いかも。

 cfg.c の cfg_direct_start()

  if (direct_start_arg) {
  の直前に以下を挿入。

   direct_start_arg = "SMNJ01"; // new super mario bros

 これでNewスーパーマリオが(Configurableの設定を読み込んだ上で)起動するのではなかろうか。

    →起動OK、ただしスプラッシュ画面および起動時コンソール表示あり



 さらに踏み込むと、cfg.c の先頭にある次の行をいじるだけでもよさげ。

   char direct_start_id_buf[] = "#GAMEID\0\0\0\0\0CFGUSB0000000000";

 この "GAMEID" の6文字を "SMNJ01" に変えてしまう。

   char direct_start_id_buf[] = "#SMNJ01\0\0\0\0\0CFGUSB0000000000";

 これでどうだ。
 ちなみにこの行は dol になったあと、バイナリレベルで改変されることを意図したものに見える。

    →起動OK、ただしスプラッシュ画面および起動時コンソール表示あり




 スプラッシュ画面を表示させないために main() の Gui_DrawIntro() 呼び出し直前に以下を追加。

   CFG.direct_launch = 1;
   CFG.intro = 0;

    →起動OK。スプラッシュなし。コンソール表示あり。


 main() の開始直後にある cfg_parsearg_early() の中でも、
 CFG_Default() および cfg_direct_start() を呼んでいた。
 CFG_Default() にてデフォルトを書き換えてしまうのが実は一番かもと思い直す。
   CFG.intro = 0;

   →起動OK。スプラッシュなし。コンソール表示もなし。

ということで、結局変更は上記2箇所。
コンソール表示がない真っ黒状態での起動はそれはそれで不安をかきたてるが:)
目的は達成できた。


◆チャンネルからの起動

 ゲームID変更をこんな感じに。

   char direct_start_id_buf[] = "#TONTON\0\0\0\0\0CFGUSB0000000000";

   "TONTON" (ちょうど6文字なので)にしてみる

 WiiUsbIso2Wad をちょっといじり、作成した dol の TONTON 部分をゲームIDに置き換えるようにして
 WADインストール!
 実行!
  :
 起動確認。

 ふむ。できてしまった。。。


◆課題他

 やりたかったことはできたが、この状態だとフル機能のcfg-loader なので dol が(WADも)大きい。
 通らないGUI部分やlibraryのリンクは必要ないので削りたいところではある。
 が、
 変更箇所が多くなると cfg-loaderのバージョンアップへの追従が大変になる。。
 [最適化はしない」つもりで始めたので、これでよしとする。

 成果物は置かないつもりだったが、
 動作も確認できたので一応。

 これ

 ちなみに、これを動作させる際には
 SD:/cfg-loader/ に普通に cfg-loader の設定ファイルなどがあることを期待している。
 また、NTFS起動に特化した実行ファイルだというわけではなく、
 単純にSDの設定ファイルを読み込んで起動するcfg-loaderである。
 NTFSでの起動をさせたい場合はあらかじめそのように設定、保存しておく。
 ゲーム個別の設定も読み込んで起動するので、
 002fixなど、必要な設定は予め HBC から cfg-loader を起動して設定、保存しておく。

 改変版 WiiUsbIso2Wad は、
 dol中の "TONTON" をゲームIDに変えて起動するように書いてある(HSPソース付き)


 ということで、暫定トライアル終了。
 次があるかは・・・不明。

 WBFSを捨てる準備は、
 できたかも


|

« USBメモリの厳密なチェック | トップページ | フィギュアスケート »

ゲーム(Wii)」カテゴリの記事

コメント

参考になります。
同じようにビルドできればYaucltのdirectloadergxをWiiflowにできそうですね。

投稿: ぽぽ | 2010年1月22日 (金) 21時12分

とんとんさん、こんにちは!

何やら難しい言葉が並んでいますが、cfgのソースって存在したのですね(^_^;)
cfgを使ったDirectLoader(チャンネル起動)!
これが実現出来れば素晴らしいですね!

楽しみにしておきます♪

投稿: うぃ~ | 2010年1月23日 (土) 12時59分

こんばんは

もうちょっとさらっとできるかと思ったんですが
持ってきたままのコードのビルドに結構ひっかかったので書き留めることにしました。
あとはきっと誰かやる気(と時間)にあふれた方が引き継いでくれないかな~
などと:)

投稿: とんとん | 2010年1月23日 (土) 23時58分

cfg-loader の中を見てわかったんですが、
起動時引数として game ID を与えられたらそれで起動するように書かれてます。
forwarder で起動引数を与えられればそれが一番簡単なんですが
そういうの、ないですかね。。。>誰にともなく

投稿: とんとん | 2010年1月25日 (月) 10時18分

これまた凄いことされてますね
自分は紅さんって方のDirectLoaderGXで試したのですが、いくらGXの設定をいじってもチャンネルからはNTFS起動出来ませんでした

あとこちらのソフトでトリム+1したものをゲームID.isoにリネームしてNTFS/wbfsに放り込んだだけでもローダー起動しました

投稿: おっちゃん | 2010年1月26日 (火) 11時51分

おっちゃん さん こんにちは

そうですね。trimしたものでも GAMEID.ISO の名前にすれば起動するはずです。
ただどうも trim すると挙動が変わる(002が起きるようになるとか)ゲームなどがあるみたいで
いまひとつ trim に対する信頼感が (^^;
sparse なファイルのほうはディスク容量という意味でtrim同等で
そのまま Scrubberなどにもかけられていいのですが
表示される容量がフルなので精神衛生上ちょっとよくないのと
NTFSのシステム領域にデータがもたれる(らしい)関係で
NTFSドライブ間でファイルコピーしても sparse ファイルじゃなくなってしまうのがいまいちかも。
(手でコピーせずに Backup Managerで transfer すれば無問題ですが)

紅さんのところは以前どなたかが紹介してくださって、ちらっと拝見したことがあります。
GXのアップデートについていっているようで、すごいなと思ってました。
(わたしにはできませーん)
自分がGXを使ったことがないのでDirectLoaderも試したことはないのですが…

投稿: とんとん | 2010年1月26日 (火) 15時13分

ぽぽ さん
こんにちは。
WiiFlowですが、これまた使ったことがないので
(CFGをFlow系な見た目にして使ってたりします)
よくしらないんですが、
ソースを持ってきてビルドだけしてみました。
cfg-loaderと違い、持ってきたままの状態でビルドはできました。
中は…時間と需要があったら見てみるかも…?

投稿: とんとん | 2010年1月26日 (火) 15時15分

とんとんさん、夜遅くに失礼します。

昨日はEBBSへの書き込みありがとうございました♪
Wiiflowを使ってのチャンネル起動ですが・・・、需要は有ると思います(^^)
というか、この記事の様なSourceを弄っていく経緯もすごく勉強になるので
それに特化していくというのも・・・。
今は記事が見れないのですが、昔、Hackメモというブログさんでdevkitpro
などの導入や使い方も学ばせてもらいました。
いえ、あまり贅沢は言わない様にします。

それはさておき、物は試しにWiiflow_rev26をコンパイルしてみました。
イマイチ自信が無いのでお聞きしたいのですが、これはどうなのでしょう?
とんとんさんの物と同じでしょうか?

ElleFileInfo 2.46 [2010/01/27 1:21:36]
ファイル名: wiiflow.dol
ファイルサイズ: 2.9 MB
CRC32:d5919344
MD5 :dbc6f42d98abfb3a3c52260496e3265d
SHA-1:c531f39c307ca07178514ebbdc5c9da3161a6b6c

投稿: うぃ~ | 2010年1月27日 (水) 01時30分

うぃ~さん こんにちは
ハッシュは一致しないので私とはちょっと違うものができたようです:)
ただ、失敗してるとかでは全然なくて、
たぶん取得したソースコードが微妙に違うんだと思います。
私は http://code.google.com/p/wiiflow/source/checkout から
svnを使って最新を落としてしまいました.
うぃ~さんは Wiiflow_rev26 のソース、としてまとめられたものを
どこかから入手できたのでしょうか?

ちなみにハッシュ値の調査に Elle FileInfo っていうのを使われているんですね。
私のおすすめは → のLinksにある HashTab Shell Extension です。
ファイルのプロパティ画面に「ハッシュ値」というタブが増えます。

投稿: とんとん | 2010年1月27日 (水) 11時56分

とんとんさん、ありがとうございます。

いま携帯に切り替わりましたので、ろくなコメ出来ませんが、入手先は同じですね。
僕の場合、trunkからSVNチェックアウトして最新を落としました。
一度ビルドした際にエラーをはかれたので、同じサイトからlibogcなどのファイルを入手し、devkitproフォルダ内に上書きしたり…。
そこら辺の環境による違いなのでしょうか。
今日帰ったら再度確かめてみたいと思います♪

ありがとうございました〜

投稿: うぃ〜 | 2010年1月27日 (水) 14時00分

とんとんさん、こんばんは!

Wiiflow_rev26sourceからビルドしたwiiflow.dolのハッシュ値を再確認しました。
紹介してくださった、HashTab Shell Extension使いました。これ凄く便利です(^^)
出てきたハッシュ値は上のコメで記載した通りでした。

結果、「おとうさんのPSP&Wii」さんで配布されていた、Wiiflow_v1.1_r25jと完全に
一致しました。
これならかなり以前から実際に使ってる物なので、動作に問題確認済みです。
なぜr25なのか分からないのですが、何だか安心しました(^_^;)

C言語・・・、少しずつですが勉強していきたいと思ってます。
今後ともよろしくお願いします。m(_ _)m

投稿: うぃ~ | 2010年1月28日 (木) 01時30分

こちらでは初コメです。
BBSの方ではいつも的確なご指導をしていただきありがとうございます。
記事を参考に、Wii Backup Managerを使ってみました。
FAT32のUSBメモリでGX、cfgの起動・作動を試してみましたがwbfs fileでも問題なしでした。
おっしゃる通りWBFSフォーマットは必要ないかもですね。

cfgのコンパイルができないものかと思案していたところ、TNTNさんの記事を参考にしたという方から
BBSの方で手順を紹介していただいたので、その手順とTNTNさんの記事を参考にしながら、
エラーが出たところで修正を加えていくことで見事にコンパイル完了しました。
生成されたdolファイル(cfg54.dol)を検証しましたが、問題なく起動・作動しました。
C言語のことはほとんどわからないのですが、また一つ勉強させていただき感謝です。
今後ともよろしくお願いします。

投稿: riceball | 2010年3月14日 (日) 01時04分

riceballさん
こんにちは
わざわざコメントありがとうございます。
すみません、半分はわざと、ここの記事は自分向けメモに徹していますので、
ここを見て作業するのは(C言語などに詳しくない人には)厳しかっただろうと思います。
もうちょっと詳しく「この行をこのように」などと書いてもいいんですが
別にそれを奨励するわけじゃなかったので…
(逆にC言語などをある程度知っている人ならピンと来てすぐ直せるかと)

まーいずれにせよ、なんかお役に立ててるみたいでよかったです。

私はこのところまったく自分の時間が取れなくてWiiもここもほったらかしで…

投稿: とんとん | 2010年3月15日 (月) 09時44分

direct loader gx で設定ファイルを読んでくれるので今はこれを使ってますが、
読み込みに失敗することが多く困っていますが
configure usb loaderの方が起動率はいいのでしょうか。

投稿: AM | 2010年8月26日 (木) 10時58分

Loadstructorではだめ?

投稿: AM | 2010年11月21日 (日) 15時53分

http://pcnimukaite.blog137.fc2.com/blog-entry-4.html
これでWiiflowを使ったチャンネル化が出来る。

投稿: | 2010年12月11日 (土) 19時39分

コメントを書く



(ウェブ上には掲載しません)




« USBメモリの厳密なチェック | トップページ | フィギュアスケート »