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)にてその旨お知らせください。

ちょっとはCONFIG.SYSにもこだわってみよう

2010-07-20 19:32:30 | レトロパソコンのお作法
えーと,プレイを予告した「晴れのちおおさわぎ」は半分やりました。
で,ちょっとしたことから,プレイを中断して,フロッピーディスクのブートセクタを大研究中。
そっちは別稿に回すとして,今回は寄り道その1,CONFIG.SYSの内容による空きメモリの分析。

「とことんこだわるCONFIG.SYS NEC MS-DOS6.2対応」(寺口俊伸著・エーアイ出版'95/08/14)で紹介されていた,兵藤嘉彦さんの開発された VMAPを使って,空きメモリをたくさん確保できる効率的な内容のCONFIG.SYSを作りたいと思います。

FILES=30
BUFFERS=10
SHELL=¥COMMAND.COM /P
LASTDRIVE=Q
DEVICE=A:¥DOS¥HIMEM.SYS
DEVICE=A:¥DOS¥EMM386.EXE /P=45 /UMB /T=A:¥DOS¥EXTDSWAP.SYS
DEVICE=A:¥dos¥MOUSE.SYS
DOS=HIGH,UMB

上が従来使っていたCONFIG.SYSの内容。¥マークは本来は半角です。

ツァイ メタ女ハードディスクイメージ起動プロセス検証-fdnp21改の下の方で紹介した要領で,オプションnを付けてVMAPを実行します。
なお,AUTOEXEC.BATにおいてDOSSHELLを起動し,マウスドライバも常駐している状態です。

「とことんこだわるCONFIG.SYS NEC MS-DOS6.2対応」によると,BUFFERSを小さくすると,DOSの起動するまでの時間が遅くなるとのことですが,エミュレータ上では誤差の範囲内でしょうから,気にせずガンガン削ってみましょう。

そんなわけで,私の初期設定,BUFFERS=10から1まで削ったCONFIG.SYSで起動したMS-DOS6.2の空きメモリの検証結果です。単位はいずれもbyte。

BUFFERS 最大実行可能プログラムサイズ config占有メモリbuffers占有メモリ
10 573,664 13,696 10,448
9 574,704 12,656 9,408
8 575,760 11,600 8,352
7 576,800 10,560 7,312
6 580,960 4,272 1,024
5 580,960 4,272 1,024
4 583,088 4,272 1,024
3 583,088 4,272 1,024
2 583,088 4,272 1,024
1 583,088 4,272 1,024


BUFFERSの値が5また6では最大実行可能プログラムサイズが少し小さくなり,BUFFERSの値が7以上では最大実行可能プログラムサイズがさらに小さくなり,その後は,BUFFERSの値が大きくなるに連れてさらに最大実行可能プログラムサイズが小さくなっていることが分かります。
下のグラフは,BUFFERSの値と最大実行可能プログラムサイズとを対比したものです。Y軸の基準は560KBで,1目盛り1KBです。


下のグラフは,CONGIG.SYSの記述内容がコンベンショナル・メモリ中に占めるbyte数と,その中でBUFFERSの占めるbyte数を対比したもの。
BUFFERSの値が7以上になると消費メモリが激増するのは,CONGIG.SYSの内容がHMAメモリに収まらず,コンベンショナル・メモリを食い潰し始めるからだそうです。


どうやら,私のシステムでは,BUFFERS=4と記述するのが正解のようです。

さらに,「とことんこだわるCONFIG.SYS NEC MS-DOS6.2対応」によると,特に記述しないと値が4に設定されるFCBSも1で足りるとのこと。
そこで,FCBS=1にすると,

FCBS 最大実行可能プログラムサイズ config占有メモリfcbs占有メモリ
1 583,264 4,096 80

となります。

さらにDOSSHELLを終了してマウスのメモリも解放すると,最大実行可能プログラムサイズは,605,120byteまで増加します。

以上,おさらいすると
BUFFERS=10 573,664
BUFFERS=4583,088
FCBS=1 583,264
DOSSHELL終了605,120
こんな感じ。

上げ底グラフではこんな感じ。


結論として,自分のシステムでは,CONFIG.SYSを

FILES=30
FCBS=1
BUFFERS=4
SHELL=¥COMMAND.COM /P
LASTDRIVE=Q
DEVICE=A:¥DOS¥HIMEM.SYS
DEVICE=A:¥DOS¥EMM386.EXE /P=45 /UMB /T=A:¥DOS¥EXTDSWAP.SYS
DEVICE=A:¥dos¥MOUSE.SYS
DOS=HIGH,UMB

として,AUTOEXEC.BATではDOSSHELLを使わない設定にするのがよさそうです。

なお,ツァイ メタ女ハードディスクイメージ起動プロセス検証-fdnp21改内で検討したCONFIG.SYSにおいては,BUFFERSの値を小さくしても空きメモリの増大は認められませんでした。

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

ツァイ メタ女ハードディスクイメージ起動プロセス検証-fdnp21改(追記あり)

2010-07-10 00:47:00 | 使ってみようエミュレータ
当ブログ中,最大の集客力を誇る記事は,「使ってみようエミュレータ」カテゴリの
エミュで闘神都市2をプレイしてみよう(その1・エミュレータ導入編)
エミュで闘神都市2をプレイしてみよう(その2・MS-DOS導入準備編)
エミュで闘神都市2をプレイしてみよう(その3・MS-DOSインストール編)
エミュで闘神都市2をプレイしてみよう(その4・最終回)
エミュで闘神都市2をプレイしてみよう(特別編・freeDOS(98)ってどうよ)
です。多分。

で,特別編では,MS-DOSなしで闘神都市2をプレイするために,freeDOS(98)導入済みのHDイメージ(起動可能状態)として,天文部南西支部のページで提供されている,「ツァイ メタ女」のHDイメージを利用させていただいています。

ただ,このイメージ,起動時に明らかにエラーメッセージを吐いている気がするので,確認してみます。

NP21に「ツァイ メタ女」のハードディスクイメージをセットして,起動します。
なお,起動プロセス確認のため,CONFIG.SYSの「DEVICE=・・・」の行をすべて「DEVICE?=・・・」と変更して,ロードするかどうかを起動時に確認する処理を施してあります。

すべてのDEVICEをロードさせながら起動すると,以下の画面のようになります(一覧性を優先して,連続する複数の画面を合成しています)。

ツァイ メタ女 起動プロセス

CONFIG.SYSのプロセス毎に黄色い線で区切りを入れるとともに,黄色文字でメッセージの大まかな意味を書き加えました。

第1プロセス CONFIG.SYSより手前部分
第2プロセス NP2HMA.SYSをロード(成功)
第3プロセス NP2EMS.SYSをロード(成功)
第4プロセス FDXMS.SYSをロード(失敗)
第5プロセス EMM386.EXEをロード(失敗)

ご覧のとおり,FDXMS.SYSとEMM386.EXEはロードできていません。

ゲームをプレイする上では支障はないのですが,起動の度に,エラーが出るのは美しくありません。
エラーが出ないように修正できるでしょうか。

FDXMS.SYSのロードに失敗した理由は,「XMS is already insalled.」とのことです。
既にロードされていたNP2HMA.SYSとNP2EMS.SYSがFDXMS.SYSとバッティングしているようです。

今度は,NP2HMA.SYSとNP2EMS.SYSをロードせずに,FDXMS.SYSとEMM386.EXEをロードしてみます。



意外にも,FDXMS.SYSとEMM386.EXEの組み合わせもロードできるようです。

では,NP2HMA.SYS+NP2EMS.SYSと,FDXMS.SYS+EMM386.EXEの拡張メモリマネージャセットのどちらが多く空きメモリを確保してくれるのでしょうか。

エミュで闘神都市2をプレイしてみよう(特別編・freeDOS(98)ってどうよ)で作ったfdnp21.hdiを改良して空きメモリを確認してみます。



空きメモリを確認するために,CONFIG.SYSを修正します。
DiskExplore 上のHDイメージからCONFIG.SYSをドラッグアンドドロップでよそに引っ張り出すか,ファイル-取出して保存 で,Windows上で編集しましょう。
メモ帳か,日ごろからお使いのエディタソフトで良いでしょう。

内容は以下のとおり。
files=20
buffers=10
device?=np2hma.sys
device?=np2ems.sys
device?=fdxms.sys
device?=emm386.exe
shell=command.com
dos=high

NP2HMA.SYSとNP2EMS.SYSとをロードして,COMMAND.COM内のMEMORYコマンドで空きメモリを確認します。



次に,FDXMS.SYSとEMM386.EXEとをロードして,COMMAND.COM内のMEMORYコマンドで空きメモリを確認するつもりが・・・。



エラーウィンドウが出て,NP21が異常終了してしまいました。

念のため,「ツァイ メタ女」と同様に,NP2HMA.SYS,NP2EMS.SYS,FDXMS.SYS,EMM386.EXEを全部ロードして,空きメモリを確認しましたが,NP2HMA.SYSとNP2EMS.SYSだけをロードした場合と変わりありませんでした。そりゃそうですよね,FDXMS.SYSとEMM386.EXEはどうせロードされないんですから。

結局,freeDOS(98)用の拡張メモリマネージャとしては,NP2HMA.SYSとNP2EMS.SYSだけで十分というわけです。

などと,分かったようなことを書きましたが,私の能力では,MEMORYコマンドで表示されてる内容がさっぱり分かりません。
追記・MEMORYコマンドは,COMMAND.COMの内部メモリの状況を示すもので空きメモリとは関係ない(-_-;)

今回の記事を書くのに,「とことんこだわるCONFIG.SYS NEC MS-DOS6.2対応」(寺口俊伸著・エーアイ出版'95/08/14)を読んでいたところ,兵藤嘉彦さんの開発された VMAPが紹介されており,平易なメモリマップ分析ができることが分かりましたので,こちらを使ってみます。

まず,DiskExplorerを用いてハードディスクイメージにこのVMAP.COMをコピーします。

次に,CONFIG.SYSの内容を,
files=20
buffers=10
device?=np2hma.sys
device?=np2ems.sys
shell=command.com
dos=high
と改めます。
NP2HMA.SYSとNP2EMS.SYSのdevice=に?を付けているのは,これらを使用しない場合と使用時の違いを見比べるためです。
正確を期するため,VMAPはオプションnを付けて実行しました。

まず,NP2HMA.SYSとNP2EMS.SYSを使用しない場合のメモリマップです。


これに対して,NP2HMA.SYSとNP2EMS.SYSを使用した場合のメモリマップです。


メモリマネージャを使用した方の下の画面では,コンベンショナル・メモリに加えて,EMSメモリ,XMSメモリの中身も示されています。

いわゆる空きメモリというのは,(多分)コンベンショナル・メモリ中の連続した空きエリアのことなので,それぞれ
NP2HMA.SYSとNP2EMS.SYSを使用しない場合 476768 Byte(約466KB)
NP2HMA.SYSとNP2EMS.SYSを使用した場合   544320 Byte(約532KB)
の空きメモリがあることになります。
この差は,後者においては,メモリマネージャに加えて,CONFIG.SYSに記述した
DOS=HIGH
によって,DOSシステムのうち63KB分が,HMAメモリに組み込まれた結果です。
これは,後者にのみ表示されている
「----- XMS ver2.00 -----
 HMA used: 63 KB by DOS」
から読み取れることです。

コンベンショナル・メモリは,いわゆるメインメモリで640KBしかなく,増設できない種類のメモリですから,今となっては顕微鏡単位にしか見えない63KBの解放といえども,大きな意味を持つわけです。

以上をまとめると,拡張メモリマネージャNP2HMA.SYSとNP2EMS.SYSは使用すべきだし,かつ,それで足りるので,fdnp21.hdiのCONFIG.SYSとしておすすめする内容は,
files=20
buffers=10
device=np2hma.sys
device=np2ems.sys
shell=command.com
dos=high

また,ハードディスクイメージからはFDXMS.SYSとEMM386.EXEを削除してよい。

「ツァイ メタ女」のCONFIG.SYSも,
files=20
buffers=10
device=np2hma.sys
device=np2ems.sys
device=fdxms.sys
device=emm386.exe

shell=zai.exe
dos=high
とするのが正解くさい。

もっとも,今回,「ツァイ メタ女」をプレイしようとしてみたら,元々のハードディスクイメージでも,改訂したものでも,メーカーロゴ後早々にフリーズしてしまったので,正解も何も確認できませんでした・・・。

今回の分析は,エミュで闘神都市2をプレイしてみよう(特別編・freeDOS(98)ってどうよ)の記事内にも反映させておきます。

2012/06/29追記
2012/06/29にもやしさんからいただいたコメントで,「Xnp2」の製作者の方がXnp2で公開されている「動作確認用バイナリ お察し下さい for Win32」上で,fdxms.sysとemm386.exeが動作するとの情報をいただき,確認できましたので,メモリマップを掲載しておきます。

fdxms.sysとemm386.exeを使用した場合のメモリマップがこちら。


これにより,空きメモリについて,
NP2HMA.SYSとNP2EMS.SYS等を使用しない場合 476768 Byte(約466KB)
NP2HMA.SYSとNP2EMS.SYSを使用した場合   544320 Byte(約532KB)
FDXMS.SYSとEMM386.EXEを使用した場合   610832 Byte(約597KB)
という結果が得られましたので,Xnp2の「動作確認用バイナリ お察し下さい for Win32」を使う場合のCONFIG.SYSとしては,
files=20
buffers=10
device=np2hma.sys
device=np2ems.sys

device=fdxms.sys
device=emm386.exe
shell=command.com
(または)zai.exe
dos=high
とするのがおすすめということになります。

fdxms.sysとemm386.exeが使用可能となったことで,初めて「ツァイ メタ女」の起動に成功しました。
もやしさん,情報ありがとうございました。

けど,朗読する女の人の声が,途中からかなりノイズまみれになるんだよなあ。何でだろ?
(追記終了)

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