Section courante

A propos

Section administrative du site

Pilotes de périphériques DOS

Un pilote de périphérique est la partie du système d'exploitation responsable du contrôle et de la communication avec le matériel. Il représente le niveau le plus bas d'un système d'exploitation et permet à tous les autres niveaux de fonctionner indépendamment du matériel. Lors de l'adaptation d'un système d'exploitation à différents ordinateurs, c'est un avantage. Il n'est pas nécessaire de modifier l'ensemble du système d'exploitation, seuls les différents pilotes de périphériques doivent être modifiés.

Dans les systèmes d'exploitation antérieurs, les pilotes de périphérique résidaient dans le code du système d'exploitation. Cela signifiait que les modifications ou les mises à niveau de ces routines pour correspondre au nouveau matériel étaient très difficiles, voire impossibles. La version 2.0 de DOS a introduit un concept flexible de pilotes de périphériques. Cela permet à l'utilisateur d'adapter même le clone de PC le plus exotique au DOS.

Pilotes personnalisés

Étant donné que la communication entre DOS et un pilote de périphérique est basée sur des appels de fonction et des structures de données relativement simples, le programmeur en langage assembleur peut développer un pilote de périphérique pour adapter DOS à n'importe quel périphérique. Malheureusement, les pilotes de périphériques ne peuvent pas être programmés dans un langage de niveau supérieur.

Lors du développement du code d'un pilote, les mêmes règles sont observées que pour le développement d'un programme COM (pas d'accès direct au segment). La différence est qu'un pilote de périphérique démarre à l'adresse de déplacement 000h, et non à 100h. La fin de cette page explique en détail l'implémentation du langage d'assemblage.

Pilotes

Pendant le processus de démarrage DOS, les pilotes NUL, CON, AUX, PRN et les pilotes des unités de disque et du disque dur (si nécessaire) sont chargés et installés. Ils sont disposés séquentiellement en mémoire et connectés les uns aux autres. Si l'utilisateur souhaite installer son propre pilote, il doit en informer DOS à l'aide du fichier CONFIG.SYS. Ce fichier texte contient les informations dont DOS a besoin pour configurer le système. Le contenu du fichier CONFIG.SYS est lu et évalué pendant le processus de démarrage après avoir lié les pilotes standard. Si DOS trouve la commande DEVICE=, il sait qu'un nouveau pilote doit être inclus. Le nom du pilote et éventuellement une désignation de périphérique et de chemin sont indiqués après le signe égal.

ANSI.SYS

La séquence de commandes suivante inclut le pilote ANSI.SYS, étant fourni avec DOS. Ce pilote permet d'améliorer la sortie des caractères et les fonctions du clavier :

DEVICE=ANSI.SYS

Le nouveau pilote est ajouté à la chaîne immédiatement après le pilote de périphérique NUL (le premier pilote de la chaîne). Le pilote ANSI.SYS remplace le pilote CON par défaut. Pour garantir que tous les appels de fonction pour la communication du moniteur ou du clavier fonctionnent via ANSI.SYS, le pilote ANSI.SYS est placé en premier dans le groupe de périphériques et le pilote CON est déplacé plus loin dans la chaîne de périphériques. Étant donné que le système d'exploitation se déplace de lien en lien pendant la recherche, il trouve d'abord le nouveau pilote CON (ANSI.SYS) et l'utilise. Par conséquent, le système ignore l'ancien pilote CON, comme illustré ci-dessous :

ASSIGN

Tous les pilotes ne peuvent pas être remplacés par de nouveaux. Le pilote NUL est toujours le premier pilote de la chaîne. Si vous ajoutez un nouveau pilote NUL, le système ignore le nouveau pilote et continue d'accéder au pilote NUL d'origine. Ceci s'applique également aux pilotes des unités de disquettes et des disques durs. La raison en est que les unités de disque ont des spécificateurs de unité au lieu de noms tels que CON (par exemple, A:). Un nouveau unité de disque peut être ajouté au système, mais comme le DOS peut lui attribuer le nom D:, il se peut qu'il ne soit pas adressé par tous les programmes souhaitant accéder au périphérique A:. Ce problème peut être évité en redirigeant tous les accès aux périphériques à l'aide de la commande ASSIGN du DOS. Vous pouvez intégrer la commande ASSIGN au fichier AUTOEXEC.BAT. Il s'exécute après l'ajout de pilotes et l'exécution du fichier CONFIG.SYS. Pour rediriger tous les accès de l'unité A: (le premier unité de disque) vers le périphérique D: (dans ce cas, un nouveau pilote pour un nouvel unité de disque), le fichier AUTOEXEC.BAT doit contenir la séquence de commandes suivante :

ASSIGN A=D

Les pilotes des périphériques d'entreposage de masse et les pilotes tels que PRN sont gérés différemment. Le DOS a deux types de pilotes de périphériques :

Les pilotes de périphériques de caractères communiquent avec le clavier, l'écran, l'imprimante et d'autres matériels caractère par caractère (octet par octet). Les pilotes de périphériques blocs peuvent transmettre toute une série de caractères lors de chaque appel de fonction (disques, disques durs,...). Les deux groupes de pilotes diffèrent quelque peu par la manière dont chacun prend en charge différentes fonctions.

Pilotes de périphériques de caractères

Commençons par les pilotes de périphérique en mode caractère car leur structure est plus simple que les pilotes de périphérique en mode bloc. Les pilotes de périphérique de caractères transmettent un octet pour chaque appel de fonction. Ils communiquent avec des périphériques tels que le clavier, l'écran, l'imprimante et le modem. Un pilote de périphérique ne peut desservir qu'un seul périphérique. Par conséquent, des pilotes individuels pour le clavier, l'affichage, l'imprimante, ... existent dans DOS après le démarrage.

Les périphériques de caractères peuvent fonctionner en mode Cooked ou en mode brute.

Mode Cooked

En mode Cooked, le pilote de périphérique lit les caractères du périphérique et effectue un test pour certains caractères de contrôle. Le DOS transmet ensuite le caractère à un tampon interne. Le DOS vérifie également si des caractères Enter, Ctrl+P, Ctrl+S ou Ctrl+C existent. Si le système détecte le caractère Enter, il ignore toute autre entrée du pilote de périphérique, même si le nombre de caractères spécifié n'a pas encore été lu. Ensuite, les caractères lus sont copiés du tampon interne vers le tampon du programme appelant. Si les caractères sont sortis en mode Cooked, le DOS teste Ctrl+C ou Ctrl+Break. Si l'une de ces combinaisons est détectée, le programme en cours s'arrête. L'appui sur Ctrl+S arrête temporairement le programme jusqu'à ce que l'utilisateur appuie sur une autre touche. Ctrl+P redirige la sortie de l'écran vers l'imprimante (PRN). Une deuxième pression sur Ctrl+P redirige la sortie de l'imprimante vers l'écran.

Mode brut

En mode brut, le pilote de périphérique lit tous les caractères sans test. Si un programme veut lire 10 caractères, il lit exactement 10 caractères, même si l'utilisateur appuie sur la touche Enter comme deuxième caractère de la chaîne de caractères. Le mode brut transmet les caractères directement au tampon du programme appelant, au lieu d'utiliser un tampon DOS interne. Lors de la sortie des caractères, le mode brut ne teste pas Ctrl+C ou Ctrl+Break.

La fonction 44h du DOS de l'interruption 21h définit le mode du pilote de périphérique caractère.

Bloc de pilotes de périphérique

Un pilote de périphérique bloc communique normalement avec des périphériques d'entreposage de masse tels que des disquettes ou des disques durs, ou des cassettes à grande vitesse. Pour cette raison, ils transmettent simultanément un certain nombre de caractères qui sont désignés comme un bloc. Dans certains cas, un seul appel à une fonction transmet plusieurs blocs de données. Les tailles de ces blocs peuvent différer d'un périphérique de stockage de masse à l'autre, ainsi qu'au sein d'un périphérique d'entreposage de masse particulier.

Accès

Il existe plusieurs façons d'accéder à un pilote de périphérique. Les pilotes de périphériques de caractères sont accessibles à l'aide du FCB normal ou des fonctions de gestion en indiquant simplement le nom d'un pilote (par exemple, CON: au lieu d'un nom de fichier). Un pilote de périphérique bloc est accessible à l'aide des fonctions DOS normales (fichier, répertoire,...) en utilisant l'indicateur de l'unité de disque attribué par DOS lors du processus de démarrage.

