
Documentation rédigée par whyp

=======Introduction=======

Le Clavier est l’élément à partir duquel l’utilisateur va utiliser votre programme. Il est donc
nécessaire d’en connaitre parfaitement son utilisation et son fonctionnement. 3 types d’accées
sont possibles, avec leurs avantages et leurs inconvénients.


=======Le Clavier à Accées par interruptions=======

C’est la méthode la plus simple d’accés au clavier. Elle consiste simplement `a appeler une
interruption du dos ou du bios, et d’interpr´eter leur réponse.
Remarques : L’interruption la plus rapide est toujours 16h, car c’est le bios qui gére l’accés
au clavier, tandis que l’interruption 21h est une interruption du dos.


=======Le Clavier à Accès direct en mémoire=======

Entrons plus en détail dans le fonctionnement du clavier : Toute pression d’une touche du
clavier génére l’interruption 9. Cette action va mettre en mémoire la valeur de la touche qui a
été activée. Cette zone est située en 0000h : 041Ch. Pour y accéder, il suit donc de faire :


codage en C :

  peekb (0x41 , 0 xC ); // cette fonction renvoie la valeur de la touche 9


et en assembleur :

  mov ax ,0 x41
  mov es ,ax
  mov si ,0xC
  mov al ,[es:si] ;al prend la valeur de la touche initialement pressée.





=======Le Clavier à Accès par les ports=======

L’accès au clavier directement à travers les ports de communication ore des avantages
exceptionnels en terme de vitesse, et surtout de gestion multiple de touches. C’est le moyen
le plus direct et rapide d’accéder à une touche. Malheureusement, ce n’est pas aussi simple
que pour les types d’accès précédents. Pour savoir si une touche a été activée, la recherche
va séfectuer par ligne de clavier, la réponse sera ultérieurement communiquée par colonne de
clavier.


^ligne^touches^
|0|On|
|1|0 a EXE|
|2|1 a -|
|3|4 a /|
|4|7 a DEL|
|5|a+b/c à ->|
|6|X,@,T à tan|
|7|ALPHA a ESC|
|8|SHIFT a MENU|
|9|touches directionnels|
|10|F1 à F6|


Nous devons prendre une variable de 16bit initialisée a 0 et positionner le nième bit a 1, en
fonction du numéro de ligne. Il s’agit d’un simple décalage d’au maximum 10bit puisqu’il y a 10
lignes. Par exemple, si on souhaite tester les touches directionnelles, notre variable aura cette
forme : 0000000001000000

Pour le décalage, en C on écrira :

  unsigned short Var; //crée une variable de 16bit
  Var=0;
  Var$ <$$ <$n ; //ou n est le numéro de la ligne

En Assembleur :
  mov ax ,0
  shl ax ,n ;ou n est le numéro de la ligne


Une fois notre variable préte, on l’ecrit dans le port numéro 13h. Mais la taille d’un port
étant de seulement 8bit, écrire 16bit en 13h aura pour effet d’ecrire ´egalement dans le port 14h,
mais ne vous inquiétez pas ceci est tout a fait normal. De cette manière, le controleur clavier a
pris connaissance de la touche que nous souhaitons tester, ou plutot de la ligne car il s’agit pour
l’instant d’une ligne. Le controleur clavier renvoi alors la valeur de cette ligne dans le port 13h,
sur 8bit seulement. Pour les op´erations d’entr´ee sortie en C, on utilisera inportb et outport, en
assembleur in et out.
Nous devons à présent lire la valeur envoyée par ce port et l’interpréter. Si elle vaut 0, aucune
touche n’a été pressée. Sinon, il faut examiner sa valeur binaire. Cette derni`ere est donnée cette
fois ci en fonction du numéro de colonne de la touche.
Le tableau ci-dessous représente la touche correspondant au croisement final des lignes et
des colonnes :




^N° ligne-N° colone^6^ 5^ 4^ 3^ 2^ 1^ 0^
|0|  |  |  |  |  |   |On|
|1| 0| .| x10 |(-)| Exe| | |
|2| 1| 2| 3| +| -| | | 
|3| 4| 5| 6| x| /| | |
|4| 7| 8| 9| Del| | | |
|5| A+b/c| xy| (| )| | | |
|6| X,@,T| log| ln| sin| cos| tan| |
|7| Alpha| Vars| ˆ| Esc| | | |
|8| Shift| Ctrl| Optn| Menu| | | |
|9| Gauche| Haut| Bas| Droite| | | |
|10| F1| F2| F3| F4| F5| F6| |



Par exemple, si vous testez la ligne 10, et que la valeur colonne 01010000 est renvoyée, cela
signifie que les touches F1 et F3 avaient été pressées. Les algorithmes utilisés peuvent avoir
plusieurs formes selon que l’on souhaite simplement savoir si une touche quelconque est pressée
ou si l’on cible une touche précise.

Exemple de test en C (Cette fonction teste si une touche spécifique est pressée et renvoie 1
le cas échéant. On envoie comme paramétre le numéro de la ligne et la valeur renvoyée par le
clavier si la touche était pressée) :

  int keyport( int ligne , int valeur ) //Vérifie si la touche choisie est pressée.
  {
  outport(0x13 ,(1 < < ligne ));
  if ( inportb(0 x13 )== valeur ) return 1; //La touche est bien pressée,on renvoie 1
  else return 0; // La touche n’est pas pressée,on renvoie 0
  }


Cependant, en utilisant ce système d’accès au clavier, vous allez rencontrer un problème.
Les touches pressées continueront à etre mises dans le buffer touche (zone contenant une liste
des touches pressées) de la graph100. Ceci est génant si vous souhaitez par la suite utiliser un
autre type d’accès clavier, il vous faudra d’abord vider ce buffer, puis seulement après capter une
touche. Pour résoudre ce problème, plusieurs solutions s’offrent à vous, ma préférée et qui donne
les meilleurs résultats, consiste à désactiver l’interruption 9. Ceci offre de multiples avantages
exposés ci-dessous :

  * Le buffer touche n’est plus alimenté, car c’est le role de cette interruption.
  * Le retour au menu par la pression de la touche Menu, et la modification du contraste par les touches Shit+Droite ou Shift+Gauche sont désactivés.
  * Votre programme s’en trouve l´eg`erement accéléré.


Il est à noter que cette interruption peut etre restaurée à tout moment si on prend la
précaution de sauvegarder son adresse initiale, en utilisant en C la fonction dos getvect() Pour
la substituer par une fonction de votre choix (une fonction vide fera évidement l’affaire), utiliser
dos setvect(). En assembleur, il vous suffit de sauvegarder l’adresse de cette interruption lue
dans la table d’interruption, puis de remplacer cette adresse par celle de l’interruption 0xFF.
(Voir chapitre sur les interruptions).