Protocole Clavier

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