[Front] [Prev Chapter] [Next Chapter] [in English]

DR-DOS のサポートする割り込み

INT 20h -- Program Terminate

INT 21H -- Invoke a System Call

INT 22H -- Terminate Address

INT 23H -- Ctrl-Break Address

INT 24H -- Critical Error Handler

INT 25H -- Absolute Disk Read

INT 26H -- Absolute Disk Write

INT 27H -- Terminate and Stay Resident

INT 2FH -- Multiplex Interrupt

PRINT Spooler Request Error Codes


DR-DOS は Table 3-1 に示す割り込みをサポートします。

Table 3 1
DR-DOS がサポートする割り込み
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 -- Program Terminate

INT 20h を発行することにより、割り込みテーブル内にある終了アドレス (INT 22h)、Ctrl-Break ハンドラ (INT 23h)、致命的エラーハンドラ (INT 24h) の値が、現在のプログラムのロード時に格納されていた値に戻されます。

INT 20h ファンクションに応じて、DR-DOS はすべてのファイルバッファをフラッシュします。 もし長さの変更されたファイルが INT 20h 以前にクローズしていない場合、ディレクトリエントリには、そのファイル長および日時は正しく記録されません(Chapter 4 中の、FCB ファイルクローズ (10h) とハンドルクローズ (3Eh) コールを参照)。 終了する前に、プログラムがエラーコードもしくは終了コードを渡したい場合には、プロセス終了 (4Ch) を使用してください。

NOTE : プログラムは INT 20h を発行する前に、CS レジスタにプログラムの PSP のセグメントアドレスを入れておかねばなりません。 PSP については Chapter 4 内のプログラムのロードと実行 (4Bh) コールを参照してください。 INT 20h は、初期のプログラムとの互換性のためにのみサポートされています : プログラム終了のもっとも望ましい方法は、ファンクション 4Ch のプロセス終了です。

INT 21H -- Invoke a System Call

Chapter 2 の 2.1 DR-DOS システムコールパラメータで INT 21h を使ったシステムコールの呼び出し方を、Chapter 4 で個々のシステムコールについて記述しています。

3.3 INT 22H -- Terminate Address

この割り込みベクタには、現在のプログラムが終了するときに DR-DOS が制御を移すアドレスが格納されています。

DR-DOS は PSP 作成の際、プログラムの PSP のオフセット 0Ah にこのアドレスをコピーします。

NOTE : INT 22h を直接呼び出さないでください。

3.4 INT 23H -- Ctrl-Break Address

標準入出力、標準プリンタ、補助デバイスの処理中にユーザが 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 システムコール中の値に戻されます。

3.5 INT 24H -- Critical Error Handler

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 で拾います。

3.5.1 ディスクエラー

AH レジスタの bit7(最上位)がゼロならば、ディスクエラーを示します。 AH の bit7 = 0 のとき、AL レジスタはエラーの発生したドライブ番号(0 がドライブ A に相当)を格納しています。 AH の bit 0 〜 2 は、行われたディスク操作とエラーに陥ったディスク領域を示しています。 AH の bit 3 〜 5 はディスクエラーに対する有効な応答を示しています。 Table 3-2 はこれらのビットに割り振られた値の一覧です。

Table 3 2
INT 24H ディスクエラーと応答指示
AH のビット 意味
エラー識別
0 0 読み込み時
1 書き込み時
2〜1 00 DOS システム領域
01 FAT
10 ディレクトリ
11 データ領域
3 0 失敗は許可されていない
1 失敗が許可されている
4 0 再試行は許可されていない
1 再試行が許可されている
5 0 エラーの無視が許可されていない
1 エラーの無視が許可されている

致命的エラーハンドラが無効な応答を返した場合、以下のようにデフォルトの応答が設定されます。

無効な応答 デフォルトの応答
無視 失敗
再試行 失敗
失敗 終了

DR-DOS はリトライのために全レジスタを設定し、DI レジスタの下位バイトにエラーコードを渡します。 DI の上位バイトは未定義です。 Table 3-3 はエラーコードの一覧です。

Table 3-3
DR-DOS 致命的エラーコード
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 に示されるようにユーザスタック情報を配置します。

Figure 3 1
INT 24h のスタック内容
オフセット レジスタ
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

訳注

3.6 INT 25H -- Absolute Disk Read

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 命令などで)

NOTE : 32 MB を超えるパーティションサイズを指定するための拡張フォーマットが提供されており、先頭セクタ番号として 32 ビット値を INT 25h に渡せます。 CX が FFFFh の場合、DS:BX は無条件ディスクリードを格納したパケットを指示します。 パケットは先頭セクタ番号、読み込みセクタ数、そして転送アドレスを格納しています。 Figure 3.2 にて図示されています。

Figure 3-2
絶対ディスク読込のためのパケット
オフセット 内容
00h dword 読み込む先頭セクタ
04h word 読み込むセクタ数
06h dword 転送アドレス
(上位ワードがセグメント、下位ワードがオフセット)

32MB 未満のパーティションでの位置指定には、標準的なフォーマットと拡張フォーマットのどちらを使ってもかまいません。

Table 3 4
絶対ディスク読込/書込のエラーコード
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

3.7 INT 26H -- Absolute Disk Write

INT 26h
絶対ディスク書き込み
Absolute Disk Write
入力パラメータ
AL ドライブ番号
CX 書き込むセクタ数
DX 書き込む先頭の論理セクタ番号
DS 転送アドレスのセグメント
BX 転送アドレスのオフセット
戻り値
AX キャリーフラグがセットされている場合、エラーコード

INT 26h は、メモリからディスクの特定位置へデータを転送します。 INT 25h のように、ディスク位置の特定に論理セクタ番号を使用します。 INT 25h で示した拡張フォーマットは INT 26h でも有効です。 戻り値も同様の扱いです。 エラーコードの定義は Table 3-4 を参照してください。

3.8 INT 27H -- Terminate and Stay Resident

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 の値を入れておく必要があります。まあふつうはキーププロセスの方を使うので、どうでもいいんですが)

3.9 INT 2FH -- Multiplex Interrupt

(訳してません)

3.9.1 PRINT Spooler Request Error Codes

(訳してません)


Copyright (c) 1993, 1997 Caldera, Inc All rights reserved.