Content-Type: text/html; charset=Shift_JIS Page Title: Chapter 6 : DR-DOS System and Programmer's Guide (私訳) [Front][Prev Chapter][Next Chapter] [in English] ------------------------------------------------------------------------------- デバイスドライバ はじめに デバイスドライバヘッダ リクエストパケット BPB(BIOS パラメータブロック) デバイスドライバファンクション ------------------------------------------------------------------------------- 6.1 はじめに ロード可能なデバイスドライバは、付加的なハードウェアデバイスをサポートする能力 を提供します。いったんロードされたデバイスドライバは、IBMBIO.COM ファイルに結合 された常駐デバイスドライバと、構造上なんら差異はありません。ふつう、デバイスド ライバは 8080 形式のメモリモデルをしており、コードセグメントとデータセグメント は同じです。(野暮な訳注 : 8080 形式というのはつまり、インテルの 8 ビット CPU である i8080 のような、という意味なんだと思いますけど…)デバイスドライバは一般 的に、.SYS 拡張子をつけています。デバイスドライバは .COM 形式でも .EXE 形式でも かまいません。メモリイメージは、デバイスヘッダを先頭にしなければならず、デバイ スヘッダは以下のセクションで記述されるフォーマットのデータ構造です。 デバイスドライバには2つのタイプがあります。ブロックデバイスとキャラクタデバイ スです。 キャラクタデバイスはシーケンシャル入出力を扱います。入出力を行うために、アプリ ケーションはキャラクタデバイスへの回線を開くことができます。キャラクタデバイス は、たとえば MODEM といった、それぞれ個別の名前を持っています。 ブロックデバイスは、システムのディスクドライブへのランダム入出力を扱います。ブ ロックデバイスは名前づけされていませんが、A:、B:、以下同様のドライブレターを割 り付けられています。単一の物理ディスクが複数の割り付けユニットに区画分けされて いることもあります。最小のブロックサイズは、デバイスの物理セクタサイズです。た とえば、往々にしてディスケットドライブはユニット A:、B: であり、最初のハードデ ィスクは C: と D: のふたつの区画に分かれています。ブロックデバイスドライバは、 複数の物理ユニットそれぞれを、ユニット個別の割り付けを行うことで管理します。そ れぞれが多数のユニットを管理する、多数のデバイスドライバがあることになります。 6.2 デバイスドライバヘッダ +-----+-----+-----+-----------------------------------------------------------+ |オフ | 型 | 値 | 説明 | |セッ | | | | | ト | | | | +-----+-----+-----+-----------------------------------------------------------+ |00h |dword|NEXTD|次のデバイスドライバへのポインタ | | | |H | | +-----+-----+-----+-----------------------------------------------------------+ |04h |word |ATTRI|デバイスドライバの属性 | | | |BUTE | | +-----+-----+-----+-----------------------------------------------------------+ |06h |word |STRAT|ストラテジコードのエントリポイント(オフセットのみ) | | | |EGY | | +-----+-----+-----+-----------------------------------------------------------+ |08h |word |INTER|インタラプトコードのエントリポイント(オフセットのみ) | | | |RUPT | | +-----+-----+-----+-----------------------------------------------------------+ |0Ah |8 byt|UNIT |デバイス名(キャラクタデバイス)、サポートするユニット数( | | |es | |ブロックデバイス) | +-----+-----+-----+-----------------------------------------------------------+ 6.2.1 NEXTDH 次のデバイスドライバへのダブルワードポインタです。デバイスドライバチェーンの最 後のドライバでは、NEXTDH は特別な値 FFFF:FFFFh です。 6.2.2 ATTRIBUTE このフィールドは、デバイスドライバの特徴を記述します。Figure 6-2 は ATTRIBUTE フィールドのビットを定義しています。 +------+---------------------------------------------------------------------+ |ビット| 説明 | +------+---------------------------------------------------------------------+ |15 |1 -- キャラクタデバイス | +------+---------------------------------------------------------------------+ |14 |1 -- IOCTL ファンクションサポート | +------+---------------------------------------------------------------------+ |13 |1 -- OUTPUT UNTIL BUSY サポート | +------+---------------------------------------------------------------------+ |12 |予約 (0) | +------+---------------------------------------------------------------------+ |11 |1 -- OPEN/CLOSE/RM ファンクションサポート | +------+---------------------------------------------------------------------+ |10〜7 |予約 (0) | +------+---------------------------------------------------------------------+ |6 |1 -- GENERIC IOCTL サポート | +------+---------------------------------------------------------------------+ |5 |予約 (0) | +------+---------------------------------------------------------------------+ |4 |Special bit | | |1 -- INT 29h での高速文字表示サポート | | |(訳注 : この項追加) | +------+---------------------------------------------------------------------+ |3 |1 -- カレント CLOCK デバイス | +------+---------------------------------------------------------------------+ |2 |1 -- カレント NUL デバイス | +------+---------------------------------------------------------------------+ |1 |1 -- カレント標準出力デバイス | +------+---------------------------------------------------------------------+ |0 |1 -- カレント標準入力デバイス | +------+---------------------------------------------------------------------+ +--------+--------------------------------------------------------------------+ | ビット | 説明 | +--------+--------------------------------------------------------------------+ |15 |0 -- ブロックデバイス | +--------+--------------------------------------------------------------------+ |14 |1 -- IOCTL ファンクションサポート | +--------+--------------------------------------------------------------------+ |13 |1 -- NON FAT ID(BUILD BPB ファンクション参照) | +--------+--------------------------------------------------------------------+ |12 |予約 (0) | +--------+--------------------------------------------------------------------+ |11 |1 -- OPEN/CLOSE/RM ファンクションサポート | +--------+--------------------------------------------------------------------+ |10〜7 |予約 (0) | +--------+--------------------------------------------------------------------+ |6 |1 -- GENERIC IOCTL、GET/SET logical device サポート | +--------+--------------------------------------------------------------------+ |5〜2 |予約 (0) | +--------+--------------------------------------------------------------------+ |1 |1 -- 32 ビットセクタ番号サポート | +--------+--------------------------------------------------------------------+ |0 |予約 (0) | +--------+--------------------------------------------------------------------+ 6.2.3 STRATEGY ドライバ中の本オフセットは、ストラテジコードのエントリーポイントです。ストラテ ジコードは、ファンクションが実行されるとき、DR-DOS によって呼び出されます。DR-D OS はリクエストパケットのポインタを(訳注 : ES:BX に)渡します。デバイスドライ バはパケットポインタをキューに格納します。このコールの実行中、レジスタの内容は 保存されていなければなりません。 (重要な訳注 : ドライバヘッダ中の STRATEGY と INTERRUPT はそれぞれワード値であ り、エントリーポイントへのオフセット値のみを格納していますが、DOS はこれらのコ ードを FAR CALL で呼び出します。したがって、これらのルーチンは RETF 命令で終了 させなければなりません。たとえば ArrowASM でデバイスドライバを書く場合、ArrowAS M は RETF と RETN を明示的に書き分けられないので、ストラテジコードとインタラプ トコードを PROC FAR 〜 ENDP の中に入れるか、RETF 命令に相当するバイナリコード ( CBh) をなんらかの方法で埋め込む必要があるでしょう。) 6.2.4 INTERRUPT ドライバ中の本オフセットは、インタラプトコードのエントリーポイントです。インタ ラプトコードは、その前のストラテジエントリの呼び出しでセットされたリクエストパ ケットを処理するため、DR-DOS によって呼び出されます。ドライバはリクエストパケッ トを解釈し、ファンクションを実行して DR-DOS に戻ります。レジスタは、ファンクシ ョンが値を返すために使うことはなく、その内容は保存されていなければなりません。 (訳注 : STRATEGY の「重要な訳注」を参照のこと) 6.2.5 UNIT キャラクタデバイスでは、このフィールドには、8 バイトの ASCII デバイス名を格納し ます。デバイス名は 8 バイトで、8 バイト未満の場合は空白文字で残りを埋めます。フ ァイル名として有効な文字のみが使えます。ブロックデバイスでは、このフィールドの 先頭バイトには、ドライバがサポートするユニット数を格納します。ドライバが初期化 (訳注 : INIT ファンクション)を行ったのち、DR-DOS はこのフィールドを埋めます。 6.3 リクエストパケット リクエストパケットの構造体は、ファンクションに依存した可変長になっています。最 小のサイズは、以下に定義する 13 バイトです。パケットのアドレスは、ドライバへの ストラテジ呼び出しの際、ES:BX のレジスタペアに渡されます。       (Table 6-1 参照)       +-----+-----+-----+-----------------------------------------------------------+ |オフ | 型 |名前 | 説明 | |セッ | | | | | ト | | | | +-----+-----+-----+-----------------------------------------------------------+ |00h |byte |RPLEN|バイト単位でのパケット長 | | | |GTH | | +-----+-----+-----+-----------------------------------------------------------+ |01h |byte |UNIT |ユニット番号(ブロックデバイスのみ) | +-----+-----+-----+-----------------------------------------------------------+ |02h |byte |FUNCT|ファンクション番号。定義は以下の通り。 | | | |ION |0 = Init | | | | |1= Media check | | | | |2 = Build BPB | | | | |3 = IOCTL input | | | | |4 = Input | | | | |5 = Non destructive input no wait | | | | |6 = Input status | | | | |7 = Input Flush | | | | |8 = Output | | | | |9 = Output with verify | | | | |10 = Output status | | | | |11 = Output flush | | | | |12 = IOCTL output | | | | |13 = Device open | | | | |14 = Device close | | | | |15 = Removable media | | | | |19 = Generic IOCTL request | | | | |23 = Get logical device | | | | |24 = Set logical device | +-----+-----+-----+-----------------------------------------------------------+ |03h |word |STATU|ステータス | | | |S | | +-----+-----+-----+-----------------------------------------------------------+ |05h |8 byt| |予約 | | |es | | | +-----+-----+-----+-----------------------------------------------------------+ +---+-------------------------------------------------------------------------+ |ビ | 内容 | |ッ | | |ト | | +---+-------------------------------------------------------------------------+ |15 |1 -- エラー | | |0 -- 正常 | +---+-------------------------------------------------------------------------+ |14 |予約 (0) | |〜1| | |0 | | +---+-------------------------------------------------------------------------+ |9 |1 -- BUSY | +---+-------------------------------------------------------------------------+ |8 |1 -- DONE(エラーで終了、もしくは正常に終了した) | +---+-------------------------------------------------------------------------+ |7〜|エラーコード(bit15 = 1 の場合) | |0 |00h -- ライトプロテクト違反Write protect violation | | |01h -- 不明なユニットUnknown unit | | |02h -- デバイスの準備ができていないDevice not ready | | |03h -- 不明なファンクションUnknown command | | |04h -- CRC エラーCRC failure | | |05h -- リクエストパケットの長さが不正Bad request structure length | | |06h -- シークエラーSeek faiure | | |07h -- 不明なメディアUnknown media | | |08h -- セクタが見つからないSector not found | | |09h -- プリンタ用紙切れPrinter out of paper | | |0Ah -- 書き込み失敗Write failure | | |0Bh -- 読み込み失敗Read failure | | |0Ch -- その他全般の失敗General failure | | |0Dh -- (予約) | | |0Eh -- (予約) | | |0Fh -- 不正なディスク交換Invalid disk change | | | | | |(訳注 : Table 3-3 の 00h〜0Ch のあたり、Table 5-1 のエラーコード 19〜31 | | |のあたりも見てみるといいかもしれません) | +---+-------------------------------------------------------------------------+ 6.4 BPB(BIOS パラメータブロック) (訳注 : 元の図 (fig6-6.gif) の判読が困難なので、これは参照にとどめ、訳者の一存 で記述しました。) +-------+-------+-------------------------------------------------------------+ |オフセ | 型 | 内容 | | ット | | | +-------+-------+-------------------------------------------------------------+ |00h |word |1 セクタあたりのバイト数。32の倍数(訳注 : 「2の倍数」のよ| | | |うな気もするが、元の図がなんとなく32に見えるので一応こうし | | | |ておく) | +-------+-------+-------------------------------------------------------------+ |02h |byte |1クラスタあたりのセクタ数。2のべき乗でなければならない。 | +-------+-------+-------------------------------------------------------------+ |03h |word |先頭 FAT のセクタ番号。通常の値は 1。 | +-------+-------+-------------------------------------------------------------+ |05h |byte |FAT の数。通常の値は 2。 | +-------+-------+-------------------------------------------------------------+ |06h |word |ルートディレクトリ中のディレクトリエントリ総数。 | +-------+-------+-------------------------------------------------------------+ |08h |word |ディスクのセクタ数。0000h の場合はオフセット 15h の dword 値 | | | |が使われる。 | +-------+-------+-------------------------------------------------------------+ |0Ah |byte |FAT ID | +-------+-------+-------------------------------------------------------------+ |0Bh |word |ひとつの FAT あたりのセクタ数。 | +-------+-------+-------------------------------------------------------------+ |0Dh |word |1トラックあたりのセクタ数 | +-------+-------+-------------------------------------------------------------+ |0Fh |word |ヘッド数 | +-------+-------+-------------------------------------------------------------+ |11h |dword |隠しセクタ数。 | +-------+-------+-------------------------------------------------------------+ |15h |dword |セクタサイズでのディスク総数。 | | | |ATTRIBUTE の bit1 = 1 の場合のみ使用される。 | +-------+-------+-------------------------------------------------------------+ 6.5 デバイスドライバファンクション DR-DOS は、デバイスドライバ構築のために、多数のファンクションを用意しています。 ファンクションは以下のサブセクション中で記述されています。 6.5.1 INIT ファンクション ドライバのためにハードウェアとソフトウェアの初期化を行い、リクエストヘッダにド ライバの終了アドレスとステータスワードをセットします。ブロックデバイスでは、ユ ニット数と BPB 配列のポインタもセットします。終了アドレスをセットすることにより 、必要とされないメモリを開放、もしくは、データ構造体やバッファのためにより多く のメモリを確保することができます。 +-----+-------+--------+------------------------------------------------------+ |オフ | 型 | 名前 | 説明 | |セッ | | | | | ト | | | | +-----+-------+--------+------------------------------------------------------+ |00h |byte |RPLENGTH|バイト単位でのパケット長 | +-----+-------+--------+------------------------------------------------------+ |01h |byte |UNIT |ユニット番号(ブロックデバイスのみ) | +-----+-------+--------+------------------------------------------------------+ |02h |byte |FUNCTION|ファンクション番号。 | +-----+-------+--------+------------------------------------------------------+ |03h |word |STATUS |ステータス | +-----+-------+--------+------------------------------------------------------+ |05h |8 bytes| |予約 | +-----+-------+--------+------------------------------------------------------+ |0Dh |byte |NBRUNITS|ドライバがサポートするユニット数(ブロックデバイス) | +-----+-------+--------+------------------------------------------------------+ |0Eh |dword |ENDADDR |ドライバの終了アドレス | +-----+-------+--------+------------------------------------------------------+ |12h |dword |BPBPTR |入力時、コマンドライン文字列アドレス | | | | |リターン時は BPB 配列のアドレスをセット(ブロックデバ | | | | |イス) | +-----+-------+--------+------------------------------------------------------+ |16h |byte |BLKNBR |論理デバイス番号(ブロックデバイス) | +-----+-------+--------+------------------------------------------------------+ NBRUNITS ドライバがサポートするユニット数をセットします(ブロックデバイスのみ)。 ENDADDR ドライバに続く、利用可能なメモリの先頭ポインタをセットします。このことによりシ ングルドライバのメモリ空間を増加、もしくは削減でき、ドライバに割り当てたメモリ 空間の最大限の活用を可能にします。複数のドライバが1グループに結合している場合 、グループ内のそれぞれのドライバが、グループのメモリ終端を示す変数を変更し、そ の値を ENDADDR フィールドに返します。このようにして各ドライバがデータ空間を確保 できます。この変数は、各ドライバが初期化されるごとに ENDADDR フィールドに値を返 します。INIT ファンクションはドライバインストール時に一度だけ呼び出されるので、 INIT コードは ENDADDR の値で示されるドライバ終端よりも後方に置いてかまいません 。これにより INIT ファンクション用コードは破棄されます。 (訳注 : DEVICEHIGH でドライバを UMB に読み込んだ場合、ドライバの使用可能な最上 位アドレスが ENDADDR に格納されています。このアドレスを超えるメモリをドライバが 使用したばあい、システム破壊の可能性が極めて濃厚ですので、ドライバの初期サイズ よりも大容量のメモリを使用する場合はあらかじめ ENDADDR の値を確認しておいた方が よいでしょう。しかし、DEVICEHIGH 以外の方法でドライバを読み込んだ場合の ENDADDR の初期値がどうなるのかよく知りません。ひょっとすると不定なのかもしれません。例 えばコードセグメントの値を調べて、ドライバが UMB にロードされた時だけ ENDADDR の初期値を確認する、といった対策が必要なのかもしれません…) BPBPTR ブロックデバイスで、BPB 構造体へのワードポインタ配列を指すためにセットします。 ドライバでサポートされる各ユニットにひとつづつ、ワードポインタ配列のエントリが 存在します。BPB は読み込まれるのみなので、ふたつ以上のユニットが同じ BPB を使用 する場合、ワードポインタ配列の該当エントリは同じ BPB 構造体を指すことができます 。 入力時、BPBPTR はオプションを格納した文字列を指しています。この文字列は CONFIG. SYS ファイル中の "DEVICE=" 文でロードされたドライバのために使用されます。この文 字列は "DEVICE=" 以降にある、空白でない最初の文字の位置を指しています。 (訳注 : たとえば、CONFIG.SYS 中に DEVICE=C:\myprog\hoge.sys param1 param2 という文があったとすると、hoge.sys の INIT ファンクション中の BPBPTR には C:\myprog\hoge.sys param1 param2 を指す FAR ポインタが初期値として格納されることになります。ただし、この文字列が 「素直な」ASCIZ 文字列でない場合があります。たとえば、微かに軟らかい某社の日本 語 MS-DOS では、パラメータを区切るスペース (20h) がヌルコード (00h) に置き換え られます。また、これは全社の DOS で基本的に共通の仕様のはずですが、文字列の内容 はすべて大文字化されます。したがって、小文字を必要とするパラメータはドライバに 渡すことができず、デフォルトで日本語化されていない DOS の場合、日本語を含むパラ メータは文字化けの可能性が大きいでしょう。 MS-DOS 方面の文献によると、文字列の終端は 0Dh もしくは 0Ah だそうです。) BLKNBR ドライバがサポートする先頭ユニットの論理ドライブ番号が、DR-DOS によってセットさ れています。(訳注 : 0 = A:, 1 = B: ...) 6.5.2 MEDIA CHECK ファンクション 最後にあった入出力ファンクション以降にメディアが交換されたか判定するため、ユニ ットを調べます。このファンクションはブロックデバイスでのみ使用され、その目的は パフォーマンスの向上です。メディアが交換されていない場合、DR-DOS が再度ドライブ にログする必要はありません。 +-----+-----+------+----------------------------------------------------------+ |オフ | 型 | 名前 | 説明 | |セッ | | | | | ト | | | | +-----+-----+------+----------------------------------------------------------+ |00h |byte |RPLENG|バイト単位でのパケット長 | | | |TH | | +-----+-----+------+----------------------------------------------------------+ |01h |byte |UNIT |ユニット番号(ブロックデバイスのみ) | +-----+-----+------+----------------------------------------------------------+ |02h |byte |FUNCTI|ファンクション番号。(1) | | | |ON | | +-----+-----+------+----------------------------------------------------------+ |03h |word |STATUS|ステータス | +-----+-----+------+----------------------------------------------------------+ |05h |8 byt| |予約 | | |es | | | +-----+-----+------+----------------------------------------------------------+ |0Dh |byte |MDB |メディア ID(FAT ID) | +-----+-----+------+----------------------------------------------------------+ |0Eh |byte |RETURN|交換ステータス | +-----+-----+------+----------------------------------------------------------+ |0Fh |dword|VOLUME|以前のメディアのボリュームラベルを格納してあるメモリへのポ| | | | |インタ。(ドライバが OPEN/CLOSE/RM をサポートしており、メ | | | | |ディアが交換された場合) | +-----+-----+------+----------------------------------------------------------+ MDB は、DR-DOS から渡される、現在のメディア ID です。本ファンクションは、以下の 3つのうちひとつの値を RETURN フィールドに返します。 -1 (F メディアは交換された Fh) 0  メディアは交換された、かもしれない (交換されたかどうかわからない) 1 メディアは交換されていない ハードウェアのチェンジラインが利用できないドライブの場合、最後に成功したディス クアクセスの後の2秒間は「交換されていない」を返す、という簡単なタイマを使えま す。これにより、ディスクに規則的にくり返しアクセスのあるリムーバブルメディアで 、パフォーマンスが向上します。 6.5.3 BUILD BPB ファンクション ブロックデバイスのみで使用されます。メディアの交換が検出され、DR-DOS がディスク に再度ログすることが必要なとき、呼び出されます。デバイスドライバは、メディアタ イプ判別のためにディスクを読み取り、選択もしくは作成した BPB へのポインタを返し ます。 +------------+--------+---------+-------------------------------------------+ | オフセット | 型 | 名前 | 説明 | +------------+--------+---------+-------------------------------------------+ |00h |byte |RPLENGTH |バイト単位でのパケット長 | +------------+--------+---------+-------------------------------------------+ |01h |byte |UNIT |ユニット番号(ブロックデバイスのみ) | +------------+--------+---------+-------------------------------------------+ |02h |byte |FUNCTION |ファンクション番号。(02h) | +------------+--------+---------+-------------------------------------------+ |03h |word |STATUS |ステータス | +------------+--------+---------+-------------------------------------------+ |05h |8 bytes | |予約 | +------------+--------+---------+-------------------------------------------+ |0Dh |byte |MDB |メディア ID (FAT ID) | +------------+--------+---------+-------------------------------------------+ |0Eh |dword |TRFADDR |FAT 先頭セクタのバッファアドレス | +------------+--------+---------+-------------------------------------------+ |12h |dword |BPBPTR |ドライバが作成した BPB のアドレス | +------------+--------+---------+-------------------------------------------+ デバイスドライバヘッダ中の、ATTRIBUTE フィールドの bit 13 が 0 の場合、DR-DOS は、FAT の先頭セクタを格納したセクタバッファへのポインタを TFRADDR に渡します。 (FAT の先頭セクタが、ドライバによってサポートされるすべてのディスクで、同じ位 置になければならないことに注意してください)FAT ID バイトはこのバッファの先頭バ イトであり、ドライバはこの値を読み込んで BPB にセットすることができます。ATTRIB UTE フィールドの bit 13 が 1 の場合、TFRADDR はセクタバッファを指し、このセクタ バッファは、ドライバがディスクを読み込んで BPB を判定するために使用できます。 BPB の構造は 6.4 BPB に記述されています。 6.5.4 INPUT, OUTPUT, OUTPUT with VERIFY ファンクション +-----+-------+-------+-------------------------------------------------------+ |オフ | 型 | 名前 | 説明 | |セッ | | | | | ト | | | | +-----+-------+-------+-------------------------------------------------------+ |00h |byte |RPLENGT|バイト単位でのパケット長 | | | |H | | +-----+-------+-------+-------------------------------------------------------+ |01h |byte |UNIT |ユニット番号(ブロックデバイスのみ) | +-----+-------+-------+-------------------------------------------------------+ |02h |byte |FUNCTIO|ファンクション番号。 | | | |N |3 -- IOCTL input | | | | |4 -- INPUT | | | | |8 -- OUTPUT | | | | |9 -- OUTPUT with Verify | | | | |12 -- IOCTL output | +-----+-------+-------+-------------------------------------------------------+ |03h |word |STATUS |ステータス | +-----+-------+-------+-------------------------------------------------------+ |05h |8 bytes| |予約 | +-----+-------+-------+-------------------------------------------------------+ |0Dh |byte |MDB |メディア ID(FAT ID) | +-----+-------+-------+-------------------------------------------------------+ |0Eh |dword |TFRADDR|データを読み込む、もしくは書き込むデータの、先頭アドレ | | | | |ス | +-----+-------+-------+-------------------------------------------------------+ |12h |word |COUNT |入出力セクタ数(ブロックデバイス) | | | | |入出力バイト数(キャラクタデバイス) | | | | | | | | | |※ドライバはリターン時、実際に読み書きしたセクタ(バイ | | | | |ト)数をこのフィールドに返す。 | +-----+-------+-------+-------------------------------------------------------+ |14h |word |STARTSE|入出力開始セクタ番号 | | |(訳注 |C | | | |参照) | | | +-----+-------+-------+-------------------------------------------------------+ |16h |dword |VOLUME |以前のメディアのボリュームラベルを格納してあるメモリへ | | | | |のポインタ。(ドライバが OPEN/CLOSE/RM をサポートしてお| | | | |り、メディアが交換された場合) | +-----+-------+-------+-------------------------------------------------------+ |1Ah |dword |STARTSE|入出力開始セクタ番号(32bit) | | | |C32 | | +-----+-------+-------+-------------------------------------------------------+ INPUT ファンクションは、キャラクタデバイスからは指定された文字数を、ブロックデ バイスからは指定されたセクタ数を読み取ります。デバイスドライバは実際に転送した セクタ数、もしくはバイト数を COUNT フィールドに返し、STATUS ワードの戻り値をセ ットします。 OUTPUT ファンクションは、キャラクタデバイスへ指定された文字数を、ブロックデバイ スへ指定されたセクタ数を書き込みます。デバイスドライバは実際に転送したセクタ数 、もしくはバイト数を COUNT フィールドに返し、STATUS ワードの戻り値をセットしま す。 OUTPUT with VERIFY ファンクションは OUTPUT とほぼ同じですが、データが正しく書き 込まれたことを確認するために、書き込み後の読み出しチェックがブロックデバイス上 で行われる点が違います。IOCTL INPUT と IOCTL OUTPUT は INPUT、OUTPUT と同じやり 方で処理を行いますが、エラーチェックは行いません。 NOTE : 小容量のブロックデバイスでは、最大セクタ番号の位置は 65536 未満で、RPLEN GTH は 22 です。大容量ブロックデバイスでは、セクタ番号は 32 ビット長で、RPLENGT H は 24 です。この場合、STARTSEC の上位ワードも使用されます。 (訳注 : デバイスヘッダの ATTRIBUTE フィールド中、bit 1 がセットされている場合 、つまり32ビットセクタ番号がサポートされている場合、STARTSEC のかわりに START SEC32 フィールドが使用されます。  このガイドの原文によると、オフセット 14h の STARTSEC は word/dword いずれかの 型であり、どちらの型かを判別するには RPLENGTH の値を調べるのだそうです。RPLENGT H が 22 の場合は STARTSEC は word であり、24 の場合は dword です。ちなみに STAR TSEC よりも後のフィールドは未定義です。しかしこの記述を信ずるならば、DR-DOS と MS(PC)-DOS との間には、32ビットセクタアクセスの方法に互換性がないことになりま す。たとえばサードパーティ製の MO や PD のドライバを組み込むことを考えれば、こ れが非常にゆゆしき事態であることがおわかりいただけると思います。  気になったので OpenDOS 7.01 のカーネルソースをすこし見てみたのですが、結局の ところ、MS(PC)-DOS 4.0 以降と互換性のある方式をとっているようです。おそらく原文 の記述は、DR-DOS 6.0、でなければもっと以前の DR(EZ)-DOS のものであろうと思いま す。  ということで、この部分のヘッダの説明は MS(PC)-DOS 方面の文献を元に作成しまし た。) 6.5.5 NONDESTRUCTIVE INPUT, NO WAT ファンクション 本ファンクションはキャラクタデバイスでのみ利用され、DR-DOS が入力バッファから除 去せずに文字入力することを許します。文字はリクエストヘッダに返され、STATUS の B USY ビットが 0 にセットされます。入力文字がない場合、BUSY ビットは 1 が返されま す。 +------------+--------+---------+-------------------------------------------+ | オフセット | 型 | 名前 | 説明 | +------------+--------+---------+-------------------------------------------+ |00h |byte |RPLENGTH |バイト単位でのパケット長 | +------------+--------+---------+-------------------------------------------+ |01h |byte |UNIT |ユニット番号(ブロックデバイスのみ) | +------------+--------+---------+-------------------------------------------+ |02h |byte |FUNCTION |ファンクション番号。(5) | +------------+--------+---------+-------------------------------------------+ |03h |word |STATUS |ステータス | +------------+--------+---------+-------------------------------------------+ |05h |8 bytes | |予約 | +------------+--------+---------+-------------------------------------------+ |0Dh |byte |CHARAC |文字 | +------------+--------+---------+-------------------------------------------+ 6.5.6 INPUT FLUSH, OUTPUT FLUSH ファンクション キャラクタデバイスで使われる入力、出力バッファをフラッシュさせます。STATUS ワー ドはエラーなし(0100h)をセットします。 +-----+-----+-----+-----------------------------------------------------------+ |オフ | 型 |名前 | 説明 | |セッ | | | | | ト | | | | +-----+-----+-----+-----------------------------------------------------------+ |00h |byte |RPLEN|バイト単位でのパケット長 | | | |GTH | | +-----+-----+-----+-----------------------------------------------------------+ |01h |byte |UNIT |ユニット番号(ブロックデバイスのみ) | +-----+-----+-----+-----------------------------------------------------------+ |02h |byte |FUNCT|ファンクション番号。 | | | |ION |7 -- INPUT FLUSH | | | | |11 -- OUTPUT FLUSH | +-----+-----+-----+-----------------------------------------------------------+ |03h |word |STATU|ステータス | | | |S | | +-----+-----+-----+-----------------------------------------------------------+ |05h |8 byt| |予約 | | |es | | | +-----+-----+-----+-----------------------------------------------------------+ 6.5.7 OPEN, CLOSE ファンクション ブロックデバイス上のファイルがオープン、クローズされるたびに、あるいはキャラク タデバイスがオープン、クローズされた時に BIOS に告知するため、DR-DOS はこれらの ファンクションを使います。 +-----+-----+-----+-----------------------------------------------------------+ |オフ | 型 |名前 | 説明 | |セッ | | | | | ト | | | | +-----+-----+-----+-----------------------------------------------------------+ |00h |byte |RPLEN|バイト単位でのパケット長 | | | |GTH | | +-----+-----+-----+-----------------------------------------------------------+ |01h |byte |UNIT |ユニット番号(ブロックデバイスのみ) | +-----+-----+-----+-----------------------------------------------------------+ |02h |byte |FUNCT|ファンクション番号。 | | | |ION |13 -- DEVICE OPEN | | | | |14 -- DEVICE CLOSE | +-----+-----+-----+-----------------------------------------------------------+ |03h |word |STATU|ステータス | | | |S | | +-----+-----+-----+-----------------------------------------------------------+ |05h |8 byt| |予約 | | |es | | | +-----+-----+-----+-----------------------------------------------------------+ これにより、デバイス上にオープンされているファイルがあるかどうかを BIOS が記録 できるようになります。BIOS が、リムーバブルメディアのデバイス上で、たとえばトラ ックバッファのようなローカルバッファを管理している場合、デバイス上の最後のファ イルがクローズされた時に、BIOS はローカルバッファをフラッシュできます。プリンタ のようなキャラクタデバイスでは、デバイスがオープンされたとき、BIOS は文字フォン トリセットのエスケープシーケンスを送り、紙送り(フォームフィード)することがで きます。 6.5.8 REMOVABLE MEDIA ファンクション 本ファンクションはブロックデバイス用で、ユニットがリムーバブル(交換可能)メデ ィアを格納するかどうかを報告します。メディアが固定されている場合、STATUS ワード の BUSY ビットは 1 がセットされ、リムーバブルの場合は 0 がセットされます。 +------------+--------+---------+-------------------------------------------+ | オフセット | 型 | 名前 | 説明 | +------------+--------+---------+-------------------------------------------+ |00h |byte |RPLENGTH |バイト単位でのパケット長 | +------------+--------+---------+-------------------------------------------+ |01h |byte |UNIT |ユニット番号(ブロックデバイスのみ) | +------------+--------+---------+-------------------------------------------+ |02h |byte |FUNCTION |ファンクション番号。(15) | +------------+--------+---------+-------------------------------------------+ |03h |word |STATUS |ステータス | +------------+--------+---------+-------------------------------------------+ |05h |8 bytes | |予約 | +------------+--------+---------+-------------------------------------------+ | | | | | +------------+--------+---------+-------------------------------------------+ 6.5.9 STATUS ファンクション STATUS ファンクションはキャラクタデバイス用で、出力デバイスが準備完了状態か、あ るいは入力デバイスのバッファが文字を格納しているかを調べます。本ファンクション は、これに続く INPUT もしくは OUTPUT ファンクションが、ドライバ内部でハードウェ アの処理完了を待たなくてもよいことを保証するために使用されます。デバイスが INPU T あるいは OUTPUT の準備ができている場合には STATUS ワードの BUSY ビットに 0 を 返し、続く INPUT もしくは OUTPUT ファンクションがドライバ内部で処理を待たねばな らない場合は 1 を返します。 +-----+-----+-----+-----------------------------------------------------------+ |オフ | 型 |名前 | 説明 | |セッ | | | | | ト | | | | +-----+-----+-----+-----------------------------------------------------------+ |00h |byte |RPLEN|バイト単位でのパケット長 | | | |GTH | | +-----+-----+-----+-----------------------------------------------------------+ |01h |byte |UNIT |ユニット番号(ブロックデバイスのみ) | +-----+-----+-----+-----------------------------------------------------------+ |02h |byte |FUNCT|ファンクション番号。 | | | |ION |6 -- INPUT STATUS | | | | |10 -- OUTPUT STATUS | +-----+-----+-----+-----------------------------------------------------------+ |03h |word |STATU|ステータス | | | |S | | +-----+-----+-----+-----------------------------------------------------------+ |05h |8 byt| |予約 | | |es | | | +-----+-----+-----+-----------------------------------------------------------+ | | | | | +-----+-----+-----+-----------------------------------------------------------+ 6.5.10 GENERIC IOCTL request ファンクション 本ファンクションは、DR-DOS ファンクション 44h のための、対ドライバ用インターフ ェースです。本ファンクションのための完全なインターフェースは Appendix Aに記述さ れています。リクエストヘッダは、アプリケーションが渡すパラメータブロックを指す 、ダブルワードポインタ GENPB を渡します。CX レジスタは、アプリケーションが要求 したメジャーファンクションコード、マイナーファンクションコードとして、リクエス トヘッダ内に渡されます。 +--------+---------+---------+------------------------------------------------+ |オフセッ| 型 | 名前 | 説明 | | ト | | | | +--------+---------+---------+------------------------------------------------+ |00h |byte |RPLENGTH |バイト単位でのパケット長 | +--------+---------+---------+------------------------------------------------+ |01h |byte |UNIT |ユニット番号(ブロックデバイスのみ) | +--------+---------+---------+------------------------------------------------+ |02h |byte |FUNCTION |ファンクション番号。(19) | +--------+---------+---------+------------------------------------------------+ |03h |word |STATUS |ステータス | +--------+---------+---------+------------------------------------------------+ |05h |8 bytes | |予約 | +--------+---------+---------+------------------------------------------------+ |0Dh |byte |MAJOR |ジェネリック IOCTL メジャーファンクション番号( | | | | |カテゴリコード) | +--------+---------+---------+------------------------------------------------+ |0Eh |byte |MINOR |ジェネリック IOCTL マイナーファンクション番号 | +--------+---------+---------+------------------------------------------------+ |0Fh |word |SI |SI レジスタの値 | +--------+---------+---------+------------------------------------------------+ |11h |word |DI |DI レジスタの値 | +--------+---------+---------+------------------------------------------------+ |13h |dword |GENPB |パラメータブロックへのポインタ | +--------+---------+---------+------------------------------------------------+ 6.5.11 GET/SET LOGICAL DEVICE ファンクション ふたつ以上のユニットを同一の物理デバイスに割り付けたブロックデバイスを、アプリ ケーションが使用できるようにします。一例として、フロッピードライブがひとつのシ ステムでは、ディスクのデバイスドライバが先頭のフロッピーディスクドライブに A: と B: の両ドライブを割り付けています。割り付けが行われていない場合、GET LOGICAL ファンクションは LOGICAL フィールドに 0 を返し、そうでない場合は 1、2、などなど の、その物理ドライブに現在割り付けられているユニット番号を返します。SET LOGICAL ファンクションは、現行ユニットにしたい論理ユニットの番号をアプリケーションが渡 せるようにします。LOGICAL フィールドは GET LOGICAL ファンクションの場合と同様の 値が返されます。 +-----+-----+--------+--------------------------------------------------------+ |オフ | 型 | 名前 | 説明 | |セッ | | | | | ト | | | | +-----+-----+--------+--------------------------------------------------------+ |00h |byte |RPLENGTH|バイト単位でのパケット長 | +-----+-----+--------+--------------------------------------------------------+ |01h |byte |UNIT / |ユニット番号 | | | |LOGICAL |リターン時は、最後に参照したユニット番号 | +-----+-----+--------+--------------------------------------------------------+ |02h |byte |FUNCTION|ファンクション番号。 | | | | |23 -- GET LOGICAL DEVICE | | | | |24 -- SET LOGICAL DEVICE | +-----+-----+--------+--------------------------------------------------------+ |03h |word |STATUS |ステータス | +-----+-----+--------+--------------------------------------------------------+ |05h |8 byt| |予約 | | |es | | | +-----+-----+--------+--------------------------------------------------------+ ------------------------------------------------------------------------------- Copyright (c) 1993, 1997 Caldera, Inc All rights reserved.