Skip to content
MaximeCheramy edited this page Feb 9, 2012 · 1 revision

Lors de l'appui d'une touche sur le clavier, l'IRQ 1 est déclenchée. La routine d'interruption se charge de lire le code de la touche tapée sur le port 0x60. Le code la touche est alors interprétée puis envoyé au terminal associé au processus.

Le code des touches est appelé "Scan Code" et il existe trois modes possibles (appelés Set 1, Set 2 et Set 3). Le set 1 est utilisé par les IBM PC XT et les plus anciens, et le set 2 est utilisé par les IBM PC AT et plus récent. Le set 3 n'est que rarement utilisé. Pour des raisons de compatibilité, sur tous les PC avec des claviers IBM PC AT ou PS/2, par défaut l'ordinateur traduit le code set 2 en set 1 sauf si on lui dit de se comporter autrement. Nous avons donc décidé d'utiliser le set 1.

Lors de l'appui d'une touche, de un à trois octets sont générés. Les scancodes de deux octets commencent par 0xE0 et les scancodes de trois octets commencent par 0xE1. Ceci nous permet donc de savoir s'il y a d'autres octets à lire avant d'interpréter le code. Lorsque la touche est relâchée, un code similaire est envoyé qui a pour particularité d'avoir un certain bit à 1 ce qui ajoute la valeur 0x80 au code.

Pour décoder une touche, nous utilisons une table de correspondance. Pour les touches modificatrices, nous tenons à jour des variables pour connaître l'état actuel du clavier. Cela permet, par exemple de savoir si nous sommes en majuscule ou en minuscule.

Actuellement, le code ascii (basé sur un layout azerty) est envoyé au terminal. Dans le futur, il faudra trouver un moyen pour configurer le driver pour pouvoir envoyer à l'application un keycode. Le scancode est très bas niveau et est spécifique à chaque clavier. Le keycode est un niveau supérieur mais ne dépend pas du layout utilisé. Enfin, le caractère généré tient compte d'un certain layout pour déterminer si la touche tapée est un A ou un Q par exemple.

Voir aussi

Terminaux

Clone this wiki locally