MSX Datapack wiki化計画

13章 ディスクファイルの構造の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
{{include unfinished_page}}

,{t},{BSIZE:1 0|SIZE:100%}
,{BSIZE:0}←[[12章 外部プログラムの環境]]                                                      ,{BSIZE:0|RIGHT}[[14章 画面制御コード]]                                                           →

{{outline}}
!!13.1 デバイスおよびI/O

 ファイル名をMSX-DOSのファンクションに指定できる場合には、デバイス名も同じように与えることができます。これらのデバイスは文字ベースのI/Oで使用され、それによってプログラムはどちらを使用しているか知る必要なく、ディスクファイルと文字デバイスを全く同一の方法でアクセスできるようになります。その場合にどちらを使用しているか知る必要はありません。
 デバイス名の構文はファイル名の構文と同一で、プログラムはデバイス名を扱う際に特別な処理を必要としません。このことは新しいMSX-DOSファンクションにもCP/M互換のFCBファンクションにも当てはまります。デバイスに使用されるため予約されているファイル名は次のとおりです。

'''表2.10 デバイス用予約ファイル名'''
,デバイス名,意味
,CON       ,画面出力・キーボード入力
,PRN       ,プリンタ出力
,LST       ,プリンタ出力
,AUX       ,補助出力・入力
,NUL       ,ヌルデバイス

 これらのどれかがファイル名として指定されると、実際にデバイスが参照されます。拡張子がついている場合は無視されます。ファイルを使用する大部分のファンクションはデバイスも使用できます。例えば、CONというファイル名は「ファイル名の変更」ファンクションや「ファイルの削除」ファンクションで使用しても何の差し支えもありません。エラーは返されませんが、デバイスには何の影響も与えません。
 上記のAUXデバイスはデフォルトでは何もしませんが、例えばRS-232Cドライバを利用できるように適当なルーチンをフックすることができます。
 NULデバイスは実際には何もしません。出力文字は無視され、入力は常にエンドオブファイルとなります。
 LSTとPRNデバイスは同一です。
 CONデバイスはキーボードからの読み込み、あるいは画面への書き込みに使用します。CONデバイスから読み出す場合、1行入力が行われ、ユーザーは行編集機能を使用できます。ユーザーがCR(リターン)を押すと初めてその行が入力されます。入力の終わりは行頭の^Z文字で識別されます。
 システムは自動的にいくつかのファイルハンドルをこれらの標準デバイスに対してオープンします。(詳細については13.2「ファイルハンドル」を参照)。これらのファイルハンドルは、標準デバイスをアクセスするためにプログラムで使用できます。あるいは、プログラムは従来のCP/Mの文字ファンクション(ファンクション01H〜0BH)を使用して、文字I/Oを行うことができます。これらの2つの方法はどちらも許されますが、それぞれ別のバッファリングの方法を使用しており、混用すると文字がバッファ中で失われてしまう可能性がありますので、通常はこれらを混用するべきではありません。
 コマンド行によりリダイレクションが行われると、両方のアクセス方法(標準ファイルハンドルと文字ファンクション)がリダイレクトされます。しかし、ディスクファイルをアクセスするときには、標準ファイルハンドルを使用して大きなブロックで読み書きをする方が文字ファンクションを使用するよりもはるかに高速ですのでこちらの方が望ましいでしょう。
 コマンド行によるリダイレクションが行われている場合にもプログラムではリダイレクションをされていない画面出力とキーボード入力が必要になることがあります。例えば、ディスクエラー処理ルーチンではこれが必要です。これを可能にするため、文字ファンクションのリダイレクションを一時的にキャンセルするためのファンクションが提供されています。これは17.3「ファンクションの説明」に記述されています(P.329参照)。

!!13.2 ファイルハンドル

 新しいMSX-DOSのファンクションコールを用いてファイルのアクセスを行う場合、ファイルハンドルを使用します。また、ファイルハンドルはファイル属性の操作などのファイルの操作にも使用できます。
 ファイルハンドルは特定のオープンファイルやデバイスを参照する8ビットの数値です。新しいファイルファンドルは「ファイルハンドルのオープン」(P.295参照)あるいは「ファイルハンドルの作成」ファンクション(P.296参照)により割り当てられます。ファイルハンドルはファイルとのデータの読み書きに使用され、「ファイルハンドルのクローズ」(P.297参照)や「ファイルハンドルの削除」ファンクション(P.309参照)がコールされるまで存在し続けます。また、ファイルの属性を変更したり名前を変更したりといった処理もファイルハンドルを使って実行することができます。
 MSX-DOSが新しいファイルハンドルを割り当てる問いには、使用できる最初の番号を使用します。現在のバージョンでの最大のファイルハンドルの番号は63です。将来のバージョンではこれは増加する可能性がありますが、127を超えることはありません。従ってファイルハンドルが負の数になることはあり得ません。
 ファイルハンドルに使用される内部のデータ構造のための領域は16KのRAMセグメント(「データ」セグメント)中に動的に割り当てられるため、一度にオープンできるファイルの数には決まった制限がありません。このセグメントはTPAの外に置かれるため、そこにストアされるデータによってTPAのサイズが減少することはありません。システムはデータセグメント中に内部のファイルハンドル情報を保持するとともに、ディスクバッファと環境変数も保持します。
 外部プログラムが実行される際には、各種のファイルハンドルが前もって定義され、オープンされています。これらのファイルハンドルは標準入出力デバイスを参照しています。(13.1「デバイスおよび文字I/O」を参照)。「旧来の」CP/MスタイルのMSX-DOS文字I/Oファンクションは実際にはこれらのファイルハンドルを参照します。
 外部プログラムは、コマンドインタープリタが使用していた標準入出力のファイルハンドルではなく、実際にはそのコピーを獲得します。つまりプログラムは、これらのファイルハンドルを自由にクローズしたり、別のファイルハンドルをオープンしたりでき、また、これらのファイルハンドルをプログラム終了の前に元に戻したりする必要がありません。デフォルトのファイルハンドルとその行先を次に示します。

