Hoofdstuk – 8
Schijf-BIOS-functies en onderbrekingen omgaan met C
Invoering
In dit hoofdstuk zullen we de belangrijke Disk-BIOS-functies en andere belangrijke functies bespreken die ons de vrijheid geven om interrupts in ons programma met C te gebruiken en af te handelen, met de gemakkelijke en korte methode. Deze functies zijn de achterkant – bot van de programmering van gegevensherstel en schijfprobleemoplossing. Dit zijn de functies die De C-taal een “High – niveau Assembleertaal”.
biosdisk- en _bios_disk-functies
Deze twee functies zijn de belangrijkste functie voor ons doel van gegevensherstel en programmering van probleemoplossing voor schijven. We zullen deze functies meestal gebruiken.
Deze twee zijn de BIOS-schijfstationservices en zijn gedefinieerd in bios.h, waar biosdisk onder het niveau van bestanden in onbewerkte sectoren werkt. Als deze functies zelfs bij een beetje onzorgvuldigheid worden gebruikt, kan het de bestandsinhoud en mappen op een harde schijf vernietigen. Zowel de biosdisk- als de _bios_disk-functie gebruiken interrupt 0x13 om schijfbewerkingen rechtstreeks naar het BIOS uit te voeren. De functie _bios_disk wordt op de volgende manier in het programma gedeclareerd:
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);
De betekenis van deze parameters is beschreven in de volgende tabel:
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 |
In beide functies worden de gegevens gelezen in en geschreven vanuit de buffer met 512 bytes per sector, dat is de logische grootte van de sector van een harde schijf en de waarde die door beide functies wordt geretourneerd, is de waarde van het AX-register dat is ingesteld door de INT 0x13H BIOS-oproep.
Als de functie succesvol is, High byte = 0, betekent dit dat de succesvolle voltooiing en low byte het aantal gelezen, geschreven of geverifieerde sectoren bevat, enzovoort.
Maar als er een fout is en de functie niet succesvol is, zal de waarde van High byte een van de volgende foutcodes zijn die in de volgende tabel worden beschreven:
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 |
De volgende tabel geeft de bewerkingsopdrachten weer die moeten worden uitgevoerd door de cmd-parameter. Allereerst zullen we de gemeenschappelijke operaties van beide functies zien.
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 |
Hoewel u vrij bent om ofwel cmd = 0, 1, 2, 3, 4,5 of cmd = _DISK_RESET, _DISK_STATUS, _DISK_READ, _DISK_WRITE, _DISK_VARIFY, _DISK_FORMAT te gebruiken en beide opties hebben hetzelfde effect, maar het wordt aanbevolen dat u hebben de gewoonte om woordenoptie zoals cmd = _DISK_FORMAT in plaats van cmd = 5 te gebruiken, omdat dit u kan helpen fouten te voorkomen die kunnen optreden als u een verkeerd opdrachtnummer voor cmd hebt getypt.
In de declaratie van biosdisk of _bios_disk functie, als we de functie cmd = _DISK_RESET geven, reset de functie het schijfsysteem door alle andere parameters te negeren en _DISK_STATUS retourneert de status van de laatste schijfbewerking, negerend alle andere parameters
Voor cmd =_DISK_READ, _DISK_WRITE of _DISK_VERIFY (2, 3 of 4) gebruiken biosdisk- en _bios_disk-functies ook andere parameters die hieronder worden weergegeven:
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 |
Als de waarde van cmd = 5 is (_DISK_FORMAT), gebruiken biosdisk en _bios_disk de volgende parameters volgens de beschrijving in de tabel. Het wordt altijd aanbevolen om voorzichtig te zijn tijdens het gebruik van _DISK_FORMAT en dat u moet weten wat u gaat doen. Gebrek aan kennis of zelfs een kleine fout kan ervoor zorgen dat u te maken krijgt met een groot gegevensverlies.
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 |
Er zijn enkele aanvullende waarden van cmd die alleen worden gebruikt door biosdisk-functies. Deze waarden van cmd zijn alleen toegestaan voor de XT, AT, PS/2 en compatibles. De waarden zijn beschreven in de onderstaande tabel:
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 Structuur
diskinfo_t-structuur wordt gebruikt door de functie _bios_disk. De beschrijving van de structuur is als volgt:
struct diskinfo_t {
unsigned drive, head, track, sector, nsectors;
void far *buffer;
};
Waar station de schijf aangeeft die moet worden gebruikt. Onthoud altijd dat voor de harde schijven de fysieke schijf is opgegeven, niet de schijfpartitie. Als u partities wilt bedienen, moet het toepassingsprogramma ook de partitietabelinformatie van die schijf zelf interpreteren.
De waarde van head, track en sector specificeert de locatie van de startsector voor de operatie. nsectors specificeert het aantal sectoren dat moet worden gelezen of geschreven en buffer wijst naar de buffer waar gegevens worden gelezen en geschreven. Afhankelijk van de waarde van cmd, zijn de andere parameters in de diskinfo_t-structuur mogelijk wel of niet nodig.
De waarde voor de specificatie van de schijf die moet worden gebruikt in de functies biosdisk en _bios_disk is gegeven in de volgende tabel:
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) |
Genoeg theorie! Laten we nu enkele praktische dingen bekijken en enkele voorbeelden van deze functies. Het volgende voorbeeld leest de sectoren van beide zijden van vier sporen van de diskette en slaat de inhoud op in het bestand, gespecificeerd door de gebruiker. Het maakt niet uit of u de bestanden van uw schijf hebt verwijderd, omdat het programma rechtstreeks het oppervlak van de schijf leest.
Om de verwijderde gegevens te zien, is het beter dat u een volledig geformatteerde diskette neemt en enkele tekstbestanden kopieert, zoals de codering van uw .c-programma's of andere tekstbestanden (zodat u de inhoud van de bestanden kunt begrijpen) bezetten ongeveer 73 KB (gegevens opgeslagen in vier sporen, twee kanten en 18 sectoren in elk spoor. Elke sector is 512 bytes). Het programma is ontwikkeld om het voorbeeld te demonstreren. U kunt het echter wijzigen en ontwikkelen zodat het klaar is om gegevens te herstellen.
/* Programma om 4 tracks (0, 1, 2 en 3) van een diskette te lezen en de inhoud naar een gespecificeerd bestand te schrijven */
#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();
/// Controleer of de schijf gereed is of niet \\\
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();
}
/* Haal de bestandsnaam op om de gegevens van de Sectoren van op te slaan de schijf */
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 */
/// Toon de status \\\
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);
/// Lees de gespecificeerde sectoren \\\
result = _bios_disk(_DISK_READ, &dinfo);
/// Bewaar de inhoud in het gespecificeerde bestand \\\
if ((result & 0xff00) == 0)
{
for(i=0;i<512;i++)
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/* Print Foutbericht op scherm en in bestand voor Fout tijdens het lezen van een sector */
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);
}
Het voorbeeld toont het gebruik van de functies biosdisk en _bios_disk. De biosdisk-functie controleert of de schijf gereed is of niet en het adresteken is gevonden. De functie _bios_disk leest de sectoren van beide kanten tot vier sporen.
De volgorde van lezen (of schrijven) aan het oppervlak van de schijf moet als volgt zijn:
absread en abswrite Functies
Deze functies zijn gedefinieerd in Dos.h. De absread-functie leest absolute schijfsectoren en de abswrite-functie schrijft absolute schijfsectoren. De functie absread gebruikt DOS-interrupt 0x25 om specifieke schijfsectoren te lezen en de functie abswrite gebruikt DOS-interrupt 0x26 om specifieke schijfsectoren te schrijven.
Absolute lees- of schrijfbewerkingen verlopen op sequentiële wijze door stap voor stap sector(en) te verhogen en zijn volledig vrij van head- en tracknummers enz. Het is de taak van het BIOS van de computer om de absolute sectoren naar de respectieve track-, hoofd- en sectornummers.
Absolute lees- en schrijfbewerkingen worden aanbevolen in dergelijke programma's waar we lees-/schrijfbewerkingen op de gehele schijf gaan uitvoeren en we willen extra codering en looping in ons programma vermijden om de snelheid van het programma zo snel mogelijk te verhogen.
Beide functies absread en abswrite, negeren de logische structuur van een schijf en besteden geen aandacht aan bestanden, FAT's of directory's. Deze functies voeren direct absolute lees- en absolute schrijfbewerkingen uit op het oppervlak van de schijf. Dit is de reden dat bij onjuist gebruik, abswrite bestanden, mappen en FAT's kan overschrijven.
De verklaring van de absread-functie is als volgt:
int absread(int drive, int nsects, long lsect,
void *buffer);
and the abswrite function is declared as follows:
int abswrite(int drive, int nsects, long lsect,
void *buffer);
Waar de betekenis van parameters als volgt is:
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) |
Bij succes retourneren beide functies 0. Als er een fout is, retourneren beide -1 en stellen foutnr. naar de waarde van het AX-register dat door de systeemaanroep is geretourneerd.
Het aantal sectoren voor lees- of schrijfbewerkingen is beperkt tot 64K of de grootte van de buffer, welke kleiner is. In de volgende hoofdstukken zullen we echter het gebruik van enorm geheugen leren om de geheugenlimiet van 64K te overschrijden, om een zeer snel programma te ontwikkelen.
|
Afhandeling onderbreken met C
C wordt soms een assembleertaal op hoog niveau genoemd omdat het de verschillende interrupts kan aanroepen met behulp van enkele van de gedefinieerde functies. Enkele belangrijke functies zijn:
- int86: roept MS-DOS-interrupts op.
- int86x: roept MS-DOS-interrupt op met segmentregisterwaarden.
- intdos: roept de MS-DOS-service op met andere registers dan DX en AL
- intdosx: roept MS-DOS-service op met segmentregisterwaarden.
- segread: leest segmentregisters
We zullen deze functies in detail bespreken. Allereerst bespreken we enkele vooraf gedefinieerde structuren en vakbonden die vaak of noodzakelijkerwijs worden gebruikt met deze functies.
SREGS-structuur
Deze structuur is gedefinieerd in dos.h en is een structuur van de segmentregisters die worden doorgegeven aan en ingevuld door de functies int86x, intdosx en segread. De verklaring van de structuur is als volgt:
struct SREGS {
unsigned int es;
unsigned int cs;
unsigned int ss;
unsigned int ds;
};
REGS vakbond
REGS is de vereniging van twee structuren. De unie REGS is gedefinieerd als dos.h en wordt gebruikt om informatie door te geven van en naar de functies int86, int86x, intdos en intdosx. De verklaring van de vakbond is als volgt:
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
BYTEREGS en WORDREGS-structuren
De structuren BYTEREGES en WORDREGS zijn gedefinieerd in dos.h en deze worden gebruikt voor het opslaan van byte- en woordregisters. De WORGREGS-structuur stelt de gebruiker in staat toegang te krijgen tot de registers van de CPU als 16-bits hoeveelheden, waarbij de BYTEREGES-structuur toegang geeft tot de afzonderlijke 8-bits registers.
De BITEREGS-structuur wordt als volgt gedeclareerd:
struct BYTEREGS {
unsigned char al, ah, bl, bh;
unsigned char cl, ch, dl, dh;
};
En de WORDREGS-structuur wordt als volgt gedeclareerd:
struct WORDREGS {
unsigned int ax, bx, cx, dx;
unsigned int si, di, cflag, flags;
};
int86- en int86x-functies
Deze functies zijn de algemene 8086 software-interrupt-interfaces die zijn gedefinieerd in dos.h. Registers worden ingesteld op de gewenste waarden en deze functies worden aangeroepen om de MS-DOS-interrupts op te roepen. De declaratie van de int86-functie is als volgt:
int int86(int intno, union REGS *inregs,
union REGS *outregs);
int86x is de variatie van de int86-functie. Het wordt als volgt gedeclareerd:
int int86x(int intno, union REGS *inregs,
union REGS *outregs, struct SREGS *segregs);
Zowel de functies int86 als int86x voeren een 8086 software-interrupt uit die wordt gespecificeerd door het argument intno. Of we kunnen zeggen dat de te genereren interrupt wordt gespecificeerd door intno.
Met de int86x-functie is alleen toegang mogelijk tot ES en DS en niet tot CS en SS, dus u kunt een 8086-software-interrupt oproepen die een waarde van DS heeft die verschilt van het standaardgegevenssegment en/of een argument in ES aanneemt.
Deze functies kopiëren registerwaarden van inregs naar de registers voordat de software-interrupt wordt uitgevoerd. De functie int86x kopieert ook de segregs->ds- en segregs->es-waarden naar de corresponderende registers voordat de software-interrupt wordt uitgevoerd. Met deze functie kunnen programma's die verwijzers of een groot gegevensgeheugenmodel gebruiken, specificeren welk segment moet worden gebruikt voor de software-interrupt.
De functies kopiëren de huidige registerwaarden naar outregs, de status van de carry-vlag naar het x.cflag-veld in outregs en de waarde van het 8086-vlaggenregister naar het x.flags-veld in outregs, nadat de software-interrupt terugkeert. De functie int86x herstelt ook DS en stelt de velden segregs->es en segregs->ds in op de waarden van de corresponderende segmentregisters.
In beide functies kunnen inregs en outregs naar dezelfde structuur verwijzen en beide functies retourneren de waarde van AX na voltooiing van de software-interrupt. Als de carry-vlag is ingesteld, geeft dit meestal aan dat er een fout is opgetreden.
De REGS unie-elementen die in C worden gebruikt, equivalent aan assembler, staan in de onderstaande tabel:
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 |
|
|
Laten we eens kijken naar de voorbeelden van de functies int86 en int86x. Het volgende programma scant elke sector van de diskette en drukt de status van elke sector op het scherm af.
/* Programma om elke sector van de diskette te scannen en de status af te drukken */
#include<dos.h>
#include<conio.h>
void main()
{
int head,track,sector,i;
char *buf;
union REGS inregs, outregs;
struct SREGS sregs;
clrscr();
/// Schijf initialiseren door schijfsysteem te resetten \\\
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");
/* Scan de diskette van 0 tot 79 sporen (totaal aantal sporen 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);
//// De status van de gescande sector afdrukken \\\\
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();
}
Het programma toont het gebruiksvoorbeeld van de functies int86 en int86x. In dit programma initialiseert de int86-functie de schijf door het schijfsysteem te resetten, met behulp van functie 00H van INT 13H. De int86x-functie verifieert elke sector van de floppy (1.44Mb, 3½ floppy disk) van beide kanten, tot 0 tot 79 tracks (totaal 80 tracks) met behulp van de functie 04H van INT 13H.
segread-functie
Deze functie is gedefinieerd in dos.h. Deze functie leest de segmentregisters. De declaratie van de functie is als volgt:
void segread(struct SREGS *segp);
waarbij segread de huidige waarden van de segmentregisters in de structuur *segp plaatst. De functie retourneert niets en de aanroep is bedoeld voor gebruik met intdosx en int86x. laat ons een voorbeeld zien
#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();
}
En de uitvoer van het programma zal ongeveer als volgt zijn:
Current segment register settings
CS: EED DS: 10BA
ES: 10BA SS: 10BA
intdos- en intdosx-functies
Deze functies zijn gedefinieerd in dos.h. Dit zijn de algemene DOS-interrupt-interfaces. De functie intdos roept MS-DOS-serviceregisters aan en vervolgens DX en AL, waar de functie intdosx MS-DOS-service oproept met segmentregisterwaarden.
De verklaring van de functie intdos is als volgt:
int intdos(union REGS *inregs, union REGS *outregs);
and the declaration of intdosx function is as:
int intdosx(union REGS *inregs, union REGS *outregs,
struct SREGS *segregs);
De functies intdos en intdosx voeren DOS-interrupt 0x21 uit om een gespecificeerde DOS-functie aan te roepen. De waarde van inregs->h.ah geeft aan welke DOS-functie moet worden aangeroepen. De functie intdosx kopieert ook de segregs ->ds en segregs ->es waarden in de corresponderende registers voordat de DOS-functie wordt aangeroepen en herstelt vervolgens DS.
Met deze functie van de functies kunnen de programma's die verre pointers of een groot datageheugenmodel gebruiken, specificeren welk segment moet worden gebruikt voor de uitvoering van de functie. Met de intdosx-functie kunt u een DOS-functie aanroepen die een waarde van DS heeft die verschilt van het standaardgegevenssegment en/of een argument in ES aanneemt.
Beide functies retourneren de waarde van AX na voltooiing van de DOS-functieaanroep en als de carry-vlag is ingesteld (outregs -> x.cflag != 0), geeft dit aan dat er een fout is opgetreden.
Na de interrupt 0x21 retourneert de functie de huidige registerwaarden naar outregs, de status van de carry-vlag naar het x.cflag-veld in outregs en de waarde van het 8086-vlaggenregister naar het x.flags-veld in outregs. Zowel inregs als outregs kunnen naar dezelfde structuur verwijzen. Laten we eens kijken naar de voorbeelden van deze functies.
Het voorbeeld van het gebruik van de intdos-functie is hieronder gegeven. Dit programma verkrijgt de geselecteerde informatie over de floppy (1,44Mb, 3½inch floppy disk) diskdrive. Dit programma levert de toewijzingsinformatie van een diskette.
/* De informatie over schijftoewijzing voor schijfgebruik */
#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();
}
En de uitvoer van het programma zal als volgt zijn:
1 sectors/cluster,
1933 clusters,
512 bytes/sector,
2843 total clusters
Laten we nu een voorbeeld bekijken van de functie intdosx. Het volgende voorbeeld toont het gebruik van de intdosx-functie. Het programma voert een string uit naar de standaarduitvoer.
/* Het programma om 'string' naar de standaard uit te voeren uitvoer. */
#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();
}
En de uitvoer van het programma zal als volgt zijn:
this string is not in the default data segment |
Hier drukken we de gegeven string af met de functie intdosx, door functie 09H of INT 21H. Houd er altijd rekening mee dat de gegeven string altijd moet eindigen met het teken “$”.
Het nummer van de fysieke harde schijf weten
Het nummer van de fysieke harde schijf is heel belangrijk en moet exact worden geschreven. De illegale schijfspecificatie kan een groot gegevensverlies veroorzaken. We moeten zeker zijn van het schijfnummer tijdens het programmeren van gegevensherstel of het oplossen van problemen met de schijf. Hoe u het stationsnummer van een schijf met verschillende indelingen van schijven kunt weten, kan worden geschat aan de hand van de volgende voorbeelden.
Volgens een meest algemene mythe worden de nummers van de fysieke stations gegeven op basis van de bijlagestatus van de schijf, maar in sommige of speciale gevallen kan dit afhankelijk zijn van de opstartprocedure van uw besturingssysteem of opstart instellingen.
Het meest algemene idee voor het nummer van de fysieke schijf dat door BIOS wordt geleverd, is hier gegeven, maar zelfs dan moet u bevestigen met behulp van een schijfbewerkingstool of met de programma's die in de volgende hoofdstukken worden gegeven, over de configuratie van de schijf. Nadat u er zeker van bent, moet u een beslissing nemen over het uitvoeren van dergelijke programma's die de gegevens kunnen beschadigen of beschadigen, als ze illegaal of bij gebrek aan kennis worden gebruikt.
In het algemeen geldt dat als de twee schijven zijn aangesloten op het systeem, de ene primaire master is en de andere secundaire master, de eerste voorkeur wordt gegeven aan de primaire master (en vervolgens aan de primaire slave indien beschikbaar) en vervolgens aan de secundaire master ( en vervolgens naar secundaire slaaf, indien beschikbaar, enzovoort) en het fysieke nummer wordt gegeven volgens hun voorkeuren.
Laten we aannemen dat uw systeem maximaal vier harde schijven tegelijk ondersteunt. De vier harde schijven kunnen worden aangesloten zoals aangegeven. Volgende:
Primary Master |
Primary Slave |
Secondary Master |
Secondary Slave |
Laten we nu eens kijken naar enkele gevallen voor het aantal fysieke schijven. Hier neem ik aan dat je de schijven hebt aangesloten met de juiste jumper-instellingen zoals vermeld door de schijffabrikant, en met de juiste Master-Slave-instellingen:
- Als alle vier de harde schijven op het systeem zijn aangesloten: als alle vier de schijven op het systeem zijn aangesloten, zijn de fysieke schijfnummers als volgt:
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. |
- Als er drie harde schijven op het systeem zijn aangesloten: als er drie harde schijven op het systeem zijn aangesloten, zijn de fysieke schijfnummers in overeenstemming met hun bijlagevoorkeuren. De volgende voorbeelden geven enkele van de arrangementen weer:
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. |
- Als er twee harde schijven op het systeem zijn aangesloten: Als er twee harde schijven op het systeem zijn aangesloten, zullen de fysieke schijfnummers overeenkomen met hun bijlagevoorkeuren. Het volgende voorbeeld illustreert het:
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. |
- Als Single Hard Disk op het systeem is aangesloten: hoeft niet te denken, als er maar één schijf beschikbaar is, is het fysieke schijfnummer 80H.
Interrupt 13H (INT 13H), ROM BIOS Disk Driver Functies
De beschrijving van de INT 13H functies is hier gegeven. Deze functies moeten met zorg worden aangeleerd, omdat misbruik van deze functies of gebruik bij gebrek aan zorg of gebrek aan kennis groot verlies van gegevens of vele andere problemen kan veroorzaken. Als ze echter op de juiste en juiste manier worden gebruikt, helpen deze functies de codering van uw programma te minimaliseren en uw programmering eenvoudig en gemakkelijk te maken.
INT 13H (0x13)
Function 00H (0x00) Reset disk system
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
Opmerkingen:
Reset de schijfcontroller, kalibreert de aangesloten schijven opnieuw. De lees-/schrijfarm wordt verplaatst naar cilinder 0 en bereidt zich voor op de schijf-I/O.
Deze functie moet worden aangeroepen na een lees-, schrijf-, verificatie- of formatteerverzoek van een floppydisk voordat u de bewerking opnieuw probeert. Als de functie wordt aangeroepen met een vaste schijf (d.w.z. door DL>=80H te selecteren), worden de floppydiskcontroller en vervolgens de vaste schijfcontroller gereset.
INT 13H (0x13)
Function 01H (0x01) Get disk system status
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).
Opmerkingen:
Geeft de status van de meest recente schijfbewerking terug
INT 13H (0x13)
Function 02H (0x02) Read sector
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 of buffer
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Opmerkingen:
Deze functie leest een of meer sectoren van de schijf naar het geheugen. Op vaste schijven worden de bovenste 2 bits van het 10-bits cilindernummer in de bovenste 2 bits van register CL geplaatst.
INT 13H (0x13)
Function 03H (0x03) Write sector
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
Opmerkingen:
Deze functie schrijft een of meer sectoren van het geheugen naar de schijf. Op vaste schijven worden de bovenste 2 bits van het 10-bits cilindernummer in de bovenste 2 bits van register CL geplaatst.
INT 13H (0x13)
Function 04H (0x04) >> Verify sector
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
Opmerkingen:
Deze functie verifieert de adresvelden van een of meer sectoren. Bij deze bewerking worden geen gegevens naar of uit het geheugen overgedragen. Op vaste schijven worden de bovenste 2 bits van het 10-bits cilindernummer in de bovenste 2 bits van register CL geplaatst.
Deze functie kan worden gebruikt om te testen of een leesbaar medium zich in een diskettestation bevindt. Het aanvragende programma moet het diskettesysteem resetten (INT 13H Functie 00H) en de handeling drie keer opnieuw proberen alvorens aan te nemen dat er geen leesbare diskette aanwezig is. Het wordt aanbevolen bij de meeste floppy-initialisatiebewerkingen.
INT 13H (0x13)
Function 05H (0x05) >> Format track
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)
Opmerkingen:
Initialiseer de schijfsector en volgt adresvelden op de opgegeven track. Op diskettes bestaat de adresveldlijst uit een reeks van 4-byte-items, één item per sector. Het formaat is gegeven in de volgende tabel.
Op vaste schijven worden de bovenste 2-bits van het 10-bits cilindernummer in de bovenste 2 bits van register CL geplaatst.
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)
Function 06H (0x06) >> Format bad track
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
Opmerkingen:
Deze functie is alleen gedefinieerd voor vaste schijven van PC/XT. Het initialiseert een track, schrijft schijfadresvelden en datasectoren en stelt slechte sectorvlaggen in.
INT 13H (0x13)
Function 07H (0x07) >> Format drive
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)
Opmerkingen:
Deze functie is alleen gedefinieerd voor vaste schijven van PC/XT. Het formatteert de hele schijf, schrijft schijfadresvelden en gegevenssectoren, beginnend bij de opgegeven cilinder.
INT 13H (0x13)
Function 08H (0x08) >> Get drive parameters
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
Opmerkingen:
Deze functie retourneert verschillende parameters voor de opgegeven drive. De waarde die wordt geretourneerd in register DL geeft het werkelijke aantal fysieke schijven weer dat is aangesloten op de adapter voor de gevraagde schijf.
INT 13H (0x13)
Function 09H (0x09) >> Initialize fixed disk characteristics
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
Opmerkingen:
Deze functie initialiseert de vaste schijfcontroller voor daaropvolgende I/O-bewerkingen, met gebruik van de waarden in de ROM BIOS schijfparameterblok(ken). De functie wordt alleen ondersteund op vaste schijf. Het parameterblokformaat voor vaste PC- en PC/XT-schijven is als volgt:
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 |
Het parameterblokformaat voor vaste PC/AT- en PS/2-schijven is als volgt:
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)
Function 0A H (0x0A or 10) >> Read sector long
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
Opmerkingen:
Deze functie leest een sector of sectoren van de schijf in het geheugen samen met een 4 byte Error Correcting Code (ECC) code voor elke sector. In tegenstelling tot de normale functie Read sector (INT 13H (0x13) Function 02H), worden ECC-fouten niet automatisch gecorrigeerd. Overdrachten met meerdere sectoren worden beëindigd na elke sector met een leesfout.
Deze functie wordt alleen ondersteund op vaste schijven. De bovenste 2 bits van het 10-bits cilindernummer worden in de bovenste 2 bits van register CL geplaatst.
INT 13H (0x13)
Function 0BH (0x0B or 11) >> Write sector long
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
Opmerkingen:
Deze functie schrijft (een) sector(en) van geheugen naar schijf. De gegevens van elke sector moeten worden gevolgd door de ECC-code van 4 bytes. De bovenste 2 bits van het 10-bits cilindernummer worden in de bovenste 2 bits van register CL geplaatst. Deze functie wordt alleen ondersteund op vaste schijven.
INT 13H (0x13)
Function 0CH (0x0C or 12) >> Seek
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
Opmerkingen:
Deze functie plaatst de lees-/schrijfkoppen van de schijf op de opgegeven cilinder zonder gegevens over te dragen. De bovenste 2 bits van het cilindernummer worden in de bovenste 2 bits van register CL geplaatst. Deze functie wordt alleen ondersteund op vaste schijven.
INT 13H (0x13)
Function 0DH (0x0D or 13) >> Reset fixed disk system
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)
Opmerkingen:
Deze functie stelt de vaste schijfcontroller opnieuw in, kalibreert aangesloten schijven opnieuw, verplaatst de lees-/schrijfarm naar cilinder 0 en bereidt de volgende schijf-I/O voor.
INT 13H (0x13)
Function 0EH (0x0E or 14) >> Read sector buffer
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
Opmerkingen:
Deze functie brengt de inhoud van de interne sectorbuffer van de vaste schijfadapter over naar het systeemgeheugen. Er worden geen gegevens van de fysieke schijf gelezen.
INT 13H (0x13)
Function 0FH (0x0F or 15) >> Write sector buffer
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
Opmerkingen:
Deze functie draagt gegevens over van het systeemgeheugen naar de interne sectorbuffer van de vaste adapter. Er worden geen gegevens naar de fysieke schijf geschreven. Deze functie moet worden aangeroepen om de inhoud van de sectorbuffer te initialiseren voordat de schijf wordt geformatteerd met INT 13H-functie 05H.
INT 13H (0x13)
Function 10H (0x10 or 16) >> Get drive status
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
Opmerkingen:
Deze functie test of de gespecificeerde vaste schijf werkt en geeft de status van de schijf terug. Deze functie wordt alleen ondersteund op vaste schijven.
INT 13H (0x13)
Function 11H (0x11 or 17) >> Recalibrate drive
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
Opmerkingen:
Deze functie zorgt ervoor dat de vaste schijfadapter zichzelf opnieuw kalibreert voor de opgegeven schijf, de lees-/schrijfarm naar cilinder 0 positioneert en de status van de schijf terugstuurt. Deze functie wordt alleen ondersteund op vaste schijven.
INT 13H (0x13)
Function 12H (0x12 or 18) >> Controller RAM
diagnostic
Call with:AH = 12H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Opmerkingen:
Deze functie zorgt ervoor dat de vaste schijfadapter een ingebouwde diagnostische test uitvoert op de interne sectorbuffer, om aan te geven of de test is geslaagd met de geretourneerde status.
INT 13H (0x13)
Function 13H (0x13 or 19) >> Controller drive diagnostic
Call with:AH = 13H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Opmerkingen:
Deze functie zorgt ervoor dat de vaste adapter interne diagnostische tests van de aangesloten schijf uitvoert, om aan te geven of de test door de geretourneerde status is geslaagd.
INT 13H (0x13)
Function 14H (0x14 or 20) >> Controller internal
diagnostic
Call with:AH = 14H
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Opmerkingen:
Deze functie zorgt ervoor dat de vaste schijfadapter een ingebouwde diagnostische zelftest uitvoert om aan te geven of de test door de geretourneerde status is geslaagd.
INT 13H (0x13)
Function 15H (0x15 or 21) >> Get disk type
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
Opmerkingen:
Deze functie retourneert een code die het type diskette of vaste schijf aangeeft waarnaar wordt verwezen door de opgegeven stationscode.
INT 13H (0x13)
Function 16H (0x16 or 22) >> Get disk change
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
Opmerkingen:
Deze functie retourneert de status van de wijzigingsregel en geeft aan of de schijf in de drive mogelijk is vervangen sinds de laatste schijftoegang. Als deze functie terugkeert terwijl de carry-vlag is ingesteld, is de schijf niet noodzakelijkerwijs gewijzigd en kan de wijzigingsregel worden geactiveerd door eenvoudig de klep van het schijfstation te ontgrendelen en te vergrendelen zonder de floppydisk te verwijderen.
INT 13H (0x13)
Function 17H (0x17 or 23) >> Set disk type
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
Opmerkingen:
Deze functie selecteert een diskettetype voor de gespecificeerde drive.
INT 13H (0x13)
Function 18H (0x18 or 24) >> Set media type for format
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
Opmerkingen:
Deze functie selecteert mediakenmerken voor de gespecificeerde drive, daarom moet er een diskette in de drive aanwezig zijn.
INT 13H (0x13)
Function 19H (0x19 or 25) >> Park heads
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
Opmerkingen:
Deze functie verplaatst de lees-/schrijfarm naar een track die niet wordt gebruikt voor gegevensopslag, zodat de gegevens niet worden beschadigd wanneer de drive wordt uitgeschakeld.
INT 13H (0x13)
Function 1AH (0x1A or 26) >> Format ESDI drive
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)
Opmerkingen:
Deze functie initialiseert schijfsector- en trackadresvelden op een drive die is aangesloten op de ESDI Fixed Disk Drive Adapter.
De werking van deze functie wordt een indeling op laag niveau genoemd en bereidt de schijf voor op fysieke lees-/schrijfbewerkingen op sectorniveau. De schijf moet vervolgens worden gepartitioneerd met het FDISK-commando en vervolgens een high-level formaat krijgen met het FORMAT-commando om een bestandssysteem te installeren.
Pagina aangepast op: 12/01/2022