MANIMANIAのレトロエロゲーカウントダウン

人生の残り時間が半分を切ったというのに若き日に目にしたエロゲーに魂を引かれ続けるイタいおっさんがこなしたゲームを紹介。

フロッピーディスクのブートセクタ分析

2010-07-28 15:08:53 | レトロパソコンのお作法
さて,「晴れのちおおさわぎ」クリア前の寄り道2です。

実は,このゲームの中盤で,主人公がテニスをやってみるシーンがあるんですが,タイミングよく打ち返すと,HCGが見られます。
確認できたCGは4枚なんですが,このどれが見られるかはどうもランダムくさい。
ランダムなのは構わないんだけど,何せ中盤なので,見逃しがあるとここまで戻ってリプレイってのが面倒でならない。

そこで,DiskExplorerで中身を見ようと思ってイメージファイルを開こうとしても,下のようにエラーが出る始末。



とりあえず,Manual FDモードで,


手動設定ディスクに入れるべき数値を入力して,中身が閲覧できるように,フロッピーディスクの記録方式を研究するのが今回の記事の目的です。




フロッピーディスクの記録方式を勉強しようとすると,必ず解説されるのが,C,H,R,N。

C Cylinder Address シリンダ番号(0-xx),最外周(シリンダ0)から最内周(シリンダxx)までの同心円状の記録帯を指します。文献によってはトラック番号とも表記されます。


H Head Address ヘッド番号(0,1),サーフェス番号とも呼ばれる。ラベルを貼る面の裏側が0,ラベルを貼る面が1。


R Record Address セクタ番号(1-xx),トラックをピザ状に切り分けた各セクタに付される番号。下の図では8分割にしてますが,9分割や18分割の場合もあります。ここは,ピザをどのサイズで切るかの話なので,ある程度融通が利きます。コンピュータの世界にしては珍しく,開始番号が0でないことに注意。



N Record Length 1セクタあたりのバイト数 2の(N+7)乗によって求められます。

これらC,H,R,NはPC-88時代においては,コピープロテクトとしてそれなりに意味を持っていたようですが(HSDL:PC88フロッピーディスクのプロテクトを参照しました),PC-98時代ではCD,1Bサーチによるプロテクトチェック回避の手法が主流となったため,あんまりこだわって覚える必要はないかもしれません。



本稿では,ヘッド表裏+シリンダ番号で特定される片面の円状記録帯を,以下のようにトラック番号を付けて特定します。
ヘッド番号 シリンダ番号 トラック番号セクタ番号論理セクタ番号
0 0(最外周) 0 1-x0-(x-1)
1 0(最外周) 1 ・・・・・・
0 1(最外周から1本中心寄り) 2 ・・・・・・
1 1(最外周から1本中心寄り) 3 ・・・・・・
0 2(最外周から2本中心寄り) 4 ・・・・・・
・・・・・・・・・・・・・・・


この裏面の最外周シリンダであるトラック0には,システムを起動するためのブートプログラムが書き込まれており,システム予約領域,またはブートセクタと呼ばれます。

早速,トラック0の実物を見ましょう。
MS-DOS6.2のシステムを転送した空きフロッピーディスクのトラック0をデバッガで読み出します。
MS-DOS3.x以降では拡張機能セットにのみ含まれているSYMDEB.EXEを用いました。
LコマンドはLoad,DコマンドはDumpです。





では,トラック0のブートセクタはどのようになっているでしょうか。
ダンプ画面の主要部分の下に,ブートセクタの構造解説図を付けました。





ブートセクタのうち,0Bh~17hを構成するBPB(Bios Parameter Block)には,デバイスの物理的なパラメータとデバイスの他の領域の位置と大きさが記録されています。
図中に黄色で着色しました。


DOS6.2のシステムを含む空きディスクのBPBからは,次のことが分かります(トラックあたりセクタ数はBPB外ですが)。
4桁の数字表記がダンプ画面と違うことに気付いた方はちょっとえらい。
興味があれば「リトルエンディアン」で検索。

セクタあたりのバイト数 (セクタ長)0400h=4*256=1024byte
クラスタあたりのセクタ数01h=1
予約セクタ(ブートセクタ)数0001h=1
FATの数02h=2
ルートディレクトリエントリの最大エントリ数00C0h=16*12=192
ディスクのセクタ総数04D0h=4*256+16*13=1232
メディア記述子(メディアディスクリプタバイト)=FAT ID0FEh=3.5/5"2HD,8"2D
FATあたりのセクタ数0002h=2
トラックあたりのセクタ数0008h=8


これで,FAT領域の先頭の論理セクタ番号が分かりました。
システムの予約セクタが1でしたから,トラック0のセクタ1(論理セクタ番号0)から1領域ずれて,トラック0のセクタ2(論理セクタ番号1)です。

