![]() ![]() ![]() |
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.
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.
Pour illustrer tout ce que vous aller devoir comprendre, je vous ai écrit deux programmes sources.
Le premier traite de la lecture et écriture dans les ports clavier alors que le second
montre comment tester la touche [ON].
![]() ![]() ![]() |
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).
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.
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.
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.
![]() | ![]() |
Le ralentissement se chiffre pratiquement à 40% ! |
Nous allons utiliser directement ce port et par conséquent remplacer temporairement le travail de l'interruption clavier.
![]() ![]() ![]() |
PROGRAMMATION
MOVE.w #$700,d0 | ; Désactive toutes les interruptions masquables |
TRAP #1 | ; en armant les bits 8, 9 et 10 du registre SR |
![]() ![]() ![]() |
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.
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.
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.
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 :
![]() ![]() ![]() |
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 |
![]() ![]() ![]() |
Adresse | Type | Fontion(s) | Valeur(s) |
tios::globals+$0E70 | mot | indicateur des touches préfixes | #$00 00 au repos #$32 58 pour [2ND] #$00 20 pour [DIAMOND] #$80 00 pour [SHIFT] |
tios::globals+$0E72 | octet | indicateur de la touche [HAND] | #$01 au repos #$E1 pour [HAND] |
tios::globals+$0E8E | mot | indicateur des touches préfixes | #$00 00 au repos #$0B 54 pour [2ND] #$0070 pour [DIAMOND] #$1C00 pour [SHIFT] |
tios::globals+$0E90 | octet | indicateur de la touche [HAND] | #$01 au repos #$11 pour [HAND] |
tios::globals+$0EAC | mot | indicateur des touches préfixes | #$00 00 au repos #$13 D4 pour [2ND] #$00 F8 pour [DIAMOND] #$3E 00 pour [SHIFT] |
tios::globals+$0EAE | mot | indicateur de la touche [HAND] | #$01 au repos #$D1 pour [HAND] |
tios::globals+$55EA | mot | indicateur des touches préfixes | #$00 00 au repos #$22 D4 pour [2ND] #$0 070 pour [DIAMOND] #$1C 00 pour [SHIFT] |
tios::globals+$55EC | mot | indicateur de la touche [HAND] | #$0000 au repos #$0150 pour [HAND] |
$5608 | mot | indicateur des touches préfixes | #$0000 au repos #$3A58 pour [2ND] #$0020 pour [DIAMOND] #$1C00 pour [SHIFT] |
$560A | mot | indicateur de la touche [HAND] | #$0000 au repos #$E000 pour [HAND] |
$79A1 | octet | indicateur des touche non préfixées | $0E au repos ou pour plusieurs touches $00 pour une touche |
$79A2 | mot | Indicateur de touche non préfixe | $0E au repos $00 pour une touche non préfixe |
$79A5 | octet | compteur des touches répétitives | octet $79BB à 0 puis une boucle de l'octet $79BD à 0 |
$79A9 | octet | té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] |
$79AA | octet | indicateur 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] |
$79AB | octet | scancode pour la touche pressée | $00 au repos consultez la table de scancode |
$79AD | octet | té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] |
$79B1 | octet | té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] |
$79B4 | octet | indicateur 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] |
$79B5 | octet | scancode pour la touche pressée | $00 au repos consultez la table de scancode |
$79B7 | octet | Indicateur des touche préfixe | $00 au repos $01 pour [2ND] $02 pour [DIAMOND] $04 pour [SHIFT] $08 pour [HAND] |
$79BB | octet | délai avant répétition, les applications du TIOS initialisent cette valeur en retournant au HOME. | initialisé par la ROM à $89 |
$79BD | octet | délai de répetition entre répétitions, les applications du TIOS initialisent cette valeur en retournant au HOME. | Initialisé à $30 par la ROM |
$79C6 | mot | sauvegarde le code ASCII de la dernière touche appuyée | code ASCII de la dernière touche appuyée |
$79E7 | octet | indicateur d'appui sur une touche | $00 si aucune touche appuyée $01 si une ou plusieurs touches appuyées |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0 | 58 | 54 | 52 | 51 | 04 | 03 | 02 | 01 |
1 | 10 | 0F | 0E | 0D | 0C | 0B | 0A | |
2 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | |
3 | 20 | 1F | 1E | 1D | 1C | 1B | 1A | 19 |
4 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 |
5 | 30 | 2F | 2E | 2D | 2C | 2B | 2A | 29 |
6 | 38 | 37 | 36 | 35 | 34 | 33 | 32 | 31 |
7 | 40 | 3F | 3E | 3D | 3C | 3B | 3A | 39 |
8 | 47 | 46 | 45 | 44 | 43 | 42 | 41 | |
9 | 50 | 4F | 4E | 4D | 4C | 4B | 4A | 49 |
![]() ![]() ![]() |
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
![]() ![]() |
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
Zguide © 1998 - 1999 par Florian DREVET. Tous droits réservés