Revenir au plan du site
Gestion des interruptions
DI
Cette instruction (
Disable
Interruptions) désactive toutes les interruptions masquables.
EI
Cette instruction (
Enable
Interruptions) active le déclenchement des interruptions après l'instruction suivante. La précision à propos de l'instruction suivante est importante. En effet, lorsqu'une routine appelée par interruption se termine, il faut autoriser à nouveau les interruptions (sinon elles ne se déclencheront plus). Mais il est tout à fait possible que pendant le déroulement de la fonction sous interruption, une autre interruption soit survenue. L'interruption est donc en attente et se déclenchera dès lors que les interruptions seront à nouveau autorisées. Nous avons vu que le déclenchement d'une interruption saute à une adresse définie par le mode d'interruption ET que l'adresse interrompue est enregistrée dans la pile. Si l'autorisation des interruptions est immédiatement consécutive à l'instruction EI, il ne serait pas possible de revenir au programme interrompu avant qu'une interruption en attente se déclenche. La conséquence serait un empilement d'adresses de retour dans la pile et un écrasement progressif de la mémoire, jusqu'à ce que la pile déborde sur la routine sous interruption. C'est pour cette raison qu'après un EI, le Z80 exécute UNE instruction supplémentaire avant d'autoriser à nouveau les interruptions.
L'usage classique en retour d'interruption est le suivant :
IM
Cette instruction (
Interruption
Mode) permet de choisir le mode d'interruption du Z80 parmi 3 modes. Par défaut, le Z80 démarre en mode 0. La précision est importante car le CPC est conçu pour fonctionner en mode 1. Si vous êtes ammené à développer vos propres ROM, il est impératif de basculer au plus vite en mode 1.
mode 0
IM 0 ; basculer en mode d'interruption 0
|
Ce mode de fonctionnement indique que les interruptions sont générées par un matériel externe. Le Z80 exécute une instruction dont l'opcode aura été envoyé par le matériel sur le bus de données. En théorie, l'instruction de saut serait un RST. Ce mode a été très peu utilisé sur les ordinateurs et à priori jamais sur Amstrad CPC.
mode 1
IM 1 ; basculer en mode d'interruption 1
|
Fonctionnement par défaut de la plupart des ordinateurs utilisant le Z80, le processeur exécute un saut à l'adresse #38 lors d'une interruption. L'adresse en cours du programme interrompu est stockée sur la pile (comme un CALL). Sur un Amstrad CPC, les interruptions sont générées par une puce vidéo tous les 300èmes de seconde (soit 52 lignes vidéo). Sur un ZX Spectrum, les interruptions sont aussi générées en corrélation avec le contrôleur vidéo mais tous les 50èmes de seconde (fréquence de rafraîchissement à 50 Hz) lors de la VBL (synchro verticale : Vertical BLanking). Sur les calculatrices TI, le nombre d'interruptions dépend apparemment de l'état de la batterie (autour d'une centaine par seconde).
mode 2
IM 2 ; basculer en mode d'interruption 2
|
Le mode 2 est un mode d'interruption vectorisé. Le Z80 récupère un numéro d'interruption sur le bus de données avec lequel il forme l'octet de poids faible d'une adresse. L'octet de poids fort de l'adresse est contenu dans le registre I. À l'adresse (toujours paire) pointée par la valeur 16 bits I
, le Z80 va lire une adresse 16 bits à laquelle il va sauter. L'utilisation du mode 2 est incompatible entre les CPC et les Plus. Sur les modèles Plus, le mode vectorisé présente d'autres bugs, voir la page cpcWiki.
HALT
Cette instruction boucle en continu jusqu'au déclenchement d'une interruption. On se sert du HALT pour se synchroniser de façon précise sur une interruption. Quand on n'utilise pas de HALT, le saut à l'interruption ne peut se faire qu'après la fin de l'exécution de l'instruction en cours. Si cette instruction est longue, le déclenchement de l'interruption est retardé de quelques cycles d'horloge, ce qui peut être rédhibitoire si on a besoin d'une grande précision (typiquement programmation au vol de la puce vidéo).
RETI
Cette instruction sert à acquitter les interruptions à des périphériques hardware en fin de routine.
Il est indispensable de précéder l'instruction avec EI pour que les interruptions puissent se déclencher à nouveau, sinon l'interruption de la carte matérielle restera masquée jusqu'au prochain EI.
En effet, le déclenchement d'une interruption (exceptée NMI) met le flag à 0 (les deux copies internes IFF1 et IFF2 du processeur), comme un appel explicite à l'instruction DI.
Un appel explicite à EI remet les deux copies IFF1 et IFF2 à 1, mais le processeur ne permettra une interruption qu'après l'instruction suivante (RETI dans ce cas) afin qu'une interruption n'empêche pas son exécution.
Dans le cas d'une NMI (Non Maskable Interrupt), seul le flag IFF1 est mis à 0. La routine de traitement de cette interruption n'est pas obligée d'utiliser l'instruction EI, car les instructions RETN et RETI copient la valeur de IFF2 dans IFF1.
RETN
Cette instruction sert à acquitter une interruption non masquable en fin de routine. Tant que cette instruction n'est pas exécutée, les interruptions non masquables sont en attente.
RETN ou RETI ? Les deux instructions sont équivalentes. Cependant, RETI est l'alias officiel reconnu par les périphériques pour détecter la fin de traitement d'une interruption. Quand un périphérique voit passer le code de l'instruction RETI sur le bus de données, il sait qu'il peut retenter de déclencher une interruption.
LD I,A
C'est la seule instruction qui permet de modifier le registre I. Le registre I indique le poids fort de l'adresse de la table de saut à exécuter lors des interruptions en mode IM 2.