第8章
C を使用したディスク BIOS 機能と割り込み処理
導入
この章では、Disk-BIOS の重要な機能と、C プログラムで割り込みを簡単かつ簡潔な方法で自由に使用および処理できるようにするその他の重要な機能について説明します。これらの機能は、データ復旧およびディスク トラブルシューティング プログラミングの基礎となります。これらは、 C 言語を「高級アセンブリ言語」にする機能です。
biosdisk と _bios_disk の機能
これら 2 つの機能は、データ復旧とディスク トラブルシューティング プログラミングの目的にとって最も重要です。ほとんどの場合、これらの機能を使用します。
これら 2 つの関数は BIOS ディスク ドライブ サービスであり、bios.h で定義されています。biosdisk は、raw セクターのファイル レベル以下で動作します。これらの機能を少しでも不注意に使用すると、ハード ドライブ上のファイルやディレクトリの内容が破壊される可能性があります。 biosdisk 関数と _bios_disk 関数はどちらも割り込み 0x13 を使用してディスク操作を BIOS に直接渡します。 _bios_disk 関数はプログラム内で次のように宣言されます。
符号なし_bios_disk(符号なしコマンド、構造体diskinfo_t *dinfo);
BIOS ディスク関数の宣言は次のようになります。
int biosdisk(int cmd, int ドライブ, int ヘッド, int トラック,
int セクター、int nsects、void *バッファ);
これらのパラメータの意味は次の表で説明されています。
パラメータ |
関数 |
それは何なのか、何をするのか |
コマンド |
両方 |
読み取り、書き込み、チェックなど、実行する操作を指定します。(以下の cmd の説明を参照してください) |
情報 |
_バイオスディスク |
操作に必要な残りのパラメータを含む diskinfo_t 構造体を指します。 (下記のdiskinfo_t構造体の説明を参照) |
車を運転する |
バイオディスク |
使用するディスクを指定します (a: の場合は 0、b: の場合は 1、最初の物理ハード ディスクの場合は 0x80、2 番目のディスクの場合は 0x81 など)。 |
ヘッド
軌道セクター
|
バイオディスク |
これらは、操作を開始する開始セクターの場所を定義します。 |
昆虫 |
バイオディスク |
読み取り、書き込み、チェックなどを行うセクターの数。 |
バッファ |
バイオディスク |
データの読み取りまたは書き込みが行われるメモリ アドレス。 |
これらの関数の両方で、データはハード ドライブの論理セクター サイズであるセクターあたり 512 バイトのバッファーに読み書きされ、両方の関数からの戻り値は BIOS 呼び出し INT 0x13H によって設定された AX レジスタの値になります。
関数が成功した場合、上位バイト = 0 (正常に完了したことを意味し) となり、下位バイトには読み取り、書き込み、検証されたセクター数などが含まれます。
ただし、エラーが発生して関数が正常に実行されなかった場合、上位バイトの値は、次の表で説明するエラー コードのいずれかに対応します。
価値 |
説明 |
0x00 |
正常に完了しました(エラーではありません!!) |
0x01 |
悪いチーム |
0x02 |
住所ラベルが見つかりません |
0x03 |
書き込み禁止のディスクに書き込もうとしています |
0x04 |
セクターが見つかりません |
0x05 |
リセットに失敗しました(ハードドライブ) |
0x06 |
最後の操作以降にディスクが変更されました。 |
0x07 |
ドライブパラメータアクションの実行に失敗しました |
0x08 |
ダイレクトメモリアクセス (DMA) オーバーフロー |
0x09 |
64K 境界を越えて DMA を実行しようとしました (データ境界エラーまたはセクター >80H) |
0x0A |
不良セクタが検出されました |
0x0B |
不良トラックが検出されました |
0x0C |
サポートされていないトラック |
0x0D |
フォーマット時のセクター数が正しくありません (PS/2 ハード ドライブ) |
0x0E |
制御データ アドレス マークが検出されました (ハード ディスク) |
0x0F |
DMA 調停レベルが範囲外です (ハード ドライブ) |
0x10 |
ディスク読み取り時のCRC/ECCが正しくありません |
0x11 |
CRC/ECC データ訂正エラー(実際にはエラーではない) |
0x20 |
コントローラーが故障しています |
0x31 |
ドライブにメディアがありません (IBM/MS INT 13 拡張) |
0x32 |
CMOS に保存されているディスク タイプが正しくありません (Compaq) |
0x40 |
検索操作に失敗しました。 |
0x80 |
添付ファイルが応答しませんでした |
0xAA |
ディスクの準備ができていません (ハードディスクのみ) |
0xB0 |
ボリュームはディスクにロックされていません (INT 13 拡張) |
0xB1 |
ボリュームがディスク上でロックされています (INT 13 拡張) |
0xB2 |
取り外し不可能なボリューム (INT 13 拡張) |
0xB3 |
使用量(INT 13 拡張機能) |
0xB4 |
ロック数が超過しました (INT 13 拡張) |
0xB5 |
有効なスロー要求を実行できませんでした (INT 拡張 13) |
0xBB |
不明なエラーが発生しました (ハードドライブのみ) |
0xCC |
録音エラーが発生しました |
0xE0 |
ステータスレジスタエラー |
0xFF |
オペレーションセンスが失敗しました |
以下の表は、cmd パラメータによって実行される操作コマンドを示しています。まず、両方の機能の一般的な操作を見てみましょう。
バイオディスク |
_バイオスディスク |
彼は何をしているのですか? |
0 |
_ディスク_リセット |
ディスクシステムをリセットし、ドライブコントローラを強制的にハードリセットします。他のすべてのパラメータは無視します。 |
1 |
_ディスクステータス |
最後のディスク操作のステータスを返します。他のすべてのパラメータは無視されます。 |
2 |
_ディスク_読み取り |
1つまたは複数のディスクセクターをメモリに読み込みます |
3 |
_ディスク_書き込み |
メモリから1つ以上のディスクセクターを書き込む |
4 |
_ディスク_検証 |
1つ以上のセクターを検証します |
5 |
_ディスク_フォーマット |
トラックをフォーマットする |
cmd = 0、1、2、3、4、5 または cmd = _DISK_RESET、_DISK_STATUS、_DISK_READ、_DISK_WRITE、_DISK_VARIFY、_DISK_FORMAT のいずれかを自由に使用でき、両方のオプションの効果は同じですが、cmd に間違ったコマンド番号を入力した場合のエラーを回避するのに役立つ可能性があるため、cmd = 5 ではなく、cmd = _DISK_FORMAT などの単語オプションを使用する習慣を付けることをお勧めします。
biosdisk または _bios_disk 関数の宣言で、cmd = _DISK_RESET を指定すると、関数は他のすべてのパラメータを無視してディスク システムをリセットし、_DISK_STATUS は他のすべてのパラメータを無視して最後のディスク操作のステータスを返します。
cmd =_DISK_READ、_DISK_WRITE、または _DISK_VERIFY (2、3、または 4) の場合、biosdisk および _bios_disk 関数は以下に示す他のパラメータも使用します。
パラメータ |
何をするのか |
ヘッド
トラック
セクター |
これら 3 つは、指定された操作の開始セクターの位置を指定します。(最小値は、ヘッド = 0、トラック = 0、セクター = 1 です) |
セクター |
読み取りまたは書き込みするセクターの数を指定します |
バッファ |
データが読み書きされるバッファを指します |
cmd の値が 5 (_DISK_FORMAT) の場合、biosdisk と _bios_disk は、表の説明に従って次のパラメータを使用します。_DISK_FORMAT を使用するときは常に注意し、何をしようとしているのかを把握しておくことをお勧めします。知識不足や小さなミスでも、大きなデータ損失につながる可能性があります。
パラメータ |
何をするのか |
ヘッド
トラック |
これらはフォーマットするトラックの場所を指定します |
バッファ |
これは、指定されたトラックに書き込まれるセクターヘッダーのテーブルを指します。 |
cmd には、biosdisk 関数でのみ使用される追加の値がいくつかあります。これらの cmd の値は、XT、AT、PS/2、および互換機でのみ許可されます。値については、次の表で説明します。
コマンド |
何をするのか |
6 |
トラックをフォーマットし、不良セクタフラグを設定します |
7 |
特定のトラックからドライブをフォーマットします |
8 |
バッファの最初の4バイトに現在のドライブパラメータを返します。 |
9 |
ドライブペアの特性を初期化します |
10 |
長い読み取り(セクターあたり512バイト+4バイト) |
11 |
長い書き込み(セクターあたり512バイト+4バイト) |
12 |
ディスクはシークするか |
13 |
代替ディスクのリセット |
14 |
セクターバッファを読み取ります |
15 |
セクターバッファへの書き込み |
16 |
指定されたドライブの準備ができているかどうかをテストします |
17 |
ドライブを再調整します |
18 |
コントローラ RAM 診断 |
19 |
ドライブ診断 |
20 |
コントローラ内部診断 |
diskinfo_t 構造体
diskinfo_t 構造体は _bios_disk 関数によって使用されます。構造体の説明は次のとおりです。
構造体diskinfo_t {
符号なしドライブ、ヘッド、トラック、セクター、nsectors。
void far *バッファ;
};
ここで、drive は使用するディスク ドライブを指定します。ハード ディスクの場合は、ディスク パーティションではなく物理ドライブが指定されることを常に覚えておいてください。パーティションを操作する場合、アプリケーション プログラムはそのディスク自体のパーティション テーブル情報も解釈する必要があります。
head、track、sector の値は、操作の開始セクターの位置を指定します。nsectors は、読み取りまたは書き込みの対象となるセクターの数を指定し、buffer は、データが読み書きされるバッファーを指します。cmd の値に応じて、diskinfo_t 構造体の他のパラメーターが必要になる場合と、必要にならない場合があります。
biosdisk および _bios_disk 関数で使用されるディスク ドライブの仕様の値は、次の表に示されています。
価値を駆動する |
使用するディスクドライブ |
0 |
最初のフロッピーディスクドライブ |
1 |
2台目のフロッピーディスクドライブ |
2 |
3台目のフロッピーディスクドライブ |
.... |
(等々) |
0x80 |
最初のハードディスクドライブ |
0x81 |
2台目のハードディスクドライブ |
0x82 |
3番目のハードディスクドライブ |
.... |
(等々) |
理論は十分です。では、これらの機能の実際的な内容と例をいくつか見てみましょう。次の例では、フロッピーの 4 つのトラックの両面のセクターを読み取り、その内容をユーザーが指定したファイルに保存します。プログラムはディスクの表面を直接読み取るため、ディスクからファイルを削除しても問題ありません。
削除されたデータを確認するには、完全にフォーマットされたフロッピー ディスクを用意し、.c プログラム コーディングやその他のテキスト ファイル (ファイルの内容が理解できるように) などのテキスト ファイルをコピーすることをお勧めします。このファイルは、約 73 KB (データは 4 つのトラック、2 つの面、各トラックの 18 セクターに格納されています。各セクターは 512 バイト) を占めます。このプログラムは、例を説明するために開発されました。ただし、データを回復できるように変更および開発することができます。
/* フロッピーの 4 つのトラック (0、1、2、3) を読み取り、その内容を指定されたファイルに書き込むプログラム */
#include <bios.h>
#include <stdio.h>
#include<conio.h>
void main(void)
{
int ヘッド、トラック;
int 結果、i、セクター;
char ファイル名[80];
char *バッファ;
構造体 diskinfo_t dinfo;
静的char dbuf[512];
ファイル *tt;
clrscr();
/// ドライブの準備ができているかどうかを確認します \\\
if(!(biosdisk(4,0,0,0,0,1,バッファ) & 0x02))
{
printf(" ドライブ A: 準備ができていません:\n ドライブ A にディスクを挿入します:
任意のキーを押してください\n");
getch();
}
/* ディスクのセクターのデータを保存するファイル名を取得します */
printf("\n宛先ファイル名をフルパスで入力してください
データを保存するには\n\n >");
ファイル名を取得します。
if((tt= fopen(ファイル名, "wb"))==NULL)
{
printf("ファイルを開けませんでした!!!");
getch();
}
(トラック=0;トラック<4;トラック++)
{
(ヘッド=0; ヘッド<=1; ヘッド++)
{
for(セクター=1;セクター<=18;セクター++)
{
dinfo.drive = 0; /* A のドライブ番号: */
dinfo.head = head; /* ディスクヘッド番号 */
dinfo.track = track; /* トラック番号 */
dinfo.sector = sector; /* セクター番号 */
dinfo.nsectors = 1; /* セクター数 */
dinfo.buffer = dbuf; /* データ バッファ */
/// ステータスを表示 \\\
gotoxy(10,10); printf("データを読み込んでいます: Head=%d
トラック=%d セクター=%d",
ヘッド、トラック、セクター);
fprintf(tt,"\n データの読み取り元: ヘッド=%d トラック=%d セクター=%d\n",
ヘッド、トラック、セクター);
/// 指定されたセクターを読み取ります \\\
結果 = _bios_disk(_DISK_READ, &dinfo);
/// 指定されたファイルに内容を保存します \\\
((結果 & 0xff00) == 0)の場合
{
(i=0;i<512;i++) の場合
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/* セクターの読み取り中にエラーが発生した場合、画面とファイルにエラー メッセージを出力します */
それ以外
{
printf("\n ヘッド= %d トラック= %d で読み取れません
セクター= %d\n",ヘッド、トラック、セクター);
fprintf(tt,"\n ヘッド= %d トラック= %d で読み取れません
セクター =%d\n",ヘッド、トラック、セクター);
}
}
}
}
fclose(tt);
}
この例では、biosdisk 関数と _bios_disk 関数の使用法を示します。biosdisk 関数は、ディスクの準備ができているかどうか、およびアドレス マークが見つかったかどうかを確認します。_bios_disk 関数は、両側のセクターを最大 4 トラックまで読み取ります。
ディスク表面での読み取り (または書き込み) の順序は次のようになります。
absread および abswrite 関数
これらの関数はDos.hで定義されています。absread 関数は絶対ディスク セクターを読み取り、abswrite 関数は絶対ディスク セクターを書き込みます。関数 absread は DOS 割り込み 0x25 を使用して特定のディスク セクターを読み取り、関数 abswrite は DOS 割り込み 0x26 を使用して特定のディスク セクターを書き込みます。
絶対読み取りまたは書き込み操作は、セクターを段階的に増加させることによって順次進行し、ヘッド番号やトラック番号などはまったく関係ありません。絶対セクターをそれぞれのトラック、ヘッド番号、セクター番号に変換するのは、コンピューターの BIOS の役割です。
ディスク全体に対して読み取り/書き込み操作を実行し、プログラム内での余分なコーディングやループを避けてプログラムの速度を最速に上げたいプログラムでは、絶対読み取りおよび書き込み操作が推奨されます。
absread と abswrite の両関数は、ディスクの論理構造を無視し、ファイル、FAT、またはディレクトリには注意を払いません。これらの関数は、ディスクの表面で絶対読み取りおよび絶対書き込み操作を直接実行します。これが、不適切に使用すると、abswrite がファイル、ディレクトリ、および FAT を上書きする可能性がある理由です。
absread 関数の宣言は次のとおりです。
int absread(int ドライブ, int nsects, long lsect,
void *バッファ);
abswrite 関数は次のように宣言されます。
int abswrite(int ドライブ, int nsects, long lsect,
void *バッファ);
パラメータの意味は次のとおりです。
パラメータ。 |
それは何なのか |
ドライブ |
読み取り (または書き込み) するドライブ番号: 0 = A、1 = B など。 |
昆虫 |
読み取る(または書き込む)セクターの数 |
セクション |
開始論理セクター番号 |
バッファ |
データが読み取られる(または書き込まれる)メモリアドレス |
成功した場合、両方の関数は 0 を返します。エラーが発生した場合、両方の関数は -1 を返し、システム コールによって返された AX レジスタの値にエラー番号を設定します。
読み取りまたは書き込み操作のセクター数は、64K またはバッファのサイズのいずれか小さい方に制限されます。ただし、次の章では、メモリ制限 64K を超えて非常に高速なプログラムを開発するための巨大メモリの使用法を学習します。
|
C による割り込み処理
C は、定義された関数のいくつかを使用してさまざまな割り込みを呼び出すことができるため、高レベルアセンブリ言語と呼ばれることもあります。重要な関数のいくつかは次のとおりです。
- int86: MS-DOS 割り込みを呼び出します。
- int86x:セグメント レジスタ値を使用して MS-DOS 割り込みを呼び出します。
- intdos: DXとAL以外のレジスタを使用してMS-DOSサービスを呼び出す
- intdosx:セグメント レジスタ値を使用して MS-DOS サービスを呼び出します。
- segread:セグメントレジスタを読み取る
これらの関数について詳しく説明します。まず、これらの関数で頻繁にまたは必然的に使用されるいくつかの定義済み構造体と共用体について説明します。
SREGS構造
この構造体は dos.h で定義されており、int86x、intdosx、segread 関数に渡され、入力されるセグメント レジスタの構造体です。構造体の宣言は次のとおりです。
構造体SREGS{
符号なし整数;
符号なし整数 cs;
符号なし整数 ss;
符号なし整数ds;
};
REGS組合
REGS は 2 つの構造体の結合体です。結合体 REGS は dos.h で定義されており、関数 int86、int86x、intdos、intdosx との間で情報をやり取りするために使用されます。結合体の宣言は次のとおりです。
ユニオンREGS {
構造体WORDREGSx;
構造体 BYTEREGS h;
};
BYTEREGS と WORDREGS 構造
BYTEREGES および WORDREGS 構造体は dos.h で定義されており、バイト レジスタとワード レジスタを格納するために使用されます。WORGREGS 構造体を使用すると、ユーザーは CPU のレジスタに 16 ビットの量としてアクセスできます。BYTEREGES 構造体を使用すると、個々の 8 ビット レジスタにアクセスできます。
BITEREGS 構造体は次のように宣言されます。
構造体バイトレッグス{
符号なし char al、ah、bl、bh;
符号なしchar cl、ch、dl、dh;
};
WORDREGS 構造体は次のように宣言されます。
構造体WORDREGS{
符号なし整数 ax、bx、cx、dx;
unsigned int yes、of、cflag、flags;
};
int86 および int86x 関数
これらの関数は、dos.h で定義されている一般的な 8086 ソフトウェア割り込みインターフェイスです。レジスタは必要な値に設定され、これらの関数が呼び出されて MS-DOS 割り込みが呼び出されます。int86 関数の宣言は次のとおりです。
int int86(int intno, ユニオン REGS *inregs,
ユニオン REGS *outregs);
int86x は int86 関数のバリエーションです。次のように宣言されます。
int int86x(int intno, ユニオン REGS *inregs,
ユニオン REGS *outregs、構造体 SREGS *segregs);
関数 int86 と int86x は両方とも、引数 intno で指定された 8086 ソフトウェア割り込みを実行します。または、生成する割り込みは intno によって指定されると言えます。
int86x 関数では、ES と DS にのみアクセスでき、CS と SS にはアクセスできないため、デフォルトのデータ セグメントとは異なる DS の値を取得したり、ES に引数を取得したりする 8086 ソフトウェア割り込みを呼び出すことができます。
これらの関数は、ソフトウェア割り込みの実行前に、レジスタ値を inregs からレジスタにコピーします。関数 int86x は、ソフトウェア割り込みの実行前に、segregs->ds 値と segregs->es 値を対応するレジスタにコピーします。この機能により、far ポインターまたは大規模データ メモリ モデルを使用するプログラムは、ソフトウェア割り込みに使用するセグメントを指定できます。
これらの関数は、ソフトウェア割り込みが戻った後、現在のレジスタ値を outregs にコピーし、キャリー フラグのステータスを outregs の x.cflag フィールドにコピーし、8086 フラグ レジスタの値を outregs の x.flags フィールドにコピーします。関数 int86x は、DS も復元し、segregs->es フィールドと segregs->ds フィールドを対応するセグメント レジスタの値に設定します。
どちらの関数でも、inregs と outregs は同じ構造体を指すことができ、どちらの関数もソフトウェア割り込みの完了後に AX の値を返します。キャリー フラグが設定されている場合は、通常、エラーが発生したことを示します。
アセンブリ言語に相当する C で使用される REGS 共用体要素は、次の表に示されています。
16ビット |
8ビット |
C言語 |
アセンブリ言語 |
C言語 |
アセンブリ言語 |
登録 |
斧 |
登録 |
AL |
|
|
登録 |
ああ |
inregs.x.bx |
ベックス |
登録 |
ブル |
|
|
登録 |
BH |
inregs.x.cx |
CX |
翻訳元 |
CL |
|
|
翻訳元 |
中国語 |
インレグス.x.dx |
DX |
翻訳元 |
ダウンロード |
|
|
登録 |
DH |
翻訳元 |
そして |
|
|
inregs.x.of |
から |
|
|
inregs.x.cフラグ |
CF |
|
|
int86 および int86x 関数の例を見てみましょう。次のプログラムはフロッピー ディスクのすべてのセクターをスキャンし、各セクターの状態を画面に出力します。
/* フロッピー ディスクの各セクターをスキャンしてステータスを出力するプログラム */
#include<dos.h>
#include<conio.h>
void main()
{
int ヘッド、トラック、セクター、i;
char *バッファ;
ユニオン REGS inregs、outregs;
構造体 SREGS sregs;
clrscr();
/// ディスク システムをリセットしてディスクを初期化しています \\\
gotoxy(10,2); printf("ディスクを初期化しています...");
(i=0;i<3;i++) の場合
{
inregs.h.ah=0x00; // 関数番号
inregs.h.dl=0x00; // フロッピーディスク
int86(0x13,&inregs,&outregs);
}
gotoxy(10,2); printf("ディスクのステータスは次のとおりです...\n");
/* フロッピーディスクの 0 から 79 トラックをスキャンします (合計トラック 80) */
(トラック=0;トラック<=79;トラック++)
(ヘッド=0;ヘッド<=1;ヘッド++)
for(セクター=1;セクター<=18;セクター++)
{
inregs.h.ah = 0x04; /// 関数 数値
inregs.h.al = 1; /// セクター数
inregs.h.dl = 0x00; /// フロッピーディスク
inregs.h.ch = トラック;
inregs.h.dh = ヘッド;
inregs.h.cl = セクター;
inregs.x.bx = FP_OFF(buf);
sregs.es = FP_SEG(buf);
int86x(0x13,&inregs,&outregs,&sregs);
//// スキャンされたセクターのステータスを印刷します \\\\
スイッチ(outregs.h.ah)
{
0x00の場合:
cprintf("ステータス: エラーなし!!");
壊す;
ケース0x01:
cprintf("ステータス: 不正なコマンド");
壊す;
ケース0x02:
cprintf("ステータス: アドレスマークが見つかりません");
壊す;
ケース0x03:
cprintf("STATUS: 書き込みを試行中
書き込み禁止のディスク");
壊す;
ケース0x04:
cprintf("ステータス: セクターが見つかりません");
壊す;
ケース0x05:
cprintf("ステータス: リセットに失敗しました (ハードディスク) ");
壊す;
ケース0x06:
cprintf("STATUS: ディスクは前回から変更されました
手術");
壊す;
ケース0x07:
cprintf("STATUS: ドライブパラメータアクティビティ
失敗した") ;
壊す;
ケース0x08:
cprintf("STATUS: ダイレクトメモリアクセス (DMA)
オーバーラン");
壊す;
ケース0x09:
cprintf("STATUS: DMAを実行しようとしています
64K境界");
壊す;
ケース0x0A:
cprintf("ステータス: 不良セクタが検出されました");
壊す;
ケース0x0B:
cprintf("ステータス: 不良トラックが検出されました");
壊す;
ケース 0x0C:
cprintf("ステータス: メディアタイプが見つかりません");
壊す;
ケース 0x0D:
cprintf("STATUS: セクター数が無効です
フォーマット(ハードディスク) ");
壊す;
ケース 0x0E:
cprintf("STATUS: 制御データアドレスマーク
検出されました (ハードディスク) ");
壊す;
ケース 0x0F:
cprintf("STATUS: DMA調停レベルが
範囲(ハードディスク) ");
壊す;
ケース0x10:
cprintf("ステータス: ディスク読み取り時の CRC/ECC が不良です");
壊す;
ケース0x11:
cprintf("ステータス: CRC/ECC 修正データ エラー");
壊す;
ケース0x20:
cprintf("ステータス: コントローラーが失敗しました");
壊す;
ケース0x31:
cprintf("ステータス: ドライブにメディアがありません (IBM/MS INT 13H
拡張機能) ");
壊す;
ケース0x32:
cprintf("STATUS: 間違ったドライブタイプが保存されています
CMOS (コンパック) ");
壊す;
ケース0x40:
cprintf("ステータス: シーク操作に失敗しました");
壊す;
ケース0x80:
cprintf("ステータス: 添付ファイルが応答しませんでした
(ディスクタイムアウト) ");
壊す;
0xAAの場合:
cprintf("ステータス: ドライブの準備ができていません (ハードディスク
のみ) ");
壊す;
ケース0xB0:
cprintf("STATUS: ドライブ内のボリュームがロックされていません (INT
13H 拡張子) ");
壊す;
ケース0xB1:
cprintf("STATUS: ドライブ内のボリュームがロックされています (INT 13H 拡張) ");
壊す;
ケース0xB2:
cprintf("STATUS: ボリュームは削除できません (INT 13H
拡張機能) ");
壊す;
ケース0xB3:
cprintf("STATUS: ボリューム使用中 (INT 13H
拡張機能) ");
壊す;
ケース0xB4:
cprintf("STATUS: ロックカウントを超えました (INT 13H
拡張機能) ");
壊す;
ケース0xB5:
cprintf("STATUS: 有効な排出要求が失敗しました (INT
13H 拡張子) ");
壊す;
0xBBの場合:
cprintf("STATUS: 未定義のエラーが発生しました (ハード
ディスクのみ) ");
壊す;
0xCCの場合:
cprintf("STATUS: 書き込みエラーが発生しました");
壊す;
ケース 0xE0:
cprintf("STATUS: ステータスレジスタエラー");
壊す;
0xFFの場合:
cprintf("ステータス: センス操作に失敗しました");
壊す;
デフォルト: cprintf("STATUS: UNKNOWN Status CODE ");
}
printf("\n現在の位置= トラック:%d ヘッド:%d セクター:%d \n",
トラック、ヘッド、セクター);
}
gotoxy(10,24);printf("スキャンが完了しました!! 任意のキーを押して
出口..");
getch();
}
このプログラムは、関数 int86 と int86x の使用例を示しています。このプログラムでは、int86 関数は、INT 13H の関数 00H を使用して、ディスク システムをリセットしてディスクを初期化します。int86x 関数は、INT 13H の関数 04H を使用して、フロッピー (1.44Mb、3½ フロッピー ディスク) のすべてのセクターを両面から、最大 0 から 79 トラック (合計 80 トラック) まで検証します。
segread 関数
この関数は dos.h で定義されています。この関数はセグメント レジスタを読み取ります。関数の宣言は次のとおりです。
void segread(構造体SREGS *segp);
ここで、segread はセグメントレジスタの現在の値を構造体 *segp に格納します。関数からは何も返されず、呼び出しは intdosx および int86x で使用することを目的としています。例を見てみましょう。
#include <stdio.h>
#include <dos.h>
void main()
{
構造体 SREGS セグメント;
segread(&segs);
printf("現在のセグメントレジスタ設定\n\n");
printf("CS: %X DS: %X\n", segs.cs, segs.ds);
printf("ES: %X SS: %X\n", segs.es, segs.ss);
getch();
}
プログラムの出力は次のようになります。
現在のセグメントレジスタ設定
CS: EED DS: 10BA
ES: 10BA SS: 10BA
intdos および intdosx 関数
これらの関数は dos.h で定義されています。これらは一般的な DOS 割り込みインターフェイスです。関数 intdos は MS-DOS サービス レジスタを呼び出し、次に DX と AL を呼び出します。関数 intdosx はセグメント レジスタ値を使用して MS-DOS サービスを呼び出します。
intdos 関数の宣言は次のとおりです。
int intdos(union REGS *inregs, union REGS *outregs);
intdosx 関数の宣言は次のようになります。
int intdosx(union REGS *inregs, union REGS *outregs,
構造体 SREGS *segregs);
関数intdosおよびintdosx は、DOS 割り込み 0x21 を実行して、指定された DOS 関数を呼び出します。inregs->h.ah の値は、呼び出される DOS 関数を指定します。関数 intdosx は、DOS 関数を呼び出す前に、segregs ->ds および segregs ->es の値を対応するレジスタにコピーし、その後 DS を復元します。
この関数の機能により、far ポインターまたは大容量データ メモリ モデルを使用するプログラムで、関数の実行に使用するセグメントを指定できます。intdosx 関数を使用すると、デフォルトのデータ セグメントとは異なる DS の値を取る DOS 関数や、ES に引数を取る DOS 関数を呼び出すことができます。
どちらの関数も、DOS 関数呼び出しの完了後に AX の値を返し、キャリー フラグが設定されている場合 (outregs -> x.cflag != 0)、エラーが発生したことを示します。
割り込み 0x21 が返された後、関数は現在のレジスタ値を outregs にコピーし、キャリー フラグのステータスを outregs の x.cflag フィールドにコピーし、8086 フラグ レジスタの値を outregs の x.flags フィールドにコピーします。inregs と outregs はどちらも同じ構造体を指すことができます。これらの関数の例を見てみましょう。
intdos 関数の使用例を以下に示します。このプログラムは、フロッピー (1.44Mb、3½ インチ フロッピー ディスク) ディスク ドライブに関する選択された情報を取得します。このプログラムは、フロッピー ディスクの割り当て情報を提供します。
/* ディスク使用量のドライブ割り当て情報を取得します */
#include <dos.h> /* intdos() と union REGS 用 */
#include <stdio.h> /* printf() 用 */
ユニオン REGS inregs、outregs;
void main()
{
inregs.h.ah = 0x36; /* ディスクの空き容量を取得
関数番号 */
inregs.h.dl = 0x01; /* ドライブ A: */
intdos(&inregs, &outregs);
printf("%d セクター/クラスター、\n%d クラスター、\n%d バイト/セクター、
\n合計クラスター数: %d",
outregs.x.ax、outregs.x.bx、
outregs.x.cx、outregs.x.dx);
getch();
}
プログラムの出力は次のようになります。
1セクター/クラスター、
1933年のクラスター、
512バイト/セクター、
合計 2843 個のクラスター
ここで、関数 intdosxの例を見てみましょう。次の例は、 intdosx 関数の使用法を示しています。プログラムは、標準出力に文字列を出力します。
/* '文字列'を標準出力に出力するプログラム。 */
#include <dos.h>
ユニオン REGS inregs、outregs;
構造体 SREGS は分離します。
char far *string = "この文字列は
デフォルトのデータセグメント$";
void main()
{
inregs.h.ah = 0x09; /* 関数番号 */
inregs.x.dx = FP_OFF(文字列);/*DS:DXは遠い
'文字列*/のアドレス
segregs.ds = FP_SEG(文字列);
intdosx(&inregs, &outregs, &segregs);
getch();
}
プログラムの出力は次のようになります。
この文字列はデフォルトのデータセグメントに存在しません |
ここでは、関数intdosx、関数 09H、INT 21Hを使用して、指定された文字列を出力しています。指定された文字列は常に文字「$」で終わる必要があることに常に留意する必要があります。
物理ハードドライブ番号を確認する方法
物理ハード ドライブ番号は非常に重要なので、正確に記入する必要があります。不正なドライブ指定は、重大なデータ損失を引き起こす可能性があります。データ回復またはディスク トラブルシューティング プログラミング中は、ドライブ番号について確信を持たなければなりません。ディスクの配置が異なるディスクのドライブ番号を知る方法は、次に示す例で推定できます。
最も一般的な誤解によると、物理ドライブ番号はディスクの接続状態に応じて提供されますが、場合によっては、または特別な場合には、オペレーティング システムのブート手順またはブート設定に依存する場合があります。
ここでは、BIOS によって提供される物理ドライブ番号の最も一般的な考え方が示されていますが、それでも、ディスク編集ツールや次の章で説明するプログラムを使用して、ディスクの構成を確認する必要があります。違法に使用したり、知識不足で使用したりすると、データが破損したり損傷したりする可能性があるプログラムを実行するかどうかは、確認した上で決定する必要があります。
一般的に、システムに 2 つのディスクが接続されていて、1 つがプライマリ マスターで、もう 1 つがセカンダリ マスターである場合、最初の優先順位はプライマリ マスター (次にプライマリ スレーブが使用可能な場合) に与えられ、次にセカンダリ マスター (次にセカンダリ スレーブが使用可能な場合、以下同様に) に与えられ、物理番号は優先順位に従って与えられます。
システムが一度に最大 4 つのハードディスクをサポートしていると仮定します。4 つのハードディスクはすべて次のように接続できます。
プライマリマスター |
プライマリスレーブ |
セカンダリマスター |
セカンダリスレーブ |
ここで、物理ドライブのドライブ数に関するいくつかのケースを考えてみましょう。ここでは、ディスク製造元が指定した適切なジャンパー設定と適切なマスター/スレーブ設定でディスクを接続していると仮定します。
- 4 台のハード ディスクすべてがシステムに接続されている場合: 4 台のディスクすべてがシステムに接続されている場合、物理ドライブ番号は次のようになります。
プライマリ/セカンダリ(マスター/スレーブ) |
状態 |
物理ドライブ番号と説明 |
プライマリマスター |
ディスクが存在する |
物理ドライブ番号は 80H になります。この場合、ハード ディスクは最初のハード ディスクと呼ばれます。 |
プライマリスレーブ |
ディスクが存在する |
物理ドライブ番号は81H になります。この場合、ハード ディスクはセカンド ハード ディスクと呼ばれます。 |
セカンダリマスター |
ディスクが存在する |
物理ドライブ番号は82H になります。この場合、ハード ディスクは3 番目のハード ディスクと呼ばれます。 |
セカンダリスレーブ |
ディスクが存在する |
物理ドライブ番号は 83H になります。この場合、ハード ディスクは4 番目のハード ディスクと呼ばれます。 |
- システムに 3 台のハード ディスクが接続されている場合: システムに 3 台のハード ディスクが接続されている場合、物理ドライブ番号は接続設定に従って決まります。次の例は、いくつかの配置を示しています。
プライマリ/セカンダリ(マスター/スレーブ) |
状態 |
物理ドライブ番号と説明 |
プライマリマスター |
ディスクが存在する |
物理ドライブ番号は 80H になります。この場合、ハード ディスクは最初のハード ディスクと呼ばれます。 |
プライマリスレーブ |
ディスクが存在する |
物理ドライブ番号は81H になります。この場合、ハード ディスクはセカンド ハード ディスクと呼ばれます。 |
セカンダリマスター |
ディスクが存在する |
物理ドライブ番号は82H になります。この場合、ハード ディスクは3 番目のハード ディスクと呼ばれます。 |
セカンダリスレーブ |
ディスクが存在しません |
------------------- |
プライマリ/セカンダリ(マスター/スレーブ) |
状態 |
物理ドライブ番号と説明 |
プライマリマスター |
ディスクが存在しません |
------------------- |
プライマリスレーブ |
ディスクが存在する |
物理ドライブ番号は 80H になります。この場合、ハード ディスクは最初のハード ディスクと呼ばれます。 |
セカンダリマスター |
ディスクが存在する |
物理ドライブ番号は81H になります。この場合、ハード ディスクはセカンド ハード ディスクと呼ばれます。 |
セカンダリスレーブ |
ディスクが存在する |
物理ドライブ番号は82H になります。この場合、ハード ディスクは3 番目のハード ディスクと呼ばれます。 |
プライマリ/セカンダリ(マスター/スレーブ) |
状態 |
物理ドライブ番号と説明 |
プライマリマスター |
ディスクが存在する |
物理ドライブ番号は 80H になります。この場合、ハード ディスクは最初のハード ディスクと呼ばれます。 |
プライマリスレーブ |
ディスクが存在しません |
------------------- |
セカンダリマスター |
ディスクが存在する |
物理ドライブ番号は81H になります。この場合、ハード ディスクはセカンド ハード ディスクと呼ばれます。 |
セカンダリスレーブ |
ディスクが存在する |
物理ドライブ番号は82H になります。この場合、ハード ディスクは3 番目のハード ディスクと呼ばれます。 |
プライマリ/セカンダリ(マスター/スレーブ) |
状態 |
物理ドライブ番号と説明 |
プライマリマスター |
ディスクが存在する |
物理ドライブ番号は 80H になります。この場合、ハード ディスクは最初のハード ディスクと呼ばれます。 |
プライマリスレーブ |
ディスクが存在する |
物理ドライブ番号は81H になります。この場合、ハード ディスクはセカンド ハード ディスクと呼ばれます。 |
セカンダリマスター |
ディスクが存在しません |
------------------- |
セカンダリスレーブ |
ディスクが存在する |
物理ドライブ番号は82H になります。この場合、ハード ディスクは3 番目のハード ディスクと呼ばれます。 |
- システムに 2 つのハード ディスクが接続されている場合: 同様に、システムに 2 つのハード ディスクが接続されている場合、物理ドライブ番号は接続設定に従います。次の例で説明します。
プライマリ/セカンダリ(マスター/スレーブ) |
状態 |
物理ドライブ番号と説明 |
プライマリマスター |
ディスクが存在する |
物理ドライブ番号は 80H になります。この場合、ハード ディスクは最初のハード ディスクと呼ばれます。 |
プライマリスレーブ |
ディスクが存在しません |
------------------- |
セカンダリマスター |
ディスクが存在しません |
------------------- |
セカンダリスレーブ |
ディスクが存在する |
物理ドライブ番号は81H になります。この場合、ハード ディスクはセカンド ハード ディスクと呼ばれます。 |
- システムに単一のハードディスクが接続されている場合: 使用できるディスクが 1 つしかない場合、物理ドライブ番号は 80H になります。
割り込み 13H (INT 13H)、ROM BIOS ディスク ドライバー機能
ここでは、INT 13H 関数について説明しました。これらの関数は、誤用したり、不注意または知識不足で使用したりすると、大きなデータ損失やその他の多くの問題が発生する可能性があるため、注意して学習する必要があります。ただし、適切かつ適切な方法で使用すると、これらの関数はプログラムのコーディングを最小限に抑え、プログラミングをシンプルで簡単にするのに役立ちます。
INT13H (0x13)
機能 00H (0x00) ディスクシステムをリセット
AH = 00Hでコール
DL = ドライブ
00H-7FH フロッピーディスク
80H-FFH 固定ディスク
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
ディスク コントローラをリセットし、接続されているドライブを再調整します。読み取り/書き込みアームがシリンダ 0 に移動され、ディスク I/O の準備が整います。
この関数は、フロッピー ディスクの読み取り、書き込み、検証、またはフォーマット要求が失敗した後に、操作を再試行する前に呼び出す必要があります。関数が固定ディスク ドライブで呼び出された場合 (つまり、DL>=80H を選択)、フロッピー ディスク コントローラがリセットされ、次に固定ディスク コントローラがリセットされます。
INT13H (0x13)
機能 01H (0x01) ディスクシステムステータスを取得する
コール: AH = 01H
DL = ドライブ
00H-7FH フロッピーディスク
80H-FFH 固定ディスク
戻り値: AH = 00H
AL = 前回のディスク操作のステータス
(誤差については前掲の表を参照)
およびステータス コードの説明)。
コメント:
最新のディスク操作のステータスを返します
INT13H (0x13)
機能 02H (0x02) セクタの読み取り
コール: AH = 02H
AL = セクター数
CH = シリンダー
CL = セクター
DH = 頭
DL = ドライブ
00H-7FH フロッピーディスク
80H-FFH 固定ディスク
ES:BX = セグメント: バッファのオフセット
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00H
AL = 転送されたセクター数
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、ディスクから 1 つ以上のセクターをメモリに読み取ります。固定ディスクでは、10 ビットのシリンダ番号の上位 2 ビットがレジスタ CL の上位 2 ビットに配置されます。
INT13H (0x13)
機能 03H (0x03) セクタ書き込み
通話内容: AH = 03H
AL = セクター数
CH = シリンダー
CL = セクター
DH = 頭
DL = ドライブ
00H-7FH フロッピーディスク
80H-FFH 固定ディスク
ES: BX = セグメント: バッファのオフセット
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00H
AL = 転送されたセクター数
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、1 つ以上のセクターをメモリからディスクに書き込みます。固定ディスクでは、10 ビットのシリンダ番号の上位 2 ビットがレジスタ CL の上位 2 ビットに配置されます。
INT13H (0x13)
機能 04H (0x04) >> セクタの検証
通話: AH = 04H
AL = セクター数
CH = シリンダー
CL = セクター
DH = ドライブ
00H-7FH フロッピーディスク
80H-FFH固定ドライブ
ES: BX = セグメント: バッファのオフセット
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00H
AL = 検証されたセクターの数
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、1 つ以上のセクターのアドレス フィールドを検証します。この操作によってメモリとの間でデータが転送されることはありません。固定ディスクでは、10 ビットのシリンダ番号の上位 2 ビットがレジスタ CL の上位 2 ビットに配置されます。
この関数は、読み取り可能なメディアがフロッピー ディスク ドライブ内にあるかどうかをテストするために使用できます。要求元のプログラムは、読み取り可能なフロッピー ディスクが存在しないと判断する前に、フロッピー ディスク システムをリセットし (INT 13H Function 00H)、操作を 3 回再試行する必要があります。ほとんどのフロッピー初期化操作で推奨されます。
INT13H (0x13)
機能 05H (0x05) >> トラックのフォーマット
コール: AH = 05H
AL = インターリーブ (PC/XT 固定ディスク)
CH = シリンダー
DH = 頭
DL = ドライブ
00H-7FH フロッピーディスク
80H-FFH 固定ディスク
ES: BX = セグメント: アドレスフィールドリストのオフセット
(PC/XT固定ディスクを除く)
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス(ステータス表を参照)
以前)
コメント:
指定されたトラックのディスク セクターとトラックのアドレス フィールドを初期化します。フロッピー ディスクでは、アドレス フィールド リストは、セクターごとに 1 つのエントリがある一連の 4 バイト エントリで構成されます。フォーマットは次の表に示されています。
固定ディスクでは、10 ビットのシリンダ番号の上位 2 ビットがレジスタ CL の上位 2 ビットに配置されます。
バイト |
コンテンツ |
0 |
シリンダー |
1 |
頭 |
2 |
セクタ |
3
|
セクターサイズコード
価値 |
説明 |
00H |
セクターあたり128バイト |
01H |
セクターあたり256バイト |
02H |
セクターあたり512バイト |
03H |
セクターあたり1024バイト |
|
INT13H (0x13)
機能 06H (0x06) >> 不正なトラックをフォーマットする
コール: AH = 06H
AL = インターリーブ
CH = シリンダー
DH = 頭
DL = ドライブ
80H-FFH 固定ディスク
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、PC/XT 固定ディスク ドライブに対してのみ定義されています。トラックを初期化し、ディスク アドレス フィールドとデータ セクターを書き込み、不良セクター フラグを設定します。
INT13H (0x13)
機能 07H (0x07) >> ドライブをフォーマットする
コール: AH = 07H
AL = インターリーブ
CH = シリンダー
DL = ドライブ
80H-FFH 固定ディスク
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス(ステータス表を参照)
以前)
コメント:
この関数は、PC/XT 固定ディスク ドライブに対してのみ定義されています。指定されたシリンダから開始して、ディスク アドレス フィールドとデータ セクターを書き込み、ドライブ全体をフォーマットします。
INT13H (0x13)
関数 08H (0x08) >> ドライブパラメータを取得
コール: AH = 08H
DL = ドライブ
00H-7FH フロッピーディスク
80H-FFH 固定ディスク
戻り値:関数が成功した場合
キャリーフラグ = クリア
BL = ドライブタイプ(PC/ATおよびPS/2フロッピー
ディスク)
価値 |
説明 |
01H |
360KB、40トラック、5.25” |
02H |
1.2MB、80トラック、5.25” |
03H |
720KB、80トラック、3.5インチ |
04時間 |
1.44MB、80トラック、3.5” |
CH = 最大シリンダの下位8ビット
番号
CL = ビット6-7 上位2ビット最大
シリンダー番号ビット最大0~5
セクター番号
DH = 最大ヘッド数
DL = ドライブ数
ES: DI = セグメント: ディスクドライブのオフセット
パラメータテーブル
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、指定されたドライブのさまざまなパラメータを返します。レジスタ DL に返される値は、要求されたドライブのアダプタに接続されている物理ドライブの実際の数を反映します。
INT13H (0x13)
機能 09H (0x09) >> 固定ディスクの特性を初期化する
コール: AH = 09H
DL = ドライブ
80H-FFH 固定ディスク
PC/XTのINT 41Hベクトル
ディスクパラメータブロックを指すか、PC/ATおよびPS/2では
INT 41Hのベクトルはディスクを指している必要があります
ドライブ0のパラメータブロック
INT 46Hのベクトルはディスクを指している必要があります
ドライブ1のパラメータブロック
戻り値: 関数が成功した場合
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、ROM BIOS ディスク パラメータ ブロックにある値を使用して、後続の I/O 操作のために固定ディスク コントローラを初期化します。この関数は固定ディスクでのみサポートされます。PC および PC/XT 固定ディスクのパラメータ ブロック形式は次のとおりです。
変更点 |
コンテンツ |
00H-01H |
最大シリンダー数 |
02H |
最大ヘッド数 |
03H-04H |
書き込み電流削減シリンダの開始 |
05H-06H |
書き込み前補正シリンダの開始 |
07時間 |
最大ECCバースト長 |
08時間
|
ドライブオプション
ビット |
重要性(設定されている場合) |
0 – 2 |
ドライブオプション |
3 – 5 |
予約済み (0) |
6 |
ECCエントリを無効にする |
7 |
ディスクアクセスの再試行を無効にする |
|
09時間 |
標準タイムアウト値 |
0AH |
ドライブフォーマットのタイムアウト値 |
0BH |
チェックドライブのタイムアウト値 |
0CH-0FH |
予約済み |
PC/AT および PS/2 固定ディスクのパラメータ ブロック形式は次のとおりです。
変更点 |
コンテンツ |
00H_01H |
最大シリンダー数 |
02H |
最大ヘッド数 |
03H-04H |
予約済み |
05H-06H |
書き込み前補正シリンダの開始 |
07時間 |
最大ECCバースト長 |
08時間 |
ドライブオプション
ビット |
重要性(設定されている場合) |
0 – 2 |
使用されていない |
3 |
8頭以上 |
4 |
使用されていない |
5 |
メーカーの欠陥マップは
最大シリンダー+1に存在する |
6 – 8 |
再試行が無効の場合は0以外(10、01、または11) |
|
09H-0BH |
予約済み |
0CH-0DH |
着陸ゾーンシリンダー |
0EH |
トラックあたりのセクター数 |
0FH |
予約済み |
INT13H (0x13)
関数 0A H (0x0A または 10) >> セクタ長の読み取り
コール: AH = 0AH
AL = セクター数
CH = シリンダー
CL = セクター
DH = 頭
DL = ドライブ
80H-FFH 固定ディスク
ES: BX = セグメント: バッファのオフセット
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00H
AL = 転送されたセクター数
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、ディスクから 1 つまたは複数のセクターを、各セクターの 4 バイトのエラー訂正コード (ECC) コードとともにメモリに読み取ります。通常のセクター読み取り関数 (INT 13H (0x13) 関数 02H) とは異なり、ECC エラーは自動的に修正されません。マルチ セクター転送は、読み取りエラーのあるセクターの後で終了します。
この機能は固定ディスクでのみサポートされます。10 ビットのシリンダ番号の上位 2 ビットは、レジスタ CL の上位 2 ビットに配置されます。
INT13H (0x13)
関数 0BH (0x0B または 11) >> セクタ長の書き込み
コール: AH = 0BH
AL = セクター数
CH = シリンダー
CL = セクター
DH = 頭
DL = ドライブ
80H-FFH 固定ディスク
ES: BX = セグメント: バッファのオフセット
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00H
AL = 転送されたセクター数
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、メモリからディスクにセクターを書き込みます。各セクターのデータの後には、4 バイトの ECC コードが続く必要があります。10 ビットのシリンダ番号の上位 2 ビットは、レジスタ CL の上位 2 ビットに配置されます。この関数は、固定ディスクでのみサポートされます。
INT13H (0x13)
機能 0CH (0x0C または 12) >> シーク
コール: AH = 0CH
CH = シリンダの下位8ビット
CL = ビット6-7のシリンダの上位2ビット
DH = 頭
DL = ドライブ
80H-FFH 固定ディスク
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、データを転送せずに、ディスクの読み取り/書き込みヘッドを指定されたシリンダに配置します。シリンダ番号の上位 2 ビットは、レジスタ CL の上位 2 ビットに配置されます。この機能は、固定ディスクでのみサポートされます。
INT13H (0x13)
機能 0DH (0x0D または 13) >> 固定ディスク システムをリセットします
コール: AH = 0DH
DL = ドライブ
80H-FFH 固定ディスク
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス(INT 13H 機能 01H を参照)
コメント:
この関数は、固定ディスク コントローラをリセットし、接続されたドライブを再調整し、読み取り/書き込みアームをシリンダー 0 に移動し、後続のディスク I/O の準備をします。
INT13H (0x13)
関数 0EH (0x0E または 14) >> セクタバッファの読み取り
コール: AH = 0EH
ES: BX = セグメント: バッファのオフセット
戻り値:関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、固定ディスク アダプタの内部セクター バッファの内容をシステム メモリに転送します。物理ディスク ドライブからデータは読み取られません。
INT13H (0x13)
機能 0FH (0x0F または 15) >> セクタバッファの書き込み
コール: AH = 0FH
ES: BX = セグメント: バッファのオフセット
戻り値:関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、システム メモリから固定アダプタの内部セクター バッファにデータを転送します。物理ディスク ドライブにはデータは書き込まれません。ドライブを INT 13H Function 05H でフォーマットする前に、この関数を呼び出してセクター バッファの内容を初期化する必要があります。
INT13H (0x13)
機能 10H (0x10 または 16) >> ドライブステータスを取得する
コール: AH = 10H
DL = ドライブ
80H-FFH 固定ディスク
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、指定された固定ディスク ドライブが動作可能かどうかをテストし、ドライブのステータスを返します。 この関数は固定ディスクでのみサポートされます。
INT13H (0x13)
機能 11H (0x11 または 17) >> ドライブの再調整
コール: AH =11H
DL = ドライブ
80H-FFH 固定ディスク
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、固定ディスク アダプタが指定されたドライブに対して再調整を行い、読み取り/書き込みアームをシリンダ 0 に配置して、ドライブのステータスを返します。 この関数は固定ディスクでのみサポートされます。
INT13H (0x13)
機能 12H (0x12 または 18) >> コントローラ RAM 診断
コール: AH = 12H
戻り値:関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数により、固定ディスク アダプタは内部セクター バッファに対して組み込み診断テストを実行し、返されたステータスによってテストに合格したかどうかを示します。
INT13H (0x13)
機能13H (0x13 または 19) >> コントローラドライブ診断
呼び出し: AH = 13H
戻り値:関数が成功した場合
キャリーフラグ = クリア
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数により、固定アダプタは接続されたドライブの内部診断テストを実行し、返されたステータスによってテストに合格したかどうかを示します。
INT13H (0x13)
機能14H (0x14 または 20) >> コントローラ内部診断
コール: AH = 14H
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00H
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数により、固定ディスク アダプタは組み込みの診断セルフテストを実行し、返されたステータスによってテストに合格したかどうかを示します。
INT13H (0x13)
関数 15H (0x15 または 21) >> ディスクタイプを取得する
コール: AH = 15H
DL = ドライブ
00H-7FH フロッピーディスク
80H-FFH 固定ディスク
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = ドライブタイプコード
ドライブが存在しない場合は
00H、チェンジラインをサポートしていないフロッピーディスクドライブの場合は01H、
チェンジラインをサポートしているフロッピーディスクドライブの場合は02H、
固定ディスクの場合は03H
|
また、固定ディスク(AH =03H)の場合
CX: DX = 512バイトのセクター数
関数が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、指定されたドライブ コードによって参照されるフロッピー ディスクまたは固定ディスクの種類を示すコードを返します。
INT13H (0x13)
機能 16H (0x16 または 22) >> ディスク変更ステータスを取得する
コール: AH = 16H
DL = ドライブ
00H-7FH フロッピーディスク
戻り値:変更ラインが非アクティブでディスクが変更されていない場合
キャリーフラグ = クリア
AH = 00H
変更ラインがアクティブでディスクが変更された可能性がある場合
キャリーフラグ = セット
AH = 06H
コメント:
この関数は、変更ラインのステータスを返し、最後のディスク アクセス以降にドライブ内のディスクが交換されたかどうかを示します。この関数がキャリー フラグを設定した状態で返された場合、ディスクは必ずしも変更されているわけではなく、フロッピー ディスクを取り出さずにディスク ドライブ ドアのロックを解除してロックするだけで変更ラインをアクティブ化できます。
INT13H (0x13)
機能 17H (0x17 または 23) >> ディスクタイプを設定する
コール: AH = 17H
AL = フロッピーディスクタイプコード
価値 |
説明 |
00H |
未使用 |
01H |
360 KB ドライブの 320/360 KB フロッピー ディスク |
02H |
1.2 MB ドライブの 320/360 KB フロッピー ディスク |
03H |
1.2 MB ドライブに 1.2 MB フロッピー ディスク |
04時間 |
720 KB ドライブの 720 KB フロッピー ディスク |
SL = ドライブ
00H-7FH フロッピーディスク
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00X
機能が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は、指定されたドライブのフロッピー ディスクの種類を選択します。
内部 13H (0x13)
機能 18H (0x18 または 24) >> フォーマットのメディアタイプを設定する
電話の発信元: AH = 18H
CH = シリンダー数
CL = トラックあたりのセクター数
DL = ドライブ
00H-7FH フロッピーディスク
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00X
ES : DI = セグメント : ディスクオフセット
メディアタイプのパラメータ表
機能が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この関数は指定されたドライブのメディア特性を選択するため、ドライブにはフロッピー ディスクが存在している必要があります。
内部 13H (0x13)
機能 19H (0x19 または 25) >> パークヘッド
発信元: AH = 19H
DL = ドライブ
80H-FFH固定ディスク
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00X
機能が失敗した場合
キャリーフラグ = セット
AH = ステータス
コメント:
この機能は、ドライブの電源をオフにしたときにデータが破損しないように、読み取り/書き込みレバーをデータ保存に使用されていないトラックに移動します。
内部 13H (0x13)
機能 1AH (0x1A または 26) >> ESDI ディスクのフォーマット
コール: AH = 1AH
AL = 相対ブロックアドレス (RBA)
テーブル内の欠陥の数
RBAテーブルがない場合は0
RBAテーブルが使用されている場合は0より大きい
CL = フォーマット修飾ビット
ページ数 |
重要性(設定されている場合) |
0 |
一次欠陥マップを無視する |
1 |
二次欠陥マップを無視 |
2 |
二次欠陥マップの更新 |
3 |
高度な表面分析を実行する |
4 |
定期的な割り込みを生成する |
5-7 |
予約済み(0である必要があります) |
DL = ドライブ
80H-FFH固定ディスク
ES:BX = セグメント:RBA テーブル オフセット
戻り値:関数が成功した場合
キャリーフラグ = クリア
AH = 00X
機能が失敗した場合
キャリーフラグ = セット
AH = ステータス(INT 13H 機能 01H を参照)
コメント:
この関数は、ESDI ハード ディスク アダプタに接続されたディスク上のディスク セクターとトラッキング アドレス フィールドを初期化します。
この機能の操作は低レベルフォーマットと呼ばれ、セクターレベルでの物理的な読み取り/書き込み操作のためにディスクを準備します。その後、FDISK コマンドを使用してディスクをパーティション分割し、FORMAT コマンドを使用して高レベルフォーマットして、ファイル システムをインストールする必要があります。