また,ディレクトリ領域(ルートディレクトリを格納する領域)の先頭の論理セクタ番号は,FAT1つで2セクタを使用し,FATが2つありますから,FAT領域は合計4セクタを使用することになります。
FATが論理セクタ番号1からと,論理セクタ番号3からそれぞれ2セクタが使用されましたから,ディレクトリ領域の先頭の論理セクタ番号は5です。

さらに,ディレクトリ領域は,ディレクトリ数*32/セクタサイズですから,
192*32/1024=6セクタを使用し,トラック0の6,7,8セクタ(論理セクタ番号5,6,7)と,トラック1の1,2,3セクタ(論理セクタ番号8,9,0Ah)を使用しますから,データ領域の先頭の論理セクタ番号は0Bhとなります。

デバッガで,各領域の開始位置である論理セクタ番号のデータをロードして,論理セクタ番号を正確に算出できているかを確認します。

FAT(1) FAT領域は,FAT IDに続けて,FFが2つ続く決まりなので,間違いなさそうです。


FAT(2) FAT(1)と同じ内容です。


ディレクトリ領域


データ領域


どの領域もそれっぽい内容となっており,論理セクタ番号の算出には間違いがなさそうです。

ディスクの実物上の位置関係に割り付けると,下図のようになります。
 



では,これらディスク情報に基づいて,MS-DOS6.2のシステムを転送した空きフロッピーディスクをDiskExplorerで開いてみましょう。



