Chapitre – 8
Fonctions du BIOS du disque et gestion des interruptions à l'aide de C
Introduction
Dans ce chapitre, nous discuterons des fonctionnalités importantes de Disk-BIOS et d'autres fonctionnalités importantes qui nous donnent la liberté d'utiliser et de gérer les interruptions dans notre programme C d'une manière simple et courte. Ces fonctions constituent la base de la programmation de récupération de données et de dépannage de disque. Ce sont les caractéristiques qui font du langage C un « langage assembleur de haut niveau » .
Fonctions de biosdisk et _bios_disk
Ces deux fonctions sont les plus importantes pour notre objectif de récupération de données et de programmation de dépannage de disque. Nous utiliserons ces fonctions la plupart du temps.
Ces deux fonctions sont des services de lecteur de disque BIOS et sont définies dans bios.h, où biosdisk fonctionne sous le niveau du fichier sur les secteurs bruts. Si ces fonctions sont utilisées même avec la moindre négligence, elles peuvent détruire le contenu des fichiers et des répertoires de votre disque dur. Les fonctions biosdisk et _bios_disk utilisent l'interruption 0x13 pour transmettre les opérations de disque directement au BIOS. La fonction _bios_disk est déclarée dans le programme comme suit :
unsigned _bios_disk(commande non signée, struct diskinfo_t *dinfo);
Et la déclaration pour la fonction disque du BIOS ressemble à ceci :
int biosdisk(int cmd, int lecteur, int tête, int piste,
int secteur, int nsects, void *buffer);
La signification de ces paramètres est décrite dans le tableau suivant :
Paramètre |
Fonction |
Qu'est-ce que c'est ou à quoi ça sert |
cmd |
Les deux |
Spécifie l'opération à effectuer, telle que la lecture, l'écriture, la vérification, etc. (Voir la description de cmd ci-dessous) |
dinfo |
_disque_bios |
Pointe vers une structure diskinfo_t contenant les paramètres restants requis pour l'opération. (voir la description de la structure diskinfo_t ci-dessous) |
conduire une voiture |
disque bios |
Spécifie quel disque sera utilisé (0 pour a :, 1 pour b : et 0x80 pour le premier disque dur physique, 0x81 pour le second, etc.) |
Secteur de la trajectoire
de la tête
|
disque bios |
Ils définissent l’emplacement du secteur de départ à partir duquel l’opération doit débuter. |
insectes |
disque bios |
Nombre de secteurs à lire, écrire, vérifier, etc. |
tampon |
disque bios |
L'adresse mémoire à partir de laquelle les données doivent être lues ou écrites. |
Dans ces deux fonctions, les données sont lues et écrites dans une mémoire tampon de 512 octets par secteur, qui correspond à la taille du secteur logique du disque dur, et la valeur de retour des deux fonctions est la valeur du registre AX défini par l'appel du BIOS INT 0x13H.
Si la fonction réussit, l'octet haut = 0, ce qui signifie que l'exécution a réussi, et l'octet bas contient le nombre de secteurs lus, écrits ou vérifiés, etc.
Mais si une erreur se produit et que la fonction n'est pas exécutée avec succès, la valeur de l'octet de poids fort correspondra à l'un des codes d'erreur suivants, décrits dans le tableau suivant :
Valeur |
Description |
0x00 |
Réussite (pas une erreur !!) |
0x01 |
Mauvaise équipe |
0x02 |
Étiquette d'adresse non trouvée |
0x03 |
Tentative d'écriture sur un disque protégé en écriture |
0x04 |
Secteur non trouvé |
0x05 |
La réinitialisation a échoué (disque dur) |
0x06 |
Le disque a été modifié depuis la dernière opération. |
0x07 |
Échec de l'exécution de l'action du paramètre du lecteur |
0x08 |
Dépassement de capacité d'accès direct à la mémoire (DMA) |
0x09 |
Tentative d'exécution de DMA au-delà de la limite de 64 K (erreur de limite de données ou secteurs > 80 H) |
0x0A |
Secteur défectueux détecté |
0x0B |
Mauvaise piste détectée |
0x0C |
Piste non prise en charge |
0x0D |
Nombre de secteurs incorrect lors du formatage (disque dur PS/2) |
0x0E |
Marque d'adresse des données de contrôle détectée (disque dur) |
0x0F |
Niveau d'arbitrage DMA hors limites (disque dur) |
0x10 |
CRC/ECC incorrect lors de la lecture du disque |
0x11 |
Erreur de correction des données CRC/ECC (pas vraiment une erreur) |
0x20 |
Le contrôleur est en panne |
0x31 |
Il n'y a pas de support dans le lecteur (extensions IBM/MS INT 13) |
0x32 |
Type de disque incorrect enregistré dans le CMOS (Compaq) |
0x40 |
L'opération de recherche a échoué. |
0x80 |
La pièce jointe n'a pas répondu |
0xAA |
Disque non prêt (disque dur uniquement) |
0xB0 |
Le volume n'est pas verrouillé sur le disque (extensions INT 13) |
0xB1 |
Volume verrouillé sur disque (extensions INT 13) |
0xB2 |
Volume non amovible (extensions INT 13) |
0xB3 |
Volume d'utilisation (extensions INT 13) |
0xB4 |
Nombre de verrous dépassé (INT 13 extensions) |
0xB5 |
Impossible d'exécuter une demande de lancer valide (extensions INT 13) |
0xBB |
Une erreur non spécifiée s'est produite (disque dur uniquement) |
0xCC |
Il y a eu une erreur d'enregistrement |
0xE0 |
Erreur du registre d'état |
0xFF |
L'opération Sense a échoué |
Le tableau ci-dessous présente les commandes d'opération à exécuter par le paramètre cmd. Tout d’abord, nous allons examiner le fonctionnement général des deux fonctions.
disque bios |
_disque_bios |
Que fait-il ? |
0 |
_RÉINITIALISATION_DU_DISQUE |
Réinitialise le système de disque, forçant le contrôleur de lecteur à effectuer une réinitialisation matérielle. Ignorer tous les autres paramètres |
1 |
_ÉTAT_DU_DISQUE |
Renvoie l'état de la dernière opération sur le disque. Ignore tous les autres paramètres |
2 |
_LECTURE_DISQUE |
Lit un ou plusieurs secteurs de disque en mémoire |
3 |
_ÉCRITURE_DISQUE |
Écrit un ou plusieurs secteurs de disque à partir de la mémoire |
4 |
_VÉRIFICATION_DU_DISQUE |
Vérifie un ou plusieurs secteurs |
5 |
_FORMAT_DISQUE |
Formater une piste |
Bien que vous soyez libre d'utiliser cmd = 0, 1, 2, 3, 4,5 ou cmd = _DISK_RESET, _DISK_STATUS, _DISK_READ, _DISK_WRITE, _DISK_VARIFY, _DISK_FORMAT et que les deux options aient le même effet, il est recommandé de prendre l'habitude d'utiliser des mots d'option tels que cmd = _DISK_FORMAT au lieu de cmd = 5 car cela peut vous aider à éviter les erreurs qui peuvent se produire 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 :
Paramètre |
Ce qu'il fait |
secteur
de la voie principale
|
Ces trois éléments spécifient l'emplacement du secteur de départ pour l'opération spécifiée. (les valeurs minimales possibles peuvent être tête = 0, piste = 0 et secteur = 1) |
nsecteurs |
Ceci spécifie le nombre de secteurs à lire ou à écrire |
tampon |
Il pointe vers le tampon où les données doivent être lues et écrites |
Si la valeur de cmd est = 5 (_DISK_FORMAT), biosdisk et _bios_disk utilisent les paramètres suivants conformément à la description du tableau. Il est toujours recommandé de faire preuve de prudence lorsque vous utilisez _DISK_FORMAT et de savoir à quoi vous vous en tenir. Le manque de connaissances ou même une petite erreur peuvent vous faire subir une perte importante de données.
Paramètre |
Ce qu'il fait |
piste de tête |
Ceux-ci spécifient l'emplacement de la piste à formater |
tampon |
Il pointe vers une table d'en-têtes de secteur à écrire sur la piste nommée |
Il existe quelques valeurs supplémentaires de cmd qui ne sont utilisées que par les fonctions du biosdisk. Ces valeurs de cmd ne sont autorisées que pour les systèmes XT, AT, PS/2 et compatibles. Les valeurs sont décrites dans le tableau ci-dessous :
cmd |
Ce qu'il fait |
6 |
Formate une piste et définit des indicateurs de secteur défectueux |
7 |
Formate le lecteur en commençant par une piste spécifique |
8 |
Renvoie les paramètres actuels du lecteur dans les 4 premiers octets du tampon |
9 |
Initialise les caractéristiques de la paire de lecteurs |
10 |
Effectue une lecture longue (512 plus 4 octets supplémentaires par secteur) |
11 |
Effectue une écriture longue (512 plus 4 octets supplémentaires par secteur) |
12 |
Un disque cherche-t-il |
13 |
Réinitialisation du disque alternatif |
14 |
Lit le tampon du secteur |
15 |
Écrit le tampon de secteur |
16 |
Teste si le lecteur nommé est prêt |
17 |
Recalibre le lecteur |
18 |
Diagnostic de la RAM du contrôleur |
19 |
Diagnostic du lecteur |
20 |
Diagnostic interne du contrôleur |
Structure de diskinfo_t
La structure diskinfo_t est utilisée par la fonction _bios_disk. La description de la structure est la suivante :
structure diskinfo_t {
lecteur non signé, tête, piste, secteur, nsecteurs ;
vide loin *buffer;
};
Où drive spécifie le lecteur de disque à utiliser. N'oubliez jamais que pour les disques durs, c'est le lecteur physique qui est spécifié, et non la partition du disque. Si vous souhaitez utiliser des partitions, le programme d'application doit également interpréter les informations de la table de partition de ce disque lui-même.
La valeur de head, track et sector spécifie l'emplacement du secteur de départ de 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 :
conduire la valeur |
Lecteur de disque à utiliser |
0 |
Premier lecteur de disquette |
1 |
Deuxième lecteur de disquette |
2 |
Troisième lecteur de disquette |
.... |
(et ainsi de suite) |
0x80 |
Premier disque dur |
0x81 |
Deuxième disque dur |
0x82 |
Troisième disque dur |
.... |
(et ainsi de suite) |
Assez de théorie ! Voyons maintenant quelques aspects pratiques et quelques exemples de ces fonctions. L'exemple suivant lit les secteurs des deux côtés des 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 quelques 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 sur quatre pistes, deux faces et 18 secteurs dans chaque piste. Chaque secteur fait 512 octets). Le programme a été développé pour démontrer l'exemple. Cependant, vous pouvez le modifier et le développer pour pouvoir récupérer les 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>
vide principal(vide)
{
int tête, piste ;
int résultat,i,secteur;
char nom de fichier[80];
char *tampon;
structure diskinfo_t dinfo;
caractère statique dbuf[512];
FICHIER *tt;
clrscr();
/// Vérifiez si le lecteur est prêt ou non \\\
si(!(biosdisk(4,0,0,0,0,1,buffer) & 0x02))
{
printf(" Lecteur A : Pas prêt :\n Insérez le disque dans le lecteur A :
et appuyez sur n'importe quelle touche\n");
obtenir();
}
/* Obtenir le nom du fichier pour stocker les données des secteurs du disque */
printf("\nEntrez le nom du fichier de destination avec le chemin complet
pour stocker les données \n\n >");
obtient(nom de fichier);
si((tt= fopen(nom de fichier, "wb"))==NULL)
{
printf("Impossible d'ouvrir le fichier !!!");
obtenir();
}
pour(piste=0;piste<4;piste++)
{
pour(tête=0; tête<=1;tête++)
{
pour(secteur=1;secteur<=18;secteur++)
{
dinfo.drive = 0; /* numéro de lecteur pour A : */
dinfo.head = head; /* numéro de tête de disque */
dinfo.track = piste; /* numéro de piste */
dinfo.sector = secteur; /* numéro de secteur */
dinfo.nsectors = 1; /* nombre de secteurs */
dinfo.buffer = dbuf; /* tampon de données */
/// Afficher le statut \\\
gotoxy(10,10); printf("Lecture des données depuis : Head=%d
Piste=%d Secteur=%d",
tête, piste, secteur) ;
fprintf(tt,"\n Données lues à partir de : Tête=%d Piste=%d Secteur=%d\n",
tête, piste, secteur) ;
/// Lire les secteurs spécifiés \\\
résultat = _bios_disk(_DISK_READ, &dinfo);
/// Stocker le contenu dans le fichier spécifié \\\
si ((résultat & 0xff00) == 0)
{
pour(i=0;i<512;i++)
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/* Imprimer un message d'erreur à l'écran et dans le fichier en cas d'erreur lors de la lecture d'un secteur */
autre
{
printf("\n Impossible de lire à Head= %d Track= %d
Secteur = %d\n",tête,piste,secteur);
fprintf(tt,"\n Impossible de lire à Head= %d Track= %d
Secteur =%d\n",tête,piste,secteur);
}
}
}
}
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 si une 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 absolus du disque et la fonction abswrite écrit les secteurs absolus du disque. 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 les secteurs étape par étape et sont totalement exemptes 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 numéros de piste, de tête et de secteur respectifs.
Les opérations de lecture et d'écriture absolues sont recommandées dans les programmes où nous allons effectuer une opération de lecture/écriture sur l'ensemble du disque et nous voulons éviter un codage et une boucle supplémentaires dans notre programme pour augmenter la vitesse du programme au maximum.
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 lecteur, int nsects, long lsect,
vide *tampon);
et la fonction abswrite est déclarée comme suit :
int abswrite(int lecteur, int nsects, long lsect,
vide *tampon);
Où la signification des paramètres est la suivante :
Paramètre |
Qu'est-ce que c'est/ce que ça fait |
conduire |
Numéro de lecteur à lire (ou à écrire) : 0 = A, 1 = B, etc. |
insectes |
Nombre de secteurs à lire (ou à écrire) |
lsecteur |
Numéro de secteur logique de début |
tampon |
Adresse mémoire où les données doivent être lues (ou écrites) |
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 sur la valeur du registre AX renvoyé par l'appel système.
Le nombre de secteurs pour les opérations 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 géante dans les prochains chapitres pour dépasser la limite de mémoire de 64 Ko, afin de développer un programme très rapide.
|
Gestion des interruptions avec C
Le langage C est parfois appelé un langage assembleur de haut niveau car il peut appeler différentes interruptions à l'aide de certaines de ses fonctions définies. Certaines fonctions importantes sont les suivantes :
- int86 : invoque les interruptions MS-DOS.
- int86x : invoque une interruption MS-DOS avec des valeurs de registre de segment.
- intdos : appelle le service MS-DOS en utilisant des registres autres que DX et AL
- intdosx : appelle le service MS-DOS avec les valeurs de registre de segment.
- segread : lit les registres de segments
Nous allons discuter ces fonctions en détail. Tout d'abord, nous discuterons de certaines structures et unions prédéfinies qui sont fréquemment ou nécessairement utilisées avec ces fonctions.
Structure du SREGS
Cette structure a été définie dans dos.h et c'est une structure de registres de segments transmis et remplis par les fonctions int86x, intdosx et segread. La déclaration de la structure est la suivante :
structure SREGS {
entier non signé es;
int non signé cs;
entier non signé ss;
int non signé ds;
};
Syndicat REGS
REGS est l'union de deux structures. L'union REGS a été définie dans 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 :
syndicat REGS {
structure WORDREGS x;
structure BYTEREGS h;
};
Structures BYTEREGS et WORDREGS
Les structures BYTEREGES et WORDREGS ont été définies dans dos.h et sont utilisées pour stocker des registres d'octets et de mots. La structure WORGREGS permet à l'utilisateur d'accéder aux registres du processeur sous forme de quantités de 16 bits, tandis que la structure BYTEREGES donne accès aux registres individuels de 8 bits.
La structure BITEREGS est déclarée comme suit :
structure BYTEREGS {
caractère non signé al, ah, bl, bh;
caractère non signé cl, ch, dl, dh;
};
Et la structure WORDREGS est déclarée comme suit :
structure WORDREGS {
int non signé ax, bx, cx, dx;
unsigned int oui, de, cflag, drapeaux ;
};
Fonctions int86 et int86x
Ces fonctions sont les interfaces d'interruption logicielle 8086 générales 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,
syndicat REGS *outregs);
int86x est la variante de la fonction int86. Elle est déclarée comme suit :
int int86x(int intno, union REGS *inregs,
union REGS *outregs, structure SREGS *segregs);
Les deux fonctions int86 et int86x exécutent 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 des registres 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 l'exécution de l'interruption logicielle. Cette fonction permet aux programmes qui utilisent des pointeurs lointains ou un modèle de mémoire de données volumineux de spécifier quel segment doit être utilisé pour l'interruption logicielle.
Les fonctions copient les valeurs actuelles du registre dans outregs, l'état de l'indicateur de report dans le champ x.cflag dans outregs et la valeur du registre d'indicateurs 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 segments correspondants.
Dans les deux fonctions, inregs et outregs peuvent pointer vers la même structure et les deux fonctions renvoient la valeur de AX une fois l'interruption logicielle terminée. Si l'indicateur de report est défini, cela indique généralement qu'une erreur s'est produite.
Les éléments d'union REGS utilisés en C, équivalent au langage assembleur, sont répertoriés dans le tableau ci-dessous :
16 bits |
8 bits |
Langage C |
Langage d'assemblage |
Langage C |
Langage d'assemblage |
inregs.x.ax |
HACHE |
dansregs.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 |
ET |
|
|
inregs.x.de |
DEPUIS |
|
|
inregs.x.cflag |
CF |
|
|
Voyons les exemples des fonctions int86 et int86x. Le programme suivant analyse chaque secteur de la disquette et imprime l'état de chaque secteur sur l'écran.
/* Programme pour analyser chaque secteur de la disquette et imprimer l'état */
#include<dos.h>
#include<conio.h>
void main()
{
int tête,piste,secteur,i;
char *buf;
syndicat REGS inregs, outregs;
structure SREGS sregs;
clrscr();
/// Initialisation du disque en réinitialisant le système de disque \\\
gotoxy(10,2); printf("Initialisation du disque...");
pour(i=0;i<3;i++)
{
inregs.h.ah=0x00; // Numéro de fonction
inregs.h.dl=0x00; // Disquette
int86(0x13,&inregs,&outregs);
}
gotoxy(10,2); printf("L'état du disque est le suivant....\n");
/* Scannez la disquette de 0 à 79 pistes (total des pistes 80) */
pour(piste=0;piste<=79;piste++)
pour(tête=0;tête<=1;tête++)
pour(secteur=1;secteur<=18;secteur++)
{
inregs.h.ah = 0x04; /// fonction Nombre
inregs.h.al = 1; /// Nombre de secteurs
inregs.h.dl = 0x00; /// Disquette
inregs.h.ch = piste;
inregs.h.dh = tête;
inregs.h.cl = secteur;
inregs.x.bx = FP_OFF(buf);
sregs.es = FP_SEG(buf);
int86x(0x13,&inregs,&outregs,&sregs);
//// Imprimer l'état du secteur scanné \\\\
commutateur(outregs.h.ah)
{
cas 0x00:
cprintf("STATUT : Aucune erreur !!");
casser;
cas 0x01:
cprintf("STATUS : Mauvaise commande ");
casser;
cas 0x02:
cprintf("STATUT : marque d'adresse non trouvée ");
casser;
cas 0x03:
cprintf("STATUS : Tentative d'écriture sur
disque protégé en écriture ");
casser;
cas 0x04:
cprintf("STATUT : Secteur non trouvé ");
casser;
cas 0x05:
cprintf("STATUS : échec de la réinitialisation (disque dur) ");
casser;
cas 0x06:
cprintf("STATUT : Le disque a changé depuis la dernière
opération ");
casser;
cas 0x07:
cprintf("STATUS : Activité des paramètres du lecteur
échoué") ;
casser;
cas 0x08:
cprintf("STATUT : Accès direct à la mémoire (DMA)
dépassement ");
casser;
cas 0x09:
cprintf("STATUS : Tentative d'exécution de DMA sur
Limite de 64 K ");
casser;
cas 0x0A :
cprintf("STATUT : Secteur défectueux détecté ");
casser;
cas 0x0B :
cprintf("STATUT : mauvaise piste détectée ");
casser;
cas 0x0C :
cprintf("STATUT : type de média non trouvé ");
casser;
cas 0x0D :
cprintf("STATUS : nombre de secteurs non valide sur
format (disque dur) ");
casser;
cas 0x0E :
cprintf("STATUS : Marque d'adresse des données de contrôle
détecté (disque dur) ");
casser;
cas 0x0F :
cprintf("STATUT : niveau d'arbitrage DMA hors de
plage (disque dur) ");
casser;
cas 0x10:
cprintf("STATUT : CRC/ECC incorrect lors de la lecture du disque ");
casser;
cas 0x11:
cprintf("STATUT : erreur de données corrigée CRC/ECC ");
casser;
cas 0x20:
cprintf("STATUS : le contrôleur a échoué ");
casser;
cas 0x31:
cprintf("STATUS : Aucun support dans le lecteur (IBM/MS INT 13H
extensions) ");
casser;
cas 0x32:
cprintf("STATUS : type de lecteur incorrect stocké dans
CMOS (Compaq) ");
casser;
cas 0x40:
cprintf("STATUS : l'opération de recherche a échoué ");
casser;
cas 0x80:
cprintf("STATUS : la pièce jointe n'a pas répondu
(Délai d'expiration du disque) ");
casser;
cas 0xAA :
cprintf("STATUS : lecteur non prêt (disque dur
seulement) ");
casser;
cas 0xB0 :
cprintf("STATUS : volume non verrouillé dans le lecteur (INT
(13H extensions) ");
casser;
cas 0xB1 :
cprintf("STATUS : Volume verrouillé dans le lecteur (extensions INT 13H) ");
casser;
cas 0xB2 :
cprintf("STATUS : Volume non amovible (INT 13H
extensions) ");
casser;
cas 0xB3 :
cprintf("STATUT : Volume en cours d'utilisation (INT 13H
extensions) ");
casser;
cas 0xB4 :
cprintf("STATUS : nombre de verrous dépassé (INT 13H
extensions) ");
casser;
cas 0xB5 :
cprintf("STATUS : échec de la demande d'éjection valide (INT
(13H extensions) ");
casser;
cas 0xBB :
cprintf("STATUS : une erreur indéfinie s'est produite (hard
disque uniquement) ");
casser;
cas 0xCC :
cprintf("STATUS : une erreur d'écriture s'est produite ");
casser;
cas 0xE0 :
cprintf("STATUS : Erreur du registre d'état ");
casser;
cas 0xFF :
cprintf("STATUS : l'opération de détection a échoué ");
casser;
par défaut : cprintf("ÉTAT : CODE D'ÉTAT INCONNU ");
}
printf("\nPosition actuelle= Piste :%d Tête :%d Secteur :%d \n",
piste,tête,secteur);
}
gotoxy(10,24);printf("Numérisation terminée !! Appuyez sur n'importe quelle touche pour
Sortie..");
obtenir();
}
Le programme montre un 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,44 Mo, 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 segment. 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()
{
structure SREGS segments;
lire la séquence(&segs);
printf("Paramètres du registre de segment actuel\n\n");
printf("CS : %X DS : %X\n", segs.cs, segs.ds);
printf("ES : %X SS : %X\n", segs.es, segs.ss);
obtenir();
}
Et la sortie du programme ressemblera à ceci :
Paramètres du registre de segment actuel
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 invoque les registres de service MS-DOS puis DX et AL tandis que la fonction intdosx invoque le service MS-DOS avec les valeurs des registres 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,
structure 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 fonction permet aux programmes qui utilisent des pointeurs lointains ou un modèle de mémoire de données volumineux 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 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 une fois l'appel de fonction DOS terminé et si l'indicateur de report est défini (outregs -> x.cflag != 0), cela indique qu'une erreur s'est produite.
Après l'interruption 0x21, les fonctions copient les valeurs du registre actuel dans les outregs, l'état de l'indicateur de report dans le champ x.cflag dans les outregs et la valeur du registre des indicateurs 8086 dans le champ x.flags dans les outregs. Les deux fonctions inregs et outregs peuvent pointer vers la même structure. Voyons les exemples de ces fonctions.
L'exemple d'utilisation de la fonction intdos est 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> /* pour intdos() et union REGS */
#include <stdio.h> /* pour printf() */
syndicat REGS inregs, outregs;
void main()
{
inregs.h.ah = 0x36; /* obtenir l'espace disque libre
numéro de fonction */
inregs.h.dl = 0x01; /* lecteur A: */
intdos(&inregs, &outregs);
printf("%d secteurs/cluster,\n%d clusters,\n%d octets/secteur,
\n%d clusters au total",
outreregs.x.ax,outregs.x.bx,
outregs.x.cx, outregs.x.dx);
obtenir();
}
Et la sortie du programme sera comme ceci :
1 secteur/cluster,
grappes de 1933,
512 octets/secteur,
2843 groupes au total
Voyons maintenant un exemple de la fonction intdosx . L'exemple suivant montre l'utilisation de la fonction intdosx . Le programme génère une chaîne sur la sortie standard.
/* Le programme pour afficher 'string' sur la sortie standard. */
#include <dos.h>
syndicat REGS inregs, outregs;
structure SREGS ségrégations;
char far *string = "cette chaîne n'est pas dans le
segment de données par défaut$";
void main()
{
inregs.h.ah = 0x09; /* numéro de fonction */
inregs.x.dx = FP_OFF(string);/*DS:DX est loin
adresse de 'string */
segregs.ds = FP_SEG(chaîne);
intdosx(&inregs, &outregs, &segregs);
obtenir();
}
Et la sortie du programme sera la suivante :
cette chaîne n'est pas dans le segment de données par défaut |
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 du disque dur physique
Le numéro de disque dur physique est une chose très importante et doit être écrit avec exactitude. La spécification d'un disque dur non autorisé peut entraîner une perte de données importante. Nous devons être sûrs du numéro de disque lors de la récupération des données ou de la programmation du dépannage du disque. Comment connaître le numéro de disque de n'importe quel disque avec différentes dispositions de disques peut être estimé à l'aide des exemples donnés ci-dessous.
Selon le mythe le plus répandu, les numéros de lecteur physique sont fournis en fonction de l'état de connexion du disque. Cependant, dans certains cas particuliers, cela peut dépendre de la procédure de démarrage ou des paramètres de démarrage de votre système d'exploitation.
L'idée la plus générale concernant le numéro de lecteur physique fourni par le BIOS a été donnée ici, mais même dans ce cas, vous devez confirmer la configuration du disque à l'aide d'un outil d'édition de disque ou des programmes donnés dans les chapitres suivants. Après vous être assuré, vous devez prendre toute décision concernant l'exécution de tels programmes qui peuvent corrompre ou 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 s'il est disponible) puis au maître secondaire (puis à l'esclave secondaire s'il est disponible et ainsi de suite) et le numéro physique sera donné en fonction de leurs préférences.
Supposons que votre système prenne en charge un maximum de quatre disques durs à la fois. Les quatre disques durs peuvent être connectés comme indiqué ci-dessous :
Maître principal |
Esclave principal |
Maîtrise secondaire |
Esclave secondaire |
Considérons maintenant quelques cas de nombre de lecteurs physiques. Je suppose ici 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 :
Primaire/Secondaire (Maître/Esclave) |
Statut |
Numéro et description du lecteur physique |
Maître principal |
Le disque est présent |
Le numéro du lecteur physique sera 80H. Dans ce cas, le disque dur est appelé premier disque dur . |
Esclave principal |
Le disque est présent |
Le numéro du lecteur physique sera 81H. Dans ce cas, le disque dur est appelé deuxième disque dur . |
Maîtrise secondaire |
Le disque est présent |
Le numéro du lecteur physique sera 82H. Dans ce cas, le disque dur est appelé troisième disque dur . |
Esclave secondaire |
Le disque est présent |
Le numéro du lecteur physique sera 83H. Dans ce cas, le disque dur est appelé quatrième disque dur . |
- Si trois disques durs sont connectés au système : si trois disques durs sont connectés au système, les numéros de lecteurs physiques seront ceux correspondant à leurs préférences de connexion. Les exemples suivants représentent certaines des configurations :
Primaire/Secondaire (Maître/Esclave) |
Statut |
Numéro et description du lecteur physique |
Maître principal |
Le disque est présent |
Le numéro du lecteur physique sera 80H. Dans ce cas, le disque dur est appelé premier disque dur . |
Esclave principal |
Le disque est présent |
Le numéro du lecteur physique sera 81H. Dans ce cas, le disque dur est appelé deuxième disque dur . |
Maîtrise secondaire |
Le disque est présent |
Le numéro du lecteur physique sera 82H. Dans ce cas, le disque dur est appelé troisième disque dur . |
Esclave secondaire |
Disque non présent |
------------------- |
Primaire/Secondaire (Maître/Esclave) |
Statut |
Numéro et description du lecteur physique |
Maître principal |
Disque non présent |
------------------- |
Esclave principal |
Le disque est présent |
Le numéro du lecteur physique sera 80H. Dans ce cas, le disque dur est appelé premier disque dur . |
Maîtrise secondaire |
Le disque est présent |
Le numéro du lecteur physique sera 81H. Dans ce cas, le disque dur est appelé deuxième disque dur . |
Esclave secondaire |
Le disque est présent |
Le numéro du lecteur physique sera 82H. Dans ce cas, le disque dur est appelé troisième disque dur . |
Primaire/Secondaire (Maître/Esclave) |
Statut |
Numéro et description du lecteur physique |
Maître principal |
Le disque est présent |
Le numéro du lecteur physique sera 80H. Dans ce cas, le disque dur est appelé premier disque dur . |
Esclave principal |
Disque non présent |
------------------- |
Maîtrise secondaire |
Le disque est présent |
Le numéro du lecteur physique sera 81H. Dans ce cas, le disque dur est appelé deuxième disque dur . |
Esclave secondaire |
Le disque est présent |
Le numéro du lecteur physique sera 82H. Dans ce cas, le disque dur est appelé troisième disque dur . |
Primaire/Secondaire (Maître/Esclave) |
Statut |
Numéro et description du lecteur physique |
Maître principal |
Le disque est présent |
Le numéro du lecteur physique sera 80H. Dans ce cas, le disque dur est appelé premier disque dur . |
Esclave principal |
Le disque est présent |
Le numéro du lecteur physique sera 81H. Dans ce cas, le disque dur est appelé deuxième disque dur . |
Maîtrise secondaire |
Disque non présent |
------------------- |
Esclave secondaire |
Le disque est présent |
Le numéro du lecteur physique sera 82H. Dans ce cas, le disque dur est appelé troisième disque dur . |
- 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 ceux correspondant à leurs préférences de connexion. L'exemple suivant l'illustre :
Primaire/Secondaire (Maître/Esclave) |
Statut |
Numéro et description du lecteur physique |
Maître principal |
Le disque est présent |
Le numéro du lecteur physique sera 80H. Dans ce cas, le disque dur est appelé premier disque dur . |
Esclave principal |
Disque non présent |
------------------- |
Maîtrise secondaire |
Disque non présent |
------------------- |
Esclave secondaire |
Le disque est présent |
Le numéro du lecteur physique sera 81H. Dans ce cas, le disque dur est appelé deuxième disque dur . |
- Si un seul disque dur est connecté au système : inutile de réfléchir, 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 ROM BIOS
La description des fonctions INT 13H a été donnée ici. Ces fonctions doivent être apprises avec soin, car une mauvaise utilisation de ces fonctions ou une utilisation avec manque de soin ou de connaissances peut entraîner une perte importante de données ou de nombreux autres problèmes. Cependant, si elles sont utilisées de manière appropriée et correcte, ces fonctions aident à minimiser le codage de votre programme et à rendre votre programmation simple et facile.
INT 13H (0x13)
Fonction 00H (0x00) Réinitialiser le système de disque
Appel avec AH = 00H
DL = lecteur
Disquette 00H-7FH
Disque fixe 80H-FFH
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00H
Si la fonction échoue
Drapeau de transport = défini
AH = statut
Commentaires:
Réinitialisez le contrôleur de disque et recalibrez les lecteurs qui y sont connectés. Le bras de lecture/écriture est déplacé vers le cylindre 0 et se prépare pour les E/S du disque.
Cette fonction doit être appelée après une demande de lecture, d'écriture, de vérification ou de formatage de disquette échouée avant de réessayer l'opération. Si la fonction est appelée avec un lecteur de disquette fixe (c'est-à-dire en sélectionnant DL>=80H), le contrôleur de disquette puis le contrôleur de disquette fixe sont réinitialisés.
INT 13H (0x13)
Fonction 01H (0x01) Obtenir l'état du système de disque
Appel avec : AH = 01H
DL = lecteur
Disquette 00H-7FH
Disque fixe 80H-FFH
Retourne : AH = 00H
AL = état de l'opération de disque précédente
(Voir le tableau donné avant pour les erreurs
et description des codes d’état).
Commentaires:
Renvoie l'état de l'opération de disque la plus récente
INT 13H (0x13)
Fonction 02H (0x02) Lire le secteur
Appel avec : AH = 02H
AL = nombre de secteurs
CH = cylindre
CL = secteur
DH = tête
DL = lecteur
Disquette 00H-7FH
Disque fixe 80H-FFH
ES:BX = segment : décalage du tampon
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00H
AL = nombre de secteurs transférés
Si la fonction échoue
Drapeau de transport = défini
AH = statut
Commentaires:
Cette fonction lit un ou plusieurs secteurs du disque vers la mémoire. 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.
INT 13H (0x13)
Fonction 03H (0x03) Écriture du secteur
Appel avec : AH = 03H
AL = nombre de secteurs
CH = cylindre
CL = secteur
DH = tête
DL = lecteur
Disquette 00H-7FH
Disque fixe 80H-FFH
ES : BX = segment : décalage du tampon
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00H
AL = nombre de secteurs transférés
Si la fonction échoue
Drapeau de transport = défini
AH = statut
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 de 10 bits sont placés dans les 2 bits supérieurs du registre CL.
INT 13H (0x13)
Fonction 04H (0x04) >> Vérifier le secteur
Appel avec : AH = 04H
AL = nombre de secteurs
CH = cylindre
CL = secteur
DH = entraînement
Disquette 00H-7FH
Transmission fixe 80H-FFH
ES : BX = segment : décalage du tampon
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00H
AL = nombre de secteurs vérifiés
Si la fonction échoue
Drapeau de transport = défini
AH = statut
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 de 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'une disquette lisible n'est pas présente. Elle est recommandée dans la plupart des opérations d'initialisation de disquette.
INT 13H (0x13)
Fonction 05H (0x05) >> Formater la piste
Appel avec : AH = 05H
AL = entrelacement (disques fixes PC/XT)
CH = cylindre
DH = tête
DL = lecteur
Disquette 00H-7FH
Disque fixe 80H-FFH
ES : BX = segment : décalage de la liste des champs d'adresse
(Sauf disque fixe PC/XT)
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00H
Si la fonction échoue
Drapeau de transport = défini
AH = statut (voir le tableau des statuts donné
plus tôt)
Commentaires :
Initialise les champs d'adresse des secteurs et des pistes du disque sur la piste spécifiée. Sur les disquettes, la liste des champs d'adresse se compose d'une série d'entrées de 4 octets, une entrée par secteur. Le format est indiqué 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.
Octet |
Contenu |
0 |
Cylindre |
1 |
Tête |
2 |
Secteur |
3
|
Code de taille de secteur
Valeur |
Description |
00H |
128 octets par secteur |
01H |
256 octets par secteur |
02H |
512 octets par secteur |
03H |
1024 octets par secteur |
|
INT 13H (0x13)
Fonction 06H (0x06) >> Formater une mauvaise piste
Appel avec : AH = 06H
AL = entrelacement
CH = cylindre
DH = tête
DL = lecteur
Disque fixe 80H-FFH
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00H
Si la fonction échoue
Drapeau de transport = défini
AH = statut
Commentaires:
Cette fonction est définie uniquement pour les disques durs fixes PC/XT. Elle 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
Appel avec : AH = 07H
AL = entrelacement
CH = cylindre
DL = lecteur
Disque fixe 80H-FFH
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00H
Si la fonction échoue
Drapeau de transport = défini
AH = statut (voir le tableau des statuts donné
plus tôt)
Commentaires :
Cette fonction est définie uniquement pour les disques durs fixes PC/XT. Elle formate l'intégralité du disque, en écrivant les champs d'adresse du disque et les secteurs de données, en commençant au cylindre spécifié.
INT 13H (0x13)
Fonction 08H (0x08) >> Obtenir les paramètres du lecteur
Appeler avec : AH = 08H
DL = lecteur
Disquette 00H-7FH
Disque fixe 80H-FFH
Renvoie : si la fonction réussit
Drapeau de transport = clair
BL = type de lecteur (disquette PC/AT et PS/2
disque)
Valeur |
Description |
01H |
360 Ko, 40 pistes, 5,25" |
02H |
1,2 Mo, 80 pistes, 5,25" |
03H |
720 Ko, 80 pistes, 3,5" |
04H |
1,44 Mo, 80 pistes, 3,5″ |
CH = 8 bits inférieurs du cylindre maximum
nombre
CL = bits 6-7 d'ordre élevé 2 bits du maximum
nombre de cylindre bits 0-5 maximum
numéro de secteur
DH = nombre de têtes maximal
DL = nombre de disques
ES : DI = segment : décalage du lecteur de disque
tableau des paramètres
Si la fonction échoue
Drapeau de transport = défini
AH = statut
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 lecteurs physiques connectés à l'adaptateur pour le lecteur demandé.
INT 13H (0x13)
Fonction 09H (0x09) >> Initialiser les caractéristiques du disque fixe
Appel avec : AH = 09H
DL = lecteur
Disque fixe 80H-FFH
Sur le PC/XT Vector pour INT 41H
doit pointer vers le bloc de paramètres du disque ou, sur PC/AT et PS/2
Le vecteur pour INT 41H doit pointer vers le disque
bloc de paramètres pour le lecteur 0
Le vecteur pour INT 46H doit pointer vers le disque
bloc de paramètres pour le lecteur 1
Renvoie : Si la fonction réussit
Drapeau de transport = clair
AH = 00H
Si la fonction échoue
Drapeau de transport = défini
AH = statut
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 les blocs de paramètres du disque du BIOS ROM. La fonction est prise en charge uniquement sur les disques fixes. Le format du bloc de paramètres pour les disques fixes PC et PC/XT est le suivant :
Changement(s) |
Contenu |
00H-01H |
Nombre maximal de cylindres |
02H |
Nombre maximum de têtes |
03H-04H |
Démarrage du cylindre à courant d'écriture réduit |
05H-06H |
Démarrage du cylindre de pré-compensation d'écriture |
07H |
Longueur maximale de la salve ECC |
08H
|
Option de conduite
Morceau(x) |
Importance (si définie) |
0 – 2 |
option de lecteur |
3 – 5 |
réservé (0) |
6 |
désactiver les entrées ECC |
7 |
désactiver les nouvelles tentatives d'accès au disque |
|
09H |
Valeur de délai d'attente standard |
0AH |
Valeur de délai d'attente pour le formatage du lecteur |
0BH |
Valeur de temporisation pour le contrôle du lecteur |
0CH-0FH |
Réservé |
Le format du bloc de paramètres pour les disques fixes PC/AT et PS/2 est le suivant :
Changement(s) |
Contenu |
00H_01H |
nombre maximal de cylindres |
02H |
nombre maximum de têtes |
03H-04H |
Réservé |
05H-06H |
démarrage écriture pré compensation cylindre |
07H |
longueur maximale de la salve ECC |
08H |
Options de conduite
Morceau(x) |
Importance (si définie) |
0 – 2 |
non utilisé |
3 |
plus de 8 têtes |
4 |
non utilisé |
5 |
carte des défauts du fabricant présente au
cylindre maximum +1 |
6 – 8 |
différent de zéro (10, 01 ou 11) si les nouvelles tentatives sont désactivées |
|
09H-0BH |
Réservé |
0CH-0DH |
cylindre de zone d'atterrissage |
0EH |
secteur par piste |
0FH |
Réservé |
INT 13H (0x13)
Fonction 0A H (0x0A ou 10) >> Lire le secteur long
Appel avec : AH = 0AH
AL = nombre de secteurs
CH = cylindre
CL = secteur
DH = tête
DL = lecteur
Disque fixe 80H-FFH
ES : BX = segment : décalage du tampon
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00H
AL = nombre de secteurs transférés
Si la fonction échoue
Drapeau de transport = défini
AH = statut
Commentaires :
Cette fonction lit un ou plusieurs secteurs du disque vers 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 interrompus après tout secteur présentant une erreur de lecture.
Cette fonction est prise en charge uniquement 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) >> Écriture du secteur long
Appel avec : AH = 0BH
AL = nombre de secteurs
CH = cylindre
CL = secteur
DH = tête
DL = lecteur
Disque fixe 80H-FFH
ES : BX = segment : décalage du tampon
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00H
AL = nombre de secteurs transférés
Si la fonction échoue
Drapeau de transport = défini
AH = statut
Commentaires:
Cette fonction écrit un ou plusieurs secteurs de la mémoire vers le disque. Chaque secteur de données doit être suivi de son code ECC de 4 octets. 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. Cette fonction est prise en charge uniquement sur les disques fixes.
INT 13H (0x13)
Fonction 0CH (0x0C ou 12) >> Recherche
Appel avec : AH = 0CH
CH = 8 bits inférieurs du cylindre
CL = 2 bits supérieurs du cylindre dans les bits 6-7
DH = tête
DL = lecteur
Disque fixe 80H-FFH
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00H
Si la fonction échoue
Drapeau de transport = défini
AH = statut
Commentaires:
Cette fonction positionne les têtes de lecture/écriture du disque sur le cylindre spécifié sans transférer aucune donnée. Les 2 bits supérieurs du numéro de cylindre sont placés dans les 2 bits supérieurs du registre CL. Cette fonction est prise en charge uniquement sur les disques fixes.
INT 13H (0x13)
Fonction 0DH (0x0D ou 13) >> Réinitialiser le système de disque fixe
Appel avec : AH = 0DH
DL = lecteur
Disque fixe 80H-FFH
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00H
Si la fonction échoue
Drapeau de transport = défini
AH = statut (voir INT 13H Fonction 01H)
Commentaires:
Cette fonction réinitialise le contrôleur de disque fixe, recalibre les lecteurs 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
Appel avec : AH = 0EH
ES : BX = segment : décalage du tampon
Renvoie : si la fonction réussit
Drapeau de transport = clair
Si la fonction échoue
Drapeau de transport = défini
AH = statut
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) >> Ecrire le tampon de secteur
Appel avec : AH = 0FH
ES : BX = segment : décalage du tampon
Renvoie : si la fonction réussit
Drapeau de transport = clair
Si la fonction échoue
Drapeau de transport = défini
AH = statut
Commentaires:
Cette fonction transfère les données de la mémoire système vers le tampon de 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 la fonction INT 13H 05H.
INT 13H (0x13)
Fonction 10H (0x10 ou 16) >> Obtenir l'état du lecteur
Appel avec : AH = 10H
DL = lecteur
Disque fixe 80H-FFH
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00H
Si la fonction échoue
Drapeau de transport = défini
AH = statut
Commentaires:
Cette fonction teste si le lecteur de disque fixe spécifié est opérationnel et renvoie l'état du lecteur. Cette fonction est prise en charge uniquement sur les disques fixes.
INT 13H (0x13)
Fonction 11H (0x11 ou 17) >> Recalibrer le lecteur
Appel avec : AH = 11H
DL = lecteur
Disque fixe 80H-FFH
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00H
Si la fonction échoue
Drapeau de transport = défini
AH = statut
Commentaires:
Cette fonction permet à l'adaptateur de disque fixe de se recalibrer pour le lecteur spécifié, en positionnant le bras de lecture/écriture sur le cylindre 0, et de renvoyer l'état du lecteur. Cette fonction est prise en charge uniquement sur les disques fixes.
INT 13H (0x13)
Fonction 12H (0x12 ou 18) >> Diagnostic de la RAM du contrôleur
Appel avec : AH = 12H
Renvoie : si la fonction réussit
Drapeau de transport = clair
Si la fonction échoue
Drapeau de transport = défini
AH = statut
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 réussi par l'état renvoyé.
INT 13H (0x13)
Fonction 13H (0x13 ou 19) >> Diagnostic du variateur du contrôleur
Appel avec : AH = 13H
Renvoie : Si la fonction réussit
Drapeau de transport = clair
Si la fonction échoue
Drapeau de transport = défini
AH = statut
Commentaires:
Cette fonction amène l'adaptateur fixe à exécuter des tests de diagnostic internes du lecteur connecté, indiquant si le test a réussi par l'état renvoyé.
INT 13H (0x13)
Fonction 14H (0x14 ou 20) >> Diagnostic interne du contrôleur
Appel avec : AH = 14H
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00H
Si la fonction échoue
Drapeau de transport = défini
AH = statut
Commentaires:
Cette fonction amène l'adaptateur de disque fixe à effectuer un auto-test de diagnostic intégré, indiquant si le test a réussi en fonction du statut renvoyé.
INT 13H (0x13)
Fonction 15H (0x15 ou 21) >> Obtenir le type de disque
Appel avec : AH = 15H
DL = lecteur
Disquette 00H-7FH
Disque fixe 80H-FFH
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = code de type de lecteur
00H si aucun lecteur n'est présent
01H si lecteur de disquette sans prise en charge du changement de ligne
02H si lecteur de disquette avec prise en charge du changement de ligne
03H si disque fixe
|
Et, si disque fixe (AH = 03H)
CX : DX = nombre de secteurs de 512 octets
Si la fonction échoue
Drapeau de transport = défini
AH = statut
Commentaires :
Cette fonction renvoie un code indiquant le type de disquette ou de disquette référencé par le code de lecteur spécifié.
INT 13H (0x13)
Fonction 16H (0x16 ou 22) >> Obtenir l'état de changement de disque
Appel avec : AH = 16H
DL = lecteur
Disquette 00H-7FH
Renvoie : si la ligne de modification est inactive et que le disque n'a pas été modifié
Drapeau de transport = clair
AH = 00H
Si la ligne de changement est active et que le disque a peut-être été modifié
Drapeau de transport = défini
AH = 06H
Commentaires:
Cette fonction renvoie l'état de la ligne de changement, indiquant si le disque du lecteur a pu être remplacé depuis le dernier accès au disque. Si cette fonction renvoie l'état 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 en déverrouillant et en verrouillant simplement la porte du lecteur de disquette sans retirer la disquette.
INT 13H (0x13)
Fonction 17H (0x17 ou 23) >> Définir le type de disque
Appel avec : AH = 17H
AL = code de type de disquette
Valeur |
Description |
00H |
Non utilisé |
01H |
Disquette 320/360 Ko dans un lecteur 360 Ko |
02H |
Disquette 320/360 Ko dans un lecteur 1,2 Mo |
03H |
Disquette de 1,2 Mo dans un lecteur de 1,2 Mo |
04H |
Disquette de 720 Ko dans un lecteur de 720 Ko |
SL = conduire
Disquette 00H-7FH
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00X
Si la fonction échoue
Drapeau de transport = défini
AH = statut
Commentaires:
Cette fonction sélectionne le type de disquette pour le lecteur spécifié.
INTERNE 13H (0x13)
Fonction 18H (0x18 ou 24) >> Définir le type de support pour le format
Appel depuis : AH = 18H
CH = nombre de cylindres
CL = secteur par piste
DL = lecteur
Disquette 00H-7FH
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00X
ES : DI = segment : décalage du disque
tableau des paramètres pour le type de média
Si la fonction échoue
Drapeau de transport = défini
AH = statut
Commentaires :
Cette fonction sélectionne les caractéristiques du support pour le lecteur spécifié, le lecteur doit donc disposer d'une disquette.
INTERNE 13H (0x13)
Fonction 19H (0x19 ou 25) >> Têtes de parc
Appel depuis : AH = 19H
DL = lecteur
Disque fixe 80H-FFH
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00X
Si la fonction échoue
Drapeau de transport = défini
AH = statut
Commentaires :
Cette fonction déplace le levier de lecture/écriture vers une piste qui n'est pas utilisée pour le stockage de données afin que les données ne soient pas corrompues lorsque le lecteur est éteint.
INTERNE 13H (0x13)
Fonction 1AH (0x1A ou 26) >> Formater le disque ESDI
Appel avec : AH = 1AH
AL = Adresse de bloc relative (RBA)
nombre de défauts dans le tableau
0 s'il n'y a pas de table RBA
>0 si la table RBA est utilisée
CL = bits de modification de format
Page(s) |
Importance (si définie) |
0 |
Ignorer la carte des défauts primaires |
1 |
Ignorer la carte des défauts secondaires |
2 |
Mettre à jour la carte des défauts secondaires |
3 |
Effectuer une analyse de surface avancée |
4 |
Générer une interruption périodique |
5-7 |
Réservé (doit être 0) |
DL = lecteur
Disque fixe 80H-FFH
ES:BX = segment:décalage de la table RBA
Renvoie : si la fonction réussit
Drapeau de transport = clair
AH = 00X
Si la fonction échoue
Drapeau de transport = défini
AH = statut (voir INT 13H Fonction 01H)
Commentaires :
Cette fonction initialise les champs de secteur de disque et d'adresse de suivi sur un disque connecté à un adaptateur de disque dur ESDI.
L'opération de cette fonction est appelée formatage de bas niveau et prépare le disque aux opérations de lecture/écriture physiques au niveau du secteur. Le disque doit ensuite être partitionné à l'aide de la commande FDISK, puis formaté de haut niveau à l'aide de la commande FORMAT pour installer le système de fichiers.