Android用NEOGEOソフト解析まとめ Ver.2013/07/14

2013/07/14 ..
 convpack.zip に真サムライスピリッツのコンバート方法追記
2013/04/29 ..
 Android版→ROMイメージ原本の復元成功

〜はじめに〜

Google playで販売されているNEOGEO作品のダウンロード容量とNEOGEOのROMイメージ容量が
極めてソックリだったため、構造を解析してみました。
参考 [Google play] METAL SLUG X (\350)

〜注意〜
Androidの仕様上「支払い→ファイルだけ抜く→すぐに返金処理」で手元にROMを残せるはずですが、
その場合は現行法では違法コピーと解釈されるはずです。
この実験を行う方は絶対に返金処理しないでください。

むしろ、Android版NEOGEO移植シリーズはなかなか良好な出来映えなので、
メタスラ1,2,X,3やブレイジングスター全部買っちゃいましょう。
当時数十万円分のソフト一式がたった1,650円で揃うのですよ。
そんな感じで皆が買いまくれば、いつか
Bluetoothでワイヤレス対戦可能なティンクルスタースプライツ
とかもリリースされるかもしれません(・ω・)

〜ダウンロード→展開→ゲーム開始の流れ〜
ダウンロードサイズがかなり大きいため、ダウンロードと同時に「Wi-Fi通信」を推奨されますが、
ダウンロードと実行の流れは以下のようになっています。
(METAL SLUG Xの場合)。

1.ダウンロード時に /sdcard/Android/obb/com.dotemu.neogeo.mslugx/ に
  main.2.com.dotemu.neogeo.mslugx.obb と patch.2.com.dotemu.neogeo.mslugx.obb を保存。

2.実行後にこれらを /sdcard/Android/data/com.dotemu.neogeo.mslugx/files/ に展開。

3.最後にAPKをシステムに配置してプログラムを実行できるように設定。

〜obbファイルについて〜
filesフォルダから拾い出しても良いのですが main.2.com.dotemu.neogeo.mslugx.obb をPCにコピーし、
拡張子をzipに変更して展開すると、下記の意味深なファイルが抽出されます。
ファイル名ファイルサイズ内容
mslugx_adpcm10240KBADPCM(V-ROM)
mslugx_bios_m68k128KBBIOS(neo-geo.rom)
mslugx_bios_sfix128KBSFIX(sfix.sfx)
mslugx_game_m68k5120KBProgram(P-ROM)
mslugx_game_sfix128KBSFIX(S-ROM)
mslugx_game_z80128KBZ80(M-ROM)
mslugx_gfix_usage4KBSFIXから生成した中間データ(不要)
mslugx_spr_usage96KBTILESから生成した中間データ(不要)
mslugx_tiles49152KBTiles(C-ROM)
NEOGEO版METAL SLUG XのROMと比較すると、V-ROMは4096KB+4096KB+2048KB(10240KB)、
C-ROMは8192KB×6(49152KB)でサイズが完全一致。
さらにNEOGEO BIOSらしきものも含まれてウヒョーーー!!!…と思えますが…。

〜NEOGEO BIOSのようなものについて〜
mslugx_bios_m68kとmslugx_bios_sfixを見たところ、実機BIOSに限りなく似ています。
ただし、完全に同じというわけではなくエミュレータでロードすると起動直後にクラッシュしました。
恐らく、Androidアプリと連携を取るよう細かい部分がカスタマイズされているものと推測されます。

また、LO-ROM(000-lo.lo)やSM1(sm1.sm1)など他のBIOSイメージが含まれていないため、
「Android版NEOGEOシリーズからBIOSダンプは現実的に出来ない」と思われます。
とはいえ、NEOGEOエミュレータとして動いていることに違いは無いので、
apkなどからLO・SM1を抽出することは可能かもしれません。


〜追記〜
BLAZING STARに含まれるファイル blazstar_zoom_table が"000-lo.lo"と完全一致しました。
さらに、NEOGEOエミュレータ『Nebula』はSM1を使わずに音源エミュレーションが可能なため、
『METAL SLUG』または『BLAZING STAR』があればneogeo.zip(BIOSセット)を生成可能です。
詳しい手順は当記事最後の『環境構築』項をご覧下さい。


〜METAL SLUG XのROMイメージのようなものについて〜
試しにmslugx〜ファイルを展開できないか検証用にromcutter.zip(変換バッチファイル同梱)を作ってみました。
main.2.com.dotemu.neogeo.mslugx.obbを展開したフォルダにromcutter.exeとandroid_METAL_SLUG_X.batをコピーし、
android_METAL_SLUG_X.batを実行すると、NEOGEO ROMと同じファイル構成で切り出します。
ファイル名元サイズ出力ファイル出力サイズ
mslugx_adpcm10240KB250-v1.bin
250-v2.bin
250-v3.bin
4096KB
4096KB
2048KB
mslugx_game_m68k5120KB250-p1.bin
250-p2.bin
1024KB
4096KB
mslugx_game_sfix128KB250-s1.bin128KB
mslugx_game_z80128KB250-m1.bin128KB
mslugx_gfix_usage4KB-未使用
mslugx_spr_usage96KB-未使用
mslugx_tiles49152KB250-c1.bin
250-c2.bin
250-c3.bin
250-c4.bin
250-c5.bin
250-c6.bin
8192KB
8192KB
8192KB
8192KB
8192KB
8192KB

これらのファイルをmslugx.zipに圧縮したものをエミュレータで実行すると…

こんな感じ。


〜何が問題なのか?〜
上の画像を見て「ああ、ステージ1っぽいなぁ」と思った方はいい勘してます。
つまり画面がバグっていてもゲームは進行できるのです。
また、V-ROMやM-ROMも正常に認識しており、BGM/SEもバッチリ鳴ります。

