Protocole Clavier/fr

From Atari Wiki
Jump to navigation Jump to search
                        CLAVIER INTELLIGENT


     1. Introduction
     2. Documents de référence
     3. Clavier
     4. Souris
          4.1. Positionnement relatif
          4.2. Positionnement absolu
          4.3. Mode déplacement curseur

     5. Manettes de jeu
          5.1. Compte-rendu d'événement manette de jeu
          5.2. Interrogation de manette de jeu
          5.3. Surveillance manette de jeu
          5.4. Surveillance bouton de feu
          5.5. Mode clavier des manettes de jeu

     6. Horloge calendrier
     7. Demandes d'état
     8. Mise sous tension
     9. Jeu des commandes clavier
         9.1.  Reset
         9.2.  Mode de prise en compte des boutons de souris
         9.3.  Fixe le mode de positionnement relatif de la souris
         9.4.  Fixe le mode de positionnement absolu de la souris
         9.5.  Fixe la souris en mode clavier
         9.6.  Fixe le seuil de déplacement souris
         9.7.  Fixe l'échelle de la souris
         9.8.  Mode demande de la position absolue de la souris
         9.9.  Définit la position de la souris
         9.10. Fixe l'origine verticale en bas
         9.11. Fixe l'origine verticale en haut
         9.12. Reprise
         9.13. Désactivation de la souris
         9.14. Pause
         9.15. Fixe le mode événement manette de jeu
         9.16. Fixe le mode demande manette de jeu
         9.17. Demande d'état manette de jeu
         9.18. Surveillance manette de jeu
         9.19. Surveillance du bouton de feu
         9.20. Fixe la manette de jeu en mode clavier
         9.21. Désactivation des manettes de jeu
         9.22. Mise … jour de l'horloge-calendrier
         9.23. Demande de la date et de l'heure
         9.24. Chargement de données en mémoire
         9.25. Lecture de données en mémoire
         9.26. Exécution de routine contr“leur
         9.27. Demandes d'état

     10. Appendice A : Codes de scrutation clavier


          
                  PROTOCOLE DU CLAVIER INTELLIGENT
                      (Mise … jour : 26/02/85)





1. Introduction

     Le clavier intelligent (IKBD) d'Atari Corp. est un contr“leur 
clavier d'usage commun suffisamment flexible pour ˆtre utilisé 
avec un grand nombre de produits sans modifications. Le clavier, 
avec son contr“leur, fournit des points de connexion convenables 
pour une souris et des manettes de jeu. Le processeur clavier 
comporte également une horloge avec gestion de la date d'une 
précision d'une seconde.

     Le clavier intelligent a été con‡u comme suffisamment général 
pour pouvoir servir dans un grand nombre de nouveaux produits 
informatiques. Des ajustements quant au nombre de touches du 
clavier, la résolution de la souris, etc. peuvent ˆtre effectués. 

     Le clavier intelligent communique avec le processeur maŒtre 
par une liaison série bi-directionnelle … haute vitesse. Il peut 
fonctionner dans plusieurs modes afin de rendre possibles diverses 
utilisations du clavier, des manettes de jeu ou de la souris. Un 
usage restreint du contr“leur est également autorisé pour des 
applications dans lesquelles un mode de communication 
unidirectionnel est utile, ceci par une gestion soigneuse des 
modes par défaut.


2. Documents de référence
 
     Atari Corp. RBP/GHU/SD Keyboard Schematic (14/09/84)
     Atari Corp. RBP/GHU/SD Keyboard Layout (non paginé, non daté)


3. Clavier

     Le clavier retourne toujours les codes d'appui et de 
relƒchement de touche, chaque fois qu'une touche est pressée ou 
relƒchée. Les codes d'appui de touche débutent … 1 et sont définis 
dans l'appendice A en fin de chapitre. A titre d'exemple, la 
position de la touche ISO dans la table des codes de touches 
pressées existera mˆme si aucune touche ne correspond … cette 
position sur un clavier particulier. Le code de relƒchement de 
touche peut ˆtre obtenu en effectuant un OU logique entre 0x80 et 
le code d'appui de la touche (bit 7 positionné … 1).

     Les codes spécifiques 0xF6 … 0xFF sont réservés pour les 
fonctions suivantes :

          OxF6         compte-rendu d'état
          0xF7         position absolue de la souris
          0xF8-0xFB    position relative de la souris
                       (bit 0 … 1 si bouton droit appuyé
                        bit 1 … 1 si bouton gauche appuyé)
          0xFC         heure et date
          0xFD         descripteur d'état manettes de jeu
          0xFE         événement manette de jeu 0
          0xFF         événement manette de jeu 1

     Les deux touches 'Shift' retournent des codes d'appui 
différents. Il en va de mˆme pour les touches 'Enter' et 'Return'.


4. Souris

     Le port souris doit ˆtre capable de contr“ler une souris avec 
une résolution d'environ 200 comptes (déplacements ou cliquages) 
par pouce (NDT: soit 80 positions par centimŠtres environ). La 
souris doit ˆtre scrutée suffisament souvent pour autoriser le 
suivi de déplacements … une vitesse allant jusqu'… 10 pouces par 
seconde (NDT: soit environ 25 cm/s).

     Le clavier intelligent peut rendre compte des actions sur la 
souris selon trois modes distincts. Il peut rendre compte de la 
position relative (… la précédente), de la position absolue de la 
souris dans un systŠme de coordonnées convenu, ou convertir les 
déplacements de la souris en codes clavier curseur équivalents.

     Les boutons de la souris peuvent ˆtre traités comme partie 