'''表2.11 デフォルトのファイルハンドル'''
,ファイルハンドル,意味
,0   ,標準入力(CON)
,1   ,標準出力(CON)
,2   ,標準エラー入出力(CON)
,3   ,標準補助入出力(AUX)
,4   ,標準プリンタ出力(PRN)

 コマンドインタープリタは外部プログラムなどのコマンドを実行する前に、「子プロセスの起動」ファンクション(P.318参照)を実行します。このファンクションコールはシステムに対して、新しいプログラムが「サブルーチン」として実行されようとしていることを報告します。そして、現在オープンされているファイルハンドルがすべてコピーされて、新しいプログラムはコマンドインタープリタのハンドルではなく、元のハンドルのコピーを使用することになります。
 外部プログラムが既存のファイルハンドルをクローズしたり、新しいものをオープンすることによって、なんらかのファイルハンドルを変更した場合には、それはプログラム自身のファイルハンドルのセットが変更されたことになり、もとのセットは変更されずに残ります。プログラムが終了したあと、コマンドインタープリタは「親プロセスに戻る」ファンクションコール(P.318参照)を実行し、それに最初の「子プロセスの起動」から消されたプロセスIDを渡します。これによって新しいプログラムが終了したことがシステムに報告され、そのプログラムで使用されていたすべてのファイルハンドルを捨てることができます。
 それぞれのファイルハンドルについて、いくつコピーが存在するかという参照カウントが保存されているので、システムはプログラムが終了したときに必要のなくなったファイルハンドルをクローズしなかったためにシステムがファイルハンドルを使いつくしてしまうような事態を防ぎます。
 これらの「子プロセスの起動」と「親プロセスに戻る」ファンクションはもし有用で有ればユーザープログラムで使用することできます。「親プロセスに戻る」ファンクションは、ファイルハンドルを整理し、プログラムが解放しなかったすべてのユーザー割り当てRAMセグメントを解放します。
 これらの「子プロセスの起動」と「親プロセスに戻る」ファンクションはもし有用で有ればユーザープログラムで使用することができます。「親プロセスに戻る」ファンクションは、ファイルハンドルを整理し、プログラムが解放しなかったすべてのユーザー割り当てRAMセグメントを解放します。

!!13.3 ディスク上のデータ構造
 ファイルやサブディレクトリは、ファンクションコールを使用すれば、手軽にキメ細かく取り扱うことができます。ユーザーは、ディスク上でファイルやサブディレクトリがどのような方法で管理され、どのような形式で記録されているか、といった情報を詳しく知る必要はありません。しかし、場合によっては、ディスクの管理情報を取り出したり、それを元にファイルやサブディレクトリとは無関係にディスクを直接アクセスしたりする手段が必要になることがあります。
 MSX-DOS2では、このような目的のために、ディスクの管理情報を得たり、「論理セクタ」を直接アクセスするファンクションコールを用意しています。
 セクタを直接アクセスする場合には、どのセクタにどういった情報が書き込まれているか、という基本情報が必要になります。

!13.3.1 論理セクタ

 MSX-DOS2では、3.5インチフロッピーディスクでもハードディスクでも、あるいはその他のドライブでも基本的にはアクセスすることができます。それぞれのドライブやメディアの種類によりセクタの大きさ、トラックごとのセクタ数、記録面の数などは違っていますが、これを統一的に管理するため、MSX-DOS2では、ディスク上の物理的な境界にとらわれず、すべてのセクタに連続した通し番号つけて、その番号でセクタを管理する方法を採用しています。これを「論理セクタ」と呼びます。
 「論理セクタ」(以下、セクタ)の番号は0からそのディスクの総セクタ数-1(ディスクの種類によって異なる)までの一連の番号によって指定します。
 MSX-DOS2では、ディスクの中のセクタを表2.12に示す4つの領域に分けています。最初の3つの領域にはデータを管理するための情報が書き込まれ、ファイルデータの本体は「データ領域」の部分に書き込まれます。これらの位置関係は図2.3の通りです。ブートセクタは必ずセクタ0にありますが、
