さて,「晴れのちおおさわぎ」クリア前の寄り道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の実物を見ましょう。
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桁の数字表記がダンプ画面と違うことに気付いた方はちょっとえらい。
興味があれば「リトルエンディアン」で検索。
これで,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)にてその旨お知らせください。
実は,このゲームの中盤で,主人公がテニスをやってみるシーンがあるんですが,タイミングよく打ち返すと,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-x | 0-(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 ID | 0FEh=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)にてその旨お知らせください。