intégrante de la souris ou comme des touches de clavier 
supplémentaires.

4.1. Positionnement relatif

     En mode positionnement relatif, le clavier retournera un 
descripteur de position de la souris lorsqu'un événement souris se 
produira. Constitue un événement souris tout appui ou tout 
relƒchement de bouton, ou tout déplacement dépassant dans l'un des 
axes de coordonnées un seuil donné. En l'absence de seuil, tout 
bit de résolution provoque un envoi vers le processeur maŒtre.

     On notera que le clavier intelligent peut retourner une 
position relative de la souris avec un incrément horizontal ou 
vertical significativement plus élevé que le seuil. Cela arrivera 
lorsqu'aucun compte-rendu de positionnement relatif de la souris 
n'aura été renvoyé : a) parce que le clavier a été inhibé (les 
événements seront stockés jusqu'… ce que la communication avec le 
clavier reprenne) b) parce qu'un événement est en train d'ˆtre 
transmis.

     Le descripteur de positionnement relatif de la souris est un 
bloc constitué de trois octets (peu importe le mode clavier):

          %1111 10xx           drapeau de positionnement relatif
                  ||
                  | ---------- état du bouton droit
                   ----------- état du bouton gauche
          deltaX               décalage horizontal signé
          deltaY               décalage vertical signé

     On notera que la valeur des bits d'état des boutons doit ˆtre 
valide mˆme si le MODE D'ACTIVATION SOURIS a été positionné pour 
que les boutons soient considérés comme partie intégrante du 
clavier.

     Si le décalage cumulé des déplacements horizontaux ou 
verticaux de la souris déborde le domaine +127 … -128, le compte- 
rendu de positionnement relatif est effectué sur plusieurs blocs 
descriptifs successifs.

     On notera que le signe du décalage vertical deltaY est 
fonction de l'origine verticale choisie.

4.2. Positionnement absolu

     Le clavier intelligent a la possibilité de rendre compte de 
la position de la souris en coordonnées absolues. Des commandes 
existent pour réinitialiser la position de la souris, définir les 
échelles horizontale et verticale, et demander la position 
courante de la souris.

4.3. Mode déplacement curseur

     Le clavier intelligent peut convertir les actions sur la 
souris en équivalences clavier. Le nombre d'appuis de touche 
correspondant … une action peut ˆtre spécifié différemment pour 
chaque axe. Le clavier intelligent fournit des informations sur 
les actions souris selon la plus haute résolution valable et 
génŠre simplement une paire d'événements appui de touche pour 
chaque multiple du facteur d'échelle.

     Ce mode de fonctionnement provoque l'envoi du code de 
relƒchement de touche immédiatement aprŠs le code d'appui de 
touche. Les appuis de bouton de la souris provoquent également 
l'envoi de codes d'appui et de relƒchement de touche correspondant 
… ceux qui leur sont normalement assignés dans la table des codes 
clavier (soit 0x74 pour le bouton droit et 0x75 pour le gauche).


5. Manettes de jeu

5.1. Compte-rendu d'événement manette de jeu

     Dans ce mode, le clavier intelligent génŠre un bloc 
descripteur chaque fois que la position de la manette de jeu a 
changée (c'est-…-dire pour chaque ouverture ou fermeture d'un 
interrupteur ou contact de la manette de jeu).
     Le bloc descripteur d'un événement manette de jeu est 
constitué de deux octets:

          %1111 111x          désigne un événement manette de jeu 
                   |
                    --------- manette de jeu 0 ou 1
          %x000 yyyy
           |    ||||
           |     ------------ position de la manette
            ----------------- état du bouton de feu

5.2. Interrogation de manette de jeu

     L'état courant des ports manette de jeu peut ˆtre interrogé … 
n'importe quel moment dans ce mode en envoyant une commande 
d'"interrogation manette de jeu" vers le circuit clavier.

     La réponse du clavier intelligent … cette interrogation prend 
la forme d'un bloc de trois octets ayant le sens suivant :

          0xFD                en-tˆte de réponse manette de jeu
          %x000 yyyy          manette de jeu 0
          %x000 yyyy          manette de jeu 1

     o— x correspond … l'état du bouton de feu et yyyy … la 
position de la manette.

5.3. Surveillance manette de jeu

     Ce mode permet de consacrer presque toute l'activité du 
circuit clavier au compte-rendu des états successifs des manettes 
de jeu selon une cadence définie par l'utilisateur. Le clavier 
reste dans ce mode jusqu'… une commande de reset ou une commande 
le placant dans un autre mode. Dans ce mode, la commande PAUSE ne 
stoppe pas seulement les communications entre le clavier et le 
processeur mais également la scrutation des manettes de jeu (les 
informations ne sont pas empilées).

5.4. Surveillance Bouton de feu

     Ce mode permet de dédier le circuit clavier au seul contr“le 
du bouton de feu de la manette de jeu. Dans ce mode, l'état du 
bouton de feu est testé … la fréquence maximale autorisée par la 
vitesse de transmission série. Les données sont compactées sur 
huit bits pour envoi au processeur maŒtre. Le circuit clavier 
reste dans ce mode jusqu'… une commande de reset ou une commande 
de changement de mode. Dans ce mode la commande PAUSE ne stoppe 
pas seulement l'envoi des informations du clavier vers le 
processeur mais arrˆte aussi temporairement la scrutation du 
bouton de mise … feu (les informations ne sont pas empilées).

