サムライスピリッツネオジオコレクションから変換

2022年6月26日

PrimeゲームでNEOGEO系タイトルが配布中

配布されるゲーム中
Fatal Fury Special (餓狼伝説SP)
Samurai Shodown II (真SAMURAI SPIRITS 覇王丸地獄変)
The King of Fighters 2000
The King of Fighters 2002

これらは配布ファイルの差し替えがなくDotEMU版のままなら
インストール先にROMとBIOSがzipで放り込まれているので
そのまま合法的に再利用可能です、CodeMystics版のメタルスラッグ2は要変換。
詳細は前の記事を見て貰えれば

DotEMUってキーコンフィグもサイズ調整もできない作品が多いので
FinalBurnNEOとかRetroArchを使った方が便利に遊べますからね・・・
このパターンだと後から追加配布もある?(龍虎2は日章旗でダメ?)

サムライスピリッツ ネオジオコレクションから変換

サムライスピリッツ零SPFE (Final Edition)
(10数年前にSNKによって即差し止められたロケテ版、赤スペ)を変換します
完成するとsamsh5fe.zipになります

©YUKI enterprise ©SNK PLAYMORE 2004

FinalBurnNEO(nightly builds)やLibrettoの同コアで利用可能です
Steam版で行っていますが、おそらく無料配布のEPIC版でも問題ないかと。

サマーセールでお値打ちでした

ただし、いつもの事ですが全ては自己責任。BANされても泣かない。

作業環境にLinux用WindowsサブシステムかLINUX環境が必要になります
変換ツールでポチポチ~完了!みたいな、楽なやり方ではないので注意
そういうのは出来る人が作ってくれるでしょう・・・既存ツールうまく使えばいけるかも?

Windows10でLinux 用 Windows サブシステムを導入する

インストールした製品

導入の仕方は各自でおこなってください。さすがにそこまではね・・・(参考)
基本コマンドも最低限は覚えておくとよいかと(参考)

Ubuntuは複数の長期サポート製品がありますが、自分が導入したのは上記の製品です
LINUX環境がある人は、そのまま使えばたぶん大丈夫。

ファイルの解凍と必要ファイルの確認

必要なファイルは拡張子mbundleに含まれているので解凍します。
ツールはいくつかあります
QuickBMS&Sf30 Mbundle(ページ真ん中辺)とか

sf30ac-extractorのがフォルダ生成してくれるので楽です

