# Programmation Assembleur Z80/Registres

Le Z80 contient 13 registres 16 bits dont la plupart sont accessibles directement en 8 bits: AF, BC, DE, HL, IX, IY, SP, PC, IR ainsi qu'un jeu secondaire de registres généraux AF', BC', DE', HL'. À part SP (stack pointer ou pointeur de pile), PC (program counter ou pointeur d'instruction courante), tous les registres sont accessibles en 8 bits, que ce soit le poids fort (bits 8 à 15) ou le poids faible (bits 0 à 7).
| registre 16 bits | poids fort | poids faible |
| PC | | |
| SP | | |
| IX | XH | XL |
| IY | YH | YL |
| AF | A | F |
| BC | B | C |
| DE | D | E |
| HL | H | L |
| AF' | A' | F' |
| BC' | B' | C' |
| DE' | D' | E' |
| HL' | H' | L' |
| | I | R |
Certains registres ne peuvent être adressé directement, il faut utiliser des instructions de changement de contexte ou spécifiques au registre.

# Généralités

(en chantier) Pour adresser les 8 bits de poids fort ou de poids faible, on utilise directement les lettre A,B,C,D,E,H,L,I ou R Ainsi, BC=B*256+C, DE=D*256+E, etc. Les registres IX et IY n'ont pas de convention de nommage officielle. Les assembleurs utilisent différentes notations (voir toutes) comme XL,LX,IXL,LIX (pour IX low, de poids faible) et XH,HX,IXH,HIX pour le poids fort du registre IX. On peut noter aussi qu'il n'existe pas d'instruction pour lire le registre F. On peut l'écrire de façon détournée avec un POP AF (écrire la valeur dans la pile et récupérer les flags de la pile). Les registres alternatifs ne sont pas accessible directement, il faut passer d'une page de registres à l'autre grâce aux instructions EX AF,AF' pour échanger AF par AF', et EXX pour l'échange des registres BC, DE, HL. Ceci permet d'utiliser deux contextes (cette méthode étant plus rapide qu'une sauvegarde dans la pile) ou virtuellement plus de registres pour un seul programme.
En règles générales on utilise surtout A,BC,DE,HL en programmation car très peu d'opérations sont possibles sur les autres registres.

# Registre AF
## Registre A

Le registre A est l'accumulateur 8 bits. Il sert à toutes les opérations de calcul 8 bits (additions, soustractions) et bénéficie d'instructions spécifiques plus rapide que celles communes aux autres registres voir d'instructions exclusives qui n'existent que pour le registre A.

## Registre F

Le registre F est un registre d'état ou registre flags (drapeaux). Les flags sont les témoins de résultats de certaines instructions.
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| S | Z | y | H | x | V | N | C |
* Bit S : Indique que le résultat d'un calcul a donné un résultat positif ou négatif. Si S est à 1 alors le résultat est négatif. Ce bit est une copie du bit le plus significatif de l'opération 8 bits ou 16 bits qui vient de s'executer.
* Bit Z : Indique que le résultat d'un calcul a donné zéro ou non. Si Z est à 1 alors le résultat est zéro.
* Bit y : Ce bit non documenté est une copie du bit 5 du résultat de l'opération qui vient de s'exécuter.
* Bit H : Indique que le résultat d'un calcul a généré une retenue sur le nibble faible (4 premiers bits d'un octet).
* Bit x : Ce bit non documenté est une copie du bit 3 du résultat de l'opération qui vient de s'exécuter.
* Bit V : Indique que le résultat d'un calcul a débordé et donné un résultat invalide.
* Bit N : Indique que le résultat d'un calcul est une soustraction.
* Bit C : Indique que le résultat d'un calcul a généré une retenue.
Note: Les bits non documentés ne peuvent être lus que de façon indirecte en faisant PUSH AF et en lisant la pile avec un POP ou un LD.
Équivalence des conditions de saut avec les flags:
| condition | état des flags |
| C | C=1 |
| NC | C=0 |
| Z | Z=1 |
| NZ | Z=0 |
| M | S=1 |
| P | S=0 |
| PE | P/V=1 |
| PO | P/V=0 |

# Registre BC

* Les 8 bits de poids fort du registre BC peuvent être adressés directement avec le registre B.
* Les 8 bits de poids faible du registre BC peuvent être adressés directement avec le registre C.
* Le registre BC est utilisé comme compteur 16 bits pour les instructions de répétition. Il est décrémenté à chaque itération et positionne les flags P/V en conséquence.
* Après les instructions LDIR,LDDR,OTIR,OTDR,CPIR,CPDR,INIR,INDR le flag P/V vaut toujours zéro.
* Après les instructions LDI,LDD,OUTI,OUTR,CPI,CPD,INI,IND le flag P/V vaut 1 tant que BC est différent de zéro.
Ainsi, le LDIR est un équivalent plus rapide que

## Registre B

* Le registre B est utilisé comme compteur 8 bits avec l'instruction de bouclage DJNZ (saute si non zéro). Il sera décrémenté à chaque itération sans modifier les flags.

## Registre C

* Le registre C est conçu pour être utilisé comme le registre d'adresse du port d'entrée/sortie (instructions IN,OUT et dérivées). C'est le cas de presque toutes les machines à base de Z80, sauf l'Amstrad CPC tel qu'évoqué dans l'introduction, pour des raisons économiques de design.

# Registre DE

* Le registre DE est utilisé comme adresse (DE)stination par les instructions de répétition (copie exclusivement)

# Registre HL

HL peut-être considéré comme l'accumulateur 16 bits. C'est le registre de référence pour les opérations d'addition 16 bits et de soustraction.
C'est aussi le registre principal d'adressage. Il peut s'utiliser avec presque tous les registres et dispose d'instructions plus rapides pour sa sauvegarde/lecture en mémoire.
Enfin, le registre HL est le registre d'adresse source unique pour les opérations groupées telles que LDIR, LDDR, OTIR, OTDR, CPIR, CPDR et leurs variantes non (R)épétitives.

# Registre IX et IY

* IX et IY sont des registres spécialisés dans l'indexage mais on peut les utiliser comme les autres, à un détail près que leur utilisation est plus coûteuse en temps machine.

# Registre PC

* PC (program counter) est l'adresse de l'instruction en cours d'exécution.

# Registre SP

* SP (stack pointer) est l'adresse du haut de la pile de donnée et d'appels dans la RAM.

# Registre I

* I est un registre qui sert à définir l'adresse de la table des vecteurs d'interruption quand le Z80 est en mode 2. Le fonctionnement des interruptions vectorisées étant assez spécifique au design d'intégration du Z80 et au matériel connecté à celui-ci, ce chapitre ne sera pas évoqué. Quand le Z80 n'est pas en mode 2, on peut très bien utiliser le registre I comme un registre de sauvegarde. Les instructions le concernant sont limités: Copier A dans I et copier I dans A avec l'instruction LD.

# Registre R

* R est le registre de rafraichissement mémoire. Il est incrémenté de 1 ou 2 unités en fonction de l'instruction lue par le processeur.