5.5. Mode Clavier des manettes de jeu

     Le circuit clavier peut ˆtre commandé pour que les actions 
sur les manettes de jeu soient converties en équivalents clavier 
(touches curseur).
     
     Les événements manette de jeu produisent un code d'appui de 
touche immédiatement suivi d'un code de relƒchement, de la mˆme 
fa‡on que pour les événements souris. Les boutons de feu des 
manettes de jeu ont également leur équivalents clavier, codes 
juste supérieurs … ceux de la matrice clavier (soit 0x74 pour la 
manette 0 et 0x75 pour la manette 1).


6. Horloge calendrier

     Le clavier intelligent contr“le également une horloge 
calendrier pour le systŠme. Des commandes sont disponibles pour 
remettre … jour et interroger cette horloge calendrier. La mise … 
jour est garantie pour une précision de une seconde.


7. Demandes d'état

     L'état courant du clavier, les modes actifs et les paramŠtres 
peuvent ˆtre obtenus par des commandes de demande d'état 
correspondant … des commandes du clavier intelligent.


8. Mise sous tension

     Le contr“leur clavier effectue un auto-test simple … la mise 
sous tension afin de détecter des erreurs majeures (somme de 
contr“le des mémoires mortes et test des mémoires vives) et divers 
problŠmes comme des touches coincées. Toute touche appuyée lors de 
la mise sous tension est considérée comme coincée et son code de 
relƒchement est renvoyé (ce qui, en l'absence de code d'appui le 
précédant, est considéré comme une erreur clavier). Si l'auto-
test du contr“leur s'est déroulé sans erreur, le code 0xF0 est 
renvoyé. (La premiŠre version du clavier intelligent était la 
version 0xF0, les suivantes auront les numéros 0xF1, etc.) 

     Les options par défaut du clavier sont les suivantes :
1) Compte-rendu du  positionnement de la souris en mode relatif 
avec un incrément d'une unité pour chaque axe.
2) Origine verticale Y=0 correspondant au haut de l'écran.
3) Mode compte-rendu d'événement pour les manettes de jeu.
4) Deux boutons pris en compte pour la souris.

     AprŠs toute commande manette de jeu, le circuit clavier 
considŠre que les manettes de jeu sont connectées aux ports 0 et 1 
des manettes de jeu. Toute commande souris (sauf la DESACTIVATION 
DE SOURIS) entraŒne la scrutation du port 0 comme étant le port 
relié … la souris et les deux boutons dépendant de celle-ci. Si 
une commande de désactivation de la souris est re‡ue alors que le 
port 0 est logiquement lié … une souris, le bouton est alors 
assigné … la manette 1.

9. Jeu des commandes clavier

     Cette partie comprend la liste des commandes qui peuvent ˆtre 
envoyées au clavier intelligent. Les codes de commande (comme 
0x00) qui ne sont pas développés ici ne provoquent aucune 
opération (ils peuvent ˆtre assimilés … des NOP).

9.1. RESET

     Ox80
     0x01

     REMARQUE: La commande RESET est la seule commande clavier qui 
comprenne deux octets en dehors des paramŠtres. Tout octet suivant 
0x80, autre que 0x01, sera ignoré (et provoquera la non prise en 
compte de la commande 0x80).

     Un reset du circuit clavier peut également ˆtre provoqué en 
envoyant un break durant au moins 200ms vers le circuit clavier.

     L'envoi d'une commande reset amŠne la remise des paramŠtres 
clavier … leurs valeurs par défaut (voir 8. Mise sous tension). Il 
n'affecte pas l'horloge calendrier.

     Une commande de RESET provoque l'auto-test du circuit 
