Obligement - L'Amiga au maximum

Mercredi 20 septembre 2017 - 07:39  

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 - interruption IRQ
(Article écrit par Squonk et extrait d'A-News (Amiga News) - juillet 1989)


Et non ! Il ne s'agit pas ici de décortiquer le virus IRQ (trois fois hélas !). mais plutôt d'exposer le fonctionnement des interruptions sur notre bête de course (et de somme...). La lecture de ce qui suit est formellement déconseillée aux personnes mineures, à ceux qui ne connaissent pas (les pôvres) l'assembleur et enfin à ceux qui ne savent pas lire. Le non-respect de ces précautions peut entraîner des troubles graves, allant jusqu'à l'assemblerium tremens (folie qui consiste grâce à un outil bizarre et pas toujours très adapté, à taper sur un clavier de micro-ordinateur personnel très répandu une succession de touches complètement incohérente).

Pas d'interruption !

Citoyens, citoyennes, vous voilà prévenus. Bon, comme j'en ai assez de taper i-n-t-e-r-(r)-u-p-t-i-o-n à tout bout de champ, que je n'ai pas assimilé le fonctionnement du couper-coller sur ce ?!@&§?! d'éditeur et qu'il me manque toujours un "r", je dirai dorénavant : IRQ. Voilà. Ceci dit, une IRQ qu'est-ce que c'est ? Parce que c'est facile de programmer dans son coin, tranquille, la tasse de café sur la table, le yaourt dans la main gauche en écoutant Chantal Goya. C'est trop simple d'aligner bêtement des instructions séquentiellement à l'aide d'un débogueur de rêve !

Et les évènements, hein ?, non mais jeune freluquet. Un évènement, c'est une indication pour le processeur que quelque chose s'est produit dehors. Exemple : quelqu'un sonne à ma porte juste quand j'ai décidé de faire la sieste. Cet évènement peut être de durée variable (personnellement, le plus long que j'ai vu, c'était en 1968). Pour tous ceux qui ont déjà possédé un ZX81, Apple II, C64 ou autre calculette de poche, c'était du gâteau... Et c'est là qu'arrive le progrès fulgurant, j'ai dénommé le 68000.

Évolutions, révolutions et événements

Sur toutes les autres machines 68000, ataviste et autres macadam, le seul progrès, c'est qu'au lieu d'être purement boule et haine, on simplifie en permettant d'avoir énormément (7) de possibilités d'évènements. Bon sang, pourquoi ne pas y avoir pensé plus tôt ? Ce que je suis bête tout de même. Au lieu de s'embêter à récupérer l'unique IRQ et de regarder qu'est-ce que c'est (je vais ouvrir la porte), je peux avoir plusieurs sources d'évènements (le téléphone, le réveil...), ce qui est, avouez-le, un net progrès apporté par la civilisation moderne à l'homo sapiens que je suis.

Et dans mon envolée lyrique, je vais même simplifier un peu plus en classant ça par niveaux. Comme j'en discutais hier avec mon gardien, c'est comme dans l'ascenseur : plus le niveau est grand, plus c'est élevé. Bon, je suis content, j'ai mon IRQ, qu'est-ce que j'en fait ? D'habitude, il faut un peu anticiper et prévoir qu'on va être dérangé en plein travail : il faut initialiser un vecteur d'IRQ, c'est-à-dire on va mettre dans la bonne case de la mémoire l'adresse de ce qu'il faut faire quand on est réveillé. Et là, le miracle s'accomplit devant vos yeux incrédules, zébahis z'et babas : le processeur vous réveille ! Incroyable, non ?

En plus de cela, les affreuses bestioles citées plus haut et dont je ne répéterai pas lu nom de peur de salir ma plume aiguisée ont aussi la possibilité de se réveiller toutes seules, en gros de sauter à une adresse précisée à l'avance quand on rencontre une certaine instruction : le "trap". Les fameux Gourous fonctionnent sur un principe similaire, sauf que les traps ne sont pas toujours volontaires !

Pourquoi faire simple quand on peut faire compliqué ?

Assez parlé de poubelles, passons à notre machine tant choyée. D'abord, c'est la meilleure, ça tout le monde le sait. Mais en plus, elle est multitâche (contrairement à certaines lessives, c'est la seule à en ajouter). Ceci implique une rigueur et une conscience sans faille, bref, il faut non seulement pouvoir récupérer les évènements à son profit, mais aussi en générer, sans pour autant squatter les ressources systèmes car nous sommes susceptibles de travailler à plusieurs. La commutation de tâches notamment doit permettre de retourner à une tâche particulière, mais aussi pouvoir être inhibée momentanément.

Bon, ça, c'est ce que dit la pub, en fait, ils auraient pu utiliser la même chose que les autres, c'eût été plus simple. Enfin, j'espère qu'ils trouveront une utilité à leur truc dans le futur, sinon, ça fait bête.

Je vous attends tous, la langue pendante, me suppliant... En fait, le 68000, quand il reçoit une IRQ, peut effectuer deux traitements différents, suivant le niveau de sa broche d'entrée VPA. Si le niveau est haut, il va rechercher un vecteur IRQ utilisateur (adresses $100-$3ff, l'Amiga se sert de cette zone pour le Debug()). Oubliez tout ceci, ça ne sert à rien sur Amiga (ah ah, je vous ai bien eu).

En fait ici, la seule méthode utilisée est la vectorisation automatique. Suivez le guide SVP. Un circuit externe (CIA par exemple) déclenche une IRQ qui, récupérée par le décodage d'adresse (Gary ou groumphburp élevé au PAL sur A1000) va générer l'IRQ pour le 68000 en même temps qu'un signal VPA bas. Le 68000 se met alors en mode émulation 6800 (!) et lit un numéro de vecteur ($19 à $1f) que va lui fournir le décodage d'adresse. Mais où est-ce qu'il va le prendre, son numéro ? Aux adresses $ffff02-$ffffff, bien sûr ! A partir du niveau de l'IRQ disponible dans les circuits spécialisés (registres INTENA & INTENAR), le décodage d'adresses récupére le vecteur à renvoyer au 68000 grâce à une table située tout en haut de la mémoire (les bits non utilisés sont mis à 1, Z-State). Le 68000, il est tout content, vi, donc il saute au vecteur de niveau associé ($64-$7f, numéro de vecteur*4). Ces vecteurs sont positionnés par Exec pour pointer sur des serveurs d'IRQ (plusieurs IRQ à répartir) ou directement sur un IRQ-handler (une seule source possible). Bref, après, c'est vous qui voyez.

Mieux ! Le 68000 peut s'autogénérer des autovecteurs (woahhh). Grâce au registre INTREQ, on délivre, si INTENA est d'accord, une interruption pour le circuit spécialisé, qui va, suivant le principe dit "du coup de pied", transmettre le coup au 68000 comme plus haut. Pour reprendre la métaphore très prosaïque précédente, cela revient à appuyer sur la sonnette soi-même.

Bon, après, c'est Chicos et Cie pour la répartition des IRQ suivant leur provenance, voir livres. Peut-être bien que j'en dirai quelque chose, si j'ai le temps. Tout ce que j'ai encore la force de vous dire, c'est qu'en fait l'IRQ de niveau 7 n'est jamais utilisée car elle correspond sur le 6800 (!) à une IRQ non masquable NMI.

Paula

Paula joue un rôle essentiel dans la gestion des IRQ de l'Amiga. Elle contient les registres lecture/écriture INTREQR et INTREQ où sont positionnés les bits correspondants à chaque IRQ reçue, ainsi que les registres lecture/écriture INTENAR et INTENA servant à masquer chaque bit des registres précédents. Comme le 68000 ne comprend que sept niveaux d'IRQ distincts, Paula classe les différentes sources par niveaux comme suit :

Niveau 7
  • Inutilisé (IRQ non masquable NMI).
Niveau 6
  • Broche /INT6 (n°22 sur A500 et A1000) du connecteur d'extension.
  • CIA B Time-out A (transfert voie série, relié au BUSY Centronics).
  • Time-out B (transfert synchrone Blitter).
  • Event-counter (synchro écran horizontale 15625 Hz).
  • Port série (caractère reçu ou envoyé, relié au BUSY Centronics).
  • Broche drapeau niveau bas (trou d'index lecteur de disquette).
Niveau 5
  • Octet de synchro lecteur de disquette lu.
  • Port série DMA de Paula plein en entrée (caractère reçu).
Niveau 4
  • Bloc de données audio envoyé.
Niveau 3
  • Fin de traitement Blitter.
  • Synchro verticale dérivée de la "Master Clock" d'Agnus (50 Hz).
  • Interruption logicielle réservée pour le Copper (position écran atteinte).
Niveau 2
  • Broche /INT2 (n°19 sur A500 et A1000) du connecteur d'extension.
  • CIA A Time-out A (transfert série clavier).
  • Time-out B ("timer" utilisé par le task-scheduler).
  • Event-counter (synchro verticale 50 Hz encore !).
  • Port série clavier (touche reçue).
  • Broche drapeau niveau bas (ACK du port Centronics).
Niveau 1
  • Interruptions logicielles générées par le 68000 à lui-même (task-scheduler).
  • Fin de transfert de bloc de données lecteur de disquette.
  • Port série DMA de Paula vide en sortie (caractère envoyé)
Niveau 0
  • Niveau "aucune interruption" !
Admirez le nombre impressionnant de "ports série" ! En fait, seul celui appartenant à Paula correspond au bon vieux connecteur RS232. Le port série du CIA A reçoit les touches en provenance du clavier. Celui du CIA B n'est relié qu'à la broche BUSY du connecteur Centronics (?). Le premier qui trouve une utilité à ce truc a gagné mon admiration.

L'IRQ "réservée" au Copper ne l'est en fait pas réellement, simplement il est facile de la déclencher dans une liste d'instructions Copper par :

$001E8010MOVE #$8010, INTREQ(instruction Copper)

Cela peut servir à déclencher un programme en fonction d'une ou plusieurs positions écran fixées (à bon entendeur salut...).

Cheminement précis d'une IRQ dans un Amiga 500 de base
  • Le 68000, les CIA's brothers, Agnus, le Copper, les cartes sur le bus d'extension ou Paula elle-même écrivent dans le registre INTREQ de Paula.

  • Paula a reçu une IRQ, visible dans son registre INTREQ. Elle le compare avec le registre de masque INTENA qui lui a été fourni au préalable : si l'IRQ reçue n'est pas acceptée, elle ne fait rien.

  • L'IRQ est acceptée, Paula génère les signaux IPLO-2 à l'adresse du 68000 (sept niveaux possibles : 1-7).

  • Le 68000 détecte le changement de niveau d'IRQ entre l'exécution de deux instructions : il compare le niveau reçu à celui qui lui a été fourni dans son registre d'état SR (bits 8-10). Si le nouveau est de priorité inférieure ou égale à l'ancien, le traitement est différé.

  • Le 68000 passe en mode superviseur, fait une sauvegarde du registre d'état SR dans la pile superviseur, inhibe le mode trace et porte le niveau d'IRQ à la nouvelle valeur.

  • Le 68000 met son bus d'adresse en haute-impédance (déconnecté), sauf les trois bits de poids faible, sur lesquels il recopie le niveau d'IRQ qu'il vient de recevoir. Cela revient à adresser la zone de mémoire $fffff8-$ffffff.

  • Gary sélectionne donc la ROM à ces adresses, qui contient le numéro de vecteur d'IRQ pour le niveau accepté. Les numéros de vecteur qui se trouvent là sont $19-$1f.

  • Le 68000 reçoit ce numéro, le multiplie par 4 (longueur d'un vecteur). Il obtient des valeurs $64-$7c : c'est l'adresse du vecteur de traitement de cette IRQ, qu'il place sur le bus d'adresse.

  • Gary sélectionne la RAM aux adresses $64-$7c par l'intermédiaire d'Agnus : la donnée récupérée est l'adresse du programme de traitement de l'IRQ.

  • Le 68000 sauvegarde ses registres dans la pile superviseur et saute à l'adresse récupérée, qui est l'adresse d'une routine déterminée pour chaque niveau d'IRQ.
Donc le 68000 a obtenu l'adresse de la routine d'IRQ à exécuter. Cette routine est chargée de contrôler que le bit MASTER INTERRUPT de INTENA autorise bien les IRQ en général et de répartir à nouveau les sept IRQ possibles en 16 vecteurs à l'aide des structures IntVector de la bibliothèque Exec (offsets $54-$113). Il y a grosso-modo une structure IntVector pour chaque bit de INTREQ dans Paula (sauf bits 14-15 qui sont remplacés par des IntVector pour IRQ internes et NMI). Il y a alors deux cas possibles : soit le bit d'IRQ n'a pu être mis en place que par une source unique (exemple : lecture de synchro disquette), soit sa signification est complexe (exemple : CIA-A). Une structure IntVector contient alors :

1. L'adresse iv_Data de données relative à cette IRQ. Dans le cas d'une source unique, c'est un pointeur sur une structure complexe contenant des variables importantes (resource ou device), sinon c'est un pointeur sur une structure ServerList. Une ServerList est constituée de :
  • Une tête de liste ServerList contenant :
    • Deux masques de mise à zéro du bit d'IRQ sl_IntClr1 et sl_IntClr2 qui seront utilisés par tous les "interrupt-handler" de ce serveur.
    • Un masque de mise à 1 du bit d'IRQ sl_IntSet pour l'action opposée.
    • Une tête de liste sl_List pointant sur la première structure Interrupt de la liste.
  • Une (en général) ou plusieurs structures Interrupt chaînées.
2. L'adresse d'une routine iv_Code à exécuter. Pour une source unique, c'est le "interrupt-handler", sinon, il s'agit d'un "interrupt-server" chargé d'appeler successivement chaque "interrupt-handler" qui va déterminer quelle action a bien pu générer l'interruption (exemple : touche reçue par le CIA A).

3. L'adresse iv_Node d'une structure Interrupt dans le cas d'une source unique, NULL sinon.

Bref, dans tous les cas, on se ramène à appeler un "interrupt-handdler" soit directement soit indirectement, en lui passant dans A1 l'adresse de données iv_Data ou is_Data lui étant utile (structure resource ou device) et qui est chargé de traiter l'IRQ reçu si elle le concerne. C'est une routine normale terminée par un RTS.

Attention toutefois pour les utilisateurs du C Aztec, car si vous utilisez le modèle de mémoire "small-code" ou "small-data", l'assembleur transforme les adresses absolues en adresses relatives par rapport à A4 (initialisé au début du programme) et qui ici contiendra à peu près n'importe quoi... La solution consiste à placer au début de votre "interrupt-server" un appel à la routine de bibliothèque GetA4().


[Retour en haut] / [Retour aux articles]