Content-Type: text/html; charset=Shift_JIS
Page Title: Chapter 3 : DR-DOS System and Programmer's Guide (私訳)
[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 に示す割り込みをサポートします。
+--------+--------------------------------------------------------------------+
|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)、C
trl-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 はこれらのビットに割り振られた値の一覧です。
+-----------+----------------------------------------------------------------+
|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 はエラーコードの一覧です
。
+---------+-------------------------------------------------------------------+
|DI(下位 | エラー |
|バイト) | |
| の値 | |
+---------+-------------------------------------------------------------------+
|00H |ライトプロテクトがかかっているAttempted write on protected diskette|
+---------+-------------------------------------------------------------------+
|01H |存在しないユニットUnit unknown |
+---------+-------------------------------------------------------------------+
|02H |ドライブの準備ができていないDrive not ready |
+---------+-------------------------------------------------------------------+
|03H |存在しないコマンドCommand unknown |
+---------+-------------------------------------------------------------------+
|04H |CRC エラーCRC error |
+---------+-------------------------------------------------------------------+
|05H |ドライブリクエストストラクチャの長さが正しくないBad request structu|
| |re 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 |
+------------------------------------------+---------------------------------+
訳注
o オフセットはスタックポインタ (SS:SP) を基準としてバイト単位です。オフセット
00h がスタックのいちばん上になります。
o オフセット 00h からの IP, CS, FLAGS は、INT 24h が発行された時点でのシステ
ムレジスタの値です。オフセット 06h 以降はユーザプログラムが INT 21h を発行
した時点でのレジスタの値です。(本家のリファレンスの画像と記述が微妙に異な
りますが、たぶんあっちの方がミスってるんだと思う)
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 に返されるコードは Ta
ble 3-4 の一覧のうちのひとつです。
リターン時、このコールで保存されるレジスタはセグメントレジスタのみです (訳注 :
つまりセグメント以外のレジスタの内容は破壊されます)。DR-DOS は FAR RETURN (RET
F) 命令によって呼び出し元に戻るので、元のフラグはスタックに残ったままであり、明
示的に取りのぞかねばなりません (訳注 : たとえば POPF 命令などで)。
NOTE : 32 MB を超えるパーティションサイズを指定するための拡張フォーマットが提供
されており、先頭セクタ番号として 32 ビット値を INT 25h に渡せます。CX が FFFFh
の場合、DS:BX は無条件ディスクリードを格納したパケットを指示します。パケットは
先頭セクタ番号、読み込みセクタ数、そして転送アドレスを格納しています。Figure 3.
2 にて図示されています。
+-----+-----+-----------------------------------------------------------------+
|オフ | 型 | 内容 |
|セッ | | |
| ト | | |
+-----+-----+-----------------------------------------------------------------+
|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 |
+-------+--------------------------------------------------------------------+
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.