ZuperIndex
CODES
Ports Fonction TI-92 Introduction
Fonction TI-92 Interruption et ports clavier
Fonction TI-92 Désactiver l'interruption clavier
Fonction TI-92 Lire les touches (matrice clavier)
Fonction TI-92 Activer l'interruption clavier
Fonction TI-92 Interruption clavier et mémoire
Fonction TI-92 Exemple pour la touche [Esc]
Fonction TI-92 Comment tester la touche [ON] Barre

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.

puce Pour illustrer tout ce que vous aller devoir comprendre, je vous ai écrit deux programmes sources.

Le premier Icone programme source traite de la lecture et écriture dans les ports clavier alors que le second Icone programme source montre comment tester la touche [ON].


Barre



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 pratiquement à 40% !

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.


Barre



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.


Barre



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 :


Barre



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.


Barre



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 des TI :

AdresseTypeFontion(s)Valeur(s)
tios::globals+$0E70motindicateur des touches préfixes#$00 00 au repos
#$32 58 pour [2ND]
#$00 20 pour [DIAMOND]
#$80 00 pour [SHIFT]
tios::globals+$0E72octetindicateur de la touche [HAND]#$01 au repos
#$E1 pour [HAND]
tios::globals+$0E8Emotindicateur des touches préfixes#$00 00 au repos
#$0B 54 pour [2ND]
#$0070 pour [DIAMOND]
#$1C00 pour [SHIFT]
tios::globals+$0E90octetindicateur de la touche [HAND]#$01 au repos
#$11 pour [HAND]
tios::globals+$0EACmotindicateur des touches préfixes#$00 00 au repos
#$13 D4 pour [2ND]
#$00 F8 pour [DIAMOND]
#$3E 00 pour [SHIFT]
tios::globals+$0EAEmotindicateur de la touche [HAND]#$01 au repos
#$D1 pour [HAND]
tios::globals+$55EAmotindicateur des touches préfixes#$00 00 au repos
#$22 D4 pour [2ND]
#$0 070 pour [DIAMOND]
#$1C 00 pour [SHIFT]
tios::globals+$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

Barre



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.b	#6,$60001B			; on teste la colonne de [Esc]
	BNE	Esc_non				; si le bit est armé [Esc] n'est pas appuyé
	...					; code si la touche [Esc] est appuyée
	Esc_non:
	MOVE.w	#0,D0				; Active toutes les interruptions masquables
	TRAP	#1				; en désarmant les bits 8, 9 et 10 de SR

Barre



Monter Retour Comment tester la touche [ON]

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

PROGRAMMATION

	BTST.b	#1,$60001A	; la touche [ON] est appuyée ?
	BNE	ON_non		; oui la touche [ON] est appuyée
	...			; mettre ici le code si [ON] n'est pas appuyée
	ON_non:			; label si [ON] est appuyée

Barre



 

 

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

Zguide © 1998 - 1999 par Florian DREVET. Tous droits réservés