*FAT
*ルートディレクト
*ルートディレクトリ
*データ領域の開始セクタの位置
 は、メディアによって異なります。ただし、これらの情報は、ブートセクタから読み出せば得ることができます。

'''表2.12 ディスクの領域'''
,領域,内容
,ブートセクタ      ,ディスク固有の情報とMSX-DOS2の起動プログラム
,FAT               ,ディスク上のファイルとサブディレクトリの位置情報
,ルートディレクトリ,ディスク上のルートディレクトリの管理情報
,データ領域        ,実際のデータ
,データ領域        ,実際のファイルデータ

{{svg 図2.3.svg}}
図2.3 ディスク上の領域の位置関係

!13.3.2 クラスタ

 ディスクの入出力は、前述のとおりセクタが基本単位です。ただし、ファイルに対してディスク上のセクタを割り当てるときには、セクタではなく複数のセクタから成る「クラスタ」という単位が使われます。それぞれのファイルには、そのファイルサイズに応じて必要な数のクラスタが割り当てられます。1クラスタ未満の部分については、例えそれが1バイトであっても1クラスタ分のデータ領域が割り当てられます。クラスタは論理セクタと同様に連続した番号で指定されていますが、FATのこうで述べる理由で、2から始まる通し番号になっており、データ領域の先頭がクラスタ#2の位置に相当します。
 ディスクの入出力は、前述のとおりセクタが基本単位です。ただし、ファイルに対してディスク上のセクタを割り当てるときには、セクタではなく複数のセクタから成る「クラスタ」という単位が使われます。それぞれのファイルには、そのファイルサイズに応じて必要な数のクラスタが割り当てられます。1クラスタ未満の部分については、例えそれが1バイトであっても1クラスタ分のデータ領域が割り当てられます。クラスタは論理セクタと同様に連続した番号で指定されていますが、FATの項で述べる理由で、2から始まる通し番号になっており、データ領域の先頭がクラスタ#2の位置に相当します。

!13.3.3 ブートセクタとDPB(ドライブパラメータブロック)

 MSX-DOS2では、接続されている個々のドライブごとに「DPB」という領域がメモリ上のワークエリアに設けられ、各ドライブに固有の情報が記録されます。MSX-DOS2はどのようなタイプのディスクドライブにも対応できますが、それはこのDPBを参照して個々のドライブに対応した処理を行うことによって、メディア間の差違が吸収できるからです。
 DPBに書き込まれる情報は、ブートセクタに記録されているもので、それがMSX-DOS2の起動時やメディアが交換されるごとに変更されます。ただし、ブートセクタとDPBは、図2.4と図2.5に示すように、形式が異なっています。
{{svg 図2.4.svg}}
図2.4 ブートセクタの情報
{{svg 図2.5.svg}}
図2.5 DPBの構造

!13.3.4 FAT(ファイルアロケーションテーブル)

 MSX-DOS2では、1クラスタよりも大きなサイズのファイルは、複数のクラスタにまたがって記録されますが、そのとき連続した番号のクラスタが使用されるとは限りません。特に、ファイルまたはサブディレクトリの作成・削除を何度も繰り返した後では、使われなくなったクラスタがディスク上のあちこちに散在した状態になります。この状態でサイズの大きなファイルを作成すると、データは飛び飛びのクラスタに分散しておかれます。そこで「何番目のクラスタは何番目のクラスタに続いている」、というリンク情報を記録しておく場所が必要になります。それがFATの役割です。また、未使用クラスタの位置や、不良クラスタが発見されたとき以後そこをアクセスしないように記録する目的にもFATが利用されます。
 FATに記録されるこのようなクラスタのリンク情報や不良クラスタ情報は、ディスクファイルを管理するうえで不可欠なものであり、一部でも破損してしまうとディスク全体が使用できなくなる恐れがあります。そのためFATは常に複数個のコピーが用意され、万一に備えています。
 FATの例を図2.7に示します。FATには、
*先頭の1バイトは「FAT ID」と呼ばれ、ディスクのメディアタイプを示す値
*次の2バイトはダミー値のFFH
*その次から、1クラスタにつき12ビットというフォーマットで実際のリンク上を記録しているFATエントリ
が記録されます。0番と1番に相当する3バイトが「FAT ID」に使われていますので、ファイルのデータに対応するFATエントリは2番から始まります。FATエントリの番号は、それに対応するクラスタの番号でもあります。FATエントリに記録された12ビットのリンク情報は、図2.6のように並んでいます。リンク情報は、次に続くクラスタ番号を示す値です。もしFFFHとなっているときは、そのクラスタでファイルが終了したことを意味します。
 図2.6の例では、クラスタ#2→クラスタ#3→クラスタ#4という3クラスタ分の大きさのファイルと、クラスタ#5→クラスタ#6の2クラスタ分のファイルが存在していることがわかります。なお、クラスタが番号の小さい順にリンクしているのは図を見やすくするためで、実際には番号順であるとは限りません。
{{svg 図2.6.svg}}
図2.6 FATの実例
{{svg 図2.7.svg}}
図2.7 FATの読み方

