Revenir au plan du site


Tenir compte de la contrainte de bus quand on déplace des données


Dans l'article précédent, nous avons abordé l'usage de l'instruction LDIR du Z80. Cette instruction est performante car elle réalise en fait 6 instructions à la fois.

- Lire la donnée
- Écrire la donnée
- incrémenter le pointeur lecture
- incrémenter le pointeur d'écriture
- décrémenter le compteur
- recommencer si le compteur ne vaut pas zéro

C'est très rapide en regard du service rendu. Ce genre d'instruction se retrouve sur les processeurs Intel (rep movsb) où c'est le moyen le plus performant de façon générale.

Comment ça de façon générale? Il y a mieux? Plus rapide?

Si vous voulez une routine de copie mémoire un peu plus rapide, cela existe, vous la trouverez dans la [page d'optimisation en vrac]

L'important est surtout d'adapter son code à la copie que l'on veut réaliser. Je vous ai montré comment copier un écran, le LDIR est très bon.

Par contre, si vous devez copier une donnée dont vous connaissez le contenu à un endroit précis, vous aurez tout intérêt à stocker cette donnée dans le code lui même. Ainsi, le Z80 va lire votre instruction qui contient la donnée et l'écrire ensuite avec une deuxième instruction. Par exemple, si vous devez écrire une valeur à une adresse, il est plus simple d'écrire :
ld a,valeur : ld (adresse),a ; 6 nops

Pas besoin de copier la valeur de quelque part ou d'initialiser un compteur, deux pointeurs.

Ça fonctionne aussi en 16 bits et c'est presque aussi rapide!
ld hl,valeur : ld (adresse),hl ; 8 nops

Si vous avez des petits objets à copier, pour initialiser une structure, c'est déjà plus rapide qu'un LDIR en utilisant l'écriture 16 bits avec HL.

Pour écrire vos valeurs n'importe où en mémoire, c'est toujours plus rapide que passer par LDIR et le code reste lisible
; HL=destination
ld de,valeur : ld (hl),e : inc hl : ld (hl),d ; 9 nops

C'est ce qu'on appelle du code avec données immédiates. Le code contient les données.