Kapitel – 8
Disk-BIOS-Funktionen und Interruptbehandlung mit C
Einführung
In diesem Kapitel werden wir die wichtigen Disk-BIOS-Funktionen und andere wichtige Funktionen besprechen, die uns die Freiheit geben, Interrupts in unserem Programm mit C auf einfache und kurze Weise zu verwenden und zu handhaben. Diese Funktionen sind die Rückseite & ndash; Knochen der Datenwiederherstellung und der Programmierung zur Fehlerbehebung bei Festplatten. Dies sind die Funktionen, die die C-Sprache zu einer „High“-Sprache machen. Ebene Assemblersprache & rdquo;.
biosdisk- und _bios_disk-Funktionen
Diese beiden Funktionen sind die wichtigsten Funktionen für unseren Zweck der Datenwiederherstellung und der Programmierung der Festplattenfehlerbehebung. Wir werden diese Funktionen die meiste Zeit verwenden.
Diese beiden sind die BIOS-Laufwerksdienste und wurden in bios.h definiert, wo biosdisk unterhalb der Ebene von Dateien auf Raw-Sektoren arbeitet. Wenn diese Funktionen auch nur ein wenig unvorsichtig verwendet werden, können Dateiinhalte und Verzeichnisse auf einer Festplatte zerstört werden. Sowohl biosdisk- als auch _bios_disk-Funktionen verwenden Interrupt 0x13, um Festplattenoperationen direkt an das BIOS zu senden. Die Funktion _bios_disk wird im Programm folgendermaßen deklariert:
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);
Die Bedeutung dieser Parameter ist in der folgenden Tabelle beschrieben:
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 |
Bei diesen beiden Funktionen werden die Daten mit 512 Byte pro Sektor in den Puffer eingelesen und daraus geschrieben, was der logischen Größe eines Sektors einer Festplatte entspricht, und der von beiden Funktionen zurückgegebene Wert ist der Wert des AX-Registers, das von gesetzt wurde den INT 0x13H BIOS-Aufruf.
Wenn die Funktion erfolgreich ist, ist High-Byte = 0, dh der erfolgreiche Abschluss, und Low-Byte enthält die Anzahl der gelesenen, geschriebenen oder verifizierten Sektoren usw.
Wenn jedoch ein Fehler auftritt und die Funktion nicht erfolgreich ist, ist der Wert des High-Byte einer der folgenden Fehlercodes, die in der folgenden Tabelle beschrieben sind:
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 |
Die angegebene Tabelle stellt als nächstes die Operationsbefehle dar, die durch den cmd-Parameter ausgeführt werden sollen. Zunächst sehen wir uns die gemeinsamen Operationen beider Funktionen an.
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 |
Es steht Ihnen zwar frei, entweder cmd = 0, 1, 2, 3, 4,5 oder cmd = _DISK_RESET, _DISK_STATUS, _DISK_READ, _DISK_WRITE, _DISK_VARIFY, _DISK_FORMAT zu verwenden, und beide Optionen haben die gleiche Wirkung, aber es wird empfohlen, dass Sie dies tun sollten haben Sie die Angewohnheit, Wörter option wie cmd = _DISK_FORMAT anstelle von cmd = 5 zu verwenden, da dies Ihnen helfen kann, Fehler zu vermeiden, die auftreten können, wenn Sie eine falsche Befehlsnummer für cmd eingegeben haben.
Wenn wir in der Deklaration der Funktion biosdisk oder _bios_disk cmd = _DISK_RESET angeben, setzt die Funktion das Festplattensystem zurück, indem alle anderen Parameter ignoriert werden, und _DISK_STATUS gibt den Status der letzten Festplattenoperation zurück, wobei alle anderen Parameter ignoriert werden.
Für cmd = _DISK_READ, _DISK_WRITE oder _DISK_VERIFY (2, 3 oder 4) verwenden biosdisk- und _bios_disk-Funktionen auch andere unten gezeigte Parameter:
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 |
Wenn der Wert von cmd = 5 (_DISK_FORMAT) ist, verwenden biosdisk und _bios_disk die folgenden Parameter gemäß der Beschreibung in der Tabelle. Es wird immer empfohlen, bei der Verwendung von _DISK_FORMAT vorsichtig zu sein und zu wissen, was Sie tun. Mangelndes Wissen oder sogar ein kleiner Fehler können dazu führen, dass Sie mit einem großen Datenverlust konfrontiert werden.
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 |
Es gibt einige zusätzliche Werte von cmd, die nur von Biosdisk-Funktionen verwendet werden. Diese Werte von cmd sind nur für XT, AT, PS / 2 und kompatible Geräte zulässig. Die Werte wurden in der folgenden Tabelle beschrieben:
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 Struktur
Die diskinfo_t-Struktur wird von der _bios_disk-Funktion verwendet. Die Beschreibung der Struktur lautet wie folgt:
struct diskinfo_t {
unsigned drive, head, track, sector, nsectors;
void far *buffer;
};
Dabei gibt Laufwerk das zu verwendende Laufwerk an. Denken Sie immer daran, dass für die Festplatten das physische Laufwerk angegeben wird, nicht die Festplattenpartition. Wenn Sie Partitionen betreiben möchten, muss das Anwendungsprogramm auch die Partitionstabelleninformationen dieser Platte selbst interpretieren.
Die Werte von Kopf, Spur und Sektor geben den Ort des Startsektors für die Operation an. nsectors gibt die Anzahl der zu lesenden oder zu schreibenden Sektoren an und buffer zeigt auf den Puffer, in dem Daten gelesen und geschrieben werden. Abhängig vom Wert von cmd werden die anderen Parameter in der diskinfo_t-Struktur möglicherweise benötigt oder nicht.
Der Wert für die Spezifikation des Laufwerks, das in den Funktionen biosdisk und _bios_disk verwendet werden soll, ist in der folgenden Tabelle angegeben:
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) |
Genug Theorie! Sehen wir uns nun einige praktische Dinge und einige Beispiele dieser Funktionen an. Das folgende Beispiel liest die Sektoren der beiden Seiten der vier Spuren der Diskette und speichert den Inhalt in der vom Benutzer angegebenen Datei. Es spielt keine Rolle, ob Sie die Dateien von Ihrer Festplatte gelöscht haben, da das Programm direkt die Oberfläche der Festplatte liest.
Um die gelöschten Daten anzuzeigen, ist es besser, wenn Sie eine vollständig formatierte Diskette nehmen und einige Textdateien kopieren, z. B. Ihre .c-Programmcodierung oder andere Textdateien (damit Sie den Inhalt der Dateien verstehen können), die ungefähr 73 KB belegen (Daten werden in vier Spuren, zwei Seiten und 18 Sektoren in jeder Spur gespeichert. Jeder Sektor hat 512 Bytes). Das Programm wurde entwickelt, um das Beispiel zu demonstrieren. Sie können es jedoch ändern und erweitern, um Daten wiederherzustellen.
/* Programm zum Lesen von 4 Spuren (0, 1, 2 und 3) einer Diskette und Schreiben des Inhalts in die angegebene Datei */
#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();
/// Überprüfen Sie, ob das Laufwerk bereit ist oder nicht \\\
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();
}
/* Holen Sie sich den Dateinamen zum Speichern der Daten der Sektoren von
die Scheibe */
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 */
/// Zeigen Sie den Status an \\\
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);
/// Lesen Sie die angegebenen Sektoren \\\
result = _bios_disk(_DISK_READ, &dinfo);
/// Speichern Sie den Inhalt in der angegebenen Datei \\\
if ((result & 0xff00) == 0)
{
for(i=0;i<512;i++)
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/* Fehlermeldung auf dem Bildschirm und in der Datei für Fehler beim Lesen eines Sektors drucken */
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);
}
Das Beispiel zeigt die Verwendung der Funktionen biosdisk und _bios_disk. Die biosdisk-Funktion überprüft, ob die Festplatte bereit ist oder nicht und die Adressmarkierung gefunden wird. Die Funktion _bios_disk liest die Sektoren der beiden Seiten bis zu vier Spuren.
Die Reihenfolge des Lesens (oder Schreibens) auf der Oberfläche der Platte sollte wie folgt sein:
absread- und abswrite-Funktionen
Diese Funktionen wurden in Dos.h definiert. Die absread-Funktion liest absolute Plattensektoren und die abswrite-Funktion schreibt absolute Plattensektoren. Die Funktion absread verwendet den DOS-Interrupt 0x25, um bestimmte Plattensektoren zu lesen, und die Funktion abswrite verwendet den DOS-Interrupt 0x26, um bestimmte Plattensektoren zu schreiben.
Absolute Lese- oder Schreiboperationen werden sequentiell durchgeführt, indem Sektor(en) Schritt für Schritt erhöht werden, und sind vollständig frei von Kopf- und Spurnummern usw. Es ist die Aufgabe des BIOS des Computers, die absoluten Sektoren in die entsprechenden Spur-, Kopf- und Sektornummern zu übersetzen.
Absolute Lese- und Schreiboperationen werden in solchen Programmen empfohlen, in denen wir Lese-/Schreiboperationen auf der gesamten Festplatte durchführen und zusätzliches Codieren und Schleifen in unserem Programm vermeiden möchten, um die Geschwindigkeit des Programms auf die höchste Geschwindigkeit zu erhöhen.
Die beiden Funktionen absread und abswrite ignorieren die logische Struktur einer Platte und achten nicht auf Dateien, FATs oder Verzeichnisse. Diese Funktionen führen direkt absolute Lese- und absolute Schreiboperationen auf der Oberfläche der Festplatte aus. Dies ist der Grund dafür, dass abswrite bei unsachgemäßer Verwendung Dateien, Verzeichnisse und FATs überschreiben kann.
Die Deklaration der absread-Funktion lautet wie folgt:
int absread(int drive, int nsects, long lsect,
void *buffer);
und die abswrite-Funktion wird wie folgt deklariert:
int abswrite(int drive, int nsects, long lsect,
void *buffer);
Wobei die Bedeutung von Parametern wie folgt ist:
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) |
Bei Erfolg geben beide Funktionen 0 zurück. Wenn ein Fehler auftritt, geben beide -1 zurück und setzen die Fehlernummer. auf den Wert des vom Systemaufruf zurückgegebenen AX-Registers.
Die Anzahl der Sektoren für Lese- oder Schreibvorgänge ist auf 64 KB oder die Größe des Puffers begrenzt, je nachdem, welcher Wert kleiner ist. Wir werden jedoch in den nächsten Kapiteln die Verwendung von riesigem Speicher lernen, um die Speichergrenze von 64 KB zu überschreiten und ein sehr schnelles Programm zu entwickeln.
|
Interruptbehandlung mit C
C wird manchmal als Assemblersprache auf hoher Ebene bezeichnet, da es die verschiedenen Interrupts mithilfe einiger seiner definierten Funktionen aufrufen kann. Einige wichtige Funktionen sind wie folgt:
- int86: Ruft MS-DOS-Interrupts auf.
- int86x: Ruft MS-DOS-Interrupt mit Segmentregisterwerten auf.
- intdos: ruft den MS-DOS-Dienst mit anderen Registern als DX und AL auf
- intdosx: ruft den MS-DOS-Dienst mit Segmentregisterwerten auf.
- trennen: Liest Segmentregister
Wir werden diese Funktionen im Detail besprechen. Zunächst besprechen wir einige vordefinierte Strukturen und Vereinigungen, die häufig oder notwendigerweise mit diesen Funktionen verwendet werden.
SREGS-Struktur
Diese Struktur wurde in dos.h definiert und ist eine Struktur der Segmentregister, die von den Funktionen int86x, intdosx und segread übergeben und ausgefüllt werden. Die Deklaration der Struktur lautet wie folgt:
struct SREGS {
unsigned int es;
unsigned int cs;
unsigned int ss;
unsigned int ds;
};
REGS-Gewerkschaft
REGS ist die Vereinigung zweier Strukturen. Die Union REGS wurde als dos.h definiert und wird verwendet, um Informationen zu und von den Funktionen int86, int86x, intdos und intdosx zu übergeben. Die Vereinserklärung lautet wie folgt:
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
BYTEREGS- und WORDREGS-Strukturen
Die Strukturen BYTEREGES und WORDREGS wurden in dos.h definiert und diese werden zum Speichern von Byte- und Wortregistern verwendet. Die WORGREGS-Struktur ermöglicht dem Benutzer den Zugriff auf die Register der CPU als 16-Bit-Größen, während die BYTEREGES-Struktur den Zugriff auf die einzelnen 8-Bit-Register ermöglicht.
Die BITEREGS-Struktur wird wie folgt deklariert:
struct BYTEREGS {
unsigned char al, ah, bl, bh;
unsigned char cl, ch, dl, dh;
};
Und die WORDREGS-Struktur wird wie folgt deklariert:
struct WORDREGS {
unsigned int ax, bx, cx, dx;
unsigned int si, di, cflag, flags;
};
int86- und int86x-Funktionen
Diese Funktionen sind die allgemeinen 8086-Software-Interrupt-Schnittstellen, die in dos.h definiert sind. Register werden auf die gewünschten Werte gesetzt und diese Funktionen werden aufgerufen, um die MS-DOS-Interrupts aufzurufen. Die Deklaration der int86-Funktion lautet wie folgt:
int int86(int intno, union REGS *inregs,
union REGS *outregs);
int86x ist die Variation der int86-Funktion. Es wird wie folgt deklariert:
int int86x(int intno, union REGS *inregs,
union REGS *outregs, struct SREGS *segregs);
Sowohl die Funktionen int86 als auch int86x führen einen 8086-Software-Interrupt aus, der durch das Argument intno angegeben wird. Oder wir können sagen, dass der zu erzeugende Interrupt durch intno angegeben wird.
Mit der int86x-Funktion ist der Zugriff nur auf ES und DS und nicht auf CS und SS möglich, sodass Sie einen 8086-Software-Interrupt aufrufen können, der einen Wert von DS annimmt, der sich vom Standarddatensegment unterscheidet, und / oder ein Argument in ES annimmt.
Diese Funktionen kopieren vor der Ausführung des Software-Interrupts Registerwerte aus Inregs in die Register. Die Funktion int86x kopiert auch die segregs->ds- und segregs->es-Werte in die entsprechenden Register, bevor sie den Software-Interrupt ausführt. Dieses Merkmal ermöglicht es Programmen, die Far-Zeiger oder ein großes Datenspeichermodell verwenden, anzugeben, welches Segment für den Software-Interrupt verwendet werden soll.
Die Funktionen kopieren die aktuellen Registerwerte nach Outregs, den Status des Carry-Flags in das x.cflag-Feld in Outregs und den Wert des 8086-Flags-Registers in das x.flags-Feld in Outregs, nachdem der Software-Interrupt zurückkehrt. Die Funktion int86x stellt auch DS wieder her und setzt die Felder segregs->es und segregs->ds auf die Werte der entsprechenden Segmentregister.
In beiden Funktionen können inregs und outregs auf die gleiche Struktur zeigen und beide Funktionen geben den Wert von AX nach Beendigung des Software-Interrupts zurück. Wenn das Carry-Flag gesetzt ist, zeigt dies normalerweise an, dass ein Fehler aufgetreten ist.
Die in C verwendeten REGS-Union-Elemente, die der Assembler-Sprache entsprechen, sind in der folgenden Tabelle aufgeführt:
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 |
|
|
Sehen wir uns die Beispiele der int86- und int86x-Funktionen an. Das folgende Programm scannt jeden Sektor der Diskette und gibt den Status jedes Sektors auf dem Bildschirm aus.
/* Programm, um jeden Sektor der Diskette zu scannen und den Status zu drucken */
#include<dos.h>
#include<conio.h>
void main()
{
int head,track,sector,i;
char *buf;
union REGS inregs, outregs;
struct SREGS sregs;
clrscr();
/// Initialisieren der Festplatte durch Zurücksetzen des Festplattensystems \\\
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");
/* Scannen Sie die Diskette von 0 bis 79 Spuren (Gesamtspuren 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);
//// Drucken Sie den Status des gescannten Sektors \\\\
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();
}
Das Programm zeigt das Beispiel der Verwendung der Funktionen int86 und int86x. In diesem Programm initialisiert die int86-Funktion die Festplatte durch Zurücksetzen des Festplattensystems unter Verwendung der Funktion 00H von INT 13H. Die int86x-Funktion überprüft jeden Sektor der Diskette (1,44 MB, 3 & frac12; Diskette) von beiden Seiten, bis zu 0 bis 79 Spuren (insgesamt 80 Spuren) unter Verwendung der Funktion 04H von INT 13H.
segread-Funktion
Diese Funktion wurde in dos.h definiert. Diese Funktion liest die Segmentregister. Die Deklaration der Funktion lautet wie folgt:
void segread (struct SREGS * segp);
wobei segread die aktuellen Werte der Segmentregister in die Struktur *segp einfügt. Die Funktion gibt nichts zurück und der Aufruf ist für die Verwendung mit intdosx und int86x vorgesehen. Lassen Sie uns ein Beispiel sehen
#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();
}
Und die Ausgabe des Programms sieht in etwa so aus:
Current segment register settings
CS: EED DS: 10BA
ES: 10BA SS: 10BA
intdos- und intdosx-Funktionen
Diese Funktionen wurden in dos.h definiert. Dies sind die allgemeinen DOS-Interrupt-Schnittstellen. Die Funktion intdos ruft MS-DOS-Dienstregister auf, dann DX und AL, wobei die Funktion intdosx den MS-DOS-Dienst mit Segmentregisterwerten aufruft.
Die Deklaration der intdos-Funktion lautet wie folgt:
int intdos(union REGS *inregs, union REGS *outregs);
und die Deklaration der intdosx-Funktion ist wie:
int intdosx(union REGS *inregs, union REGS *outregs,
struct SREGS *segregs);
Die Funktionen intdos und intdosx führen den DOS-Interrupt 0x21 aus, um eine bestimmte DOS-Funktion aufzurufen. Der Wert von inregs- & gt;h.ah gibt die aufzurufende DOS-Funktion an. Auch die Funktion intdosx kopiert vor dem Aufruf der DOS-Funktion die segregs->ds- und segregs->es-Werte in die entsprechenden Register und stellt dann DS wieder her.
Dieses Merkmal der Funktionen ermöglicht es den Programmen, die Fernzeiger oder ein großes Datenspeichermodell verwenden, anzugeben, welches Segment für die Funktionsausführung verwendet werden soll. Mit der intdosx-Funktion können Sie eine DOS-Funktion aufrufen, die einen Wert von DS annimmt, der sich vom Standarddatensegment unterscheidet, und / oder ein Argument in ES annimmt.
Beide Funktionen geben nach Abschluss des DOS-Funktionsaufrufs den Wert von AX zurück, und wenn das Carry-Flag gesetzt ist (outregs - & gt; x.cflag! = 0), zeigt dies an, dass ein Fehler aufgetreten ist.
Nachdem der Interrupt 0x21 zurückgibt, kopieren die Funktionen die aktuellen Registerwerte in Outregs, den Status des Carry-Flags in das x.cflag-Feld in Outregs und den Wert des 8086-Flags-Registers in das x.flags-Feld in Outregs. Sowohl Inregs als auch Outregs können auf dieselbe Struktur zeigen. Sehen wir uns die Beispiele dieser Funktionen an.
Das Beispiel für die Verwendung der intdos-Funktion wurde unten angegeben. Dieses Programm erhält die ausgewählten Informationen über das Diskettenlaufwerk (1,44 MB, 3 & frac12; Zoll Diskette). Dieses Programm liefert die Zuordnungsinformationen einer Diskette.
/* Die Abrufen von Laufwerkzuweisungsinformationen für die Datenträgernutzung */
#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();
}
Und die Ausgabe des Programms sieht so aus:
1 sectors/cluster,
1933 clusters,
512 bytes/sector,
2843 total clusters
Sehen wir uns nun ein Beispiel der Funktion intdosx an. Das folgende Beispiel zeigt die Verwendung der intdosx-Funktion . Das Programm gibt einen String auf der Standardausgabe aus.
/* Das Programm zur Ausgabe von 'string' nach dem Standard
Ausgang. */
#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();
}
Und die Ausgabe des Programms wird wie folgt sein:
Diese Zeichenfolge befindet sich nicht im Standarddatensegment |
Hier drucken wir den angegebenen String mit der Funktion intdosx, durch die Funktion 09H von INT 21H. Es sollte immer beachtet werden, dass die angegebene Zeichenkette immer mit dem Zeichen „$“ enden sollte.
So ermitteln Sie die physische Festplattennummer
Die physische Festplattennummer ist sehr wichtig und sollte genau geschrieben werden. Die unzulässige Laufwerksspezifikation kann zu einem größeren Datenverlust führen. Wir müssen uns während der Datenwiederherstellung oder der Festplatten-Fehlerbehebungsprogrammierung auf die Laufwerksnummer verlassen können. Wie die Laufwerksnummer einer beliebigen Platte mit unterschiedlichen Plattenanordnungen ermittelt werden kann, kann anhand der folgenden Beispiele abgeschätzt werden.
Gemäß einem am meisten verbreiteten Mythos werden die physischen Laufwerksnummern entsprechend dem Anschlussstatus der Festplatte bereitgestellt, in einigen oder besonderen Fällen kann dies jedoch vom Booten Ihres Betriebssystems abhängig sein Prozedur oder Boot-Einstellungen.
Die allgemeinste Idee für die vom BIOS bereitgestellte physikalische Laufwerksnummer wurde hier gegeben, aber selbst dann müssen Sie mit Hilfe eines Festplattenbearbeitungstools oder mit den in den nächsten Kapiteln angegebenen Programmen bestätigen, über die Konfiguration der Festplatte. Nachdem Sie sich vergewissert haben, dass Sie keine Entscheidung über die Ausführung solcher Programme treffen sollten, die die Daten beschädigen oder beschädigen können, wenn sie illegal oder in Unwissenheit verwendet werden.
Wenn zwei Festplatten an das System angeschlossen sind, eine als primärer Master und die andere als sekundärer Master, wird im Allgemeinen zuerst der primäre Master (und dann der primäre Slave, falls verfügbar) und dann der sekundäre Master ( und dann zum sekundären Slave, falls verfügbar usw.) und die physische Nummer wird entsprechend ihrer Präferenzen vergeben.
Nehmen wir an, Ihr System unterstützt maximal vier Festplatten gleichzeitig. Alle vier Festplatten können wie folgt angeschlossen werden:
Primary Master |
Primary Slave |
Secondary Master |
Secondary Slave |
Betrachten wir nun einige Fälle für die Laufwerksnummer von physischen Laufwerken. Hier gehe ich davon aus, dass Sie die Festplatten mit den richtigen Jumper-Einstellungen wie vom Festplattenhersteller angegeben und mit den richtigen Master & ndash; Slave-Einstellungen verbunden haben:
- Wenn alle vier Festplatten mit dem System verbunden sind: Wenn alle vier Festplatten mit dem System verbunden sind, lauten die physikalischen Laufwerksnummern wie folgt:
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. |
- Wenn drei Festplatten an das System angeschlossen sind: Wenn drei Festplatten an das System angeschlossen sind, werden die physikalischen Laufwerksnummern entsprechend ihrer Anschlusseinstellungen sein. Die folgenden Beispiele stellen einige der Anordnungen dar:
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. |
- If two Hard Disks are connected to the system: Similarly, if two Hard Disks are connected to the system the physical drive numbers will be as according to their attachment preferences. Following example illustrates it:
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. |
- Wenn eine einzelne Festplatte mit dem System verbunden ist: Sie müssen nicht daran denken, dass die physische Laufwerksnummer 80H ist, wenn nur eine Festplatte verfügbar ist.
Interrupt 13H (INT 13H), ROM BIOS Disk Driver Functions
Die Beschreibung der INT 13H-Funktionen wurde hier gegeben. Diese Funktionen sollten mit Vorsicht erlernt werden, da der Missbrauch dieser Funktionen oder die Verwendung aus Mangel an Sorgfalt oder Unkenntnis zu großen Datenverlusten oder vielen anderen Problemen führen kann. Richtig eingesetzt helfen diese Funktionen jedoch, die Codierung Ihres Programms zu minimieren und Ihre Programmierung einfach und leicht zu gestalten.
GANZZAHL 13H (0x13)
Funktion 00H (0x00) & # 61672; Festplattensystem zurücksetzen
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
Bemerkungen:
Setzen Sie den Festplattencontroller zurück, kalibriert die angeschlossenen Laufwerke neu. Der Lese-/Schreibarm wird auf Zylinder 0 bewegt und bereitet die Platten-I/O vor.
Diese Funktion sollte nach einem fehlgeschlagenen Lesen, Schreiben, Verifizieren oder Formatieren einer Diskette aufgerufen werden, bevor Sie den Vorgang wiederholen. Wenn die Funktion mit einem Festplattenlaufwerk aufgerufen wird (d. h. Auswahl von DL & gt; = 80H), wird der Diskettencontroller und dann der Festplattencontroller zurückgesetzt.
GANZZAHL 13H (0x13)
Funktion 01H (0x01) & # 61672; Rufen Sie den Status des Festplattensystems ab
Call with: AH = 01H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Kehrt zurück: AH = 00H
AL = status of previous disk operation
(See the table given before for error
and status codes description).
Bemerkungen:
Gibt den Status der letzten Festplattenoperation zurück
GANZZAHL 13H (0x13)
Funktion 02H (0x02) & # 61672; Sektor lesen
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 = Segment: Offset des Puffers
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Bemerkungen:
Diese Funktion liest einen oder mehrere Sektoren von der Festplatte in den Speicher. Bei Festplatten werden die oberen 2 Bits der 10-Bit-Zylindernummer in die oberen 2 Bits des Registers CL gelegt.
GANZZAHL 13H (0x13)
Funktion 03H (0x03) & # 61672; Sektor schreiben
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
Bemerkungen:
Diese Funktion schreibt einen oder mehrere Sektoren vom Speicher auf die Festplatte. Bei Festplatten werden die oberen 2 Bits der 10-Bit-Zylindernummer in die oberen 2 Bits des Registers CL gelegt.
GANZZAHL 13H (0x13)
Funktion 04H (0x04) >> Sektor prüfen
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
Bemerkungen:
Diese Funktion überprüft die Adressfelder eines oder mehrerer Sektoren. Bei dieser Operation werden keine Daten zum oder vom Speicher übertragen. Auf Festplatten werden die oberen 2 Bits der 10-Bit-Zylindernummer in die oberen 2 Bits des Registers CL ersetzt.
Mit dieser Funktion kann getestet werden, ob sich ein lesbares Medium in einem Diskettenlaufwerk befindet. Das anfordernde Programm sollte das Diskettensystem zurücksetzen (INT 13H Funktion 00H) und die Operation dreimal wiederholen, bevor es annimmt, dass keine lesbare Diskette vorhanden ist. Es wird bei den meisten Disketten-Initialisierungsoperationen empfohlen.
GANZZAHL 13H (0x13)
Funktion 05H (0x05) >> Spur formatieren
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)
Kommentare:
Initialisiert den Plattensektor und verfolgt Adressfelder auf der angegebenen Spur. Auf Disketten besteht die Adressfeldliste aus einer Reihe von 4-Byte-Einträgen, ein Eintrag pro Sektor. Das Format ist in der folgenden Tabelle angegeben.
Auf Festplatten werden die oberen 2 Bits der 10-Bit-Zylindernummer in die oberen 2 Bits des Registers CL gelegt.
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 |
|
GANZZAHL 13H (0x13)
Funktion 06H (0x06) >> Fehlerhaften Track formatieren
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
Bemerkungen:
Diese Funktion ist nur für PC/XT-Festplattenlaufwerke definiert. Es initialisiert eine Spur, schreibt Plattenadressenfelder und Datensektoren und setzt Flags für fehlerhafte Sektoren.
GANZZAHL 13H (0x13)
Funktion 07H (0x07) >> Laufwerk formatieren
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)
Bemerkungen:
Diese Funktion ist nur für PC / XT-Festplattenlaufwerke definiert. Es formatiert das gesamte Laufwerk, schreibt Plattenadressenfelder und Datensektoren, beginnend bei dem angegebenen Zylinder.
GANZZAHL 13H (0x13)
Funktion 08H (0x08) >> Antriebsparameter abrufen
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
Bemerkungen:
Diese Funktion gibt verschiedene Parameter für das angegebene Laufwerk zurück. Der in Register DL zurückgegebene Wert gibt die tatsächliche Anzahl physischer Laufwerke wieder, die an den Adapter für das angeforderte Laufwerk angeschlossen sind.
GANZZAHL 13H (0x13)
Funktion 09H (0x09) >> Festplatteneigenschaften initialisieren
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
Bemerkungen:
Diese Funktion initialisiert den Festplattencontroller für nachfolgende E/A-Operationen unter Verwendung der Werte, die in den ROM-BIOS-Festplattenparameterblöcken gefunden werden. Die Funktion wird nur auf Festplatten unterstützt. Das Format des Parameterblocks für PC- und PC/XT-Festplatten ist wie folgt:
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 |
Das Parameterblockformat für PC/AT- und PS/2-Festplatten lautet wie folgt:
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 |
GANZZAHL 13H (0x13)
Funktion 0A H (0x0A oder 10) >> Sektor lang lesen
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
Bemerkungen:
Diese Funktion liest einen oder mehrere Sektoren von der Platte in den Speicher zusammen mit einem 4-Byte-Error Correcting Code (ECC)-Code für jeden Sektor. Im Gegensatz zur normalen Read Sector-Funktion (INT 13H (0x13) Function 02H) werden ECC-Fehler nicht automatisch korrigiert. Multi-Sektor-Übertragungen werden nach jedem Sektor mit einem Lesefehler beendet.
Diese Funktion wird nur auf Festplatten unterstützt. Die oberen 2 Bits der 10-Bit-Zylindernummer werden in die oberen 2 Bits des Registers CL gelegt.
GANZZAHL 13H (0x13)
Funktion 0BH (0x0B oder 11) >> Sektor lang schreiben
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
Bemerkungen:
Diese Funktion schreibt einen oder mehrere Sektoren vom Speicher auf die Festplatte. Auf den Datenwert jedes Sektors muss sein 4-Byte-ECC-Code folgen. Die oberen 2 Bits der 10-Bit-Zylindernummer werden in die oberen 2 Bits des Registers CL platziert. Diese Funktion wird nur auf Festplatten unterstützt.
GANZZAHL 13H (0x13)
Funktion 0CH (0x0C oder 12) >> Suchen
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
Bemerkungen:
Diese Funktion positioniert die Disk-Lese-/Schreibköpfe auf den angegebenen Zylinder, ohne Daten zu übertragen. Die oberen 2 Bits der Zylindernummer werden in die oberen 2 Bits des Registers CL platziert. Diese Funktion wird nur auf Festplatten unterstützt.
GANZZAHL 13H (0x13)
Funktion 0DH (0x0D oder 13) >> Festplattensystem zurücksetzen
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)
Bemerkungen:
Diese Funktion setzt den Festplattencontroller zurück, kalibriert angeschlossene Laufwerke neu, bewegt den Lese-/Schreibarm auf Zylinder 0 und bereitet die nachfolgende Festplatten-E/A vor.
GANZZAHL 13H (0x13)
Funktion 0EH (0x0E oder 14) >> Sektorpuffer lesen
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
Bemerkungen:
Diese Funktion überträgt den Inhalt des internen Sektorpuffers des Festplattenadapters in den Systemspeicher. Es werden keine Daten vom physischen Laufwerk gelesen.
GANZZAHL 13H (0x13)
Funktion 0FH (0x0F oder 15) >> Sektorpuffer schreiben
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
Bemerkungen:
Diese Funktion überträgt Daten vom Systemspeicher zum internen Sektorpuffer des festen Adapters. Es werden keine Daten auf das physische Laufwerk geschrieben. Diese Funktion sollte aufgerufen werden, um den Inhalt des Sektorpuffers zu initialisieren, bevor das Laufwerk mit INT 13H Function 05H formatiert wird.
GANZZAHL 13H (0x13)
Funktion 10H (0x10 oder 16) >> Laufwerkstatus abrufen
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
Bemerkungen:
Diese Funktion testet, ob das angegebene Festplattenlaufwerk betriebsbereit ist, und gibt den Status des Laufwerks zurück. Diese Funktion wird nur auf Festplatten unterstützt.
GANZZAHL 13H (0x13)
Funktion 11H (0x11 oder 17) >> Antrieb neu kalibrieren
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
Bemerkungen:
Diese Funktion bewirkt, dass sich der Festplattenadapter für das angegebene Laufwerk neu kalibriert, den Lese-/Schreibarm auf Zylinder 0 positioniert und den Status des Laufwerks zurückgibt. Diese Funktion wird nur auf Festplatten unterstützt.
GANZZAHL 13H (0x13)
Funktion 12H (0x12 oder 18) >> Steuerungs-RAM diagnostisch
Anruf mit:AH = 12H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Bemerkungen:
Diese Funktion veranlasst den Festplattenadapter, einen eingebauten Diagnosetest an seinem internen Sektorpuffer durchzuführen, der anzeigt, ob der Test durch den zurückgegebenen Status bestanden wurde.
GANZZAHL 13H (0x13)
Funktion 13H (0x13 oder 19) >> Steuerungsantriebsdiagnose
Call with:AH = 13H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Bemerkungen:
Diese Funktion veranlasst den festen Adapter, interne Diagnosetests des angeschlossenen Laufwerks auszuführen, die anzeigen, ob der Test durch den zurückgegebenen Status bestanden wurde.
GANZZAHL 13H (0x13)
Funktion 14H (0x14 oder 20) >> Controller internal diagnostisch
Anruf mit:AH = 14H
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Bemerkungen:
Diese Funktion veranlasst den Festplattenadapter, einen eingebauten diagnostischen Selbsttest durchzuführen, der anzeigt, ob der Test durch den zurückgegebenen Status bestanden wurde.
GANZZAHL 13H (0x13)
Funktion 15H (0x15 oder 21) >> Festplattentyp abrufen
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 if no drive present
01H if floppy disk drive without change-line support
02H if floppy disk drive with change-line support
03H if fixed disk
|
And, if fixed disk (AH =03H)
CX: DX = number of 512-byte sectors
If function unsuccessful
Carry flag = set
AH = status
Bemerkungen:
Diese Funktion gibt einen Code zurück, der den Typ der Diskette oder Festplatte angibt, auf die durch den angegebenen Laufwerkscode verwiesen wird.
GANZZAHL 13H (0x13)
Funktion 16H (0x16 oder 22) >> Datenträgerwechsel abrufen Status
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
Bemerkungen:
Diese Funktion gibt den Status der Änderungszeile zurück, die angibt, ob die Platte im Laufwerk möglicherweise seit dem letzten Plattenzugriff ersetzt wurde. Wenn diese Funktion mit gesetztem Carry-Flag zurückkehrt, ist die Platte nicht unbedingt gewechselt worden, und die Änderungsleitung kann aktiviert werden, indem einfach die Plattenlaufwerkstür entriegelt und verriegelt wird, ohne die Diskette zu entfernen.
GANZZAHL 13H (0x13)
Funktion 17H (0x17 oder 23) >> Festplattentyp einstellen
Anruf mit: 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
Bemerkungen:
Diese Funktion wählt einen Diskettentyp für das angegebene Laufwerk aus.
GANZZAHL 13H (0x13)
Funktion 18H (0x18 oder 24) >> Medientyp für Format festlegen
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
Bemerkungen:
Diese Funktion wählt Medieneigenschaften für das angegebene Laufwerk aus, daher muss sich eine Diskette im Laufwerk befinden.
GANZZAHL 13H (0x13)
Funktion 19H (0x19 oder 25) >> Köpfe parken
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
Bemerkungen:
Diese Funktion bewegt den Lese-/Schreibarm auf eine Spur, die nicht für die Datenspeicherung verwendet wird, sodass Daten nicht beschädigt werden, wenn das Laufwerk ausgeschaltet wird.
GANZZAHL 13H (0x13)
Funktion 1AH (0x1A oder 26) >> ESDI-Laufwerk formatieren
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)
Bemerkungen:
Diese Funktion initialisiert Plattensektoren und Spuradressenfelder auf einem Laufwerk, das an den ESDI Fixed Disk Drive Adapter angeschlossen ist.
Die Operation dieser Funktion wird Low-Level-Formatierung genannt und bereitet die Platte für physische Lese-/Schreiboperationen auf Sektorebene vor. Das Laufwerk muss anschließend mit dem FDISK-Befehl partitioniert und dann mit dem FORMAT-Befehl hochformatiert werden, um ein Dateisystem zu installieren.
Seite Geändert am: 08/03/2022