Suivez-nous sur X

|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Assembleur - Les interruptions
(Article écrit par Roméo Rapido et extrait d'Amiga News - septembre 1992)
|
|
Voici quelques précisions sur ce que l'on appelle les interruptions.
Tout d'abord, qu'est-ce qu'une interruption ?
On peut dire, pour simplifier, que c'est un arrêt de l'exécution des instructions du programme pour
dérouter celui-ci sur un code particulier. Le processeur (ici le 68000 mais ceci peut être généralisé
à toutes sortes de microprocesseurs) commence par sauvegarder ces registres (An, Dn, PC, CCR et SP
(qui est en fait A7 pour le 68000)) puis exécute une routine qui doit en principe se terminer par
l'instruction retour d'interruption (RTE en 68000), il ne lui reste plus qu'à restaurer les registres
et à reprendre l'exécution du programme.
L'adresse de cette routine est stockée dans une case mémoire réservée à cet effet. Cette adresse
dépend bien sûr du processeur et se nomme vecteur d'interruption. Pour le 68000, la table des vecteurs
d'interruption, car il y a sept vecteurs d'interruption sur notre chère bécane, est située entre $64 et $7C.
Sur l'Amiga, les interruptions sont de deux sortes : logicielles et matérielles
Les interruptions logicielles sont générées par programme alors que les interruptions matérielles
sont générées par le matériel de l'Amiga (Blitter, Copper, Paula et les CIA)
mais toutes deux ont un point commun, elles passent par Paula qui envoie alors les signaux correspondant au 68000.
Quatre registres disponibles pour la gestion des interruptions
Il s'agit de INTENA ($9A), INTENAR($1C), INTREQ ($9C) et INTREQR ($1E).
Ces registres sont à sens unique. On peut seulement écrire dans les registres INTENA et INTREQ,
de même que l'on peut seulement lire le contenu des registres INTENAR et INTREQR
(le "R" veut dire READ, "lire" en anglais).
Les registres INTENA (interupt enable "interruption autorisées") déterminent quelles sont les
interruptions qui ne sont pas masquées (ou qui sont masquées, c'est comme vous voulez), c'est-à-dire
celles dont la routine correspondant doit être exécutée (pour une interruption particulière, si le
bit correspondant dans INTENA a été activé, alors Paula enverra le signal correspondant au niveau de
priorité de cette interruption au 68000 qui ira chercher dans la table des vecteurs l'adresse de la
routine et le code de l'interruption sera exécuté. Si le bit est à zéro, l'interruption sera
ignorée et Paula n'enverra pas le signal au 68000).
Il existe une autre interruption qui elle, n'est pas masquable (NMI ou non-maskable interrupt)
mais elle n'est pas câblée sur Paula et donc inutilisable dans l'Amiga. La seule interruption
non masquable dans l'Amiga est donc la fameuse NMI-EDF plus couramment appelée coupure de courant. :-)
Comme plusieurs interruptions peuvent arriver en même temps, elles ont une priorité les unes par
rapport aux autres, la plus prioritaire étant bien sur la NMI. Voici un tableau récapitulatif des
priorités des interruptions en fonction de leurs niveaux, des adresses des vecteurs correspondants
et de leurs noms.
Il faut ici remarquer que les interruptions matérielles peuvent être déclenchées de façon logicielle
en forçant le bit correspondant dans INTREQ et qu'il y a plusieurs interruptions
de même niveau. Nous verrons plus loin comment faire la différence entre les interruptions.
Organisation des registres INTENA et INTREQ
Première étape : comment positionner un bit dans ces registres ?
Pour activer un bit, il suffit d'écrire la valeur correspondante au bit avec le bit 15 à 1.
Exemple : activer le bit 2 MOVE.W #$8004,INTENA
Pour désactiver, même opération mais avec le bit 15 à 0.
Exemple : désactive le bit 2 MOVE.W #$0004,INTENA
Pour tester la valeur d'un bit, on utilisera simplement l'instruction "BTST".
Exemple : test du bit 3 BTST.B #3,INTENAR+1 (l'instruction BTST n'existe que sur les octets ou
les mots longs (32 bits)).
Vous remarquerez au passage que le bit 14 de INTENA permet d'autoriser, ou d'interdire, toutes
les interruptions. Il convient de l'utiliser avec précaution pour ne pas provoquer de dysfonctionnement
du système. Néanmoins, c'est la méthode la plus simple pour exécuter du code en étant sûr de ne pas
être interrompu.
Comment greffer une routine d'Interruption ?
Il existe deux solutions :
1. Le remplacement pur et simple de la routine d'interruption.
Il faut récupérer le vecteur d'interruption (par exemple 3), le sauver pour pouvoir restaurer l'interruption plus
tard et le remplacer par l'adresse de la nouvelle routine, ce qui donne en gros :
2. L'ajout d'une routine à celle existant.
Dans ce cas, la procédure est presque identique sauf que la routine que nous ajoutons ne se
termine pas par un RTE mais par un JMP à l'adresse de l'ancienne routine. Comme cette adresse
n'est pas connue à l'assemblage, on réservera la place comme suit.
A présent, comment différencier les interruptions puisque pour un même vecteur,
il peut y avoir plusieurs routines qui sont chaînées (en particulier pour le niveau 3 puisqu'il
y a, entre autres, les interruptions Copper et VBL que nous avons déjà utilisées).
C'est très simple, il suffit de vérifier si le bit correspondant dans INTREQR
est activé ou non.
- Pour tester l'interruption Copper, on écrira : BTST.B #4,INTREQR
- De même, pour l'interruption VBL, on écrira : BTST.B #5,INTREQR
Je conclurai en disant qu'il est tout de même possible de générer une NMI sur Amiga.
Il suffit comme précisé dans le manuel Amiga ROM Kernel, d'utiliser les lignes IPL0
et IPL2 du 68000 qui sont câblées sur le bus d'extension pour pouvoir générer des NMI.
Cette interruption peut être utilisée pour un système de déboguage
par exemple (passage sous moniteur/débogeur lors de l'enfoncement d'un bouton-poussoir
par exemple).
|