Obligement - L'Amiga au maximum

Jeudi 21 septembre 2017 - 07:08  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Hit Parade
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles in other languages


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Moteurs de recherche
 · Pages de liens
 · Constructeurs matériels
 · Matériel
 · Autres sites de matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Développeurs logiciels
 · Logiciels
 · Développeurs de jeux
 · Jeux
 · Autres sites de jeux
 · Scène démo
 · Divers
 · Informatique générale


Jeux Amiga

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


Trucs et astuces

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


Glossaire

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


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


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 : soft et hard

Les interruptions "soft" sont générées par programme alors que les interruptions "hard" 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.

Assembleur

Il faut ici remarquer que les interruptions "hard" peuvent être déclenchées de façon "soft" 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

Assembleur

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 :

Assembleur

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.

Assembleur

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).


[Retour en haut] / [Retour aux articles]