★ CODING ★ Les vecteurs d'interruption ★ |
Assembleur ACPC n 02 - Les vecteurs d'interruption |
INTERROMPONS EN COEUR"Interruption ??? C'est quoi t'est-ce ???" Demanda le petit Popol à son papa qui fumait la pipe, en face de lui, les pieds sur le fauteuil. « C'est une longue histoire... » Répondit l'homme sage. « Je vais te le narer » Un ordinateur de petite taille, ne possédant qu'un microprocesseur modeste, est peu performant car il doit gérer toutes les taches ingrates. En effet, ce petit microprocesseur doit non seulement s'occuper des calculs mathématiques, du traitement des chaînes de caractères, mais aussi de l'écran, du clavier, des entrées sorties du système... etc. Pour ce faire, il partage son temps entre le programme principal et les tâches vitales au bon fonctionnement de la machine. T'entends ainsi que le clavier, entre autres, est scanné tous les cinquantièmes de seconde. D'autres périphériques doivent également Être surveillés. La mémoire, par exemple. Dans le cas du CPC. un circuit spécialisé s'en charge. Donc nous disions qu'à une fréquence donnée, le brave Z80 ( de chez Zilog , qu'on se le dise ), interrompt la tâche à laquelle il vaquait et. après avoir sauvegardé l'environnement, va se perdre dans le fin fond binaire de l'ordinateur pour vérifier que tout se passe bien. Si votre doigt vient effleurer une touche à ce moment précis, le processeur s'en aperçoit. Il saisit cette occasion pour stocker dans la mémoire le code de la touche avant que celle-ci ne soit relâchée. Si l'interruption n'était pas déclenchée le microprocesseur ne pourrait intercepter votre doux et subtil contact avec le clavier. Voici qui fut une des explications sur la nécessité des interruptions. UN CPC INTERRUPTE Dans le cas de bien des machines, il suffit de détourner le vecteur d'interruption indiquant l'adresse ou se branchera le microprocesseur pour traiter le clavier et les différents périphériques a l'instant prévu à cet effet. Pour le CPC, il en va tout autrement. Celui-ci possède déjà différentes tâches sous interruptions, pour le clignotement des couleurs, les différentes enveloppes de volumes et de tons de l'instruction "SOUND", le balayage du clavier... La liste pourrait être longue. Le kernel (noyau principal du CPC. maître du système) crée donc des files d'attente et sélectionne les tâches prioritaires par ordre d'important. Pour introduire un programme sous interrution, il faut donc lui indiquer la routine (obligatoirement en langage machine et déposée dans la zone centrale de la RAM au-dessus de &4000 ei sous &C000 sans quoi, le système planterait lors d'un switchage vers une ROM) que l'on désire voir insérée dans la file prévue à cet effet. Il y a deux vecteurs qui se chargent parfaitement de ce travail. Le premier dépose votre routine dans la file des interruptions lentes (tous les l/50ièmes de seconde), le second fait de même, mais pour les interruptions rapides (tous les l/300ièmes de seconde). Voici les conditions et les adresses d'entrées de ces routines : — CALL #BCD7 est la routine de mise en place d'une interruption lente ( 1/50 s.). — CALL #BCE0 est la routine d'insertion d'une interruption rapide dans la file appropriée (1/300 s.). Pour ces deux routines, les conditions d entrée sont les mêmes et doivent être suivies à la lettre, sous peine de plantage ou de non prise en compte de la demande. Trêve de bavardage, voici les choses tant convoitées : * Le double registre HL doit contenir l'adresse d'un bloc libre et réservé de 16 octets (peut-être moins mais je n'en suis pas certain) où le système stockera les différents paramètres utiles a la bonne sélection des différents candidats de la file d'attente, * Le double registre DE devra contenir l'adresse de votre routine qui sera, il est bon de le rappeler, obligatoirement dans la zone des 32 Ko centraux de RAM. * Le registre C contiendra le numéro de ROM dans laquelle est votre routine (si vous travaillez en RAM. on s'en contrefiche). * Le registre B contiendra la classe de votre événement (son importance en l'occurrence) qui est définie comme suit :
JE VEUX PLUS INTERRUPTER Si par un grand hasard, vous ne voulez plus que votre routine soit exécutée, qu'en d'autres termes vous désirez la retirer de la file d'attente, vous pouvez utiliser les deux vecteurs suivants : — CALL #BCDD (pour les interruptions lentes) — CALL #BCE6 (pour les interruptions rapides) Pour entrer dans chaque routine, il faudra que HL pointe sur le bloc d'événements (la même adresse que lots de l'installation). — CALL #BCDA (quelle lenteur) — CALL #BCE3 (waou, ça déménage) J'EN REVEUX, M'SIEUR, J'EN REVEUX Il y a tout de même certaines conditions de fonctionnement sans quoi, iJ serait trop simple de programmer ce genre de choses. Certaines conditions sont à respecter comme, par exemple, la sauvegarde de tous les registres utilisés (par de simples PUSH) et d'autres conditions, parfois étranges, que je n'ai moi-même pas bien saisies. Mais, ù vous de vous amuser maintenant !!! LISTING Si vous le désirez, tapez le petit listing qui suit et qui est assez significatif de ce qu'on peut réaliser sous interruptions. A la prochaine. Salut. potos. ORG #9000 |
|