Obligement - L'Amiga au maximum

Mardi 16 avril 2024 - 23:31  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

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

Articles in english


Réseaux sociaux

Suivez-nous sur X




Liste des 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,
ALL


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


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


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

Assembleur

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

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]