# Programmation Assembleur Z80/Introduction
## Introduction
### L'assembleur

Le langage machine est le langage de plus bas niveau de programmation. Les instructions sont traduites littéralement et assemblées les unes à la suite des autres. Par métonymie, le langage machine a pris pour nom assembleur.
L'utilité du langage machine prend tout son sens sur des processeurs anciens ou en architecture contrainte (peu de mémoire, peu de puissance) car c'est le langage qui offre le plus de performance si on le maîtrise.
La contrepartie de cette simplicité est que le langage assembleur ne dispose comme instructions que ce dont le processeur est capable. Pour écrire un programme assembleur de bout en bout, il faut être capable de décomposer des instructions complexes en instructions simples. Par exemple, le Z80 n'est pas capable de réaliser de division ni de multiplication. Il faudra les décomposer en additions et décalages. Cet état de fait ne doit pas rebuter le débutant car de nombreuses librairies ou exemples existent. La pratique aidant, l'utilisation de librairies tierces deviendra caduque.

### Le processeur Z80
#### Historique

Ce processeur fabriqué par Zilog est commercialisé dès juillet 1976 en version NMOS.
Si la première version est cadencée à 2.5MHz, c'est la version Z80a à 4MHz qui le rendra populaire au milieu des années 80 quand on le retrouvera dans de nombreux ordinateurs personnels tels que l'Amstrad CPC, Spectrum ZX, MSX mais aussi la console de salon Master System et de nombreuses bornes d'arcade dont les fameuses triple-based de SNK. Quelques années plus tard, on le trouve encore dans des systèmes plus puissants (NeoGeo, Megadrive) non plus en tant que processeur principal mais en tant que coprocesseur pour gérer des puces sonores par exemple.
La version NMOS la plus rapide est le Z80h à 8MHz.
Une version CMOS a été développée au début des années 2000 pour une fréquence de fonctionnement de 4 à 20MHz.
On le trouve encore aujourd'hui dans les calculatrices TI-84 et TI-84+.

#### Description

Le Z80 est un microprocesseur 8 bits avec un bus d'adresse 16 bits qui lui permet d'adresser 65536 octets de mémoire (64K) de façon linéaire. Son bus de donnée mémoire est 8 bits, c'est pourquoi lorsqu'il réalise des opérations de lecture ou d'écriture mémoire en 16 bits, l'opération est scindée en deux lectures/écritures.
Son jeu d'instruction est de compatibilité ascendante avec le 8080 d'Intel, auquel il ajoute de nombreuses instructions de manipulation de bit: RES, SET, BIT ainsi qu'une généralisation des instructions de décalage à tous les registres là où le 8080 d'Intel ne pouvait faire des décalages qu'avec le registre A. Sa compatibilité ascendante lui permit de s'imposer comme architecture de référence pour le système d'exploitation CP/M qui fût conçu pour le 8080 au point que certains programmes ne fonctionnaient plus que sur Z80.

#### Les compatibles

Il existe d'autres processeurs plus ou moins compatibles avec le Z80:
* Le Sharp LR35902 utilisé dans la console Game Boy. Certains opcodes sont attribués à d'autres instructions.
* La série des processeurs Rabbit 2000/3000/4000. Ne supporte pas l'instruction DAA ainsi que les instructions d'I/O IN et OUT.