PORTS
CLAVIER
Fonction Introduction
Fonction Interruption et ports clavier
Fonction Désactiver l'interruption clavier
Fonction Lire les touches (matrice clavier)
Fonction Activer l'interruption clavier
Fonction Interruption clavier et mémoire
Fonction Exemple pour la touche [Esc]
Fonction Comment tester la touche [ON]

Page précédente



 

Monter Descendre Retour Introduction
puce Ce cours a pour but de vous montrer comment lire plusieurs touches pressées à la fois.
Nous allons couper l'interruption automatique clavier (auto-int 2) et utiliser les ports clavier.

puce N'oubliez pas que la touche [ON] ne peut pas être testée par cette méthode !
Cette touche est testée d'une manière indépendante, la dernière partie de ce cours vous explique comment proceder.

puce Enfin, sachez que couper les interruptions automatiques offre un gain de vitesse non négligeable alors n'hésitez plus, vous saurez pourquoi dans le paragraphe suivant.





 

Monter Descendre Retour Interruption et ports clavier
puce Votre TI-92 est ralentie d'une façon conséquente par des routines déclenchées par les interruptions automatiques (appelées Auto-Int), soit quand un phénomène physique est détecté (dans ce cas présent ce sera l'appui sur une ou plusieurs touches), soit d'une manière permanante à une fréquence donnée. Ici nous avons affaire avec l'interruption automatique n°2 (Auto-Int 2) qui concerne le clavier.

