[Front] [Prev Chapter] [Next Chapter] | [in English] |
大部分の DR-DOS システムコールは、呼出処理を正常に終了できなかった時、エラー情報を返します。 返される情報の種類は個々のコールによって変化します。 「ハンドル」型のファンクションコールは、エラー状態を呼び出し元プログラムに知らせるため、キャリーフラグと AX レジスタを使用し、対して「FCB」型のコールは AL レジスタを使用します。 すべてのシステムコールで拡張エラー情報が利用可能です。
アプリケーションプログラムは、キャリーフラグの状態を調べることにより、ハンドル型ファンクションコール間に起こったであろうエラーの状況を調べることができます。 キャリーフラグがセットされている場合、プログラムは AX レジスタの内容を確認することでエラー状況の種類を特定できます。 以下のハンドル型コールは AX にエラーコードを返します。
38h - 43h
44h (サブファンクション 0Eh, 0Fh)
45h - 4Bh
4Eh, 4Fh
56h, 57h
5Ah
5Ch
65h
67h, 68h
AX の値とその内容は Table 5-1 に示されています。
コード | 内容 |
---|---|
0 | エラーなし No error |
1 | 無効なファンクション番号 Illegal function |
2 | ファイルが見つからない File not found |
3 | パスが見つからない Path not found |
4 | ファイルハンドル不足 (オープンしているファイルが多すぎる) No file handles (too many open files) |
5 | アクセス拒否 Access denied |
6 | 無効なファイルハンドル Illegal file handle |
7 | MCB(メモリコントロールブロック)が破壊されている Memory control block destroyed |
8 | メモリ不足 Insufficient memory |
9 | 無効なメモリブロックアドレス Illegal memory block address |
10 | 無効な環境 Invalid environment |
12 | 無効なアクセスコード Invalid access code |
13 | 無効なデータ Invalid data |
15 | 無効なドライブ指定 Invalid drive specified |
16 | カレントディレクトリを削除しようとした Removal of current directory attempted |
17 | デバイスが一致しない Devices do not match |
18 | これ以上のファイルはない No more files |
19 | ライトプロテクトのかかったディスクに書き込もうとした Attempted write on protected disk |
20 | ディスクユニットが未定義、もしくは不良 Unit unknown |
21 | ドライブの準備ができていない Drive not ready |
22 | 無効なディスクコマンド Command unknown |
23 | CRC エラー CRC error |
24 | デバイスドライバに渡す、コマンドリクエストストラクチャの長さが正しくない Bad request structure length |
25 | シークエラー Seek error |
26 | メディアタイプが不明。 DOS 用のディスクではない Media type unknown |
27 | セクタが見つからない Sector not found |
28 | プリンタ用紙切れ Printer out of paper |
29 | 書き込み失敗 Write failure |
30 | 読み込み失敗 Read failure |
31 | その他全般の失敗 General failure |
32 | 共有違反 Sharing violation |
33 | ロック違反 Lock violation |
35 | FCB 使用不能 File Control Block not available |
80 | ファイルはすでに存在 File already exists |
82 | サブディレクトリ作成不能 Cannot create subdirectory |
83 | 致命的エラー処理ハンドラ (INT 24h) の処理失敗 Critical error failure |
86 | 無効なパスワード Invalid password |
FCB 型ファンクションコールを使用するアプリケーションプログラムは、AL レジスタの内容を検査することで、エラー状況を確認することもできます。 AL レジスタの内容が FFh にセットされているならばエラー発生状況にあり、ファンクションコールは期待通りに終了していません。
以下の FCB 型ファンクションコールは、AL レジスタ経由でエラー状態を提供します。
0Fh - 13h
16h, 17h
23h, 29h
2Bh, 2Dh
通知されたエラーの正確な原因に関するよりくわしい情報は、アプリケーションプログラムが拡張エラーコード取得 (59h) を直接呼び出せば取得できます。 このファンクションコールは AX、BH、BL、CH レジスタの4項目に情報を返します。 エラーコードは AX に返されます。 エラークラスは BH に、推奨レスポンスは BL に、影響したリソースは CH に返されます。 エラークラス、レスポンス、リソースのよりくわしい情報は Chapter 4 内のファンクションコール 59h、拡張エラーコード取得の記述中にあります。
致命的エラーの処理は、3.5 INT 24h -- Critical Error Handler の中で議論されています。
アプリケーションプログラムは、自前の致命的エラー処理ルーチンを用意することができます。 アプリケーションの初期化コードは INT 24h ベクタを保存し、アプリケーションエラールーチンのスタートアドレスを新しい INT 24h ベクタとして置き換えます。 DR-DOS が致命的エラーを検出した結果として INT 24h が発生したときに、このエラールーチンが制御を得ることになります。 エラールーチンの入力時、DI レジスタの下位バイトはエラーコードを格納しています。 このコードの値は Table 3-3 で示され、Table 5-1 の 19 から 31 までのコードに対応するものです。
エラーに対するユーザの応答を取得するために、エラールーチンは、DR-DOS (訳注 : DR-DOS がデフォルトで用意しているユーザ応答ルーチン。 "Abort, Retry, Ignore" とか出てくる例のアレ) に制御を戻すことができます。 ユーザ応答を取得するには、スタック上にフラグレジスタを PUSH し、以前に保存しておいた INT 24h ベクタのアドレスを FAR CALL します。 DR-DOS はユーザ応答の要求を発行し、アプリケーション側エラールーチンの、FAR CALL 直後の命令位置に戻ります。
エラールーチンはそれから、アプリケーションのニーズに合わせたエラー処理にはいります。 アプリケーション内の致命的エラー発生位置に戻るために、エラー処理ルーチンが必要とするのは IRET 命令の実行のみです。
エラールーチンが、ユーザ応答のために DR-DOS に制御を戻すことは、義務ではありません。 自前でのエラー処理を選択することもできます。 そのようにする場合、エラールーチンは、アプリケーションに制御を戻す前にスタックのクリーンアップ処理も行わねばなりません。 これは、アプリケーションプログラムのレジスタがスタックから POP され、IRET 命令が実行されることを伴います。 致命的エラーハンドラ入力時のスタック配置は、Figure 3-1 に図示されています。
致命的エラー処理ルーチンには、前述したように、拡張エラー情報取得のため、拡張エラーコード取得 (59h) ファンクションを実行することが認められています。 たとえば、DI の値によって「ドライブの準備ができていない (02h)」とされている致命的エラーが、実際のところ「共有違反」によるものである場合がありえます。 この原因はファンクション 59h 経由で判別できます。