Les fonctions 1h à Ch de l'interruption 21h appellent des opérations de lecture et d'écriture dans un pilote de périphérique. Deux autres options existent pour accéder aux pilotes de périphériques.

Structure d'un pilote de périphérique

Même si les deux types de pilotes de périphériques diffèrent sur certains détails importants, ils ont des structures similaires. Chacun a un entête de périphérique, une routine de stratégie et une routine d'interruption (un type d'interruption différent de ceux que vous avez lus jusqu'à présent).

Entête du périphérique

L'entête de périphérique apparaît au début de chaque pilote de périphérique et contient les informations nécessaires à DOS pour implémenter le pilote.

Les deux premiers champs sont le lien vers le pilote suivant (déplacement et adresse de segment) dans la chaîne des pilotes de périphérique. Les emplacements de mémoire requis pour ces champs de liaison doivent être réservés par le programmeur, mais DOS se remplit lorsque le pilote est installé dans le système. Le champ suivant de l'entête du périphérique est le mot d'attribut. Le mot d'attribut décrit le pilote de périphérique et indique à DOS, entre autres, s'il s'agit d'un pilote de périphérique bloc ou caractère.

Voici l'entête du pilote de périphérique :

Déplacement Taille Description
+ 00h 1 mot Déplacement de l'adresse du pilote suivant
+ 02h 1 mot Adresse de segment du pilote suivant
+ 04h 1 mot Attribut du périphérique
+ 06h 1 mot Adresse de déplacement de la routine de stratégie
+ 08h 1 mot Adresse de déplacement de la routine d'interruption
+0Ah 8 octets Nom du pilote du pilote de caractères ou nombre de périphériques utilisés par le pilote de bloc

Voici la structure des attributs d'un périphérique :

Bit Description
0 1=Périphérique de sortie standard courant
1 1=Périphérique d'entrée standard courant
2 1=Périphérique d'horloge courant
3 1=Périphérique NUL courant
11 1=Changement de média reconnu
13 1=Format non-IBM (pilote de bloc)
1=Sortie jusqu'à instruction
14 1=Support IOCTL
15 0=Pilote de bloc
1=Pilote de caractères

Seuls les bits 11 à 15 sont utilisés par un pilote de bloc. Le bit IOCTL indique à DOS si ce pilote prend en charge la fonction IOCTL de DOS. La fin de ce chapitre et les descriptions des fonctions 3 et 12 décrivent plus en détail cette fonction. Le bit 11 apparaît pour la première fois dans DOS version 3 et devrait être 0 dans les versions antérieures. Un pilote de bloc indique si un changement de support est reconnu sur le périphérique pris en charge (par exemple, un unité de disquette). Si le bit est défini, le pilote doit prendre en charge quelques fonctions supplémentaires.

Les deux champs suivants contiennent l'adresse de décalage de la routine de stratégie et de la routine d'interruption. Le dernier champ contient le nom du pilote de périphérique s'il s'agit d'un pilote de périphérique caractère. Si le nom comporte moins de huit caractères, des espaces (code ASCII 32) complètent les caractères restants. S'il s'agit d'un pilote de périphérique bloc, le premier octet de ce champ contient le nombre de périphériques logiques pris en charge par le pilote. Les sept octets restants de ce champ restent inutilisés et contiennent la valeur 0.

Routine de stratégie

