![]() ![]() ![]() |
Ces dernières (au nombre de dix) tiennent plus des interruptions logiciels que des interruptions matérielles, dans le sens où elles interrompent vraiment le cours du programme en cours, d'une façon totalement incontrôlable et triviale.
Impossible de les désactiver étant donné que c'est le processeur lui-même qui va les déclencher, dès qu'il arrive à détecter une erreur fatale à son fonctionnement.
![]() ![]() ![]() |
Message d'erreur | Explication associée |
BUS ERROR | aucun périphérique ne répond à l'adresse auquel le processeur essaie d'accéder |
ADDRESS ERROR | l'adresse d'une instruction (au moins un mot) ou l'accès à un mot ou double mot s'est effectuée à une adresse impaire |
ILLEGAL INSTRUCTION | le code binaire donné au processeur ne correspond à aucune instruction du Motorola 68000 |
ZERO DIVIDE | la division par zéro est impossible (résultat infini) |
CHK INSTRUCTION | la vérification de limites provoquée par l'instruction CHK a échouée |
TRAPV INSTRUCTION | le test de débordement provoqué par l'instruction TRAPV a échoué |
PRIVILEGE VIOLATION | une instruction réservée au mode Superviseur a essayé d'être exécutée en mode Utilisateur |
TRACE VECTOR | si le mode TRACE est activé (bit 15 du registre de status SR) après l'exécution d'une instruction, le processeur exécute le programme pointé par ce vecteur, ceci permet la mise en place d'un débuguer |
EMULATION 1010 | aucune informations pour le moment |
EMULATION 1111 | aucune informations pour le moment |
![]() ![]() ![]() |
$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 d'anomalies 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