MSXエミュレータでは、エミュレータを動作させるマシンのOSとフロッピーディスクの間でのファイルシステムの違いや媒体の違い、ディスクアクセスの高速化の為にしばしばディスクイメージというものが使われます。
本ページでは、ディスクイメージの形式について書くことでエミュレータやディスクイメージ作成プログラムの作者が共通性のあるディスクイメージを扱えるようにするためディスクイメージの形式について書きます。
fMSX等のMSXエミュレータで使われる拡張子.DSKのディスクイメージはセクタ0から最終セクタまでのセクタの内容を読みこんで、1つのファイルにセクタの順に書き出していっただけのフォーマットです。
このため、実際のプログラムではフロッピーディスクのセクタをセクタ番号順に読み出してこれを逐次書き出す処理を最終セクタまで行えばOKです。
ディスクイメージの内容を図示すると次のようになります。
+0 - +511 | セクタ0の内容 |
+512 - +1023 | セクタ1の内容 |
ちなみに、このフォーマットはMEGA-SCSIの仮想FDモード用のディスクイメージファイルの形式とも共通です。
MSXエミュレータによってはエミュレータ上で動作しているディスクカーネルプログラムがセクタを読み出す際にディスクイメージ内の物理エラーエミュレーション情報を検知して、エラー情報を発見するとエミュレータ上で動作しているディスクカーネルに対して物理エラーが起こったという情報を返してフロッピーディスクの物理エラーのエミュレーションをディスクイメージで行うシステムがあります。
こうしたディスクイメージでの物理エラーエミュレーションにはディスクイメージ作成プログラムとMSXエミュレータの両方が同じ形式の物理エラーエミュレーション情報をサポートする方法があります。
本章では、この物理エラーエミュレーション情報の形式について説明します。
物理エミュレーション情報をディスクイメージに書きこむには、まずフロッピーディスクへのセクタアクセスで物理エラーの情報を得ることが必要です。
MSXではPHYDIOやMSX-DOS1のエラーハンドラを使うことで物理エラー情報を得ることができます。
他のマシン・OSの場合は物理エラー情報を必要に応じて解釈する必要があります。
物理エラー情報が得られたら後はそれをディスクイメージに書きこむだけですが、対応させたいMSXエミュレータによって形式が違うので、対応する形式に合わせた物理エラーエミュレーション情報を書きこむ必要があります。
次では、現存するMSXエミュレータの物理エラーエミュレーション情報形式について説明します。
fMSX98/ATでは物理エラーの情報をディスクイメージファイルのエラーが起こったセクタに相当する位置の先頭に文字列"_ErrSec_"を書きこみ、次の1バイトにPHYDIOやMSX-DOS1のエラーハンドラのエラーコードを書きこみます。
MSXSOではディスクイメージのファイル名に拡張子.DDSを付加したディスクのセクタ数と同じファイルサイズのファイルを物理エラーエミュレーション情報ファイルとして扱います。
MSXSOフォーマットでは、n番セクタの物理エラーエミュレーション情報は物理エラーエミュレーション情報ファイルのnバイト目の1バイトにあります。
読みこんだ値が0FHの場合は物理エラーが起こらなかったということになります。
そうでない場合は、PHYDIOやMSX-DOS1のエラーハンドラのエラーコードと同じ値となります。
これを図示したのが次の表になります。
オフセット | 内容 |
---|---|
+0: | セクタ0のエラー情報 |
+1: | セクタ1のエラー情報 |
+1439: | セクタ1439のエラー情報 |
RuMSXでは物理エラーの有無のみをディスクイメージとは別のファイルに保存しています。
ファイルの形式は下の表に書いてありますが、最初に識別用の文字列を書いた後、セクタの番号が若い順にファイルの下位から上位アドレスへ、上位ビットから下位ビットの順で1セクタに1bitを割り当て最後に00Hを書きこんだファイルとなっています。
オフセット | 内容 |
---|---|
0-13H: | "DiskImage Errors",0DH(CR),0AH(LF),1AH(CP/M EOF),00H |
14H-(セクタ数/8 バイト): | エラー情報 |
14H Bit7: | セクタ0のエラーの有無(0:なし 1:あり) |
14H Bit0: | セクタ7のエラーの有無(0:なし 1:あり) |
15H Bit7: | セクタ8のエラーの有無(0:なし 1:あり) |
C7H Bit0: | セクタ1439のエラーの有無(0:なし 1:あり) |
14H+(セクタ数/8 バイト): | 00H (多分終端記号) |
この形式では、エラーの種類をディスクカーネルに伝えることができませんがディスクドライバによって返すエラーコードが異なることからエラーの種類を使ったプログラムができない(これによってMSXでは使えないプロテクト法が存在するが、プロテクトに関する知識は私は持ってないので他を調べて欲しい)事を考えるとエラーの種類は不要なのかもしれません。
MSXマガジン永久保存版2収録のMSX PLAYerでは仮想フロッピーディスクファイルと呼ばれるfMSX等のMSXエミュレータで使われる拡張子.DSKのディスクイメージとは異なるディスクイメージを持っています。
特徴として、実際に記録を行ったセクタの内容だけを保存するという点が挙げられます。これにより、ディスクイメージのサイズが小さくなるのでPDA等のストレージの容量が小さいデバイスでも使いやすくなるという特性があります。
実際の形式ですが、最初の4バイトにセクタ番号を書き込み、その後の512バイトにセクタの内容を書き込みます。これを、記録するセクタ数分繰り返します。
セクタ番号は1バイト目がbit7-bit0、2バイト目がbit15-bit8、3バイト目がbit23-bit16、4バイト目がbit31-bit24というリトルエンディアン形式で格納されています。
これを図示したものが下の表になります。
+0 - +3 | セクタ番号 |
+4 - +515 | セクタの内容 |
+516 - +519 | セクタ番号 |
+520 - +1031 | セクタの内容 |
ディスクイメージに記録されていないセクタについてはMSX PLAYer内蔵ディスクイメージの内容が使用されます。
また、MSXマガジン永久保存版2収録版MSX PLAYerの実装ではセクタ0(ブートセクタ)についてはディスクイメージの内容ではなく、必ずMSX PLAYer内蔵ディスクイメージの内容が使用されます。MSX PLAYer内蔵ディスクイメージのブートセクタはDOS2フォーマットの2DD,720KBディスクの物であるため、ディスクイメージの容量は720KBに制限されます。
また、物理エラーエミュレーション情報は存在しないようです。(未確認)
MSXマガジン永久保存版2収録のMSX PLAYerの仮想フロッピーディスクファイルはユーザーが書き込んだ部分だけを記録するという点ではWindows CEのファイルシステムに近いものを感じます。
MSXマガジン永久保存版2収録のMSX PLAYerの動作機種にWindows CE搭載機が入っている事を思うと趣深い物です。