「FATの位置」は,「予約セクタ(ブートセクタ)数」(ウ)である1を,「セクタあたりのバイト数 (セクタ長)」(ア)である1024byteに乗じて算出しました。
「FATの数」(エ)は,2です。
「FATサイズ」は,FATあたりのセクタ数(ク)である2を,「セクタあたりのバイト数 (セクタ長)」(ア)である1024byteに乗じて算出しました。
「ルートの位置」は,予約セクタ1024byte+FAT(2048byte)*2=5120byteとなります。
「データ領域の位置」は,予約セクタ(1セクタ)+FAT領域(4セクタ」+ディレクトリ領域(6セクタ)の計11セクタ,11*1024byteの位置にありますから,11264byteとなります。
「クラスタサイズ」は,1クラスタあたり1セクタで(イ),1セクタあたり1024byteですから,1024byteとなります。
「総クラスタ数」には,「ディスクのセクタ総数」(カ)から,予約セクタ(1セクタ)+FAT領域(4セクタ」+ディレクトリ領域(6セクタ)の計11セクタデータを減じたクラスタ数である,1232-11=1221を入力しました。



空き領域が641,024byteって・・・。こりゃ作戦失敗です。
その後,ここには書かない長い苦闘を経て,思い出しました。
イメージファイルを作成したツールであるMAKE_HD.EXEを含むP88SRを作成されたぶるー牧場さんのホームページには,MAKE_HD.EXEで作成したディスクイメージのファイル構成が技術情報として公開されていたのです。
そして,分かりました。このイメージにはヘッダーが付いているので,トラック0のダンプ画面と見比べてもらえば分かるとおり,ディスクイメージの本体は,2C0hから始まっているわけです。



そこで,DiskExplorerの開始位置として,2C0h=704を指定してみます。


せっかくなので,自動読み込みをクリックしてみます。


ちぇっ,何だよ。フロッピーディスクのブートセクタなんて勉強しなくても数値が埋まってるよ(>_<)



空き容量からいってどうやら無事に開けたようです。

ちなみに,目的であった「晴れのちおおさわぎ」のディスクですが,開始位置704を設定して,自動読み込みをして開いてみましたが,何のファイルも表示されませんでした。空ディスクよりははるかに空き容量は少なくなってましたが。
ファイル上の属性変更もしてみましたが,変わらず。

ま,ユーザースキルレベルの今よりはるかに高かった時代のソフトが,そう簡単に中身を見せてくれるわけもないか。

参考文献
「応用MS-DOS 改訂新版 アスキーラーニングシステム③応用コース」(村瀬康治著・89/12/31・株式会社アスキー発行),
「MS‐DOSエンサイクロペディア Volume1 システム解説編」(マイクロソフトプレス編・翻訳/監修エー・ピー・ラボ・89/03/11・株式会社アスキー発行)

ほんとはこの機会にFATの読み方とかも勉強すべきなんだろうけど,とりあえずは必要ないから,またの機会に。

追記・FAT領域にも,データ領域にも欠落のないイメージデータがあるということは,FATに書かれたファイルの切り出しはできるわけで,DiskExplorerを用いたデータ閲覧に限らなければ,意外と簡単にディスク内データが閲覧できそう・・・。

<<著作権に関して>>
本記事に引用している全てのソフトの名称・画像の著作権・その他権利は、制作、販売されたソフトハウス、メーカー、または作者様に帰属します。本サイトでの上記著作権物扱いは、著作権など各権利関係を侵害することが目的ではありません。問題などある場合は、メール(gekigangarあっとmail.goo.ne.jp)にてその旨お知らせください。


最新の画像もっと見る

7 コメント

コメント日が  古い順  |   新しい順
DiskExplorerではD88は開けない (かかっくん)
2011-01-14 03:26:47
はじめまして

もっと基礎的な問題ですが、DiskExplorerではD88は(D77も)開けません。
Virtual Floppy Image Converter(VFIC)でBKDSKフォーマットかXDFフォーマットに変換してから開いてみて下さい。
自動読み込みでパラメータが入った場合はこれだけで読めると思います。
返信する
えーーーーっ!! (MANIMANIA)
2011-01-17 11:35:16
かかっくん 様
こちらもコメントありがとうございます。

>もっと基礎的な問題ですが、DiskExplorerではD88は(D77も)開けません。

そうなんですか!?!?!?
ちょっと寝込みそうなくらいショックです。
そんなことも知らずにエミュ使いをしておったとわ・・・。

こちらのコメントも勉強になりましたm(_ _)m
返信する
ファイルを取り出すだけなら (かかっくん)
2011-01-18 03:23:07
レスありがとうございます。

ディスクイメージからファイルを取り出すだけなら、プロテクト情報とかは消えても
問題ないので、DOS標準フォーマットに変換してベタイメージ(BKDSK/XDF)にして
しまっても問題ありません。
あと、FDへの書き出しのところに実機でMOGREFを使っていましたが、MOGREFはXP上の
DOS窓(command.com)でも動きますし、D88→MAHALITOはVFICでも変換できます。
お試しあれ
返信する
補足 (かかっくん)
2011-01-18 04:05:30
補足です。D88やMAHALITOはDOS以外にも様々なフォーマット(DISKBASICや256/26 IBM
フォーマットなど)にも対応しているので、様々な情報が記録されているオールマイ
ティに近いものとなっています(GAP情報やミッシングクロックなどは記録されない
ので完全ではない)。
そのためトラック毎にセクタサイズやセクタ数が異なるフォーマットや、1トラック
内にサイズの異なるセクタを混在するフォーマットの再現等も可能です(前者は
両方、後者はD88)
(DOSフォーマットの変形を採用する事が多くなる前は、このようなフォーマットの
ゲームもありました。ツールを使わないとこのような部分で引っかかるわけです。
ビジネスソフトは、見かけ上はDISKBASICやDOSの標準フォーマットのように見える
ディスクでした。当時の一太郎とか凝ったプロテクトでした)

対してDiskExplorerは、DOS(MS-DOS/MSX-DOS)/WindowsおよびHuman68k用のイメージに
対してアクセスするためのものなので対応しないのでしょう。
下手にアクセスしてイメージがいかれても困るので。
FDIはアクセスできます。

例えば、自動読み込みでパラメータが入ったからと、このDOS62.D88に対してファ
イルを書き込んでエミュレータで読ませてみると、もはや使い物にならないイメー
ジになってしまっています(実験はバックアップしてから)。

というわけで、D88はいったんベタイメージに変換してからアクセスしましょう。
ちなみに、↑のようなフォーマットはBKDSKやXDFに変換できないようになっています。
返信する
ありがとうございました (MANIMANIA)
2011-01-24 21:09:30
かかっくん 様

追加コメントありがとうございます。
早速(というほど早くないですが),ファイル形式を変換して,DiskExplorerを使ってみました。

・・・読めました。
せっかくなので新記事ネタに使わせていただきました。
ありがとうございました。ほんとに。
返信する
訂正 (かかっくん)
2011-04-12 23:05:22
すいません。MAHALITOはトラック内にセクタ長の異なるセクタを
混在できないとしましたが、正しくはMFMとFMの混在が不可でした。
セクタ長混在はMAHALITOでもできました。

セクタ長混在はPC-88ではよく利用されていたようです。
セクタ長256バイトでないと起動しなかったからのようです。
2HDのトラック0(シリンダ0・0面)が128バイト・FMなのは
不明ですが。

PC-88の場合、FDDの設計はPC-80の頃のままですから、
返信する
続き (かかっくん)
2011-04-12 23:36:40
(続き)
PC-88の場合、FDDの設計はPC-8001の頃のままですから、
DiskBASICのことだけしか考慮していなかったのかも知れません。

ソフトによっては、トラック0全体が256バイト・16セクタの
フォーマットのものもあります。


すいません。途中でした
返信する

コメントを投稿