Epopee d'une Touche

1. Premier livre : du clavier a l'ecran

Cette histoire raconte le voyage d'une touche de clavier a travers les meandres d'un micro-ordinateur et d'un logiciel appele WORD (sous DOS).
Cette aventure vous emportera au pays du BIOS, et de l'OS, afin de vous familiariser avec les mecanismes que vous mettez en oeuvre tous les jours.

Taper sur une touche est simple.
Mais les consequences d'un tel acte sont bien plus complexes pour votre micro-ordinateur.

Comment imaginez-vous les implications d'une telle action ?

Tout d'abord, il faut considerer l'articulation d'une application avec le systeme.
Votre ordinateur se compose :

  • du Hard (l'electronique) et du Firmware (microprogramme resident de l'electronique),
  • du BIOS (programme resident de gestion des ressources de la machine, enregistre en memoire morte),
  • du systeme d'exploitation (logiciel d'exploitation de la machine par l'utilisateur, par exemple MS-DOS),
  • du logiciel d'application (par exemple WORD sous DOS).

    Chaque partie a une fonction bien determinee, et travaille en equipe avec les autres.

    Chaque partie est une couche de fonctionnement ; elle communique avec les couches voisines.

    |-----------------------------|
    |   PROGRAMME D'APPLICATION   | MS-WORD par exemple
    -------------------------------primitives du systeme d'exploitation
    |   SYSTEME D'EXPLOITATION    | MS-DOS par exemple
    -------------------------------primitives du BIOS
    |        ROM BIOS             |
    ------------------------------- demandes d'interruption,
    |   MATERIEL + FIRMWARE UC    | scrutation, commandes
    |--|------|--------|-------|--|
       |      |        |       |
       |      |        |       |   interface, electronique
       |      |        |       |
    |--|--|---|---|----|-----|-|--|
    |ECRAN|CLAVIER|IMPRIMANTE|... |
    |--|--|---|---|-----|----|-|--|
       |      |         |      |
       |      |         |      |
    |--|------|---------|------|--|action clavier,
    |  OM     UTILISATEUR         |lecture de l'ecran,
    |-----------------------------|...
    

    La gestion d'une touche passe par toutes ces etapes, et chaque couche est susceptible de traduire la donnee avant de la transmettre a la couche suivante.

    Comment reagit votre clavier ? :

    Le clavier est gere par un controleur specialise. Ce circuit explore, ligne par ligne et colonne par colonne, une matrice sur laquelle se trouvent les touches. Des qu'une touche est enfoncee ou relachee, le controleur genere un code de touche (scan code) vers l'unite centrale. Si l'unite centrale n'est pas prete a recevoir les donnees, ces codes sont ranges dans une memoire interne du controleur clavier (16 caracteres max.).

    Remarque : le controleur clavier dispose de 3 tables de conversion "code geographique vers scan code". C'est en general la table No2 qui est utilisee sur les compatibles AT. Cette conversion est totalement transparente pour l'utilisateur.

    |------------------------------|    |----------------------------------|
    | Code geographique     CLAVIER|    | UNITE CENTRALE                   |
    |  | | | |        |----------| |    |  |----------|      |----------|  |
    | -o-o-o-o---------          | |    |  |          |      |          |  |
    |  | | | |Matrice |Controleur| |    |  |Controleur|      |          |  |
    | -o-o-o-o---------          | |scan|  |          |      |Micro-    |  |
    |  | | | |        |          | |code|  | interface| INT  |          |  |
    | -o-o-o-o---------  clavier ---------\|          | type |processeur|  |
    |  | | | |        |          |         >  clavier ->IRQ1>-          |  |
    |  | | | |---------          ---------/|          |      |   8086   |  |
    |  | | |-----------          | |    |  |          |      |   80286  |  |
    |  | |-------------          | |    |  |          |      |   80386  |  |
    |  |---------------          | |    |  |          |      |          |  |
    |                 |----------| |    |  |----------|      |----------|  |
    |------------------------------|    |----------------------------------|
    

    Comment reagit votre ordinateur ? :

    L'unite centrale comporte egalement un controleur specialise dans la gestion de l'interface avec le clavier. Des reception du scan code clavier, le controleur informe (interruption IRQ1) le microprocesseur du systeme qu'il dispose d'une information a lui transmettre.

    Que fait alors l'ordinateur ? :

    Jusqu'a present, aucun traitement n'a ete effectue sur le code de touche, a part les conversions liees a la configuration materielle (format du scan code des tables du clavier). C'est maintenant que certains mecanismes lies au logiciel vont etre executes.

    Des detection d'une interruption, le microprocesseur interrompt des que possible son traitement en cours, puis execute une routine de traitement de cette interruption.
    La routine executee a la suite d'une demande d'interruption du controleur clavier (IRQ1) est appelee Gestionnaire de clavier (INT09H); c'est une primitive du BIOS. Elle est tres importante car :

  • elle convertit le code de la touche en code ASCII,
  • elle gere certaines combinaisons de touches,
  • elle est modifiable par l'utilisateur.

    Par defaut, le gestionnaire clavier est celui d'un clavier QWERTY US (resident dans la ROM BIOS). Le fameux KEYB FR.COM (MS-DOS) permet de remplacer ce gestionnaire clavier par celui utilise par nos claviers AZERTY.

    Une fois la conversion effectuee, le microprocesseur range le code ASCII et le scan code de la touche dans le "buffer clavier" (memoire tampon de la zone de donnees du BIOS). Ce dernier est une simple zone de la memoire RAM du systeme ; le buffer clavier permet de stocker 15 touches.
    Si le buffer est plein, l'ordinateur emet un "bip" pour signaler la perte du dernier caractere entre au clavier.

    NB : INT09H assure egalement le filtre de certaines touches :

  • les combinaisons speciales, comme CTRL+Alt+DEL, SHIFT+IMP.ECRAN,... , qui provoquent un traitement immediat.
  • certaines touches ou combinaisons de touches sont rendues inactives (car le clavier emet un code quelle que soit l'action sur une touche ou une combinaison de touches, enfoncee ou relachee).

    Apres rangement du code ASCII de la touche dans le buffer clavier, le microprocesseur reprend son activite.

    Le clavier et l'Unite Centrale ont reagi.

    Mais comment l'application est-elle informee ?

    En effet, une fois le code de touche range, l'application n'en est pas forcement informee. Elle doit donc scruter le buffer clavier. Si une touche est stockee, elle est utilisee ou non par l'application.

    Jusqu'a present, nous avons vu des mecanismes lies au materiel, c'est-a-dire des reactions utilisant les couches BIOS et MATERIEL. Maintenant, le traitement de la touche par l'application va mettre en jeu toutes les couches, et en particulier celle du systeme d'exploitation.

    Il existe plusieurs fonctions de l'OS ou du BIOS pour lire une touche du clavier ou pour gerer l'affichage de l'ecran ; les exemples suivants ne sont pas forcement utilises, mais permettent de comprendre l'articulation des differentes couches de fonctionnement.

    L'activite du microprocesseur depend de l'application.
    Le systeme est generalement au repos ; il est en attente d'une commande de l'operateur, c'est a dire d'une action sur le clavier (ou la souris).
    Cette attente est realisee par un appel d'une fonction systeme. L'appel systeme est materialise, au niveau de l'application par l'execution de la primitive du DOS : INT21H (par exemple fonction 0CH = vidage buffer clavier et lecture d'une touche clavier).
    A son tour le systeme d'exploitation (INT21H) interroge le BIOS (INT16H, fonction 10H). Des qu'un code de touche est disponible, INT16H redonne la main a INT21H en lui transmettant le code, puis INT21H redonne la main a l'application de la meme facon.

      APPLICATION
    
     Attente   retour
    commande   du code
    operateur  ASCII
       V       ^
    |--|-------|-|
    |   MS-DOS   |
    | Primitive  |
    |   INT21H   |
    |fonction 0CH|
    |--|-------|--|
       V       ^
    |--|-------|-|
    |    BIOS    |
    | Primitive  |
    |    INT16H  |
    |fonction 10H|
    |------------|
    

    C'est fini !. Tout est alors possible car l'application interprete ou utilise le caractere a sa facon.

    Mais comment l'application utilise-t-elle le code de la touche ?

    WORD utilise un caractere :

  • en mode saisie ; le caractere est affiche sur l'ecran (comme le mode converse du logiciel YAPP),
  • en mode commande ; le caractere est interprete et provoque l'execution d'un programme particulier (comme le mode commande de YAPP).

    Comment un caractere est-il affiche par WORD ?

    En mode saisie, chaque caractere frappe par l'operateur est affiche sur l'ecran.

    L'affichage d'un caractere (ou d'une chaine) utilise un appel d'une fonction du systeme d'exploitation. L'appel systeme est materialise, au niveau de l'application par l'execution de la primitive INT21H (par exemple fonction 02H = affichage d'un caractere).

    A son tour le systeme d'exploitation (INT21H) active la primitive BIOS (INT10H, par exemple fonction 0EH). INT10H du BIOS se charge d'envoyer le caractere vers le controleur d'ecran.

      APPLICATION
       commande
       affichage
       caractere
          V
    |-----|------|
    |   MS-DOS   |
    | Primitive  |
    |   INT21H   |
    |fonction 02H|
    |-----|------|
          V
    |-----|------|
    |    BIOS    |
    | Primitive  |
    |   INT10H   |
    |fonction 0EH|
    |-----|------|
          |------>------- > Controleur ecran --->  Ecran
    

    "Option/Affichage imprimante = (Oui)" de Word 4

    Avec cette option, WORD calcule les fins de ligne en faisant la somme de la largeur de tous les caracteres.
    Pour une police a chasse fixe, le calcul est simple.
    Pour une police a chasse proportionnelle, WORD utilise la table des largeurs (Wtps) du Driver imprimante (programme de gestion de l'imprimante). Cette table est egalement utilisee lors de l'impression.

    Mais ceci est une autre histoire.

    2. Deuxieme livre : de WORD a l'imprimante

    Cette histoire raconte la suite du voyage de la touche. Elle vous emportera au pays de l'imprimante et notre guide sera Monsieur DRIVER (le pilote).

    NB : Driver d'imprimante = Pilote d'imprimante = Gestionnaire d'imprimante.

    Vous avez certainement compris que frapper sur une touche provoque un ensemble d'operations compliquees (pour un neophyte en programmation systeme).

    Vous allez voir maintenant qu'imprimer avec word est encore plus complique !

    Pourquoi ? :

  • En plus des fonctions normales d'appel systeme et BIOS, WORD utilise un driver d'imprimante programmable (gestionnaire d'imprimante).
  • D'autre part chaque type d'imprimante dispose de son propre langage de commande, et les imprimantes dites "compatibles" ne le sont generalement pas tout a fait lorsqu'elles sont mises au pied du mur.
  • Pour compliquer encore un peu, les polices du marche utilisent differentes tables d'affectation des caracteres, incompatibles avec le jeu ASCII-PC etendu.
  • De plus, certaines polices d'un meme standard ont parfois du mal a cohabiter.

    A lire rapidement (sans interet, car meme mecanisme que l'affichage)

    L'impression d'un caractere (ou d'une chaine) utilise les fonctions du systeme d'exploitation. L'appel systeme est materialise, au niveau de l'application par l'execution de la primitive INT21H (par exemple fonction 05H = impression d'un caractere).
    A son tour le systeme d'exploitation (INT21H) active la primitive BIOS (INT17H, par exemple fonction 00H). INT17H du BIOS se charge d'envoyer le caractere vers le controleur d'imprimante.

      APPLICATION
       commande
       affichage
       caractere
          V
    |-----|------|
    |   MS-DOS   |
    | Primitive  |
    |   INT21H   |
    |fonction 05H|
    |-----|------|
          V
    |-----|------|
    |    BIOS    |
    | Primitive  |
    |   INT17H   |
    |fonction 00H|
    |-----|------|
          |------>-------> Controleur imprimante --->  Imprimante
    

    Mais ce qui compte, c'est ce qui c'est passe avant ! :

    En effet, avant d'envoyer des donnees a l'imprimante, WORD utilise son gestionnaire d'imprimante, le fameux ".DIM".

    Le mecanisme pourrait etre le suivant :

    |----------|
    | Affichage|   |------------|              |------------|
    |----------|<<<|    WORD    |> consultation|   Driver   | ".DIM"
    |----------|<<<|  calculs   |< lecture     | imprimante |
    |Impression|   |------------|              |------------|
    |----------|
    

    Le gestionnaire d'imprimante (".DIM") est un grand tableau de conversion et de parametres.

    WORD l'utilise pour :

  • Calculer les fins de lignes et les tabulations,
  • Selectionner les polices,
  • Generer des commandes de formatage dans le langage de l'imprimante.
  • Faire les conversions de caracteres, en fonction de la table de la police de caractere pour imprimer le jeu ASCII-PC.
              |---------------------------------------|
    |-------| |   ATTRIBUTS       |-----------| DRIVER|
    |       | |      &            |           | WORD  |
    |       | |   COMMANDES       |  Table de |       |
    |       ---->-------------->---           ----|   |
    |       | |   - gras          | conversion|   |   |
    |       | |   - normal        |           |   |   |
    |       | |   - italique      |    des    |   |   |
    |  WORD | |   - choix police  |           |   |   |
    |       | |   - marges        | commandes |   |   |
    |       | |   - etc           |-----------|   ---> IMPRIMANTE
    |       | |                   |-----------|   |   |
    |       | | Donnees Caracteres| Tables de |   |   |
    |       ---->-------------->--- conversion----|   |
    |calculs| |                   | caracteres|       |
    |-|----|| |                   |-----------|       |
      |    |  |  consultation |-------------|         |
      |    |----------------->-    Table    |         |
      |       |        donnees|     des     |(Chasse) |
      |----------------------<-   largeurs  |         |
              |               |-------------|         |
              |---------------------------------------|
    

    Pourquoi faut-il un driver ? :

    L'imprimante :

    D'abord, comme nous l'avons dit, chaque imprimante dispose de son langage.
    Si vous parlez francais a un Chinois, vous risquez de ne pas vous faire comprendre (a moins que le Chinois comprenne le francais).
    Le raisonnement est le meme pour les imprimantes, sauf que les imprimantes polyglottes n'existent pas encore.
    Or, il existe des dizaines de langages differents (Microsoft livre plus d'une centaine de drivers pour WORD).

    Les polices :

    Il existe plusieurs tables d'affectation des caracteres dans une police ; les principales sont le jeu ROMAN8 (standard HP) et le jeu ASCII-PC etendu (origine IBM).

    Sans driver, si nous voulons imprimer un "e accent aigu" avec une police en jeu Roman8 (HP), nous aurons la surprise de lire un espace sur le papier, alors que le caractere "e accent aigu" existe a l'emplacement de "82 Hexa" du jeu ASCII-PC et existe a l'emplacement "C5 Hexa" du jeu Romman8. Il faudrait donc saisir un "C5 Hexa", soit "la croix semi-graphique" (Alt 197) pour imprimer un "e accent aigu".
    D'ou la necessite d'une table de conversion, qui echange la position des caracteres dans la table ASCII-PC, pour la mettre au jeu Roman8 pour l'impression (cas des imprimantes HP).

    Pourquoi choisir le jeu PC plutot que Roman8 ou un autre ? :

    Les polices de l'imprimante HP sont en general au jeu Roman8.

    Notre ecran utilise les caracteres du jeu PC (compatibilite IBM oblige). Il faut donc utiliser la table du jeu ASCII-PC, car il est plus facile de modifier les parametres de l'imprimante que ceux de l'ecran et du clavier.

    A quoi sert la table des largeurs ? :

    Aujourd'hui, les echanges avec l'imprimante sont unidirectionnels (PC vers imprimante). WORD, comme la plupart des logiciels, est oblige d'imprimer en aveugle, c'est a dire qu'il ne connait pas la position du spot de l'imprimante.

    Pour calculer les fins de lignes, les tabulations, la justification, la cesure, WORD execute une simulation du deplacement du curseur de l'imprimante. Pour faire ce calcul, il doit connaitre la chasse de tous les caracteres de toutes les polices, dans tous les corps, et avec tous les attributs.

  • la chasse des caracteres d'une police fixe est une constante,
  • mais celle des caracteres d'une police proportionnelle est variable.

    Il faut donc une table des largeurs, qui contient la largeur de chaque caractere, dans chaque police.

    Concevoir un driver consiste donc a definir :

  • les parametres generaux de l'imprimante,
  • les sequences d'appel des polices,
  • dans tous les corps,
  • avec tous les attributs,
  • les tables de largeur de toutes les polices proportionnelles,
  • les tables de conversion de caracteres de toutes les polices (non jeu PC), et les conversions pour completer le jeu des polices incompletes.
  • les sequences :
    • d'initialisation de l'imprimante,
    • d'attributs (gras, normal, souligne, italique, ...)

    La methode de conception d'un driver Word-sous-DOS est decrite dans le manuel de reference technique de WORD" (utilitaire TRANSDIM pour Word4 ou TRANSDI5 pour Word5).

    Mais ceci est encore une autre histoire.

    Pour Word sous Windows, c'est encore une autre affaire puisque toutes les applications sous Windows utilisent un unique Driver.
    La conception d'un Driver Windows est encore plus complexe, mais ce driver est commun a toutes les applications sous windows.