Content-Type: text/html; charset=Shift_JIS Page Title: Chapter 4 : DR-DOS System and Programmer's Guide (私訳) [Front][Prev Chapter][Next Chapter] [in English] ------------------------------------------------------------------------------- DR-DOS のシステムコール ------------------------------------------------------------------------------- 本セクションは DR-DOS システムファンクションの詳解を与えます。本セクションでは 利用の便をはかり、ファンクション仕様は番号順に整理されています。システムファン クションのカテゴリ別の紹介は 2.4 のシステムコール一覧に示されています。 いくつかのシステムコールはエラー情報を返し、システムコール記述中でそれについて 言及があるかもしれません。システムコールで返されるエラー情報の種別について、よ り広範な情報が Chapter 5 で提供されており、それを読んでエラーコードの全容を把握 することをおすすめします。 (訳注 : このドキュメントでは残念ながら、DR-DOS が実装しているファンクションコ ールのすべてを説明しているわけではありません。つまり文字どおりの意味で "Undocum ented" なファンクションが存在します。もっともカーネルソースは公開されているので 、それを読めばわかるのですが、しかし…) ●プログラム終了 (00h) Program Terminate 終了アドレスに制御を移します。 入力パラメータ AH 00h 戻り値 なし PSP に保存されたプログラム終了アドレス、Ctrl-Break アドレス、致命的エラーアドレ スを元に戻します。これらの値はエントリー時、プログラム終了のために保存されてい ます。 プログラムのロードと実行 (4Bh) コールの PSP 制御ブロック説明図 (Figure 4-6) を 参照してください。 すべてのバッファをフラッシュし、終了アドレスに制御を移します。ファイル長を変更 し、クローズしていないファイルのディレクトリ情報を、DR-DOS が正しく記録しないこ とに注意してください。本ファンクション呼び出しの前に、CS レジスタには、呼び出し 元プログラムの PSP セグメントのアドレスを入れておかねばなりません。 NOTE: 本ファンクションコールは新しい(訳注 : 要するに DOS 2.0 以降)プログラムで使う べきではありません。既存の(訳注 : 要するに DOS 1.x)プログラムのためのみにサポ ートされています。プロセス終了 (4Ch) が、この機能のためのより妥当なファンクショ ンコールです。 ●キーボード入力 (01h) Keyboard Input 標準入力デバイスから文字入力。 入力パラメータ AH 01h 戻り値 AL ASCII 文字、もしくは 00h(拡張 ASCII コードの先頭バイト) 呼び出し元の標準入力デバイスから一文字読み取り、その文字を標準入力に書き込み( エコー)、それから AL レジスタに返します。文字が読み取り状態でない場合は、呼び 出し元プロセスに戻る前にキーボード入力を待ちます。 キーボード入力が Ctrl-Break を読み取ったときは、INT 23h を実行します。呼び出し 元プロセスが拡張 ASCII コード文字を読み出したいときは、キーボード入力ファンクシ ョンを2回呼び出さねばなりません。キーボード入力が AL レジスタに 00h を返した場 合は、それに続くファンクションコールが拡張アスキーコード文字を返すことを示して います。 (訳注 : 拡張アスキーコード云々は PC/AT 互換機系の独自情報だと思う。というか AT の INT 16h キーボード BIOS がそういう仕様になっている。もっとも日本語とかの2バ イト文字を読み取る場合は、やっぱり文字コードを判別して2度呼びしないといけない のですが…) ●コンソール出力 (02h) Console Output 標準出力デバイスへの文字出力 入力パラメータ AH 02h DL ASCII 文字 戻り値 なし 呼び出し元プロセスの標準出力デバイスに文字を出力します。DL がバックスペース文字 (08h) の場合、コンソール出力ファンクションはカーソルを左にひとつ分移動させます 。(訳注 : コンソールドライバ側の仕様に依存します。たとえば標準出力がファイルに リダイレクトされている場合、ファイルにはバックスペースの文字コードがそのまま出 力されるだけです) Ctrl-Break を検出すると、文字出力完了後に INT 23h を実行します。 ●補助デバイス入力 (03h) Auxiliary Input 標準補助デバイスから 1 バイト読み込み 入力パラメータ AH 03h 戻り値 AL 入力された値 標準補助デバイスから次のバイトを読み取り、AL レジスタに返します。 ●補助デバイス出力 (04h) Auxiliary Output 標準補助デバイスに 1 バイト書き込み 入力パラメータ AH 04h DL 出力値 戻り値 なし DL レジスタの内容を標準補助デバイスに書き込みます。 ●プリンタ出力 (05h) Printer Output 標準プリンタデバイスに 1 文字出力 入力パラメータ AH 05h DL ASCII 文字 戻り値 なし DL レジスタの内容を標準プリンタデバイスに書き込みます。 ●直接コンソール入出力 (06h) Direct Console I/O 標準入力/出力デバイスに対する直接コンソール入出力 入力パラメータ AH 06h DL FFh(入力) ASCII 文字(出力) 戻り値 AL 入力パラメータの DL が FFh の場合、AS CII 文字もしくは 00h(拡張 ASCII コー ドの先頭バイト) DL レジスタの内容が FFh のとき、本ファンクションは標準入力から文字を読み取り、 ゼロフラグをクリア、そして AL レジスタに文字を返します。入力デバイスに文字がな い場合にはゼロフラグをセットし、AL レジスタに 00h を返します。 DL レジスタに FFh 以外の値が入っている場合、DL の内容は標準出力に書き込まれる文 字とみなされます。直接コンソール入出力ファンクションは、コンソールからの Ctrl-B reak や Ctrl-PrtSc をチェックしません。 呼び出し元プロセスが拡張 ASCII コード文字を読み出したいときは、直接コンソール入 出力ファンクションを2回呼び出さねばなりません。直接コンソール入出力が AL レジ スタに 00h を返した場合は、それに続くファンクションコールが拡張アスキーコード文 字を返すことを示しています。(訳注 : キーボード入力 (01h) 参照) ●エコーなし直接コンソール入力 (07h) Direct Console Input Without Echo 標準入力デバイスからエコーなしで直接コンソール入力 入力パラメータ AH 07h 戻り値 AL ASCII 文字もしくは 00h (拡張 ASCII コードの 先頭バイト) 呼び出し元プロセスの標準入力デバイスから 1 文字読み取り、AL レジスタに返します 。入力デバイスに文字がない場合、呼び出しプロセスに戻る前に文字入力を待ちます。 呼び出し元プロセスが拡張 ASCII コード文字を読み出したいときは、本ファンクション を2回呼び出さねばなりません。AL レジスタに 00h を返した場合は、それに続くファ ンクションコールが拡張アスキーコード文字を返すことを示しています。(訳注 : キー ボード入力 (01h) 参照) エコーなし直接コンソール入力ファンクションは、コンソールからの Ctrl-Break や Ct rl-PrtSc をチェックしません。 ●エコーなしコンソール入力 (08h) Console Input Without Echo 標準入力デバイスからのエコーなし文字入力 入力パラメータ AH 08h 戻り値 AL ASCII 文字もしくは 00h( 拡張 ASCII コードの先頭 バイト) 呼び出し元プロセスの標準入力から 1 文字読み取り、AL レジスタに返します。文字が 読みだし状態にない場合は、元プロセスに戻る前に文字を待ちます。 Ctrl-Break を検出した場合、INT 23h を実行します。呼び出し元プロセスが拡張 ASCII コード文字を読み出したいときは、本ファンクションを2回呼び出さねばなりません。A L レジスタに 00h を返した場合は、それに続くファンクションコールが拡張アスキーコ ード文字を返すことを示しています。(訳注 : キーボード入力 (01h) 参照) ●文字列出力 (09h) Print String 標準出力デバイスへの文字列送信 入力パラメータ AH 09h DS 文字列のセグメントアドレス DX 文字列のオフセットアドレス 戻り値 なし DS:DX で始まり、$ 文字 (24h) で終わる ASCII 文字列を標準出力デバイスに送ります 。文字列がバックスペース文字 (08h) を含む場合、カーソルを左にひとつ分移動させま す。(訳注 : コンソールドライバ側の仕様に依存します。コンソール出力 (02h) 参照 ) ユーザが Ctrl-Break を入力した場合、文字列をコンソールに出力後に INT 23h を実行 します。 (訳注 : $ 文字そのものは出力できません。もし $ 文字を表示したい場合には、別の ファンクションを使う必要があります) ●バッファコンソール入力 (0Ah) Buffered Console Input 標準入力デバイスから入力バッファに文字読み込み 入力パラメータ AH 0Ah DS バッファのセグメントアド レス DX バッファのオフセットアド レス 戻り値 なし 呼び出し元プロセスの標準入力デバイスから文字を読み取り、DS:DX レジスタで始まる アドレスの入力バッファに書き込みます。Figure 4-1 に入力バッファのフォーマットを 示します +-------------------+--------------------------------------------------------+ | オフセット | 内容 | +-------------------+--------------------------------------------------------+ |00h |MAX(バッファ内の最大文字数) | +-------------------+--------------------------------------------------------+ |01h |NCHARS(入力された文字数) | +-------------------+--------------------------------------------------------+ |02h |文字列 | +-------------------+--------------------------------------------------------+ | | | +-------------------+--------------------------------------------------------+ |MAX - 1 |ODh | +-------------------+--------------------------------------------------------+ 先頭バイト (MAX) は、バッファが保持できる最大文字数を指定します。DR-DOS は受け 取った文字数を 2 番目のバイト (NCHARS) にセットします。NCHARS にはキャリッジリ ターン終端文字 (0Dh) は含まれていません。入力デバイスから読み取られた文字は 3 番目のバイト(オフセット 02h)以降に書き込まれます。キャリッジリターン (0Dh) を 読み込んだとき、ファンクションはバッファへの書き込みを中止します。 入力バッファが MAX - 1 の文字で詰まったとき、キャリッジリターンが読み込まれるま で追加入力は無視され、ベル音を鳴らします。 Note: 文字入力時には DR-DOS の編集キーとコマンドラインヒストリが使えます。 ●標準入力ステータス検査 (0Bh) Check Standard Input Status 標準入力デバイスのステータス取得 入力パラメータ AH 0Bh 戻り値 AL FFh もしくは 00h(文字 がない場合) 標準入力デバイスに文字が用意されているときは、AL レジスタに FFh を返します。00h を返す場合は、文字が用意されていません。Ctrl-Break を検出したときは INT 23h を 実行します。 ●バッファを空にして文字入力 (0Ch) Character Input with Buffer Flush 先行入力バッファをフラッシュし、標準入力から文字読み込み 入力パラメータ AH 0Ch AL ファンクション番号 戻り値 AL 00h(入力ファンクション が実行されなかった場合) 標準入力デバイスの先行入力を破棄し、AL レジスタに書かれた番号のファンクションコ ールを呼び出します。以下の番号のシステムコールに処理を渡すことができます。 01H - キーボード入力 06H - 直接コンソール入出力 07H - エコーなし直接コンソール入力 08H - エコーなしコンソール入力 0AH - バッファコンソール入力 ●ディスクリセット (0Dh) Disk Reset 全ファイルバッファのフラッシュ 入力パラメータ AH 0Dh 戻り値 AX エラーコード 変更があったバッファの内容をすべてディスクに書き込んで、全ファイルバッファをフ ラッシュします。オープンしたままで、なおかつ長さが変更されているファイルのディ レクトリ情報は更新しません。(更新するにはファイルクローズ、もしくはファイルの コミット (68h) を使わねばなりません) 定義されたエラーコードは Chapter 5 を参照してください。 ●ディスク選択 (0Eh) Select Disk デフォルトドライブとするディスクの選択 入力パラメータ AH 0Eh DL ドライブ 戻り値 AL 最終ドライブの番号 本ファンクションは、DL で指定されたドライブが有効かまず判別し、それからデフォル トドライブとして選択します。ドライブ番号はゼロから始まり、0 が A、1 が B、以下 同様です。 AL はシステムの最終ドライブ番号を返します。たとえば、AL = 5 の場合、最終ドライ ブは E: です。COFIG.SYS ファイル中に LASTDRIVE= ステートメントが含まれ、そこで 最終物理ドライブより大きい値が指定されていない場合、AL の値は、初期化の際に発見 された最後の物理ドライブ番号です。(訳注 : たとえば CONFIG.SYS 中に LASTDRIVE=Z の指定がある場合、AL には 1Ah (26) が返されます。しかし A: から Z: までの全ドラ イブが有効であるとは必ずしもいえないわけです) ●FCB でファイルオープン (0Fh) Open File 入出力操作のためのファイルオープン 入力パラメータ AH 0Fh DS オープンされていない FCB のセグメン ト DX オープンされていない FCB のオフセッ ト 戻り値 AL 00h -- 成功 FFh -- 失敗 (未訳) ●FCB でファイルクローズ (10h) Close File 読み/書き処理後のファイルクローズ 入力パラメータ AH 10h DS オープンされている FCB のセグメント DX オープンされている FCB のオフセット 戻り値 AL 00h -- 成功 FFh -- ディレクトリが更新されていない (未訳) ●最初のエントリ検索 (11h) Search for First Entry 指定された FCB にマッチする最初のファイルを検索 入力パラメータ AH 11h DS オープンされていない FCB のセグメント DX オープンされていない FCB のオフセット 戻り値 AL 00h -- マッチしたファイルを発見 FFh -- マッチしたファイルは見つからない DS:DX で指定される未オープン FCB にマッチする最初のファイル名を、カレントディレ クトリで検索します。ファイル名には疑問符 ('?') を含めることができ、疑問符はその 位置にあるすべての文字とマッチします。呼び出し元プログラムが拡張 FCB を指定して いる場合、FCB プレフィクス中にあるアトリビュートバイトの内容を元にして検索を行 います。(拡張 FCB については、2.3.2 拡張 FCB を参照してください)Table 4-1 は アトリビュートバイト値の一覧です。(訳注 : 2.3.2 ファイルアトリビュートバイトも 参照のこと) マッチするファイルを発見しなかった場合、AL には FFh が返されます。実際のエラー 状況を判別するには、拡張エラーコード取得 (59h) ファンクションを使用してください 。 マッチするファイルを発見した場合、AL には 00h が返され、呼び出し元プログラムの ディスク転送アドレス (DTA) に情報が置かれます。この情報は、普通の FCB と 拡張 F CB のどちらが指定されているかによって異なります。 検索 FCB が普通の FCB である場合、呼び出し元 DTA の先頭バイトにマッチする FCB のドライブ番号をセットし、ドライブ番号は A が 1、B が 2、以下同様です。DR-DOS は、DTA 中の続く 32 バイトに、マッチファイルのディレクトリエントリをコピーしま す。 検索 FCB が拡張 FCB の場合、呼び出し元 DTA の先頭バイトには FFh がセットされま す。続く 5 バイトはゼロ、そしてアトリビュートとドライブ番号が続く 2 バイトへ、 検索 FCB からコピーされます。そして続く 32 バイトにマッチファイルのディレクトリ エントリがコピーされます。リターン時、呼び出し元 DTA は、検索 FCB と同じアトリ ビュートを持つ未オープンの拡張 FCB を含んでいます。 +-----------+----------------------------------------------------------------+ | ビット | アトリビュート | +-----------+----------------------------------------------------------------+ |0 |リードオンリーRead/Only | +-----------+----------------------------------------------------------------+ |1 |ヒドン(隠し)ファイルHidden | +-----------+----------------------------------------------------------------+ |2 |システムファイルSystem | +-----------+----------------------------------------------------------------+ |3 |ボリュームラベルVolume Label | +-----------+----------------------------------------------------------------+ |4 |サブディレクトリSubdirectory | +-----------+----------------------------------------------------------------+ |5 |アーカイブ(保存)ファイルArchive | +-----------+----------------------------------------------------------------+ アトリビュートバイトがゼロの場合、アトリビュートが何も設定されていない、もしく はリードオンリー、あるいはアーカイブ属性のセットされた、普通のファイルエントリ のみを検索します。ボリュームラベル、サブディレクトリ、ヒドン、システムファイル のエントリは返しません。 アトリビュートバイトがヒドン(ビット 1 をセット)、システムファイル(ビット 2 をセット)、サブディレクトリ(ビット 4 をセット)にセットされた場合、普通のファ イルすべてに加え、指定した(複数ビット指定可)アトリビュートにマッチするエント リすべてを検索します。ボリュームラベルを除くすべてのディレクトリエントリを見る には、アトリビュートバイトのビット 1,2,4 をセットします。 ビット 3 がセットされた場合、ディレクトリエントリのみを検索します。 ●次のエントリ検索 (12h) Search for Next Entry 以前の検索で指定した FCB にマッチする、次のファイルを検索 入力パラメータ AH 12h DS オープンされていない FCB のセグメント DX オープンされていない FCB のオフセット 戻り値 AL 00h -- マッチしたファイルを発見 FFh -- マッチしたファイルは見つからない 最初のエントリ検索ファンクションがあいまいファイル名のマッチを発見したあと、次 のマッチを本ファンクションで検索できます。あいまいファイル名は疑問符 ('?') を含 むファイル名です。入力パラメータと戻り値は最初のエントリ検索 (11h) ファンクショ ンと同じです。 マッチするファイルを発見しなかった場合、AL には FFh が返されます。実際のエラー 状況を判別するには、拡張エラーコード取得 (59h) ファンクションを使用してください 。 最初のエントリ検索と本ファンクションの間、もしくは本ファンクションを二度実行す るその間には、いかなるディスク処理も実行しないでください。これは DR-DOS が検索 FCB の予約領域に、検索続行に必要な情報を格納しているためです。検索ファンクショ ンを二度実行する間に入り込んだディスク処理が、この情報を上書きしてしまうでしょ う。 ●FCB でファイル削除 (13h) Delete File ディスクファイルの削除 入力パラメータ AH 13h DS オープンされていない FCB のセグメント DX オープンされていない FCB のオフセット 戻り値 AL 00h -- ファイルは削除された FFh -- マッチするディレクトリエントリがない (未訳) ●FCB でシーケンシャルリード (14h) Sequential Read ディスクファイルからレコードを逐次読み込み 入力パラメータ AH 14h DS オープンされている FCB のセグメント DX オープンされている FCB のオフセット 戻り値 AL 00h -- 成功 01h -- ファイルの終わり (EOF) に遭遇。データがレコー ドにない。 02h -- 1 レコードの読み取りに DTA の大きさが不十分。 DTA が小さすぎる。 03h -- ファイルの終わり (EOF) に遭遇。レコードは部分 的に読み込まれ、残りはゼロで埋められた。 (未訳) ●FCB でシーケンシャルライト (15h) Sequential Write ディスクファイルへレコードを逐次書き込み 入力パラメータ AH 15h DS オープンされている FCB のセグメント DX オープンされている FCB のオフセット 戻り値 AL 00h -- 成功 01h -- ディスクフル。処理はキャンセル。 02h -- DTA の大きさが不十分。処理はキャンセ ル。 (未訳) ●FCB でファイル作成 (16h) Create File ディスクファイルの作成 入力パラメータ AH 16h DS オープンされていない FCB のセグメント DX オープンされていない FCB のオフセット 戻り値 AL 00h -- オープン FFh -- 使用可能なディレクトリエントリがない 。 (未訳) ●FCB でファイルリネーム (17h) Rename File ディスクファイルのリネーム 入力パラメータ AH 17h DS 変更した FCB のセグメント DX 変更した FCB のオフセット 戻り値 AL 00h -- ファイルはリネームされた FFh -- ファイルがない、もしくはすでに同名の ファイルが存在。 (未訳) ●カレントディスク取得 (19h) Current Disk カレントデフォルトドライブ番号取得 入力パラメータ AH 19h 戻り値 AL カレントドライブ番号 現在省略ドライブの番号を返し、ドライブ番号は 0 が A、1 が B、以下同様です。 ●ディスク転送アドレス (DTA) 設定 (1Ah) Set Disk Transfer Address ディスク転送エリア (DTA) アドレスの設定 入力パラメータ AH 1Ah DS DTA のセグメント DX DTA のオフセット 戻り値 なし ディスク転送エリア (DTA) のアドレスを DS:DX で指定されるアドレスにセットします 。DTA をセットしない場合、DR-DOS は、PSP のオフセット 80h に位置した標準 DTA を 使います。(訳注 : この位置にはプログラム起動時のコマンドライン文字列が格納され ていますので、標準 DTA を使用した場合、コマンドライン文字列は失われます) 指定したオフセットと DTA セグメント終端の間の領域は、プログラムが利用する最大長 のレコードを収納するための、そして DR-DOS がディスク転送を確実に行えるための十 分な大きさがあるべきです。DR-DOS の FCB リードそしてライトのファンクションコー ル (14h, 15h, 21h, 22h, 27h, 28h) は、DTA セグメント終端を越えた、あるいはセグ メントの開始位置をまたいだデータのリードやライトは行いません。 ●FAT 情報 (1Bh) Allocation Table Address デフォルトドライブの情報取得 入力パラメータ AH 1Bh 戻り値 DS FAT-ID アドレスのセグメント BX FAT-ID アドレスのオフセット DX クラスタ数 AL クラスタあたりのセクタ数 CX 物理セクタの大きさ デフォルトドライブについての情報を返します。ファンクション終了時、DS:BX はデフ ォルトドライブのファイルアロケーションテーブル (FAT) 識別バイトを指しています。 DX はドライブのクラスタ数を格納しています。AL はクラスタあたりのセクタ数を格納 し、CX は物理セクタのサイズ(バイト数)を格納しています。 ●指定ドライブの FAT 情報 (1Ch) Allocation Table for Specific Drive 指定ドライブの情報取得 入力パラメータ AH 1Ch DL ドライブ番号 戻り値 DS FAT-ID アドレスのセグメント BX FAT-ID アドレスのオフセット DX アロケーションユニット数 AL アロケーションユニットあたりのセクタ数 CX 物理セクタの大きさ DL にドライブ番号が指定されることをのぞいて、ファンクション 1Bh と同じです。ド ライブ番号はゼロで始まり、0 がデフォルトドライブ、1 が A、2 が B、以下同様です 。(訳注 : 手元にある NEC の MS-DOS プログラマーズリファレンスには、AL に FFh が返された場合はエラーだと書いてありました) (おまけの訳注 : なんでファンクション 1Bh で「クラスタ」なのにこっちで「アロケ ーションユニット」になっているのだろう。原文でそうなっているので一応こうしとき ますが。うーん) ●デフォルトドライブのドライブパラメータブロック (DPB) 取得 (1Fh) Get Drive Parameter Block for Default Drive カレントドライブのディスクパラメータ取得 入力パラメータ AH 1Fh 戻り値 AL 00h -- 成功 FFh -- 無効なドライブ DS DPB アドレスのセグメント(成 功時) BX DPB アドレスのオフセット(成 功時) ファンクション 32h も参照してください。このファンクションで DOS DPB のフォーマ ットを示しています。 ●FCB でランダムリード (21h) Random Read ディスクファイルからレコードのランダム読み込み 入力パラメータ AH 21h DS オープンされている FCB のセグメント DX オープンされている FCB のオフセット 戻り値 AL 00h -- 成功 01h -- ファイルの終わり (EOF) に遭遇。データ無効。 02h -- DTA の大きさが不十分。処理はキャンセル。 03h -- ファイルの終わり (EOF) に遭遇、一部を読み込 み、残りはゼロで埋められた。 (未訳) ●FCB でランダムライト (22h) Random Write レコードをディスクファイルへランダム書き込み 入力パラメータ AH 22h DS オープンされている FCB のセグメント DX オープンされている FCB のオフセット 戻り値 AL 00h -- 成功 01h -- ディスクフル、書き込みキャンセル。 02h -- DTA の大きさが不十分、処理はキャンセ ル (未訳) ●FCB でファイルサイズ取得 (23h) File Size ファイルサイズ取得 入力パラメータ AH 23h DS オープンされていない FCB のセグメント DX オープンされていない FCB のオフセット 戻り値 AL 00h -- 成功 FFh -- マッチするエントリが見つからない (未訳) ●FCB のランダムレコード (RANDREC) 設定 (24h) Set Random Record Field ランダムレコードフィールドのファイル位置を設定 入力パラメータ AH 24h DS オープンされている FCB の セグメント DX オープンされている FCB の オフセット 戻り値 なし (未訳) ●割り込みベクタ設定 (25h) Set Vector 割り込みベクタテーブル設定 入力パラメータ AH 25h DS 割り込みルーチンのセグメント DX 割り込みルーチンのオフセット AL 割り込み番号(16 進) 戻り値 なし 呼び出し元プロセスが渡す、割り込み番号 AL の割り込みベクタテーブルを、DS:DX の アドレスにセットします。割り込みベクタ取得 (35h) の呼び出しによって、割り込みベ クタテーブルの内容を調査できます。 ●新規 PSP 作成 (26h) Create New Program Segment Prefix 入力パラメータ AH 26h DX セグメント番号 戻り値 なし (未訳) ●FCB でランダムブロックリード (27h) Random Block Read ディスクファイルから複数レコードのランダム読み込み 入力パラメータ AH 27h DS オープンされている FCB のセグメント DX オープンされている FCB のオフセット CX レコード数 戻り値 AL 00h -- 成功 01h -- ファイルの終わり (EOF) に遭遇。データ無効 。 02h -- DTA の大きさが不十分。処理はキャンセル。 03h -- ファイルの終わり (EOF) に遭遇、一部を読み 込み、残りはゼロで埋められた。 CX 読み込んだレコード数 (未訳) ●FCB でランダムブロックライト (28h) Random Block Write ディスクファイルへ複数レコードをランダム書き込み 入力パラメータ AH 28h DS オープンされている FCB のセグメント DX オープンされている FCB のオフセット CX レコード数 戻り値 AL 00h -- 成功 01h -- ディスクフル、書き込みキャンセル。 02h -- DTA の大きさが不十分、処理はキャンセ ル CX 書き込まれたレコード数 (未訳) ●ファイル名解析 (29h) Parse Filename 指定ファイル名を解析し FCB を初期化 入力パラメータ AH 29h DS コマンドラインポインタのセグメント SI コマンドラインポインタのオフセット ES オープンされていない FCB のセグメント DI オープンされていない FCB のオフセット AL ビットのマップ 戻り値 DS 解析済ファイル名の次にくる文字のセグメント SI 解析済ファイル名の次にくる文字のオフセット ES 値を設定された FCB のセグメント DI 値を設定された FCB のオフセット AL 00h -- ワイルドカード文字 ('?', '*') は未使用 01h -- ファイル名もしくは拡張子にワイルドカード使用 FFh -- 無効なドライブ指定 (未訳) ●日付取得 (2Ah) Get Date 現在のシステム日付取得 入力パラメータ AH 2Ah 戻り値 AL 曜日 (0-6) CX 年 (1980-2099) DH 月 (1-12) DL 日 (1-31) システムクロックに記録された曜日、年、月、日を返します。年を CX に、月を DH に 、日 を DL に返します。すべての戻り値は 2 進数です。日付計算の際、DR-DOS は月の 日数とうるう年かどうかを考慮します。 曜日は 0 から 6 までの番号付けをとっており、日曜日から始まります。有効年は 1980 年から 2099 年までです。有効月は 1 から 31 までの数で、該当月の日数と指定年がう るう年かどうかを考慮したものです。 日付クロックが次の日に進むと、日付は自動的に修正されます。 ●日付設定 (2Bh) Set Date システム日付の設定 入力パラメータ AH 2Bh CX 年 (1980-2099) DH 月 (1-12) DL 日 (1-31) 戻り値 AL 00h -- 日付有効 FFh -- 日付無効 システムの日付を設定します。入力時、CX には有効な年が、DH には有効な月が、DL に は有効な日が入っていなければなりません。 日付の設定に成功した場合は AL に 00h を返し、指定した日付が無効の場合は FFh を 返します。 有効年は 1980 年から 2099 年までです。有効月は 1 から 31 までの数で、該当月の日 数と指定年がうるう年かどうかを考慮したものです。 ●時刻取得 (2Ch) Get Time 現在のシステム時刻取得 入力パラメータ AH 2Ch 戻り値 CH 時 (0-23) CL 分 (0-59) DH 秒 (0-59) DL 100 分の 1 秒 (0-99) 時、分、秒、100 分の 1 秒のシステム時刻を24時間時計で返します。4 つの 8 ビッ ト量で時刻を返します。本ファンクションの戻り値を、プリント可能な書式へ容易に変 換、もしくはプログラムがどれだけの間動いているか算出するといった計算目的で使用 できます。 ●時刻設定 (2Dh) Set Time システム時刻設定 入力パラメータ AH 2Dh CH 時 (0-23) CL 分 (0-59) DH 秒 (0-59) DL 100 分の 1 秒 (0-99) 戻り値 AL 00h -- 時刻は有効 FFh -- 時刻は無効 24時間時計でシステム時刻を設定します。入力時、CH は時、CL は分、DH は秒、DL は 100 分の 1 秒を格納します。時刻要素に有効でないものがある場合、ファンクショ ン処理は終了し、AL に FFh を返します。時刻要素が有効で、時刻が正しく設定された 場合、AL に 00h を返します。 ●ベリファイフラグの設定 (2Eh) Set/Reset Verify Switch ディスク書き込み処理のベリファイフラグのセット/リセット 入力パラメータ AH 2Eh DL 00h AL 00h -- ベリファイ OF F 01h -- ベリファイ ON 戻り値 なし ベリファイが ON のとき、DR-DOS は現行アプリケーションが行うディスク書き込みをベ リファイ(照合)します。ベリファイフラグの状態取得にはファンクション 54h を使用 してください。 ●ディスク転送アドレス (DTA) 取得 (2Fh) Get Disk Transfer Address ディスク転送エリア (DTA) アドレス取得 入力パラメータ AH 2Fh 戻り値 ES 現在の DTA セグメン ト BX 現在の DTA オフセッ ト ES:BX に現在のディスク転送エリア (DTA) アドレスを返します。ディスク転送アドレス (DTA) 設定 (1Ah) ファンクションの呼び出しによって DTA アドレスを設定できます。D TA についての記述は、2.3.4 ディスク転送エリア (DTA) 中にあります。 ●バージョン番号取得 (30h) Get Version Number DR-DOS バージョン番号取得 入力パラメータ AH 30h 戻り値 AL メジャーバージョン番号 AH マイナーバージョン番号 BX 00h CX 00h AL レジスタに DR-DOS バージョン番号の上位部分が、AH レジスタに下位部分が返され ます。BX と CX は 00h に設定されます。現行バージョンの DR-DOS で返される値は、A L に 03h、AH に 1Fh です。(訳注 : この項の記述は古いバージョンのもののようです 。以下の訳注参照) (訳注 : この説明を信ずるならば、DR-DOS はバージョンとして 3.31 を返すことにな ります。DR-DOS 6 の時代には確かにそうでした。現行の DR-DOS 7.0 はバージョン番号 として AL に 06h、AH に 00h の値を返すはずです。このファンクションが返す値は SE TVER コマンドによりプログラム毎に設定可能です。SETVER に左右されない真のバージ ョン番号の取得には真のバージョン番号取得 (3306h) ファンクションを使用してくださ い) ●キーププロセス(常駐終了) (31h) Keep Process 現在実行中プロセスの(常駐)終了 入力パラメータ AH 31h AL 終了コード DX パラグラフ(16 バイト)単 位でのメモリ量 戻り値 なし 呼び出し元プロセスを終了しますが、DX で示されるパラグラフ数のメモリを残します。 メモリは現在の PSP の先頭から保持されます。 プロセスによってオープンされたファイルは、本ファンクション実行時にはクローズさ れません。 AL レジスタに渡された二進数のエラーコード(あるいは終了コード)は、子プロセスの 終了コード取得 (4Dh) ファンクションを通じて取り出すことができます。 ●ドライブパラメータブロック (DPB) 取得 (32h) Get DOS Drive Parameter Block 指定ドライブのディスクパラメータの詳細を取得 入力パラメータ AH 32h DL ドライブ番号(00h = デフォルト、01h = A:、以下略) 戻り値 AL 00h -- 成功 FFh -- 無効なドライブ DS DPB のセグメント(成功時) BX DPB のオフセット(成功時) 以下の表は DOS ドライブパラメータブロック (DPB) のフォーマットの記述です。 +-----------+------+--------------------------------------------------------+ |オフセット |サイズ| 説明 | +-----------+------+--------------------------------------------------------+ |00h |BYTE |ドライブ番号(例 00h=A:, 01h=B:) | +-----------+------+--------------------------------------------------------+ |01h |BYTE |デバイスドライバ内でのユニット番号 | +-----------+------+--------------------------------------------------------+ |02h |WORD |セクタ当たりのバイト数 | +-----------+------+--------------------------------------------------------+ |04h |BYTE |1 クラスタ内で使われる最大セクタ番号 | +-----------+------+--------------------------------------------------------+ |05h |BYTE |クラスタ番号をセクタ番号に変換するためのシフト回数 | +-----------+------+--------------------------------------------------------+ |06h |WORD |ドライブ先頭の予約セクタ数 | +-----------+------+--------------------------------------------------------+ |08h |BYTE |FAT の数 | +-----------+------+--------------------------------------------------------+ |09h |WORD |ルートディレクトリエントリの数 | +-----------+------+--------------------------------------------------------+ |0Bh |WORD |ユーザデータの含まれる最初のセクタ番号 | +-----------+------+--------------------------------------------------------+ |0Dh |WORD |最大クラスタ番号(データクラスタ数 + 1) | +-----------+------+--------------------------------------------------------+ |0Fh |WORD |FAT 当たりのセクタ数 | +-----------+------+--------------------------------------------------------+ |11h |WORD |最初のディレクトリセクタ番号 | +-----------+------+--------------------------------------------------------+ |13h |DWORD |デバイスドライバヘッダのアドレス | +-----------+------+--------------------------------------------------------+ |17h |BYTE |メディア ID バイト | +-----------+------+--------------------------------------------------------+ |18h |BYTE |ドライブにアクセスされたら 00h、されてなければ FFh | +-----------+------+--------------------------------------------------------+ |19h |DWORD |次の DPB へのポインタ | +-----------+------+--------------------------------------------------------+ |1Dh |WORD |書き込み時、空き領域を探しはじめるクラスタ | +-----------+------+--------------------------------------------------------+ |1Fh |WORD |ドライブの空きクラスタ数。FFFFh = 不明。 | +-----------+------+--------------------------------------------------------+ ●Ctrl-Break チェック状態設定/取得 (33h) Ctrl-Break Check Ctrk-Break チェック機構の状態取得/設定 入力パラメータ AH 33h AL 00h -- Ctrl-Break 状態取得 00h -- Ctrl-Break 状態設定 DL 00h -- Ctrl-Break チェック を OFF に設定 01h -- Ctrl-Break チェック を ON に設定 戻り値 DL 00h -- Ctrl-Break チェックは OFF である 01h -- Ctrl-Break チェックは ON である 現在の Ctrl-Break チェックの状態を設定もしくは取得できます。AL レジスタが 00h の場合、Ctrl-Break チェック機構の現在の状態を DL レジスタに返します。AL に 01h が格納されている場合、Ctrl-Break チェックは DL レジスタに渡される値によって設定 されます。 ●起動ドライブ取得 (3305h) Get Boot Drive システム起動ドライブの判別 入力パラメータ AX 3305h 戻り値 DL 起動ドライブ(1 = A: ...) 本ファンクションは DOS の内部スタックをまったく使用しませんので、いつでも呼び出 すことができます。 ●真のバージョン番号取得 (3306h) Get DR-DOS Version DR-DOS の(真の)バージョン番号取得 入力パラメータ AX 3306h 戻り値 BL メジャーバージョン番号 BH マイナーバージョン番号 DL 下位 3 ビットにリビジョン番号。その他のビットは予約済 みでゼロがセットされる。 DH 以下の値を組み合わせた DR-DOS バージョンフラグ DOSINROM (08h) -- DR-DOS は ROM 内にある。この値がない 場合は RAM にある。 DOSINHMA (10h) -- DR-DOS はハイメモリ (HMA) 内にある。 この値がない場合は基本メモリ内にある。 本ファンクションは、SETVER コマンドによって設定されたのではない、実際のバージョ ン番号を返します。ファンクション 30h を使った場合はそうでなく、戻り値は SETVER で変更可能です。 ●割り込みベクタ取得 (35h) Get Vector 指定した割り込みベクタのアドレス取得 入力パラメータ AH 35h AL 割り込み番号(16 進数) 戻り値 ES 割り込みルーチンアドレスのセグメント BX 割り込みルーチンアドレスのオフセット AL で指定される割り込み番号の、割り込みルーチンアドレスの CS:IP を ES:BX に返し ます。割り込みベクタの設定には割り込みベクタ設定 (25h) ファンクションを使用して ください。 ●ディスク残量取得 (36h) Get Disk Free Space ディスク残量情報の取得 入力パラメータ AH 36h DL ドライブ番号 戻り値 AX 1 クラスタ当たりのセクタ数 FFFFh -- 無効なドライブ番号 BX 使用可能なクラスタ残量 DX ドライブの総クラスタ数 CX 1 セクタ当たりのバイト数 指定ドライブの空き容量に関する情報を返します。DL にはドライブ番号を格納し、ドラ イブ番号は 0 が現在のドライブ、1 が A:、2 が B:、以下同様です。利用可能なクラス タの数を BX に、ドライブの総クラスタ数を DX に、セクタ当たりのバイト数を CX に 、クラスタ当たりのセクタ数を AX に返します。 ●国別情報設定 (38h) Set Country Dependent Information 国コードの設定 入力パラメータ AH 38h AL FFh DX FFFFh BX 国コード 戻り値 AX キャリーフラグがセットされてい る場合、エラーコード 現在の国コードを、BX レジスタで指定される国コードに変更します。有効な国コードは 以下の通りです。 001 アメリカ合衆国U.S.A 045 デンマークDenmark 002 カナダ(仏語)Canada (French) 046 スウェーデンSweden 003 南米S.America 047 ノルウェーNorway 007 ロシアRussia 049 ドイツGermany 031 オランダNetherlands 061 オーストラリアAustralia 032 ベルギーBelgium 081 日本Japan 033 フランスFrance 082 韓国Korea 034 スペインSpain 090 トルコTurkey 036 ハンガリーHungary 351 ポルトガルPortugal 039 イタリアItaly 358 フィンランドFinland 041 スイスSwitzerland 785 中近東Middle East 043 オーストリアAustria 972 イスラエルIsrael 044 イギリスUK ●国別情報取得 (38h) Get Country Dependent Information 国別情報の取得 入力パラメータ AH 38h AL FFh BX 情報を取得する国コード DS バッファのセグメント DX バッファのオフセット 戻り値 AX キャリーフラグがセットされている場合、 エラーコード DS:DX で指定されるメモリブロックに、Figure 4-2 で示される国別情報を返します。BX レジスタは要求する国を指定します。国番号 0 は現在の国別情報を返します。 +---------------+------------+------------------------------------------------+ | オフセット | 形式 | 内容 | +---------------+------------+------------------------------------------------+ |00h |word |日付フォーマット | +---------------+------------+------------------------------------------------+ |02h |5 bytes |通貨記号 | +---------------+------------+------------------------------------------------+ |07h |2 bytes |3桁 (1000) 単位のセパレータ記号 | +---------------+------------+------------------------------------------------+ |09h |2 bytes |小数点 | +---------------+------------+------------------------------------------------+ |0Bh |2 bytes |日付セパレータ記号 | +---------------+------------+------------------------------------------------+ |0Dh |2 bytes |時刻セパレータ記号 | +---------------+------------+------------------------------------------------+ |0Fh |byte |通貨形式 | +---------------+------------+------------------------------------------------+ |10h |byte |通貨表示桁 | +---------------+------------+------------------------------------------------+ |11h |byte |時刻形式 | +---------------+------------+------------------------------------------------+ |12h |dword |大文字変換呼び出しアドレス | +---------------+------------+------------------------------------------------+ |16h |2 bytes |データリストセパレータ記号 | +---------------+------------+------------------------------------------------+ |18h |10 bytes |(予約済) | +---------------+------------+------------------------------------------------+ 日付フォーマットは以下の通り。 0  M D Y - 米国標準 1  D M Y - ヨーロッパ標準 2  Y M D - 日本標準 通貨形式は以下の通り。 Bit 0  通貨記号が値より前にある場合、0 通貨記号が値の後ろにある場合、1 Bit 1  通貨記号と値の間に空白がない場合、0 通貨記号と値の間に空白がひとつある場合、1 時刻形式は以下の通り。 Bit 0  12 時間時計の場合、0 24 時間時計の場合、1 大文字変換呼び出しでは AL レジスタを以下のように利用します。 入力時の AL 大文字に変換する 80h 以上の ASCII コード 出力時の AL 大文字に変換された ASCII コード キャリーフラグがセットされている場合、AX レジスタはリターン時のエラーコードを格 納しています。エラーコードの定義については Chapter 5 を参照してください。 ●サブディレクトリ作成 (39h) Create a Subdirectory 指定パスの最深サブディレクトリ作成(MKDIR) 入力パラメータ AH 39h DS ASCIZ 文字列のセグメント DX ASCIZ 文字列のオフセット 戻り値 AX キャリーフラグがセットされている場 合、エラーコード DS:DX で示される ASCIZ 文字列でドライブとパス名を指定します。指定したパスの最深 部に新しいディレクトリを作成し、呼び出し元プロセスに戻ります。指定したパスのデ ィレクトリが存在しない場合、ディレクトリ構造に新しいディレクトリを作成はしませ ん。(訳注 : つまり、たとえば C:\foo\bar というディレクトリを作成する時に C:\fo o ディレクトリが存在しない場合、本ファンクションは失敗します。このような場合、 まず C:\foo ディレクトリを作成し、次に C:\foo\bar を作成、というようにファンク ションを二度にわけて実行することになります)本ファンクションは AX レジスタにエ ラーコード 3 もしくは 5 を返します。エラーコードの定義については Chapter 5 を参 照してください。 ●サブディレクトリ削除 (3Ah) Remove a Subdirectory 指定パスの最深サブディレクトリ削除(RMDIR) 入力パラメータ AH 3Ah DS ASCIZ 文字列のセグメント DX ASCIZ 文字列のオフセット 戻り値 AX キャリーフラグがセットされている場 合、エラーコード DS:DX レジスタで示される ASCIZ 文字列のディレクトリを、ディレクトリ構造から削除 します。カレントディレクトリは削除できません。 削除されるディレクトリが空でない、もしくはいずれかのプロセスによるアクセス状態 である場合はエラーコード 5 を返します。ASCIZ 文字列が無効なパスを指定している場 合はエラーコード 3 を返します。 ●カレントディレクトリ変更 (3Bh) Change Current Directory 指定 ASCIZ 文字列にカレントディレクトリ設定(CHDIR) 入力パラメータ AH 3Bh DS ASCIZ 文字列のセグメント DX ASCIZ 文字列のオフセット 戻り値 AX キャリーフラグがセットされている 場合、エラーコード DS:DX で示される ASCIZ 文字列に、カレントディレクトリを設定します。指定パスのデ ィレクトリが存在しない場合、キャリーフラグをセットし、エラーコード 3(パスが見 つからない)を AX レジスタに返します。 ●ファイル作成 (3Ch) Create a File ファイル(ハンドル)作成 入力パラメータ AH 3Ch DS ASCIZ 文字列のセグメント DX ASCIZ 文字列のオフセット CX ファイルアトリビュート(属性) 戻り値 AX キャリーフラグがクリアされている場合、16 ビッ トのファイルハンドル 新しいファイルを作成します。指定された名前のファイルがすでにある場合、書き込み 処理以前にファイル長は 0 に切り詰められます。ファイルが存在しない場合、ASCIZ 文 字列で指示されるディレクトリにファイルを作成し、ファイル属性を与えます(2.3.3 ファイルアトリビュートバイトを参照)。AX レジスタにファイルのハンドルを返します 。 キャリーフラグがセットされている場合、本ファンクションは AX レジスタにエラーコ ード 3, 4, もしくは 5 を返します。エラーコード 5 アクセス拒否 (Access Denied) は指定ディレクトリが満杯、もしくは同じ名前のファイルが存在し、そのファイルにリ ードオンリー指定がされていることを示しています。エラーコードの定義に関しては Ch apter 5 を参照してください。ファイルアトリビュートの変更にファイルモード変更 (4 3h) が使えることに注目してください。 ●ファイルオープン (3Dh) Open a File Handle 指定 ASCIZ 文字列にマッチするファイル(ハンドル)をオープン 入力パラメータ AH 3Dh DS ASCIZ 文字列のセグメント DX ASCIZ 文字列のオフセット AL アクセスコード 戻り値 AX ハンドル、もしくはエラーコード(キャ リーフラグがセットされている場合) ASCIZ で指定されたディレクトリと名前を持つファイルを開きます。通常ファイルもヒ ドン(隠し)ファイルも開くことができます。デバイス名はコロン (':') で終了しませ ん。 入力時、DS:DX はオープンするファイルのドライブ、パス、ファイル名を含む ASCIZ 文 字列を指定します。AL レジスタはファイルがオープンされるモードを定義します。 リターン時、キャリーフラグがセットされていない場合、以降のリード/ライト処理に 使うことになる 16 ビットのファイルハンドルが返されます。キャリーフラグがセット されている場合、AX に拡張エラーコードが返され、ファンクションコールの失敗理由が 示されます。拡張エラーコードは以下のいずれかひとつです。 o エラーコード 2 -- ファイルが見つからない o エラーコード 4 -- ファイルハンドルがない(オープンしているファイルが多すぎ る) o エラーコード 5 -- アクセス拒否 o エラーコード 12 -- 無効なアクセスコード ファンクションが成功した場合、ファイルのリード/ライトポインタをファイル先頭バ イトにセットし、ファイルのレコードサイズを 1 バイトにセットします。ファイルポイ ンタ移動(シーク) (42h) でポインタを移動できます。ファイルモード変更 (43h) で ファイルアトリビュートの取得や設定ができます。ファイルアトリビュートは 2.3.3 フ ァイルアトリビュートバイトにて説明しています。 入力時、AL レジスタに与えられるコンビネーション値によって、ファイルアクセスの広 範な制御を行います。アクセスコードは AL 内で 4 つのフィールドにわけて定義されて います。インヘリタンス(継承)フラグ(1 ビット)、シェアリング(共有)モード(3 ビット)、予約フィールド(1 ビット)、そしてアクセスフィールド(3 ビット)です 。 +-----------------------------+----+----+----+----+----+----+----+----+ | ビット |7 |6 |5 |4 |3 |2 |1 |0 | +-----------------------------+----+----+----+----+----+----+----+----+ | 内容 |I |S |R |A | +-----------------------------+----+----+----+----+----+----+----+----+ インヘリタンスフラグ (I : bit 7) は、ファイル(ハンドル)がプライベート (I=1) かどうか、もしくは子プロセスにも引き継がれる (I=0) かどうかを指示します。 アクセスフィールド (A : bit 2-0) は、ファイルに行われうる操作を、以下の3つのう ちのひとつの指定通りに制限します。 o 00h -- リードのみのためにオープン o 01h -- ライトのみのためにオープン o 02h -- リードとライトのためにオープン シェアリングモード制御 (S : bit 6-4) は、ファイルがオープンしている間、他のプロ セスが所持するそのファイルへのアクセス権を制御し、以下の 5 つのうちのひとつに従 います。 o 000 -- コンパチビリティ(互換) o 001 -- リード/ライト拒否 o 010 -- ライト拒否 o 011 -- リード拒否 o 100 -- 拒否なし 上記の 3 ビットを使えるようにするには SHARE がロードされていなければならないこ とに注意してください。(やや無責任な訳注 : SHARE.EXE が常駐しているかどうかは I NT 2Fh, AX=1000h で調べることができます。AX に 1000h を入れて INT 2Fh を実行し 、AL に FFh が返ってきた場合、SHARE がインストールされています。詳しいことは In terrupt List あたりで調べてください) ファイル共有には、関係する全プロセス間での厳密な協調操作が要求されます。もしい ずれかのプロセスが何らかのアクセスレベルを拒否するモードでファイルをオープンし た場合、他のプロセスによるそれ以降の、そのアクセスレベルを必要とするファイルオ ープン要求は失敗します。そのうえ、すでに他のプロセスでうまくいっているシェアリ ングモードでファイルをオープンしようとしても、必ず失敗してしまいます。 シェアリングモードつきでファイルをオープンすることの影響を肝に銘じておくべきで しょう。特に、ファンクションが失敗する原因となる以下のような状況に注意してくだ さい。 o ファイルがすでにコンパチビリティモードでオープンしている o ファイルがすでにリード/ライト拒否モードでオープンしている o ライト拒否で、ライトもしくはリード/ライトアクセスを要求 o リード拒否で、リードもしくはリード/ライトアクセスを要求 拒否なしシェアリングモードは他プロセスへの制限をまったくかけません。 NOTE : ATTRIB コマンドを使ってリードオンリーに設定したファイルはいくつのプロセ スからでも、コンパチビリティモード(リードアクセス)、拒否なし(リードアクセス )、あるいはライト拒否(リードアクセス)でオープンできます。コンパチビリティモ ードでのオープンがファイルシェアリングコンフリクトのために失敗した場合、致命的 エラーが生成されます。エラーコードは「ドライブの準備ができていない (02h)」で、 ファンクション 59h は「ファイルシェアリングコンフリクト (20h)」を返します。 (訳注 : ファイルシェアリングモードについての説明が個人的にいまいちわからなかっ たので、MS-DOS 方面のマニュアルだのを見てみると、だいたい以下のような感じでした 。 o コンパチビリティ(互換)モードは要するに、ネットワーク未対応だった DOS バー ジョン 2.x 時代と互換性のあるモードである。このモードでオープンされているフ ァイルは、それ以外の(「拒否なし」も含む)シェアリングモードでオープンでき ない。 o 同様に、コンパチビリティ以外の(「拒否なし」も含む)モードでオープンされて いるファイルは、コンパチビリティモードでオープンできない。 o ただし、ファイルアクセスフィールドが「リードのみのためのオープン」になって いる場合、コンパチビリティモードでのファイルオープンは「ライト拒否」と同等 だと見なされる。つまりコンパチビリティモードでも、リードオンリーモードでオ ープンすればファイルの共有が可能である。 o リード/ライト拒否モードでオープンされているファイルは、そのファイルハンド ルがクローズされない限り、どのシェアリングモードでもオープンできない。また 、すでに別のシェアリングモードでオープンされているファイルをリード/ライト 拒否モードでオープンした場合、先にオープンしたプロセスもそのファイルに対し てリード/ライトができなくなる。 自分で実際に確認してないので、どの程度に正しいのかはよくわかりません。すまんす 。) ●ファイルクローズ (3Eh) Close a File Handle 指定されたファイルハンドルのクローズ 入力パラメータ AH 3Eh BX オープン、もしくは作成されたファイル のハンドル 戻り値 AX キャリーフラグがセットされている場合 、エラーコード 指定されたファイルハンドルをクローズし、そのファイルに関連する内部バッファの内 容をディスクに書き出し、ディレクトリを更新します。キャリーフラグがセットされて いる場合、無効なファイルハンドルが指定されていることを示すエラーコード 6 を AX レジスタに返します。 NOTE : 使いおわったファイルは必ずクローズするようにしてください。 ●ファイルリード (3Fh) Read from a File or Device ファイルハンドルから、指定バイト数をバッファにリード 入力パラメータ AH 3Fh BX ファイルハンドル DS バッファアドレスのセグメント DX バッファアドレスのオフセット CX 読み込むバイト数 戻り値 AX キャリーフラグがセットされていない場合 、読み込んだバイト数 CX で指定されるバイト数を、ファイルから、DS;DX で示されるバッファに転送します。 リターン時、キャリーフラグがセットされている場合、AX はエラーコード 5 もしくは 6 を格納しています。エラーコードの定義は Chapter 5 を参照してください。 ファンクションコールが成功した場合、キャリーフラグはセットされず、AX はファイル もしくはデバイスから読み込んだバイト数を格納しています。ファンクションコールが デバイスからの読み込みに使われた場合、CX で指定されるより少ないバイト数が読み込 まれるように、デバイスの能力に制限がかけられます。 ファイルからの読み込みの時、AX の値が CX で指定された値より小さい場合は、プログ ラムがファイルの終端 (EOF) まで読み上げたことを示しています。値 0 はファイル終 端から読みはじめようとしたことを示しています。 (念のための訳注 : つまりエラーなしでファンクションが終了し、AX < CX の場合、も し読み込んでいたのが正しくファイルからなら、ファイルの終わりまで読み込んだこと になります。しかし、たとえば標準入力などのキャラクタデバイスからだった場合、必 ずしも入力がそこで全部終わったとは限りません。たとえばキーボード入力を読み込む 場合、改行入力があった時点でファンクションは終了し、AX にはその時点までの文字数 が返されることになります。継続入力が本当にないか調べるには、たぶんもう一度ファ イルリードを発行し、AX が 0 か(もしくはエラーか)どうか調べる必要があるでしょ う。もっとも、ファイル相手でもそうした方がいいような気もしますが…) ●ファイルライト (40h) Write to a File or Device バッファから、指定したバイト数をファイルハンドルにライト 入力パラメータ AH 40h BX ファイルハンドル DS バッファアドレスのセグメント DX バッファアドレスのオフセット CX 書き込むバイト数 戻り値 AX キャリーフラグがセットされていない場合 、書き込んだバイト数 DS:DX で示されるバッファから、CX で指定されるバイト数を、BX で示されるファイル ハンドルに転送します。 リターン時、キャリーフラグがセットされていた場合、AX にエラーコード 5 もしくは 6 を返します。エラーコード 5 はアクセス拒否を示し、エラーコード 6 は無効なファ イルハンドルを示します。キャリーフラグがセットされていない場合、実際に書き込ん だバイト数を AX に返します。(訳注 : AX と CX の値が異なる場合、ディスクフルの 可能性があります。MS-DOS 方面の文献によると、ディスクフル時にキャリーフラグはセ ットされません。DR-DOS でもおそらくそうなんでしょう)CX レジスタが 0 の場合、フ ァイルは、現在のファイルポインタの位置に切り詰められます。(訳注 : ファイルポイ ンタがファイル終端よりも後方にある時に CX = 0 でファイルライトを行った場合、フ ァイルサイズがその地点まで伸ばされます。ファイルポインタ移動 (42h) も参照のこと ) ●ファイル削除 (41h) Erase a File from Directory 指定ファイルをディレクトリから削除 入力パラメータ AH 41h DS ASCIZ 文字列のセグメント DX ASCIZ 文字列のオフセット 戻り値 AX キャリーフラグがセットされている場 合、エラーコード ファイル名に結び付いたディレクトリエントリを削除します。DS:DX で示される ASCIZ 文字列のいかなる部分にも、疑問符 ('?') とアスタリスク ('*') のワイルドカード文 字は使えません。 リードオンリーファイルは削除できません。リードオンリーファイルを削除するには、 まずファイルモード変更 (43h) ファンクションを使用してファイルアトリビュートを変 更しなければなりません。 リターン時、キャリーフラグがセットされている場合、ファイルが見つからない、もし くはアクセス拒否を示すエラーコード 2 もしくは 5 を AX に返します。 ●ファイルポインタ移動(シーク) (42h) Move File Read/Write Pointer ファイルリード/ライトポインタ移動 入力パラメータ AH 42h CX バイト単位での移動オフセット(上位) DX バイト単位での移動オフセット(下位) AL 移動起点 0 -- ファイル先頭から 1 -- 現在位置から 2 -- ファイル終端 (EOF) から BX ファイルハンドル 戻り値 DX キャリーフラグがセットされていない場合、新しいポイン タ位置(上位) AX キャリーフラグがセットされていない場合、新しいポイン タ位置(下位) キャリーフラグがセットされている場合、エラーコード AL に渡された値で指定した方法により、リード/ライトポインタを移動します。入力時 、CX:DX にはポインタの移動距離を格納します。リターン時にキャリーフラグがセット されていない場合、DX:AX は新しいポインタ位置を格納しています。DX が値の上位部分 を格納しています。キャリーフラグがセットされている場合、AX にエラーコード 1 も しくは 6 を返します。エラーコードの定義は Chapter 5 を参照してください。 AL レジスタには以下の値のうちひとつをセットしてください。 +--+--------------------------------------------------------------------------+ |0 |ファイルの先頭から、CX:DX に格納されるバイト数ぶん、ポインタを動かす | +--+--------------------------------------------------------------------------+ |1 |現在位置から、CX:DX のオフセットを加えた位置へ、ポインタを動かす | +--+--------------------------------------------------------------------------+ |2 |ファイル終端 (EOF) から、指定されたオフセットを加えた位置へ、ポインタを動 | | |かす | | |この方法は、ファイルサイズの判定に使用することができます | +--+--------------------------------------------------------------------------+ ●ファイルモード変更 (43h) Change File Mode ファイルアトリビュートもしくはパスワード変更 入力パラメータ AH 43h DS ASCIZ 文字列のセグメント DX ASCIZ 文字列のオフセット CX ファイルアトリビュート (AL = 1) パスワードモード (AL = 3) AL 0 -- アトリビュート取得 1 -- アトリビュート設定 2 -- パスワードモード取得 3 -- パスワードモード設定 戻り値 AX キャリーフラグがセットされている場合、エラーコード CX キャリーフラグがセットされていない場合、 入力時の AL が 0 だったなら、ファイルの現在のアトリビュ ート、 入力時の AL が 2 だったなら、パスワードモード 本ファンクションは: o ASCIZ 文字列で指定されるファイルのアトリビュートを取得、もしくは設定します 。 o ファイルのパスワードモードを取得、もしくは設定し、新規パスワードを割り当て ます。 入力時に AL が 1 の場合、ファイルアトリビュートを CX で指定されるものに変更しま す。リターン時、AL に 0 が格納され、なおかつキャリーフラグがセットされていない 場合、現在のファイルアトリビュートが CX に返されます。DOS のファイルアトリビュ ートバイトは 2.3.3 ファイルアトリビュートバイトにて記述されています。 Notes: リードオンリー (01h)、ヒドン (02h)、システム (04h)、アーカイブ (20h) ビットのみ が変更可能です。ボリューム、サブディレクトリ属性は本ファンクションコールで変更 できません。 入力時に AL が 3(パスワードモード設定)の場合、ファイルのパスワードモードが変 更され、これは任意ですが、新規のパスワードが割り当てられます。CX 中の以下のビッ トがパスワード制御に使用されます。 +-------+--+--+--+--+------+------+------+--+--+--+--+--+--+--+--+--+ |ビット |15|14|13|12|11 |10 |9 |8 |7 |6 |5 |4 |3 |2 |1 |0 | +-------+--+--+--+--+------+------+------+--+--+--+--+--+--+--+--+--+ | 内容 |PW|0 |0 |0 |R |W |E |D |R |W |E |D |R |W |E |D | +-------+--+--+--+--+------+------+------+--+--+--+--+--+--+--+--+--+ | 区分 | | | | |World |Group |Owner | +-------+--+--+--+--+------+------+------+--+--+--+--+--+--+--+--+--+ PW が 1 の場合、そのファイルもしくはディレクトリに、新規のパスワードが割り当て られます。パスワードは現行 DTA アドレスの先頭 8 バイトが使われます(訳注 : 原文 は "the current DMA address" になってました。たぶん DTA のことだと思う…)。ビ ット R、W、E、D は、ファイルのリード(R)、ライト(W)、実行(E)、削除(D)アクセスを パスワードで制御するかどうかを指定します。ビット E は FlexOS との互換性のために サポートされ、ビット R と連動して扱われます。DR-DOS の以前のリリースではオーナ ー ID とグループ ID はサポートされておらず、そのためパスワードモード設定の際は 、(world, group, owner の)3つすべてのビットフィールドに同じアクセス制限値を 設定すべきです。 R, W, D のビットは、ファイルやディレクトリに対し、三段階のパスワード保護を提供 します。 +--+--------------------------------------------------------------------------+ |R |保護の最高レベルであり、パスワード発行までは誰からのファイルリードも禁じる| | |。 | +--+--------------------------------------------------------------------------+ |W |その次の保護レベル。ファイルは表示可能だが、パスワードなしには変更できない| | |。編集、コピー、リネーム、削除を制限する。 | +--+--------------------------------------------------------------------------+ |D |保護の最下レベル。ファイルは表示、変更可能だが、削除もしくはリネームにはパ| | |スワードが必要。 | +--+--------------------------------------------------------------------------+ キャリーフラグがセットされている場合、AX に 2、3、もしくは 5 を返します。エラー コードの定義に関しては Chapter 5 を参照してください。 ●デバイス入出力制御 (IOCTL) (44h) Device I/O Control キャラクタデバイスやブロックデバイスからの入出力情報を取得、もしくは設定します 。行われる処理は、入力時に AL レジスタに与えられる内容に依存します。 +-----+-----------------------------------------------------------------------+ |AL の| 処理内容 | | 値 | | +-----+-----------------------------------------------------------------------+ |00h |デバイス情報取得 | +-----+-----------------------------------------------------------------------+ |01h |デバイス情報設定 | +-----+-----------------------------------------------------------------------+ |02h |キャラクタデバイスからコントロール文字列受信 | +-----+-----------------------------------------------------------------------+ |03h |キャラクタデバイスへコントロール文字列送信 | +-----+-----------------------------------------------------------------------+ |04h |ブロックデバイスからコントロール文字列受信 | +-----+-----------------------------------------------------------------------+ |05h |ブロックデバイスへコントロール文字列送信 | +-----+-----------------------------------------------------------------------+ |06h |デバイスが入力準備をできているかどうか、直接チェックすることをアプリケ | | |ーションに許可 | +-----+-----------------------------------------------------------------------+ |07h |デバイスが出力準備をできているかどうか、直接チェックすることをアプリケ | | |ーションに許可 | +-----+-----------------------------------------------------------------------+ |08h |ブロックデバイス上のメディアがリムーバブル(交換可能)かどうかチェック | +-----+-----------------------------------------------------------------------+ |09h |デバイスがネットワーク接続かどうか判別 | +-----+-----------------------------------------------------------------------+ |0Ah |ファイルハンドルがローカルデバイスを参照しているか、それともネットワー | | |クデバイスを参照しているかチェック | +-----+-----------------------------------------------------------------------+ |0Bh |シェアリング・リトライとロックリソースコンクリフトの制御 | +-----+-----------------------------------------------------------------------+ |0Ch |キャラクタデバイスへのジェネリック IOCTL -- コードページ切り替えのサポ | | |ート | +-----+-----------------------------------------------------------------------+ |0Dh |ブロックデバイスへのジェネリック IOCTL -- デバイスドライバにブロックデ | | |バイスのファンクション実行を要求することをアプリケーションに許可 | +-----+-----------------------------------------------------------------------+ |0Eh |論理ドライブマップ取得 -- ひとつのブロックデバイスに複数の論理ドライブ | | |が割り当てられているか、使用される最終ドライブはどれかのチェック | +-----+-----------------------------------------------------------------------+ |0Fh |論理ドライブマップ設定 -- ブロックデバイス上で使う次の論理ドライブ番号 | | |を設定 | +-----+-----------------------------------------------------------------------+ |10h |デバイスドライバが、指定した IOCTL ファンクションをサポートしているかど| | |うか判別 | +-----+-----------------------------------------------------------------------+ |11h |与えられたドライブが、指定した IOCTL ファンクションをサポートしているか| | |どうか判別 | +-----+-----------------------------------------------------------------------+ 各処理の入力および戻り値の完全な記述は Appendix A. デバイス入出力制御(IOCTL) 中 にあります。 ●ジェネリック IOCTL 照会(キャラクタデバイス) (4410h) Query Generic IOCTL キャラクタデバイスがジェネリック IOCTL をサポートしているか判別 入力パラメータ AX 4410h BX デバイスハンドル CH カテゴリコード CL ファンクションコード 戻り値 AX キャリーフラグがクリアされている場合、フ ァンクションは成功 AX = 000h ならば IOCTL サポート キャリーフラグがセットされている場合、エ ラー AL = 01h ならば IOCTL は使用不能 ●ジェネリック IOCTL 照会(ブロックデバイス) (4411h) Query Generic IOCTL ブロックデバイスがジェネリック IOCTL をサポートしているか判別 入力パラメータ AX 4411h BL ドライブ番号(訳注 : 0 = デフォルト、1 = A:、 2 = B: ...) CH カテゴリコード CL ファンクションコード 戻り値 AX キャリーフラグがクリアされている場合、ファン クションは成功 AX = 000h ならば IOCTL サポート キャリーフラグがセットされている場合、エラー AL = 01h ならば IOCTL は使用不能 ●ファイルハンドル複製 (45h) Duplicate a File Handle すでに存在するファイルハンドルを複製 入力パラメータ AH 45h BX ファイルハンドル 戻り値 AX キャリーフラグがセットされてい ない場合、新しいファイルハンド ル 入力時に BX に格納されたファイルハンドルの複写を返します。複写したハンドルを使 って、クローズと再オープンのオーバヘッドなしにファイルのディレクトリエントリを 更新できます。一例として、複写したハンドルのファイルクローズ (3Eh) はバッファフ ラッシュとディレクトリエントリ更新を発生させ、その一方で元のファイルハンドルは 読み書きオープン状態を維持しています。複写ハンドルは同じディレクトリの、同じフ ァイルに連動しています。どちらかのハンドルのリード/ライトポインタをファイルリ ード (3Fh)、ファイルライト (40h)、ファイルポインタ移動(シーク) (42h) で動かし た場合、もう一方のファイルハンドルのポインタも移動します。 リターン時、キャリーフラグがセットされていた場合、AX にエラーコード 4 もしくは 6 を返します。エラーコード 4(ファイルハンドル不足)はオープンされているファイ ル数がシステムの制限を超えたことを示します。エラーコード 6 は無効なファイルハン ドルを示します。 ●ファイルハンドル強制二重化 (46h) Force a Duplicate of a Handle 二重のファイルハンドルを、強制的にすでにあるファイルハンドルの同一入力とし て使用 入力パラメータ AH 46h BX すでに存在するファイルハンド ル CX 第二ファイルハンドル 戻り値 AX キャリーフラグがセットされて いる場合、エラーコード CX のファイルハンドルを、BX に格納されるハンドルと同じファイルに強制的に関連付 けます。CX に渡された、すでに存在するファイルハンドルがオープンしたファイルに関 連付けられている場合、本ンファンクションは強制二重化を行う前にそのファイルをク ローズします。どちらかのハンドルのリード/ライトポインタをファイルリード (3Fh) 、ファイルライト (40h)、ファイルポインタ移動(シーク) (42h) で動かした場合、も う一方のファイルハンドルのポインタも移動します。 本ファンクションは入出力のリダイレクトに使用できます。 (訳注 : なんかいまいちうまく訳せなかったので、罪滅ぼしもかねて、標準出力をリダ イレクトする手順を例として書いてみます。 1.リダイレクト先のファイルをオープン、もしくは作成。 2.標準出力のハンドル (1) を複製し、複製したハンドルを保存しておく。 3.BX にリダイレクト先ファイルの、CX に標準出力の (1) ハンドルを入れ、強制二重 化ファンクション実行 4.この時点で標準出力はリダイレクトされている。標準出力ハンドルへの書き込みは リダイレクト先ファイルに出力される。 5.リダイレクトの必要がなくなったら標準入力を元に戻す。BX に 2. で保存しておい たハンドル、CX に標準出力 (1) のハンドルを入れ、強制二重化ファンクション実 行。 6.リダイレクト先のファイルハンドルと、2. で保存しておいたハンドルをクローズ。 C言語のライブラリで言えば、ファイルハンドル複製 (45h) が dup に、ファイルハン ドル強制二重化 (46h) が dup2 に相当します) ●カレントディレクトリ取得 (47h) Get Current Directory 指定ドライブのカレントディレクトリのフルパス名取得 入力パラメータ AH 47h DL ドライブ番号(0 = デフォルト、1 = A:、 2 = B:、以下同様) DS パス名のセグメント SI パス名のオフセット 戻り値 AX キャリーフラグがセットされている場合、 エラーコード DL で指定されたドライブのカレントディレクトリのフルパス名を、DS:SI で示される 6 4 バイトのユーザメモリに書き込みます。パス名には、ドライブ名や先頭のバックスラ ッシュ(円記号)を含まず、00h で終わります。 DL が正しいドライブ番号を含まない場合、キャリーフラグをセットし、エラーコード 1 5(無効なドライブ指定)を AX レジスタに返します。 ●メモリ割当 (48h) Allocate Memory 指定パラグラフ数のメモリを呼び出し元プロセスに割り当て 入力パラメータ AH 48h BX パラグラフ数 戻り値 AX 割り当てたメモリブロックのセグメント キャリーフラグがセットされている場合はエラー コード BX 使用可能なメモリブロックの(訳注 : パラグラ フ単位での)最大サイズ(エラー時) 要求されたパラグラフ(16 バイト)数のメモリを割り当てます。BX は要求パラグラフ 数を格納します。 リターン時、ファンクションコールが成功した場合、AX は割り当てたメモリブロックの ポインタを格納しています。失敗した場合、AX はエラーコード 7 もしくは 8 を格納し 、BX は使用可能なメモリの最大サイズをパラグラフ単位で格納します。 エラーコードの定義については Chapter 5 を参照してください。 ●割当メモリ解放 (49h) Free Allocated Memory 指定メモリを開放して、再び割り当てらてるようにする 入力パラメータ AH 49h ES メモリブロックのセグメント 戻り値 AX キャリーフラグがセットされてい る場合、エラーコード 指定メモリを開放して、再割り当てできるようにします。入力時、ES は開放しようとす るメモリブロックのセグメントアドレスを格納します。 戻り値はありません。キャリーフラグがセットされている場合、エラーコード 7 もしく は 9 を AX に返します。エラーコードの定義については Chapter 5 を参照してくださ い。 ●割当メモリサイズ変更 (4Ah) Modify Allocated Memory Blocks 入力パラメータ AH 4Ah BX パラグラフ数 ES メモリブロックのセグメント 戻り値 AX キャリーフラグがセットされている場合、エラー コード BX 使用可能なメモリブロックの最大サイズ(エラー 時) メモリブロック配置を、指定のサイズに変更します。入力時、ES は割当済みメモリブロ ックのセグメントアドレスを格納し、BX は要求するメモリブロックサイズをパラグラフ (16 バイト)単位で格納します。DR-DOS は BX の内容にしたがい、割り当て済みメモ リブロックのサイズを増加、もしくは減少させます。 DR-DOS が割当済みブロックのサイズを大きくできない場合、サイズ変更可能な最大ブロ ックサイズを BX に返します。キャリーフラグがセットされている場合、エラーコード 7, 8 もしくは 9 を AX に返します。エラーコードの定義については Chapter 5 を参照 してください。 (訳注 : BX のパラグラフ数だけ増減するのではなく、BX のパラグラフ数そのものに変 更する、という点に注意してください。また、C言語ライブラリの realloc などと異な り、メモリブロックの起点は移動されません。したがって、たとえばサイズ変更するメ モリブロックの直後のメモリがすでに割り当てられている場合、他の位置に空きメモリ がどれだけあってもサイズ増加は失敗します。) ●プログラムのロードと実行 (4Bh) Load and Execute プログラムをメモリにロード 入力パラメータ AH 4Bh AL サブコード ES ロードパラメータブロック (LPB) のセグメント BX ロードパラメータブロック (LPB) のオフセット DS ASCIZ 文字列のセグメント DX ASCIZ 文字列のセグメント 戻り値 AX キャリーフラグがセットされている場合、エラーコ ード DS:DX で示される ASCIZ 文字列は、ロードするファイルの名前とファイル型(訳注 : たぶん拡張子のことだと思う)を含んでいなければなりません。ドライブとパスは任意 です。(訳注 : 環境変数 PATH によるファイルサーチは行いませんので、カレントディ レクトリ以外のプログラムを実行する場合はパスを指定する必要があるでしょう) DR-DOS は使用可能なメモリをすべて現在のプログラムに割り当ててしまっているため、 ファイルのロードにじゅうぶんなだけのメモリを開放しなければなりません。本ファン クション実行の前に、割当メモリサイズ変更 (4Ah) ファンクションを使用して、割り当 てメモリを現行プログラムの最低要求量に減らしてください。 ES:BX で指定されるロードパラメータブロック (LPB) のフォーマットは、それを使うフ ァンクションの型に依存します。Figure 4-3 と 4-5 を参照してください。 キャリーフラグをセットして処理を戻した場合、AX レジスタは以下の値 1, 2, 7, 8, 1 0 もしくは 11 を格納しています。エラーコードの定義については Chapter 5 を参照し てください。 プログラムのロードと実行 (AL = 00h) 入力時に AL が 00h の場合、プログラムセグメントのオフセット 0 に PSP を作成し、 それに続いて、終了アドレスフィールドと Ctrl-Break アドレスフィールドのセットを 司令します。そして、プログラムセグメントのオフセット 100h に ASCIZ 文字列で示さ れるプログラムをロードし、制御を移します。リターン時、全レジスタは変更されてい ます。スタックセグメント、スタックレジスタ、そして値の保存が必要なその他のレジ スタを復元しなければなりません。 +--------------------+----------+--------------------------------------------+ | オフセット | 型 | 内容 | +--------------------+----------+--------------------------------------------+ |00h |word |環境セグメント | +--------------------+----------+--------------------------------------------+ |02h |dword |コマンドラインアドレス | +--------------------+----------+--------------------------------------------+ |06h |dword |第1 FCB アドレス | +--------------------+----------+--------------------------------------------+ |0Ah |dword |第2 FCB アドレス | +--------------------+----------+--------------------------------------------+ プログラムは、以下の 5 つのうちのひとつの方法で戻ることができます。 o AH に 4Ch をセットして INT 21h 発行。これが望ましい方法。 o PSP のオフセット 0 にジャンプ。 o INT 20h 発行。 o AH に 00h をセットして INT 21h 実行。 o AH を 4Ch にして PSP のオフセット 50h をコール。 本ファンクションを呼び出したプロセスが制御を取り戻したとき、割り込みベクタ 22h, 23h, 24h は、子プロセス PSP の終了アドレス、Ctrl-Break アドレス、致命的エラーフ ィールドの値から戻されます。 親プロセスがインヘリタンスビットをゼロにしてオープンしたファイルハンドルはすべ て、本ファンクションが作成した子プロセスのために複製されます。(訳注 : ファイル オープンの説明参照)新プロセスは、標準入力、標準出力、プリンタ、補助デバイスを 呼び出し元プロセスから受けつぎます。子プロセスはまた、呼び出し元プロセスのテキ スト文字列、もしくは「環境」も受けつぎます。LPB 中の環境セグメントフィールド( オフセット 00h)の値が 0000h の場合、子プロセスは環境をそのまま受けつぎます。環 境がいつでもパラグラフ(16 バイト)境界で配置されることに注意してください。 +------------------+----------------------------------------------------------+ | フィールド | 説明 | +------------------+----------------------------------------------------------+ |環境セグメント |PSP に渡す環境のセグメント | +------------------+----------------------------------------------------------+ |コマンドラインアド|PSP のオフセット 80h に置かれるコマンドラインのアドレス | |レス |(訳注 : コマンドライン文字列は 128 バイト未満で、改行コー| | |ド、つまり ODh で終了している必要があります) | +------------------+----------------------------------------------------------+ |第1 FCB アドレス |PSP のオフセット 5Ch に置かれる FCB のアドレス | +------------------+----------------------------------------------------------+ |第2 FCB アドレス |PSP のオフセット 6Ch に置かれる FCB のアドレス | +------------------+----------------------------------------------------------+ Figure 4-4 は環境文字列のフォーマットを図示しています。 +-----------------------------------------------------------------------------+ |ASCIZ 文字列 | +-----------------------------------------------------------------------------+ |ASCIZ 文字列 その2 | +-----------------------------------------------------------------------------+ | | +-----------------------------------------------------------------------------+ |… | +-----------------------------------------------------------------------------+ | | +-----------------------------------------------------------------------------+ |ASCIZ 文字列 その n | +-----------------------------------------------------------------------------+ |00h | +-----------------------------------------------------------------------------+ ※合計 32k バイト以内 (訳注 : 最後の 00h の直後に、01h、00h の2バイトが続き、さらにその後にプログラ ムのパス名が ASCIZ 文字列で格納されています。C言語で言うところの argv[0] に相 当します。) オーバレイのロード (AL = 03h) 入力時に呼び出し元プロセスが AL に 03h を渡した場合、DR-DOS は ASCIZ 文字列で示 されるプログラムをロードしますが、PSP の設定やプログラムの実行開始を行いません 。Figure 4-5 の記述にある LPB によって指定されたセグメントに、プログラムをロー ドします。プログラムのオーバレイ(上書き)ロードにはこのファンクションを使用し てください。(訳注 : ファンクション 4B00h と異なり、オーバレイロードは、割当済 みメモリへのロードを前提にしています。したがって、ロードするプログラムの使用メ モリサイズを正しく把握しておく必要があります。ロードしたプログラムが、あらかじ め割り当てておいたサイズ以上のメモリを使用した場合、システム破壊の恐れがありま す。)Figure 4-6 は PSP を図示しています。 +--------------------+--------+---------------------------------------------+ | オフセット | 型 | 内容 | +--------------------+--------+---------------------------------------------+ |00h |word |オーバレイセグメント | +--------------------+--------+---------------------------------------------+ |02h |word |リロケーションファクタ | +--------------------+--------+---------------------------------------------+ Table 4-3 は LPB フィールドの定義です。 +----------------------+------------------------------------------------------+ | フィールド | 定義 | +----------------------+------------------------------------------------------+ |オーバレイセグメント |ファイルをロードする位置のセグメント | +----------------------+------------------------------------------------------+ |リロケーションファクタ|ロードするプログラムイメージに当てはまるセグメント補正| | |値 | +----------------------+------------------------------------------------------+ (訳注 : オーバレイロードするファイルが、たとえば .COM ファイルのようなベタのバ イナリの場合、ファイルがオーバレイセグメントの位置からそのまま読み込まれ、セグ メントリロケーションの補正は行われないので、リロケーションファクタは 0000h でか まいません。ファイルが EXE 形式の場合、EXE ファイルのリロケーションテーブル中に あるセグメントアドレスを、実際にロードしたアドレスにあわせて補正します。基本的 には、リロケーションファクタにオーバレイセグメントと同じ値を設定します。) +--------+--------------------+------+--------+---+-------+----+-------+------+ |オフセッ| +00h | +01h | +02h |+03| +04h |+05h| +06h | +07h | | ト | | | | h | | | | | +--------+--------------------+------+--------+---+-------+----+-------+------+ | 00h |INT 20h |メモリセグメ|予約 |ディ|ディスパッチオ| | | |ント最上位 | |スパ|フセット | | | | | |ッチ| | | | | | |コー| | | | | | |ド | | +--------+--------------------+------+--------+---+-------+----+-------+------+ | 08h |ディスパッチセグメント |終了アドレス|終了アドレス|Ctrk-Break ア | | | |オフセット |セグメント |ドレスオフセッ| | | | | |ト | +--------+--------------------+------+--------+---+-------+----+-------+------+ | 10h |Ctrk-Break アドレスセグメン|致命的エラー|致命的エラー|予約 | | |ト |オフセット |セグメント | | +--------+--------------------+------+--------+---+-------+----+-------+------+ | 18h |予約 | +--------+--------------------+------+--------+---+-------+----+-------+------+ | 20h |予約 | +--------+--------------------+------+--------+---+-------+----+-------+------+ | 28h |予約 |環境セグメン|予約 | | | |ト | | +--------+--------------------+------+--------+---+-------+----+-------+------+ |30h〜48h|予約 | +--------+--------------------+------+--------+---+-------+----+-------+------+ | 50h |INT 21h |RETF |予約 | +--------+--------------------+------+--------+---+-------+----+-------+------+ | 58h |予約 |第1 FCB | +--------+--------------------+------+--------+---+-------+----+-------+------+ | 60h |第1 FCB(つづき) | +--------+--------------------+------+--------+---+-------+----+-------+------+ | 68h |第1 FCB(つづき) |第2 FCB | +--------+--------------------+------+--------+---+-------+----+-------+------+ | 70h |第2 FCB(つづき) | +--------+--------------------+------+--------+---+-------+----+-------+------+ | 78h |第2 FCB(つづき) |予約 | +--------+--------------------+------+--------+---+-------+----+-------+------+ | 80h |パラメータ長 |コマンドパラメータ | +--------+--------------------+------+--------+---+-------+----+-------+------+ |88h〜F8h|コマンドパラメータ(つづき) | +--------+--------------------+------+--------+---+-------+----+-------+------+ ●プログラムのロード (4B01h) Load Program プログラムをメモリへロード 入力パラメータ AH 4Bh AL 01h ES ロードパラメータブロック (LPB) のセグメント BX ロードパラメータブロック (LPB) のオフセット DS ASCIZ 文字列のセグメント DX ASCIZ 文字列のセグメント 戻り値 AX キャリーフラグがセットされている場合、エラーコ ード プログラムをメモリにロードし、新しい PSP を作成しますが、新しいプログラムに制御 を移しません。 (訳注 : LPB は Table 4-3 と同じ) ●実行ステート設定 (4B05h) Set Execution State 新規プログラムの実行準備 入力パラメータ AX 4B05h DS 実行ステートストラクチャのセグメント DX 実行ステートストラクチャのオフセット 戻り値 AX キャリーフラグがクリアされている場合、成功 -- AX = 000h キャリーフラグがセットされている場合、エラー -- AX = エラーコード 新規プログラムの実行準備をします。これには SETVER コマンドで指定される DR-DOS バージョン番号の設定が含まれます。 本ファンクションは、ファンクション 4B00h を横取りするプログラムで必要とされます 。リターン時、呼び出し元プログラムは可能な限り早く新規プログラムに制御を移さね ばなりません。新規プログラム起動の前に、DOS、BIOS その他のいかなるソフトウェア 割り込みも呼び出してはなりません。 DR-DOS が HMA で動作している場合、A20 ラインは HMA をアクセス不可にするため OFF にされます。 +-----+--------+--------------------------------------------------------------+ |オフ | サイズ | 説明 | |セッ | | | | ト | | | +-----+--------+--------------------------------------------------------------+ |00h |WORD |予約(0000h) | +-----+--------+--------------------------------------------------------------+ |02h |WORD |型フラグ | | | |bit 0 : プログラムは EXE | | | |bit 1 : プログラムはオーバレイ | +-----+--------+--------------------------------------------------------------+ |04h |DWORD |プログラムファイルの ASCIZ 名へのポインタ | +-----+--------+--------------------------------------------------------------+ |08h |WORD |新規プログラムの PSP セグメント | +-----+--------+--------------------------------------------------------------+ |0Ah |DWORD |新規プログラムの実行開始アドレス | +-----+--------+--------------------------------------------------------------+ |0Eh |DWORD |PSP を含めたプログラムサイズ | +-----+--------+--------------------------------------------------------------+ ●プロセス終了 (4Ch) Terminate a Process 現行プロセスを終了し、呼び出し元プロセスに制御を戻す 入力パラメータ AH 4Ch AL 終了コード 戻り値 なし 現在のプロセスを終了し、プログラムのロードと実行 (4Bh) ファンクションを呼び出し たプロセスに制御を戻します。現在のプロセスがオープンしたファイルハンドルはすべ てクローズします。本ファンクションを呼び出すプロセスは、ファンクション実行の前 に、AL レジスタに二進数の終了コードを渡すことができます。そのとき親プロセスは、 子プロセスの終了コード取得 (4Dh) ファンクションを通じて、終了コードを取り出すこ とができます。 ●子プロセスの終了コード取得 (4Dh) Get Subprocess Return Code 呼び出し元プロセスに完了コードを返す 入力パラメータ AH 4Dh 戻り値 AX 終了コード 別プロセスのキーププロセス (31h) もしくはプロセス終了 (4Ch) で指定された二進数 の終了コード、もしくは完了コードを返します。AX レジスタの下位バイトはプロセスの 終了によって指定された終了コードを格納します。上位バイトは以下の値のうちのひと つを返します。 o 00h -- 通常終了 o 01h -- Ctrl-Break による終了 o 02h -- 致命的エラーによる終了 o 03h -- キーププロセス (31h) ●最初のファイル検索 (4Eh) Find First Matching File 指定 ASCIZ 文字列にマッチする最初のファイル名を検索 入力パラメータ AH 4Eh DS ASCIZ 文字列のセグメント DX ASCIZ 文字列のオフセット CX ファイルアトリビュート 戻り値 AX キャリーフラグがセットされている場合 、エラーコード 入力時に DS:DX が指す ASCIZ 文字列で指定されたファイル名にマッチする、最初のフ ァイルを探します。ASCIZ 文字列はマッチさせるドライブ、パス、ファイル名を格納し ます。ASCIZ 文字列のファイル名の位置には疑問符 ('?') を含めることもでき、疑問符 はファイル名の同位置にあるどの文字ともマッチします。(訳注 : アスタリスク * も 使えます。) CX レジスタは、検索に含めるファイルを指定するファイルアトリビュートを格納します 。検索時のファイルアトリビュートバイトの用法は最初のエントリ検索 (11h) 中で説明 しています。マッチするファイルが見つかった場合、呼び出し元プログラムの DTA に以 下の情報を置きます。 +-----+-------+---------------------------------------------------------------+ |オフ |サイズ | 説明 | |セッ | | | | ト | | | +-----+-------+---------------------------------------------------------------+ |00h |21 byte|この次の、次のファイル検索で使うために予約 | | |s | | +-----+-------+---------------------------------------------------------------+ |15h |byte |マッチファイルのアトリビュート | +-----+-------+---------------------------------------------------------------+ |16h |word |マッチファイル作成時刻(訳注 : 2.3.1 標準 FCB の TIME フィール | | | |ドに関する説明を参照) | +-----+-------+---------------------------------------------------------------+ |18h |word |マッチファイル作成日(訳注 : 2.3.1 標準 FCB の DATE フィールド | | | |に関する説明を参照) | +-----+-------+---------------------------------------------------------------+ |1Ah |dword |マッチファイルのサイズ | +-----+-------+---------------------------------------------------------------+ |1Eh |13 byte|マッチファイルの名前と拡張子、その後に 00h(訳注 : ファイル名と| | |s |拡張子は左づめされます) | +-----+-------+---------------------------------------------------------------+ リターン時、キャリーフラグがセットされている場合、AX はエラーコード 2 もしくは 18 を格納しています。エラーコード 2 はファイルが見つからないことを示します。エ ラーコード 18 は、疑問符 ('?') を使用したときにマッチするファイルが見つからなか ったことを示します。 ●次のファイル検索 (4Fh) Find Next Matching File 次にマッチするファイルを検索 入力パラメータ AH 4Fh 戻り値 AX キャリーフラグがセットされ ている場合、エラーコード それ以前の最初のファイル検索 (4Eh) もしくは 次のファイル検索 (4Fh) ファンクショ ンで指定されたファイル名にマッチする、次のファイルを探します。入力時、DTA は以 前の最初のファイル検索 (4Eh) ファンクションが供給した情報を格納していなければな りません。 マッチするファイルが見つかった場合、呼び出し元プログラムの DTA を最初のファイル 検索で上述したように設定します。さらなるマッチファイルが見つからない場合、エラ ーコード 18(マッチするファイルがもうない)を AX に返します。 ●ベリファイフラグ取得 (54h) Get Verify State ベリファイステートの現行値を取得 入力パラメータ AH 54h 戻り値 AL 00h -- ベリファイ OFF 01h -- ベリファイ ON ベリファイフラグの値を返します。ベリファイが ON の場合 AL に 01h を、ベリファイ が OFF の場合 00h を返します。 ●ファイルリネーム (56h) Rename a File 入力パラメータ AH 56h DS 変更前ファイルパス名を表す ASCIZ 文字列のセグメント DX 変更前ファイルパス名を表す ASCIZ 文字列のオフセット ES 変更後ファイルパス名を表す ASCIZ 文字列のセグメント DI 変更後ファイルパス名を表す ASCIZ 文字列のオフセット 戻り値 AX キャリーフラグがセットされている場合、エラーコード DS:DX が指す ASCIZ 文字列を使うことによって指定されるファイルをリネームし、文字 列にはドライブ、パス、ファイル名を格納します。ES:DI で渡される文字列は、パスと 新しいファイル名を格納します。二番目の (ES:DI) ASCIZ 文字列でドライブが指定され ている場合、最初の (DS:DX) 文字列中で指定したものと同じでなければなりません。リ ターン時にキャリーフラグがセットされている場合、AX はエラーコード 3, 5 もしくは 17 を格納しています。エラーコードの定義は Chapter 5 を参照してください。 (念のための訳注 : 変更前のディレクトリと変更後のディレクトリが異なり、変更後の ディレクトリがすでに存在する場合、ファイルは変更後のディレクトリに移動します。 つまり本ファンクションは、ファイルの名前変更とファイル移動を一度に行うことがで きます。物理ドライブが異なる場合は自力でコピーしないといけないのですが…) ●ファイルのタイムスタンプ設定/取得 (57h) Get/Set Time and Date Stamps ファイル作成日時の取得/設定 入力パラメータ AH 57h AL 00h -- 日時取得 01h -- 日時設定 BX ファイルハンドル CX 設定時刻(日時設定のみ) DX 設定日付(日時設定のみ) 戻り値 AX キャリーフラグがセットされている場合、エラー コード CX ファイルの時刻(日時取得のみ) DX ファイルの日付(日時取得のみ) ファイルが最後に変更された日付と時刻を取得、もしくは設定します。入力時に AL が 01h を格納している場合、ファイルの時刻と日付を CX と DX に格納された値に設定し ます。入力時に AL が 00h を格納している場合、ファイルの時刻と日付を CX と DX に 返します。日付と時刻のフォーマットは DOS ディレクトリエントリのためのフォーマッ トと同じものです。(訳注 : このあとにフォーマットの説明があるのですが、ようする に標準 FCB で説明されている TIME フィールドや DATE フィールドと同じなので省略。 スマンス) リターン時にキャリーフラグがセットされている場合、AX はエラーコード 1 もしくは 6 を格納しています。エラーコードの定義に関しては Chapter 5 を参照してください。 ●アロケーションストラテジ取得 (58h) Get Memory Allocation Strategy DR-DOS のメモリ割り当て法取得 入力パラメータ AH 58h AL 00h 戻り値 AX エラー時、キャリーフラグはセット AX = エラーコード 成功の場合、キャリーフラグはクリア AX = 現在のアロケーションストラテジ AX アロケーションストラテジ 00h 基本メモリ最下位low memory first fit 01h 基本メモリ最小low memory best fit 02h 基本メモリ最上位low memory last fit 40h UMB 最下位high memory first fit 41h UMB 最小high memory best fit 42h UMB 最上位high memory last fit 80h UMB、それから基本メモリ最下位first fit, try high th en low memory 81h UMB、それから基本メモリ最小best fit, try high then low memory 82h UMB、それから基本メモリ最上位last fit, try high the n low memory (訳注 : うーん、いちおう訳注かましておいたほうがいいんでしょうか。まあいいや。 アロケーションストラテジというのは要するに、メモリ割り当て要求が DOS に対して出 されたとき、どういう方法で DOS が空きメモリを探すのかという方法です。例として 0 0h から 02h までを説明すれば、 +-----+------+----------------------------------------------------------------+ | 値 |ストラ| 説明 | | | テジ | | +-----+------+----------------------------------------------------------------+ |00h |first |メモリの空き領域を、コンベンショナル(基本)メモリの下位から上位| | |fit |の順で探し、要求されたサイズよりも大きい空き領域があった時点で、| | | |そこを確保する。 | +-----+------+----------------------------------------------------------------+ |01h |best f|基本メモリ中の空き領域をすべて調べ、要求されたメモリサイズにもっ| | |it |とも近い(そして大きい)空き領域を確保する。 | +-----+------+----------------------------------------------------------------+ |02h |last f|要求されたサイズよりも大きい基本メモリ中の空き領域のうち、もっと| | |it |も上位のアドレスにメモリブロックを確保する。 | +-----+------+----------------------------------------------------------------+ こんな感じでしょうか。 ストラテジの値が 40h〜42h の場合、UMB 内部のみを調べます。80h〜82h の場合、まず UMB 内部を調べ、UMB 内部にメモリ割り当てができないときは基本メモリ内を調べます 。) ●アロケーションストラテジ設定 (5801h) Set Memory Allocation Strategy DR-DOS のメモリ割り当て法設定 入力パラメータ AH 58h AL 01h BX 新規アロケーションストラテジ(前述 のファンクション参照) 戻り値 AX キャリーフラグがセットされている場 合、エラーコード ●UMB リンクステートの取得 (5802h) Get Upper Memory Link State 上位メモリブロック (UMB) とコンベンショナル(基本)メモリとの接続状態取得 入力パラメータ AH 58h AL 02h 戻り値 AL 00h -- UMB が DR-DOS メモリチ ェインの一部ではない。 01h -- UMB は DR-DOS メモリチ ェインに含まれる。 ●UMB リンクステートの設定 (5803h) Set Upper Memory Link State 上位メモリブロック (UMB) とコンベンショナル(基本)メモリとの接続状態設定 入力パラメータ AH 58h AL 03h BX 0000h -- DR-DOS のメモリチェインか ら UMB を取りのぞく。 0001h -- UMB をメモリチェインに追加 。 戻り値 AX キャリーフラグがセットされている場 合、エラーコード ●拡張エラーコード取得 (59h) Get Extended Error 拡張エラー情報を取得 入力パラメータ AH 59h BX 0000h 戻り値 AX 拡張エラーコード BH エラークラス BL レスポンス(対応) CH リソース(エラー発生箇所) キャリーフラグをセットしてエラーを返す INT 21h ファンクションコール、INT 24h エ ラーハンドラ、そして AL レジスタに FFh を返す FCB ファンクションコールから、さ らに多くのエラー情報を得るために、本ファンクションを呼び出すことができます。DX, SI, DI, ES, CL, DS レジスタの内容はリターン時に破壊されます。 エラークラス BH レジスタの内容は、エラータイプの詳細を示します。 +---+-------------------------------------------------------------------------+ |値 | 説明 | +---+-------------------------------------------------------------------------+ |1 |資源不足Out of Resource | | |(ディスク、メモリ)容量、I/O チャンネル、その他もろもろが不十分。 | +---+-------------------------------------------------------------------------+ |2 |一時的状況Temporary Situation | | |特定の回復措置なしで解決する一時的エラー。(訳注 : よくわからんのですが、| | |たとえばファイルがロックされているといった状況らしい) | +---+-------------------------------------------------------------------------+ |3 |権限Authorization | | |アクセス許可にまつわる問題。 | +---+-------------------------------------------------------------------------+ |4 |内部Internal | | |システムソフトウェアのエラー。ユーザの問題やシステムの障害ではなく、シス | | |テムソフトウェアのバグの疑いがある。 | +---+-------------------------------------------------------------------------+ |5 |ハードウェア障害Hardware Failure | | |主要な問題。ユーザプログラムの誤りではない。 | +---+-------------------------------------------------------------------------+ |6 |システム障害System Failure | | |システムソフトウェアの重大な障害で、おそらくは構成ファイルに伴ってのもの | | |。 | +---+-------------------------------------------------------------------------+ |7 |アプリケーションプログラムのエラーApplication Program Error | | |たとえば複数のプロセスが同じファイルをオープンしようとしているといったよ | | |うな。 | +---+-------------------------------------------------------------------------+ |8 |ファイルもしくはアイテムが見つからないNot Found | | |ファイルもしくはアイテムが見当たらない。 | +---+-------------------------------------------------------------------------+ |9 |誤ったフォーマットBad Format | | |型が無効、フォーマットが無効、もしくは他の何かしらが無効もしくは不適切。 | +---+-------------------------------------------------------------------------+ |10 |ロックLocked | | |ファイルもしくはアイテムがロックされている。 | +---+-------------------------------------------------------------------------+ |11 |メディアMedia | | |メディアの問題。間違ったディスクを入れた。ディスクに不良箇所がある。 | +---+-------------------------------------------------------------------------+ |12 |すでに存在Already Exist | | |すでに存在するアイテムを使おうとした。 | +---+-------------------------------------------------------------------------+ |13 |不明Unknown | | |分類不能、もしくは分類不適当。 | +---+-------------------------------------------------------------------------+ レスポンス エラー状況に対する推奨対応は、BL に以下のように示されます。 +--+--------------------------------------------------------------------------+ |値| 説明 | +--+--------------------------------------------------------------------------+ |1 |リトライRetry | | |何度かリトライし、プログラムを続行するか中断するかユーザに決定させるプロン| | |プトを出す。 | +--+--------------------------------------------------------------------------+ |2 |遅延リトライDelay Retry | | |そのつど休止しながら何度かリトライし、プログラムを続行するか中断するかユー| | |ザに決定させるプロンプトを出す。 | +--+--------------------------------------------------------------------------+ |3 |ユーザUser | | |ユーザに再度入力をうながす。システムコール中で使われるパラメータをユーザが| | |ミスタイプし、再入力を要求されるべき状態。DR-DOS は、プログラムによって直 | | |接供給される値のためにはリトライを要求しない。 | +--+--------------------------------------------------------------------------+ |4 |アボート(中止)Abort | | |きちんと後始末をしてアプリケーションを終了する。アプリケーションは続行でき| | |ないが、システムは整然と終了する。 | +--+--------------------------------------------------------------------------+ |5 |即時中止Immediate Exit | | |後始末なしにアプリケーション中断。ファイルクローズやインデクス更新なしに、| | |ただちにアプリケーションは放棄される。 | +--+--------------------------------------------------------------------------+ |6 |黙殺Ignore | | |無視。 | +--+--------------------------------------------------------------------------+ |7 |ユーザ介入後にリトライRetry After User Intervention | | |操作をリトライする前に、プリンタがオンラインであることをチェックする(訳注| | |: あるいはディスクを入れ替える)、といった処置をユーザが行わねばならない。| +--+--------------------------------------------------------------------------+ リソース 以下の値は CH に格納され、エラーの要因となった物理リソースの詳細を示します。 +--+-------------------------------------------------------------------------+ |値| 説明 | +--+-------------------------------------------------------------------------+ |1 |不明 | | |不特定。不適当。 | +--+-------------------------------------------------------------------------+ |2 |ブロックデバイス | | |大容量ランダムアクセスストレージに関連 | +--+-------------------------------------------------------------------------+ |3 |ネット | | |ネットワークに関連 | +--+-------------------------------------------------------------------------+ |4 |シリアルデバイス | | |シリアル(キャラクタ)デバイスに関連 | +--+-------------------------------------------------------------------------+ |5 |メモリ | | |メモリ (RAM) に関連 | +--+-------------------------------------------------------------------------+ ●一時ファイル作成 (5Ah) Create Unique File 固有のファイル名でファイル作成 入力パラメータ AH 5Ah CX アトリビュート DS 円記号で終わる ASCIZ パスのセグメント DX 円記号で終わる ASCIZ パスのオフセット 戻り値 AX キャリーフラグがセットされている場合、エラーコード セットされていない場合、ファイルハンドル DS ASCIZ パスに追加された、一時ファイル名のセグメント DX ASCIZ パスに追加された、一時ファイル名のオフセット 与えられたパスの最後に固有のファイル名を追加し、そのファイル作成を作成します。 そのファイルがすでに存在する場合、新しいファイル名が作成され、処理が繰り返され ます。ファイルはリード/ライトアクセスのコンパチビリティモードでオープンされま す。ファイルは、プログラム終了時に自動的に削除されません。 (訳注 :入力時に DS:DX で、一時ファイルを作成するパスを ASCIZ 文字列で指定しま す。このとき ASCIZ 文字列にファイル名は含まず、円記号 ('\')、00h で終わらせます 。ファンクションが成功した場合、DS:DX で指定したパスの後ろに、DOS が作成したフ ァイル名が追加されます。したがって、入力時の DS:DX で指定される ASCIZ パスの後 方には、ファイル名を格納する空き領域が必要です。MS-DOS のリファレンスによると、 ASCIZ パス終端の 00h の後ろに、さらに 13 バイトの領域が必要だそうです。) ●新規ファイル作成 (5Bh) Create New File 新しいファイルを作成 入力パラメータ AH 5Bh DS ASCIZ 文字列のセグメント DX ASCIZ 文字列のオフセット CX ファイルアトリビュート(属性) 戻り値 AX キャリーフラグがセットされている場合、エラーコ ード セットされていない場合、ファイルハンドル ファイル名がすでに存在する場合に失敗することを除いて、ファイル作成 (3Ch) と同じ です。ファイルはリード/ライトアクセスのコンパチビリティモードでオープンされま す。 ●ファイルアクセスのロック/ロック解除 (5Ch) Lock/Unlock File Access オープンファイルの領域をロック/ロック解除 入力パラメータ AH 5Ch AL 00h -- ロック 01h -- ロック解除(アンロック) BX ファイルハンドル CX ロック領域のオフセット(上位) DX ロック領域のオフセット(下位) SI ロック領域の長さ(上位) DI ロック領域の長さ(下位) 戻り値 AX キャリーフラグがセットされている場合、エラー コード 本ファンクションはリード拒否、もしくは拒否なしシェアリングモードでのみ使用され ます。限られた時間、他のプロセスがファイル領域にリード/ライトアクセスすること を拒否する、簡単な方法を提供します。領域はファイルのどの地点にも設定できますが 、本ファンクションが短時間のあいだに渡ってのみ使用されることを推奨します。(訳 注 : 要するに、ロックした領域はなるたけ早めにアンロックしなさい、ということらし いです。) Note : SHARE がロードされていない場合、エラー 1(無効なファンクションコール)が 返されます。 ●拡張エラー情報設定 (5D0Ah) Set Extended Error Information 拡張エラーコード取得 (59h) で返される拡張エラーコードの設定 入力パラメータ AX 5D0Ah DS パラメータリストのセグメント DX パラメータリストのオフセット 戻り値 なし (この後の拡張エラーコード取得 (59h) フ ァンクションで、パラメータリストのそれぞ れのレジスタに対応する値が返される) +-----------+-------+--------------------------------------------------------+ |オフセット |サイズ |  内容  | +-----------+-------+--------------------------------------------------------+ |00h |WORD |AX | +-----------+-------+--------------------------------------------------------+ |02h |WORD |BX | +-----------+-------+--------------------------------------------------------+ |04h |WORD |CX | +-----------+-------+--------------------------------------------------------+ |06h |WORD |DX | +-----------+-------+--------------------------------------------------------+ |08h |WORD |SI | +-----------+-------+--------------------------------------------------------+ |0Ah |WORD |DI | +-----------+-------+--------------------------------------------------------+ |0Ch |WORD |DS | +-----------+-------+--------------------------------------------------------+ |0Eh |WORD |ES | +-----------+-------+--------------------------------------------------------+ |10h |WORD |予約 (0000h) | +-----------+-------+--------------------------------------------------------+ |12h |WORD |コンピュータ ID(0000h = 現在のシステム) | +-----------+-------+--------------------------------------------------------+ |14h |WORD |プロセス ID(指定コンピュータの PSP セグメント) | +-----------+-------+--------------------------------------------------------+ ●マシン名取得 (5E00h) Get Machine Name マシン名を取得 入力パラメータ AX 5E00h DS マシン名を返すバッファ(16 バイトの ASCIZ 文字列)の セグメント DX マシン名を返すバッファのオフセット 戻り値 AX キャリーフラグがセットされている場合、エラーコード CH マシン名の有効性 00h -- マシン名/番号は未定義 他 -- 定義されている CL マシン名の NETBIOS 番号 (未訳) Note : 本ファンクションコールは、ネットワークプログラムがロードされている場合の みサポートされます。 ●プリンタセットアップ (5E02h) Set Printer Setup プリンタファイル用のプリンタセットアップ文字列を設定 入力パラメータ AX 5E02h BX リダイレクションリストのインデクス番号 CX プリンタセットアップ文字列の長さ(最大 64 バ イト) DS プリンタセットアップ文字列のセグメント SI プリンタセットアップ文字列のオフセット 戻り値 AX キャリーフラグがセットされている場合、エラー コード (未訳) Note : 本ファンクションコールは、ネットワークプログラムがロードされている場合の みサポートされます。 ●プリンタセットアップ文字列取得 (5E03h) Get Printer Setup プリンタファイル用のプリンタセットアップ文字列を取得 入力パラメータ AX 5E03h BX リダイレクションリストのインデクス番号 ES プリンタセットアップ文字列を受け取るバッファの セグメント DI プリンタセットアップ文字列を受け取るバッファの オフセット 戻り値 AX キャリーフラグがセットされている場合、エラーコ ード CX プリンタセットアップ文字列の長さ ES:DI プリンタセットアップ文字列 (未訳) Note : 本ファンクションコールは、ネットワークプログラムがロードされている場合の みサポートされます。 ●リダイレクションリストのエントリ取得 (5F02h) Get Redirection List Entry ネットワークリダイレクションのリストを取得 入力パラメータ AX 5F02h BX リダイレクションインデクス(最初が 0) DS ローカルデバイス名用バッファ(128 バイト)のセグメン ト SI ローカルデバイス名用バッファのオフセット ES ネットワーク名用バッファ(128 バイト)のセグメント DI ネットワーク名用バッファのオフセット 戻り値 AX キャリーフラグがセットされている場合、エラーコード BH デバイスステータス Bit0 = 0 -- デバイス有効 Bit0 = 1 -- デバイス無効 Bit1〜7 予約 BL デバイスタイプ 03h -- プリンタ 04h -- ファイル CX ユーザパラメータ DX 内容は破壊される BP 内容は破壊される DS:SI ローカル名 ES:DI ネットワーク名 (未訳) Note : 本ファンクションコールは、ネットワークプログラムがロードされている場合の みサポートされます。 ●リダイレクションリストのエントリ設定 (5F03h) Redirect Device リダイレクションリストのエントリ設定 入力パラメータ AX 5F03h BL デバイスタイプ 03h -- プリンタ 04h -- ファイル CX 呼び出し元の保存値(ユーザパラメータ) DS ローカルデバイス名のセグメント SI ローカルデバイス名のオフセット ES ネットワークパスとパスワードのセグメント DI ネットワークパスとパスワードのオフセット 戻り値 AX キャリーフラグがセットされている場合、エラーコー ド (未訳) Note : 本ファンクションコールは、ネットワークプログラムがロードされている場合の みサポートされます。 ●リダイレクションのキャンセル (5F04h) Cancel Redirection リダイレクションを取消 入力パラメータ AX 5F04h DS デバイス名もしくはパスのセグメント SI デバイス名もしくはパスのオフセット 戻り値 AX キャリーフラグがセットされている場合、 エラーコード (未訳) Note : 本ファンクションコールは、ネットワークプログラムがロードされている場合の みサポートされます。 ●PSP 取得 (62h) Get Program Segment Prefix Address 現行 PSP アドレス取得 入力パラメータ AH 62h 戻り値 BX 現行 PSP のセグメン トアドレス ●拡張国別情報取得 (65h) Get Extended Country Information 国コードに関する、より多くの情報を取得 入力パラメータ AH 65h AL 1, 2, 4, 5, 6, 7 のいずれか、求める情報による BX 対象コードページ(-1 = アクティブな CON デバイス ) DX 対象国コード(-1 = デフォルト) CX 返される情報量(最小値 : 5) ES 情報を返されるバッファのセグメント DI 情報を返されるバッファのオフセット 戻り値 AX キャリーフラグがセットされている場合、エラーコー ド ES:DI 拡張国別情報テーブル 国コードとコードページは、正しい組み合わせでなければなりません。そうでない場合 は AX レジスタにエラーコード 2(ファイルが見つからない)が返されます。CX で要求 された分よりも多くの情報が提供される場合、エラーが出ることはなく、情報は切り詰 められます。AL の値は、提供する情報を確定します。 デフォルトの国コードとコードページの情報以外のものを取得するには NLSFUNC のロー ドが必要なことに注意してください。 Figure 4-9 は、AL が 01h のときの国別情報テーブルの格納結果を図示しています。 AL が 02h のとき、結果は、1 バイトのファンクション ID (01h)、それに続いて大文字 テーブルを指す 4 バイトダブルワードポインタです。大文字テーブルは、テーブル長を 表す 2 バイトのフィールド、それに続いて ASCII 文字を大文字化した値を格納した 12 8 バイトのテーブルです。 AL が 04h のとき、結果は、1 バイトのファンクション ID (04h)、それに続いてファイ ル名大文字テーブルを指す 4 バイトダブルワードポインタです。ファイル名大文字テー ブルは、テーブル長を表す 2 バイトのフィールド、それに続いて ASCII 文字を大文字 化した値を格納した 128 バイトのテーブルです。 AL が 05h のとき、その国コードとコードページのためのファイル文字テーブルのアド レスを返します。 AL が 06h のとき、結果は、1 バイトのファンクション ID (06h)、それに続いて照合順 列テーブルを指す 4 バイトのダブルワードポインタです。照合順列テーブルは、テーブ ル長を表す 2 バイトのフィールド、それに続いて(訳注 : ソートの)順番に置かれた 256 個の ASCII 値テーブルです。 AL が 07h のとき、結果は、ダブルバイト文字セット (DBCS) テーブルを指す 4 バイト のダブルワードポインタです。DBCS テーブルのフォーマットは Figure 4-10 に図示し ています。テーブルの各エントリはダブルバイト文字の先頭バイトになりうる文字コー ドの範囲を示しています。 +-------------+----------+---------------------------------------------------+ | オフセット | 型 | 内容 | +-------------+----------+---------------------------------------------------+ |00h |byte |01h | +-------------+----------+---------------------------------------------------+ |01h |word |バッファサイズ(オフセット 03h からの) | +-------------+----------+---------------------------------------------------+ |03h |word |国コード | +-------------+----------+---------------------------------------------------+ |05h |word |コードページ | +-------------+----------+---------------------------------------------------+ |07h |word |日付フォーマット | +-------------+----------+---------------------------------------------------+ |09h |5 bytes |通貨記号 | +-------------+----------+---------------------------------------------------+ |0Eh |2 bytes |3桁 (1000) 単位のセパレータ記号 | +-------------+----------+---------------------------------------------------+ |10h |2 bytes |小数点 | +-------------+----------+---------------------------------------------------+ |12h |2 bytes |日付セパレータ記号 | +-------------+----------+---------------------------------------------------+ |14h |2 bytes |時刻セパレータ記号 | +-------------+----------+---------------------------------------------------+ |16h |byte |通貨形式 | +-------------+----------+---------------------------------------------------+ |17h |byte |通貨表示桁 | +-------------+----------+---------------------------------------------------+ |18h |byte |時刻形式 | +-------------+----------+---------------------------------------------------+ |19h |dword |大文字変換呼び出しアドレス | +-------------+----------+---------------------------------------------------+ |1Dh |2 bytes |データリストセパレータ記号 | +-------------+----------+---------------------------------------------------+ |1Fh |10 bytes |(予約済) | +-------------+----------+---------------------------------------------------+ +------------------+-----+--------------------------------------------------+ | オフセット | 型 | 内容 | +------------------+-----+--------------------------------------------------+ |00h |word |テーブル長(オフセット 02h からの) | +------------------+-----+--------------------------------------------------+ |02h |byte |START_0 | +------------------+-----+--------------------------------------------------+ |03h |byte |END_0 | +------------------+-----+--------------------------------------------------+ |04h |byte |START_1 | +------------------+-----+--------------------------------------------------+ |05h |byte |END_1 | +------------------+-----+--------------------------------------------------+ |… | +------------------+-----+--------------------------------------------------+ |(n+1) * 2 |byte |START_n | +------------------+-----+--------------------------------------------------+ |(n+1) * 2 + 1 |byte |END_n | +------------------+-----+--------------------------------------------------+ |(n+2) * 2 |byte |00h | +------------------+-----+--------------------------------------------------+ |(n+2) * 2 + 1 |byte |00h | +------------------+-----+--------------------------------------------------+ たとえば、コードページ 932、国コード 81(日本)の DBCS テーブルは以下のようにな ります。 +-----------------------------------------+----------------+----------------+ | オフセット | 型 | 内容 | +-----------------------------------------+----------------+----------------+ |00h |word |06h | +-----------------------------------------+----------------+----------------+ |02h |byte |81h | +-----------------------------------------+----------------+----------------+ |03h |byte |9Fh | +-----------------------------------------+----------------+----------------+ |04h |byte |E0h | +-----------------------------------------+----------------+----------------+ |05h |byte |FCh | +-----------------------------------------+----------------+----------------+ |06h |byte |00h | +-----------------------------------------+----------------+----------------+ |07h |byte |00h | +-----------------------------------------+----------------+----------------+ 81h から 9Fh の中に含まれる、もしくは E0h から FCh の中に含まれる値は、有効な漢 字先導バイト (lead byte) であり、それは、DBCS 文字の先頭バイトです。 ●大文字化 (6520h-6522h) Character Capitalization 国別情報に依存した大文字化 入力パラメータ AH 65h AL サブコード(20h〜22h) 20h -- 1文字だけ大文字化 21h -- 指定文字数を大文字化 22h -- ASCIZ 文字列を大文字化 DL 大文字化する文字(AL = 20h の場合) DS 文字列のセグメント(AL = 21h, 22h) DX 文字列のセグメント(AL = 21h, 22h) CX 文字数(AL = 21h) 戻り値 AX キャリーフラグがセットされている場合、エラーコード DL 大文字化された文字(AL = 20h の場合) ●グローバルコードページ設定/取得 (66h) Get/Set Global Code Page 現行国のコードページを設定/取得 入力パラメータ AH 66h AL サブコード 01h -- グローバルコードページの取得 02h -- グローバルコードページの設定 BX 設定するコードページ(AL = 02h の場合) 戻り値 AX キャリーフラグがセットされている場合、エラーコー ド BX グローバルコードページ(AL = 01h の場合) DX DOS システムのデフォルトコードページ(AL = 01h の 場合) 本ファンクションは、グローバルコードページ設定時、正しいコードページデータを CO UNTRY.SYS から読み出し、国情報データ領域に配置します。新コードページの SELECT コマンド(訳注 : Appendix A 参照。ってまだ訳してないけど)はそのとき、コードペ ージ切り替えをサポートするすべてのデバイス(ドライバ)で実行されます。デバイス は CONFIG.SYS 中での定義によって決定されます。 デバイスが SELECT コマンドの実行に失敗した場合、AX にエラーコード 65h を返し、 キャリーフラグがセットされます。 コードページが現在の国コードで有効ではない場合、もしくは COUNTRY.SYS ファイルが オープンできない、読み込めない場合、AX にエラーコード 02h を返し、キャリーフラ グがセットされます。 Note : グローバルコードページの変更するには、NLSFUNC がロードされていなければな りません。 ●ファイルハンドル数設定 (67h) Set Handle Count プロセスに 20 をこえるファイルのオープンを認める 入力パラメータ AH 67h BX オープンを許可するハンドル数 戻り値 AX キャリーフラグがセットされてい る場合、エラーコード プロセスがオープンを許可するファイルハンドルの最大数を変更するために用いられま す。拡張されたハンドルリストを格納するため、割当メモリサイズ変更 (4Ah) ファンク ションを使用して、余分なメモリを開放しておかねばなりません。 ハンドル要求数が 20 未満の場合、要求数は 20 に切り上げられます。 ●ファイルのコミット (68h) Commit File ファイルのバッファドデータをデバイスに書き込む 入力パラメータ AH 68h BX ファイルハンドル 戻り値 AX キャリーフラグがセットされて いる場合、エラーコード オープンされているファイルのディレクトリエントリを更新し、そのファイルに関連す るデータバッファと FAT バッファをフラッシュします。ファイルをクローズして再オー プンするのと同様の効果がありますが、本ファンクションは、たとえばマルチユーザ・ ネットワーク環境での、より確実なファイル変更法を提供します。 ●拡張オープン/作成 (6Ch) Extended Open/Create 以前よりある、ファイルオープン/作成ファンクションを一体化 入力パラメータ AH 6Ch BL アクセスコード(ファイル作成 での AL と同じ) BH フラグ bit6 -- ライト毎に自動コミット bit5 -- エラー時に INT 24h を実行せず、エラーを返す CX アトリビュート DL bit7-4 ファイル非存在時の動作 0000 -- ファンクション失敗 0001 -- 作成 bit3-0 ファイル存在時の動作 0000 -- ファンクション失敗 0001 -- オープン 0010 -- ファイルリプレース/オープン DH 予約(00h) DS ASCIZ ファイル名のセグメント SI ASCIZ ファイル名のセグメント 戻り値 AX キャリーフラグがセットされている場合、エラーコード セットされていない場合、ファイルハンドル CX キャリーフラグがセットされていない場合、ステータス 01h -- ファイルがオープンされた 02h -- ファイルは作成された 03h -- ファイルはリプレースされた ------------------------------------------------------------------------------- Copyright (c) 1993, 1997 Caldera, Inc All rights reserved.