clavier. Si ce test est positif, le clavier envoie le code 0xF0 
dans un délai de 300ms aprŠs la réception de la commande RESET (ou 
… la fin du break s'il s'agit d'un reset matériel). Le clavier 
teste ensuite la matrice clavier pour déceler d'éventuelles 
touches coincées. Toute touche considérée comme coincée provoque 
l'envoi du code break (relƒchement) correspondant … cette touche 
(un code de relƒchement survenant sans avoir été précédé par un 
code d'appui de touche doit ˆtre considéré comme une erreur au 
niveau de la matrice clavier).
 
Notes du traducteur : De par son architecture matérielle, l'unité 
centrale du ST est reliée au clavier intelligent via le processeur 
multifonctions MC68901 et un ACIA MC6850. C'est ce dernier circuit 
qui assure les communications série entre le MC68000 et le 6801 
responsable du clavier. Il en découle que toute commande vers le 
circuit clavier suppose que l'ACIA est actif et correctement 
programmé.
     A titre d'information, voici l'ensemble des commandes de 
reset de circuit ACIA et clavier envoyées lors du boot du systŠme 
par le systŠme d'exploitation :
     move.b    #$3,$FFFC00       * reset ACIA MC6850
     move.b    #$96,$FFFC00      * division horloge/16, 8 bits
                                 * sans parité, 1 bit stop,etc.
     move.l    #_commande,-(sp)  * ptr commande reset et modes
     move.w    #3,-(a7)          * 4 octets … envoyer
     bsr       _Ikbdws           * fonction $19 du trap 14
_commande  dc.b     $80,$01,$12,$1A  * reset, désactive souris et
                                     * manettes de jeu
9.2. FIXE LE MODE DE PRISE EN COMPTE DES BOUTONS DE SOURIS

     0x07
     %0000 0mss           mode de prise en compte
            |||           (m est supposé … 1 en mode code CLAVIER
            |||            de la souris)
             ------------ 0wx    l'appui ou le relƒchement de
                           ||    bouton provoque un compte-rendu
                           ||    de position souris (wx n'est
                           ||    significatif que si la souris
                           ||    est en positionnement absolu)
                           | --- 1 -> la pression du bouton pro-
                           |          voque un compte-rendu de
                           |          la position absolue
                            ---- 1 -> le relƒchement du bouton
                                      provoque un compte-rendu de
                                      la position absolue
                          100 : les boutons de la souris sont
                                considérés comme des touches.


     Cette commande définit la fa‡on d'agir des boutons de la 
souris, plus précisément la fa‡on dont ils seront pris en compte. 
Le mode de traitement par défaut des boutons de la souris est 
%00000000, c'est-…-dire que les boutons sont considérés comme 
partie intégrante de la souris.

9.3. FIXE LE MODE DE POSITIONNEMENT RELATIF DE LA SOURIS

     0x08


     Place la souris en mode relatif (mode PAR DEFAUT), c'est … 
dire que chaque déplacement de la souris provoque l'envoi d'un 
descripteur comprenant les décalages horizontaux et verticaux 
relatifs … la précédente position. Les blocs descripteurs de 
positionnement sont générés de fa‡on asynchrone par le clavier 
intelligent lorsqu'un déplacement selon l'un des axes dépasse le 
seuil minimal fixé (voir 9.6. SEUIL DECALAGE SOURIS). Selon le 
mode fixé par la commande précédente, des descripteurs de position 
peuvent également ˆtre envoyés lorsqu'un des boutons de la souris 
est pressé ou relƒché. Dans les autres cas, les boutons de la 
souris sont considérés comme des touches clavier.











9.4. FIXE LE MODE DE POSITIONNEMENT ABSOLU DE LA SOURIS

     0x09
     Xsup      position horizontale maximale (en unités de
     Xinf       déplacement) codée sur deux octets
     Ysup      position verticale maximale (en unités de 
     Yinf       déplacement) codée sur deux octets


     Les déplacements de souris seront décrits en positionnement 
absolu. Les coordonnées horizontale et verticale sont conservées 
au reset.

     Dans ce mode, les valeurs des coordonnées conservées ne 
doivent pas sortir de l'intervalle 0 - grand nombre positif défini 
par la commande. Un déplacement jusqu'… une coordonnée négative 
sera ignoré. La commande fixe la valeur positive maximale qui peut 
ˆtre atteinte. Toute valeur supérieure est ignorée.

9.5. FIXE LA SOURIS EN MODE CLAVIER

     0x0A
     Xdelta         distance en unités horizontales provoquant
                     l'envoi du code {LEFT} ou du code {RIGHT}
     Ydelta         distance en unités verticales provoquant
                     l'envoi du code {UP} ou du code {DOWN}


     Place la souris en mode clavier … la place du mode position 
relative ou position absolue. AprŠs chaque déplacement de souris 
excédant le seuil horizontal ou vertical fixé par cette commande, 
le circuit clavier envoie l'équivalent d'un appui de touche 
curseur du clavier, puis le code de relƒchement de touche. A noter 
que cette commande n'est pas affectée par l'origine des 
déplacements souris.

9.6. FIXE LE SEUIL DE DEPLACEMENT SOURIS

     0x0B
     Xseuil    seuil horizontal en unités de déplacement
     Yseuil    seuil vertical en unités de déplacement


     Cette commande fixe le seuil … partir duquel un déplacement 
de la souris sur l'axe horizontal ou vertical provoquera l'envoi 
par le circuit clavier d'un descripteur de position souris. On 
notera qu'elle n'affecte pas la résolution des données renvoyées 
au processeur. Cette commande est UNIQUEMENT valide en mode de 
positionnement relatif de la souris. Les seuils horizontaux et 
verticaux sont fixés … 1 par défaut lors du RESET (ou … la mise 
sous tension).
     NDT : Une unité de déplacement de la souris correspond 
environ … 0,2 mm, cela se traduit au bureau GEM par un déplacement 
d'un pixel.

9.7. FIXE L'ECHELLE DE LA SOURIS

     0x0C
     Xéchelle       nombre d'unités de déplacement par X interne
     Yéchelle       nombre d'unités de déplacement par Y interne


     Cette commande définit le facteur réducteur … appliquer aux 
déplacements horizontaux et verticaux. Elle est valide UNIQUEMENT 
en mode de positionnement absolu de la souris. Dans ce mode, un 
nombre déterminé d'unités de déplacement horizontal ou vertical 
doit survenir pour qu'un décalage interne de une unité soit 
enregistrée par le contr“leur clavier. 

     Il est important de relever que cette commande ne fonctionne 
qu'en mode de positionnement absolu mˆme si l'on a commandé au 
clavier de rendre compte des appuis ou des relƒchements de boutons 
de la souris (voir commande 0x07, Ý9.2.).


9.8. DEMANDE DE LA POSITION ABSOLUE DE LA SOURIS

     0x0D

     Cette commande renvoie :

     OxF7           en-tˆte de descripteur de position absolue
     0000 xxxx
          ||||
          ||| ----- bouton droit pressé depuis derniŠre demande
          || ------ bouton droit relƒché depuis derniŠre demande
          | ------- bouton gauche pressé depuis derniŠre demande
           -------- bouton gauche relƒché depuis derniŠre demande
     Xsup 
     Xinf           coordonnée horizontale sur deux octets
     Ysup
     Yinf           coordonnée verticale sur deux octets


     La commande de demande de la position absolue de la souris 
est UNIQUEMENT valide en mode de positionnement absolu de la 
souris, peu importe le mode de traitement des boutons fixé par une 
commande 0x07 (voir Ý9.2.).










9.9. DEFINIT LA POSITION DE LA SOURIS

     0X0E
     0X00      octet de remplissage
     Xsup
     Xinf      position horizontale absolue de la souris
     Ysup
     Yinf      position verticale absolue de la souris


     Cette commande permet au programmeur de fixer la position 
absolue de la souris, horizontale et verticale.


9.10. FIXE L'ORIGINE VERTICALE EN BAS

     0x0F

     
     Cette commande fixe l'origine de l'axe des ordonnées en bas 
du systŠme de coordonnées logiques utilisé par le circuit clavier, 
tant en mode de positionnement absolu que relatif. Dans ce mode, 
le déplacement de la souris vers l'utilisateur se traduit par un 
décalage négatif et un déplacement dans le sens opposé par un 
décalage positif.

9.11. FIXE L'ORIGINE VERTICALE EN HAUT

     0x10

     
     Cette commande fixe l'origine de l'axe des ordonnées en haut 
du systŠme de coordonnées logiques utilisé par le circuit clavier, 
tant en mode de positionnement absolu que relatif. Dans ce mode, 
le déplacement de la souris vers l'utilisateur se traduit par un 
décalage positif et un déplacement dans le sens opposé par un 
décalage négatif. Ce mode est le mode PAR DEFAUT au reset ou … la 
mise sous tension du systŠme.

9.12. REPRISE

     Reprend l'envoi des données du circuit clavier vers le 
processeur. Etant donné que toute commande re‡ue par le circuit 
clavier alors qu'il se trouve en mode PAUSE constitue un ordre de 
REPRISE implicite, cette commande peut ˆtre considérée comme 
inutile. Si le clavier n'est pas en mode PAUSE, cette commande est 
tout bonnement ignorée.







9.13. DESACTIVATION DE LA SOURIS

     0x12


     Plus aucun compte-rendu d'événement souris n'est envoyé par 
le circuit clavier au processeur (et la scrutation peut ˆtre 
inactive). Toute commande d'entrée dans un mode souris valide 
provoque la reprise des envois de descripteurs de position souris. 
(Les commandes d'entrée dans un mode valides sont : FIXE LE 
POSITIONNEMENT RELATIF DE LA SOURIS, FIXE LE POSITIONNEMENT ABSOLU 
DE LA SOURIS et FIXE LA SOURIS EN MODE CLAVIER).

     N.B.: Si les boutons de la souris ont été définis comme 
devant ˆtre traités comme des touches clavier, cette commande 
les AFFECTE également (c'est-…-dire qu'ils deviennent inactifs).

9.14. PAUSE

     0x13

     Stoppe l'envoi de données du clavier vers le processeur 
jusqu'… ce qu'une autre commande soit envoyée au clavier. 
L'activité du clavier est toujours scrutée et les codes de 
scrutation de mˆme que les codes ASCII sont empilés (jusqu'au 
maximum supporté par le microcontr“leur, c'est-…-dire 8 octets) 
afin d'ˆtre envoyés au processeur lorsque celui-ci demandera la 
reprise des envois. Si l'on se trouve en mode EVENEMENT MANETTE DE 
JEU, les événements manette sont également empilés.

     Les actions sur la souris sont prises en compte tant que l'on 
se trouve en mode PAUSE. Si le clavier est en mode POSITIONNEMENT 
RELATIF de la souris, les événements souris sont cumulés en 
fonction des seuils de décalage maxima, afin de produire le 
minimum de blocs descripteurs possibles (les seuils de décalage 
maxima s'étendent de -128 … +127 unités de déplacement). L'appui 
ou le relƒchement d'un bouton de la souris amŠne tout événement 
cumulé … ˆtre stocké dans un bloc descripteur, si l'on se trouve 
en mode de POSITIONNEMENT RELATIF de la souris.

     Etant donné que le tampon de stockage d'événements du circuit 
clavier n'est que de 8 octets, il est recommandé d'user de ce mode 
avec discernement, les communications entre le clavier et le 
processeur ne devant pas ˆtre figées plus de quelques 
millisecondes si l'on ne désire pas perdre d'événement.

     Les communications sont stoppées seulement aprŠs l'envoi en 
cours, si un envoi est en cours. Le mode PAUSE ne débutera qu'une 
fois le bloc descripteur complétement envoyé.

     Lorsque le circuit clavier se trouve en mode SURVEILLANCE DE 
MANETTE ou SURVEILLANCE DE BOUTON DE FEU, la commande PAUSE stoppe 
également ce mode de compte-rendu permanent, c'est-…-dire que les 
événements ne sont plus empilés pour transmission.
9.15. FIXE LE MODE EVENEMENT MANETTE DE JEU

     0x14

     
     Entre en mode compte-rendu d'événement manette de jeu. Il 
s'agit du mode PAR DEFAUT. Chaque ouverture ou fermeture de 
contact d'une manette de jeu provoque l'envoi d'un descripteur 
d'événement manette de jeu.

9.16. FIXE LE MODE DEMANDE MANETTE DE JEU

     0x15


     Désactive le mode EVENEMENT MANETTE DE JEU. Le processeur 
doit envoyer au circuit une commande de DEMANDE D'ETAT MANETTE DE 
JEU pour connaŒtre l'état d'une manette.

9.17. DEMANDE D'ETAT MANETTE DE JEU

     0x16


     Renvoie un enregistrement décrivant l'état courant des 
manettes de jeu. Cette commande est valide que l'on se trouve en 
mode EVENEMENT MANETTE DE JEU ou en mode DEMANDE MANETTE DE JEU.

9.18. SURVEILLANCE MANETTE DE JEU

     0x17
     vitesse     temps d'échantillonnage en centiŠmes de seconde

                 Blocs retournés (blocs de 2 octets retournés
                  aussi longtemps que l'on est dans ce mode) :
                 %0000 00xy
                         ||
                         | --- Bouton de feu Manette 0
                          ---- Bouton de feu Manette 1
                 %nnnn mmmm
                  |||| ||||
                  ||||  ------ état de la Manette 0
                   ----------- état de la Manette 1


     Dans ce mode, le clavier intelligent ne fait que trois 
choses: a) communiquer sur la ligne série, b) mettre … jour 
l'horloge-calendrier, c) surveiller les manettes de jeu. Le taux 
placé en paramŠtre définit la fréquence d'échantillonnage.

     N.B. : Le programmeur ne peut pas fixer cette fréquence … un 
taux supérieur … ce que permet la vitesse de communication série 
pour l'envoi de blocs de deux octets (NDT: la fréquence minimale 
d'un centiŠme de seconde est admise par le circuit clavier!).
9.19. SURVEILLANCE DU BOUTON DE FEU

     0x18
          
          Valeur retournée:   (tant que l'on est dans ce mode)
            %bbbb bbbb        état du bouton de feu de la manette
                              1. (huit informations par octet, le
                              premier échantillonnage étant donné
                              dans le bit fort (bit 7))

     
     Dans ce mode, le clavier intelligent ne fait que trois 
choses: a) communiquer sur la ligne série, b) mettre … jour 
l'horloge-calendrier, c) surveiller le bouton de feu de la 
manette 1. Le bouton de feu est scruté … une fréquence telle que 8 
échantillonnages sont effectués pour un octet envoyé (c'est-…-dire 
que la vitesse de scrutation est de 8/10ø de la vitesse de 
transmission [NDT: soit une vitesse de scrutation de 6340 
interrogations par secondes]). L'intervalle d'échantillonnage 
reste aussi constant que possible.

9.20. FIXE LA MANETTE DE JEU EN MODE CLAVIER

     0x19
     RX        temps (en diziŠmes de seconde) nécessaire pour 
               produire un décalage horizontal
     RY        temps (en diziŠmes de seconde) nécessaire pour 
               produire un décalage vertical
     TX        temps (en diziŠmes de seconde) de fermeture du 
               contact  avant relƒchement produisant un décalage 
               horizontal du curseur
     TY        temps (en diziŠmes de seconde) de fermeture du 
               contact avant relƒchement produisant un décalage 
               vertical du curseur
     VX        temps (en diziŠmes de seconde) de fermeture du 
               contact  aprŠs relƒchement produisant un décalage 
               horizontal du curseur
     VY        temps (en diziŠmes de seconde) de fermeture du 
               contact aprŠs relƒchement produisant un décalage 
               vertical du curseur


     Dans ce mode, la manette de jeu 0 est scrutée et traitée 
comme s'il s'agissait des touches curseur. A la fermeture de 
contact, un code d'appui et de relƒchement de touche curseur est 
généré. Puis aprŠs un délai (RX ou RY selon le cas), ces codes 
sont renvoyés selon une fréquence définie par TX et TY. AprŠs 
réouverture de contact, des codes curseur sont générés selon une 
fréquence définie par VX et VY. Ceci autorise une gestion de la 
manette avec auto-répétition.

     On notera qu'en pla‡ant RX et/ou RY … 0, il est possible de 
désactiver cette auto-répétition. Les valeurs de TX et TY n'ont 
plus de sens et la génération de codes s'effectue via VX et VY).
9.21. DESACTIVATION DES MANETTES DE JEU

     0x1A


     Désactive la génération d'événements manettes de jeu (la 
scrutation des manettes peut ˆtre désactivée). Toute entrée dans 
un mode de fonctionnement manettes de jeu provoque la reprise des 
compte-rendus d'événements manette de jeu (les modes de 
fonctionnement manette sont MODE EVENEMENT MANETTE DE JEU, MODE 
DEMANDE MANETTE, SURVEILLANCE MANETTE DE JEU, SURVEILLANCE BOUTON 
DE FEU ET MANETTES EN MODE CLAVIER).

