VitaでZAVASやりたくて(6)
このへんからは殆ど思い出せずに再検証しながらなのですごくペースダウンします。
さて前回はZAVASのゲームディスクにはどうやらプロテクトがかかっているぞという推測をしたのでした。
何を根拠にそう推測できるのかというと、エラーセクタのデータにある特徴が見られるためです。
今回はそれについてまとめておきます。
激しくややこしいので今回は完全に自分用の備忘録。
まず読めたデータを眺めると次の点に気が付く。
ZAVASのフロッピーは2D形式。基本は1トラック0x1000バイト(標準的には256バイトが16セクタ)だが、ZAVASではちょっと長めのセクタを使って1トラック0x1400バイト記録されている。(吸出し時のログからわかる)
問題のトラックはそれ以上の0x1800バイト読もうとして失敗している。最後らへんのセクタだけ毎回おかしい。さすがに1トラックにそんなに記録できるはずがないので、トラックを1周して(周回して)トラックの境界をまたいだおかしなデータを読んでいる状態のはず。
エラーセクタは毎回読めるデータが変わる。ただしデータの規則性については保っているように見える。(同じデータが連続する等)
上記から推測されるのは、エラーセクタは意図的にエラーになるよう細工されていて、読めるデータが変わるのは毎回少しだけ読める位置がずれているためではないか?
それを確認するにはいくつか勉強が必要。
理解に必要なお勉強
フロッピーディスクの物理フォーマット
プリアンブルなどの制御用信号やMFM方式でどのようなビット列が記録されるか等の理解が重要になる。
同期がとれずにビットずれが起こるとどう読めるか
d88形式のフォーマットについて
勉強が終わったら次へ。
実際に読めたデータ
エラーセクタの一つはこうなっている。
左が1回目に読めたもの右が2回目に読めたもの。(青字部分は相違点)
赤枠はセクタヘッダで、ステータスは「B0(データCRCエラー)」。
変なのが読めてCRCが合わずにエラーになってるという事。
セクタ番号も「F7」とかなってて明らかに変だが、「F7」自体はちゃんと読めた数値のはずなのでここは意図的に変な値を入れているはず。
先に述べた通り、ここで読めたデータはトラックの境界をまたいで次のセクタの微妙な情報が読まれたものと推測される。
データを観察すると途中SYNCと思われる12個の(ほぼ)同じ数値の並びが見て取れる。
(少し上にもそれらしいのがあるが数が微妙に違ってSYNCかどうか判然としないのでひとまず無視)
黄色枠で囲んだところはアドレスマークのように思える。
2つあるがどちらも先頭から3バイトは同じ数値になっているので、プリアンブルの「C2 C2 C2 FC」ではなく、IDフィールドの「A1 A1 A1 FE」とデータフィールドの「A1 A1 A1 FB」が化けたものだと推測される。
つまり、ここには正しいアドレスマークが記録されているが、ビットずれを起こして「86 86 87 F8」のように化けているのではないか?ということ。
検証してみよう。
「A1 A1 A1 FE」はMFM方式では次のように記録される。(「A1」に関してはミッシングクロックと呼ばれる特殊加工がある点に注意する)
これがビットずれを起こすとどう読めるか試してみると、
ここまでの結果を見ると、黄色枠はアドレスマークが化けて読めていると考えてまず間違いないものと思われる。
1回目に読めたデータは正常なデータの6ビット目から読めたものと考えて良さそうなので、読めたデータの後続部分もクロックビット(奇数ビット)ではなくてデータビット(偶数ビット)が読めているはずである。これを踏まえてもう少し復元してみる。
上記の検証から、当初の推測通りトラックを1周する形でおかしなデータが読まれている事はほぼ間違いなかろう。
毎回違ったデータが読めるのは、本来なら読めたデータに対応するはずのSYNC(化けていたアドレスマークの手前にある)が無視されて(SYNCの役割ではなく単なるデータの一部として読まれて)、その付近でのデータの位置決めが不安定になるためだと考えられる。
というわけで、ZAVASでは恐らくこれを利用したプロテクトをかけているものと思われるのだが、はてさてどうやって調べたものか。
俺たちのプロテクトをめぐる冒険の旅まだ始まったばかりだ!(つづく)
(例によって全然覚えてないので次はだいぶ時間かかる予定)
この記事が気に入ったらサポートをしてみませんか?