captainys / TOWNSEMU

FM Towns Emulator "Tsugaru"
BSD 3-Clause "New" or "Revised" License
238 stars 17 forks source link

Final Blow does not work with multi-bin #39

Closed fuzz6001 closed 2 years ago

fuzz6001 commented 2 years ago

multi-binのイメージで実行するとゲームスタート後の読み込み中にエラーが発生します。 津軽のバージョンはv20210929で、FREQは16, 8, 4で試しました。

2021100911273800

multi-binのcueファイル

FILE "Track 1.bin" BINARY
  TRACK 01 MODE1/2352
    INDEX 01 00:00:00
FILE "Track 2.bin" BINARY
  TRACK 02 AUDIO
    INDEX 00 00:00:00
    INDEX 01 00:02:00
FILE "Track 3.bin" BINARY
  TRACK 03 AUDIO
    INDEX 00 00:00:00
    INDEX 01 00:02:00
FILE "Track 4.bin" BINARY
  TRACK 04 AUDIO
    INDEX 00 00:00:00
    INDEX 01 00:02:00
FILE "Track 5.bin" BINARY
  TRACK 05 AUDIO
    INDEX 00 00:00:00
    INDEX 01 00:02:00

各ファイル情報

左から、トラック番号、サイズ(バイト、セクタ、時間)となっていて、カッコ内は開始時間です。 single-binのcueファイルとも一致しているので問題ないと思います。

Track 1:  10,584,000 =  4,500 = 01:00.00 (00:00:00)
Track 2: 126,302,400 = 53,700 = 11:56.00 (01:00:00)
Track 3:  32,281,200 = 13,725 = 03:03.00 (12:56:00)
Track 4:  29,458,800 = 12,525 = 02:47.00 (15:59:00)
Track 5:  49,744,800 = 21,150 = 04:42.00 (18:46:00)

single-binのcueファイル

finalblow.binは、分割版のbinファイルをcopy /bで連結しました。

FILE "finalblow.bin" BINARY
  TRACK 01 MODE1/2352
    INDEX 01 00:00:00
  TRACK 02 AUDIO
    INDEX 00 01:00:00
    INDEX 01 01:02:00
  TRACK 03 AUDIO
    INDEX 00 12:56:00
    INDEX 01 12:58:00
  TRACK 04 AUDIO
    INDEX 00 15:59:00
    INDEX 01 16:01:00
  TRACK 05 AUDIO
    INDEX 00 18:46:00
    INDEX 01 18:48:00
captainys commented 2 years ago

あ、この現象ですね。ディスクイメージが正しくできているかご確認ください。正しいイメージができている場合、TOWNSのCD-ROM BIOSからTOCを読んだとき、

Track 2 1:04:00 Track 3 13:00:00 Track 4 16:03:00 Track 5 18:50:00

このように返ってきますが、この値が一致しないと上のエラーになります。多分なのですが、PREGAPの2秒をなかったことにするイメージ作成ツールがあるように思います。(なお、僕は手作業でイメージを修正してしまいました。)

fuzz6001 commented 2 years ago

@captainys すみません、検証をミスっていたので大幅に書き換えました。 (コメントも付けていましたが削除しました)

multi-binだとエラーが発生するようです。

captainys commented 2 years ago

PREGAP自体は問題ないのですが、PREGAPに当たるセクタをバイナリに書くものと書かないものがあるような気がしています。これまでわかっているのは、烏賊のタイトルでCDのTOCをチェックしているのですが、同じツールで出したイメージでもばらつきがあるような印象で、ひとつに合わせると別のが動かないという感じだったと思います。

Operation Wolf F-29 Retaliator Rayxanber Advantage Tennis Emerald Dragon Final Blow

大体がちょうど2秒分ずれるんですよね。たしか、PREGAPにもデータを書くことができるはずなので、バイナリはPREGAPを含むべきだと思うのですが、そもそもBIN/CUEフォーマットにはこれが正しいという決まった仕様が無いように思います。ただ、実は正しい仕様がどこかにあって、現状の津軽が正しくない解釈に合わせてしまっている可能性もありますが。

