章 – 8
ディスクBIOS関数とCによる割り込み処理
序章
この章では、重要なDisk-BIOS関数と、Cを使用したプログラムで、簡単で短い方法で割り込みを自由に使用および処理できるその他の重要な関数について説明します。これらの機能は後ろにあります – データリカバリとディスクトラブルシューティングプログラミングの骨。これらは作る機能です C言語 “高い – レベルのアセンブリ言語”.
biosdiskおよび_bios_disk関数
これらの2つの機能は、データ回復とディスクトラブルシューティングプログラミングの目的にとって最も重要な機能です。私たち’ほとんどの場合、これらの機能を使用します。
これら2つはBIOSディスクドライブサービスであり、bios.hで定義されており、biosdiskはrawセクターのファイルのレベルより下で動作します。これらの機能を少しでも気を使わずに使用すると、ハードディスク上のファイルの内容やディレクトリが破壊される可能性があります。 biosdisk関数と_bios_disk関数はどちらも、割り込み0x13を使用して、BIOSに直接ディスク操作を発行します。 _bios_disk関数は、プログラムで次のように宣言されます。
unsigned _bios_disk(unsigned cmd, struct diskinfo_t *dinfo);
And the declaration for the bios disk function is as follows:
int biosdisk(int cmd, int drive, int head, int track,
int sector, int nsects, void *buffer);
これらのパラメーターの意味は、次の表で説明されています。
Parameter |
Function |
What It Is or what it does |
cmd |
Both |
Indicates the operation to perform such as read, write, verify etc.(See the description of cmd, given next) |
dinfo |
_bios_disk |
Points to a diskinfo_t structure that contains the remaining Parameters required by the operation.(see the description of diskinfo_t structure, given next) |
drive |
biosdisk |
Specifies which disk drive is to be used(0 for a:, 1for b: and 0x80 for first physical hard disk, 0x81 for second and so on.) |
head
track
sector |
biosdisk |
These specify the starting sector location from which the Operation is to be started. |
nsects |
biosdisk |
Number of sectors to read, write, verify etc. |
buffer |
biosdisk |
Memory address where data is to be read or written |
これらの関数の両方で、データはハードディスクのセクターの論理サイズであるセクターあたり512バイトでバッファーに読み書きされ、両方の関数によって返される値はINT0x13Hによって設定されたAXレジスタの値です。 BIOS呼び出し。
関数が成功した場合、上位バイト= 0は正常に完了したことを意味し、下位バイトには読み取り、書き込み、または検証されたセクターの数などが含まれます。
ただし、エラーが発生して機能が成功しない場合、上位バイトの値は、次の表で説明されている次のエラーコードのいずれかになります。
Value |
Description |
0x00 |
Successful completion (Not an Error!!) |
0x01 |
Bad command |
0x02 |
Address mark not found |
0x03 |
Attempt to write to write-protected disk |
0x04 |
Sector not found |
0x05 |
Reset failed (hard disk) |
0x06 |
Disk changed since last operation |
0x07 |
Drive parameter activity failed |
0x08 |
Direct memory access (DMA) overrun |
0x09 |
Attempt to perform DMA across 64K boundary
(data Boundary error or >80H sectors) |
0x0A |
Bad sector detected |
0x0B |
Bad track detected |
0x0C |
Unsupported track |
0x0D |
Invalid number of sectors on format (PS/2 hard disk) |
0x0E |
Control data address mark detected (hard disk) |
0x0F |
DMA arbitration level out of range (hard disk) |
0x10 |
Bad CRC/ECC on disk read |
0x11 |
CRC/ECC corrected data error (Not an error actually) |
0x20 |
Controller has failed |
0x31 |
No media in drive (IBM/MS INT 13 extensions) |
0x32 |
Incorrect drive type stored in CMOS (Compaq) |
0x40 |
Seek operation failed |
0x80 |
Attachment failed to respond |
0xAA |
Drive not ready (hard disk only) |
0xB0 |
Volume not locked in drive (INT 13 extensions) |
0xB1 |
Volume locked in drive (INT 13 extensions) |
0xB2 |
Volume not removable (INT 13 extensions) |
0xB3 |
Volume in use (INT 13 extensions) |
0xB4 |
Lock count exceeded (INT 13 extensions) |
0xB5 |
Valid eject request failed (INT 13 extensions) |
0xBB |
Undefined error occurred (hard disk only) |
0xCC |
Write fault occurred |
0xE0 |
Status register error |
0xFF |
Sense operation failed |
次に示す表は、cmdパラメータによって実行される操作コマンドを表しています。まず、両方の機能の共通の操作を見てみましょう。
biosdisk |
_bios_disk |
What it does |
0 |
_DISK_RESET |
Resets disk system, forcing the drive controller to do a hard reset. Ignore all other parameters |
1 |
_DISK_STATUS |
Returns the status of the last disk operation. Ignores all other parameters |
2 |
_DISK_READ |
Reads one or more disk sectors into memory |
3 |
_DISK_WRITE |
Writes one or more disk sectors from memory |
4 |
_DISK_VERIFY |
Verifies one or more sectors |
5 |
_DISK_FORMAT |
Formats a track |
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などのwordsオプションを使用する習慣があります。
biosdiskまたは_bios_disk関数の宣言で、cmd = _DISK_RESET関数を指定すると、他のすべてのパラメーターを無視してディスクシステムをリセットし、_DISK_STATUSは他のすべてのパラメーターを無視して最後のディスク操作のステータスを返します。
cmd = _DISK_READ、_DISK_WRITE、または_DISK_VERIFY(2、3、または4)の場合、biosdiskおよび_bios_disk関数も以下に示す他のパラメーターを使用します。
Parameter |
What It Does |
head
track
sector |
These three specify the location of starting sector for the specified operation. (minimum possible values may be head = 0, track = 0 and sector =1) |
nsectors |
This specifies the number of sectors to read or write |
buffer |
It points to the buffer where data is to be read and written |
cmdの値が= 5(_DISK_FORMAT)の場合、biosdiskと_bios_diskは、表の説明に従って次のパラメーターを使用します。 _DISK_FORMATを使用している間は注意を払い、何を使用するかを知っておくことが常に推奨されます。知識の欠如や小さな間違いでさえ、データの大きな損失に直面する可能性があります。
Parameter |
What It Does |
head
track |
These specify the location of the track to format |
buffer |
It points to a table of sector headers to be written on the named track |
biosdisk関数によってのみ使用されるcmdのいくつかの追加の値があります。 cmdのこれらの値は、XT、AT、PS / 2、および互換性のあるものにのみ許可されます。値は次の表に記載されています。
cmd |
What it does |
6 |
Formats a track and sets bad sector flags |
7 |
Formats the drive beginning at a specific track |
8 |
Returns the current drive parameters in first 4 bytes of buffer |
9 |
Initializes drive-pair characteristics |
10 |
Does a long read (512 plus 4 extra bytes per sector) |
11 |
Does a long write (512 plus 4 extra bytes per sector) |
12 |
Does a disk seek |
13 |
Alternates disk reset |
14 |
Reads sector buffer |
15 |
Writes sector buffer |
16 |
Tests whether the named drive is ready |
17 |
Recalibrates the drive |
18 |
Controller RAM diagnostic |
19 |
Drive diagnostic |
20 |
Controller internal diagnostic |
diskinfo_t構造
diskinfo_t構造体は、_bios_disk関数によって使用されます。構造の説明は次のとおりです。
struct diskinfo_t {
unsigned drive, head, track, sector, nsectors;
void far *buffer;
};
ここで、driveは、使用されるディスクドライブを指定します。ハードディスクの場合、ディスクパーティションではなく、物理ドライブが指定されていることを常に覚えておいてください。パーティションを操作する場合、アプリケーションプログラムは、そのディスク自体のパーティションテーブル情報も解釈する必要があります。
ヘッド、トラック、およびセクターの値は、操作の開始セクターの位置を指定します。 nsectorsは、読み取りまたは書き込みが行われるセクターの数を指定し、バッファーは、データが読み取りおよび書き込みされるバッファーを指します。 cmdの値に応じて、diskinfo_t構造体の他のパラメーターが必要な場合と不要な場合があります。
biosdiskおよび_bios_disk関数で使用されるディスクドライブの仕様の値は、次の表に示されています。
drive Value |
Disk drive to use |
0 |
First floppy-disk drive |
1 |
Second floppy-disk drive |
2 |
Third floppy-disk drive |
.... |
(and so on) |
0x80 |
First hard-disk drive |
0x81 |
Second hard-disk drive |
0x82 |
Third hard-disk drive |
.... |
(and so on) |
十分な理論!ここで、いくつかの実用的なものとこれらの関数の例を見てみましょう。次の例では、フロッピーの4つのトラックの両側のセクターを読み取り、ユーザーが指定した内容をファイルに保存します。プログラムがディスクの表面を直接読み取っているため、ディスクからファイルを削除したかどうかは関係ありません。
削除されたデータを表示するには、完全にフォーマットされたフロッピーディスクを使用して、.cプログラムのコーディングやその他のテキストファイルなどのテキストファイルをコピーすることをお勧めします(ファイルの内容を理解できるようにするため)。約73KBを占有します(データは4つのトラック、2つのサイド、および各トラックに18のセクターに格納されます。各セクターは512バイトです)。プログラムは、例を示すために開発されました。ただし、データを復元できるように変更および開発することができます。
/ *フロッピーの4トラック(0、1、2、3)を読み取り、その内容を指定されたファイルに書き込むプログラム* /
#include <bios.h>
#include <stdio.h>
#include<conio.h>
void main(void)
{
int head,track;
int result,i,sector;
char filename[80];
char *buffer;
struct diskinfo_t dinfo;
static char dbuf[512];
FILE *tt;
clrscr();
///ドライブの準備ができているかどうかを確認します\\\
if(!(biosdisk(4,0,0,0,0,1,buffer) & 0x02))
{
printf(" Drive A: Not Ready:\n Insert disk into Drive A:
and press any key\n");
getch();
}
/ *のセクターのデータを保存するためのファイル名を取得します ディスク* /
printf("\nEnter the Destination File name with full Path
to store the data \n\n >");
gets(filename);
if((tt= fopen(filename, "wb"))==NULL)
{
printf("Could not open the File!!!");
getch();
}
for(track=0;track<4;track++)
{
for(head=0; head<=1;head++)
{
for(sector=1;sector<=18;sector++)
{
dinfo.drive = 0; /* drive number for A: */
dinfo.head = head; /* disk head number */
dinfo.track = track; /* track number */
dinfo.sector = sector; /* sector number */
dinfo.nsectors = 1; /* sector count */
dinfo.buffer = dbuf; /* data buffer */
///ステータスを表示\\\
gotoxy(10,10); printf("Reading Data from: Head=%d
Track=%d Sector=%d",
head, track, sector);
fprintf(tt,"\n Data read from: Head=%d Track=%d Sector=%d\n",
head, track, sector);
///指定されたセクターを読む\\\
result = _bios_disk(_DISK_READ, &dinfo);
///指定されたファイルに内容を保存します\\\
if ((result & 0xff00) == 0)
{
for(i=0;i<512;i++)
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/ *セクターの読み取り中のエラーのエラーメッセージを画面とファイルに出力します* /
else
{
printf("\n Can not read at Head= %d Track= %d
Sector= %d\n",head,track,sector);
fprintf(tt,"\n Can not read at Head= %d Track= %d
Sector =%d\n",head,track,sector);
}
}
}
}
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 drive, int nsects, long lsect,
void *buffer);
そして、abswrite関数は次のように宣言されます。
int abswrite(int drive, int nsects, long lsect,
void *buffer);
パラメータの意味は次のとおりです。
Param. |
What It Is/Does |
drive |
Drive number to read (or write): 0 = A, 1 = B, etc. |
nsects |
Number of sectors to read (or write) |
lsect |
Beginning logical sector number |
buffer |
Memory address where the data is to be read (or written) |
成功すると、両方の関数が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に渡されて入力されるセグメントレジスタの構造です。構造体の宣言は次のとおりです。
struct SREGS {
unsigned int es;
unsigned int cs;
unsigned int ss;
unsigned int ds;
};
REGSユニオン
REGSは、2つの構造の和集合です。ユニオンREGSはdos.hで定義されており、関数int86、int86x、intdos、およびintdosxとの間で情報をやり取りするために使用されます。組合の宣言は次のとおりです。
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
BYTEREGSおよびWORDREGS構造
BYTEREGESおよびWORDREGS構造体はdos.hで定義されており、これらはバイトおよびワードレジスタを格納するために使用されます。 WORGREGS構造体を使用すると、ユーザーはCPUのレジスターに16ビット量としてアクセスできます。BYTEREGES構造体を使用すると、個々の8ビットレジスターにアクセスできます。
BITEREGS構造は次のように宣言されています。
struct BYTEREGS {
unsigned char al, ah, bl, bh;
unsigned char cl, ch, dl, dh;
};
また、WORDREGS構造は次のように宣言されています。
struct WORDREGS {
unsigned int ax, bx, cx, dx;
unsigned int si, di, cflag, flags;
};
int86およびint86x関数
これらの関数は、dos.hで定義されている一般的な8086ソフトウェア割り込みインターフェイスです。レジスタは目的の値に設定され、これらの関数が呼び出されてMS-DOS割り込みが呼び出されます。 int86関数の宣言は次のとおりです。
int int86(int intno, union REGS *inregs,
union REGS *outregs);
int86xは、int86関数のバリエーションです。次のように宣言されています。
int int86x(int intno, union REGS *inregs,
union REGS *outregs, struct SREGS *segregs);
関数int86とint86xはどちらも、引数intnoで指定された8086ソフトウェア割り込みを実行します。または、生成する割り込みはintnoで指定されていると言えます。
int86x関数を使用すると、CSとSSではなくESとDSにのみアクセスできるため、デフォルトのデータセグメントとは異なるDSの値を取得したり、ESで引数を取得したりする8086ソフトウェア割り込みを呼び出すことができます。
これらの関数は、ソフトウェア割り込みを実行する前に、レジスタ値をinregからレジスタにコピーします。関数int86xは、分離もコピーします->dsとsegregs->ソフトウェア割り込みを実行する前に、値を対応するレジスタに挿入します。この機能により、ファーポインタまたは大容量データメモリモデルを使用するプログラムで、ソフトウェア割り込みに使用するセグメントを指定できます。
これらの関数は、ソフトウェア割り込みが戻った後、現在のレジスタ値をoutregにコピーし、キャリーフラグのステータスをoutregのx.cflagフィールドにコピーし、8086フラグレジスタの値をoutregのx.flagsフィールドにコピーします。関数int86xは、DSを復元し、分離を設定します->esとsegregs->dsフィールドを対応するセグメントレジスタの値に変換します。
どちらの関数でも、inregとoutregは同じ構造体を指すことができ、両方の関数はソフトウェア割り込みの完了後にAXの値を返します。キャリーフラグが設定されている場合は、通常、エラーが発生したことを示します。
アセンブリ言語に相当するCで使用されるREGS共用体要素は、次の表にあります。
16-bit |
8-bit |
C language |
Assembly language |
C language |
Assembly language |
inregs.x.ax |
AX |
inregs.h.al |
AL |
|
|
inregs.h.ah |
AH |
inregs.x.bx |
BX |
inregs.h.bl |
BL |
|
|
inregs.h.bh |
BH |
inregs.x.cx |
CX |
inregs.h.cl |
CL |
|
|
inregs.h.ch |
CH |
inregs.x.dx |
DX |
inregs.h.dl |
DL |
|
|
inregs.h.dh |
DH |
inregs.x.si |
SI |
|
|
inregs.x.di |
DI |
|
|
inregs.x.cflag |
CF |
|
|
int86関数とint86x関数の例を見てみましょう。次のプログラムは、フロッピーディスクのすべてのセクターをスキャンし、すべてのセクターのステータスを画面に出力します。
/ *フロッピーディスクのすべてのセクターをスキャンしてステータスを印刷するプログラム* /
#include<dos.h>
#include<conio.h>
void main()
{
int head,track,sector,i;
char *buf;
union REGS inregs, outregs;
struct SREGS sregs;
clrscr();
///ディスクシステムをリセットしてディスクを初期化する\\\
gotoxy(10,2); printf("Initializing The Disk...");
for(i=0;i<3;i++)
{
inregs.h.ah=0x00; // Function Number
inregs.h.dl=0x00; // Floppy Disk
int86(0x13,&inregs,&outregs);
}
gotoxy(10,2); printf("The Status of the Disk is as....\n");
/ *フロッピーディスクを0から79トラック(合計トラック80)までスキャンします* /
for(track=0;track<=79;track++)
for(head=0;head<=1;head++)
for(sector=1;sector<=18;sector++)
{
inregs.h.ah = 0x04; /// function Number
inregs.h.al = 1; /// Number of sectors
inregs.h.dl = 0x00; /// Floppy Disk
inregs.h.ch = track;
inregs.h.dh = head;
inregs.h.cl = sector;
inregs.x.bx = FP_OFF(buf);
sregs.es = FP_SEG(buf);
int86x(0x13,&inregs,&outregs,&sregs);
////スキャンされたセクターのステータスを印刷します\\\\
switch(outregs.h.ah)
{
case 0x00:
cprintf("STATUS: No Error!!");
break;
case 0x01:
cprintf("STATUS: Bad command");
break;
case 0x02:
cprintf("STATUS: Address mark not found");
break;
case 0x03:
cprintf("STATUS: Attempt to write to
write-protected disk");
break;
case 0x04:
cprintf("STATUS: Sector not found");
break;
case 0x05:
cprintf("STATUS: Reset failed (hard disk)");
break;
case 0x06:
cprintf("STATUS: Disk changed since last
operation");
break;
case 0x07:
cprintf("STATUS: Drive parameter activity
failed");
break;
case 0x08:
cprintf("STATUS: Direct memory access (DMA)
overrun");
break;
case 0x09:
cprintf("STATUS: Attempt to perform DMA across
64K boundary");
break;
case 0x0A:
cprintf("STATUS: Bad sector detected");
break;
case 0x0B:
cprintf("STATUS: Bad track detected");
break;
case 0x0C:
cprintf("STATUS: Media type not found");
break;
case 0x0D:
cprintf("STATUS: Invalid number of sectors on
format (hard disk)");
break;
case 0x0E:
cprintf("STATUS: Control data address mark
detected (hard disk)");
break;
case 0x0F:
cprintf("STATUS: DMA arbitration level out of
range (hard disk)");
break;
case 0x10:
cprintf("STATUS: Bad CRC/ECC on disk read");
break;
case 0x11:
cprintf("STATUS: CRC/ECC corrected data error");
break;
case 0x20:
cprintf("STATUS: Controller has failed");
break;
case 0x31:
cprintf("STATUS: No media in drive (IBM/MS INT 13H
extensions)");
break;
case 0x32:
cprintf("STATUS: Incorrect drive type stored in
CMOS (Compaq)");
break;
case 0x40:
cprintf("STATUS: Seek operation failed");
break;
case 0x80:
cprintf("STATUS: Attachment failed to respond
(Disk Timed-out)");
break;
case 0xAA:
cprintf("STATUS: Drive not ready (hard disk
only)");
break;
case 0xB0:
cprintf("STATUS: Volume not locked in drive (INT
13H extensions)");
break;
case 0xB1:
cprintf("STATUS: Volume locked in drive (INT 13H extensions)");
break;
case 0xB2:
cprintf("STATUS: Volume not removable (INT 13H
extensions)");
break;
case 0xB3:
cprintf("STATUS: Volume in use (INT 13H
extensions)");
break;
case 0xB4:
cprintf("STATUS: Lock count exceeded (INT 13H
extensions)");
break;
case 0xB5:
cprintf("STATUS: Valid eject request failed (INT
13H extensions)");
break;
case 0xBB:
cprintf("STATUS: Undefined error occurred (hard
disk only)");
break;
case 0xCC:
cprintf("STATUS: Write fault occurred");
break;
case 0xE0:
cprintf("STATUS: Status register error");
break;
case 0xFF:
cprintf("STATUS: Sense operation failed");
break;
default: cprintf("STATUS: UNKNOWN Status CODE");
}
printf("\nCurrent position= Track:%d Head:%d Sector:%d \n",
track,head,sector);
}
gotoxy(10,24);printf("Scanning Completed!! Press Any Key TO
Exit..");
getch();
}
このプログラムは、関数int86およびint86x関数の使用例を示しています。このプログラムでは、int86関数は、INT 13Hの関数00Hを使用して、ディスクシステムをリセットすることによってディスクを初期化しています。 int86x関数は、フロッピーのすべてのセクター(1.44Mb、 3½ INT 13Hの機能04Hを使用して、両側から最大0〜79トラック(合計80トラック)のフロッピーディスク)。
segread関数
この関数はdos.hで定義されています。この関数は、セグメントレジスタを読み取ります。関数の宣言は次のとおりです。
void segread(struct SREGS * segp);
ここで、segreadは、セグメントレジスタの現在の値を構造体* segpに配置します。関数からは何も返されません。この呼び出しは、intdosxおよびint86xでの使用を目的としています。例を見てみましょう
#include <stdio.h>
#include <dos.h>
void main()
{
struct SREGS segs;
segread(&segs);
printf("Current segment register settings\n\n");
printf("CS: %X DS: %X\n", segs.cs, segs.ds);
printf("ES: %X SS: %X\n", segs.es, segs.ss);
getch();
}
そして、プログラムの出力は次のようになります。
Current segment register settings
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,
struct SREGS *segregs);
機能 intdos と intdosx DOS割り込み0x21を実行して、指定されたDOS関数を呼び出します。 inregs-&gt; h.ahの値は、呼び出されるDOS関数を指定します。 The 関数intdosx また、分離をコピーします ->dsとsegregs ->DOS関数を呼び出す前に、対応するレジスタに値を入れてから、DSを復元します。
関数のこの機能により、ファーポインタまたは大容量データメモリモデルを使用するプログラムで、関数の実行に使用するセグメントを指定できます。 intdosx関数を使用すると、デフォルトのデータセグメントとは異なるDSの値を取得したり、ESで引数を取得したりするDOS関数を呼び出すことができます。
どちらの関数も、DOS関数呼び出しの完了後、キャリーフラグが設定されている場合(outregs)にAXの値を返します。 -> x.cflag!= 0)、エラーが発生したことを示します。
割り込み0x21が関数を返した後、現在のレジスタ値をoutregsにコピーし、キャリーフラグのステータスをoutregsのx.cflagフィールドに、8086フラグレジスタの値をoutregsのx.flagsフィールドにコピーします。 inregとoutregの両方が同じ構造を指すことができます。これらの関数の例を見てみましょう。
の使用例 intdos関数 以下に示します。このプログラムは、フロッピー(1.44Mb、3)に関する選択された情報を取得します。½ インチフロッピーディスク)ディスクドライブ。このプログラムは、フロッピーディスクの割り当て情報を提供します。
/ *ディスク使用量のドライブ割り当て情報を取得します* /
#include <dos.h> /* for intdos() and union REGS */
#include <stdio.h> /* for printf() */
union REGS inregs, outregs;
void main()
{
inregs.h.ah = 0x36; /* get disk free space
function number */
inregs.h.dl = 0x01; /* drive A: */
intdos(&inregs, &outregs);
printf("%d sectors/cluster,\n%d clusters,\n%d bytes/sector,
\n%d total clusters",
outregs.x.ax,outregs.x.bx,
outregs.x.cx, outregs.x.dx);
getch();
}
プログラムの出力は次のようになります。
1 sectors/cluster,
1933 clusters,
512 bytes/sector,
2843 total clusters
ここで、の例を見てみましょう。 関数intdosx. 次の例は、 intdosx関数. プログラムは文字列を標準出力に出力します。
/ *「文字列」を標準に出力するプログラム 出力。 * /
#include <dos.h>
union REGS inregs, outregs;
struct SREGS segregs;
char far *string = "this string is not in the
default data segment$";
void main()
{
inregs.h.ah = 0x09; /* function number */
inregs.x.dx = FP_OFF(string);/*DS:DX is far
address of 'string */
segregs.ds = FP_SEG(string);
intdosx(&inregs, &outregs, &segregs);
getch();
}
そして、プログラムの出力は次のようになります。
この文字列はデフォルトのデータセグメントにありません |
ここでは、関数を使用して指定された文字列を出力しています intdosx, INT21Hの機能09Hによる。指定された文字列は常に文字で終わる必要があることに常に注意する必要があります “$”.
物理ハードドライブ番号を知る方法
物理ハードドライブ番号は非常に重要なものであり、正確に記述する必要があります。不正なドライブ指定は、重大なデータ損失を引き起こす可能性があります。データリカバリまたはディスクのトラブルシューティングプログラミング中は、ドライブ番号に自信を持っている必要があります。ディスクの配置が異なるディスクのドライブ番号を知る方法は、次に示す例で見積もることができます。
最も一般化された神話によると、 物理ドライブ番号ディスクの接続状態に応じて提供されますが、場合によってはオペレーティングシステムによって異なります。’s 起動手順または起動設定。
のための最も一般化されたアイデア 物理ドライブ番号 BIOSによって提供されるものはここに記載されていますが、それでも、ディスクの構成については、ディスク編集ツールまたは次の章に記載されているプログラムを使用して確認する必要があります。違法に使用された場合や知識が不足している場合は、データを破損または害する可能性のあるプログラムの実行について決定を下す必要があります。
一般に、2つのディスクがシステムに接続されている場合、1つはプライマリマスターで、もう1つはセカンダリマスターであり、最初の優先順位はプライマリマスター(次にプライマリスレーブ(使用可能な場合))、次にセカンダリマスター(次に可能な場合はセカンダリスレーブなど)、物理番号は好みに応じて指定されます。
システムが一度に最大4台のハードディスクをサポートすると仮定します。次のように、4台のハードディスクすべてを接続できます。
Primary Master |
Primary Slave |
Secondary Master |
Secondary Slave |
ここで、物理ドライブのドライブ数のいくつかのケースを考えてみましょう。ここでは、ディスクの製造元が言及している適切なジャンパー設定で、適切なマスターでディスクを接続していることを前提としています。–スレーブ設定:
- 4台すべてのハードディスクがシステムに接続されている場合:4台すべてのディスクがシステムに接続されている場合、物理ドライブ番号は次のようになります。
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Master |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 83H. In this case the Hard Disk is called the Fourth Hard Disk. |
- 3台のハードディスクがシステムに接続されている場合:3台のハードディスクがシステムに接続されている場合、物理ドライブ番号は接続設定に応じたものになります。次の例は、いくつかの配置を表しています。
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Master |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Secondary Slave |
Disk Not Present |
------------------- |
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk Not Present |
------------------- |
Primary Slave |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Secondary Master |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk Not Present |
------------------- |
Secondary Master |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Master |
Disk Not Present |
------------------- |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
- 2台のハードディスクがシステムに接続されている場合:同様に、2台のハードディスクがシステムに接続されている場合、物理ドライブ番号は接続設定に応じたものになります。次の例はそれを示しています。
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk Not Present |
------------------- |
Secondary Master |
Disk Not Present |
------------------- |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
- シングルハードディスクがシステムに接続されている場合:使用可能なディスクが1つしかない場合、物理ドライブ番号は80Hになることを考える必要はありません。
割り込み13H(INT 13H)、ROMBIOSディスクドライバ機能
INT13H関数の説明はここにあります。これらの機能の誤用や注意不足や知識不足での使用は、データの大幅な損失やその他の多くの問題を引き起こす可能性があるため、これらの機能は注意して学習する必要があります。ただし、これらの関数を適切かつ適切な方法で使用すると、プログラムのコーディングを最小限に抑え、プログラミングをシンプルかつ簡単にするのに役立ちます。
INT 13H (0x13)
機能00H(0x00) ディスクシステムをリセットする
Call with AH = 00H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: If function is successful
Carry flag = clear
AH = 00H
If function is unsuccessful
Carry flag = set
AH = status
コメントコメント:
ディスクコントローラをリセットし、接続されているドライブを再調整します。読み取り/書き込みアームがシリンダー0に移動され、ディスクI / Oの準備をします。
この関数は、フロッピーディスクの読み取り、書き込み、検証、またはフォーマット要求が失敗した後、操作を再試行する前に呼び出す必要があります。関数が固定ディスクドライブで呼び出された場合(つまり、 DL>=80H), フロッピーディスクコントローラ、次に固定ディスクコントローラがリセットされます。
INT 13H (0x13)
機能01H(0x01) ディスクシステムのステータスを取得する
Call with: AH = 01H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: AH = 00H
AL = status of previous disk operation
(See the table given before for error
and status codes description).
コメントコメント:
最新のディスク操作のステータスを返します
INT 13H (0x13)
機能02H(0x02) 読み取りセクター
Call with: AH = 02H
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES:BX =セグメント:バッファのオフセット
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数は、1つまたは複数のセクターをディスクからメモリに読み取ります。固定ディスクでは、10ビットのシリンダー番号の上位2ビットがレジスターCLの上位2ビットに配置されます。
INT 13H (0x13)
機能03H(0x03) 書き込みセクター
Call with: AH = 03H
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sector transferred
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数は、1つまたは複数のセクターをメモリからディスクに書き込みます。固定ディスクでは、10ビットのシリンダー番号の上位2ビットがレジスターCLの上位2ビットに配置されます。
INT 13H (0x13)
機能04H(0x04) >> セクターを確認する
Call with: AH = 04H
AL = number of sectors
CH = cylinder
CL = sector
DH = drive
00H-7FH floppy disk
80H-FFH fixed drive
ES: BX = segment: offset of buffer
Returns: If function is successful
Carry flag = clear
AH = 00H
AL = number of sectors verified
If function is unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数は、1つ以上のセクターのアドレスフィールドを検証します。この操作によってメモリとの間でデータが転送されることはありません。固定ディスクでは、10ビットのシリンダー番号の上位2ビットがレジスターCLの上位2ビットに置き換えられます。
この機能を使用して、読み取り可能なメディアがフロッピーディスクドライブにあるかどうかをテストできます。要求元のプログラムは、フロッピーディスクシステムをリセットし(INT 13H機能00H)、読み取り可能なフロッピーディスクが存在しないと想定する前に、操作を3回再試行する必要があります。ほとんどのフロッピー初期化操作で推奨されます。
INT 13H (0x13)
機能05H(0x05) >> トラックをフォーマットする
Call with: AH = 05H
AL = interleave (PC/XT fixed disks)
CH = cylinder
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES: BX = segment: offset of address field list
(Except PC/XT fixed disk)
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see the status table given
earlier)
コメントコメント:
ディスクセクターを初期化し、指定されたトラックのアドレスフィールドを追跡します。フロッピーディスクでは、アドレスフィールドリストは一連の4バイトエントリで構成され、セクターごとに1つのエントリがあります。フォーマットは次の表に示されています。
固定ディスクでは、10ビットのシリンダー番号の上位2ビットがレジスターCLの上位2ビットに配置されます。
Byte |
Contents |
0 |
Cylinder |
1 |
Head |
2 |
Sector |
3
|
Sector-size code
Value |
Description |
00H |
128 Byte per sector |
01H |
256 Byte per sector |
02H |
512 Byte per sector |
03H |
1024 Byte per sector |
|
INT 13H (0x13)
機能06H(0x06)>>フォーマット不良トラック
Call with: AH = 06H
AL = interleave
CH = cylinder
DH = head
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
コメント:
この機能は、PC / XT固定ディスクドライブに対してのみ定義されています。トラックを初期化し、ディスクアドレスフィールドとデータセクターを書き込み、不良セクターフラグを設定します。
INT 13H (0x13)
機能07H(0x07)>>フォーマットドライブ
Call with: AH = 07H
AL = interleave
CH = cylinder
DL = drive
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see the status table given
earlier)
コメント:
この機能は、PC / XT固定ディスクドライブに対してのみ定義されています。ドライブ全体をフォーマットし、指定されたシリンダーから開始して、ディスクアドレスフィールドとデータセクターを書き込みます。
INT 13H (0x13)
機能08H(0x08)>>ドライブパラメータを取得
Call with: AH = 08H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
BL = drive type (PC/AT and PS/2 floppy
disk)
Value |
Description |
01H |
360KB, 40 track, 5.25” |
02H |
1.2MB, 80 track, 5.25” |
03H |
720KB, 80 track, 3.5” |
04H |
1.44MB, 80 track, 3.5” |
CH = low 8 bits of maximum cylinder
number
CL = bits 6-7 high order 2 bits of maximum
cylinder number bits 0-5 maximum
sector number
DH = maximum head number
DL = number of drives
ES: DI = segment: offset of disk drive
parameter table
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数は、指定されたドライブのさまざまなパラメータを返します。レジスターDLに返される値は、要求されたドライブのアダプターに接続されている物理ドライブの実際の数を反映しています。
INT 13H (0x13)
機能09H(0x09)>>固定ディスク特性の初期化
Call with: AH = 09H
DL = drive
80H-FFH fixed disk
On the PC/XT Vector for INT 41H
must point to disk parameter block or, on the PC/AT and PS/2
Vector for INT 41H must point to disk
parameter block for drive 0
Vector for INT 46H must point to disk
parameter block for drive 1
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数は、ROM BIOSディスクパラメータブロックにある値を使用して、後続のI / O操作のために固定ディスクコントローラを初期化します。この機能は、固定ディスクでのみサポートされています。 PCおよびPC / XT固定ディスクのパラメーターブロック形式は次のとおりです。
Byte(s) |
Contents |
00H-01H |
Maximum number of cylinders |
02H |
Maximum number of heads |
03H-04H |
Starting reduced write current cylinder |
05H-06H |
Starting write pre compensation cylinder |
07H |
Maximum ECC burst length |
08H
|
Drive option
Bit(s) |
Significance (if set) |
0 – 2 |
drive option |
3 – 5 |
reserved (0) |
6 |
disable ECC entries |
7 |
disable disk-access retries |
|
09H |
Standard time-out value |
0AH |
Time-out value for format drive |
0BH |
Time-out value for check drive |
0CH-0FH |
Reserved |
PC / ATおよびPS / 2固定ディスクのパラメータブロック形式は次のとおりです。
Byte(s) |
Contents |
00H_01H |
maximum number of cylinders |
02H |
maximum number of heads |
03H-04H |
Reserved |
05H-06H |
starting write pre compensation cylinder |
07H |
maximum ECC burst length |
08H |
Drive options
Bit(s) |
Significance (if set) |
0 – 2 |
not used |
3 |
more than 8 heads |
4 |
not used |
5 |
manufacturer’s defect map present at
maximum cylinder +1 |
6 – 8 |
nonzero (10, 01,or 11) if retries disabled |
|
09H-0BH |
Reserved |
0CH-0DH |
landing zone cylinder |
0EH |
sector per track |
0FH |
Reserved |
INT 13H (0x13)
関数0AH(0x0Aまたは10)>>読み取りセクター長
Call with: AH = 0AH
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数は、各セクターの4バイトのエラー訂正コード(ECC)コードとともに、1つまたは複数のセクターをディスクからメモリに読み取ります。通常の読み取りセクター機能(INT 13H(0x13)機能02H)とは異なり、ECCエラーは自動的に修正されません。マルチセクター転送は、読み取りエラーのあるセクターの後で終了します。
この機能は固定ディスクでのみサポートされます。 10ビットのシリンダ番号の上位2ビットは、レジスタCLの上位2ビットに配置されます。
INT 13H (0x13)
関数0BH(0x0Bまたは11)>>セクター長を書き込む
Call with:AH = 0BH
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数は、セクターをメモリからディスクに書き込みます。各セクター’s 価値のあるデータの後には、4バイトのECCコードが続く必要があります。 10ビットのシリンダ番号の上位2ビットは、レジスタCLの上位2ビットに配置されます。この機能は、固定ディスクでのみサポートされています。
INT 13H (0x13)
関数0CH(0x0Cまたは12)>>シーク
Call with:AH = 0CH
CH = lower 8 bits of cylinder
CL = upper 2 bits of cylinder in bits 6-7
DH = head
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数は、データを転送せずに、ディスクの読み取り/書き込みヘッドを指定されたシリンダーに配置します。シリンダ番号の上位2ビットはレジスタCLの上位2ビットに配置されます。この機能は、固定ディスクでのみサポートされています。
INT 13H (0x13)
機能0DH(0x0Dまたは13)>>固定ディスクシステムのリセット
Call with:AH = 0DH
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see INT 13H Function 01H)
コメントコメント:
この機能は、固定ディスクコントローラーをリセットし、接続されているドライブを再調整し、読み取り/書き込みアームをシリンダー0に移動し、後続のディスクI / Oの準備をします。
INT 13H (0x13)
機能0EH(0x0Eまたは14)>>セクターバッファの読み取り
Call with:AH = 0EH
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数は、固定ディスクアダプタの内部セクターバッファの内容をシステムメモリに転送します。物理ディスクドライブからデータが読み取られることはありません。
INT 13H (0x13)
機能0FH(0x0Fまたは15)>>書き込みセクターバッファ
Call with:AH = 0FH
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数は、システムメモリから固定アダプタの内部セクターバッファにデータを転送します。物理ディスクドライブにデータは書き込まれません。この関数は、INT 13H関数05Hでドライブをフォーマットする前に、セクターバッファの内容を初期化するために呼び出す必要があります。
INT 13H (0x13)
機能10H(0x10または16)>>ドライブステータスを取得
Call with:AH = 10H
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数は、指定された固定ディスクドライブが動作可能かどうかをテストし、ドライブを返します。’s スターテス。この機能は、固定ディスクでのみサポートされています。
INT 13H (0x13)
機能11H(0x11または17)>>ドライブを再調整します
Call with:AH =11H
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この機能により、固定ディスク・アダプターは指定されたドライブ用にそれ自体を再調整し、読み取り/書き込みアームをシリンダー0に配置して、ドライブを戻します。’s スターテス。この機能は、固定ディスクでのみサポートされています。
INT 13H (0x13)
機能12H(0x12または18)>>コントローラーRAM診断
Call with:AH = 12H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数により、固定ディスクアダプターは、内部セクターバッファーに対して組み込みの診断テストを実行し、返されたステータスによってテストに合格したかどうかを示します。
INT 13H(0x13)
機能13H(0x13または19)>>コントローラードライブ診断
Call with:AH = 13H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数により、固定アダプターは接続されたドライブの内部診断テストを実行し、テストが返されたステータスで合格したかどうかを示します。
INT 13H (0x13)
機能14H(0x14または20)>>コントローラー内部診断
で呼び出す:AH = 14H
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数により、固定ディスクアダプタは組み込みの診断セルフテストを実行し、返されたステータスによってテストに合格したかどうかを示します。
INT 13H (0x13)
機能15H(0x15または21)>>ディスクタイプを取得
Call with:AH = 15H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = drive type code
ドライブが存在しない場合は00H
変更ラインをサポートしていないフロッピーディスクドライブの場合は01H
チェンジラインをサポートするフロッピーディスクドライブの場合は02H
固定ディスクの場合は03H
|
And, if fixed disk (AH =03H)
CX: DX = number of 512-byte sectors
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数は、指定されたドライブコードによって参照されるフロッピーまたは固定ディスクのタイプを示すコードを返します。
INT 13H (0x13)
機能16H(0x16または22)>>ディスク変更ステータスを取得
Call with: AH = 16H
DL = drive
00H-7FH floppy disk
Returns:If change line inactive and disk has not been changed
Carry flag = clear
AH = 00H
If change line active and disk may have been changed
Carry flag = set
AH = 06H
コメントコメント:
この関数は、変更ラインのステータスを返し、ドライブ内のディスクが最後のディスクアクセス以降に交換された可能性があるかどうかを示します。キャリーフラグが設定された状態でこの機能が戻った場合、ディスクは必ずしも変更されておらず、フロッピーディスクを取り出さずにディスクドライブドアのロックを解除およびロックするだけで変更ラインをアクティブにできます。
INT 13H (0x13)
機能17H(0x17または23)>>ディスクタイプの設定
Call with: AH = 17H
AL = floppy disk type code
Value |
Description |
00H |
Not used |
01H |
320/360 KB floppy disk in 360 KB drive |
02H |
320/360 KB floppy disk in 1.2 MB drive |
03H |
1.2 MB floppy disk in 1.2 MB drive |
04H |
720 KB floppy disk in 720 KB drive |
SL = drive
00H-7FH floppy disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この関数は、指定されたドライブのフロッピーディスクタイプを選択します。
INT 13H (0x13)
機能18H(0x18または24)>>フォーマットのメディアタイプを設定
Call with: AH = 18H
CH = number of cylinders
CL = sector per track
DL = drive
00H-7FH floppy disk
Returns: If function successful
Carry flag = clear
AH = 00H
ES: DI = segment: offset of disk
parameter table for media type
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この機能は、指定されたドライブのメディア特性を選択するため、ドライブにフロッピーディスクが存在する必要があります。
INT 13H (0x13)
機能19H(0x19または25)>>パークヘッド
Call with: AH = 19H
DL = drive
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
コメントコメント:
この機能は、データの保存に使用されていないトラックに読み取り/書き込みアームを移動するため、ドライブの電源を切ったときにデータが損傷することはありません。
INT 13H (0x13)
機能1AH(0x1Aまたは26)>>フォーマットESDIドライブ
Call with: AH = 1AH
AL = Relative Block Address (RBA)
defect table count
0, if no RBA table
>0, if RBA table used
CL = format modifier bits
Bit(s) |
Significance (if set) |
0 |
Ignore primary defect map |
1 |
Ignore secondary defect map |
2 |
Update secondary defect map |
3 |
Perform extended surface analysis |
4 |
Generate periodic interrupt |
5-7 |
Reserved (must be 0) |
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of RBA table
Returns: If function successfu
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see INT 13H Function 01H)
コメントコメント:
この関数は、ESDI固定ディスクドライブアダプタに接続されたドライブのディスクセクターとトラックアドレスフィールドを初期化します。
この機能の操作は低レベルフォーマットと呼ばれ、セクターレベルでの物理的な読み取り/書き込み操作のためにディスクを準備します。その後、ドライブをFDISKコマンドでパーティション化し、次にFORMATコマンドで高レベルのフォーマットを指定してファイルシステムをインストールする必要があります。