CODINGDEMONIAK ★ COURS d'ASSEMBLEUR par DEMONIAK ( Mercredi 04 Mai 2005) ★

Cours d'assembleur par Demoniak - Partie 3 : Les registres du Z80Coding Demoniak

Partie 3 : Les registres du Z80

Maintenant que nous connaissons le binaire, l'hexadécimal et l'organisation mémoire du CPC, nous allons passer aux choses sérieuses...

Pour ceux qui ne le savent pas encore, le Z80 est le microprocesseur du CPC.
Le microprocesseur peut être considéré comme le cerveau de l'ordinateur.
C'est lui qui exécute les programmes.

En basic, lorsque nous écrivons un programme, nous utilisons des variables.
Le microprocesseur utilise lui, ce que l'on appelle des registres.
Les registres peuvent être considéré comme des variables, mais à la différence des variables, ils ont un nom et un nombre bien définis.

Ces registres sont des registres numériques de 16 bits, c'est à dire qu'ils peuvent contenir une valeur variant entre #0000 et #FFFF.

Chaque registre à également une fonction bien spécifique.

On peut séparer les registres en trois grandes catégories :
— les registres généraux, utilisés 90% du temps,
— les registres d'index, utilisés pour faire de l'adressage "indexé",
— les registres spéciaux, utilisés pour des fonctions spécifiques.

Les registres géréraux sont les suivants :
AF, BC, DE, HL

Le Z80 possède également des registres généraux "miroir" ou "prime" que l'on nommera :
AF', BC', DE', HL'

Donc, il dispose de 8 registres généraux de 16 bits.

Ces registres sont divisibles en paires de registres 8 bits, et que l'on nomme ainsi :
A, F, B, C, D, E, H, L

Et leurs équivalents
A', F', D', C', D', E', H', L'

Donc, A contient les 8 bits de poids fort de AF, et F contient les 8 bits de poids faibles de AF

Un exemple :

Si AF contient la valeur #1234 (hexadécimal), A contient #12 et F contient #34.
Le Z80 permet donc de manipuler les registres généraux sous leurs forme 8 bits ou 16 bits.
Les registres généraux sont utilisés dans des cas bien précis.

Par exemple, le registre A, appelé accumulateur, est utilisé pour les calculs arithmétiques et logiques.
Le registre F, appelé flags, est utilisé comme indicateur de validité des résultats.
En fait, le registre F se décompose en bits, que l'on pourra tester indivuellement.
Chaque bit est considéré comme un indicateur (flag) particulier.
Voici comment se décompose le registre des flags :

Numéro de bit 7 6 5 4 3 2 1 0
Nom du bit S Z x H x V N C

(Les bits 3 et 5 ne sont pas utilisés)

Maintenant, voyons la signification de ces bits :
— Bit S : Signe. Indique si le résultat d'une opération a donné un résultat positif ou négatif. Si le résultat est négatif, S vaut 1, sinon, S vaut 0.
— Bit Z : Zéro. Indique si le résultat d'une opération a donné un résultat nul. Si le résultat est nul Z vaut 1, sinon, Z vaut 0.
— Bit H : demi-retenue. Est égal à 1 si le résultat d'une opération a généré une retenue après le bit 4.
— Bit V : oVerflow ou parité. Est égal à 1 si le résultat d'une opération a donné un résultat invalide.
Dans le cas d'une opération logique, est égal à 1 lorsque la parité du résultat est impaire.
— Bit N : Négation. Est égal à 1 si l'opération qui a été effectuée est une opération de négation.
— Bit C : Retenue. Est égal à 1 si le résultat d'une opération a généré une retenue.
Ces bits sont positionnés automatiquement par le processeur après chaque opération.
Bon, voyons quelques exemples concret.

Si nous faisons l'addition suivante (signée sur 8 bits):

#74 116 (=%01110100, signe positif)
+#4F 79 (=%01001111, signe positif)
----
= #C3 -61 (=%11000011, signe négatif)

On voit tout de suite qu'il y a un problème : l'addition de deux nombres positifs donne un nombre négatif. Donc, nous pouvons déduire, qu'après ce calcul, notre registre F (flags) aura la valeur suivante :