9.22. MISE A JOUR DE L'HORLOGE-CALENDRIER

     0x1B
     AA        année (deux derniers chiffres significatifs)
     MM        mois
     JJ        jour
     hh        heure
     mm        minute
     ss        seconde


     Toutes les données concernant la date et l'heure doivent ˆtre 
envoyées vers le clavier au format BCD (binaire codé décimal).

     Tout chiffre qui ne rentre pas dans le format BCD ne sera pas 
pris en compte et ne provoquera pas de modification du champ 
correspondant de la date ou de l'heure. Cela permet de ne modifier 
que quelques-unes des caractéristiques de la date ou de l'heure.

9.23. DEMANDE DE LA DATE ET DE L'HEURE

     0x1C
               Valeurs retournées :
               0xFC      en-tˆte d'événement date et heure
               AA        année (2 chiffres inférieurs)
               MM        mois
               JJ        jour
               hh        heure
               mm        minute
               ss        seconde


     Toutes les données relatives … la date et l'heure sont 
retournées au format BCD (binaire codé décimal).







9.24. CHARGEMENT DE DONNEES EN MEMOIRE

     0x20
     adr_sup        adresse de la mémoire vive du contr“leur 
     adr_inf        o— charger les données
     nombre         nombre d'octets … charger (0 … 128)
     {données}


     Cette commande permet au processeur de placer des valeurs 