!13.3.5 ルートディレクトリ

 FATはデータの位置関係などを表すものであり、ファイル自体に関する情報は含んでいません。従って、そのファイルの名前やそれに付随する情報を知るには、FATとは別の情報源が必要です。これが「ディレクトリ」です。
 ルートディレクトリはディスク上のルートディレクトリ領域に記録されていて、図2.8のように32バイトごとにディレクトリエントリ(ディレクトリの格納場所)が並んでいます。ファイルを作成すると、使われていないディレクトリエントリの中で、いちばん番号が小さいところに目的のファイルのディレクトリエントリが作られます。
 ファイルまたはサブディレクトリが削除されると、該当するディレクトリエントリの最初の1バイトは+12「ディレクトリエントリの第1文字目」にコピーされた後、0E5Hが書き込まれ、そのディレクトリエントリがあいたことを示します。UNDELコマンドを実行時には、この1バイトを元に戻してディレクトリエントリを復活させます。
 ディレクトリエントリがすべて使用されてしまうと、データ領域がいくら残っていても新しいファイルまたはサブディレクトリは作ることはできません。
{{svg 図2.8.svg}}
図2.8 ディレクトリ領域の構造
 ディレクトリエントリは図2.9のような構造で、それぞれファイル名・ディレクトリ名・ボリューム名、属性、作成・変更の日時、先頭クラスタ番号、ファイルサイズの情報記録しています。
 ディレクトリエントリは属性によって、ファイル、ディレクトリ(ディレクトリ属性がセット)、ボリューム名(ボリューム名属性がセット)を表します。
{{svg 図2.9.svg}}
図2.9 ディレクトリエントリの構造
 属性は、ディレクト林とりに各種の属性を与えるものです(図2.10参照)。それぞれの属性は次のような意味を持っています。
 属性は、ディレクトリエントリに各種の属性を与えるものです(図2.10参照)。それぞれの属性は次のような意味を持っています。

・読み出し専用ファイル
 このビットがセットされるとファイルは書き込んだり削除したりできなくなります。読んだり、名前を変更したり、移動することはできます。

・不可視
 このビットがセットされていると、検索属性バイト中に「不可視」ビットをセットして「最初のエントリの検索」ファンクションをコールした場合にのみ見つかります。

・システムファイル
 MSX-DOS2のファンクションが関知する限り、このビットは「新しいエントリの検索と「作成」ファンクションコールが自動的にシステムファイルを削除することはないということを除いて、「不可視」ビットと全く同じ効果を持ちます。コマンドインタープリタによって組み込まれたコマンドでは、システムファイルをアクセスすることができません。

・ボリューム名
 このビットがセットされるとこのエントリはボリュームの名前を定義します。これはルートディレクトリでのみ可能で、ひとつだけしか設定できません。他のビットはすべて無視されます。

・アーカイブ
 ファイルが書き込まれてクローズされると必ずこのビットがセットされます。このビットは、XCOPYコマンドなどによって検出され、ファイルが変更されたかどうかを判断します。MSX-DOS1ではこのビットは常に0です。
{{svg 図2.10.svg}}
図2.10 属性

 日付と時刻は図2.11と図2.12のように、それぞれ2バイトの領域を3つのビットフィールドに分割して記録しています。「年」は7ビットに0〜99の値を設定することで、西暦1980年〜2079年を表します。「秒」用のフィールドは5ビットで、時間の分解能は2秒です。
{{svg 図2.11.svg}}
図2.11 日付を表すビットフィールド
{{svg 図2.12.svg}}
図2.12 時刻を表すビットフィールド

!13.3.6 ボリューム名

 ディレクトリエントリのボリューム名属性がセットされているとそのエントリはボリューム名を表します。ボリューム名はルートディレクトリのみで設定可能で、また一つだけしか設定できません。ボリューム名は11バイトであり、コントロールコードと「/」を除いて、ファイル名としては無効な文字を含めることができますが、先頭に空白は入りません。

!13.3.7 サブディレクトリ

 MSX-DOS2ではサブディレクトリによって階層ディレクトリを扱えるようになりました。
 サブディレクトリはデータ領域内にとられ、その領域はファイルと同じようにFATで管理されます。サブディレクトリの領域にはルートディレクトリと同じようにディレクトリエントリが並んでいます。ただし、この領域の最初の2つのエントリは特別な目的に使われます。これらのエントリはディレクトリ属性を持ち、ディレクトリ名は「.」「..」になります。「.」の先頭クラスタ番号は自分自身のディレクトリを指し、「..」の先頭クラスタ番号は親ディレクトリを指します。

!13.3.8 クラスタからセクタへの換算

 FATやディレクトリエントリでは、ディスク上のデータの位置はクラスタ単位で表されています。クラスタで示されたこれらのデータをファンクションコールでアクセスするためには、あるクラスタが何番のセクタに対応してるか、という関係を求めなければなりません。これは、データ領域がクラスタ#2から開始していることを元に、以下のように計算することができます。