Le DOS appelle d'abord la routine de stratégie pour initialiser le pilote, puis à plusieurs reprises avant chaque demande d'entrée/sortie suivante de la routine d'interruption du pilote. L'adresse d'une structure de données contenant des informations sur l'opération à effectuer (l'entête de requête) est transmise par DOS à la routine de stratégie dans la paire de registres ES:BX. Le pointeur de mot double vers le bloc de données est entreposé et le contrôle revient immédiatement au DOS. Le DOS appelle ensuite la routine d'interruption du pilote pour effectuer l'opération proprement dite.

L'entête de requête, dont l'adresse est transmise à la routine de stratégie, contient toujours au moins 13 octets et contient des informations indiquant au pilote comment effectuer l'opération à venir. Selon les opérations effectuées, des informations complémentaires peuvent être ajoutées à la fin de l'entête de la requête qui diffèrent selon l'opération.

Déplacement Taille Description
+ 00h 1 mot Longueur du bloc de données en octets
+ 01h 1 mot Numéro du périphérique en communication
+ 02h 1 mot Code de commande
+ 05h 8 octets Réservé
+ 0Dh 1 octet Descripteur de média
+ 0Eh 1 mot Adresse de déplacement de tampon
+ 1Dh 1 mot Adresse du segment de tampon
+ 12h 1 mot Nombre
+ 14h 8 octets Secteur de départ

Le DOS appelle la routine d'interruption immédiatement après avoir appelé la routine de stratégie. Sa première tâche est de sauvegarder dans la pile les registres du processeur dont le contenu sera modifié par les différentes fonctions du pilote. Ensuite, il obtient le code de commande du champ 3 de l'entête de requête et appelle la routine de code de commande appropriée. Après avoir exécuté la routine, il remplit le champ d'état de l'entête de requête et restaure les registres du microprocesseur à partir de la pile. Dans une dernière étape, il rend le contrôle à la fonction DOS appelante.

Champ d'état

La valeur du champ d'état spécifie si la fonction s'est exécutée sans erreur, ou si une erreur s'est produite lors de l'exécution. Pour cette raison, chaque fonction de pilote doit activer le bit DONE (bit 8) dans le champ d'état. Ce bit DONE doit être défini même si la fonction est une fonction fictive (non performante).

Bit Description
0 à 7 Code d'erreur si le bit 15=1 :
Valeur Description
0 Protection en écriture du média
1 Périphérique inconnu
2 Unité de disque pas prête
3 Commande inconnu
4 Erreur de lecture (CRC)
5 Paramètre de bloc de données
6 Erreur de recherche
7 Média inconnu
8 Secteur non trouvé
9 Manque de papier dans l'imprimante
10 Erreur d'écriture
11 Erreur de lecture
12 Erreur commun
13 Change de média illégale
8 1=Occupé
9 1=Prêt
15 0=OK,1=Erreur

Fonctions du pilote de périphérique

Sous DOS version 2, tout pilote de périphérique installable doit prendre en charge 13 fonctions, numérotées de 0 à 12, même si leur seule action consiste à définir le drapeau DONE dans le mot d'état. Les versions DOS 3 et 4 incluent quatre fonctions supplémentaires pouvant être prises en charge, mais ne sont pas obligatoires. Certaines de ces fonctions concernent l'un des deux types de pilotes, tandis que d'autres s'appliquent aux deux types de pilotes (par exemple, l'initialisation). Les fonctions inutilisées doivent au moins activer le drapeau DONE du mot d'état. Examinons en détail les différentes fonctions en fonction de leurs numéros de fonction.

Entête de demande

Chaque fonction décrite ici reçoit ses paramètres de l'entête de requête (dont l'adresse est transmise par DOS à la routine de stratégie) et entrepose ses "résultats" dans l'entête de requête. Pour cette raison, l'adresse de déplacements des paramètres, par rapport au début de l'entête de la requête, est transmise à la fonction spécifiée. Ces paramètres sont ensuite transférés à des variables. Outre cette adresse de déplacement, un drapeau indique si cette information consiste en un octet, un mot ou un PTR. Le type de données PTR représente un pointeur vers un tampon et se compose de deux mots adjacents. Le premier mot est l'adresse de déplacement du tampon. Le deuxième mot est l'adresse de segment du tampon.

Fonction 0 : Initialisation du pilote

Le DOS appelle cette fonction pendant la procédure de démarrage du système pour initialiser le pilote de périphérique. Cette fonction peut impliquer l'initialisation du matériel, la définition de diverses variables internes à leurs valeurs par défaut ou la redirection des interruptions. Étant donné que l'ensemble du système d'exploitation n'a pas été complètement initialisé à ce stade, la routine d'initialisation ne peut appeler que les fonctions 1 à 0Ch et 30h de l'interruption 21h de DOS. Ces fonctions peuvent être utilisées pour déterminer le numéro de version DOS et pour afficher un message d'identification du pilote à l'écran. Même si le pilote nouvellement lié est un pilote CON, la sortie sur l'affichage se produit via l'ancien pilote CON, car il n'y a pas de nouveaux pilotes liés au système après l'achèvement de la routine d'initialisation.

Initialisation et en-tête de requête

La routine d'initialisation peut obtenir deux informations à partir de l'entête de requête. Le premier élément est l'adresse mémoire contenant le texte suivant le signe égal sur la ligne du fichier CONFIG.SYS ayant chargé le pilote dans le système.

Une ligne typique dans un fichier CONFIG.SYS peut ressembler à ceci :

DEVICE=ANSI.SYS

Dans ce cas, le nom du périphérique est ANSI.SYS, attribuant les séquences d'échappement ANSI standard pour le contrôle de l'écran au PC. L'adresse mémoire transmise à la routine d'initialisation pointe sur le caractère suivant le signe égal (dans ce cas, le A de ANSI.SYS). Cela permet d'entreposer des informations supplémentaires après le nom du pilote de périphérique. Cette information est ignorée par DOS, mais peut être lue par d'autres routines.

Désignation du périphérique logique

Le deuxième élément n'est disponible que sous DOS version 3.0 et supérieure, et uniquement si le pilote est un pilote de périphérique bloc. Il s'agit de la désignation alphabétique du premier périphérique logique du pilote. La valeur 0 correspond à A, 1 à B, 2 à C,...

La routine d'initialisation doit renvoyer quatre paramètres à la fonction DOS appelante. Le premier paramètre est l'état de la fonction, c'est-à-dire l'indication de l'exécution correcte de la fonction. Pour un pilote de périphérique bloc, le nombre de périphériques logiques pris en charge doit également être transmis. Ces informations peuvent également être obtenues à partir de l'entête du pilote de périphérique, mais sont ignorées par DOS.

Le paramètre suivant que le pilote de périphérique doit transmettre à DOS est l'adresse mémoire la plus élevée qu'il occupe ou utilise. Cela permet au DOS de savoir où le prochain pilote de périphérique peut être installé.

BPB

Si le pilote est un pilote de périphérique bloc, le dernier paramètre passé doit être l'adresse d'un tableau contenant une entrée pour chaque périphérique logique. Ce tableau contient les adresses des blocs de paramètres BIOS (BPB). L'adresse est transmise sous la forme de deux mots, le premier mot contient le déplacement et le second mot contient l'adresse de segment du tableau. Les deux premiers mots de ce tableau correspondent à l'adresse du premier périphérique logique pris en charge. Les deux mots suivants indiquent l'adresse du deuxième périphérique logique,... Le BPB est un bloc de données contenant des informations décrivant un périphérique logique. Si tout ou partie des périphériques logiques ont le même format, toutes les entrées de la table d'adresses BPB peuvent pointer vers un seul BPB.

Voici la conception du bloc de paramètres du BIOS :

Déplacement Taille Description
+ 00h 1 mot Octets par secteur
+ 02h 1 octet Secteurs par unité d'allocation
+ 03h 1 mot Secteurs réservés (y compris les secteurs de démarrage)
+ 05h 1 octet Nombre de FAT
+ 06h 1 mot Nombre maximal d'entrées dans le répertoire racine
+ 08h 1 mot Nombre total de secteurs
+ 0Ah 1 octet Descripteur de média
+ 0Bh 1 mot Nombre de secteurs par FAT

Voici l'octet de descripteur de média :

Valeur Description
F8h Disque dur
F9h Disquette 5,25", double face, 15 secteurs par piste
FCh Disquette 5,25", simple face, 9 secteurs par piste
FDh Disquette 5,25", double face, 9 secteurs par piste
FEh Disquette 5,25", simple face, un secteur par piste
FFh Disquette 5,25", double face, 8 secteurs par piste

Paramètres d'appel de la fonction 0 :

Déplacement Taille Description
2 Octet Numéro de fonction (0)
18 PTR Adresse du caractère qui suit le signe égal après la commande DEVICE dans le fichier CONFIG.SYS.
22 Octet Numéro de périphérique du premier périphérique pris en charge par le pilote (0=A, 1=B...) (s'applique uniquement aux pilotes de périphérique de blocage à partir de la version DOS 3.0 UP)

Paramètres renvoyés par la fonction 0 :

Déplacement Taille Description
3 Mot Mot d'état
13 Octet Nombre de périphérique pris en charge (périphériques de bloc uniquement)
14 PTR Adresse du premier emplacement mémoire disponible après le pilote
18 PTR Adresse du tableau contenant les adresses de BPB (périphériques en mode bloc uniquement)

Fonction 1 : vérification des médias

Cette fonction est utilisée uniquement avec un pilote de périphérique bloc. Un pilote de périphérique de caractères doit simplement définir le drapeau DONE du mot d'état et quitter. Cette fonction est utilisée par DOS pour déterminer si le support (disquette) a changé. Il est souvent utilisé lors de l'examen d'un répertoire de disque. Si le support disque n'a pas été changé depuis le dernier accès, le DOS a toujours cette information en mémoire, sinon DOS doit relire les informations du support ce qui retarde l'exécution de la tâche en cours.

Dans certains cas, comme pour les disquettes, la réponse à la question est assez compliquée. Pour cette raison, DOS permet à la fonction 1 de répondre non seulement par "oui" et "non", mais aussi par "ne sait pas". Dans tous les cas, la réponse affecte davantage l'activité DOS.

Si le média est inchangé, l'accès au média peut avoir lieu immédiatement. Si le support a été modifié, cependant, DOS ferme tous les tampons internes liés au périphérique logique actuel. Cela entraîne la perte de toutes les données qui auraient dû être transmises aux médias. Ensuite, il appelle la fonction 2 du pilote de périphérique actuel, charge la FAT et le répertoire racine. Si la fonction de vérification des supports répond par "ne sait pas", les mesures supplémentaires prises par DOS dépendent de l'état des tampons internes liés au périphérique logique actuel. Si ces tampons internes sont vides, DOS suppose que le support a été changé et agit comme si la fonction 1 avait répondu "oui". Si les tampons contiennent des données qui auraient dû être transmises au support, DOS suppose que le support est intact et écrit les données. Si le support a effectivement été modifié, les données écrites sur un support modifié peuvent endommager la structure de fichiers de la nouvelle disquette.

Étant donné que le traitement ultérieur dépend de la réponse de la fonction de vérification du support, le pilote doit gérer la réponse avec soin. Avant d'activer le mécanisme utilisé par la fonction pour répondre, la fonction examine les paramètres lui étant transmis. Si le pilote prend en charge plusieurs périphériques logiques, le premier paramètre est le nombre de périphériques. Vient ensuite un code descripteur de média. Ce code contient des informations sur le type de support utilisé en dernier dans le périphérique logique actuel. Seuls les appareils capables de gérer plusieurs formats différents peuvent utiliser cette tâche. Par exemple, les unités de disque FAT pouvant utiliser à la fois les formats de disquette 360K et 1,2 mégaoctet.

Si la fonction de vérification du support détermine que le support d'un périphérique n'est pas amovible (par exemple, un disque fixe), il peut toujours répondre "non modifié". Si, d'autre part, le support de le périphérique peut être changé (par exemple, un disque), la réponse correcte ne peut être déterminée que par des procédures assez complexes. Si ces procédures ne sont pas utilisées, la réponse doit être "ne sait pas". Par souci d'exhaustivité, voici les trois procédures fournissant des résultats assez précis.

Étant donné qu'un périphérique avec un support interchangeable possède un mécanisme d'ouverture et de fermeture, la fonction doit vérifier si le support a été retiré. Cependant, il ne peut pas déterminer si le support retiré est identique au support nouvellement inséré.

Si le support a un nom, la fonction doit lire ce nom pour déterminer si le support a été modifié. Cette procédure n'a de sens que si chaque média a un nom unique.

La procédure de l'unité de disque utilisée par DOS repose sur le fait que le changement de support prend un certain temps. Le DOS suppose que même un utilisateur pouvant se déplacer rapidement a besoin d'environ deux secondes pour retirer une disquette d'un unité de disque et insérer une nouvelle disquette dans le même unité de disque. Si deux accès consécutifs à la disquette se produisent à moins de deux secondes d'intervalle, DOS suppose qu'aucun changement de disquette ne s'est produit.

Un octet dans le bloc de données est utilisé pour indiquer les changements. La valeur -1 (FFH) signifie «modifié», 0 signifie «ne sait pas» et 1 signifie «non modifié». Si le support a été changé, le pilote de périphérique signale un changement de support (bit 11 dans l'attribut de périphérique = 1), l'adresse d'un tampon doit être transmise à DOS version 3 et plus récente, contenant le nom de volume du support précédent. Ce nom doit y être stocké sous forme de chaîne de caractères ASCII et se terminer par un caractère de fin (code ASCII 0).

Paramètres d'appel de la fonction 1 :

Déplacement Taille Description
1 Octet Numéro de périphérique
2 Octet Numéro de fonction (1)
13 Octet Octet de descripteur de média

Paramètres renvoyés par la fonction 1 :

Déplacement Taille Description
3 Mot Mot d'état
14 Octet Le média a-t-il été modifié ? FFh = oui, 00h = ne sait pas, 01h = non
15 PTR Adresse du tampon contenant le nom du volume précédent (uniquement si le périphérique indique un changement de média)

Fonction 2 : Construire le bloc de paramètres du BIOS (BPB)

Cette fonction est utilisée uniquement par les pilotes de périphérique bloc. Un pilote de périphérique de caractères doit simplement définir le drapeau DONE du mot d'état et quitter. Le DOS appelle cette fonction lorsque la fonction de vérification du support détermine que le support a été changé. Cette fonction renvoie un pointeur vers un nouveau BPB pour le média.

Comme vous pouvez le voir par la disposition des paramètres d'appel, le descripteur de média du numéro de périphérique et un pointeur vers un tampon sont passés à cette fonction par DOS. Si l'équipement est un format standard (bit 13 de l'attribut d'équipement=0), alors le tampon contient le premier secteur de la FAT.

Paramètres d'appel de la fonction 2 :

Déplacement Taille Description
1 octet Numéro de périphérique
2 octet Numéro de fonction (2)
3 octet Octet de descripteur de média
14 PTR Adresse d'un tampon contenant la FAT

Paramètres renvoyés de la fonction 2 :

Déplacement Taille Description
3 Mot Mot d'état
18 PTR Adresse du BPB du périphérique adressé

Fonction 3 : lecture de contrôle d'entrée/sortie

Cette fonction transmet les informations de contrôle du pilote de périphérique de caractères ou de blocs au programme d'application. Il ne peut être appelé via la fonction 44h de l'interruption 21h que si le bit IOCTL dans le mot d'attribut de périphérique dans l'entête du pilote de périphérique est défini. Différents paramètres sont transmis à la fonction, selon que le pilote est un pilote de périphérique caractère ou bloc.

Un pilote de périphérique de caractères reçoit le nombre de caractères à transférer et l'adresse d'un tampon pour le transfert des données.

Un pilote de périphérique bloc reçoit le numéro de périphérique, l'octet du descripteur de média, l'adresse du tampon à utiliser pour le transfert de données, le pointeur vers le premier secteur à lire et le nombre de secteurs à lire.

Paramètres d'appel de la fonction 3 :

Déplacement Taille Description
1 Octet Numéro de périphérique (périphériques de bloc uniquement)
2 Octet Numéro de fonction (3)
13 Octet Octet de descripteur de média (périphériques de bloc uniquement)
14 PTR Adresse du tampon dans lequel les données doivent être transmises
18 Mot Nombre de secteurs à lire (périphérique de bloc) ou Nombre de caractères à lire (périphérique de caractère)
20 Mot Premier secteur à être lu (périphériques de bloc uniquement)

Paramètres renvoyés de la fonction 3 :

Déplacement Taille Description
3 Mot Mot d'état
18 Mot Nombre de secteurs lus (périphérique de bloc)
Nombre de caractères lus (périphérique de caractère)

Fonction 4 : Lire

Cette fonction lit les données du périphérique vers un tampon spécifié dans le paramètre d'appel. En cas d'erreur lors de la lecture des données. l'état d'erreur doit être défini. De plus, la fonction doit signaler le nombre de secteurs ou d'octets lus avec succès. Il ne suffit pas de signaler une erreur.

Paramètres d'appel de la fonction 4 :

Déplacement Taille Description
1 Octet Numéro de périphérique (bloc périphérique uniquement)
2 Octet Numéro de fonction (4)
13 Octet Octet de descripteur de média (bloc périphérique uniquement)
14 PTR Adresse du tampon dans lequel les données doivent être lues
18 Mot Nombre de secteurs à lire (périphérique de bloc) ou Nombre de caractères à lire (périphérique de caractère)
20 Mot Premier secteur à être lu (bloc périphérique uniquement)

Paramètres renvoyés de la fonction 4 :

Déplacement Taille Description
3 Mot Mot d'état
18 Mot Nombre de secteurs lus (périphérique de bloc) ou nombre de caractères lus (périphérique de caractère)
22 PTR Pointeur vers l'identificateur de volume au retour de l'erreur 0Fh (version 3.0 et supérieure)

Fonction 5 : Lecture non destructive

Cette fonction est utilisée par un pilote de périphérique de caractères pour tester les caractères non lus dans le tampon d'entrée. Un périphérique bloc doit définir le drapeau DONE du mot d'état et quitter.

Le DOS teste les caractères supplémentaires à l'aide de cette fonction. S'il existe plus de caractères, le bit occupé doit être effacé (mis à 0) et le caractère suivant passé au DOS. Le caractère passé reste dans le tampon afin qu'un appel ultérieur à une fonction de lecture renvoie ce même caractère. S'il n'existe aucun caractère supplémentaire, le bit d'occupation doit être défini (mis à 1).

Paramètre d'appel de la fonction 5 :

Déplacement Taille Description
2 Octet Numéro de fonction (5)

Paramètres renvoyés de la fonction 5 :

Déplacement Taille Description
3 Mot Mot d'état
13 Octet Le caractère a lire

Fonction 6 : état d'entrée

Cette fonction est utilisée pour déterminer si un caractère attend d'être lu à partir du tampon d'entrée d'un périphérique de caractères. Un pilote de périphérique bloc doit définir le drapeau DONE du mot d'état et quitter.

Si un caractère attend d'être lu dans le tampon d'entrée, le bit occupé est effacé (mis à 0). Si un caractère ne se trouve pas dans le tampon d'entrée, le bit occupé est défini (mis à 1).

Lorsqu'un caractère est en attente de lecture, la fonction d'état d'entrée (06h) réinitialise le bit occupé du mot d'état à 0 et renvoie le caractère au DOS. Le caractère n'est pas supprimé du tampon et est donc non destructif. Cette fonction équivaut à une anticipation à un caractère.

Paramètre d'appel de la fonction 6 :

Déplacement Taille Description
2 Octet Numéro de fonction (6)

Paramètres renvoyés par la fonction 6 :

Déplacement Taille Description
3 Mot Mot d'état : Caractères déjà dans le tampon=0 ; Demande de lecture au périphérique physique=1

Fonction 7 : vider les tampons d'entrée

Cette fonction efface les tampons d'entrée internes d'un pilote de périphérique de caractères. Tous les caractères lus mais pas encore passés au DOS sont perdus lorsque cette fonction est utilisée. Un pilote de périphérique bloc doit définir le drapeau DONE du mot d'état et quitter.

Paramètre d'appel de la fonction 7 :

Déplacement Taille Description
2 Octet Numéro de fonction (7)

Paramètres renvoyés par la fonction 7 :

Déplacement Taille Description
3 Mot Mot d'état

Fonction 8 : Écrire

Cette fonction transfère les caractères d'un tampon vers le périphérique courant. Si une erreur survient lors de la transmission, le mot d'état est utilisé pour signaler cette erreur. Les périphériques bloc et caractère utilisent cette fonction.

Les paramètres utilisés pour cette fonction varient selon que le pilote est destiné à un périphérique caractère ou bloc. Les deux transmettent une adresse de tampon à partir de laquelle un certain nombre de caractères doivent être transférés. Un pilote de périphérique de caractères reçoit le nombre d'octets à transférer en plus de ces informations.

Un pilote de bloc reçoit le nombre de secteurs à transférer (pas le nombre de caractères), le numéro du périphérique à adresser, son descripteur de média et l'adresse du premier secteur sur le média.

Si une erreur se produit lors de l'écriture des données, l'état d'erreur doit être défini. De plus, la fonction doit signaler le nombre de secteurs ou d'octets écrits avec succès. Il ne suffit pas de signaler une erreur.

Paramètres d'appel de la fonction 8 :

Déplacement Taille Description
1 Octet Numéro de périphérique (pilotes de bloc uniquement)
2 Octet Numéro de fonction (8)
13 Octet Descripteur de média du périphérique adressé (périphérique de bloc uniquement)
14 PTR Adresse du tampon contenant les données
18 Mot Nombre de secteurs à écrire (périphérique de bloc)
Nombre de caractères à écrire (périphérique de caractère)
20 Mot Premier secteur à être écrit (périphérique bloc uniquement)

Paramètres renvoyés de la fonction 8 :

Déplacement Taille Description
3 Mot Mot d'état
18 Mot Nombre de secteurs écrits (périphérique de bloc)
Nombre de caractères écrits (caractère périphérique)
22 PTR Pointeur vers l'identificateur de volume en cas de retour d'erreur 0Fh (version 3.0 supérieure)

Fonction 9 : Écrire avec Vérifier

Cette fonction est similaire à la fonction 8, mais à la différence que les caractères écrits sont relus et vérifiés.

Certains périphériques, en particulier les périphériques de caractères tels qu'un moniteur ou une imprimante, ne nécessitent pas de vérification car aucune erreur ne se produit lors de la transmission (moniteur) ou les données ne peuvent pas être vérifiées (imprimante).

Paramètres d'appel de la fonction 9 :

Déplacement Taille Description
1 Octet Numéro de périphérique (pilotes de bloc uniquement)
2 Octet Numéro de fonction (9)
13 Octet Descripteur de média de périphérique adressé (périphérique bloc uniquement)
14 PTR Adresse du tampon contenant les données
18 Mot Nombre de secteurs à écrire (périphérique de bloc)
Nombre de caractères à écrire (périphérique de caractère)
20 Mot Premier secteur à être écrit (périphérique bloc uniquement)

Paramètres renvoyés de la fonction 9 :

Déplacement Taille Description
3 Mot Mot d'état
18 Mot Nombre de secteurs écrits (périphérique de bloc)
Nombre de caractères écrits (périphérique de caractère)
22 PTR Pointeur vers l'identificateur de volume au retour de l'erreur 0Fh (Version 3.0 et supérieure)

Fonction 10 : État de la sortie

Cette fonction indique si la dernière opération d'écriture sur un périphérique de caractères est terminée ou non. Un périphérique de bloc doit définir le drapeau DONE dans le mot d'état et quitter.

Si la dernière opération d'écriture est terminée, le bit occupé du mot d'état est effacé ; sinon le bit occupé est mis à 1.

Paramètre d'appel de la fonction 10 :

Déplacement Taille Description
2 Octet Numéro de fonction (10)

Paramètres renvoyés par la fonction 10 :

Déplacement Taille Description
3 Mot Mot d'état : Le bit occupé est à 1 si le dernier caractère émis n'a pas été complété

Fonction 11 : Vider les tampons de sortie

Cette fonction efface complètement le tampon de sortie même s'il contient des caractères en attente de sortie. Un périphérique bloc doit définir le drapeau DONE sur le mot d'état et quitter.

Paramètre d'appel de la fonction 11 :

Déplacement Taille Description
2 Octet Numéro de fonction (11)

Paramètres renvoyés par la fonction 11 :

Déplacement Taille Description
3 Mot Mot d'état

Fonction 12 : écriture de contrôle d'entrée/sortie

Cette fonction transmet les informations de contrôle du programme d'application au pilote de périphérique caractère ou bloc. Il ne peut être appelé que via la fonction 44h de l'interruption 21h à condition que le bit IOCTL dans le mot d'attribut de périphérique dans l'entête du pilote de périphérique soit défini. Différents paramètres sont transmis à la fonction, selon que le pilote est un pilote de périphérique caractère ou bloc.

Un pilote de périphérique de caractères reçoit le nombre de caractères à écrire et l'adresse du tampon à partir duquel ces caractères sont transférés.

Un pilote de périphérique bloc reçoit le numéro de périphérique (au cas où le pilote gère des périphériques logiques), l'octet du descripteur de média, l'adresse du tampon à partir duquel les données doivent être écrites, le numéro du premier secteur à écrire et le numéro de secteurs à écrire.

Un pilote de périphérique de caractères renvoie le nombre d'octets écrits. Un pilote de périphérique bloc renvoie le nombre de secteurs écrits.

Paramètres d'appel de la fonction 12 :

Déplacement Taille Description
1 Octet Numéro de périphérique (bloc périphérique uniquement)
2 Octet Numéro de fonction (12)
13 Octet Descripteur de média du périphérique adressé (périphérique de bloc uniquement)
14 PTR Adresse du tampon à partir duquel les données doivent être lues
18 Mot Nombre de secteurs à écrire (périphérique de bloc)
Nombre de caractères à écrire (périphérique de caractère)
20 Mot Premier secteur à être écrit (périphérique bloc uniquement)

Paramètres renvoyés par la fonction 12 :

Déplacement Taille Description
3 Mot Mot d'état
18 Mot Nombre de secteurs écrits (périphérique de bloc)
Nombre de caractères écrits (périphérique de caractère)

Les quatre fonctions suivantes sont prises en charge par OOS version 3.0 et supérieure.

Fonction 13 : Ouvrir

Cette fonction ne peut être utilisée que si le bit OCR (Open/Close/RM) dans le mot d'attribut de périphérique dans l'entête du pilote du périphérique est défini. Sa tâche diffère selon qu'il s'agit d'un pilote de caractères ou de blocs.

Un pilote de bloc utilise cette fonction chaque fois qu'un fichier est ouvert. Cette fonction détermine combien de fichiers ouverts existent sur ce périphérique. Utilisez cette commande avec précaution, car les programmes qui accèdent aux appels de fonction FCB ont tendance à ne pas fermer les fichiers ouverts. Ce problème peut être évité en supposant lors de chaque changement de support qu'aucun fichier ne reste ouvert. Pour les périphériques avec un support non modifiable (par exemple, un disque dur), même cette procédure peut ne pas aider.

Dans un pilote de caractères, cette fonction peut envoyer une chaîne d'initialisation au périphérique avant de transmettre les données. C'est un avantage lorsqu'il est utilisé pour la communication avec l'imprimante. La chaîne d'initialisation ne doit pas être incluse dans le pilote, mais peut être appelée, par exemple, avec la fonction IOCTL de l'interruption 21h, appelant la fonction 12 d'un pilote pour la transmettre d'un programme d'application au pilote. La fonction peut également être utile car elle peut empêcher deux processus (en réseau ou en multitraitement) d'accéder tous les deux au même périphérique.

Pour les périphériques CON, PRN et AUX, cette fonction n'est pas appelée car ils sont toujours ouverts.

Paramètre d'appel de la fonction 13 :

Déplacement Taille Description
1 Octet Nombre de périphérique (périphérique de bloc seulement)
2 Octet Numéro de fonction (13)

Paramètres renvoyés par la fonction 13 :

Déplacement Taille Description
3 Mot Mot d'état

Fonction 14 : Fermeture du périphérique

Cette fonction est l'inverse de la fonction 13. Cette fonction ne peut être adressée que si le bit OCR dans le mot d'attribut de périphérique de l'entête du pilote d'appareil est activé. Sa tâche diffère selon qu'il s'agit d'un pilote de caractères ou de blocs.

Un pilote de bloc l'appelle après avoir fermé un fichier. Cela peut être utilisé pour décrémenter un nombre de fichiers ouverts. Une fois que tous les fichiers d'un périphérique sont fermés, le pilote doit vider les tampons des périphériques de support amovibles, car il est probable que l'utilisateur soit sur le point de supprimer le support.

Un pilote de personnage peut utiliser cette fonction pour envoyer des informations de contrôle de fermeture à un périphérique après avoir terminé la sortie. Pour une imprimante, cela pourrait être un saut de page. Comme dans la fonction 13, la chaîne peut être transmise à partir d'un programme d'application utilisant la fonction IOCTL.

Paramètres d'appel de la fonction 14 :

Déplacement Taille Description
1 Octet Numéro de périphérique (périphérique de bloc uniquement)
2 Octet Numéro de fonction (14)

Paramètre renvoyé de la fonction 14 :

Déplacement Taille Description
3 Mot Mot d'état

Fonction 15 : Support amovible

Cette fonction indique si le support d'un périphérique bloc peut être modifié ou non. Cette fonction n'est utilisée que si le bit OCR du mot d'attribut de périphérique du pilote de périphérique est défini. Un pilote de périphérique de caractères doit définir le drapeau DONE dans le mot d'état et quitter.

Si le support peut être retiré, le bit occupé est effacé ; sinon il est mis à 1.

Paramètres d'appel de la fonction 15 :

Déplacement Taille Description
1 Octet Numéro de périphérique (Bloquer le périphérique uniquement)
2 Octet Numéro de fonction (15)

Paramètre renvoyé par la fonction 15 :

Déplacement Taille Description
3 Mot Mot d'état : Si le support peut être retiré, le bit occupé doit contenir la valeur 0

Fonction 16 : Sortie jusqu'à occupé

Cette fonction transfère les données d'une mémoire tampon vers un périphérique de sortie jusqu'à ce que le périphérique soit occupé (c'est-à-dire qu'il ne puisse plus accepter plus de caractères). Comme cette fonction est prise en charge par les périphériques de caractères, un pilote de périphérique de bloc doit définir le drapeau DONE sur le mot d'état et quitter.

Cette fonction fonctionne particulièrement bien avec les tampons d'impression, grâce auxquels des fichiers peuvent être envoyés à une imprimante en tant qu'activité d'arrière-plan pendant qu'un programme s'exécute au premier plan. Il est possible que tous les caractères de la demande de transfert ne soient pas envoyés à un équipement lors de cet appel de fonction. Ce n'est généralement pas une erreur, cela peut être le résultat d'une occupation du périphérique. La fonction reçoit le nombre de caractères à transmettre ainsi que l'adresse du tampon. Si le périphérique de sortie indique pendant la transmission qu'il ne peut plus accepter de caractères supplémentaires, il indique le nombre de caractères transférés avec succès et rend la main au pilote de périphérique.

Paramètres d'appel de la fonction 16 :

Déplacement Taille Description
2 Octet Numéro de fonction (16)
14 PTR Adresse du tampon à partir duquel les données doivent être lues
18 Mot Nombre de caractères à lire

Paramètres renvoyés de la fonction 16 :

Déplacement Taille Description
3 Mot Mot d'état
18 Mot Nombre de caractères écrits

Pilote d'horloge

Le pilote d'horloge est un pilote de périphérique caractère dont la seule fonction est de transmettre la date et l'heure du DOS à une application. Le pilote d'horloge peut également avoir un nom différent, puisque DOS l'identifie par le fait que le bit 2 dans le mot d'attribut de périphérique de l'entête du pilote de périphérique est défini sur 1, au lieu de son nom. Le bit 15 doit également être défini car le pilote d'horloge est un pilote de périphérique de caractères. Les fonctions 2Ah à 2Dh de interruption 21h du DOS lisent la date et l'heure et appellent le pilote. Un pilote d'horloge ne doit prendre en charge que les fonctions 4, 8 et 0 (initialisation). Lors de l'appel de la fonction 4 (lecture), la date et l'heure passent du pilote au DOS. Le DOS peut définir une nouvelle date et heure avec la fonction 8. Les deux fonctions ont l'heure et la date passées dans un tampon de 6 octets de longueur.

Déplacement Taille Description
+ 00h 1 mot Nombre de jours depuis le 1er janvier 1980
+ 02h 1 octet Minutes
+ 03h 1 octet Heure
+ 04h 1 octet Centièmes de secondes
+ 05h 1 octet Secondes

Le format de la date est inhabituel. Au lieu de transmettre le mois, le jour et l'année séparément, le DOS transmet le nombre de jours écoulés depuis le 1er janvier 1980 sous la forme d'un nombre 16 bits. Une formule assez complexe convertit ce nombre en format de date normal, en tenant compte des années bissextiles. Le pilote d'horloge utilise normalement les fonctions 0 et 1 de l'interruption 1Ah du BIOS pour lire et régler l'heure.

Horloges sur les modèles AT

Les ordinateurs PC AT et compatibles AT ont une horloge en temps réel alimentée par batterie. Les fonctions 0 et 1 de l'interruption 1Ah utilisent un compteur de temps contrôlé par logiciel et non l'horloge temps réel alimentée par batterie. Lorsque l'ordinateur est redémarré, la date et l'heure précédemment définies avec la fonction pilote 8 sont effacées. Vous pouvez utiliser le pilote d'horloge pour accéder à l'horloge en temps réel en utilisant les fonctions 2 et 5 de l'interruption 1Ah au lieu des fonctions 0 et 1.

Appels de pilote de périphérique depuis DOS

Maintenant que vous êtes familiarisé avec les fonctions des différents pilotes de périphérique, vous pouvez envisager de développer votre propre pilote de périphérique personnel. Voici les étapes ayant lieu avant et après l'appel d'une fonction de pilote de périphérique.

Une chaîne d'événements commence lorsqu'une fonction DOS gérant l'entrée et la sortie est appelée à l'aide de l'interruption 21h. L'appel de l'une de ces fonctions peut à son tour appeler une série d'autres fonctions et les opérations de lecture et d'écriture correspondantes.

Ouvrir

Un exemple de ceci est lorsque la fonction 3Dh (Ouvrir) est appelée pour ouvrir un fichier dans un sous-répertoire. Tout d'abord, avant de pouvoir l'ouvrir, DOS doit trouver le fichier. Cela peut nécessiter la recherche d'un ensemble de répertoires au lieu de simplement lire dans la FAT. Lors de chaque accès à l'interruption 21h, DOS détermine lequel des pilotes de périphériques disponibles doit être utilisé pour lire ou écrire des caractères. Lorsque cela se produit, DOS réserve une zone de mémoire pour stocker les informations requises par le pilote de périphérique.

Pour les fichiers, DOS doit convertir le nombre d'enregistrements à traiter en numéros de secteur logique. Le DOS appelle ensuite la routine de stratégie du pilote de périphérique, à laquelle il transmet l'adresse du bloc de données nouvellement créé (entête de requête). Ensuite, la routine d'interruption du pilote est appelée, entreposant tous les registres. Il isole le code de fonction de la fonction demandée du bloc de données et commence à traiter la fonction.

Si le pilote adressé est un pilote de périphérique caractère, la fonction n'a qu'à envoyer les caractères au matériel ou demander la lecture des caractères.

Bloquer les périphériques

Pour un périphérique bloc (par exemple, un périphérique d'entreposage de masse tel qu'une disquette ou un disque dur), le numéro de secteur logique doit être converti en une adresse physique avant un accès en lecture ou en écriture. Le numéro de secteur logique est décomposé en un numéro de tête, de piste et de secteur physique.

Une fois l'opération de lecture ou d'écriture terminée, la fonction du pilote doit placer un code de résultat dans le champ d'état de l'entête de requête à renvoyer à la fonction DOS appelante. Ensuite, le contenu de tous les registres est restauré et le contrôle est rendu à la fonction DOS appelante, qui, selon le résultat de la fonction du pilote, définit ou réinitialise le drapeau de retenue et place tout code d'erreur dans le registre AX. La fonction d'interruption rend ensuite le contrôle à la routine ayant appelé l'interruption 21h.

Accès direct au pilote de périphérique : IOCTL

Ici, nous discutons IOCTL en détail, car il offre une autre méthode de communication avec le pilote de périphérique. Vous ne pouvez utiliser ces fonctions que si le bit IOCTL de l'attribut du périphérique est activé.

La fonction IOCTL elle-même est l'une des nombreuses fonctions adressables à partir de l'interruption 21h du DOS. Son numéro de fonction est 44h. Trois groupes de sous-fonctions sont accessibles :

Le numéro de la sous-fonction souhaitée est passé à la fonction IOCTL dans le registre AL. Après l'appel de la fonction, le drapeau de retenue indique si la fonction s'est exécutée correctement. Un drapeau de retenue défini indique l'occurrence d'une erreur et le code d'erreur peut être trouvé dans le registre AX.

État du pilote de périphérique de caractères

Le numéro de la sous-fonction souhaitée est passé à la fonction IOCTL dans le registre AL. Après l'appel de la fonction, le drapeau de retenue indique si la fonction s'est exécutée correctement. Un drapeau de retenue défini indique l'occurrence d'une erreur et le code d'erreur peut être trouvé dans le registre AX.

Les sous-fonctions 6 et 7 peuvent déterminer l'état d'un pilote de périphérique de caractères. La sous-fonction 6 peut déterminer si le périphérique est capable de recevoir des données. La sous-fonction 7 peut déterminer si le périphérique peut envoyer des données. Le descripteur de fichier de ce périphérique est passé dans le registre BX.

Si le périphérique est prêt, les deux fonctions 6 et 7 renvoient la valeur FFH dans le registre AL. La sous-fonction 2 lit les données de contrôle du pilote de périphérique de caractères. Le descripteur de fichier est passé dans le registre BX et le nombre d'octets à lire est passé dans le registre CX. De plus, la paire de registres DS:DX contient l'adresse du tampon dans lequel les données seront lues. Si le drapeau de retenue est effacé, la fonction a réussi et le registre AX contient le nombre de caractères lus. Si le drapeau de retenue est défini, une erreur s'est produite et le registre AX contient le code d'erreur.

La sous-fonction 3 écrit des informations de contrôle d'une mémoire tampon vers le pilote de périphérique de caractères. Encore une fois, le descripteur de fichier est passé dans le registre BX, le nombre d'octets à écrire dans le registre CX et l'adresse du tampon dans la paire de registres DS:DX.

Les codes retour sont les mêmes que pour la sous-fonction 2. Ces deux sous-fonctions sont utilisées pour faire passer des informations entre le programme d'application et le pilote de périphérique.

Bloquer l'état du pilote de périphérique

Les sous-fonctions 4 et 5 ont la même tâche que les sous-fonctions 2 et 3. Cependant, elles sont utilisées pour les périphériques en mode bloc et non pour les périphériques en mode caractère. Au lieu de passer la poignée dans le registre BX, vous passez le code de l'unité de disque (0=A, 1=B,...) dans le registre BL.

La sous-fonction 0 est utilisée pour obtenir des informations sur le périphérique pour une poignée spécifiée. Le numéro de la sous-fonction est passé dans le registre AL et le descripteur de fichier dans le registre BX. La fonction renvoie le mot d'information du périphérique dans le registre DX.

Pour les périphériques en mode bloc :

Bit Description
8 à 15 Réservés
7 0 si un périphérique bloc
6 0 si le fichier a été écrit
1 si le fichier n'a pas été écrit
0 à 5 Code d'unité de disque (0=A:, 1=B:,...)

Pour les périphériques à caractères :

Bit Description
15 Réservé
14 1 si l'équipement prend en charge les sous-fonctions IOCTL
0 si le périphérique ne prend pas en charge les sous-fonctions IOCTL
8 à 13 Réservé
7 1 si un périphérique de caractères
6 0 si fin de fichier pour périphérique d'entrée
5 0 si mode Cooked
1 si mode brute
4 Réservé
3 1 si le périphérique d'horloge
2 1 si le périphérique NUL
1 1 si le périphérique de sortie standard
0 1 si le périphérique d'entrée standard

Modes brute et Cooked

La sous-fonction 1 est utilisée pour définir les informations de périphérique pour un descripteur de fichier spécifiée. Cette sous-fonction est souvent utilisée pour régler le périphérique d'entrée standard du mode Cooked au mode brute ou inversement.

Deux interruptions finales sont parfois utilisées par les pilotes de périphériques en mode bloc. Ces deux interruptions, 25h et 26h, sont utilisées pour lire et écrire sur l'unité de disque. Vous pouvez utiliser ces interruptions, par exemple, pour traiter des disques ayant été formatés à l'aide d'un système d'exploitation «étranger».

Le numéro de périphérique est passé dans le registre AL, le nombre de secteurs à transférer est passé dans le registre CX, le numéro de secteur de départ à transférer est passé dans le registre DX et le tampon est passé dans le registre DS:BX. Le drapeau de retenue est effacé s'il n'y a pas eu d'erreurs. Si le drapeau de retenue est défini, le code d'erreur est renvoyé dans le registre AX.

Conseils sur le développement de pilotes de périphériques

Les principaux maux de tête liés au développement d'un pilote de périphérique surviennent en raison de problèmes survenant lors des phases de test d'un nouveau pilote. Tout d'abord, un pilote de périphérique doit être chargé dans un emplacement mémoire qui lui est attribué par DOS, à une adresse inconnue du programmeur. Deuxièmement, un pilote CON nouvellement développé ne peut pas être testé à l'aide du programme DEBUG, car DEBUG utilise ce pilote pour l'entrée et la sortie de caractères.

Il est recommandé, après avoir écrit le pilote réel, d'écrire un court programme de test appelant les fonctions individuelles de la même manière que DOS, mais sans que le pilote soit installé dans le cadre de DOS. Les avantages sont que tout s'exécute sous le contrôle de l'utilisateur et que l'ensemble du processus peut être corrigé avec un débogueur. Dans tous les cas, un nouveau pilote de périphérique (en particulier un pilote de périphérique bloc) ne doit être lié au système qu'après avoir été entièrement testé et s'être avéré sans erreur.

Remarque : Lorsque vous travaillez avec un disque dur, préparez une disquette système avant de tester le démarrage du système à partir du disque dur avec le nouveau pilote installé pour la première fois. Si un petit bogue existe dans le nouveau pilote et que la routine d'initialisation se bloque, le processus de démarrage ne se terminera pas et le DOS sera hors de contrôle. Dans un tel cas, le seul remède est de réinitialiser le système et de démarrer avec une disquette DOS dans l'unité de disquette. Une fois DOS chargé, vous pouvez alors accéder au disque dur et supprimer le nouveau pilote.

CD-ROM

Peu de temps après leur introduction dans le monde de l'audio, l'industrie du disque compact a commencé à approcher le marché des PC. Un unité de CD-ROM et un PC forment une combinaison intéressante. Le support de disque compact lui-même est en lecture seulement, mais 660 mégaoctets de données peuvent être entreposés sous forme de texte, de graphiques,...

De nombreuses publications et références sont disponibles sur CD-ROM, telles que :

De plus, des cartes, des photothèques, des collections de programmes du domaine public et des bases de données médicales sont disponibles en format CD-ROM.

Pourquoi un CD-ROM ?

Le CD-ROM a un net avantage sur le support de disquette. Une fois capturées et numérisées, les informations peuvent être traitées par un ordinateur sous la forme dont l'utilisateur a besoin. Les possibilités semblent illimitées, compte tenu de la facilité de lecture et de comparaison des informations.

Une autre considération importante est la facilité d'accès pour de nombreux utilisateurs. Chargez le logiciel du pilote, appuyez sur une touche ou deux, et les informations sont à l'écran et prêtes.

Vous pouvez acheter un unité de CD-ROM compatible PC pour 800 $ à 1 000 $ en 1989. Ces unités sont disponibles en tant que périphériques externes ou internes.

Interfaçage

Le matériel du PC peut être facilement interfacé à un unité de CD-ROM. Le logiciel peut cependant rencontrer quelques problèmes. C'est compréhensible, puisque DOS n'a jamais été conçu pour prendre en charge ces périphériques. Cette sous-section montre comment un unité de CD-ROM. à l'aide des pilotes et des programmes utilitaires appropriés, est accessible comme un lecteur de disquette en lecture seulement. Ces informations peuvent ne pas vous être d'une utilité immédiate. Cependant, ces données vous donneront un aperçu plus approfondi du monde du pilote de périphérique et de l'organisation du système d'exploitation.

Les pilotes de périphériques agissent comme des médiateurs entre le système d'exploitation du disque et les périphériques externes tels que le moniteur, l'imprimante, les unités de disque et les disques durs. Le DOS fait la distinction entre les pilotes de périphérique bloc et les pilotes de périphérique caractère. En tant que périphérique d'entreposage de masse capable de lire des informations en mode bloc, un unité de CD-ROM serait normalement ajouté au reste du système via un pilote de bloc. C'est là que le problème commence : DOS fait un certain nombre d'hypothèses sur les périphériques blocs, et un unité de CD-ROM ne peut pas répondre aux critères de ces hypothèses.

Limites de mémoire

Dans les versions de DOS jusqu'à la version 3.3 incluse, le plus grand obstacle à l'interfaçage avec un pilote de bloc était la limite de 32 mégaoctets imposée à chaque volume désigné comme périphérique de bloc. Le deuxième plus grand obstacle est l'absence d'une table d'allocation de fichiers (FAT) sur un CD-ROM. Au lieu du FAT, le CD-ROM contient une forme de table de données dans laquelle les adresses de départ des différents sous-répertoires et fichiers sont enregistrées. Cependant, DOS exige toujours une FAT qu'il peut au moins lire lors de l'initialisation du pilote.

Un pilote de caractères fonctionne mieux pour implémenter un pilote de CD-ROM, car DOS ne fait aucune hypothèse sur la structure des périphériques connectés via des pilotes de caractères. Même les pilotes de caractères sont mal adaptés à la communication avec un unité de CD-ROM, car ils transmettent les caractères un par un au lieu de groupes de caractères. Un autre inconvénient est la nécessité d'un nom (par exemple, CON) au lieu d'une désignation de périphérique. Le DOS doit d'abord considérer le pilote de CD-ROM comme un pilote de caractères pour DOS afin d'empêcher les accès en lecture à une FAT inexistante. Le fichier CONFIG.SYS fournit le nom du périphérique lors du processus de démarrage du système.

Configuration du CD-ROM

Le fabricant inclut généralement le logiciel du pilote de CD-ROM avec le paquet de l'unité de CD-ROM. Un pilote de ce type porte généralement un nom tel que SONY.SYS ou HITACHI.SYS, selon le fabricant.

La séquence CONFIG.SYS installant ce pilote peut ressembler à ceci :

DEVICE=HITACHI.SYS /D:CDR1

Le pilote de périphérique sélectionne le nom CDR1 comme nom de l'unité de CD-ROM. Après l'exécution de la routine d'initialisation à partir de DOS, le CD-ROM est traité comme un pilote de bloc ayant été amélioré avec quelques fonctions spéciales prenant en charge les CD-ROM. Cependant, le DOS considère toujours l'unité de disque de CD-ROM comme un pilote de caractères : le DOS ne peut pas afficher le répertoire du CD-ROM, ni accéder directement aux fichiers du CD-ROM.

Extensions logicielles du pilote

Pour surmonter cet obstacle, de nombreux unités de CD-ROM sont livrés avec un programme TSR (Terminate and Stay Resident) nommé MSCDEX (Microsoft CD-ROM Extension) en plus du logiciel du pilote de périphérique. Ce programme doit être appelé à partir du fichier AUTOEXEC.BAT. Le nom du pilote de CD peut être transmis au programme à partir du prompt DOS, comme illustré dans l'exemple suivant :

MSCDEX /D:CDR1

Le MSCDEX ouvre d'abord ce pilote via la fonction 3Dh (ouvrir) de DOS et lui attribue une désignation de périphérique. Le DOS suppose que MSCDEX est un périphérique sur un réseau à distance, tel que pris en charge par DOS dans la version 3.1.

Le MSCDEX nous rapproche de la solution, puisque DOS gère les périphériques réseau comme des fichiers contenant plus de 32 mégaoctets. Ces périphériques sont accessibles via la redirection, plutôt que par un accès direct depuis DOS. La partie résidente de MSCDEX s'interface avec le redirecteur et intercepte tous les appels vers le redirecteur. Si MSCDEX reçoit un appel adressé au unité de CD-ROM, il adapte chaque instruction à un appel applicable au unité de CD-ROM. Cela établit une connexion parfaite entre DOS et l'unité de CD-ROM, tout en permettant l'accès aux sous-répertoires et aux fichiers à tout moment.



Dernière mise à jour : Lundi, le 23 janvier 2023