arbitraires dans la mémoire vive du contr“leur. L'intervalle de 
temps séparant l'envoi de chaque donnée doit ˆtre d'au minimum 20 
millisecondes.

9.25. LECTURE DE DONNEES EN MEMOIRE

     0x21
     adr_sup        adresse de la mémoire du contr“leur …
     adr_inf        partir de laquelle lire les données.
                    Valeurs retournées :
                         0xF6      en-tˆte d'état
                         0x20      code d'accŠs mémoire
                         donnée    6 octets de données lus en
                         donnée    mémoire … partir de l'adresse
                         donnée    envoyée en paramŠtre
                         donnée
                         donnée
                         donnée


     Cette commande permet au processeur de lire le contenu des 
mémoires du contr“leur. Elle permet de lire aussi bien le contenu 
de la mémoire morte que de la mémoire vive.

9.26. EXECUTION DE ROUTINE CONTROLEUR

     0x22
     adr_sup        adresse de la routine en mémoire morte du
     adr_inf        contr“leur que l'on désire faire exécuter.


     Cette commande permet au processeur d'ordonner l'exécution 
d'un sous-programme résident dans la mémoire morte du contr“leur 
clavier.



N.D.T.: Les fonctions 0x20 et 0x22 sont d'un usage périlleux car 
elles nécessitent une bonne connaissance de la topographie mémoire 
du 6301, contr“leur clavier. Des informations sur le contenu de 
cette mémoire et les registres de travail du 6301 peuvent ˆtre 
obtenus dans l'ouvrage "Au coeur de l'Atari ST" (cf. bibliographie 
en annexe).