+与えられたクラスタ番号をCとする。
+データ領域の開始セクタを調べ、これをS0とする。
+1クラスタが何セクタに相当するか調べ、これをnとする。
+求めるセクタ番号Sは、 S=S0+(C-2)*n の計算で求められる。
!!13.4 ファイル情報ブロック(FIB)

 ディスク上のファイルに作用するすべての新しいMSX-DOSファンクションには、ヌル文字で終了する文字列(ASCIIZ文字列と呼ぶ)への単なるポインタを渡すことができ、この文字列にはドライブ、パス名、およびワイルドカードを使用しない確定したファイル名を指定することができます。これらは通常外部プログラムが主に高級言語インターフェイスを通して実行する処理です。詳細は5.1「表記法について」を参照して下さい。
 これらのASCIIZファンクションには、かわりにファイル情報ブロック(FIB-File Information Block)を渡すことができます。FIBは未知のファイルやサブディレクトリをディレクトリ上で検索するといった、より複雑な処理に使用されます。通常、これらはコマンドインタープリタやユーティリティのみで使用されていて、外部プログラムでしか使わないでしょう。
 FIBは特定のファイルやサブディレクトリのディスク上のディレクトリエントリの情報を持っているユーザーメモリ中の64バイトの領域です。FIB中の情報は新しいMSX-DOSの「検索」ファンクション(「最初のエントリの検索」(P.291)、「新しいエントリの検索」(P.293)、および「次のエントリの検索」(P.292))によって満たされます。FIBの形式は次のとおりです。

'''表2.13 FIBの形式'''
,アドレス,内容
,0       ,常に0FFH
,1〜13   ,ファイル名(ASCIIZ文字列)
,14      ,ファイル属性バイト
,15〜16  ,最終変更時刻
,17〜18  ,最終変更日付
,19〜20  ,開始クラスタ
,21〜24  ,ファイルのサイズ
,25      ,論理ドライブ
,26〜63  ,内部情報(変更してはならない)

 どちらの形式のパラメータもとることができるファンクションがあるため、FIBの最初の「0FFH」はパス名文字列と区別するために必要です。
 「ファイル名」は直接印字可能なフォーマットでストアされ、ASCIIZ文字列の形式になります。空白はすべて取り除かれ、もしあればファイル名拡張子の前にピリオドが付加され、名前は大文字にされます。エントリがボリュームラベルであると、名前は「.」セパレータなしでストアされ、空白が残されて大文字化されません。
 「ファイル名属性バイト」はファイルに関するフラグから成るバイトです。このバイトのフォーマットを以下に示します。
・ビット0−読み出し専用
 このビットがセットされるとファイルは書き込んだり削除したりできなくなりますが、読んだり、名前を変更したり、移動することはできます。
・ビット1−不可視ファイル
 このビットがセットされていると、「最初のエントリの検索」ファンクションを、検索属性バイト中に「不可視ファイル」ビットセットしてコールした場合にのみ、ファイルが見つかります。
 コマンドインタープリタに組み込まれたディスク上のファイルやディレクトリにアクセスするすべてのコマンドは、「/H」オプションを指定することによって不可視ファイルを見つけることができます。
・ビット2−システムファイル
 MSX-DOSのファンクションに関する限り、このビットは、「新しいエントリの検索」と「作成」ファンクションコールが自動的にシステムファイルを削除することはないということを除いて、「不可視ファイル」ビットと全く同じ効果を持ちます。コマンドインタープリタによって組み込まれたコマンドでは、システムファイルをアクセスすることができません。
・ビット3−ボリューム名
 このビットがセットされているとエントリはボリュームの名前です。これはルートディレクトリにひとつだけしか存在できません。他のビットはすべて無視されます。
・ビット4−ディレクトリ
 このビットがセットされているとこのエントリはファイルではなくサブディレクトリです。従って読み出しや書き込みのためにオープンできません。サブディレクトリの場合は、「不可視ファイル」ビットだけが意味を持ちます。
・ビット5−アーカイブビット
 ファイルが書き込まれてクローズされると必ずこのビットがセットされます。このビットは、XCOPYコマンドなどによって、ファイルが変更されたかどうかを判断するために、検査できます。
・ビット6−予約(常に0)
・ビット7−デバイスビット
 これがセットされているとFIBがディスクファイルでなく、文字デバイス(「CON」など)を参照していることを示しています。他のすべての属性ビットは無視されます。

 「最終変更時刻」は次のように2バイトにエンコードされます。

'''表2.14 最終変更時刻の2バイトエンコード'''
,ビット,意味
,15〜11,時間(0〜23)
,10〜3 ,分(0〜59)
, 4〜0 ,秒/2(0〜29)

 「最終変更日付」は次のように2バイトにエンコードされます。すべてのビットがゼロであると、日付がセットされていないことになります。

