MSX-DOS2PIS 03 04

From Z80 Machines Wiki
Jump to: navigation, search

3.4.ファイル情報ブロック

ディスク上のファイルに作用するすべての新しいMSX-DOS関数は、ドライブ、パス、および明確なファイル名を含むことができるNULLで終わる文字列(ASCIIZ文字列と呼ばれる)への単純なポインタを渡すことができます。これらは通常、一時的なプログラムが実行する操作で、多くの場合は高水準言語インターフェースを介して実行されます。コマンド仕様書にこれらの詳細が記載されています。

これらのASCIIZ関数のいずれにも、代わりにファイル情報ブロック(FIB)を渡すことができます。 FIBは、未知のファイルやサブディレクトリに対するディレクトリの検索など、より複雑な操作に使用されます。

FIBは、特定のファイルまたはサブディレクトリについてのディスク上のディレクトリエントリに関する情報を含むユーザのメモリの64バイトの領域である。 FIB内の情報は、新しいMSX-DOSの "検索"機能( "最初のエントリの検索"(機能40H)、 "新しいエントリの検索"(機能42H)、 "次のエントリの検索"(機能41H))で埋められます。ファイル情報ブロックの形式は次のとおりです。

    0 - Always 0FFh
1..13 - Filename as an ASCIIZ string
   14 - File attributes byte

15..16 - Time of last modification 17..18 - Date of last modification 19..20 - Start cluster 21..24 - File size

   25 - Logical drive

26..63 - Internal information, must not be modified

ファイル情報ブロックの先頭にある0FFhは、パス名文字列と区別するために存在する必要があります。これは、関数によってはどちらのタイプのパラメータも使用できるためです。

ファイル名は直接印刷に適した形式で保存され、ASCIIZ文字列の形式です。スペースがあれば削除され、ファイル名拡張子(存在する場合)の前にドットが付き、名前は大文字になります。エントリがボリュームラベルの場合、名前は「。」なしで保存されます。スペースは空白で、大文字ではない。

ファイル属性バイトは、ファイルに関するフラグのバイトです。このバイトのフォーマットは次のとおりです。

  • ビット0 - 読み取り専用。設定されている場合、ファイルは書き込みも削除もできませんが、読み込み、名前の変更、移動は可能です。
  • ビット1 - 隠しファイル。設定されている場合、「隠しファイル」ビットが検索属性バイトに設定されている場合、ファイルは「最初に検索」機能によってのみ検索されます。ディスク上のファイルやディレクトリにアクセスするコマンドインタプリタによって実行されるすべてのコマンドは、コマンドが隠しファイルを見つけることを可能にする "/ H"オプションを取ることができます。
  • ビット2 - システムファイル。 MSX-DOS関数に関する限り、このビットは "HIDDEN FILE"ビットとまったく同じ効果がありますが、 "Find New"および "Create"関数呼び出しはシステムファイルを自動的に削除しません。コマンドインタプリタによって実装されたコマンドのどれもシステムファイルへのアクセスを許可しません。
  • ビット3 - VOLUME NAME。設定されている場合、このエントリはボリュームの名前を定義します。一度だけ、ルートディレクトリに存在することができます。他のすべてのビットは無視されます。
  • ビット4 - ディレクトリ。設定した場合、エントリはファイルではなくサブディレクトリであるため、読み書き用に開くことはできません。隠しビットだけがサブディレクトリに意味を持ちます。
  • ビット5 - ARCHIVE BIT。ファイルが書き込まれて閉じられるときはいつでも、このビットは設定されます。このビットは、たとえばXCOPYコマンドで調べて、ファイルが変更されたかどうかを判断できます。
  • ビット6 - 予約済み(常に0)。
  • ビット7 - デバイスビット。これは、FIBがディスクファイルではなくキャラクタデバイス(例: "CON")を参照していることを示すために設定されています。他のすべての属性ビットは無視されます。

最終変更時刻は、次のように2バイトにエンコードされます。 ビット15..11 - 時間(0..23) ビット10 ... 5 - 分(0..59) ビット4 ... 0 - 秒/ 2(0..29) 最終変更日は、次のように2バイトにエンコードされています。すべてのビットがゼロの場合、有効な日付設定はありません。 ビット15 ... 9 - 年(1980..2079に対応する0..99)

ビット8 ... 5 - MONTH(1..12はJan..Decに対応) ビット4 ... 0 - 1日(1..31)

ファイルサイズは最下位バイトが最初に格納された32ビット数で、サブディレクトリの場合はゼロです。

論理ドライブは1バイトのドライブ番号で、1はA:、2からB:などに対応します。元の関数でゼロが指定されている場合、これはデフォルトのドライブとドライブ番号の被駆動番号を意味します。デフォルトドライブはここに記入されます。

内部情報は、ディレクトリエントリがディスク上のどこに格納されているかをMSX-DOSに伝えます。これにより、fileinfoブロックが渡される関数でディレクトリエントリを操作することができます。たとえば、エントリの削除、名前の変更、開くなどです。ここに記憶されたデータはまた、「次のエントリを見つける」機能(機能41H)が次の一致するファイルを見つけるために検索を続けることを可能にする。ユーザーは、内部情報にアクセスしたり変更したりしないでください。

Fileinfoブロックは、 "最初のエントリの検索"、 "新しいエントリの検索"、および "次のエントリの検索"というMSX-DOS機能によって埋められます。これらの各関数はディレクトリエントリを探し出し、関連情報をfileinfoブロックに入力します。

「最初のエントリを見つける」の場合、与えられたファイル名にマッチし、適切な属性を持つ最初のエントリを見つけるためにディレクトリが検索されます(詳細は機能仕様を参照してください)。 「次のエントリの検索」は、前の「最初のエントリの検索」機能によって開始された検索を続け、次に一致するエントリでfileinfoブロックを更新します。

「新しいエントリの検索」は「最初のエントリの検索」と似ていますが、一致するエントリを探すのではなく、新しいエントリを作成し、「最初の検索」で見つかった場合と同じようにfileinfoブロックを返します。

「検索」機能の1つを使用してfileinfoブロックを作成したので、それを使用することができる2つの方法があります。最初の方法は、ファイル名やサイズなど、それに含まれる情報を単純に使用することです。たとえば、 "DIR"コマンドは単に画面に情報を表示します。

fileinfoブロックを使用するより興味深い方法は、ディレクトリエントリに対して何らかの操作を実行するために、それを別のMSX-DOS関数に戻すことです。関数仕様に記述されているMSX-DOS関数の多くは、ドライブ/パス/ファイル文字列またはfileinfoブロックを指すことができるレジスタDEにポインタを取ります。どちらの場合でも、機能を実行する特定のファイルまたはディレクトリが指定されています。

そのようなパラメータを取ることができる機能は、「ファイルまたはサブディレクトリの削除」(機能4DH)、「ファイルまたはサブディレクトリの名前変更」(機能4EH)、「ファイルまたはサブディレクトリの移動」(機能4FH)、「ファイル属性の取得/設定」である。機能50H)、「ファイル日付と時刻の取得/設定」(機能51H)、「ファイルハンドルを開く」(機能43H)。これらはすべて、指定されたファイルまたはディレクトリに対して明らかな機能を果たします。