こちらで起動に成功してるのは↓ですね。

FILE "FINALBLOW.BIN" BINARY TRACK 01 MODE1/2352 INDEX 01 00:00:00 TRACK 02 AUDIO PREGAP 00:02:00 INDEX 01 01:00:00 TRACK 03 AUDIO INDEX 01 12:58:00 TRACK 04 AUDIO INDEX 01 16:01:00 TRACK 05 AUDIO INDEX 01 18:48:00

あ、ちなみに、multi-binだとエラーが発生するというのは、CD ERROR!!! CL=01110101B が発生するということでしょうか?

fuzz6001 commented 2 years ago

@captainys

multi-binだとエラーが発生するというのは、CD ERROR!!! CL=01110101B が発生するということでしょうか?

はい、そうです。 私のsingle-binとmulti-binはCDイメージとしては全く同じものなので、multi-binの処理ミスかなと思っています。

大体がちょうど2秒分ずれるんですよね。

標準的なプリギャップは2秒だからですね。ただこれはあくまで標準的な話で実際にはマチマチですが。

たしか、PREGAPにもデータを書くことができるはず

はい、私のTrack 2はデータとしてプリギャップを持っています。

山川機長はTrack 2でPREGAPを使っているので、私のbinよりも352,800バイト小さいでしょうか?(もし同じサイズなら、各トラックが2秒ずつズレているということになりますが‥)

captainys commented 2 years ago

こちらのシングルファイル版のバイナリは 248371200バイトなので一致してますね。たしか、PREGAPはバイナリに書かれていないという前提でdiscimg.cppを書いたような気がします。見ていただくとわかると思うのですが、この部分は、あっちを立てればこっちが立たず、やっと動いたと思ったら今度はAfterburner IIのBGMが2秒ずれてみたり、でかなり苦労の跡があります(^_^;)

ん、ということは、なんとなくわかってきたような。CD ERROR!!! CL=01110101B が出た状態 (単にJMP selfになってる)でブレークして、

DM DS:0

からのダンプの最初の32バイトを取ってみていただくことはできますか? 起動できる場合は、↓

DS:00000000 03 01 05 17 1E 00 80 02 00 01 04 00 0D 00 00 10| DS:00000010 03 00 12 32 00 17 1D 4A 00 00 00 00 00 00 00 00| 2 J

のようになってるはずなのですが、01 04のところが01 02になっているのではないか、という気がしています。

fuzz6001 commented 2 years ago

@captainys

01 02になってます👍

DS:00000000 03 01 05 17 16 00 80 02 00 01 02 00 0C 38 00 0F
DS:00000010 39 00 12 2A 00 17 15 4A 00 00 00 00 00 00 00 00

こちらのシングルファイル版のバイナリは 248371200バイトなので一致してますね。

あ、そうか。PREGAPは山川機長が追加したんでしたよね。 サイズが同じということは、Track 2のプリギャップ部もデータとして存在してそうなので、山川機長のcueを改造するなら、

TRACK 02 AUDIO
  INDEX 01 01:02:00

これで動きそうな気がします。(ただ、全トラックのプリギャップを認識出来ていない状態なので、私のcueを使った方がより良いかと)

コードはぜひ見させていただきます!(After Burnerも持ってます)

captainys commented 2 years ago

おおなるほど!予想では最初のトラックだけ01 02 (01:02:00)で、残りは一致かと思ったら残りも一通りずれてますね。というか、ずれが2秒ずつ増えてますね。それだとやっぱりマルチBINの解釈間違ってるのかな。とりあえず、上のCUEファイルに合うようにこちらのバイナリを分割してみたので、確認してみます。

captainys commented 2 years ago

試しに、上のマルチバイナリに合わせてdiscimg.cpp変更してみました。シングルバイナリには影響ないはず。

fuzz6001 commented 2 years ago

b09cf55c543beb58375d31676ab1c4fe8620b875 の修正で正常に動作することを確認しました。 ありがとうございました。