初代から天草降臨まで変換できるsf30ac-extractorでも行けるはずです。
全部解凍しましたが、bundleSamuraiShodown5Special.mbundleで行けるかと(たぶん
見てもらうと分かりますがFEは2個だけ、多くは5SPと共用になっています。

変換元変換先
samsh5sp.cslot1_audiocrypt.decM コピー&リネーム 272-m1d.bin
samsh5sp.cslot1_fixed.decS コピー&リネーム 272-s1.bin
samsho5_fe.cslot1_maincpuP(作業が必要)
SamuraiShodown5_FE.sprites.swizzledC(作業が必要)
samsh5sp.cslot1_ymsnd.decV(作業が必要)
MとSの二つは、そのままコピーしてリネームすれば完了なので省略

Pの変換と分割

samsho5_fe.cslot1_maincpu.swapを生成します。(出典元
samsho5_fe.cslot1_maincpuファイルのあるフォルダーに移動したら以下のコマンドを入力

dd if=samsho5_fe.cslot1_maincpu of=samsho5_fe.cslot1_maincpu.swap conv=swab

何も表示されませんが、samsho5_fe.cslot1_maincpu.swapが作られています。
(サブシステムではmnt/配下にドライブレターがありますので、そこから任意のディレクトリに移動してください)

次に下のコードを1行ずつ入力します。

dd if=samsho5_fe.cslot1_maincpu.swap of=272-p1.bin count=$((8388608/2)) bs=1
dd if=samsho5_fe.cslot1_maincpu.swap of=272-p2.bin skip=$((8388608/2)) count=$((8388608/2)) bs=1

入力後、反応がしばらくありませんが数分待てば完了するはずです。
2つとも行ったら、これでP変換は完了です。(出典元)

Vの分割とバイナリ修正作業

samsh5sp.cslot1_ymsnd.decを分割します(出典元)

dd if=samsh5sp.cslot1_ymsnd.dec of=272-v1d.bin count=$((16777216/2)) bs=1
dd if=samsh5sp.cslot1_ymsnd.dec of=272-v2d.bin skip=$((16777216/2)) count=$((16777216/2)) bs=1

ひとつ毎に変換してください、ちょっと待たされると思います。
初期はこのままで完了だったのですが・・・V1のdumpミスが指摘された事で
ROMセットに変更が入りました、修正しないとバッドになります(出典元)
復号化ミスのあるダンプがなぜ製(以下省略

バイナリエディターで272-v1d.binを開き、アドレス毎に元の数字を書き換えてください。

00006bc0  ab→08
0000ed41 08→89
00016bc0  6e→82
0001ed41 da→8f

この書き換えが完了したら、チェックサムが下記にかわるはずです。(CRC32)
272-v1d.bin 3bf61586 => updated v1to 272-v1d.bin 28d57d10

うまく行かない場合は出典元のバイナリ差分とにらめっこしてください・・・
もしくはパッチ当てちゃうのもありかと思います。

これでVの変換作業は終了です。

Cの変換と分割(要コンパイル)

ここではコンパイルが必要になります
gccが必要なのでサブシステムの人はインストールしましょう。

sudo apt install gcc

パスワードを聞かれますから入力
後は容量150MB必要だけど?と聞いてくるので
Y→エンターキーでインストールが終わるまで待ちましょう。

完了したら下記コードをss_unswizzle.cとしてコピペでメモ帳などで保存します(出典元)。

#include <stdio.h>
#include <unistd.h>
#include <stdint.h>

int main(int argc, char **argv) {
  FILE *input, *output1, *output2;
  uint8_t tile[128];
  uint8_t* offset;
  uint8_t x_offset,y_offset,block, data,row;
  int i;
  uint8_t planes[4];

  if(argc < 4) {
    printf("ss-unsizzle <input file> <output odd> <ouput even>\n");
    return 1;
  }

  input = fopen(argv[1], "r");
  if(!input) {
    printf("Error: unable to open %s for reading.\n", argv[1]);
    return 1;
  }

  output1 = fopen(argv[2], "w");
  if(!output1) {
    printf("Error: unable to open %s for writing.\n", argv[2]);
    return 1;
  }

  output2 = fopen(argv[3], "w");
  if(!output2) {
    printf("Error: unable to open %s for writing.\n", argv[3]);
    return 1;
  }

  while(fread(tile, 1, 128, input) == 128) {
    for(block = 0;block < 4;block++) {

      // x/y_offset get us into the correct block
      switch(block) {
        case 0:
          x_offset = 4;
          y_offset = 0;
          break;
        case 1:
          x_offset = 4;
          y_offset = 8;
          break;
        case 2:
          x_offset = 0;
          y_offset = 0;
          break;
        case 3:
          x_offset = 0;
          y_offset = 8;
          break;
      }

      // traverse each row of the block
      for(row = 0;row < 8;row++) {
        planes[0] = 0;
        planes[1] = 0;
        planes[2] = 0;
        planes[3] = 0;

        offset = &tile[x_offset + (y_offset * 8) + (row * 8)];

        for(i = 3;i >= 0;i--) {
          data = offset[i];

          planes[0] = planes[0] << 1;
          planes[0] = planes[0] | ((data >> 4) & 0x1);
          planes[0] = planes[0] << 1;
          planes[0] = planes[0] | ((data >> 0) & 0x1);

          planes[1] = planes[1] << 1;
          planes[1] = planes[1] | ((data >> 5) & 0x1);
          planes[1] = planes[1] << 1;
          planes[1] = planes[1] | ((data >> 1) & 0x1);

          planes[2] = planes[2] << 1;
          planes[2] = planes[2] | ((data >> 6) & 0x1);
          planes[2] = planes[2] << 1;
          planes[2] = planes[2] | ((data >> 2) & 0x1);

          planes[3] = planes[3] << 1;
          planes[3] = planes[3] | ((data >> 7) & 0x1);
          planes[3] = planes[3] << 1;
          planes[3] = planes[3] | ((data >> 3) & 0x1);

        }
        fwrite(&planes[0],1, 1, output1);
        fwrite(&planes[1],1, 1, output1);
        fwrite(&planes[2],1, 1, output2);
        fwrite(&planes[3],1, 1, output2);
      }
    }
  }

  fclose(input);
  fclose(output1);
  fclose(output2);
}

Windows環境でコンパイルすると32KBのファイルしか作れません(やらかした)
かならずコンパイルはサブシステムかLINUX環境下で作業を行ってください。

gcc -o ss_unswizzle ss_unswizzle.c

コンパイルに問題なければ、なにも表示されずにss_unswizzleと言うファイルができています。
今度はこの実行ファイルを/BINにコピーします。(実行ファイルはBINに入れないと動きません)

cp ss_unswizzle /bin

完了したら今度はODDとEVENの分割を行います。

ss_unswizzle SamuraiShodown5_FE.sprites.swizzled odd even

ODDEVENと言う拡張子なしのファイルができあがります。

次は分割です(出典元)

$ split -n 4 odd

4分割されたファイルを順に

272-c1d.bin(xaa)
272-c3d.bin(xab)
272-c5d.bin(xac)
272-c7d.bin(xad)

にリネームします。

2回連続でコマンドを打ってしまうと、上書きされてしまうので(やった)
1回ごとにリネームし終わってから、次の作業をおこなってください。

$ split -n 4 even

4分割されたファイルを順に

272-c2d.bin(xaa)
272-c4d.bin(xab)
272-c6d.bin(xac)
272-c8d.bin(xad)

にリネームします。

ファイルの確認と圧縮

生成できたファイルをZIPで圧縮しファイル名はsamsh5fe.zipにします。
動作はFinalBurnNEOのnightly buildsで確認しました
ファイル詳細はdatに記載されている物を引用しています。

samsh5fe.zip
272-p1.bin size="4194304" crc="9e72cc83"
272-p2.bin size="4194304" crc="1f5469bc"
272-s1.bin size="131072" crc="c297f973"
272-c1d.bin size="8388608" crc="ec9fda8d"
272-c2d.bin size="8388608" crc="d2fc888d"
272-c3d.bin size="8388608" crc="b0ea781b"
272-c4d.bin size="8388608" crc="d34ac591"
272-c5d.bin size="8388608" crc="1b5c1ea2"
272-c6d.bin size="8388608" crc="deeaad58"
272-c7d.bin size="8388608" crc="dce0119f"
272-c8d.bin size="8388608" crc="3bf256c5"
272-m1d.bin size="524288" crc="203d744e"
272-v1d.bin size="8388608" crc="28d57d10"
272-v2d.bin size="8388608" crc="95fe7646"

crc32はEXPLZHで圧縮すると、すぐ確認できるので便利です。
面倒くさい作業ですが、コレで動作に問題なければ変換完了です~
お疲れ様でした!

sf30ac-extractor-mameのソースコードを見ると
SplitGameFileUnswizzleがあるので、おそらく同じような処理をしていると思います
が、パラメーターが分からないので出来る人はそっちに追加する方が楽です
自由にぜひともやってください。そしてプルリクに追加して下さい(他人任せ

赤スペの経緯

なんともはや、そう言う話だったのですね・・・

完全版との違い

タイトル画面が違います。

王虎なんで出演作少ないん?

別タイトルですから、別物です。(解散したとは言え)悠紀エンタープライズの表記もありません。

最後に

arcade-projects.comのフォーラムから、この変換記事は成り立っています
2年前に書き込みをしてくださった人々に感謝を、ありがとうございました。

追記 たぶん5SPとかも似たような感じで変換出来るかも?(未確認)
次記事で検証しました。
海外勢により英語ストーリー追加とタイトル表記をPerfectに変更した
パーフェクト版ハックはここのIPSで対応可能なようです(要登録・未確認)