« Programmation Assembleur Z80/Jeu d instructions » : différence entre les versions

Contenu supprimé Contenu ajouté
→‎RLD : + d'explications sur l'instruction
Ligne 712 :
 
==== DI ====
 
Cette instruction ('''D'''isable '''I'''nterruptions) désactive toutes les interruptions masquables.
 
==== EI ====
 
Cette instruction 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).
Cette instruction ('''E'''nable '''I'''nterruptions) active le déclenchement des interruptions après l'instruction suivante.
La précision à propos de l'instruction suivante est importante.
Cette instruction 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 :
EI
RET
 
==== IM ====
 
Cette instruction ('''I'''nterruption '''M'''ode) permet de choisir le mode d'interruption du Z80 parmi 3 modes. Par défaut, le Z80 démarre en mode 1.
Par défaut, le Z80 démarre en mode 1.
 
'''''Mode 0'''''
IM 0
Ce mode de fonctionnement indique que les interruptions sont générés par un matériel externe.
Le Z80 est supposé exécuterexé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 maa connaissance,été iltrès n'a jamais étépeu utilisé sur les ordinateurs.
 
'''''Mode 1'''''
IM 1
Fonctionnement par défaut du Z80, le processeur exécute un saut à l'adresse #38.
Sur un Amstrad CPC, les interruptions sont générées par une puce vidéo tous les 300è 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è de seconde (fréquence de rafraîchissement à 50 Hz) lors de la VBL (synchro verticale).
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
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<int>, le Z80 va lire une adresse 16 bits à laquelle il va sauter.
 
==== 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 ====
 
Ligne 753 ⟶ 775 :
 
==== 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.
Ligne 761 ⟶ 784 :
 
==== 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.
 
=== Instruction qui ne fait rien ===