![]() ![]() ![]() |
Interruptions dites masquables car l'utilisateur peut les désactiver temporairement s'il le désire, ainsi toute exécution du code associé à l'auto-int est prohibée.
Interruptions dites matérielles car pour chacune d'entre elles c'est un événement matériel (hardware) qui va les déclencher l'exécution du code associé.
![]() ![]() ![]() |
Il permet de créer une hiérarchie entre les auto-int car nous ne pouvons les désactiver qu'en partant de la fin, ainsi vous ne pouvez pas désactiver l'auto-int 3 sans désactiver les auto-int 2, et 1. De même l'auto-int 7 sera désactivée à la condition que toutes les autres auto-int le soit également, cette dernière ayant le niveau le plus élevé (7).
Pour résumer le tout, le microprocesseur ne déclenchera l'exécution du code associé à une auto-int que dans le cas où le niveau de priorité de cette dernière serait strictement supérieur au masque d'interruption.
Pour désactiver les auto-int 1, 2, 3 et 4 il suffit de donner la valeur 4 au masque d'interruption.
Voici un récapitulatif utile :
Auto-int activées | Auto-int désactivées | Valeur du masque d'interruption (bits I3, I2, I1) |
aucune | 1, 2, 3, 4, 5, 6, 7 | 7 |
7 | 1, 2, 3, 4, 5, 6 | 6 |
7, 6 | 1, 2, 3, 4, 5 | 5 |
7, 6, 5 | 1, 2, 3, 4 | 4 |
7, 6, 5, 4 | 1, 2, 3 | 3 |
7, 6, 5, 4, 3 | 1, 2 | 2 |
7, 6, 5, 4, 3, 2 | 1 | 1 |
7, 6, 5, 4, 3, 2, 1 | aucune | 0 |
![]() ![]() ![]() |
$000060 | ... | $000064 | vecteur de l'auto-int 1 |
$000068 | vecteur de l'auto-int 2 | $00006C | vecteur de l'auto-int 3 |
$000070 | vecteur de l'auto-int 4 | $000074 | vecteur de l'auto-int 5 |
$000078 | vecteur de l'auto-int 6 | $00007C | vecteur de l'auto-int 7 |
Qui dit pointeurs dans la RAM dit… pointeur modifiable et c'est effectivement le cas !
Il devient alors possible de détourner ces interruptions mais dans des conditions restreintes.
Il faudra tout de même désactiver la protection de la mémoire en désarmant le bit 2 à l'adresse $600001, en effet toute écriture dans la mémoire inférieure à l'adresse $000120 n'est autorisée que sous cette condition, n'oubliez pas de réactiver la protection de la mémoire après avoir fini (la réciproque étant l'armement du bit 1 à m'adresse $600001).
Notez que ces vecteurs étaient tous prévus pour pointer des routines en ROM, Fargo modifie touefois quelques-uns de ces vecteurs (auto-int 1 et auto-int 6) pour fonctionner.
Voici une capture d'écran du logiciel Hexview 2.5 de Benoît Scherrer, celle-ci montre les vecteurs des interruptions automatiques de la TI-92II (les vecteurs sont différents selon les TI) :
![]() ![]() ![]() |
Le microprocesseur prend connaissance de la demande faites de la part du périphérique lié à l'auto-int 2 (le clavier sur les TI-92), fini l'exécution de l'instruction courante et va déposer successivement sur la pile le registre de pointeur d'instruction PC (pour revenir au programme que nous allons quitter) puis le registre de statut SR, soit 4 puis 2 octets.
L'exécution se poursuit à l'adresse elle-même contenue à l'adresse associée à l'auto-int 2 soit $000068.
La routine exécute alors la tâche qui lui incombe et va se terminer non pas par l'instruction RTS (qui restaure seulement PC) mais par l'instruction RTE (ReTurn from Exception) qui va, elle, restaurer PC et SR.
Le programme interrompu par l'auto-int poursuit son exécution comme si de rien n'était.
Zguide © 1998 - 1999 par Florian DREVET. Tous droits réservés