[Front] [Prev Chapter] [Next Chapter] | [in English] |
DR-DOS は Table 3-1 に示す割り込みをサポートします。
DOS 割り込み | 説明 |
---|---|
20h | プログラム終了 Program Terminate |
21h | DOS ファンクションの呼び出し DOS Function Request |
22h | 終了アドレス Terminate Address |
23h | Ctrl-Break (Ctrl-C) による終了ハンドラ Ctrl-Break Exit Handler Vector |
24h | 致命的エラーハンドラ Critical Error Handler Vector |
25h | アブソリュートディスクリード Absolute Disk Read |
26h | アブソリュートディスクライト Absolute Disk Write |
27h | 常駐終了 Terminate and Stay Resident |
2Fh | 多重割り込み Multiplex Interrupt |
INT 20h を発行することにより、割り込みテーブル内にある終了アドレス (INT 22h)、Ctrl-Break ハンドラ (INT 23h)、致命的エラーハンドラ (INT 24h) の値が、現在のプログラムのロード時に格納されていた値に戻されます。
INT 20h ファンクションに応じて、DR-DOS はすべてのファイルバッファをフラッシュします。 もし長さの変更されたファイルが INT 20h 以前にクローズしていない場合、ディレクトリエントリには、そのファイル長および日時は正しく記録されません(Chapter 4 中の、FCB ファイルクローズ (10h) とハンドルクローズ (3Eh) コールを参照)。 終了する前に、プログラムがエラーコードもしくは終了コードを渡したい場合には、プロセス終了 (4Ch) を使用してください。
Chapter 2 の 2.1 DR-DOS システムコールパラメータで INT 21h を使ったシステムコールの呼び出し方を、Chapter 4 で個々のシステムコールについて記述しています。
この割り込みベクタには、現在のプログラムが終了するときに DR-DOS が制御を移すアドレスが格納されています。
DR-DOS は PSP 作成の際、プログラムの PSP のオフセット 0Ah にこのアドレスをコピーします。
標準入出力、標準プリンタ、補助デバイスの処理中にユーザが Ctrl-Break を入力すると、DR-DOS は INT 23h を実行します。 現在の Ctrl-Break チェックステートが ON のとき(システムコール Ctrl-Break チェック (33h) を参照)にユーザが Ctrl-Break を入力すると、DR-DOS は次のシステムコール時に INT 23h を実行します。
ユーザの用意した Ctrl-Break ルーチンが全レジスタを保存している場合、IRET 命令で終了させ、プログラムを続行できます。 IRET 発行以前に全レジスタを保存しているとき、DOS コールの使用を含めて、DR-DOS では Ctrl-Break ルーチンに制約を設けていません。 割り込みルーチンがロングリターン (訳注 : 何スかね。 RETF のことですかね。いや、RETF 2 かな?) で処理を戻した場合、プログラムを続行するかどうかはキャリーフラグが決定します。 キャリーフラグがセットされているときはプログラムが終了し、そうでなければ IRET の場合のように続行します。
文字列表示 (08h) あるいは バッファドキーボード入力 (0Ah) 実行中に Ctrl-Break 割り込みがかかった場合、DR-DOS は Ctrl-C (03), CR (13), LF (10) を出力(表示)します。 IRET によってプログラムの続行が認められた場合、入出力は新しい行の先頭から続行されます。 Ctrl-Break 割り込みが発行されたとき、全レジスタは、元の DOS システムコール中の値に戻されます。
DOS プログラムの実行中に致命的エラーが発生したとき、DR-DOS は INT 24h に制御を移します。 BP:SI にはデバイスヘッダ制御ブロックの位置がセットされ、これは付加情報を提供します。 デバイスヘッダ制御ブロックの全容は Figure 6-1 を参照してください。 INT 24h がレジスタを設定し、IRET が実行されたなら、DR-DOS は以下の AL の値に従った動作を行います。
0 = エラーの無視 (ignore)
1 = リトライ(再試行) (retry)
2 = アプリケーションの終了 (terminate)
3 = ファンクションの失敗 (fail)
DR-DOS は、INT 25h あるいは INT 26h 中に発生したディスクエラーを INT 24h で拾えません。 ディスクエラーが INT 21h の結果である場合のみ、INT 24h で拾います。
AH レジスタの bit7(最上位)がゼロならば、ディスクエラーを示します。 AH の bit7 = 0 のとき、AL レジスタはエラーの発生したドライブ番号(0 がドライブ A に相当)を格納しています。 AH の bit 0 〜 2 は、行われたディスク操作とエラーに陥ったディスク領域を示しています。 AH の bit 3 〜 5 はディスクエラーに対する有効な応答を示しています。 Table 3-2 はこれらのビットに割り振られた値の一覧です。
致命的エラーハンドラが無効な応答を返した場合、以下のようにデフォルトの応答が設定されます。
無効な応答 | デフォルトの応答 |
---|---|
無視 | 失敗 |
再試行 | 失敗 |
失敗 | 終了 |
DR-DOS はリトライのために全レジスタを設定し、DI レジスタの下位バイトにエラーコードを渡します。 DI の上位バイトは未定義です。 Table 3-3 はエラーコードの一覧です。
DI(下位バイト)の値 | エラー |
---|---|
00H | ライトプロテクトがかかっている Attempted write on protected diskette |
01H | 存在しないユニット Unit unknown |
02H | ドライブの準備ができていない Drive not ready |
03H | 存在しないコマンド Command unknown |
04H | CRC エラー CRC error |
05H | ドライブリクエストストラクチャの長さが正しくない Bad request structure length |
06H | シークエラー Seek error |
07H | メディアタイプが不明、もしくは存在しない Media type unknown |
08H | セクタが見つからない Sector not found |
09H | プリンタの紙切れ Printer out of paper |
0AH | 書き込み失敗 Write failure |
0BH | 読み込み失敗 Read failure |
0CH | その他全般の失敗 General failure |
DR-DOS は、Figure 3-1 に示されるようにユーザスタック情報を配置します。
オフセット | レジスタ |
---|---|
00h | IP |
02h | CS |
04h | FLAGS |
06h | AX |
08h | BX |
0Ah | CX |
0Ch | DX |
0Eh | SI |
10h | DI |
12h | BP |
14h | DS |
16h | ES |
18h | IP |
1Ah | CS |
1Ch | FLAGS |
訳注
INT 25h | ||
絶対ディスク読込 Absolute Disk Read |
||
入力パラメータ | ||
AL | ドライブ番号 (訳注 : 0 = A, 1 = B...) | |
CX | 読み込むセクタ数 | |
DX | 読み込む先頭の論理セクタ番号 | |
DS | 転送アドレスのセグメント | |
BX | 転送アドレスのオフセット | |
戻り値 | ||
AX | キャリーフラグがセットされている場合、エラーコード |
INT25h は、ディスクの特定位置からメモリへデータを転送します。 CX レジスタはディスクから読み込むセクタ数を指定し、DX レジスタに格納されたセクタ番号から始まります。 論理セクタ番号は論理ディスクの先頭(これは物理ディスクの先頭ということもありえますが、必ずしもそうではありません)から計算されます。 セクタの番号付けは、同一トラック上のセクタ順、そして同一ヘッド上にある別トラックへ、それから別ヘッド上の順で続きます。 ディスクがセクタインターリーブを使用している場合、論理セクタ番号が連続しているセクタはディスク上で隣接していません。
転送が成功した場合、リターン時にキャリーフラグが 0 にセットされます。 転送が失敗した場合、キャリーフラグが 1 にセットされ、AX にエラーコードが格納されます。 AL に返されるコードは Table 3-3 の一覧のうちのひとつです。 AH に返されるコードは Table 3-4 の一覧のうちのひとつです。
リターン時、このコールで保存されるレジスタはセグメントレジスタのみです (訳注 : つまりセグメント以外のレジスタの内容は破壊されます)。 DR-DOS は FAR RETURN (RETF) 命令によって呼び出し元に戻るので、元のフラグはスタックに残ったままであり、明示的に取りのぞかねばなりません (訳注 : たとえば POPF 命令などで)。
オフセット | 型 | 内容 |
---|---|---|
00h | dword | 読み込む先頭セクタ |
04h | word | 読み込むセクタ数 |
06h | dword |
転送アドレス (上位ワードがセグメント、下位ワードがオフセット) |
32MB 未満のパーティションでの位置指定には、標準的なフォーマットと拡張フォーマットのどちらを使ってもかまいません。
AH の値 | エラー |
---|---|
02h | その他全般のエラー General error |
03h | ライトプロテクトがかかっている Attempted write on protected diskette |
04h | セクタが見つからない Sector not found |
08h | 読み込み時 CRC エラー Bad CRC on read |
40h | シーク失敗 SEEK failed |
80h | デバイスの応答がない Attachment failed to respond |
INT 26h | ||
絶対ディスク書き込み Absolute Disk Write |
||
入力パラメータ | ||
AL | ドライブ番号 | |
CX | 書き込むセクタ数 | |
DX | 書き込む先頭の論理セクタ番号 | |
DS | 転送アドレスのセグメント | |
BX | 転送アドレスのオフセット | |
戻り値 | ||
AX | キャリーフラグがセットされている場合、エラーコード |
INT 26h は、メモリからディスクの特定位置へデータを転送します。 INT 25h のように、ディスク位置の特定に論理セクタ番号を使用します。 INT 25h で示した拡張フォーマットは INT 26h でも有効です。 戻り値も同様の扱いです。 エラーコードの定義は Table 3-4 を参照してください。
INT 27h を発行することで、DR-DOS コマンドプロセッサが 64K バイト未満のプログラムから制御を取り戻す時に、そのプログラムを保持させます。 終了すれどもとどまったままのプログラム(つまり常駐プログラム)は、DR-DOS に制御を戻す前にファイルをクローズすることはしません。 メモリ使用効率を改善するため、プログラムは INT 27h で終了する前に、PSP のオフセット 2Ch のワードに格納されるセグメント値を ES に入れて、メモリ解放 (49h) をコールするべきです。 これで環境のコピーが入ったメモリが解放されます。 キーププロセス (31h) ファンクションコールによって、プログラムが、バッチファイル中で解釈できる終了コードを渡せるようになります。
割り込みベクタテーブルの INT 22h, 23h, 24h は、プログラムが PSP にロードされた時に格納されていた値に戻されます。 このため、恒常的に常駐する Ctrl-Break や致命的エラーハンドラルーチンは、この方法 (INT 27h) でインストールして使用できません。
プログラムの常駐には、INT 27h のかわりにキーププロセス (31h) がいかなる時でも使えることに注意してください。 INT 27h は 64K バイトをこえるプログラム、あるいは上位メモリにロードされる EXE プログラムには使えません。
(訳注 : なんか記述がないので念のため追加しておくと、INT 27h 発行の際には、DX レジスタに常駐させるプログラムの最終オフセット + 1 の値を入れておく必要があります。まあふつうはキーププロセスの方を使うので、どうでもいいんですが)
(訳してません)
(訳してません)