puce Cette interruption est de type automatique, donc masquable selon notre bon vouloir car la TI-92 doit être mise au courant de ce qui passe au niveau du clavier à tout moment (dans des conditions normales d'utilisation).

puce Effectivement, dès que vous appuyez sur une ou plusieurs touches, une routine retourne à la TI-92 beaucoup d'informations, telles que le code (défini dans le manuel) de la ou les touches pressées, le scancode... et ce aussi longtemps que vous n'avez pas relaché toutes les touches.

puce Cette interruption est cadencée à environ 600 Hz (elle varie entre autres selon l'état de vos pile), comme je vous l'ai déjà dit un peu plus haut elle est de type masquable, c'est à dire que nous pouvons interdire à celle-ci d'éxecuter la routine qui lui est associée.

puce Voici un exemple préci de cette perte de temps.
Pour ma part j'ai comparé le temps que mettais ma TI-92II en mode 3D à calculer une fonction, pour avoir un temps de calcul moyen je lui ais demandé la fonction sin(x)-cos(x)/tan(x).

Tout d'abord laissez le calcul se faire sans déclencher la routine de l'interruption clavier, c'est à dire sans toucher à une ou plusieurs touches, j'ai relevé un temps de 16"8 secondes.

Maintenant laissez appuyé une ou plusieurs touches pendant le calcul, la routine est donc appelée et le ralentissement est clairement visible à l'écran (dans la progression du pourcentage), j'ai relevé un temps de 26"8 seconde.

pucepuce
Le ralentissement se chiffre à plus de 60% !

puce Parlons maintenant des ports clavier, sur la TI-92 un port (quel qu'il soit) est écrit et lut grâce à une mémoire associée (à partir de l'adresse $600000) contenant des informations hardware (clavier, communication, écran... ), dans notre cas chaque appui sur une touche influ sur une mémoire de la TI-92 (le mot à l'adresse $60001A) et l'interruption clavier se sert de ce résultat pour retourner des informations dans la mémoire statique de la TI-92.

Nous allons utiliser directement ce port et par conséquent remplacer temporairement le travail de l'interruption clavier.





 

Monter Descendre Retour Désactiver l'interruption clavier
puce Première étape obligée, désactiver l'interruption clavier, pour cela il va falloir armer les bits 8, 9 et 10 du registre de statut SR avec l'instruction TRAP.

PROGRAMMATION
MOVE.w #$700,d0;  Désactive toutes les interruptions masquables
TRAP #1; en armant les bits 8, 9 et 10 du registre SR

Maintenant, nous voilà prets à lire le port clavier en nous aidant de la matrice clavier.





 

Monter Descendre Retour Lire les touches (matrice clavier)
puce Le clavier de la TI-92 est représenté pas une matrice de 10 touches sur 8.
Donc pour savoir si telle ou telle touche a été pressée, il va falloir opérer de la même manière que pour jouer à la bataille navale ;o)

puce Nous devons commencer impérativement par éliminer toutes les lignes ne nous intéressant pas, il nous restera donc celle contenant la touche que nous voulons tester.

Concretement il faut masquer le mot à l'adresse $600018, c'est à dire armer (=1) toutes les lignes que nous ne voulons plus et désarmer (=0) celle qui nous intéresse.

puce Maintenant il faut laisser souffler la TI-92 pour qu'elle ai le temps de reconnaître physiquement les touches actuellement pressées. Le moyen le plus simple étant de mettre des instructions NOP.

Attention la TI-92II se démarque de la TI-92 sur ce point précis :
En effet celle-ci étant plus rapide que ses prédécetrices, elle arrive très difficilement à savoir quelles touches ont été pressées avec l'attente prescrite pour la TI-92, nous devons donc créer une attente plus longue
.

Dans le but de rendre "compatible" un programme FargoII pour les TI-92 et les TI-92II, nous utiliserons le nombre d'instruction NOP pour la TI-92II, la meilleur valeur étant naturellement celle de la routine de l'interruption clavier elle-même qui en utilise six.

puce Nous voici dans la dernière phase, après avoir nous même supprimé les lignes qui ne nous intéressaient pas, la TI-92 va maintenant nous informer si la la touche voulue a été pressée, pour cela il faut tester l'octet à l'adresse $60001A c'est à dire la colonne contenant la touche par l'instruction BTST.
Si le bit est desarmé (=0), alors la touche de la colonne correspondante qui nous interesse a été appuyée.

puce Voici la matrice clavier qui nous permet de savoir quel masque appliquer au mot à l'adresse $600018, et quel bit de l'octet à l'adresse $60001A faut-il tester :





 

Monter Descendre Retour Activer l'interruption clavier
puce Attention, il est impératif d'activer à nouveau l'interruption clavier !

Car bien que fonctionnant, celle-ci ne fera jamais appel à la routine qui retourne les informations à la TI-92 et notre calculatrice fera comme si de rien n'était.

Pour cela il va falloir desarmer les bits 8, 9 et 10 du registre de statut SR avec l'instruction TRAP.

PROGRAMMATION
MOVE.w #0,D0; Active toutes les interruptions masquables
TRAP #1; en desarmant les bits 8, 9 et 10 du registre SR

Vous pouvez désormais utiliser à nouveau le buffer clavier raffraichi par l'interruption clavier à chaque appuie sur une touche.





 

Monter Descendre Retour Interruption clavier et mémoire
puce J'ai recherché le plus gros des informations que retourne la routine appelée par l'interruption clavier, dans la mémoire statique de la TI-92.

puceAttention les adresses que je vous donne sont celles trouvées en décompilant l'interruption clavier de la TI-92II ROM 2.1, je vais vérifier si elles sont les même pour les TI-92 ROM 1.x (très peu probable, surement avec un décalage) :

AdressetailleFontion(s)Valeur(s)
$5590motindicateur des touches préfixes#$0000 au repos
#$3258 pour [2ND]
#$0020 pour [DIAMOND]
#$8000 pour [SHIFT]
$5592motindicateur de la touche [HAND]#$0000 au repos
#$0E00 pour [HAND]
$55AEmotindicateur des touches préfixes#$0000 au repos
#$0B54 pour [2ND]
#$0070 pour [DIAMOND]
#$1C00 pour [SHIFT]
$55B0motindicateur de la touche [HAND]#$0000 au repos
#$B000 pour [HAND]
$55CCmotindicateur des touches préfixes#$0000 au repos
#$13D4 pour [2ND]
#$00F8 pour [DIAMOND]
#$3E00 pour [SHIFT]
$55CEmotindicateur de la touche [HAND]#$0000 au repos
#$D000 pour [HAND]
$55EAmotindicateur des touches préfixes#$0000 au repos
#$22D4 pour [2ND]
#$0070 pour [DIAMOND]
#$1C00 pour [SHIFT]
$55ECmotindicateur de la touche [HAND]#$0000 au repos
#$0150 pour [HAND]
$5608motindicateur des touches préfixes#$0000 au repos
#$3A58 pour [2ND]
#$0020 pour [DIAMOND]
#$1C00 pour [SHIFT]
$560Amotindicateur de la touche [HAND]#$0000 au repos
#$E000 pour [HAND]
$79A1octetindicateur des touche non préfixées$0E au repos ou pour plusieurs touches
$00 pour une touche

$79A2motIndicateur de touche non préfixe$0E au repos
$00 pour une touche non préfixe
$79A5octetcompteur des touches répétitivesoctet $79BB à 0
puis une boucle de l'octet $79BD à 0
$79A9octettémoin dans la ligne d'aide des touches préfixes et [HAND]$00 au repos
$01 pour [2ND]
$02 pour [DIAMOND]
$04 pour [SHIFT]
$08 pour [HAND]
$79AAoctetindicateur des touches préfixes et [HAND], si une autre touche non préfixe est aussi appuyée$00 au repos
$01 pour [2ND]
$02 pour [DIAMOND]
$04 pour [SHIFT]
$08 pour [HAND]
$79ABoctetscancode pour la touche pressée$00 au repos
consultez la table de scancode
$79ADoctettémoin dans la ligne d'aide des touches préfixes et [HAND] après relachement$00 au repos
$01 pour [2ND]
$02 pour [DIAMOND]
$04 pour [SHIFT]
$08 pour [HAND]
$79B1octettémoin du tye de touche pendant et après appui.$10 au repos
$12 pour une touche primaire
$12 pour le curseur puis $52 quand l'octet $79A5 vaut $00
$32 pour la touche d'effacement puis $72 quand l'octet $79A5 vaut $00
$06 pour les touches préfixes et [HAND] si la valeur était $10
$0E pour les touches préfixes et [HAND] si la valeur était $08
$08 après avoir relaché une touche préfixe ou [HAND]
$79B4octetindicateur des touches préfixes et [HAND], si une autre touche non préfixe est aussi appuyée$00 au repos
$01 pour [2ND]
$02 pour [DIAMOND]
$04 pour [SHIFT]
$08 pour [HAND]
$79B5octetscancode pour la touche pressée$00 au repos
consultez la table de scancode
$79B7octetIndicateur des touche préfixe$00 au repos
$01 pour [2ND]
$02 pour [DIAMOND]
$04 pour [SHIFT]
$08 pour [HAND]
$79BBoctetdélai avant répétition, les applications du TIOS initialisent cette valeur en retournant au HOME.initialisé par la ROM à $89
$79BDoctetdélai de répetition entre répétitions, les applications du TIOS initialisent cette valeur en retournant au HOME.Initialisé à $30 par la ROM
$79C6motsauvegarde le code ASCII de la dernière touche appuyéecode ASCII de la dernière touche appuyée
$79E7octetindicateur d'appui sur une touche$00 si aucune touche appuyée
$01 si une ou plusieurs touches appuyées

puce J'ai aussi dressé la table de scancode des touches, on retrouve la matrice clavier.
Pour savoir à quelle touche appartient tel scancode il suffit de faire le parallèle avec la matrice clavier, par exemple la touche [F6] a pour scancode $2D (les scancodes sont donnés en hexadécimal) :

76543210
05854525104030201
1100F0E0D0C0B0A
218171615141312
3201F1E1D1C1B1A19
42827262524232221
5302F2E2D2C2B2A29
63837363534333231
7403F3E3D3C3B3A39
847464544434241
9504F4E4D4C4B4A49





 

Monter Descendre Retour Exemple pour la touche [Esc]
puce Pour tester la touche [Esc], nous allons devoir tout d'abord garder la ligne 8 représentées par le bit 8 du mot à l'adresse $600018, puis tester si la colonne 6 représentée par le bit 6 de l'octet à l'adresse $60001B est armé (=1).

puce Nous reprenons tout depuis le départ dans cet exemple :

PROGRAMMATION
MOVE.w #$700,D0; désactive toutes les
TRAP #1; interruptions masquables
MOVE.w #%1111111011111111,$600018; masque les lignes sauf celle correspondant à [Esc]
NOP; on attend pour ...
NOP; ... laisser le temps ...
NOP; ... à la TI-92 ...
NOP; ... de prendre en ...
NOP; ... compte les ...
NOP; ... évenements hardware ...
BTST #6,$60001A; on teste la colonne de [Esc]
BNE Esc_non; si le bit est armé [Esc] n'est pas appuyé
...; mettre ici le code si la touche [Esc] est appuyée
Esc_non :; label si [Esc] n'a pas été appuyée





 

Monter Retour Comment tester la touche [ON]
puce La touche [ON] est testée différemment des autres touches, elle est liée au bit 1 de l'octet $60001B (ou du bit 9 du mot $60001A).
Celui-ci est desarmé (=0) si la touche [ON] est appuyée, dans le cas contraire il est armé (=1).

PROGRAMMATION
BTST #1,$60001B; teste le bit 1 de l'octet à l'adresse $60001B
BEQ ON_non; si le bit 1 est nul, [ON] est appuyée
...; mettre ici le code si [ON] n'est pas appuyée
ON_non :; label si [ON] est appuyée





 

 

Lisez la section sur les droits d'auteur et la license d'utilisation avant de distribuer Zguide.

Zguide © 1998, Florian DREVET. Tous droits réservés à l'échelle mondiale