'''表2.15 最終変更日付の2バイトエンコード'''
,ビット,意味
,15〜9,年(0〜99・1980〜2079に対応)
, 8〜5,月(1〜12・1月〜12月に対応)
, 4〜0,日(1〜31)

 「ファイルサイズ」は最下位バイトが先頭にストアされた32ビットの数値で、サブディレクトリでは0です。
 「論理ドライブ」は1バイトのドライブ番号で、1がA:、2がB:というように対応します。元のファンクションでゼロが指定された場合(それはカレントドライブという意味なので)、カレントドライブのドライブ番号が個々に入れられるため、ゼロになるということはありません。
 「内部情報」によって、MSX-DOSはディスク上のどこにディレクトリエントリがストアされているかを知ります。これによってFIBを渡されたふぁんくしょんで、例えば削除、名前の変更やオープンなどの、ディレクトリエントリに対する処理ができるようになります。また、ここにストアされたデータによって、「次のエントリの検索」ファンクション(P.292参照)が次に一致するファイルの検索を実行できます。
 「内部情報」によって、MSX-DOSはディスク上のどこにディレクトリエントリがストアされているかを知ります。これによってFIBを渡されたファンクションで、例えば削除、名前の変更やオープンなどの、ディレクトリエントリに対する処理ができるようになります。また、ここにストアされたデータによって、「次のエントリの検索」ファンクション(P.292参照)が次に一致するファイルの検索を実行できます。
 ユーザーは内部の情報をアクセスしたり修正したりしてはなりません。
 FIBは「最初のエントリの検索」、「新しいエントリの検索」、および「次のエントリの検索」MSX-DOSファンクションによって書き込まれます。これらのファンクションはディレクトリエントリを探し、適切な情報をFIBに書き込みます。
 「最初のエントリの検索」の場合には、ディレクトリは指定のファイル名に一致し、適合する属性を持つ最初のエントリについて検索されます(詳細については17.3「ファンクションの説明」を参照)。「次のエントリの検索」は直前の「最初のエントリの検索」ファンクションによって始められた検索を実行し、次に一致するエントリでFIBを更新します。
 「新しいエントリの検索」(P.293参照)は「最初のエントリの検索」に類似していますが、一致するエントリを検索するかわりに新しいエントリを作成し、「最初のエントリの検索」で見つかったのと同様にFIBを返します。
 「検索」ファンクションのいずれかでFIBを作成すると、それは2つの方法で利用することができます。
 最初の方法はファイル名やサイズなどと言った、それが持っている情報を単純に利用するものです。例えば、「DIR」コマンドは単純に情報を画面に出力します。
 最初の方法はファイル名やサイズなどといった、それが持っている情報を単純に利用するものです。例えば、「DIR」コマンドは単純に情報を画面に出力します。
 FIBを使用するもう1つの方法は、ディレクトリエントリについてのなんらかの処理を実行するために、それをもう1度別のMSX-DOS2ファンクションに渡す方法です。
 17.3「ファンクションの説明」で記述されているMSX-DOS2ファンクションの多くは、DEレジスタに入っているポインタを、ドライブ・パス・ファイル文字列あるいはFIBのどちらかを指しても良いものとして使用します。どちらの場合も、ファンクションには実行の対象として特定のファイルやディレクトリが指定されます。
 このようなパラメータを取ることのできるファンクションは「ファイルあるいはサブディレクトリの削除」(P.304参照)「ファイル名あるいはサブディレクトリ名の変更」(P.305参照)、「ファイルあるいはサブディレクトリの移動」(P.306参照)、「ファイルの日付および時刻の獲得・セット」(P.308参照)、および「ファイルハンドルのオープン」(P.295参照)です。これらのすべては指定のファイルあるいはディレクトリについて、所定の機能を実行します。
 FIBは「最初のエントリの検索」あるいは「新しいエントリの検索」ファンクションへもドライブ・パス・ファイル文字列の代わりに渡すことができます。この場合、FIBはファイルではなくディレクトリを参照しなければならず、ファイル名文字列をHLレジスタで渡さなければなりません(通常ヌル文字列で、これは「*.*」と同じ意味)。FIBで指定されたディレクトリでは、ファイル名とマッチするものが検索され、通常の属性のチェックを受けます。この機能はコマンドインタープリタで、UTILがディレクトリである場合に「DIR A:UTIL」などといったコマンドが必要な動作を実行するために必要です。
!!13.5 ファイルコントロールブロック(FCB)

 MSX-DOS2の外部プログラムやMSX-DOS2用に修正されたMSX-DOS1やCP/MのプログラムがCP/M互換のFCBファンクションを使用することは想定されていませんが、これらのファンクションで使用されるFCBのフォーマットを参考のために説明します。
 このフォーマットはCP/MやMSX-DOS1で使用されるFCBに非常に似ていますが、FCB中のいくつかの領域の使用法は異なります。
 基本的なFCBの長さは33バイトです。このタイプのFCBはファイル管理操作(削除、名前の変更など)や、シーケンシャルな読みか書きで利用できます。ランダムな読み書きのファンクションは、ランダムレコード番号を格納するためにFCBの後からさらに3倍と使用しています。MSX-DOS1互換のブロックリード・ライトのファンクションもこの追加の3バイト(場合によっては4バイト)を使用します。詳細については17.3「ファンクションの説明」を参照して下さい。
 基本的なFCBの長さは33バイトです。このタイプのFCBはファイル管理操作(削除、名前の変更など)や、シーケンシャルな読み書きで利用できます。ランダムな読み書きのファンクションは、ランダムレコード番号を格納するためにFCBの後から更に3バイト使用しています。MSX-DOS1互換のブロックリード・ライトのファンクションもこの追加の3バイト(場合によっては4バイト)を使用します。詳細については17.3「ファンクションの説明」を参照して下さい。
 FCBのレイアウトを以下に示します。それぞれの領域の大まかな説明もここに書いてあります。17.3「ファンクションの説明」で記述されている個々のファンクションの説明では、領域がそれぞれのファンクションでどのように使用されているかが詳しく説明されています。

