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.