第9章
大容量ハードドライブの操作
大容量ハードドライブの操作
前の章では、BIOS ディスク機能と、ハードディスクの物理メディアにアクセスするための割り込みの使用について説明しました。そこで、ハードドライブにアクセスするために INT 13H 関数を使用しました。
INT 13H インターフェイスは、読み取り、書き込み、フォーマット、検証などのさまざまなコマンドをサポートしており、これらのコマンドは BIOS に渡され、その後ハード ドライブに渡されます。 INT13H は DOS で長い間使用されていたため、長年標準でした。
INT 13H はディスク ジオメトリ仕様に 24 ビットを割り当て、呼び出し側プログラムがハード ディスクの特定のパラメータを認識し、ディスクにアクセスするために正確なヘッド、シリンダ、およびセクターのアドレス指定をルーチンに提供することを要求します。
BIOS は、BIOS セットアップ プログラムで構成されたハード ドライブのジオメトリを使用します。ディスク ジオメトリ仕様のために INT 13H インターフェイスによって割り当てられた 24 ビットは、次のように分類されます。
- シリンダー番号用の 10 ビット。したがって、シリンダーの総数の最大制限は 1024 シリンダーまでとなります。
- ヘッド番号用の 8 ビット。したがって、ゴールの合計数の上限は 256 までとなります。
- セクター番号用の 6 ビット。したがって、セクターの最大総数は 63 セクターまでになります。
したがって、このアプローチでサポートされるセクターの最大数は、1024 * 256 * 63 = 16515072 に達します。
つまり、INT13H インターフェイスは、最大約 1650 万セクターを含むドライブをサポートでき、セクターあたり 512 バイトで最大 8.46 GB になります。まさにこれが私が説明したいことです。したがって、これらすべての機能または INT 13H を使用すると、最大 8.46 GB のディスクにしかアクセスできません。
このため、近年では、この古いインターフェースの制限により、このインターフェースは廃止され、代わりにこの章の後半で説明するハード ドライブのアドレス指定の新しい方法が採用されるようになりました。
まずはお話をさせてください!
11 年前、私が中学 2 年生のとき、学校で 42MB のハード ドライブについて聞きました。おそらく IBM の WDA-L42 だったと思います。当時、私や友人にとって、ハードドライブの容量がこれほど大きいとは想像もつきませんでした。
INT 13H 方法論は、今日から約 20 年前に開発されました。 8GB のハード ドライブは、当時誰もが夢に描いたよりもはるかに大きいものだったことがわかります。しかし、今日、8GB のハード ドライブについて PC ユーザーに話すと、ストレージ容量が小さいと言って使いたくないと思われるかもしれません。
このため、INT 13H インターフェースは、現代のシステムではついにその役目を終えてしまいました。 INT 13H は 24 ビットを使用してディスク ジオメトリを割り当てていましたが、残念ながら既存の BIOS INT 13H インターフェイスを拡張することはできませんでした。拡張すると、多くの古いハードウェアおよびソフトウェア製品が動作しなくなるためです。今日のコンピューター市場は、何百万もの古いソフトウェアおよびハードウェア製品が動作しなくなるような大きな変化に決して耐えられないことは理解できます。
このような状況を考慮して、INT 13H は INT 13H 拡張と呼ばれる新しいインターフェイスに置き換えられました。ただし、INT 13H は、DOS やその他の古いオペレーティング システムでは、その他の互換性の目的で引き続き使用される場合があります。
新しい INT 13H インターフェイスは、アドレス指定に 24 ビットではなく 64 ビットを使用し、最大 9.4 * 1021 バイトのハード ディスク サイズを許可します。これは、実際には 9.4 兆ギガバイト、つまり 94000000000000 ギガバイトに相当します。この限界を超えるまで、しばらくは落ち着くことができるといいですね。
割り込み 13H のいくつかの重要な拡張機能を以下に説明します。これらの関数は、INT 13H 関数を使用するのと同じ方法でプログラミングに使用できます。これは、これらの関数が INT 13H 拡張と呼ばれる理由でもあります。
INT 13H 拡張機能:
内部 13H (0x13)
機能 1BH (0x1B または 27) --> プロダクション ヘッダーの取得 (ESDI 固定ディスク)
コール:AH = 1BH
AL = 読み取るセクター数
DL = ドライブ
ES:BX = 生産ヘッダーのバッファ
(欠陥リスト)
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AH = 00X
機能が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、固定ディスクの製造ヘッダーを取得するために使用されます。最初に読み取られるセクターには、欠陥エントリの数と欠陥マップの先頭を含む製造ヘッダーが含まれ、残りのセクターには欠陥マップの残りが含まれます。製造ヘッダーの形式 (欠陥マップ レコード形式) については、IBM 70MB、115MB 固定ディスク ドライブ技術リファレンスを参照してください。
INT13H (0x13)
関数 1BH (0x1B または 27) --> SCSI ディスク情報ブロックへのポインターを取得します (将来のドメイン SCSI コントローラ)
コール:AH = 1BH
DL = ハードドライブ ID
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AH = 01H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
ES:BX = SCSI ディスク情報ブロック
コメント:
この関数は、SCSI ディスク情報ブロックへのポインターを取得するために使用されます。また、これにより、一部のコントローラー メッセージが表示されないようにするリセット不可能なフラグも設定されます。
INT13H (0x13)
関数 1CH (0x1C または 28) --> 空きコントローラ RAM へのポインターを取得 (将来のドメイン SCSI コントローラ)
コール:AH = 1CH
DL = 有効なSCSIのハードドライブID
ハードディスク
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AH = 01H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
ES:BX = コントローラ上の空きRAMの最初のバイト
コメント:
この関数は、コントローラの空き RAM を取得するために使用されます。ES:BX は、他の用途に使用できるコントローラの空き RAM の最初のバイトを指します。ES には、コントローラが存在するセグメントが含まれます。コントローラの 2 つのメモリ マップされた I/O ポートは、オフセット 1C00H と 1E00H にあります。
INT13H (0x13)
関数 1C08H (0x1C08) --> コマンド完了ステータスの取得 (ESDI 固定ディスク)
コール: AX = 1C08H
DL = ドライブ
ES:BX = コマンド完了用バッファ
ステータスブロック
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AH = 01H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、コマンド完了ステータスを取得するために使用されます。関数が成功した場合、キャリー フラグはクリアされ、失敗した場合はキャリー フラグが設定されます。
INT13H (0x13)
関数 1C09H (0x1C09) --> デバイス ステータスの取得 (ESDI 固定ディスク)
コール: AX = 1C09H
DL = ドライブ
ES:BX = デバイスステータスブロックのバッファ
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AH = 01H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、デバイス ステータスを取得するために使用されます。関数が成功した場合、キャリー フラグはクリアされ、失敗した場合はキャリー フラグが設定されます。
INT13H (0x13)
関数 1C0AH (0x1C0A) --> デバイス構成の取得 (ESDI 固定ディスク)
コール: AX = 1C0AH
DL = ドライブ
ES:BX = ドライブ構成ステータスのバッファ
ブロック
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AH = 01H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、ディスクのデバイス構成を取得するために使用されます。関数が成功した場合、キャリー フラグはクリアされ、AH レジスタは 01H になります。それ以外の場合は、キャリー フラグが設定され、AH レジスタはステータスを返します。次の表は、ESDI ドライブ構成ステータス ブロックの形式を示しています。
オフセット
|
サイズ
|
説明
|
00H
|
バイト
|
09時間
|
01H
|
バイト
|
ブロック内の単語数 (06H)
|
02H
|
バイト
|
旗
|
03H
|
バイト
|
シリンダあたりのスペアセクター数
|
04時間
|
ダブルワード
|
使用可能なセクターの総数
|
08時間
|
言葉
|
シリンダー総数
|
0AH
|
バイト
|
シリンダーあたりのトラック数
|
0BH
|
バイト
|
トラックあたりのセクター数
|
INT13H (0x13)
関数 1C0BH (0x1C0B) --> アダプタ構成の取得 (ESDI 固定ディスク)
コール:AX = 1C0BH
ES:BX = コントローラ構成用のバッファ
ステータスブロック
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AH = 01H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、アダプタ構成を取得するために使用されます。関数が成功した場合、キャリー フラグはクリアされ、AH は 01H になります。失敗した場合、キャリー フラグが設定され、AH はステータスを返します。
INT13H (0x13)
関数 1C0CH (0x1C0C) --> POS 情報を取得 (ESDI 固定ディスク)
コール: AX = 1C0CH
ES:BX = POS情報ステータスのバッファ
ブロック
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AH = 01H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は POS 情報を取得するために使用されます。関数が成功した場合、キャリー フラグはクリアされ、AH は 01H になります。失敗した場合、キャリー フラグが設定され、AH はステータスを返します。
INT13H (0x13)
機能 1C0EH (0x1C0E) --> RBA を ABA (ESDI 固定ディスク) に変換
コール: AX = 1C0EH
CH = シリンダ番号の下位8ビット
CL = セクター番号(上位2ビット)
シリンダー番号はビット6と7に表示)
DH = ヘッド番号
DL = ドライブ番号
ES:BX = ABA (絶対ブロックアドレス)
番号
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AH = 01H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、RBA (相対ブロック アドレス) を ABA (絶対ブロック アドレス) に変換します。関数が成功した場合、キャリー フラグはクリアされ、AH レジスタは 01H になります。それ以外の場合は、キャリー フラグが設定され、AH はステータスを返します。
INT13H (0x13)
関数 20H (0x20 または 32) --> 現在のメディア フォーマットを取得する (Compaq ATAPI リムーバブル メディア デバイス)
コール:AH = 20H
DL = ドライブ番号
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
AL = メディアタイプ
AH = 00H
関数が失敗した場合、
CF = セット
AH = エラーコード
コメント:
この関数は、現在のメディア フォーマットを取得するために使用されます。Compaq/ATAPI ディスケット メディア タイプの値は、次の表に示されています。
価値
|
メディア
|
03H
|
720K (1M 未フォーマット)
|
04時間
|
1.44M (2M 未フォーマット)
|
06時間
|
2.88M (4M 未フォーマット)
|
0CH
|
360K
|
0DH
|
120万
|
0EH
|
Toshiba 3mode
|
0FH
|
NEC 3モード(セクターあたり1024バイト)
|
10時間
|
ATAPI リムーバブル メディア デバイス
|
INT13H (0x13)
機能 21H (0x21 または 33) --> 複数のディスク セクターの読み取り (PS および PS/2、ハード ディスク)
コール:AH = 21H
AL = 読み取るセクター数
CH = 12ビットシリンダ番号の下位バイト
CL = 開始セクター(ビット0~5)とビット8
シリンダーの9(ビット6と7)
DH = ヘッド番号(ビット0~5)とビット10
シリンダーの11(ビット6と7)
DL = ドライブ番号
ES:BX = 読み取るデータバッファ
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
ES:BX = 満たされたデータ バッファ
関数が失敗した場合、
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、複数のブロック モードを使用して複数のディスク セクターを読み取るために使用され、各セクターの後ではなく、セクターのグループの転送が終了した後にのみ割り込みを生成します。
INT13H (0x13)
機能 22H (0x22 または 34) --> 複数のディスク セクターの書き込み (PS および PS/2、ハード ディスク)
コール:AH = 22H
AL = 書き込むセクター数
CH = 12ビットシリンダ番号の下位バイト
CL = 開始セクター(ビット0~5)とビット8
シリンダーの9(ビット6と7)
DH = ヘッド番号(ビット0~5)とビット10
シリンダーの11(ビット6と7)
DL = ドライブ番号
ES:BX = 書き込むデータを含むバッファ
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
AH = 01H
関数が失敗した場合、
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、複数ブロック モードを使用して複数のディスク セクターを書き込むために使用されます。このモードでは、各セクターの後ではなく、セクターのグループの転送が終了した後にのみ割り込みが生成されます。
INT13H (0x13)
機能 22H (0x22 または 34) --> キャッシュの有効化/無効化 (QuickCache II v4.20)
コール:AH = 22H
AL = 新しい状態(無効の場合は00H、無効の場合は01H)
有効になっている場合)
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数は、すべてのドライブのキャッシュを有効または無効にします。関数が成功した場合、AX レジスタは 0000H になり、そうでない場合はステータスを返します。
INT13H (0x13)
機能 23H (0x23 または 35) --> コントローラ機能レジスタの設定 (PS および PS/2、ハード ディスク)
コール:AH = 23H
AL = フィーチャ番号
DL = ドライブ番号
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
関数が失敗した場合、
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、コントローラ機能レジスタを設定するために使用されます。関数が成功した場合、キャリーフラグはクリアされ、失敗した場合はキャリーフラグが設定され、AHレジスタはステータスを返します。
INT13H (0x13)
機能 24H (0x24 または 36) --> 複数の転送モード (ハードディスク、PS、PS/2) の設定
通話:AH = 24H
AL = ブロックあたりのセクター数
DL = ドライブ番号
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
関数が失敗した場合、
キャリーフラグ = セット
AH = ステータス
コメント:
この機能は、マルチ転送モードを設定するために使用されます。マルチ転送モードを無効にする場合は、セクター数を 0 に設定します。ブロック サイズの最大値 (2、4、6、8、16 など) は、固定ディスク ドライブの種類によって異なります。
値は、POST (電源投入時セルフテスト) によって作成される固定ディスク ドライブ パラメータ テーブルのバイト 15H に格納されます。アドレス 0040H:0074H のバイトは、動作ステータスに設定されます。PS/1 ハード ディスク機能番号の値は、次の表にリストされています。
価値
|
説明
|
01H
|
16ビットの代わりに8ビットのデータ転送を選択する
|
02H
|
書き込みキャッシュを有効にする
|
22時間
|
同じ、ユーザー指定の領域に書き込む
|
33時間
|
再試行を無効にする
|
44時間
|
読み取りロング/書き込みロングのECCバイト数を設定する
|
54時間
|
キャッシュセグメントを設定する
|
55時間
|
先読みを無効にする
|
66時間
|
電源投入時のデフォルトに戻す機能を無効にする
|
77H
|
エラー訂正を無効にする
|
81H
|
16ビットデータ転送を選択(デフォルト)
|
82時間
|
書き込みキャッシュを無効にする
|
88時間
|
エラー訂正を有効にする(デフォルト)
|
99時間
|
再試行を有効にする(デフォルト)
|
ああ
|
先読みを有効にする
|
BBH
|
読み取りロング/書き込みロングのECC長を4バイトに設定する
|
CCH
|
電源投入時のデフォルトに戻す機能を有効にする
|
DDH
|
同じ内容をディスク全体に書き込む
|
INT13H (0x13)
関数 24H (0x24 または 36) --> セクターの設定 (QuickCache II v4.20)
コール: AX = 24H
BX = 新しいセクターバッファ数
キャッシュ
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数はセクターを設定するために使用されます。関数が成功した場合、AX レジスタは 0000H になり、それ以外の場合は AX はステータスを返します。
INT13H (0x13)
機能 25H (0x25 または 37) --> ドライブの識別 (ハード ディスク、PS、PS/2)
コール:AH = 25H
DL = ドライブ番号
ES:BX = 応答パケット用の512バイトのバッファ
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
ドライブ情報ブロックで満たされたバッファ
関数が失敗した場合、
キャリーフラグ = セット
AH = ステータス
コメント:
この機能はドライブを識別するために使用されます。アドレス 0040h:0074h のバイトは操作のステータスに設定されます。IBM は公式にこの機能をオプションとして分類しています。一般的なドライブ構成のビット フィールドを次の表に示します。
ビット
|
説明
|
0
|
予約済み (0)
|
1
|
ハードセクター
|
2
|
ソフトセクター
|
3
|
MFMエンコードされていない
|
4
|
ヘッドスイッチ時間が15ミリ秒を超える
|
5
|
スピンドルモーター制御オプションを実装
|
6
|
固定ドライブ
|
7
|
取り外し可能なカートリッジドライブ
|
8
|
ディスク転送速度は5Mbs以下です
|
9
|
ディスク転送速度は 5Mbs を超え、10Mbs 以下です
|
10
|
ディスク転送速度は10Mbs以上
|
11
|
回転速度許容差は0.5%以上
|
12
|
データストローブオフセットオプションが利用可能
|
13
|
トラックオフセットオプションが利用可能
|
14
|
フォーマット速度許容差が必要
|
15
|
非磁性ドライブ用に予約済み (0)
|
ATA (AT アタッチメント) 仕様で規定されているドライブ情報ブロックのフォーマットの説明を次の表に示します。
オフセット
|
サイズ
|
説明
|
00H
|
言葉
|
一般的なドライブ構成
|
02H
|
言葉
|
シリンダー数
|
04時間
|
言葉
|
予約済み
|
06時間
|
言葉
|
頭数
|
08時間
|
言葉
|
トラックあたりの未フォーマットバイト数
|
0AH
|
言葉
|
セクターあたりの未フォーマットバイト数
|
0CH
|
言葉
|
トラックあたりのセクター数
|
0EH
|
6 バイト
|
ベンダー固有
|
14時間
|
20 バイト
|
ASCII 形式のシリアル番号 (0000H = 指定なし)
|
28時間
|
言葉
|
バッファタイプ
|
2AH
|
言葉
|
バッファサイズは512バイト単位で増加します(0000H=指定なし)
|
2CH
|
言葉
|
Read/Write Longコマンドで渡されるECCバイト数 0000H = 指定なし
|
2EH
|
8 バイト
|
ファームウェアリビジョン(ASCII)、0000H=指定なし
|
36時間
|
40 バイト
|
モデル番号(ASCII)、0000H=指定なし
|
5EH
|
言葉
|
ビット 15-8 ベンダー固有、ビット 7-0、(00H = 読み取り/書き込み複数コマンドが実装されていない場合、それ以外の場合は xxH = 読み取りおよび書き込み複数コマンドの割り込みごとに転送できるセクターの最大数)
|
60時間
|
言葉
|
0000H = ダブルワード I/O を実行できません、0001H = ダブルワード I/O を実行できます。
|
62時間
|
言葉
|
ビット 15-9 (0=予約済み)、ビット 8 (1=DMA サポート済み)、ビット 7-0 ベンダー固有。
|
64時間
|
言葉
|
予約済み
|
66時間
|
言葉
|
ビット15-8 PIOデータ転送サイクルタイミングモード、ビット7-0ベンダー固有
|
68時間
|
言葉
|
ビット15-8 DMAデータ転送サイクルタイミングモード、ビット7-0 ベンダー固有
|
6AH
|
言葉
|
ビット 15-1 は予約済み、ビット 0 (1 = 変換モードで報告されたフィールドは有効、0 = 変換モードで報告されたフィールドは有効である可能性がある)
|
6CH
|
言葉
|
現在のシリンダー数
|
6EH
|
言葉
|
現在のヘッド数
|
70時間
|
言葉
|
トラックあたりの現在のセクター数
|
72時間
|
DWORD
|
セクター別の現在の能力
|
76時間
|
>単語
|
予約済み
|
78時間
|
136 バイト
|
未定義
|
100時間
|
64 バイト
|
ベンダー固有
|
140時間
|
96 バイト
|
予約済み
|
INT13H (0x13)
関数 25H (0x25 または 37) --> フラッシュ間隔の設定 (QuickCache II v4.20)
コール:AH = 25H
BX = フラッシュ間隔
戻り値: 関数が成功した場合、
AH = 0000H
関数が失敗した場合、
AH = ステータス
コメント:
この関数はフラッシュ間隔を設定するために使用されます。関数が成功した場合、AH は 0000H になり、それ以外の場合は AH はステータスを返します。
INT13H (0x13)
関数 26H (0x26 または 38) --> QuickCache II v4.20 のアンインストール
コール:AH = 26H
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
AXは、別のTSRによってフックされた割り込みベクトルの0001Hから00FFHまでのステータスを返します。
INT13H (0x13)
機能 27H (0x27 または 39) --> インストール チェック (QuickCache II v4.20)
コール:AH = 27H
0000H ...
戻り値: BH = メジャーバージョン
BL = バイナリマイナーバージョン
インストールされている場合、
AX = 0000H
BX = ゼロ以外
コメント:
インストールされている場合、AX レジスタは 0000H であり、BX はゼロ以外の値を返します。
INT13H (0x13)
機能 28H (0x28 または 40) --> 自動マウント解除の設定 (QuickCache II v4.20)
コール:AH = 28H
AL = 新しい州
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
無効にするには AL = 00H で関数を呼び出し、有効にするには AL = 01H で関数を呼び出します。
INT13H (0x13)
機能 29H (0x29 または 41) --> 操作なし (QuickCache II v4.20)
コール:AH = 29H
戻り値: AX = 0000H
INT13H (0x13)
関数 2AH (0x2A または 42) --> バッファ サイズの設定 (QuickCache II v4.20)
コール:AH = 2AH
AL = バッファサイズ
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数はバッファ サイズを設定するために使用されます。関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。
INT13H (0x13)
機能 2BH (0x2B または 43) --> ドライブ アクセス サウンド (QuickCache II v4.20)
コール:AH = 2BH
AL = 新しい状態(00h 無効、01h
有効)
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
関数が成功した場合、AXは0000Hです。失敗した場合、AXはステータスを返します。ドライブアクセスサウンドを無効にするにはAL = 00H、有効にするにはAL = 01Hで関数を呼び出します。
INT13H (0x13)
関数 2CH (0x2C または 44) --> バッファ書き込みの設定 (QuickCache II v4.20)
コール:AH = 2CH
AL = 新しい状態
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数は、すべてのドライブの遅延書き込みを有効または無効にします。 1 つのドライブを変更するには、AH=38H を使用します。 無効にするには AL = 00H、有効にするには 01H を使用します。
INT13H (0x13)
関数 2DH (0x2D または 45) --> バッファ読み取りの設定 (QuickCache II v4.20)
コール:AH = 2Dh
AL = 新しい状態(00h 無効、01h
有効)
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数は、すべてのドライブの先読みを有効または無効にします。無効にするには AL = 00H を使用し、有効にするには AL = 01H を使用します。単一のドライブを変更するには、AH=37H を使用します。
INT13H (0x13)
関数 2EH (0x2E または 46) --> フラッシュ カウントの設定 (QuickCache II v4.20)
コール:AH = 2EH
BX = フラッシュカウント
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数はフラッシュ カウントを設定するために使用されます。関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。
INT13H (0x13)
関数 2FH (0x2F または 47) --> 即時増分フラッシュを強制 (QuickCache II v4.20)
コール:AH = 2FH
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。
INT13H (0x13)
関数 30H (0x30 または 48) --> 情報を取得する (QuickCache II v4.20)
コール:AH = 30H
AL = 情報番号(表参照)
コメント
DS:DX = 情報用バッファ
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数は、AL で指定されたシステムに関するさまざまなタイプの情報を取得するために使用されます。関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。AX = 8000H は無効な情報指定子を示します。AL に指定される情報番号は、次の表にリストされています。
価値
|
説明
|
00H
|
システム情報
|
01H
|
ドライブ情報
|
02H
|
アクセス頻度(30ワードの配列)
|
03H
|
ドライブ インデックス (DOS ドライブの BIOS ドライブを示す 32 バイトの配列)
|
INT13H (0x13)
機能 31H (0x31 または 49) --> メモリを予約 (QuickCache II v4.20)
コール: AH = 31H
BX = 段落数
従来のメモリを予約する
アプリケーション。
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数は、アプリケーション用のメモリを予約するために使用されます。関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。
INT13H (0x13)
機能 32H (0x32 または 50) --> 特定のドライブのキャッシュを有効にする (QuickCache II v4.20)
コール: AH = 32H
AL = ドライブ番号
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数は、特定のドライブのキャッシュを有効にするために使用されます。たとえば、A: に対して AL = 00H で関数を呼び出します。関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。
INT13H (0x13)
機能 33H (0x33 または 51) --> 特定のドライブのキャッシュを無効にする (QuickCache II v4.20)
コール:AH = 33H
AL = ドライブ番号
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数は、特定のドライブのキャッシュを無効にするために使用されます。たとえば、A: に対して AL = 00H で関数を呼び出します。関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。
INT13H (0x13)
機能 34H (0x34 または 52) --> セクターのロック/ロック解除 (QuickCache II v4.20)
コール: AH = 34H
AL = ロック/ロック解除機能番号
(コメント欄の表を参照)
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数は、AL で指定されたセクターのロック/ロック解除関数を呼び出すために使用されます。関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。AL で呼び出されるさまざまな関数番号が次の表に示されています。
価値
|
関数
|
00H
|
エンドセクターのロック/ロック解除
|
01H
|
アクセスされたすべてのセクターをキャッシュにロックする
|
02H
|
アクセスされたすべてのセクターをロック解除し、キャッシュから破棄します
|
INT13H (0x13)
関数 35H (0x35 または 53) --> ロック プール サイズの設定 (QuickCache II v4.20)
コール:AH = 35H
BX = ロックプール内のセクター数
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数はロック プールのサイズを設定するために使用されます。関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。
INT13H (0x13)
関数 36H (0x36 または 54) --> トレース バッファ サイズの設定
コール:AH = 36H
AL = トレースバッファの新しいサイズ
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数は、トレース バッファ サイズを設定するために使用されます。関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。この関数は通常、AL=05H の INT 13H の関数 24H で呼び出されます。
INT13H (0x13)
関数 37H (0x37 または 55) --> 特定のドライブのバッファ読み取りを設定する (QuickCache II v4.20)
コール:AH = 37H
AL = 新しい状態
DL = ドライブ番号
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数は、特定のドライブのバッファ読み取りを設定するために使用されます。AL = 00H の場合、状態は有効、それ以外の場合は無効です。関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。
INT13H (0x13)
関数 38H (0x38 または 56) --> 特定のドライブのバッファ書き込みを設定する (QuickCache II v4.20)
コール:AH = 38H
AL = 新しい状態
DL = ドライブ番号
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数は、特定のドライブのバッファ書き込みを設定するために使用されます。AL = 00H の場合、状態は有効、それ以外の場合は無効です。関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。
INT13H (0x13)
関数 39H (0x39 または 57) --> 特定のドライブの読み取りバッファ サイズを設定する (QuickCache II v4.20)
コール:AH = 39H
AL = 読み取りバッファの新しいサイズ
DL = ドライブ番号
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数は、A: の DL = 00H など、特定のドライブの読み取りバッファ サイズを設定するために使用されます。関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。
INT13H (0x13)
関数 3AH (0x3A または 58) --> 特定のドライブの書き込みバッファ サイズを設定する (QuickCache II v4.20)
コール:AH = 3AH
AL = 書き込みバッファの新しいサイズ
DL = ドライブ番号
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数は、A: の DL = 00H など、特定のドライブの書き込みバッファ サイズを設定するために使用されます。関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。
INT13H (0x13)
機能 3DH (0x3D または 61) --> ドライブのシリンダ フラッシュを有効/無効にする (QuickCache II v4.20)
コール:AH = 3DH
AL = 新しい状態
DL = ドライブ番号
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数は、A: の DL = 00H など、特定のドライブのシリンダ フラッシュを有効/無効にするために使用されます。関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。AL レジスタが 01H に設定されている場合、状態は有効になり、それ以外の場合は無効になります。
INT13H (0x13)
関数 3EH (0x3E または 62) --> シングルセクターボーナスの設定 (QuickCache II v4.20)
コール:AH = 3EH
AL = ボーナスの新しい値
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数は、シングルセクターボーナスを設定するために使用されます。関数が成功した場合、AX は 0000H になり、失敗した場合、AX はステータスを返します。
INT13H (0x13)
関数 3FH (0x3F または 63) --> ボーナスしきい値の設定 (QuickCache II v4.20)
コール:AH = 3FH
AL = ボーナスしきい値の新しい値
戻り値: 関数が成功した場合、
AX = 0000H
関数が失敗した場合、
AX = ステータス
コメント:
この関数はボーナスしきい値を設定するために使用されます。関数が成功した場合、AXは0000Hです。失敗した場合、AXはステータスを返します。
INT13H (0x13)
機能 41H (0x41 または 65) --> インストール チェック (IBM/MS INT 13H 拡張)
コール:AH = 41H
BX = 55AAH
DL = ドライブ番号 (80H-FFH)
戻り値: 拡張機能がサポートされ、関数が成功した場合、
キャリーフラグ = クリア
BX = AA55H
AH = 拡張機能のメジャーバージョン(
コメントの表)
AL = 社内使用
CX = APIサブセットサポートビットマップ(
コメント内の表)
DH = 拡張バージョン (v2.0 以降)
拡張機能がサポートされていないか、機能が失敗した場合、
キャリーフラグ = セット
AH = 01H (機能無効)
コメント:
この関数は、IBM/MS INT 13H 拡張機能がインストールされ、サポートされているかどうかを確認します。拡張機能のメジャー バージョンの値は、次の表に示されています。
価値
|
拡張機能のメジャーバージョン
|
01H
|
1.x
|
20時間
|
2.0 / EDD-1.0
|
21時間
|
2.1 / EDD-1.1
|
30時間
|
EDD-3.0
|
IBM/MS INT 13H 拡張 API サポート ビットマップのビット フィールドを次の表に示します。
ビット
|
説明
|
0
|
拡張ディスクアクセス機能(AH=42H、43H、44H、47h、48H)がサポートされています。
|
1
|
リムーバブル ドライブ コントローラ機能 (AH=45H、46H、48H、49H、および INT15/AH =52H) がサポートされています。
|
2
|
拡張ディスク ドライブ (EDD) 機能 (AH=48H および AH=4EH) がサポートされています。拡張ドライブ パラメータ テーブルは有効です。
|
3-15
|
予約済み (0)
|
INT13H (0x13)
関数 42H (0x42 または 66) --> 拡張読み取り (IBM/MS INT 13H 拡張)
コール:AH = 42H
DL = ドライブ番号
DS:SI = ディスクアドレスパケット(
コメント)
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合、
キャリーフラグ = セット
AH = エラーコード
コメント:
この関数は、ディスク読み取り関数の拡張です。関数が成功すると、キャリー フラグがクリアされ、AH レジスタは 00H になります。それ以外の場合は、キャリー フラグが設定され、AH はエラー コードを返します。ディスク アドレス パケットのブロック カウント フィールドは、正常に転送されたブロックの数に設定されます。ディスク アドレス パケットの形式は次のとおりです。
オフセット
|
サイズ
|
説明
|
00H
|
バイト
|
パケットのサイズ (10H)
|
01H
|
バイト
|
予約済み (0)
|
02H
|
言葉
|
転送するブロックの数
|
04時間
|
DWORD
|
転送バッファ
|
08時間
|
クォリファイ
|
開始絶対ブロック番号 (LBA)
|
INT13H (0x13)
機能 43H (0x43 または 67) --> 拡張書き込み (IBM/MS INT 13H 拡張)
コール:AH = 43H
AL = 書き込みフラグ(
コメント)
DL = ドライブ番号。
DS:SI = ディスクアドレスパケット
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合、
キャリーフラグ = セット
AH = エラーコード
コメント:
この関数は、ディスク書き込み関数の拡張機能です。関数が成功すると、キャリー フラグがクリアされ、AH レジスタは 00H になります。それ以外の場合は、キャリー フラグが設定され、AH はエラー コードを返します。ディスク アドレス パケットのブロック カウント フィールドは、ブロック数に正常に設定されます。さまざまなバージョンの書き込みフラグの情報は、次の表に示されています。
バージョン 1.0 および 2.0
|
バージョン 2.1 以降
|
価値
|
説明
|
価値
|
説明
|
ビット 0
|
書き込みの確認
|
00Hと01H
|
検証せずに書き込む
|
ビット1~7
|
予約済み (0)
|
02H
|
検証して書き込む
|
INT13H (0x13)
機能 44H (0x44 または 68) --> セクターの検証 (IBM/MS INT 13H 拡張)
コール:AH = 44H
DL = ドライブ番号
DS:SI = ディスクアドレスパケット
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合、
キャリーフラグ = セット
AH = エラーコード
コメント:
この関数は、セクター検証関数の拡張です。関数が成功した場合、キャリーフラグはクリアされ、AHレジスタは00Hです。そうでない場合は、キャリーフラグが設定され、AHはエラーコードを返します。ディスクアドレスパケットのブロックカウントフィールドは、成功したブロック数に設定されます。
INT13H (0x13)
機能 45H (0x45 または 69) --> ドライブのロック/ロック解除 (IBM/MS INT 13H 拡張)
コール:AH = 45H
AL = 操作番号(
コメント)
DL = ドライブ番号
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
AH = 00H
AL = ロック状態 (00H = ロック解除)
関数が失敗した場合、
キャリーフラグ = セット
AH = エラーコード
コメント:
この機能は、ドライブをロック/ロック解除するために使用されます。この機能は、80H 以上の番号のリムーバブル ドライブでサポートされている必要があります。ドライブには最大 255 個のロックをかけることができ、すべてのロックが解除されるまでメディアは物理的にロック解除されません。
関数が成功した場合、キャリー フラグはクリアされ、AH レジスタは 00H になります。それ以外の場合、キャリー フラグが設定され、AH はエラー コードを返します。
ドライブのさまざまなロック/ロック解除操作の操作番号が次の表に示されています。
価値
|
関数
|
00H
|
ドライブ内のメディアをロックする
|
01H
|
メディアのロックを解除
|
02H
|
ロック状態を確認する
|
INT13H (0x13)
機能 46H (0x46 または 70) --> メディアの取り出し (IBM/MS INT 13H 拡張)
コール: AH = 46H
AL = 00H (予約)
DL = ドライブ番号
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合、
キャリーフラグ = セット
AH = エラーコード
コメント:
この関数はメディアを取り出すためのものです。関数が成功した場合、キャリー フラグはクリアされ、AH レジスタは 00H になります。それ以外の場合、キャリー フラグが設定され、AH はエラー コードを返します。
INT13H (0x13)
機能 47H (0x47 または 71) --> 拡張シーク (IBM/MS INT 13H 拡張)
コール:AH = 47H
DL = ドライブ番号
DS:SI = ディスクアドレスパケット
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合、
キャリーフラグ = セット
AH = エラーコード
コメント:
この関数はシーク関数の拡張です。関数が成功すると、キャリー フラグがクリアされ、AH レジスタは 00H になります。それ以外の場合は、キャリー フラグが設定され、AH はエラー コードを返します。ディスク アドレス パケットのブロック カウント フィールドは、ブロック数に正常に設定されます。
INT13H (0x13)
関数 48H (0x48 または 72) --> ドライブ パラメータの取得 (IBM/MS INT 13H 拡張)
コール:AH = 48H
DL = ドライブ (80H-FFH)
DS:SI = ドライブパラメータのバッファ
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
AH = 00H
DS:SI = バッファがいっぱい
関数が失敗した場合、
キャリーフラグ = セット
AH = エラーコード
コメント:
この関数は、ドライブ パラメータを取得するために使用されます。関数が成功した場合、キャリー フラグはクリアされ、AH レジスタは DS:SI が満たされたバッファで 00H になります。それ以外の場合は、キャリー フラグが設定され、AH はエラー コードを返します。
INT13H (0x13)
機能 49H (0x49 または 73) --> 拡張メディア変更 (IBM/MS INT 13H 拡張)
コール: AH = 49H
DL = ドライブ番号(任意のドライブ番号、
コメント
戻り値: メディアが変更されていない場合、
キャリーフラグ = クリア
AH = 00H
メディアが変更された可能性がある場合、
キャリーフラグ = セット
AH = 06H (メディア変更のエラーコード)
コメント:
この関数はメディア変更関数の拡張機能です。関数が成功した場合、キャリー フラグはクリアされ、AH レジスタは 00H になります。それ以外の場合、キャリー フラグが設定され、AH はエラー コードを返します。
この関数と INT 13H の関数 AH = 16H の主な違いは、関数 16H ではフロッピー ディスクのドライブ番号 00H から 7FH のみが許可されるのに対し、関数 AH = 16H では任意のドライブ番号を指定できることです。
INT13H (0x13)
機能 4AH (0x4A または 74) --> ディスク エミュレーションの開始 (起動可能な CD-ROM)
コール:AH = 4AH
AL = 00H
DS:SI = 仕様パケット(コメントの表を参照)
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
関数が失敗した場合、
キャリーフラグ = セット
AX = ステータスコード
コメント:
この関数は、ディスク エミュレーションを開始するために使用されます。関数が成功した場合、キャリー フラグはクリアされます。それ以外の場合は、キャリー フラグが設定され、AX レジスタはステータス コードを返し、ドライブはエミュレーション モードになりません。
ブート可能な CD-ROM 仕様パケットのフォーマットは次の表に示されています。
オフセット
|
サイズ
|
説明
|
00H
|
バイト
|
パケットのサイズ(バイト単位)(13H)
|
01H
|
バイト
|
ブートメディアタイプ
|
02H
|
バイト
|
ドライブ番号
ドライブ番号
|
ドライブの説明
|
00H
|
フロッピーイメージ
|
80時間
|
起動可能なハードディスク
|
81H から FFH
|
起動不可能またはエミュレーションなし
|
|
03H
|
バイト
|
CD-ROMコントローラ番号
|
04時間
|
DWORD
|
Emu へのディスク イメージの論理ブロック アドレス
|
08時間
|
言葉
|
デバイスの仕様
価値
|
説明
|
(IDE) ビット 0
|
ドライブはマスターではなくスレーブです
|
(SCSI) ビット 0 ~ 7
|
LUN (論理ユニット番号) と PUN (物理ユニット番号)
|
ビット8~15
|
バス番号
|
|
0AH
|
言葉
|
CD-ROM 読み取りをキャッシュするための 3Kb バッファのセグメント
|
0CH
|
言葉
|
初期ブートイメージのセグメントをロードします(0000Hの場合は、セグメント07C0Hをロードします)
|
0EH
|
言葉
|
ロードする 512 バイトの仮想セクターの数 (INT 13H の機能 4CH のみ有効)
|
10時間
|
バイト
|
シリンダ数の下位バイト(INT 13Hの機能08H用)
|
11時間
|
バイト
|
セクター数、シリンダ数の上位ビット(INT 13Hの機能08H用)
|
12時間
|
バイト
|
ヘッドカウント(INT 13Hの機能08H用)
|
ブート可能な CD-ROM ブート メディア タイプのビット フィールドを次の表に示します。
ビット
|
説明
|
3-0
|
メディアタイプ
価値
|
説明
|
0000
|
エミュレーションはありません。
|
0001
|
1.2M ディスケット。
|
0010
|
1.44M ディスケット。
|
0011
|
2.88M ディスケット。
|
0100
|
ハードディスク(ドライブC:)
|
他の
|
予約済み
|
|
5-4
|
予約済み (0)
|
6
|
イメージにはATAPIドライバが含まれています
|
7
|
イメージにはSCSIドライバが含まれています
|
INT13H (0x13)
機能 4B00H (0x4B00) --> ディスク エミュレーションの終了 (起動可能な CD-ROM)
コール: AX = 4B00H
DL = ドライブ番号(または終了する場合は7FH)
すべてのエミュレーション)
DS:SI = 空の仕様パケット
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
関数が失敗した場合、
キャリーフラグ = セット
AX = ステータスコード
DS:SI = 仕様パケットが記入済み
コメント:
この関数は、ディスク エミュレーションを終了するために使用されます。すべてのエミュレーションを終了する場合は、DL = 7FH で関数を呼び出します。関数が成功した場合、キャリー フラグはクリアされます。それ以外の場合は、キャリー フラグが設定され、AX レジスタはステータス コードを返し、ドライブはエミュレーション モードのままになります。
INT13H (0x13)
関数 4B01H (0x4B01) --> ステータスの取得 (起動可能な CD-ROM)
コール: AX = 4B01H
DL = ドライブ番号
DS:SI = 空の仕様パケット
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
関数が失敗した場合、
キャリーフラグ = セット
AX = ステータスコード
DS:SI = 仕様パケットが記入済み
コメント:
この関数はステータスを取得するために使用されます。関数が成功した場合、キャリーフラグはクリアされ、そうでない場合はキャリーフラグが設定され、AXレジスタはステータスコードを返します。
INT13H (0x13)
機能 4CH (0x4C または 76) --> ディスク エミュレーションとブートの開始 (起動可能な CD-ROM)
コール:AH = 4CH
AL = 00H
DS:SI = 仕様パケット
戻り値: 関数が成功した場合、
何もない
関数が失敗した場合、
キャリーフラグ = セット
AX = ステータスコード
コメント:
この関数は、ディスク エミュレーションを開始し、システムを起動するために使用されます。関数が成功した場合、何も返さず、キャリー フラグが設定され、AX レジスタはステータス コードを返します。
INT13H (0x13)
関数 4D00H (0x4D00) --> ブートカタログを返す (ブート可能な CD-ROM)
コール: AX = 4D00H
DS:SI = コマンドパケット(
コメント)
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
関数が失敗した場合、
キャリーフラグ = セット
AX = ステータスコード
コメント:
この関数は、ブート カタログを返すために使用されます。関数が成功した場合、キャリー フラグはクリアされ、そうでない場合はキャリー フラグが設定され、AX レジスタはステータス コードを返します。「Get Boot Catalog」コマンド パケットのブート可能 CD-ROM の形式は、次の表に示されています。
オフセット
|
サイズ
|
説明
|
00H
|
バイト
|
パケットのサイズ(バイト単位)(08H)
|
01H
|
バイト
|
読み取るブートカタログのセクター数
|
02H
|
DWORD
|
ブートカタログのバッファ
|
06時間
|
言葉
|
ブートカタログ内の転送する最初のセクター
|
INT13H (0x13)
関数 4EH (0x4E または 78) --> ハードウェア構成の設定 (IBM/MS INT 13H 拡張 v2.1)
コール:AH = 4EH
AL = 機能番号(コメントの表を参照)
DL = ドライブ番号
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合、
キャリーフラグ = セット
AH = エラーコード
AL = ステータス
コメント:
この関数はハードウェア構成を設定するために使用されます。AL がこの関数を呼び出すための関数番号は次の表に示されています。
価値
|
説明
|
00H
|
プリフェッチを有効にする
|
01H
|
プリフェッチを無効にする
|
02H
|
最大PIO転送モードを設定する
|
03H
|
PIOモード0を設定する
|
04時間
|
デフォルトのPIO転送モードを設定する
|
05H
|
INT 13H DMA最大モードを有効にする
|
06時間
|
INT 13H DMAを無効にする
|
DMAモードとPIOモードは相互に排他的であるため、DMAを選択すると、指定されたデバイスまたはそのコントローラ上のすべてのデバイスのPIOが無効になり、PIOを選択するとDMAが無効になります。
INT13H (0x13)
機能 5001H (0x5001) --> パケット送信コマンド (拡張ディスクドライブ仕様 v3.0)
コール: AX = 5001H
DL = ドライブ番号
ES:BX = コマンドパケット(
コメント)
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合、
キャリーフラグ = セット
AH = エラーコード
コメント:
この関数はパケット コマンドを送信するために使用されます。関数が成功した場合、キャリー フラグはクリアされ、AH レジスタは 00H になります。それ以外の場合は、キャリー フラグが設定され、AH はエラー コードを返します。Enhanced Disk Drive Spec v3.0 コマンド パケットの形式は、次の表に示されています。
オフセット
|
サイズ
|
説明
|
00H
|
言葉
|
シグネチャー B055H
|
02H
|
バイト
|
パケットの長さ(バイト単位)
|
03H
|
バイト
|
予約済み (0)
|
04時間
|
N バイト
|
フォーマットされたパケットデータ
|
INT13H (0x13)
機能 5501H (0x5501) --> 問い合わせ (Seagate ST01/ST02)
コール: AX = 5501H
DH = 転送するバイト数
DL = ドライブ番号
ES:BX = 結果用バッファ
戻る
照会結果が格納された ES:BX バッファ。
コメント:
この関数は問い合わせを送信するために使用されます。ST01/ST02 BIOS は関数の成功または失敗の指示を返さないため、すべてのコマンドが成功したと想定する必要があります。
ST01/ST02 BIOSは、0040H:0075HのBIOSドライブ数を変更せずに、常に前のBIOSドライブの後にドライブをマップします。このコマンドは、SCSI Inquiryコマンドと同じです。
INT13H (0x13)
機能 5502H (0x5502) --> 予約済み (Seagate ST01/ST02)
INT13H (0x13)
関数 5503H (0x5503) --> DTQ (デバイス タイプ修飾子) の設定 (Seagate ST01/ST02)
コール: AX = 5503H
DH = DTQバイト(表を参照)
コメント)
DL = ドライブ番号
戻り値: なし
コメント:
この関数は、DTQ (デバイス タイプ修飾子) を設定するために使用されます。関数は何も返しません。DTQ バイトのビット フィールドは次の表に示されています。
ビット
|
説明
|
0
|
Seagateインストールソフトウェアが存在
|
1
|
選択したドライブがインストールされました
|
2
|
ホストアダプタは選択したドライブのパリティをチェックします
|
3
|
選択されたドライブはST225Nです
|
4
|
選択されたドライブはST225N/NPとペアになっています
|
5
|
予約済み
|
6
|
SCSIドライブ接続
|
7
|
予約済み
|
INT13H (0x13)
関数 5504H (0x5504) --> 戻り識別 (Seagate ST01/ST02)
呼び出し: AX = 5504H
DL = ドライブ番号
戻る:
AX = 4321H
BL = 選択されたドライブ番号 (00H、01H)
BH = ホストに接続されているドライブの数
アダプタ
コメント:
関数は、ドライブの識別情報を返すために使用されます。
INT13H (0x13)
関数 5505H (0x5505) --> パーク ヘッズ (Seagate ST01/ST02)
コール: AX = 5505H
DL = ドライブ番号
DH = サブ関数(コメントを参照)
戻る:
何もない
コメント:
この機能は、ディスクのヘッドをパークするために使用されます。これは古いハードディスクで使用されていましたが、最近のハードディスクではヘッドをパークするのに外部プログラムは必要ありません。
サブ機能 00H はディスクのヘッドをパークし (SCSI 停止コマンド)、サブ機能 01H はディスクのヘッドをパーク解除します (SCSI 開始コマンド)。
INT13H (0x13)
機能 5506H (0x5506) --> SCSI バス パリティ (Seagate ST01/ST02)
呼び出し: AX = 5506H
DL = ドライブ番号
DH = サブ機能番号(参照
コメント
戻る:
AL = ステータス (00H パリティチェック
無効、01Hパリティチェック有効)
コメント:
DH の次のサブ関数番号を持つ関数を呼び出します。
価値
|
説明
|
00H
|
パリティチェックを無効にする
|
01H
|
パリティチェックを有効にする
|
02H
|
現在のパリティ設定を返す
|
INT13H (0x13)
機能 5507H (0x5507) から機能 550DH (0x550D) --> 予約済み機能 (Seagate ST01/ST02)
AX = 5507H から AX = 550DH への呼び出し
コメント:
これらの機能は正式に「予約済み」としてリストされています
INT13H (0x13)
関数 A0H (0xA0 または 160) --> 常駐コード セグメントを取得 (Super PC-Kwik v3.20 以降)
コール: AH = A0H
IF = 4358H
戻る:
AX = 居住者コードセグメント
コメント:
この関数は、常駐コード セグメントを取得するために使用されます。AX は常駐コードのセグメントを返します。
INT13H (0x13)
関数 A1H (0xA1 または 161) --> キャッシュをフラッシュ (Super PC-Kwik v3.20 以降)
コール: AH = A1H
IF = 4358H
戻る:
キャリーフラグ = クリア
AH = 00H (v5.10)
コメント:
この関数はキャッシュをフラッシュするために使用されます。
INT13H (0x13)
関数 A3H (0xA3 または 163) --> キャッシュを無効にする (Super PC- Kwik v3.20 以降)
コール: AH = A3H
IF = 4358H
戻る:
キャリーフラグ = クリア
コメント:
キャッシュを無効にするために使用する関数です。
INT13H (0x13)
関数 A4H (0xA4 または 164) --> キャッシュを有効にする (Super PC-Kwik v3.20 以降)
コール: AH = A4H
IF = 4358H
戻る:
キャリーフラグ = クリア
コメント:
この関数はキャッシュを有効にするために使用されます。
INT13H (0x13)
関数 EEH (0xEE または 238) --> 1024 シリンダ フラグの設定 (SWBIOS)
コール:AH = EEH
DL = ドライブ番号
戻る:
キャリーフラグ = クリア
AH = 00H
コメント:
この関数は、1024 - シリンダ フラグを設定するために使用されます。このフラグは、AH=EEH および AH=EFH を除くすべての INT 13H 呼び出しによってクリアされます。ディスク マネージャーもこれらの呼び出しをサポートしています。この関数は、その呼び出しをサポートするソフトウェアの場合、CX=0400H で関数 AH=EFH を呼び出すことと同じです。
この機能は、SWBIOS を使用して 1024 シリンダーを超えるドライブにアクセスできるようにするために、HyperDisk v4.01 以降および PC-Cache v5.5 以降でもサポートされています。
INT13H (0x13)
関数 EFH (0xEF または 239) --> シリンダー オフセットの設定 (Ontrack Drive Rocket)
コール:AH = EFH
CX = 次のINT 13H呼び出しのシリンダオフセット
DL = ドライブ番号
戻る:
キャリーフラグ = クリア
AH = 00H
コメント:
この関数はシリンダ オフセットを設定するために使用されます。この呼び出しをサポートするソフトウェアの場合、関数 AH=EEH は CX=0400H でこの関数を呼び出すことと同じです。シリンダ オフセットは、AH=EEH と AH=EFH を除くすべての INT 13H の呼び出しによって 0 にリセットされます。
INT13H (0x13)
関数 F9H (0xF9 または 249) --> インストール チェック (SWBIOS)
コール:AH = F9H
DL = ドライブ番号
戻り値: 関数が成功した場合、
キャリーフラグ = クリア
DX = 構成ワード (コメントを参照)
関数が失敗した場合、
キャリーフラグ = セット
コメント:
この関数はインストール チェックに使用されます。関数が成功した場合、キャリー フラグはクリアされ、DX は構成ワードを返します。それ以外の場合は、キャリー フラグが設定されます。
他の SWBIOS 拡張機能が利用可能な場合は、ビット 15 が設定されます。ディスク マネージャーもこれらの呼び出しをサポートします。
INT13H (0x13)
関数 FEH (0xFE または 254) --> 拡張シリンダ数を取得する (SWBIOS)
コール:AH = FEH
DL = ドライブ番号
戻る:
キャリーフラグ = クリア
DX = 1024を超えるシリンダー数
ドライブ中
コメント:
この関数は拡張シリンダ数を取得するために使用されます。関数 AH = 08H または INT 13H は、1024 に切り捨てられたシリンダ数を返します。この拡張機能のない BIOS は、1024 を法とするカウントを返します。ディスク マネージャーもこれらの呼び出しをサポートしています。
INT13H (0x13)
関数 FFH (0xFF または 255) --> 公式にプライベートな関数 (IBM SurePath BIOS)
INT13H (0x13)
関数 FFFFH (0xFFFF) --> ターボモードの設定 (UNIQUE UX ターボユーティリティ)
コール: AX = FFFFH
BH = AAH
BL = サブ機能番号(表を参照)
コメント欄
戻り値: インストールされている場合、
AX = 1234H
コメント:
この関数はターボ モードを設定するために使用されます。BL で関数を呼び出すためのサブ関数番号は次の表に示されています。
価値
|
説明
|
00H
|
インストールチェック
|
01H
|
ターボモードをオンにする
|
02H
|
ターボモードをオフにする
|
03H
|
ハードウェアスイッチに応じてターボモードを設定する
|
04時間
|
ディスクアクセスをターボモードに設定する
|
05H
|
ディスクアクセスを通常モードに設定する
|
C プログラミングで INT 13H 拡張機能を使用する方法
INT 13H の拡張関数は、前の章で使用したのと同じ C 関数 (int86()、int86x() など) で呼び出すことができます。例を使って学習してみましょう。
次の例では、3 つの機能 (拡張機能の存在の確認、拡張読み取り、拡張書き込み) に焦点を当てています。ただし、この章では拡張書き込み機能は使用しません。
プログラムはまず、拡張機能がサポートされているかどうかをチェックし、拡張機能が INT 13H に存在する場合はディスクの絶対セクター 0 (つまり MBR) を読み取ります。プログラムのコーディングは次のように進行します。
/* INT 13 BIOS 拡張を使用して 8.46 GB を超えるセクターにアクセスするプログラム */
#include<stdio.h>
#include<dos.h>
/* データ型に識別子を割り当てます */
typedef unsigned char Byte;
typedef unsigned int 単語;
typedef unsigned long DWord;
/* disk_packet 構造体が DS:SI にロードされ、コマンドが実行されます */
構造体ディスクパケット
{
Byte size_pack; // パケットのサイズは16または16以上である必要があります
バイト予約1; // 予約済み
Byte no_of_blocks;// 転送するブロック数
バイト予約2; // 予約済み
/* セグメント:オフセット形式のアドレス */
ワードオフセット; //オフセットアドレス
ワードセグメント; //セグメントアドレス
/* 1152921504.607 GB の容量のディスク イベントをサポートするには */
DWord lba1;
DWord lba2;
}
ディスクパック;
/* 拡張機能がサポートされているかどうかを確認する関数 */
void check_ext_present()
{
union REGS inregs, outregs; /* 入力レジスタと
出力 */
inregs.h.ah=0x41; /* チェックする関数
拡張機能あり */
inregs.x.bx=0x55AA;
inregs.h.dl=0x80; /* 最初のハードディスクのドライブ番号 */
int86(0x13,&inregs,&outregs); /*割り込みを呼び出す */
if(outregs.x.cflag)
{
/* 拡張機能はサポートされていません */
printf("\nBIOS拡張はサポートされていません");
終了(1);
}
(outregs.x.bx = = 0xAA55の場合)
outregs.x.cx と 0x1 の場合
/* 拡張機能あり */
printf("\n拡張I/Oがサポートされています");
}
/* セクターを読み取る関数 */
void read_sectors(void *バッファ)
{
union REGS inregs, outregs; /* 入力と出力
レジスタ */
struct SREGS segregs; // セグメントレジスタ
disk_pack.size_pack=16; // サイズを16に設定
disk_pack.no_of_blocks=1; // 1ブロック
disk_pack.reserved1=0; // 予約語
disk_pack.reserved2=0; // 予約語
disk_pack.segment=FP_SEG(buffer);// バッファのセグメント
disk_pack.offset=FP_OFF(buffer); // バッファのオフセット
/* ハードディスク 1 の MBR を要求 */
/* 絶対セクター 0 を読み取ります */
disk_pack.lba1=0; /* LBAアドレス、最初の
32ビット*/
/* 通常、(ドライブ < 2.1 TB) を設定する必要があります
これだけ*/
disk_pack.lba2=0; // 最後の32ビットアドレス
inregs.h.ah=0x42; // 読み取る関数
inregs.h.dl=0x80; // 最初のハードディスクのドライブ番号 inregs.x.si = FP_OFF(&disk_pack); /* DS:SI ポイントを作成する
ディスクパックへ */
segregs.ds = FP_SEG(&disk_pack);
/* 割り込み呼び出し */
int86x(0x13,&inregs,&outregs,&segregs);
if(outregs.x.cflag)
printf("\n\nエラー %d\n",outregs.h.ah);
それ以外
printf("\n\nすべてがうまくいくことを願っています");
}
//// セクター書き込み関数 \\\\
void write_sector()
{
/* この関数では関数番号が 0x43 になる点を除き、read_sectors 関数と同じ方法で書き込まれます。拡張書き込み関数については、次の章で説明します。
この機能を使用する前に、何をしようとしているのかを確認してください。何をしようとしているのか、適切な知識を持っている必要があります。知識不足または不注意でこの機能を使用すると、データが破壊される可能性があります。*/
}
/// メイン関数 \\\\
void main()
{
整数 i=0;
/* MBR を保持するバッファ */
バイトmbr[512];
clrscr();
/* BIOS 拡張機能が存在するかどうか確認する */
チェック_ext_present();
/* セクターを読み込む */
読み取りセクタ(&mbr);
printf("\n\n MBRのデータ\n");
printf("▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n\n\n");
i++<512 の場合
{
/* MBR バッファを表示する */
printf("%c",mbr[i]);
}
}
MBRのデータ
プログラムのコーディングに関するコメント
typedef はデータ型に識別子を割り当てます。たとえば、typedef unsigned char Byte; はデータ型 char に識別子 Byte を割り当てます。同様に、識別子 Word は int に割り当てられ、DWord は long に割り当てられます。
disk_packet 構造が DS:SI にロードされ、コマンド (拡張読み取り、拡張書き込み、検証など) が実行されます。前述の IBM/MS INT 13H 拡張の機能 (機能 41H から機能 49H) を参照してください。
check_ext_present() 関数は、拡張機能が利用可能/サポートされているかどうかを確認します。この関数は BX=55AAH (inregs.x.bx=0x55AA;) で呼び出され、拡張機能がサポートされている場合は BX レジスタが AA55H に設定されます。(前述の関数 41H を参照)
関数 read_sectors は、disk_pack.lba1 で指定されたディスクの絶対セクターを読み取るために使用されます。このプログラムでは、disk_pack.lba1=0 を指定しているため、絶対セクター 0 (以下の注記を参照) を読み取り、ディスクの MBR を読み取ります。
write_sector 関数も read_sectors 関数と同じで、同じ方法で記述されますが、関数オプションが異なります。次の章で使用します。
注記:
ディスク セクターは次の 2 つの方法で読み取ります。
- 相対セクター読み取り(または書き込み)
- 絶対セクター読み取り(または書き込み)
相対セクター読み取りでは、ディスクの CHS (シリンダ、ヘッド、セクター) ジオメトリに従ってディスク セクターを読み取ります。相対セクター読み取りでは、ディスクの MBR (ディスクの最初のセクター) はシリンダ 0、ヘッド 0、セクター 1 にあります。
ディスク セクターの絶対読み取りでは、プログラムでシリンダー番号またはヘッド番号を指定する必要はありません。絶対セクターは絶対セクター 0 からカウントされます。
したがって、ディスクの MBR (ディスクの最初のセクター) を読み取る場合は、絶対セクター 0 を読み取ることになります。絶対セクター番号を対応するシリンダー、ヘッド、セクター番号に変換するのは BIOS の仕事です。
絶対セクター読み取り (または書き込み) の場合、ディスク全体の読み取りや書き込みなどの操作では、ループ内の絶対セクターのみを計算する必要がありますが、相対セクター読み取り (または書き込み) の場合は、CHS を計算するために一度に 3 つのループを実行する必要があるため、絶対セクター読み取り/書き込みは相対セクター読み取り/書き込みよりもはるかに高速です。
たとえば、 16 ヘッド (サイド)、12 シリンダ、63 セクターのハード ディスクがある場合、次の表は両方の読み取り方法の手順と違いを示し、絶対セクター アプローチによって時間のかかるプログラム (ディスク全体の読み取り/書き込みやディスク全体の消去プログラムなど) の実行速度が大幅に向上することを示します。
相対セクターの読み取り
|
絶対セクター読み取り
|
シリンダー =0、ヘッド =0、セクター =1
|
絶対セクター = 0
|
シリンダー =0、ヘッド =0、セクター = 2
|
絶対セクター = 1
|
シリンダー =0、ヘッド =0、セクター = 3
|
絶対セクター = 2
|
。
。
。
。
|
。
。
。
。
|
シリンダー =0、ヘッド =0、セクター = 62
|
絶対セクター = 61
|
シリンダー =0、ヘッド =0、セクター = 63
|
絶対セクター = 62
|
シリンダー =0、ヘッド =1、セクター =1
|
絶対セクター = 63
|
シリンダー =0、ヘッド =1、セクター =2
|
絶対セクター = 64
|
シリンダー =0、ヘッド =1、セクター =3
|
絶対セクター = 65
|
シリンダー =0、ヘッド =1、セクター =4
|
絶対セクター = 66
|
。
。
。
。
|
。
。
。
。
|
シリンダー =0、ヘッド =1、セクター = 63
|
絶対セクター = 125
|
シリンダー =0、ヘッド =2、セクター =1
|
絶対セクター = 126
|
シリンダー =0、ヘッド =2、セクター =2
|
絶対セクター = 127
|
シリンダー =0、ヘッド =2、セクター =3
|
絶対セクター = 128
|
。
。
。
。
|
。
。
。
。
|
シリンダー =0、ヘッド =15、セクター = 63
|
絶対セクター = 1007
|
シリンダー = 1、ヘッド = 0、セクター = 1
|
絶対セクター = 1008
|
シリンダー = 1、ヘッド = 0、セクター = 2
|
絶対セクター = 1009
|
シリンダー = 1、ヘッド = 0、セクター = 3
|
絶対セクター = 1010
|
。
。
。
。
|
。
。
。
。
|
シリンダー = 1、ヘッド = 0、セクター = 63
|
絶対セクター = 1070
|
シリンダー = 1、ヘッド = 1、セクター = 1
|
絶対セクター = 1071
|
シリンダー = 1、ヘッド = 1、セクター = 2
|
絶対セクター = 1072
|
シリンダー = 1、ヘッド = 1、セクター = 3
|
絶対セクター = 1073
|
。
。
。
。
|
。
。
。
。
|
シリンダー = 1、ヘッド = 15、セクター = 63
|
絶対セクター = 2015
|
シリンダー =2、ヘッド =0、セクター =1
|
絶対セクター = 2016
|
シリンダー =2、ヘッド =0、セクター =2
|
絶対セクター = 2017
|
シリンダー =2、ヘッド =0、セクター =3
|
絶対セクター = 2018
|
。
。
。
。
|
。
。
。
。
|
シリンダー = 11、ヘッド = 15、セクター = 60
|
絶対セクター = 12092
|
シリンダー = 11、ヘッド = 15、セクター = 61
|
絶対セクター = 12093
|
シリンダー = 11、ヘッド = 15、セクター = 62
|
絶対セクター = 12094
|
シリンダー = 11、ヘッド = 15、セクター = 63
|
絶対セクター = 12095
|
以下は、ディスク上の任意の MBR 分析ツールによって表示される MBR パーティション テーブルに関する情報です。
ディスク上のMBR分析ツールで表示される
上記の情報では、両方のパーティションの開始の相対セクター番号はそれぞれ 63 と 11277630 であり、パーティションがなく、ディスク上で使用可能なセクターの数に応じてカウントされます。