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 :

  • Bit 0 : s'il est à 1 alors la routine est dans la RAM, sinon, la routine est en ROM et le registre
  • Bit 1 à 4 : ils déterminent la priorité de l'événement (testez quelques valeurs et vous verrez que cela influe étrangement).
  • Bit 5 : toujours et obligatoirement à 0.
  • Bit 6 : si ce bit est à un. votre événement aura une priorité plus grande que les événements conventionnels.
  • Bit 7 : ce bit à 1 forcera voire routine à être exécutée immédiatement en sautant la priorité des autres événements (cela retarde pas mal le scanning du clavier).

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).
Remettre votre programme dans la liste sera alors un jeu d'enfant grâce à :

— 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.
Sined le barbare

ORG #9000
ENT $
LD HL,EVENTB
LD DE;,START1
LD BC,#8100
JP #BCD7
EVENTB DEFS #10,0
START1 DI
PUSH AF
PUSH HL
LD A,(ADR)
DEC A
LD (ADR),A
JR NZ,SORS
LD A,50
LD (ADR),A
DEB LD HL,#C000
MET LD A,(HL)
XOR #FF
LD (HL),A
INC HL
LD A, H
OR L
JR NZ,MET
SORS POP HL
PDP AF
RET
;
ADR

Sined le barbare, ACPC n°2 , p46-47-48

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Bidouilles ACPC n°08 - RSX editeur de secteurs
» Coding » Bidouilles ACPC n°45 - Les vecteurs system (3/6)
» Coding » Assembleur ACPC n°10 - Initiation : Les decalages
» Coding » Bidouilles ACPC n 03 - Les Instructions supplemetaires du Z80
» Coding » Bidouilles ACPC n°38 - Lecture sans AMSDOS
» Coding » Assembleur ACPC n°24
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 382 millisecondes et consultée 2405 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.