# Programmation Assembleur Z80/Expert
## Programmation niveau expert en Z80
### Utilisation avancée de pile
#### Auto-actualisation de la pile

Admettons qu'un programme ait besoin de lire une tables cyclique de longueur arbitraire. Le programme ci-dessous peut-être appelé n'importe quand, interruptions désactivées, il enregistre où il en est et se réinitialise tout seul.
Ce type classique de gestion n'est déjà pas rapide, mais il présente le deuxième inconvénient de ne pas être en temps constant. Ainsi, lorsqu'on arrive en fin de table et que A vaut zéro, on doit recharger les valeurs d'initialisation de SP et de A puis les écrire à nouveau.
Si nous écrivons dans la table l'adresse de la prochaine valeur à lire, nous pouvons réaliser un automate qui rebouclera naturellement en fin de liste.
Un système équivalent est utilisé dans la gestion des sons SID d'Arkos Tracker II car il fait gagner beaucoup de temps machine.

#### Utiliser plusieurs piles

Il est possible d'utiliser autant de piles que l'on veut avec le Z80, pour peu que le programme qui la modifie conserve l'ancienne valeur. Ainsi, un sous-programme pourra très bien utiliser la pile pour stocker plus rapidement des tableaux de données et les restituer de la même façon. N'oubliez pas qu'il faut toujours désactiver les interruptions quand on s'en sert de façon détournée. L'exemple ci-dessous part du principe que le calcul d'adresse et celui de couleur sont trop complexes pour être réalisés dans une seule boucle. Plutôt que de sauvegarder/restituer les registres, il apparait plus simple d'utiliser une table temporaire.
Ce genre de routine prend tout son sens dans le cas d'un page-flipping (ou tic-toc). Au premier appel on écrit dans le tableau1 pendant qu'on affiche tableau2. À l'appel suivant on fait l'inverse: On écrit dans tableau2 pendant que l'on lit tableau1. Cette technique est très utilisée dans le jeu vidéo ou les démonstrations techniques.

### Auto-modification de code

Le Z80 étant un processeur dépourvu de mécanisme de protection mémoire, il est possible de modifier à la volée le code qu'on exécute sans craindre les effets de bord. La plupart des langages évolués disposent d'une zone mémoire pour les données et d'une zone mémoire pour le code mais en assembleur, il est possible d'intégrer les données au code.
Structure classique d'un programme qui copie la mémoire en plusieurs fois:
Non seulement les instructions de lecture d'un registre 16 bits en mémoire sont lentes, mais elles occupent autant de place qu'une lecture de valeur immédiate 16 bits. Il faut aussi réserver de la place dans une zone de données (4 octets de plus dans ce cas). On peut ré-écrire le code en faisant une lecture immédiate des registres et pour la sauvegarde, on ira modifier les instructions de lecture immédiate.
Bien entendu, pour réaliser ce genre de modification, il est impératif de connaitre l'opcode d'une instruction. Pour tous les registres généraux, cet opcode est presque toujours d'un octet suivi de la valeur immédiate. Pour les registres d'index IX et IY, cette valeur est de 2. Dans le doute, on peut utiliser l'adresse de fin d'instruction moins la taille de la valeur immédiate comme ci-dessous. De cette façon, on peut modifier le registre comme on veut, toutes les références à la valeur immédiate resteront correctes.