~Android用NEOGEO移植ソフトからROMイメージを抽出~
※>>Steam版NEOGEO移植ソフトからの抽出は別記事です。
Last update 2014/08/23
– convpack.zipがKOF98に対応しました。
~はじめに~
Google playで販売されているNEOGEO作品のダウンロード容量と
NEOGEOのROMイメージ容量が極めてソックリだったため、構造を解析してみました。
参考 [Google play] METAL SLUG X (¥350)
~注意~
Androidの仕様上「支払い→ファイルだけ抜く→すぐに返金処理」で
手元にROMを残せるはずですが、その場合は現行法で
違法コピーと解釈されるはずです。
この実験を行う方は絶対に返金処理しないでください。
むしろ、Android版NEOGEO移植シリーズはなかなか良好な出来映えなので、
メタスラ1,2,X,3やブレイジングスター…などなど全部買っちゃいましょう。
当時ウン十万円した高価なソフト一式がたった数千円で揃うのですよ。
そんな感じで皆が買いまくれば、いつか
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ファイルはゲームごとに格納フォルダ名が異なるので注意。
( /sdcard/Android/obb/ までは共通で、その下にゲームごとに異なるフォルダが出来る)
~obbファイルについて~
filesフォルダから拾い出しても良いのですが main.2.com.dotemu.neogeo.mslugx.obb を
PCにコピーし拡張子をzipに変更して展開すると、下記の意味深なファイルが抽出されます。
ファイル名 | ファイルサイズ | 内容 |
mslugx_adpcm | 10240KB | ADPCM(V-ROM) |
mslugx_bios_m68k | 128KB | BIOS(neo-geo.rom) |
mslugx_bios_sfix | 128KB | SFIX(sfix.sfx) |
mslugx_game_m68k | 5120KB | Program(P-ROM) |
mslugx_game_sfix | 128KB | SFIX(S-ROM) |
mslugx_game_z80 | 128KB | Z80(M-ROM) |
mslugx_gfix_usage | 4KB | SFIXから生成した中間データ(不要) |
mslugx_spr_usage | 96KB | TILESから生成した中間データ(不要) |
mslugx_tiles | 49152KB | Tiles(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_adpcm | 10240KB | 250-v1.bin 250-v2.bin 250-v3.bin |
4096KB 4096KB 2048KB |
mslugx_game_m68k | 5120KB | 250-p1.bin 250-p2.bin |
1024KB 4096KB |
mslugx_game_sfix | 128KB | 250-s1.bin | 128KB |
mslugx_game_z80 | 128KB | 250-m1.bin | 128KB |
mslugx_gfix_usage | 4KB | – | 未使用 |
mslugx_spr_usage | 96KB | – | 未使用 |
mslugx_tiles | 49152KB | 250-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.zip
単純なバイトスワップだけで生成が可能で、その法則性はコチラをご参照下さい。
恐らくこのバイトスワップは、SFIX-ROMの並びをNEOGEOのメモリマップ上に
適した形に再配置し、より高速な処理を行うための仕様と考えられます。
~2013/04/25追記 C-ROMの法則性特定できました~
というよりも mslugx_tiles の法則性ですが。
エミュレータなどで用いられるFBAフォーマット(fbacacheで生成)や、
NEOGEOエミュレータNeoDSで用いられるNEOフォーマット(NeoDsConvertで生成)
に格納されているVRAM展開用パターンとほぼ同じでした。
(厳密には処理をより高速化するため4バイトブロックを4ビットごとに反転した内容)
つまり以下のような感じです。
ファイル名 | 開始オフセット | データ並びの例(+0x0010600) |
mslugx_tiles | 0x00000000 | 9A A8 B8 08 |
mslugx.fba | 0x00630500 | 80 8B 8A A9 |
mslugx.neo | 0x00F60200 | 80 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 | ファイル名 |
00000000 | 00800000 | 0 | 250-c1.bin |
00000000 | 00800000 | 1 | 250-c2.bin |
00800000 | 00800000 | 0 | 250-c3.bin |
00800000 | 00800000 | 1 | 250-c4.bin |
01000000 | 00800000 | 0 | 250-c5.bin |
01000000 | 00800000 | 1 | 250-c6.bin |
なお、タイルデータから元のC-ROMへの再レイアウトの計算式はコチラ。
NeoDS同梱のNeoDsConverterのソースコードを参考にしました。
~環境構築~
NEOGEOエミュレータ『Nebula』で実際にプレイ可能にするまでの手順です。
Download : convpack.zip
BLAZING STAR
METAL SLUG
METAL SLUG 2
METAL SLUG X
真サムライスピリッツ
THE KING OF FIGHTERS ’97
THE KING OF FIGHTERS ’98
の変換バッチファイルと、
tileswap.exe、romcutter.exe、answap.exe、tiles2crom.exeのプログラムセットです。
oddファイルを展開したフォルダに中身をコピーして各種バッチファイルを実行し、
C-ROMを正しい手順で変換すればゲームのROMイメージを生成できます。
***-p1.bin、***-c1.bin など拡張子binのファイルが複数生成されるので、
ゲームごとに以下のzipファイルにまとめて圧縮してください。
タイトル | ZIPファイル名 |
メタルスラッグ | mslug.zip |
メタルスラッグ2 | mslug2.zip |
メタルスラッグX | mslugx.zip |
ブレイジングスター | blazstar.zip |
真サムライスピリッツ | samsho2.zip |
THE KING OF FIGHTERS ’97 | kof97.zip |
THE KING OF FIGHTERS ’98 | kof98.zip |
BIOSイメージ作成にはMETAL SLUGもしくはBLAZING STARを購入し、
oddファイルを以下の通りリネーム。
METAL SLUGの場合 | BLAZING STARの場合 | リネーム後のファイル名 |
mslug_bios_m68k | blazstar_bios_m68k | neo-geo.rom |
mslug_zoom_table | blazstar_zoom_table | 000-lo.lo |
mslug_bios_sfix | blazstar_bios_sfix | sfix.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
metal slug xをここの手順通りやっているのですが、android_METAL_SLUG_X.batを
起動すると250-m1.binと250-s1.binだけ作られあとのファイルはアクセスが拒否されましたと出てファイルが作られません。アクセス許可はフルコントロールにしていますがどうもうまくいきません。何かやりかたが間違っているのでしょうか
可能性として考えられるのは
・フォルダ名に日本語または半角スペースが含まれている。
(バッチファイルの引数指定が狂う可能性アリ)
・OS仕様上、管理者ユーザ以外では通常アクセスが出来ない
特殊フォルダにファイルを展開し、通常ユーザでコマンドを実行している。
のどちらかと思われます。
返信ありがとうございます。問題はご指摘の通りアクセス権限に関することでした。問題を解決したところ無事7本全てのromを吸い出すことが出来、nebulaで起動を確認しています。ありがとうございました。
Steamで販売されているやつも同じようなファイル構成だったので、この記事を参考に抽出できました ありがとうございます
実は別記事にまとめてました。
http://i486.mods.jp/ichild/?page_id=1421
念のため本記事も修正してSteam版へのリンクを張りました。
いつも有意義な情報ありがとうございます。
不躾な質問で申し訳ありませんが、こちらのツールで
android 餓狼 MARK OF THE WOLVESに対応の
予定はございませんか?
よろしくお願いいたします。
理論上はコンバート出来るとは思いますが、
元となっているROMが特殊チップになっているため
法則性がつかめていません。
HumbleBundleあたりで素ROMが出てくれればそれを元に
解析できますが、今のところは無理ですねぇ。
分かりました。ネオジオ後期のロムデーター特殊チップなんですね。
お返事ありがとうございます。
貴重な情報のおかげで、貴重なneogenゲームが遊べて助かってます。
恩返しというほどではないですが、
psvitaの月華2は、vita3.60、かつhenkaku導入済み、
そしてvitaminを使ってバックアップをとれば、
romデータを構築できます。
c-romは、こちらのtiles2cromで変換すればいいです。
しかし、wiiのvcにあるcr00のromが厳しい。
メモリーダンプでc-rom以外はいけるのですが···
何か方法はないでしょうか。
メタルスラッグXの変換を試したところ、250-p1のCRC値が異なり起動不可でした(他のROMは全てCRC値一致)
変換:60C33B1A
本来:81F1F60B
あとsteam版の幕末浪漫 月華の剣士は以下のバッチで変換出来ました
echo off
romcutter.exe lastblad_adpcm 234-v1.bin 0 400000
romcutter.exe lastblad_adpcm 234-v2.bin 400000 400000
romcutter.exe lastblad_adpcm 234-v3.bin 800000 400000
romcutter.exe lastblad_adpcm 234-v4.bin C00000 400000
romcutter.exe lastblad_game_m68k 234-p1.bin 0 100000
romcutter.exe lastblad_game_m68k 234-p2.bin 100000 400000
answap lastblad_game_sfix 234-s1.bin
copy lastblad_game_z80 234-m1.bin
tileswap lastblad_tiles lastblad_tiles.swp
echo 2ndStage reference..
echo 234-c1.bin : StartAddr=0 Line=0 Size=800000
echo 234-c2.bin : StartAddr=0 Line=1 Size=800000
echo 234-c3.bin : StartAddr=800000 Line=0 Size=800000
echo 234-c4.bin : StartAddr=800000 Line=1 Size=800000
echo 234-c5.bin : StartAddr=1000000 Line=0 Size=400000
echo 234-c6.bin : StartAddr=1000000 Line=1 Size=400000
tiles2crom.exe lastblad_tiles.swp
copy lastblad_bios_m68k neo-geo.rom
answap lastblad_bios_sfix sfix.sfx
copy lastblad_zoom_table 000-lo.lo
pause
バージョン違いやコピーライトの修正などで範囲が書き換えられている可能性もあるので、今のバージョンだと新たに解析しないとダメかもですね。
>バージョン違いやコピーライトの修正などで範囲が書き換えられている可能性もある
250-p1の抽出元である”mslugx_game_m68k”のファイル更新日付は2012/10/27でしたので、こちらの記事が記載される以前ではあるんですけどね。
残念。
こちらでも同じ状態でしたが Nebula で CRC エラーを無視して続行したら起動できました。
普通に遊べているので、ゲームと直接関係無い箇所の修正があったのかもしれませんね。
なお、Steam 版、GOG 版 で確認したところ、両方とも同じ CRC値(60C3B1A)でした。
読み込み時に CRC チェックが厳格なエミュレータだとエラーになり起動できません。
Prime Gaming(旧名称:Twitch Prime)のものを変換する際に作ったパッチですが、Steamも同じファイル構成なら使用出来るかも?
Shock Troopers のバッチ(Bios分除く)============================
romcutter.exe shocktro_adpcm 238-v1.bin 0 400000
romcutter.exe shocktro_adpcm 238-v2.bin 400000 200000
romcutter.exe shocktro_game_m68k 238-p1.bin 0 100000
romcutter.exe shocktro_game_m68k 238-p2.bin 100000 400000
answap shocktro_game_sfix 238-s1.bin
copy shocktro_game_z80 238-m1.bin
tileswap.exe shocktro_tiles 238-c.swp
echo 238-c1.bin : StartAddr=0 Line=0 Size=400000
echo 238-c2.bin : StartAddr=0 Line=1 Size=400000
echo 238-c3.bin : StartAddr=400000 Line=0 Size=400000
echo 238-c4.bin : StartAddr=400000 Line=1 Size=400000
echo 238-c1.bin : StartAddr=800000 Line=0 Size=400000
echo 238-c2.bin : StartAddr=800000 Line=1 Size=400000
echo 238-c3.bin : StartAddr=C00000 Line=0 Size=400000
echo 238-c4.bin : StartAddr=C00000 Line=1 Size=400000
tiles2crom.exe 238-c.swp
pause
Shock Troopers – 2nd Squad のバッチ(Bios分除く)===============
romcutter.exe shocktr2_adpcm 246-v1.bin 0 400000
romcutter.exe shocktr2_adpcm 246-v2.bin 400000 400000
romcutter.exe shocktr2_adpcm 246-v3.bin 800000 200000
romcutter.exe shocktr2_game_m68k 246-p1.bin 0 100000
romcutter.exe shocktr2_game_m68k 246-p2.bin 100000 400000
answap shocktr2_game_sfix 246-s1.bin
copy shocktr2_game_z80 246-m1.bin
tileswap shocktr2_tiles shocktr2_tiles.swp
echo 248-c1.bin : StartAddr=0 Line=0 Size=800000
echo 248-c2.bin : StartAddr=0 Line=1 Size=800000
echo 248-c3.bin : StartAddr=800000 Line=0 Size=800000
echo 248-c4.bin : StartAddr=800000 Line=1 Size=800000
echo 248-c1.bin : StartAddr=1000000 Line=0 Size=800000
echo 248-c2.bin : StartAddr=1000000 Line=1 Size=800000
tiles2crom.exe shocktr2_tiles.swp
pause
prime gamingタイトルにもdotemuベースのヤツがあったんですね
Steamの”SAMURAI SHODOWN NEOGEO COLLECTION”から以下リンク先のツールを用いる事で侍魂1~4が抽出出来ました
https://github.com/ValadAmoleo/sf30ac-extractor
Steamの”幕末浪漫第二幕 月華の剣士”(Dotemu移植)は、Cロム以外は以下のバッチファイルで変換?したところCRC値が一致しました
romcutter.exe v1.bin 243-v1.v1 0 400000
romcutter.exe v1.bin 243-v2.v2 400000 400000
romcutter.exe v1.bin 243-v3.v3 800000 400000
romcutter.exe v1.bin 243-v4.v4 C00000 400000
copy m1.bin 243-m1.m1
copy s1.bin 243-s1.s1
romcutter.exe p1.bin 243-pg1.p1 0 100000
romcutter.exe p1.bin 243-pg2.sp2 100000 400000
あとは”c1.bin”と言ういかにもな名前の48MBのファイルからどうやってCロムx6を取り出すか?
SAMURAI SHODOWN NEOGEO COLLECTIONはepic gamesと同じものであれば、samsho5,5sp,5sp完全版もいけますよ。
月華2のc1.binはもしかしたらtiles2cromで変換すればいいかもしれません。vita版はそれでいけました。
ちなみにvita版のフライングパワーディスクもhenkaku導入していれば、rom構築までできます。
>SAMURAI SHODOWN NEOGEO COLLECTIONはepic gamesと同じものであれば、samsho5,5sp,5sp完全版もいけますよ。
30ac-extractorを実行したところsamsho5系はzipファイルが作成されなかったので暗号化の都合かと思っていたのですが
何か手法があるのでしょうか?
>月華2のc1.binはもしかしたらtiles2cromで変換すればいいかもしれません。
頂いたアドバイスを参考に下記数値で試したところいけました。
243-c1.bin StartAddr:0 Odd_or_Even:0 SplitSize:800000
243-c2.bin StartAddr:0 Odd_or_Even:1 SplitSize:800000
243-c3.bin StartAddr:800000 Odd_or_Even:0 SplitSize:800000
243-c4.bin StartAddr:800000 Odd_or_Even:1 SplitSize:800000
243-c5.bin StartAddr:1000000 Odd_or_Even:0 SplitSize:800000
243-c6.bin StartAddr:1000000 Odd_or_Even:1 SplitSize:800000
243-c7.bin StartAddr:1800000 Odd_or_Even:0 SplitSize:800000
243-c8.bin StartAddr:1800000 Odd_or_Even:1 SplitSize:800000
これでSteamの”幕末浪漫第二幕 月華の剣士”の変換も完了です。
有難う御座いました。
あとSteamのでは”ベースボールスターズ2″か、餓狼MoWは無理っぽいし。
2020.8.27に掲載された記事を発見
SNKコンソール版『ベースボールスターズ 2』から「台湾」関連名称が削除に―『龍虎の拳2』PC版からも旭日旗削除
https://www.gamespark.jp/article/2020/08/27/101574.html
>同作の登場球団はいずれも地名が含まれていますが、内「タイペイ・ホークス」「タイワン・ドラゴンズ」の2チームについて、名称から地名部分の削除が行われたとしています。
>なお、Steam版では先日、全てのチームから地名が削られているとのことです。
バイナリが一致しないはずだ
steam「THE KING OF FIGHTERS ’97 GLOBAL MATCH」からKOF97が抽出できました
romcutter.exe v1.bin 232-v1.bin 0 400000
romcutter.exe v1.bin 232-v2.bin 400000 400000
romcutter.exe v1.bin 232-v3.bin 800000 400000
romcutter.exe p1.bin 232-p1.bin 0 100000
romcutter.exe p1.bin 232-p2.bin 100000 400000
copy m1.bin 232-m1.bin
copy s1.bin 232-s1.bin
echo 232-c1.bin StartAddr:0 Odd_or_Even:0 SplitSize:800000
echo 232-c2.bin StartAddr:0 Odd_or_Even:1 SplitSize:800000
echo 232-c3.bin StartAddr:800000 Odd_or_Even:0 SplitSize:800000
echo 232-c4.bin StartAddr:800000 Odd_or_Even:1 SplitSize:800000
echo 232-c5.bin StartAddr:1000000 Odd_or_Even:0 SplitSize:400000
echo 232-c6.bin StartAddr:1000000 Odd_or_Even:1 SplitSize:400000
tiles2crom.exe c1.bin
★Garou MOW アンドロイド版(アケアカではない)を展開するまで。
Irregular child 2ndでAndroidを展開するツール一式を入手する。
Garou MOW Android版を購入してインストールして、端末内に展開されるファイルをPCへ。
その後、ツール一式で一通りファイルを変換しておく。
【P rom編】
Neogeo P-rom encrypterと検索。
あるサイトで入手できるprog.zipを使う。
garou_game_m68kをそのまま変換する。
p1,p2,smaに分割されるので、
あとはp1とp2それぞれロムマスカレードを使ってp1,p2,p3,p4を作成するだけ。
smaも使うので、ついでに回収する。
【M rom編、V rom編】
Mromはそのまま採用。
Vromはロムマスカレードで分割するだけ。
【C rom編】
1.とりあえずAndroidを展開するツール一式でmotwn_c1.bin~c8を作る
2.作ったc1~c8を合体=odd,even生成(デコードされてる)合体方法はc1+c3+c5+c7 and c2+c4+c6+c8
3.発明の友:メタスラコンプリートのページでゲットできるファイルからBSwapを使ってodd+evenを統合し、crom(デコードされてる&キャッシュ)を作成する
4.cromをエンコードする(発明の友:メタスラコンプリートのページでゲットできるファイルからsrc>neo-cmc.exeを使う)
5.エンコードしたcromをロムマスカレードでodd evenに分割
6.ロムマスカレードでoddからc1,c3,c5,c7、evenからc2,c4,c6,c8作成。
すべてのファイルを1つにまとめておわり。