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.
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.
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.
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.