・00H−ドライブ番号(1〜8。0以下ならばカレントドライブ)
 使用されるすべてのFCBでセットアップされなければならず、MSX-DOSのファンクションコール(環境変数「APPEND」が使用されている場合の「ファイルのオープン[FCB]」(P.275参照)を除く)では変更しません。
・01H〜08H−ファイル名(左詰めにして後に空白が付く)
 ファイル名にワイルドカードが使用できる場合には「?」、「*」文字を含むことができます(P.275「ファイルのオープン[FCB]を参照)。比較を行う場合、大小文字の区別は無視されます。新しいファイルを作成する場合、名前は大文字にされます。
・09H〜0BH−ファイル名拡張子
 ファイル名と同じです。ファイル名拡張子の文字ビット7はCP/Mと異なり、フラグとして解釈されません。
・0CH−エクステント番号(下位バイト)
 外部プログラムによってオープンや作成の前に(通常ゼロに)セットされなければなりません。
 これはシーケンシャルリード・ライトによって使用、更新され、また、ランダムリード・ライトによってセットされます。CP/MおよびMSX-DOS1と互換性があります。
・0DH−ファイル属性
 「ファイルのオープン」(P.275参照)、「ファイルの作成」(P.280参照)と「最初のエントリの検索」(P.277参照)によってセットアップされます。
・0EH
 CP/Mファンクションでのエクステント番号(上位バイト)
 オープンと作成によってゼロにされます。シーケンシャルリード・ライトでは、エクステント番号の拡張として使用、更新され、CP/Mでアクセス可能なものより大きなファイルをアクセスできるようにします。これはCP/Mとは異なるが、CP/M風にFCBを使用する妨げにはならず、MSX-DOS1と同じです。
 MSX-DOS1互換のブロックファンクションでのレコードサイズ(下位バイト)
 ブロックリード・ライトファンクションを使用する前に、必要なレコードサイズにセットしなければなりません。
・0FH−CP/Mファンクションのレコードカウント
 オープンおよび作成によってセットアップされ、シーケンシャルおよびランダムリード・ライトによって必要に応じて修正されます。これはCP/MおよびMSX-DOS1と同じです。
 MSX-DOS1互換のブロックファンクションでのレコードサイズ(上位バイト)ブロックリード・ライトのファンクションを使用する前に、必要なレコードサイズにセットしなければなりません。
・10H〜13H−バイト単位でのファイルサイズ(最下位バイトが最初)
 ファイルサイズは正確なもので、128バイト単位に切り上げられません。この領域はオープンおよび作成によってセットアップされ、ファイルが書き込み処理によって拡張されたときに更新されます。クローズファンクションコールによってディスクに書き込まれるため、外部プログラムが変更してはいけません。これはMSX-DOS1と同じですが、ここに割り当て情報を格納するCP/Mとは異なります。
・14H〜17H−ボリュームID
 これは、このFCBがアクセスしている特定のディスクを識別する4バイトの数値です。オープンおよび作成によってセットアップされ、読み出し、書き込み、およびクローズコールでチェックされます。プログラムによって変更してはいけません。これは、ここに最終変更日付および時刻をストアするMSX-DOS1、割り当て情報を格納するCP/Mとは異なります。
・18H〜1FH−内部情報
 これらのバイトはファイルをディスク上で見る蹴るための情報を持ちます。外部プログラムによってはいかなる変更もしてはいけません。ここに保持されている内部情報は、MSX-DOS1によって保持されるものと似てはいるが同一ではなく、CP/Mのものとはまったく異なります。
・20H−エクステント中のカレントレコード(0〜127)
 最初のシーケンシャルリード・ライトの前に外部プログラムによって(通常ゼロに)セットされなければなりません。シーケンシャルリード・ライトによって使用、変更されます。また、ランダムリード・ライトによってセットアップされます。これはCP/MおよびMSX-DOS1と互換性があります。
