ss_unswizzleのソース修正とバイナリ公開

エミュレーター,ツールFinalBurnNEO,MAME,neogeo,エミュレーター

ss_unswizzleとは?

元々は赤スぺ抽出のツールです

オリジナルのソースはackさんによる投稿になっています


中身は、はむさんのtiles2crom.exeが行う

NEOGEOのエミュレーター最適化された
タイルの変換と並替にOdd/Evenをするツールです
Odd/Even後のバイナリ切り出しは行ないません。

しかしbcut等のバイナリカッターと併用することにより
tiles2crom.exeの置換が可能になります
手動入力ではなくバッチで回せるのでミスも減りますね。

ダウンロード

こちらからどうぞ。Windowsのコマンドライン用です。
ビルドはWindows10 x64
gcc version 13.1.0 (x86_64-win32-seh-rev1, Built by MinGW-Builds project)で行いました。


Download ss_unswizzle.zip

Windowsでは挙動が正常ではなかったのでソースを修正

cxxさんの指摘を頂いてまして、ソースを修正したところ
Windowsでのビルドも問題なく動作するようになりました!ありがとうございます!

修正後のソースコード

// gcc -o ss_unswizzle ss_unswizzle.c
// Original Source code https://www.arcade-projects.com/threads/samurai-shodown-v-perfect-on-real-hardware.13565/page-2#post-220216
#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], "rb");
  if(!input) {
    printf("Error: unable to open %s for reading.\n", argv[1]);
    return 1;
  }

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

  output2 = fopen(argv[3], "wb");
  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);
}

修正点について

具体的な変更点はfopenの属性がテキストファイル操作だったのを
明示的にバイナリファイル操作に変更しました。
rをrbにwをwbに変更して、正常動作を確認しています。

gcc入れた環境からコマンドプロンプトで
gcc -o ss_unswizzle ss_unswizzle.cと入れればビルドされます。
exeついてなかったら足してください。

環境導入は下記サイトを参照してください。

しめ

これで手動入力から解放されてバッチで完結できそうです。
過去分はそのままにしておきますが
今後はこっちで変換しようかと思います。(布石

余談としてWordpressのキャッシュプラグインを別の物に変更しました。
サイト表示で頻繁にトラブルが起きていたようなので、改善されるといいのですが。
もし表示できないなどのトラブルが起きましたら、遠慮なくご連絡ください。