S = 1 (signe du résultat négatif)
Z = 0 (résultat non égal à zéro)
x = ? (valeur indéterminée)
H = 1 (retenue entre le bit 3 et le bit 4)
x = ? (valeur indéterminée)
V = 1 (résultat incorrect : positif+positif=négatif)
N = 0 (opération n'était pas une soustraction)
C = 0 (pas de retenue du bit 7 au bit 8)

Soit la valeur #94 dans le registre F.

Autre exemple :

#74 116 (=%01110100, signe positif)
+#8C -116 (=%10001100, signe négatif)
----
=#(1)00 0 (=%00000000, signe positif, avec retenue bit 8)

Voici la valeurs de nos flags

S = 0 (signe du résultat négatif)
Z = 1 (résultat non égal à zéro)
x = ? (valeur indéterminée)
H = 1 (retenue entre le bit 3 et le bit 4) x = ? (valeur indéterminée)
V = 0 (correct : positif+négatif=positif)
N = 0 (opération n'était pas une soustraction)
C = 1 (retenue du bit 7 au bit 8)

Le Z80 calcule donc pour nous les flags. Il existe ensuite des instructions pour réaliser des conditions en fonction de la valeur de chaque flags.

Après le registre A et le registre F, voyons les autres registres généraux.
Le registre B est souvent utilisé comme compteur de boucle 8 bits. Une instruction particulière permet de le décrémenter (diminuer de 1) et de faire un saut si sa valeur n'est pas égale à zéro.
Combiné avec le regisgre C, il sert aussi de compteur 16 bits pour des instructions particulières, comme la copie de blocs.
Le registre HL est souvent utilisé comme pointeur. Un pointeur est en sorte une variable qui donne l'adresse d'une case mémoire.
Il suffit ensuite de se servir de ce pointeur pour lire la valeur d'une case mémoire ou de l'écrire.
Quand au regisgre DE, il n'a pas de fonctions particulière. Il peut servir lui aussi comme pointeur.

Tout ce que nous avons vu pour les registres AF, BC, DE, HL est valable pour les registres AF', BC', DE', HL'.
En fait, chaque double d'un registre n'est pas visible en même temps que son original.
Cela signifie que l'on ne peut pas voir en même temps le registre AF et le registre AF', le registre BC et le registre BC', et ainsi de suite.
Il existe dans le Z80 une instruction particulière qui "echange" les registres principaux et les registres miroirs.
Lorsque l'on utilise cette instruction, les registres principaux deviennent registres miroir, et inversement.
Il faut donc utiliser cette instruction avec prudence, pour ne pas s'emmeler les pinceaux, en quelques sorte.
De plus, le système de l'Amstrad utilise les registres miroirs. Il est donc déconseillé de les utiliser pour notre usage personnel.
Bien que cela soit quand même possible, mais bon... Nous n'allons pas (encore) nous étendre sur ce sujet.

Voyons maintenant les registres d'index.
Ils sont au nombre de deux, IX et IY. Ils sont utilisables exclusivement en mode 16 bits (bien que certaines instructions non documentées du Z80 permettent d'y accéder sous leur formes 8 bits... )
Ils servent donc de registres d'index.
Nous verrons plus tard, lorsque nous aborderons les modes d'adressages, à quoi cela correspond.

Reste les registres spéciaux, au nombre de 3 qui sont : PC, SP, et IR.

Tout d'abord, le PC, ou encore Program Counter, est un registre 16 bit qui indique l'adresse en mémoire de la prochaine instruction à exécuter.
Rappelez vous, la mémoire peut être considéré comme une grande armoire avec des tiroirs, chaque tiroir correspond à une adresse mémoire.
Et bien le PC contient l'adresse ou le Z80 va aller chercher l'instruction à exécuter.
Lorsque que le Z80 a lu l'instruction, le PC est automatiquement incrémenté, pour que le Z80 puisse ensuite lire l'instruction suivante, et ainsi de suite.
Il existe des instructions pour modifier le PC, en quelque sorte, comme si l'on faisait un "GOTO" en basic.

Ensuite le registre SP, ou encore Stack Pointer (pointeur de pile en Français) est utilisé pour permettre la sauvegarde des registres de la manière suivante :

Le registre SP contient une adresse mémoire. Des instructions spécialisées permettent d'écrire la valeur d'un registre à l'adresse indiquée par le registre SP, ou bien de lire dans un registre la valeur contenue à l'adresse indiquée par le SP.

Plus précisément, lorsque l'on sauve un registre, le SP est décrémenté de 2 (on sauve toujours les registres 16 bits), puis on écrit à la nouvelle adresse du SP le registre.
Pour restaurer un registre, on lit à l'adresse du SP, puis on l'incrémente de 2. Ainsi, le SP gère une "pile" de valeurs. Pile que l'on appelle aussi FIFO : First In First Out (premier entré, premier sorti).

Pour finir, le registre IR n'est pas utilisable sous sa forme 16 bits, mais sous forme de deux registres 8 bis : I et R.

Le registre I est utilisé pour les interruptions en mode 2, une chose que nous verrons sans doute plus tard...

Le registre R est utilisé comme registre de rafraichissement des mémoires RAM. En gros, il est incrémenté automatiquement par le processeur.

Il est souvent utilisé comme générateur de nombre aléatoires, sa valeur étant incrémenté très rapidement par le processeur.

Terminé pour ce chapitre !

Dans le chapitre suivant, nous verrons les modes d'adressages, et comment lire ou écrire un registre !

Page précédente : Cours d'assembleur par Demoniak - Partie 2: La mémoire

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

Lien(s):
» Coding » Cours d'assembleur par Demoniak - Partie 1 : Les bases de nombres
» Coding » Cours d'assembleur par Demoniak - Partie 6 : les vecteurs système
» Coding » Cours et Initiation par Demoniak
» Coding » Demoniak Packer
» Coding Src's » Dots (Demoniak)
» Coding » Cours d'assembleur par Demoniak - Partie 7 : les vecteurs système II
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 256 millisecondes et consultée 8307 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.