・21H〜24H−ランダムレコード番号(下位バイトが先)
 この領域はオプションで、ランダムあるいはブロックリード・ライトが使用される場合にだけ必要となります。これらの処理を実行する前にセットアップしなければならず、ブロックリード・ライトによって更新されるが、ランダムリード・ライトによっては更新されません。「ランダムレコードのセット」ファンクションによってもセットされます。
 ブロックリードライト(MSX-DOS1に存在してCP/Mには存在しない)では、レコードサイズが64バイト未満の場合には4バイトすべてが使用され、レコードサイズが64バイト以上の場合には最初の3バイトだけが使用されます。ランダムリード・ライトは最初の3バイトだけが使用されます(暗黙のレコードサイズは128バイト)これはCP/MおよびMSX-DOS1と互換性があります。
!!13.6 環境変数
 MSX-DOS2はデータセグメント中に「環境変数」のリストを持っています。環境変数とは、MSX-DOS2やアプリケーションプログラムが動作するときに必要となる値を設定しておく変数です。環境変数には、DOS2やアプリケーションプログラムが使用する特定のものと、ユーザーが定義できるものとがあります。名前と値はどちらもユーザーが定義します。環境変数は「環境変数の獲得」(P.328参照)、「環境変数のセット」(P.328参照)および「環境変数の検索」ファンクション(P.329参照)を通してファンクションコールレベルでアクセスすることができます。

 環境変数の名前はファイル名で使用できる任意の文字で構成されるヌルでない文字列です。環境変数は255文字の長さまで許されます。環境変数は文字列が定義されるときに大文字に変換されますが、名前が比較されるときは、大小文字の区別をしません。

 環境変数の値はヌルでない文字の文字列で構成され、255文字までの長さが可能です。環境変数の値がヌル文字列にセットされると、名前は環境変数のリストから除去されます。同様に、定義されていない環境変数の値が読み出されると、ヌル文字が返されます。値は大文字にされず、値の文字列中の文字については何の変換も行われません。

 外部プログラムがロードされCOMMAND2.COMから実行されると、外部プログラムが読み出すことのできる2つの特殊な環境変数がセットアップされます。

 PARAMETERSという環境変数は実際のコマンド名を含まないコマンド行の内容です。これは、CP/Mとの互換性のため、80Hにセットアップされるものと似ていますが、大文字にはされません。

 PROGRAMというもう一つの環境変数は、ディスク上のプログラムを見つけるために使用される完全なパスで、ドライブ、ルートからのパス、プログラムの実際のファイル名の順になっています。ドライブ、パス、およびファイル名は「パス名の解析」ファンクションコール(P.314参照)を使用して分離することができます。

 PROGRAM環境変数にはいくつかの使用法があります。主要な用途はプログラムがそれを、プログラムがロードされたところと同じディレクトリからオーバーレイファイルをロードするために利用できることです。PROGRAM中の最後の項目(つまり実際のプログラムのファイル名)をオーバーレイファイルの名前に置き換えて、新しい文字列をASCIIZ文字列を取る任意の新しいMSX-DOS2ファンクション(「ファイルハンドルのオープン」など)に渡すことができます。

 CP/Mプログラムのいくつかは外部プログラムをロードして実行するとができますが、この場合CP/MプログラムはPROGRAMやPARAMETERS環境変数をセットアップしませんので、環境変数はCP/Mプログラムがロードされたときのままになっています。
 CP/Mプログラムのいくつかは外部プログラムをロードして実行することができますが、この場合CP/MプログラムはPROGRAMやPARAMETERS環境変数をセットアップしませんので、環境変数はCP/Mプログラムがロードされたときのままになっています。

 プログラムがPROGRAMおよびPARAMETERSを使用しようとして、しかもCP/Mプログラムからもロードできるようにしようとする場合には、ページ0の0037H番地にある「LOAD_FLAG」という変数を調べることができます。このフラグは、すべてのMSX-DOS2のファンクションコールでゼロにセットされ、外部プログラムがCOMMAND2.COMによって実行される直前にはゼロ以外の値にセットされます。MSX-DOS2用の外部プログラムが他のパイププログラムをロードして実行できる場合、PROGRAMとPARAMETERSをセットアップするには、COMMAND2.COMと同様にLOAD_FLAGをゼロ以外にセットしなければなりません。

 もう一つの特殊な環境変数はAPPENDです。これはユーザーがコマンドインタープリタからセットアップし、CP/Mの「ファイルのオープン(FCB)」ファンクション(P.275参照)で使用されます。このファンクションコールが実行されてファイルが見つからないと、APPENDで指定される別のディレクトリが検索されます。ただし、MSX-DOS2用の外部プログラムがこのファンクションコールやAPPEND環境変数を使用するということは考えられていません。

 種々のシステムの機能やオプションを制御するため、いくつかの環境変数がコマンドインタープリタが起動するときにセットアップされたり、ユーザーによって変更されたりするので、外部プログラムでそのいくつかを読み込むと便利です。例えば、PATH環境変数や、プログラムが日付や時刻を出力する場合にはDATEやTIME環境変数を読み込むと便利です。8章「環境変数の設定」ではこれらのデフォルトの環境変数の詳細を記述しています。

,{t},{BSIZE:1 0|SIZE:100%}
,{BSIZE:0}←[[12章 外部プログラムの環境]]                                                      ,{BSIZE:0|RIGHT}[[14章 画面制御コード]]                                                           →