また、画像はバグっていてもカラー情報は完全に一致しているため、
C1〜C6・S1をスマートフォンにあわせてピクセル数を調整しているのかもしれません。
(実際、ROMを比較するとS1は似ているもののC1-C6は大きく内容が異なります)。
とりあえず今のところはNebula(JUKEBOX)で音楽を聴くくらいしか出来ません。

これを解決する方法として考えられるアプローチは
1.C1〜C6、S1から元データの仕様に準拠したデータを生成するコンバータを作る。
2.Android版のエミュレータの仕様を再現するプログラムを作る。
くらいでしょうか。

※2013/04/28追記:実際にはTilesは「C-ROMを元に生成したエミュレータ用パターンデータ」です。
スマートフォン用に調整などは一切していません。


〜2013/04/25追記 S1コンバータできました〜
game_sfixの法則性が特定できたのでコンバータを作りました>Download answap
単純なバイトスワップだけで生成が可能で、その法則性はコチラをご参照下さい。

恐らくこのバイトスワップは、SFIX-ROMの並びをNEOGEOのメモリマップ上に
適した形に再配置し、より高速な処理を行うための仕様と考えられます。

〜2013/04/25追記 C-ROMの法則性特定できました〜
というよりも mslugx_tiles の法則性ですが。
エミュレータなどで用いられるFBAフォーマット(fbacacheで生成)や、
NEOGEOエミュレータNeoDSで用いられるNEOフォーマット(NeoDsConvertで生成)
に格納されているVRAM展開用パターンとほぼ同じでした。
(厳密には処理をより高速化するため4バイトブロックを4ビットごとに反転した内容)

つまり以下のような感じです。
ファイル名開始オフセットデータ並びの例(+0x0010600)
mslugx_tiles0x000000009A A8 B8 08
mslugx.fba0x0063050080 8B 8A A9
mslugx.neo0x00F6020080 8B 8A A9

Download : tileswap.zip
とりあえず4ビットごとに反転するツールも作りました。
ただし、このツールを使っても「FBAやNEOに含まれるスプライト情報ブロックと同等のデータ列が生成される」だけで、
Android版NEOGEO移植シリーズからPC用エミュレータでプレイ可能なROMイメージを生成することはできません。

このスプライトパターンから元のC-ROMを復元するプログラムは現段階では未完成です。
〜2013/04/28追記 スワップ後のタイルからC-ROM生成できました〜
Download : tiles2crom.zip
このツールを使うと前述のtileswapで生成したスワップ済みTilesデータからC-ROMの生成が可能です。
引数にswapped_tilesを与えるとC-ROMを偶数&奇数バイトにメモリ上へ展開します。
メタルスラッグXの場合はtiles2cromに下記パラメータを与えればROMを生成できました。
開始アドレスサイズOdd or Evenファイル名
00000000008000000250-c1.bin
00000000008000001250-c2.bin
00800000008000000250-c3.bin
00800000008000001250-c4.bin
01000000008000000250-c5.bin
01000000008000001250-c6.bin
なお、タイルデータから元のC-ROMへの再レイアウトの計算式はコチラ
NeoDS同梱のNeoDsConverterのソースコードを参考にしました。


〜環境構築〜
NEOGEOエミュレータ『Nebula』で実際にプレイ可能にするまでの手順です。

Download : convpack.zip
METAL SLUG
METAL SLUG 2
METAL SLUG X
BLAZING STAR
真サムライスピリッツ
の5種の変換バッチファイルと、
tileswap.exe、romcutter.exe、answap.exe、tiles2crom.exeのプログラムセットです。
oddファイルを展開したフォルダに中身をコピーして各種バッチファイルを実行し、
C-ROMを正しい手順で変換すればゲームのROMイメージを生成できます。
上記4作はそれぞれ以下のzipファイルにまとめて圧縮してください。
タイトルZIPファイル名
メタルスラッグmslug.zip
メタルスラッグ2mslug2.zip
メタルスラッグXmslugx.zip
ブレイジングスターblazstar.zip
真サムライスピリッツsamsho2.zip

BIOSイメージ作成にはMETAL SLUGもしくはBLAZING STARを購入し、
oddファイルを以下の通りリネーム。
METAL SLUGの場合BLAZING STARの場合リネーム後のファイル名
mslug_bios_m68kblazstar_bios_m68kneo-geo.rom
mslug_zoom_tableblazstar_zoom_table000-lo.lo
mslug_bios_sfixblazstar_bios_sfixsfix.sfx
※実際にはneo-geo.romは使えませんが念のためパックします。

さらにTHE UNIVERSE BIOSの最新版(2013/04/29現在v3.0)をダウンロードし、
uni-bios.romを先ほどの3つのリネームしたファイルと一緒に"neogeo.zip"に圧縮すればOKです。

NebulaのromsフォルダにゲームのROMイメージおよびneogeo.zipを入れて実行し、
Game - Neogeo OptionsメニューのUse Universe-Biosをチェックすれば準備完了。
これで購入した作品をPCでプレイ可能になります。

〜さいごに〜
これで、Android版NEOGEO作品からNebulaなどで実行可能なROMイメージを生成できました。
しかし、せっかく自分で支払って購入したソフトからROMイメージを生成するのですから、
決して誰にも渡さず、あくまで自分用のバックアップとして利用しましょう。
("mslugx"とサーチするだけで海外のROMサイトがばんばんヒットしますし、
 恐らく違法コピー目的の人がこんな面倒なことをするわけありませんが…)。


メールアドレス(アットマークを半角に) : hs_mana@hotmail.com