Assembleur Z80 - Comparaison

 

Bonsoir à tous,

Cela faisait longtemps que je n'avais plus écrit d'article sur le Z80. Le dernier article général autour du RC2014 (Z80) date d'Octobre 2022.
Depuis, la rétro-ingénierie d'une centrale téléphonique à base de Z80 à pas mal occupé mes activités Z80

Petit retour donc sur les bases de la programmation Z80.

Cette fois, nous allons nous concentrer sur la comparaison de valeurs.


CP: Comparaison d'octet

Même en assembleur, il est parfois nécessaire de comparer deux entiers entre 0 et 255 (soit une valeur 8 bit).
 
La documentation officielle manque un peu de clarté alors voici un petit complément.
 
Pour commencer CP arg1 permet de comparer le contenu de accumulateur (registre A) avec arg1 (soit une valeur littérale, soit contenu dans un registre).
 
Ainsi les instructions assembleurs
    LD a, 2  ; init registre a
    CP 5      ; arg1
Peut s'écrire sous la forme de l'expression mathématique:
    arg1 symbole_comparaison a
symbole_comparaison peut être
  • >   (supérieure)
  • <   (inférieure)
  • == (identique)
  • !=  (différent)
Le signe est déterminé à l'aide des flags Carry et Zero... ces mêmes flags qui peuvent autoriser des saut conditionnel avec des instructions jp nz, jp c, ret c, ret z, call nc, call z, ...

CP: attribution des flags

Le résultat de la comparaison est codifiée dans les flags Z (Zero) et C (carry)

Assembleur Modification de Flag
arg1 > a C = 1 (Carry SET)
arg1 <= a C = 0 (Carry Reset)
arg1 == a Z = 1 (Zero SET)
arg1 != a Z = 0 (Zero Reset)



Inspecter le registre F

Il est possible d'exécuter des saut/appel/retour conditionnels sur base de l'un ou l'autre des flags.
 
Par contre, l'accès au registre F n'est pas possible ... par contre il y a une astuce qui consiste a pousser le registre sur la pile puis le récupérer dans un autre registre (L par exemple).

Il est ensuite possible d'utiliser les outils à votre disposition pour inspecter le contenu du registre.
 
push af             ; pousser a & f (les Flags) sur la pile
pop hl              ; récupérer copie de F dans L

ld a, l             ; a contient la copie de F
out (RCIO_OUPUT), a ; envoyer le contenu sur un port.

Ressources

Aucun commentaire