mameでゲームを起動しようとすると、チェックサムの異常とか、CRCが一致しません。と言われて、受け付けてもらえないときがあります。
例えば、ギャラクシーファイト ユニバーサル・ウォリアーズの時。
所有しているゲームには居られません。不可のマーク付き。
ROMを監査します。
で、こんな画面がでます。
ゲームを実行しようとすると・・・・
これは、エラーがでるけれども、起動はできるという、時々ある、少し珍しいタイプのROMなのですが・・・・・
大抵はこうはいかないわけで・・・・
・・・・・・で、
galaxyfg : sm1.sm1 131072 バイト チェックサムの異常: | |||||
正常な物: |
CRC(97cf998b) | SHA1(977387a7c76ef9b21d0b01fa69830e949a9a9626) | |||
見つかった物: |
CRC(94416d67) | SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) | |||
これは何なのか?・・・・・・ということなのです。
これは、ハッシュ関数 です。
ハッシュ関数とは、中に何でも入れると、数字が飛び出してくる魔法の箱です。
出てくる数は入れたものに対応していて、違うものを入れて同じ数字が飛び出すことは決してありません。
こんな感じで、・・・・。
例によって、NEOGEOのBIOSの場合。
そこで、(コンピュータの中の)ファイルが完全に一致しているかどうか調べる為に、ハッシュ関数を使います。
ちょっとでも違うと全く違う数が飛び出します。
ハッシュ関数の代表的なものが、CRC,MD5,SH1の3つです。
それで、今回、sm1.sm1ファイルをCRCとSH1(ともに、ハッシュ関数)に代入して得た値が一致しなかった・・・・と、いうことで、
よって、所有している sm1.sm1 ファイルは正しくない。 |
そこで、どこからか、正しいsm1.sm1ファイルを探してこなければなりません。
まず、ハッシュ関数を計算するソフトを用意します。
ここでは、HashMyFiles (v1.67) を使います。
http://www.nirsoft.net/utils/hash_my_files.html
ダウンロード出来るところはかなり下の方にあります。
日本語化もできます。
大体、こんな感じです。
このソフトは一度に沢山のファイルのハッシュ関数を計算でき、一致したものは同じ色で塗り分けてくれるので結果が一目瞭然となり、分かりやすいのです。
NEOGEOのBIOSはWeb上に幾つか流れているのですが、私は、出所を思い出せないもう1つのneogeo.zipを持っています。
そこに、正しいsm1.sm1が入っているかもしれません。
現在、sm1.sm1ファイルは以下の場所にあるのですが、(NEOGEOのBIOSの1つとして、neogeo.zipに格納されているのですが)
その中のこれは正しくありませんでした。
ここにある、sm1.sm1ファイルが正しいのではないのかな・・・・と・・・・
HashMyFilesの使い方の説明を兼ねて、両方のBIOS全部のハッシュ関数値を調べます。
2つのneogeo.zipを解凍して、そのハッシュ関数への代入値を比較します。
HasnMyFilesへ、両者ドラッグ&ドロップ
すると・・・・・この様に色分けされます。
例えばCRC32の項目をクリックすると、CRC32の値の順にならび、同じ数値のものが、同じ色で固まります。
同じものと違うものが、一目瞭然となる。
sm1.sm1のハッシュ関数値を正常なものと比較します。
正常な物: |
CRC(97cf998b) | SHA1(977387a7c76ef9b21d0b01fa69830e949a9a9626) |
で、結局、sm1.sm1はどちらも正しくなかった・・・・・
仕方ないので、ゲームROMから抽出します。(☆たまたまsm1.sm1のあったやつから)
まず、HasnMyFilesの計算結果を消去します。
オプションの右クリック」メニューに HashMyFiles を追加にチェック。
Fatal Fury(餓狼伝説):fatfury1.zip を解凍します。
で、右クリックから、計算します。
計算結果
sm1.sm1のハッシュ関数値を正常なものと比較します。
正常な物: |
CRC(97cf998b) | SHA1(977387a7c76ef9b21d0b01fa69830e949a9a9626) |
今回は正しいです。
解凍したNEOGEOのBIOSのフォルダの中のsm1.sm1ファイルを正しいものと交換して圧縮します。
上書きして、正しいものと交換します。
neogeo.zip に圧縮します。
そして、元の場所にもどします。
ちゃんと認識するようになりました。
おまけ。
●ハッシュ関数も理論上は絶対に違う値がでるのだけれども実際はそうでなくて、・・・
たまたま、ハッシュ関数の一致する確率。
16進法が使われているので、
CRC32 16の8乗
SH1 16の40乗
これは、殆ど0に近いですね。
で、ファイルの一部をいじってハッシュ関数値を改竄することをいかに防止するのかが、問題の1つなのです。
●関数は、昔は、函数とかきました。
函は、箱という意味。函館の、「はこ」です。
なぜなら、箱に入れると何か別の値が飛び出してくる。それが元々の函数の概念なのです。
後、支那語で、「函数」が 「function」 そっくりの発音になるようです。