9.27. DEMANDES D'ETAT

     Les commandes de demande d'état sont constituées de l'octet 
de commande de positionnement dans cet état avec le bit 7 placé … 
1 (OU logique avec 0x80). Exemple :

     0x88 (ou 0x89 ou 0x8A)      demande de mode souris

          Valeurs retournées :
               0xF6      en-tˆte de réponse d'état
               mode      0x08   si RELATIF
                         0x09   si ABSOLU
                         0x0A   si CLAVIER
               param1    0      si mode RELATIF
                         Xsup   si mode ABSOLU
                         Xdelta si mode CLAVIER
               param2    0      si mode RELATIF
                         Xinf   si mode ABSOLU
                         Ydelta si mode CLAVIER
               param3    0      si mode RELATIF 
                         Ysup   si mode ABSOLU
                         0      si mode CLAVIER
               param4    0      si mode RELATIF 
                         Yinf   si mode ABSOLU
                         0      si mode CLAVIER
               0                bourrage
               0


     Les commandes de DEMANDE D'ETAT interrogent le clavier sur le 
mode courant ou les paramŠtres associés … un mode donné. Tous les 
compte-rendus d'état sont formatés dans des blocs de 8 octets. Les 
réponses … des demandes d'état sont fournies de telle sorte 
qu'elles puissent ˆtre stockées (aprŠs réception de l'octet $F6 
d'en-tˆte de réponse état) et renvoyées par la suite sous forme de 
commandes de positionnement d'état par le processeur afin de 
restaurer un état donné. Les octets nuls de remplissage seront 
alors traités comme des commandes inopérantes par le circuit 
clavier.



N.D.T.: Pour traiter les réponses … une demande d'état, il est 
nécessaire de détourner le vecteur réponse d'état, dont on obtient 
l'emplacement par Kbdvbase (Trap 14, fonction $22), en ajoutant $C 
… l'adresse de retour de cette fonction (voir bios étendu). 
     En pla‡ant sa propre routine dans ce vecteur, on re‡oit dans 
A0 l'adresse de départ du bloc d'octets réponse de la demande 
d'état et dans A1 l'adresse de fin plus un de cette réponse.
     D'une fa‡on générale, toutes les réponses du clavier passent 
par l'un des vecteurs pointés indirectement par Kbdvbase et 
nécessitent donc un traitement particulier par des routines 
utilisateur.

     Les commandes valides de DEMANDE D'ETAT sont les suivantes:

     0x87      mode d'action des boutons de la souris

     0x88      mode de positionnement de la souris
     0x89      (plus précisément mode de traitement des 
     0x8A       déplacements de la souris par le circuit clavier)

     0x8B      seuil de décalage de la souris

     0x8C      échelle de décalage de la souris (en ABSOLU)

     0x8F      demande du type d'origine verticale de la souris    
  
     0x90      (renvoie 0x0F si en bas, 0x10 si en haut)

     0x92      activité de la souris (réponse : 0x00 si active, 
                0x12 si inactive) 

     0x94      demande du mode manette de jeu
     0x95
     0x99
     
     0x9A      activité des manettes de jeu (réponse : 0x00 si
                actives, 0x1A si désactivées)


     Il est de la responsabilité du programmeur de n'avoir qu'une 
