Chapitre – 8
Fonctions Disk-BIOS et gestion des interruptions avec C
Introduction
Dans ce chapitre, nous discuterons des fonctions importantes du Disk-BIOS et d'autres fonctions importantes qui nous donnent la liberté d'utiliser et de gérer les interruptions dans notre programme avec C, avec la méthode simple et courte. Ces fonctions sont le dos – os de la programmation de récupération de données et de dépannage de disque. Ce sont ces fonctions qui font du langage C un “High – Langage d'assemblage de niveau ”.
Fonctions biosdisk et _bios_disk
Ces deux fonctions sont les plus importantes pour notre objectif de programmation de récupération de données et de dépannage de disque. Nous utiliserons ces fonctions la plupart du temps.
Ces deux sont les services de lecteur de disque du BIOS et ont été définis dans bios.h où biosdisk fonctionne en dessous du niveau des fichiers sur les secteurs bruts. Si ces fonctions sont utilisées même avec un peu de négligence, cela peut détruire le contenu des fichiers et des répertoires sur un disque dur. Les fonctions biosdisk et _bios_disk utilisent l'interruption 0x13 pour envoyer des opérations de disque directement au BIOS. La fonction _bios_disk est déclarée dans le programme de la manière suivante :
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);
La signification de ces paramètres a été décrite dans le tableau suivant :
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 |
Dans ces deux fonctions, les données sont lues et écrites à partir du tampon à 512 octets par secteur qui est la taille logique du secteur d'un disque dur et la valeur renvoyée par les deux fonctions est la valeur du registre AX défini par l'appel BIOS INT 0x13H.
Si la fonction réussit, l'octet de poids fort = 0, cela signifie que l'exécution a réussi et l'octet de poids faible contient le nombre de secteurs lus, écrits ou vérifiés, etc.
Mais s'il y a une erreur et que la fonction échoue, la valeur de High byte sera l'un des codes d'erreur suivants qui sont décrits dans le tableau suivant :
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 |
Le tableau ci-dessous représente les commandes d'opération à exécuter par le paramètre cmd. Tout d'abord, nous verrons les opérations communes des deux fonctions.
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 |
Bien que vous soyez libre d'utiliser soit cmd = 0, 1, 2, 3, 4,5 ou cmd = _DISK_RESET, _DISK_STATUS, _DISK_READ, _DISK_WRITE, _DISK_VARIFY, _DISK_FORMAT et les deux options ont le même effet, mais il est recommandé que vous devriez ont l'habitude d'utiliser des options de mots telles que cmd = _DISK_FORMAT au lieu de cmd = 5 car cela peut vous aider à éviter les erreurs qui peuvent survenir si vous avez tapé un mauvais numéro de commande pour cmd.
Dans la déclaration de la fonction biosdisk ou _bios_disk, si nous donnons cmd = _DISK_RESET, la fonction réinitialise le système de disque en ignorant tous les autres paramètres et _DISK_STATUS renvoie l'état de la dernière opération de disque, en ignorant tous les autres paramètres
Pour cmd =_DISK_READ, _DISK_WRITE ou _DISK_VERIFY (2, 3 ou 4), les fonctions biosdisk et _bios_disk utilisent également d'autres paramètres indiqués ci-dessous :
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 |
Si la valeur de cmd est = 5 (_DISK_FORMAT), biosdisk et _bios_disk utilisent les paramètres suivants selon la description dans le tableau. Il est toujours recommandé que vous soyez prudent lorsque vous utilisez _DISK_FORMAT et que vous sachiez ce que vous allez faire. Un manque de connaissances ou même une petite erreur peut vous faire faire face à une grosse perte de données.
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 |
Certaines valeurs supplémentaires de cmd ne sont utilisées que par les fonctions du biosdisk. Ces valeurs de cmd ne sont autorisées que pour les XT, AT, PS/2 et compatibles. Les valeurs ont été décrites dans le tableau ci-dessous :
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 |
Structure de diskinfo_t
La structure diskinfo_t est utilisée par la fonction _bios_disk. La description de la structure est la suivante :
struct diskinfo_t {
unsigned drive, head, track, sector, nsectors;
void far *buffer;
};
Où lecteur spécifie le lecteur de disque à utiliser. Rappelez-vous toujours que pour les disques durs, le lecteur physique est spécifié, pas la partition de disque. Si vous souhaitez utiliser des partitions, le programme d'application doit également interpréter lui-même les informations de la table de partition de ce disque.
La valeur de head, track et sector spécifie l'emplacement du secteur de départ pour l'opération. nsectors spécifie le nombre de secteurs à lire ou à écrire et buffer pointe vers le tampon où les données sont lues et écrites. Selon la valeur de cmd, les autres paramètres de la structure diskinfo_t peuvent être nécessaires ou non.
La valeur pour la spécification du lecteur de disque à utiliser dans les fonctions biosdisk et _bios_disk a été donnée dans le tableau suivant :
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) |
Assez de théorie ! Voyons maintenant quelques choses pratiques et quelques exemples de ces fonctions. L'exemple suivant lit les secteurs des deux côtés de quatre pistes de la disquette et stocke le contenu dans le fichier, spécifié par l'utilisateur. Peu importe si vous avez supprimé les fichiers de votre disque car le programme lit directement la surface du disque.
Pour voir les données supprimées, il est préférable de prendre une disquette entièrement formatée et de copier certains fichiers texte tels que le codage de vos programmes .c ou d'autres fichiers texte (afin que vous puissiez comprendre le contenu des fichiers) occupant environ 73 Ko (données stockées dans quatre pistes, deux côtés et 18 secteurs dans chaque piste. Chaque secteur est de 512 octets). Le programme a été développé pour illustrer l'exemple. Cependant, vous pouvez le modifier et le développer pour qu'il soit prêt à récupérer des données.
/* Programme pour lire 4 pistes (0, 1, 2 et 3) d'une disquette et écrire le contenu dans le fichier spécifié */
#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();
/// Vérifiez si le lecteur est prêt ou non \\\
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();
}
/* Obtenir le nom du fichier pour stocker les données des Secteurs de
le disque */
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 */
/// Afficher le statut \\\
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);
/// Lire les secteurs spécifiés \\\
result = _bios_disk(_DISK_READ, &dinfo);
/// Stocke le contenu dans le fichier spécifié \\\
if ((result & 0xff00) == 0)
{
for(i=0;i<512;i++)
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/* Imprimer le message d'erreur à l'écran et dans le fichier pour une erreur lors de la lecture d'un secteur */
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);
}
L'exemple montre l'utilisation des fonctions biosdisk et _bios_disk. La fonction biosdisk vérifie si le disque est prêt ou non et la marque d'adresse est trouvée. La fonction _bios_disk lit les secteurs des deux côtés jusqu'à quatre pistes.
La séquence de lecture (ou d'écriture) à la surface du disque doit être la suivante :
Fonctions absread et abswrite
Ces fonctions ont été définies dans Dos.h. La fonction absread lit les secteurs de disque absolus et la fonction abswrite écrit les secteurs de disque absolus. La fonction absread utilise l'interruption DOS 0x25 pour lire des secteurs de disque spécifiques et la fonction abswrite utilise l'interruption DOS 0x26 pour écrire des secteurs de disque spécifiques.
Les opérations de lecture ou d'écriture absolues se déroulent de manière séquentielle en incrémentant le(s) secteur(s) pas à pas et sont complètement libres des numéros de tête et de piste, etc. c'est le travail du BIOS de l'ordinateur de traduire les secteurs absolus en secteurs respectifs numéros de piste, de chef et de secteur.
Les opérations de lecture et d'écriture absolues sont recommandées dans de tels programmes où nous allons effectuer une opération de lecture/écriture sur l'intégralité du disque et nous voulons éviter un codage et une boucle supplémentaires dans notre programme pour augmenter la vitesse du programme au plus rapide.
Les deux fonctions absread et abswrite ignorent la structure logique d'un disque et ne prêtent aucune attention aux fichiers, aux FAT ou aux répertoires. Ces fonctions effectuent directement des opérations de lecture et d'écriture absolues sur la surface du disque. C'est la raison pour laquelle, si elle est utilisée de manière incorrecte, abswrite peut écraser des fichiers, des répertoires et des FAT.
La déclaration de la fonction absread est la suivante :
int absread(int drive, int nsects, long lsect,
void *buffer);
et la fonction abswrite est déclarée comme suit :
int abswrite(int drive, int nsects, long lsect,
void *buffer);
Où la signification des paramètres est la suivante :
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) |
En cas de succès, les deux fonctions renvoient 0. En cas d'erreur, les deux renvoient -1 et définissent le numéro d'erreur. à la valeur du registre AX renvoyé par l'appel système.
Le nombre de secteurs pour une opération de lecture ou d'écriture est limité à 64 Ko ou à la taille du tampon, selon la valeur la plus petite. Cependant nous apprendrons l'utilisation de la mémoire Huge dans les prochains chapitres pour dépasser la limite mémoire de 64K, pour développer un programme très rapide.
|
Gestion des interruptions avec C
Le C est parfois appelé un langage d'assemblage de haut niveau car il peut appeler les différentes interruptions en utilisant certaines de ses fonctions définies. Certaines fonctions importantes sont les suivantes :
- int86 : Invoque des interruptions MS-DOS.
- int86x : appelle une interruption MS-DOS avec des valeurs de registre de segment.
- intdos : invoque le service MS-DOS en utilisant des registres autres que DX et AL
- intdosx : invoque le service MS-DOS avec des valeurs de registre de segment.
- segread : lit les registres de segment
Nous discuterons de ces fonctions en détail. Tout d'abord, nous discutons de certaines structures et unions prédéfinies qui sont fréquemment ou nécessairement utilisées avec ces fonctions.
Structure SREGS
Cette structure a été définie dans dos.h et c'est une structure des registres de segments passés et remplis par les fonctions, int86x, intdosx et segread. La déclaration de la structure est la suivante :
struct SREGS {
unsigned int es;
unsigned int cs;
unsigned int ss;
unsigned int ds;
};
Syndicat REGS
REGS est l'union de deux structures. L'union REGS a été définie dos.h et est utilisée pour transmettre des informations vers et depuis les fonctions, int86, int86x, intdos et intdosx. La déclaration de l'union est la suivante :
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
Structures BYTEREGS et WORDREGS
Les structures BYTEREGES et WORDREGS ont été définies dans dos.h et sont utilisées pour stocker les registres d'octets et de mots. La structure WORREGS permet à l'utilisateur d'accéder aux registres du CPU sous forme de grandeurs 16 bits où la structure BYTEREGES donne accès aux registres individuels 8 bits.
La structure BITEREGS est déclarée comme suit :
struct BYTEREGS {
unsigned char al, ah, bl, bh;
unsigned char cl, ch, dl, dh;
};
Et la structure WORDREGS est déclarée comme suit :
struct WORDREGS {
unsigned int ax, bx, cx, dx;
unsigned int si, di, cflag, flags;
};
fonctions int86 et int86x
Ces fonctions sont les interfaces générales d'interruption logicielle 8086 définies dans dos.h. Les registres sont définis sur les valeurs souhaitées et ces fonctions sont appelées pour invoquer les interruptions MS-DOS. La déclaration de la fonction int86 est la suivante :
int int86(int intno, union REGS *inregs,
union REGS *outregs);
int86x est la variation de la fonction int86. Il est déclaré comme suit :
int int86x(int intno, union REGS *inregs,
union REGS *outregs, struct SREGS *segregs);
Les fonctions int86 et int86x exécutent toutes deux une interruption logicielle 8086 spécifiée par l'argument intno Ou nous pouvons dire que l'interruption à générer est spécifiée par intno.
Avec la fonction int86x, l'accès n'est possible qu'à ES et DS et non à CS et SS, vous pouvez donc invoquer une interruption logicielle 8086 qui prend une valeur de DS différente du segment de données par défaut et/ou prend un argument dans ES.
Ces fonctions copient les valeurs de registre d'inregs dans les registres avant l'exécution de l'interruption logicielle. La fonction int86x copie également les valeurs segregs->ds et segregs->es dans les registres correspondants avant d'exécuter l'interruption logicielle. Cette fonctionnalité permet aux programmes qui utilisent des pointeurs lointains ou un grand modèle de mémoire de données de spécifier quel segment doit être utilisé pour l'interruption logicielle.
Les fonctions copient les valeurs de registre actuelles dans outregs, l'état du drapeau de retenue dans le champ x.cflag dans outregs et la valeur du registre des drapeaux 8086 dans le champ x.flags dans outregs, après le retour de l'interruption logicielle. La fonction int86x restaure également DS et définit les champs segregs-> es et segregs-> ds sur les valeurs des registres de segment correspondants.
Dans les deux fonctions, inregs et outregs peuvent pointer vers la même structure et les deux fonctions renvoient la valeur de AX après la fin de l'interruption logicielle. Si l'indicateur de retenue est défini, cela indique généralement qu'une erreur s'est produite.
Les éléments d'union REGS utilisés en C, équivalents au langage d'assemblage, ont été dans le tableau ci-dessous :
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 |
|
|
Voyons les exemples de fonctions int86 et int86x. Le programme suivant analyse chaque secteur de la disquette et imprime l'état de chaque secteur à l'écran.
/* Programme pour analyser chaque secteur de la disquette et imprimer l'état */
#include<dos.h>
#include<conio.h>
void main()
{
int head,track,sector,i;
char *buf;
union REGS inregs, outregs;
struct SREGS sregs;
clrscr();
/// Initialisation du disque en réinitialisant le système de disque \\\
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");
/* Scannez la disquette de 0 à 79 pistes (Total Tracks 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);
//// Imprimer l'état du secteur scanné \\\\
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();
}
Le programme montre l'exemple d'utilisation des fonctions int86 et int86x. Dans ce programme, la fonction int86 initialise le disque en réinitialisant le système de disque, en utilisant la fonction 00H de INT 13H. La fonction int86x vérifie chaque secteur de la disquette (disquette 1.44Mb, 3½) des deux côtés, jusqu'à 0 à 79 pistes (total 80 pistes) en utilisant la fonction 04H de INT 13H.
fonction segread
Cette fonction a été définie dans dos.h. Cette fonction lit les registres de segments. La déclaration de la fonction est la suivante :
void segread(struct SREGS *segp);
où segread place les valeurs actuelles des registres de segment dans la structure *segp. Rien n'est renvoyé par la fonction et l'appel est destiné à être utilisé avec intdosx et int86x. voyons un exemple
#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();
}
Et la sortie du programme ressemblera à ceci :
Current segment register settings
CS: EED DS: 10BA
ES: 10BA SS: 10BA
Fonctions intdos et intdosx
Ces fonctions ont été définies dans dos.h. Ce sont les interfaces d'interruption DOS générales. La fonction intdos appelle les registres de service MS-DOS puis DX et AL où la fonction intdosx appelle le service MS-DOS avec des valeurs de registre de segment.
La déclaration de la fonction intdos est la suivante :
int intdos(union REGS *inregs, union REGS *outregs);
et la déclaration de la fonction intdosx est la suivante :
int intdosx(union REGS *inregs, union REGS *outregs,
struct SREGS *segregs);
Les fonctions intdos et intdosx exécutent l'interruption DOS 0x21 pour invoquer une fonction DOS spécifiée. La valeur de inregs->h.ah spécifie la fonction DOS à invoquer. La fonction intdosx copie également les valeurs segregs ->ds et segregs ->es dans les registres correspondants avant d'invoquer la fonction DOS, puis restaure DS.
Cette caractéristique des fonctions permet aux programmes qui utilisent des pointeurs lointains ou un grand modèle de mémoire de données de spécifier quel segment doit être utilisé pour l'exécution de la fonction. Avec la fonction intdosx, vous pouvez invoquer une fonction DOS qui prend une valeur de DS différente du segment de données par défaut et/ou prend un argument dans ES.
Les deux fonctions renvoient la valeur de AX après la fin de l'appel de la fonction DOS et si l'indicateur de report est défini (outregs -> x.cflag != 0), cela indique qu'une erreur s'est produite.
Après le retour de l'interruption 0x21, les fonctions copient les valeurs du registre actuel dans outregs, l'état du drapeau de report dans le champ x.cflag dans outregs et la valeur du registre des drapeaux 8086 dans le champ x.flags dans outregs. Les inregs et les outregs peuvent pointer vers la même structure. Voyons les exemples de ces fonctions.
L'exemple d'utilisation de la fonction intdos a été donné ci-dessous. Ce programme obtient les informations sélectionnées sur le lecteur de disquette (disquette 1,44 Mo, 3½ pouces). Ce programme fournit les informations d'allocation d'une disquette.
/* Obtenir les informations d'allocation de lecteur pour l'utilisation du disque */
#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();
}
Et la sortie du programme ressemblera à ceci :
1 sectors/cluster,
1933 clusters,
512 bytes/sector,
2843 total clusters
Voyons maintenant un exemple de la fonction intdosx. L'exemple suivant montre l'utilisation de la fonction intdosx. Le programme sort une chaîne sur la sortie standard.
/* Le programme pour sortir 'string' au format standard
sortir. */
#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();
}
Et la sortie du programme sera la suivante :
this string is not in the default data segment |
Ici, nous imprimons la chaîne donnée avec la fonction intdosx, par la fonction 09H de INT 21H. Il faut toujours garder à l'esprit que la chaîne donnée doit toujours se terminer par le caractère “$”.
Comment connaître le numéro de disque dur physique
Le numéro de disque dur physique est une chose très importante et doit être écrit avec précision. La spécification de lecteur illégale peut entraîner une perte de données majeure. Nous devons être sûrs du numéro de lecteur lors de la programmation de la récupération des données ou du dépannage du disque. Comment connaître le numéro de lecteur de n'importe quel disque avec différentes dispositions de disques peut être estimé par les exemples donnés ci-après.
Selon un mythe le plus généralisé, les numéros de lecteur physique sont fournis en fonction de l'état de connexion du disque, mais dans certains cas particuliers, cela peut dépendre de la procédure de démarrage de votre système d'exploitation ou paramètres de démarrage.
L'idée la plus généralisée pour le numéro de lecteur physique fourni par le BIOS a été donnée ici mais même dans ce cas, vous devez confirmer à l'aide de n'importe quel outil d'édition de disque ou avec les programmes donnés dans les chapitres suivants, sur la configuration du disque. Après vous être assuré, vous devez prendre toute décision concernant l'exécution de tels programmes susceptibles de corrompre ou d'endommager les données, s'ils sont utilisés illégalement ou par manque de connaissances.
Généralement, si les deux disques sont connectés au système, l'un est le maître principal et l'autre le maître secondaire, la première préférence sera donnée au maître principal (puis à l'esclave principal si disponible) puis au maître secondaire ( puis à l'esclave secondaire si disponible et ainsi de suite) et le numéro physique sera donné en fonction de leurs préférences.
Supposons que votre système prend en charge un maximum de quatre disques durs à la fois. Les quatre disques durs peuvent être connectés comme indiqué Suivant :
Primary Master |
Primary Slave |
Secondary Master |
Secondary Slave |
Examinons maintenant quelques cas de nombre de disques physiques. Ici, je suppose que vous avez connecté les disques avec les paramètres de cavalier appropriés, comme indiqué par le fabricant du disque, et dans les paramètres maître-esclave appropriés :
- Si les quatre disques durs sont connectés au système : si les quatre disques sont connectés au système, les numéros de lecteur physique seront les suivants :
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. |
- Si trois disques durs sont connectés au système : si trois disques durs sont connectés au système, les numéros de lecteur physique seront les mêmes en fonction de leurs préférences de connexion. Les exemples suivants illustrent certaines des dispositions :
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. |
- Si deux disques durs sont connectés au système : De même, si deux disques durs sont connectés au système, les numéros de lecteur physique seront les mêmes en fonction de leurs préférences de connexion. L'exemple suivant l'illustre :
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. |
- Si un disque dur unique est connecté au système : inutile de penser que s'il n'y a qu'un seul disque disponible, le numéro de lecteur physique sera 80H.
Interruption 13H (INT 13H), Fonctions du pilote de disque BIOS ROM
La description des fonctions INT 13H a été donnée ici. Ces fonctions doivent être apprises avec précaution, car une mauvaise utilisation de ces fonctions ou une utilisation par manque de soin ou par manque de connaissances, peut entraîner de grosses pertes de données ou de nombreux autres problèmes. Cependant, si elles sont utilisées de manière appropriée et appropriée, ces fonctions aident à minimiser le codage de votre programme et à rendre votre programmation simple et facile ainsi que.
INT 13H (0x13)
Fonction 00H (0x00) Réinitialiser le système de disque
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
Commentaires :
Réinitialisez le contrôleur de disque, recalibrez ses disques connectés. Le bras de lecture/écriture est déplacé vers le cylindre 0 et se prépare pour les E/S de disque.
Cette fonction doit être appelée après l'échec d'une demande de lecture, d'écriture, de vérification ou de formatage de disquette avant de réessayer l'opération. Si la fonction est appelée avec un lecteur de disque fixe (c'est-à-dire en sélectionnant DL>=80H), le contrôleur de disquette puis le contrôleur de disque fixe sont réinitialisés.
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).
Commentaires :
Renvoie l'état de l'opération de disque la plus récente
INT 13H (0x13)
Fonction 02H (0x02) Lire le secteur
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 : décalage du tampon
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Commentaires :
Cette fonction lit un ou plusieurs secteurs du disque dans la mémoire. Sur les disques fixes, les 2 bits supérieurs du numéro de cylindre 10 bits sont placés dans les 2 bits supérieurs du registre CL.
INT 13H (0x13)
Fonction 03H (0x03) Secteur d'écriture
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
Commentaires :
Cette fonction écrit un ou plusieurs secteurs de la mémoire sur le disque. Sur les disques fixes, les 2 bits supérieurs du numéro de cylindre à 10 bits sont placés dans les 2 bits supérieurs du registre CL.
INT 13H (0x13)
Fonction 04H (0x04) >> Vérifier le secteur
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
Commentaires :
Cette fonction vérifie les champs d'adresse d'un ou plusieurs secteurs. Aucune donnée n'est transférée vers ou depuis la mémoire par cette opération. Sur les disques fixes, les 2 bits supérieurs du numéro de cylindre à 10 bits sont placés dans les 2 bits supérieurs du registre CL.
Cette fonction peut être utilisée pour tester si un support lisible se trouve dans un lecteur de disquette. Le programme demandeur doit réinitialiser le système de disquette (INT 13H Fonction 00H) et réessayer l'opération trois fois avant de supposer qu'il n'y a pas de disquette lisible. Il est recommandé dans la plupart des opérations d'initialisation de disquette.
INT 13H (0x13)
Fonction 05H (0x05) >> Format piste
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)
Commentaires :
Initialise le secteur du disque et les champs d'adresse des pistes sur la piste spécifiée. Sur les disquettes, la liste des champs d'adresse consiste en une série d'entrées de 4 octets, une entrée par secteur. Le format a été donné dans le tableau suivant.
Sur les disques fixes, les 2 bits supérieurs du numéro de cylindre de 10 bits sont placés dans les 2 bits supérieurs du registre CL.
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)
Fonction 06H (0x06) >> Formater la mauvaise piste
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
Commentaires :
Cette fonction est définie pour les lecteurs de disque fixe PC/XT uniquement. Il initialise une piste, écrit les champs d'adresse du disque et les secteurs de données et définit les indicateurs de secteur défectueux.
INT 13H (0x13)
Fonction 07H (0x07) >> Formater le lecteur
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)
Commentaires :
Cette fonction est définie pour les lecteurs de disque fixe PC/XT uniquement. Il formate l'intégralité du lecteur, en écrivant les champs d'adresse du disque et les secteurs de données, en commençant par le cylindre spécifié.
INT 13H (0x13)
Fonction 08H (0x08) >> Obtenir les paramètres du variateur
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
Commentaires :
Cette fonction renvoie divers paramètres pour le lecteur spécifié. La valeur renvoyée dans le registre DL reflète le nombre réel de disques physiques connectés à l'adaptateur pour le disque demandé.
INT 13H (0x13)
Fonction 09H (0x09) >> Initialiser les caractéristiques fixes du disque
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
Commentaires :
Cette fonction initialise le contrôleur de disque fixe pour les opérations d'E/S suivantes, en utilisant les valeurs trouvées dans le(s) bloc(s) de paramètres du disque BIOS ROM. La fonction est prise en charge uniquement sur disque fixe. Le format du bloc de paramètres pour les disques fixes PC et PC/XT est le suivant :
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 |
Le format de bloc de paramètres pour les disques fixes PC/AT et PS/2 est le suivant :
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)
Fonction 0A H (0x0A ou 10) >> Lire secteur 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
Commentaires :
Cette fonction lit un secteur ou des secteurs du disque dans la mémoire avec un code de correction d'erreur (ECC) de 4 octets pour chaque secteur. Contrairement à la fonction de lecture de secteur normale (INT 13H (0x13) Fonction 02H), les erreurs ECC ne sont pas automatiquement corrigées. Les transferts multi-secteurs sont terminés après tout secteur avec une erreur de lecture.
Cette fonction n'est prise en charge que sur les disques fixes. Les 2 bits supérieurs du numéro de cylindre 10 bits sont placés dans les 2 bits supérieurs du registre CL.
INT 13H (0x13)
Fonction 0BH (0x0B ou 11) >> Écrire un secteur 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
Commentaires :
Cette fonction écrit un ou plusieurs secteurs de la mémoire sur le disque. Chaque secteur de données doit être suivi de son code ECC à 4 octets. Les 2 bits supérieurs du numéro de cylindre à 10 bits sont placés dans les 2 bits supérieurs du registre CL. Cette fonction n'est prise en charge que sur les disques fixes.
INT 13H (0x13)
Fonction 0CH (0x0C ou 12) >> Chercher
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
Commentaires :
Cette fonction positionne les têtes de lecture/écriture du disque sur le cylindre spécifié sans transférer de données. Les 2 bits supérieurs du numéro de cylindre sont placés dans les 2 bits supérieurs du registre CL. Cette fonction n'est prise en charge que sur les disques fixes.
INT 13H (0x13)
Fonction 0DH (0x0D ou 13) >> Réinitialiser le système de disque fixe
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)
Commentaires :
Cette fonction réinitialise le contrôleur de disque fixe, recalibre les disques connectés, déplace le bras de lecture/écriture vers le cylindre 0 et prépare les E/S de disque suivantes.
INT 13H (0x13)
Fonction 0EH (0x0E ou 14) >> Lire le tampon de secteur
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
Commentaires :
Cette fonction transfère le contenu du tampon de secteur interne de l'adaptateur de disque fixe vers la mémoire système. Aucune donnée n'est lue à partir du lecteur de disque physique.
INT 13H (0x13)
Fonction 0FH (0x0F ou 15) >> Écrire le tampon de secteur
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
Commentaires :
Cette fonction transfère les données de la mémoire système vers la mémoire tampon du secteur interne de l'adaptateur fixe. Aucune donnée n'est écrite sur le lecteur de disque physique. Cette fonction doit être appelée pour initialiser le contenu du tampon de secteur avant de formater le lecteur avec INT 13H Fonction 05H.
INT 13H (0x13)
Fonction 10H (0x10 ou 16) >> Obtenir l'état du lecteur
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
Commentaires :
Cette fonction teste si le lecteur de disque fixe spécifié est opérationnel et renvoie l'état du lecteur. Cette fonction n'est prise en charge que sur les disques fixes.
INT 13H (0x13)
Fonction 11H (0x11 ou 17) >> Recalibrer le lecteur
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
Commentaires :
Cette fonction entraîne le recalibrage de l'adaptateur de disque fixe pour le lecteur spécifié, positionne le bras de lecture/écriture sur le cylindre 0 et renvoie l'état du lecteur. Cette fonction n'est prise en charge que sur les disques fixes.
INT 13H (0x13)
Fonction 12H (0x12 ou 18) >> RAM contrôleur
diagnostic
Appeler avec :AH = 12H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Commentaires :
Cette fonction amène l'adaptateur de disque fixe à effectuer un test de diagnostic intégré sur son tampon de secteur interne, indiquant si le test a été réussi par l'état renvoyé.
INT 13H (0x13)
Fonction 13H (0x13 ou 19) >> Diagnostic du lecteur du contrôleur
Call with:AH = 13H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Commentaires :
Cette fonction oblige l'adaptateur fixe à exécuter des tests de diagnostic internes du lecteur connecté, indiquant si le test a été réussi par l'état renvoyé.
INT 13H (0x13)
Fonction 14H (0x14 ou 20) >> Contrôleur interne
diagnostic
Appeler avec :AH = 14H
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Commentaires :
Cette fonction amène l'adaptateur de disque fixe à effectuer un auto-test de diagnostic intégré, indiquant si le test a été réussi par l'état renvoyé.
INT 13H (0x13)
Fonction 15H (0x15 ou 21) >> Obtenir le type de disque
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 si aucun lecteur n'est présent
01H si lecteur de disquettes sans support de changement de ligne
02H si lecteur de disquette avec prise en charge du changement de ligne
03H si disque fixe
|
And, if fixed disk (AH =03H)
CX: DX = number of 512-byte sectors
If function unsuccessful
Carry flag = set
AH = status
Commentaires :
Cette fonction renvoie un code indiquant le type de disquette ou de disque fixe référencé par le code de lecteur spécifié.
INT 13H (0x13)
Fonction 16H (0x16 ou 22) >> Obtenir le changement de disque
statut
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
Commentaires :
Cette fonction renvoie l'état de la ligne de changement, indiquant si le disque du lecteur a peut-être été remplacé depuis le dernier accès au disque. Si cette fonction revient avec l'indicateur de report défini, le disque n'a pas nécessairement été changé et la ligne de changement peut être activée simplement en déverrouillant et en verrouillant la porte du lecteur de disque sans retirer la disquette.
INT 13H (0x13)
Fonction 17H (0x17 ou 23) >> Définir le type de disque
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
Commentaires :
Cette fonction sélectionne un type de disquette pour le lecteur spécifié.
INT 13H (0x13)
Fonction 18H (0x18 ou 24) >> Définir le type de média pour le 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
Commentaires :
Cette fonction sélectionne les caractéristiques du support pour le lecteur spécifié. Une disquette doit donc être présente dans le lecteur.
INT 13H (0x13)
Fonction 19H (0x19 ou 25) >> Parc têtes
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
Commentaires :
Cette fonction déplace le bras de lecture/écriture sur une piste qui n'est pas utilisée pour le stockage des données, afin que les données ne soient pas endommagées lorsque le lecteur est éteint.
INT 13H (0x13)
Fonction 1AH (0x1A ou 26) >> Formater le lecteur ESDI
Call with: AH = 1AH
AL = Relative Block Address (RBA)
defect table count
0, if no RBA table
>0, if RBA table used
CL = format modifier bits
Bit(s) |
Significance (if set) |
0 |
Ignore primary defect map |
1 |
Ignore secondary defect map |
2 |
Update secondary defect map |
3 |
Perform extended surface analysis |
4 |
Generate periodic interrupt |
5-7 |
Reserved (must be 0) |
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of RBA table
Returns: If function successfu
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see INT 13H Function 01H)
Commentaires :
Cette fonction initialise le secteur du disque et suit les champs d'adresse sur un lecteur connecté à l'adaptateur de lecteur de disque fixe ESDI.
Le fonctionnement de cette fonction s'appelle un formatage de bas niveau et prépare le disque pour les opérations physiques de lecture/écriture au niveau du secteur. Le lecteur doit ensuite être partitionné avec la commande FDISK, puis formaté de haut niveau avec la commande FORMAT pour installer un système de fichiers.
Page modifiée le: 09/03/2022