Ce que sont les pilotes exécutables résidant en mémoire
(menu Pilotes pour DOS)
  1. Principales définitions

  2. Un programme exécutable résidant en mémoire, c'est un programme (extension .EXE ou .COM) qui, après son lancement, reste dans la mémoire vive de l'ordinateur, bien qu'il soit apparemment terminé et que l'utilisateur puisse lancer d'autres programmes. Il occupe donc une partie de la mémoire, mais tant qu'il n'est pas activé, il ne se manifeste pas.

    Les interruptions sont des arrêts de fonctionnement du programme principal, ce qui permet le fonctionnement d'autres programmes, en particulier des petits programmes chargés d'une mission particulière (test du clavier, mise à l'heure de l'horloge interne, contrôle du bon fonctionnement des disquettes...). Il existe 256 "vecteurs d'interruption", c'est à dire des adresses indiquant où est le programme à exécuter pour l'interruption considérée. Certains de ces vecteurs d'interruption ne sont pas définis par le système d'exploitation, et peuvent donc servir de base à une interruption "artificielle", choisie par le programmeur, et qui pourra réaliser quelques opérations simples, par exemple faire des mesures et transmettre le résultat au programme principal...

    Si on imagine une interface nommée MACHINE, on pourra utiliser un programme nommé MACHINE.EXE, résidant en mémoire,qui sera activé par une interruption "artificielle" déclenchée par le logiciel principal. Il fera la mesure, et renverra le résultat vers le programme principal.
     

  3. Interruptions disponibles

  4. Pour que ces pilotes soient universellement utilisables, il ne faut pas qu'ils détournent des interruptions préétablies (impression, utilisation des disquettes, lecture du clavier...).

    Les interruptions non définies sont les suivantes (d'après "MS DOS 3 et 4, guide du programmeur", par Richard Allen King, SYBEX Micropassion), en hexadécimal :
    - 68 à 6F,
    - 78 à 7F,
    - F1 à FF

    Nous pourrons donc les utiliser à notre profit. Arbitrairement, les exemples donnés dans l'annexe 1 utilisent l'interruption FA en système hexadécimal (soit 250 en système décimal). Il est souhaitable de normaliser ce numéro d'interruption utilisé, de façon que les futurs pilotes et les futurs logiciels d'applications soient compatibles.
     

  5. Communication entre les programmes : paramètres de l'interruption

  6. Les interruptions sont commandées par des procédures bien normalisées, qui utilisent des "registres", contenant divers paramètres.

    En Turbo Pascal, une procédure modifiant une interruption doit se déclarer de la façon suivante :
    Procedure MonInter(flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp:word);interrupt;
    begin
    (*mettre ici les instructions exécutables*)
    end;

    Le programme principal pourra appeler l'interruption en ayant donné des indications dans les divers paramètres (entre ax et bp); après l'interruption, le programme principal récupèrera les résultats dans ces paramètres.

    D'une façon générale, tous les paramètres ne sont pas réellement utilisés : un, deux ou trois suffisent à transmettre les informations entre le programme principal et l'interruption.
     

  7. Recettes diverses, pour une utilisation plus confortable

  8. On a choisi l'interruption FAh (ou FBh) parce qu'elle ne correspond pas à une interruption déjà utilisée par le système informatique. En contrepartie, ceci a un inconvénient : si aucun pilote n'est installé, et qu'un programme essaie d'appeler une interruption qui ne correspond à rien, l'ordinateur va se bloquer complètement. C'est pourquoi il est hautement souhaitable de trouver une sorte de signature pour que ce programme arrive à percevoir si un pilote existe, ou non, pour l'interruption considérée.

    Le truc utilisé ici est de déclarer, au début du programme résident, une procédure qui ne sert à rien, qui n'existe que pour réserver un peu de place dans la mémoire. Ensuite, à la place de cette procédure, on met une valeur, choisie conventionnellement égale à la valeur ABCDh, et qui n'a qu'une chance infime d'exister par hasard dans cette zone de la mémoire. Le programme appelant va donc tester si au début de la zone mémoire correspondant au pilote il existe cette valeur. Si oui, on peut appeler sans risque l'interruption, si non, on envoie un message d'erreur, ou bien on invalide la possibilité d'appel de l'interruption. Cette idée vient de Pascalissime n°54 (Résident pour impression graphique, de Dr KY).

    Lorsqu'on a fini de travailler avec un pilote, il faut pouvoir l'enlever de la mémoire sans être obligé de réamorcer l'ordinateur : c'est la désinstallation du pilote. Pour cela, il faut lancer le pilote avec un premier paramètre égal au numéro de l'interruption, et le dernier paramètre égal au signe - :

    MACHINE $FA -
    va ôter le pilote de la mémoire ; c'est un ordre équivalent à
    MACHINE 250 -.

    De même qu'il faut lancer le pilote avant le programme principal, il ne faut enlever le pilote qu'après avoir terminé d'utiliser ce programme principal.

    Si on lance un pilote alors qu'un autre se trouvait déjà en mémoire pour la même interruption, le deuxième doit d'abord désinstaller le premier avant de s'installer lui-même.