réponse … une demande en mˆme temps (autrement dit, il faut 
traiter la réponse … une demande avant d'en faire une seconde, les 
réponses n'étant pas empilées).

     Les commandes de DEMANDE D'ETAT ne sont pas prises en compte 
si le clavier intelligent se trouve en mode SURVEILLANCE MANETTE 
DE JEU ou en mode SURVEILLANCE BOUTON DE FEU.




















10. Appendice A -- Codes de scrutation clavier

     Les codes de scrutation clavier retourné par le clavier ont 
été choisi afin de simplifier la mise en oeuvre du GEM.

N.D.T.: Le traducteur s'est permis de fournir les codes clavier 
correspondant … la matrice de clavier fran‡aise en sus des codes 
correspondant … la matrice de clavier anglaise.

Valeur hexa.        Clavier anglais        Clavier fran‡ais
     00              (inutilisée)            (inutilisée)
     01                 Esc                      Esc
     02                  1                        1
     03                  2                        2
     04                  3                        3
     05                  4                        4
     06                  5                        5
     07                  6                        6
     08                  7                        7
     09                  8                        8
     0A                  9                        9
     0B                  0                        0
     0C                  -                        )
     0D                 ==                        -
     0E              Backspace                Backspace
     0F                 Tab                      Tab
     10                  Q                        A
     11                  W                        Z
     12                  E                        E
     13                  R                        R
     14                  T                        T
     15                  Y                        Y
     16                  U                        U
     17                  I                        I
     18                  O                        O
     19                  P                        P
     1A                  [                        [
     1B                  ]                        ]
     1C               Return                   Return
     1D               Control                  Control
     1E                  A                        Q
     1F                  S                        S
     20                  D                        D
     21                  F                        F
     22                  G                        G
     23                  H                        H
     24                  J                        J
     25                  K                        K
     26                  L                        L
     27                  ;                        M
     28                  '                        —
     29                  `                        `
     2A             Shift (gauche)         Shift (gauche)
     2B                  \                        \
     2C                  Z                        W
     2D                  X                        X
     2E                  C                        C
     2F                  V                        V
     30                  B                        B
     31                  N                        N
     32                  M                        ,
     33                  ,                        ;
     34                  .                        :
     35                  /                        =
     36             Shift (droit)           Shift (droit)
     37             (inutilisée)             (inutilisée)
     38               Alternate                Alternate
     39           Barre d'espacement      Barre d'espacement
     3A               CapsLock                 CapsLock
     3B                  F1                       F1
     3C                  F2                       F2
     3D                  F3                       F3
     3E                  F4                       F4
     3F                  F5                       F5
     40                  F6                       F6
     41                  F7                       F7
     42                  F8                       F8
     43                  F9                       F9
     44                  F10                      F10
     45             (inutilisée)             (inutilisée)
     46             (inutilisée)             (inutilisée)
     47                 Home                     Home
     48           FlŠche vers le haut     FlŠche vers le haut    
     49             (inutilisée)             (inutilisée)
     4A            Pavé numérique -        Pavé numérique -
     4B          FlŠche vers la gauche   FlŠche vers la gauche
     4C             (inutilisée)             (inutilisée)
     4D          FlŠche vers la droite   FlŠche vers la droite
     4E            Pavé numérique +        Pavé numérique +
     4F             (inutilisée)             (inutilisée)
     50           FlŠche vers le bas      FlŠche vers le bas
     51             (inutilisée)             (inutilisée)
     52                Insert                   Insert
     53                Delete                   Delete
     54             (inutilisée)             (inutilisée)
     55             (inutilisée)             (inutilisée)
     56             (inutilisée)             (inutilisée)
     57             (inutilisée)             (inutilisée)
     58             (inutilisée)             (inutilisée)
     59             (inutilisée)             (inutilisée)
     5A             (inutilisée)             (inutilisée)
     5B             (inutilisée)             (inutilisée)
     5C             (inutilisée)             (inutilisée)
     5D             (inutilisée)             (inutilisée)
     5E             (inutilisée)             (inutilisée)
     5F             (inutilisée)             (inutilisée)
     60        touche ISO (inutilisée)            <
     61                 Undo                    Undo
     62                 Help                    Help
     63           Pavé numérique (         Pavé numérique (
     64           Pavé numérique )         Pavé numérique )
     65           Pavé numérique /         Pavé numérique /
     66           Pavé numérique *         Pavé numérique *
     67           Pavé numérique 7         Pavé numérique 7
     68           Pavé numérique 8         Pavé numérique 8
     69           Pavé numérique 9         Pavé numérique 9
     6A           Pavé numérique 4         Pavé numérique 4
     6B           Pavé numérique 5         Pavé numérique 5
     6C           Pavé numérique 6         Pavé numérique 6
     6D           Pavé numérique 1         Pavé numérique 1
     6E           Pavé numérique 2         Pavé numérique 2
     6F           Pavé numérique 3         Pavé numérique 3
     70           Pavé numérique 0         Pavé numérique 0
     71           Pavé numérique .         Pavé numérique .
     72         Pavé numérique Enter     Pavé numérique Enter




N.D.T. : Rappelons que les codes hexadécimaux 0x74 et 0x75 sont 
utilisés par le contr“leur clavier pour la simulation des appuis 
de boutons de feu des manettes de jeu.