CODINGCLASSEURS WEKA ★ Comment exploiter toutes les ressources et augmenter les performances de votre AMSTRAD CPC ★

4/2.3.4 - Les mots-clés de l'assembleur Z80 et leur utilisation : Ruptures de séquencesCoding Classeurs Weka
4/2 - Assembleur Z80 : Définitions et rappels de base

4/2.3 - Les mots-clés de l'assembleur Z80 et leur utilisation

IV. Ruptures de séquences

Ce groupe comprend toutes les instructions de débranchements (conditionnels ou non) à une autre instruction que celle qui suit l'instruction courante, ou à un sous-programme.
Reportez-vous à la partie 4 chapitre 2.2 pour prendre connaissance des modes d'adressage utilisés par le Z80, car ce qui suit fait largement appel à ces notions.

Remarque :

Les indicateurs ne sont pas modifiés par l'utilisation des ordres de débranchement.
Les modes d'adressage sont : absolu, indirect et relatif.

  • Adressage absolu :
Dans la suite, ADR représente une adresse absolue exprimée sur 16 bits.

JP ADR

absolute JumP : Débranchement inconditionnel à l'adresse indiquée.

JP C,ADR

absolute JumP if Carry : saut absolu si C = 1.

Si l'indicateur Carry (dernier résultat supérieur à 255 ou comparaison entre 2 nombres dont le 1er est strictement inférieur au second) est positionné, le débranchement se produit.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E0A LD A, 10
4 9002 FE0B CP 11 ;C positionne
5 9004 DA0790 JP C,ADR ;Saut effectue
6 ;Traitement Carry off
7 ADR: EQU $
8 ;Traitement Carry on
9 END

JP Z,ADR

absolute JumP if Zéro : saut absolu si Z = 1.

Si l'indicateur Zéro est positionné (le dernier calcul a donné un résultat nul ou une comparaison a été faite entre deux nombres identiques), le débranchement se produit.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E0A LD A, 10
4 9002 D60A SUB 10 ;Z positionne
5 9004 CA0790 JP Z,ADR ;Saut effectue
6 ;Traitement Zéro off
7 ADR: EQU $
8 ;Traitement Zéro on
9 END

JP M,ADR

absolute JumP if Minus : saut si résultat négatif.

Si le dernier calcul a donné un résultat négatif, le débranchement est effectué.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E05 LD A,5
4 9002 FE0C CP 12 ;12>5
5 9004 FA0790 JP M,ADR ;Saut effectue
6 ;Traitement si minus faux
7 ADR: EQU $
8 ;Traitement si minus vrai
9 END

JP PE,ADR

absolute JumP if parity Even : saut absolu si le bit P des indicateurs est égal à 1.

Si sur une opération logique le nombre de bits à 1 du résultat est pair, le débranchement est effectué.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E11 LD A,11H
4 9002 B7 OR A ;P= 1:2 bits a 1 dans 11H
5 9003 EA0690 JP PE,ADR ;Saut effectue
6 Traitement parité impaire
7 ADR: EQU $
8 ;Traitement parité paire
9 END

JP NC,ADR

absolute JumP if Not Carry : saut absolu si C = 0.

Si l'indicateur Carry n'est pas positionné (dernier résultat inférieur à 255 ou comparaison entre deux nombres dont le premier est supérieur ou égal au second) le débranchement se produit.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E12 LD A,12H
4 9002 FE05 CP 5 ;C non positionne
5 9004 D20790 JP NIC,ADR ;Saut effectue
6 ;Traitement Carry off
7 ADR: EQU $
8 ;Traitement Carry on
9 END

JP NZ,ADR

absolute JumP if Not Zéro : saut absolu si Z-0.

Si l'indicateur Zéro n'est pas positionné (le dernier calcul a donné un résultat non nul ou une comparaison a été faite entre deux nombres différents), le débranchement est effectué.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E0C LD A, 12
4 9002 FE14 CP 20 ;Z non positionne
5 9004 C20790 JP NZ,ADR ;Saut effectue
6 ;Traitement si Zéro
7 ADR: EQU $
8 ;Traitement si non Zéro
9 END

JP P,ADR

absolute JumP if Plus : saut absolu si résultat positif.

Si le dernier calcul a donné un résultat strictement positif, le débranchement est effectué.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E7B LD A, 123
4 9002 C604 ADD A,4 ;Resultat positif
5 9004 F20790 JP P,ADR ;Saut effectue
6 ;Traitement résultat négatif
7 ADR: EQU $
8 ;Traitement résultat positif
9 END

JP PO,ADR

absolute JumP if Parity Odd : saut absolu si le bit P des indicateurs est égal à 0.

Si sur une opération logique, le nombre de bits à 1 du résultat est impair, le débranchement se produit.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E13 LD A,13H
4 9002 A7 AND A ;P = 0:3 bits a 1
5 9003 E20690 JP PO,ADR ;Saut effectue
6 ;Traitement parité paire
7 ADR: EQU $
8 ;Traitement parité impaire
9 END

  • Adressage indirect absolu :

JP (HL)
JP (IX)
JP (IY)

Les indicateurs ne sont pas modifiés.
  • Adressage relatif :
Dans la suite, DEPL représente un déplacement relatif signé sur 7 bits. Le bit 8 (bit de poids le plus fort) représente le signe. S'il est égal à un, le déplacement se fait vers le haut. S'il est égal à 0, le déplacement se fait vers le bas.

JR DEPL

Jump Relative : débranchement inconditionnel au déplacement indiqué.

JR C, DEPL

Jump Relative if Carry : saut relatif si le bit C des indicateurs est égal à 1.

Si l'indicateur Carry est positionné (dernier résultat supérieur à 255 ou comparaison entre 2 nombres dont le 1er est strictement inférieur au second), le débranchement se produit.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E12 LD A,12H
4 9002 0616 LD B,16H
5 9004 B8 CP B ;C positionne
6 9005 3800 JR C,ADR ;Saut effectue
7 Traitement si C = 0
8 ADR: EQU $
9 ;Traitement siC = 1
10 END

JR Z,DEPL

Jump Relative if Zéro : saut relatif si le bit Z des indicateurs est égal à 1.

Si l'indicateur zéro est positionné (le dernier calcul a donné un résultat nul ou une comparaison a été faite entre deux nombres identiques), le débranchement se produit.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E7A LD A, 122
4 9002 D67A SUB 122 ;Z positionne
5 9004 2800 JR Z,ADR ;Saut effectue
6 ;Traitement si non zéro
7 ADR: EQU $
8 ;Traitement si zéro
9 END

JR NC,DEPL

Jump Relative if Not Carry : saut relatif si le bit C des indicateurs est égal à 0.

Si l'indicateur Carry n'est pas positionné (dernier résultat inférieur à 255 ou comparaison entre deux nombres dont le premier est supérieur ou égal au second), le débranchement se produit.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E12 LD A,12H
4 9002 0E04 LD C,4
5 9004 B9 CP C ;C non positionne
6 9005 3000 JR NC,ADR ;Saut effectue
7 ;Traitement siC = 1
8 ADR: EQU $
9 ;Traitement si C = 0
10 END

JR NZ, DEPL

Jump Relative if Not Zéro : saut relatif si le bit Z des indicateurs vaut 0.

Si l'indicateur Zéro n'est pas positionné (le dernier calcul a donné un résultat non nul ou une comparaison a été faite entre deux nombres différents), le débranchement se produit.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E7A LD A, 122
4 9002 FE01 CP 1 ;Z non positionne
5 9004 C20790 JP NZ,ADR ;Saut effectue
6 ;Traitement si Zéro
7 ADR: EQU $
8 ;Traitement si non Zéro
9 END

DJNZ DEPL

Decrement B and Jump if Not Zéro : Décrémente le registre B de 1 et saute à l'adresse relative indiquée si B< >0.

Cette instruction est très pratique pour effectuer des calculs ou des tests répétitifs, comme le montre l'exemple suivant.

Utilisation Supposons que nous voulions chercher l'occurence de l'octet 54H sur

un espace mémoire commençant en 7000H et sur une longueur de 40 octets.

Pour réaliser ce test, il sera commode d'utiliser l'ordre DJNZ de la façon suivante :

1 ORG 9000H
2 LOAD 9000H
3 9000 210070 LD HL,7000H ;@ départ
4 9003 0628 LD B,40 ;Lgr test
5 BOUCLE: EQU $
6 9005 7E LD A,(HL) ;octet teste
7 9006 23 INC HL ;memoire suivante
8 9007 FE54 CP 54H ;54 hexa ?
9 9009 CA0E90 JP Z,TROUVE ;oui
10 900C 10F7 DJNZ BOUCLE ;non
11 TROUVE: EQU $
12 ;A ce niveau, si Z = 0, HL = @ octet+1
13 ;si Z = 0, l'octet n'est pas trouve
14 END

  • Appel à un sous-programme : Débranchement du programme en forçant la valeur du PC (Program Coun-ter) à la valeur indiquée dans l'argument. L'adresse de retour du sous-programme est mise dans la pile, et le retour sera effectué sur la rencontre d'une instruction RET ou équivalent.
L'adressage est absolu.

CALL ADR

Débranchement inconditionnel au sous-programme indiqué.

CALL C,ADR

CALL if Carry : Appel au S/P si le bit C des indicateurs est égal à 1.

Si l'indicateur Carry est positionné (dernier résultat supérieur à 255 ou comparaison entre 2 nombres dont le 1er est strictement inférieur au second), le débranchement se produit.

1 ORG 9000H
2 LOAD 9000H
3 9000 210080 LD HL,8000H
4 9003 110080 LD DE,8000H
5 9006 ED5A ADC HL,DE ;C positionne
6 9008 DC0B90 CALL C,ADR ;Appel effectue
7 ;Traitement carry off
8 ADR: EQU $
9 ;Traitement carry on
10 900BC9 RET
11 END

CALL Z,ADR

CALL if Zéro : Appel au S/P si le bit Z des indicateurs est égal à 1.

Si l'indicateur Zéro est positionné (le dernier calcul a donné un résultat nul ou une comparaison a été faite entre deux nombres identiques), le débranchement se produit.

1 ORG 9000H
2 LOAD 9000H
3 9000 3EC4 LD A,0C4H
4 9002 063C LD B,3CH
5 9004 80 ADD A,B ;Z positionne
6 9005 CC0890 CALL Z,ADR ;Appel effectue
7 ;Traitement Z = 0
8 ADR: EQU $
9 ;Traitement Z=1
10 9008 C9 RET
11 END

CALL M,ADR

CALL if Minus : Appel au S/P si résultat négatif.

Si le dernier calcul a donné un résultat négatif, le débranchement est effectué.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E0C LD A, 12
4 9002 FE7F CP 127 ; 127 > 12
5 9004 FC0790 CALL M,ADR ;Appel effectue
6 ;Traitement si minus faux
7 ADR: EQU $
8 ;Traitement si minus vrai
9 9007 C9 RET
10 END

CALL PE,ADR

CALL if Parity Even : Appel au S/P si le bit P des indicateurs est égal à 1.

Si sur une opération logique le nombre de bits à 1 du résultat est pair, le débranchement est effectué.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E12 LD A,12H
4 9002 0605 LD B,5
5 9004 BO OR B ;4 b a 1-+P=1
6 9005 EC0890 CALL PE,ADR ;Appel effectue
7 ;Traitement parité impaire
8 ADR: EQU $
9 ;Traitement parité paire
10 9008 C9 RET
11 END

CALL NC, ADR

CALL if Not Carry : Appel au S/P si le bit C des indicateurs est égal à 0.

Si l'indicateur Carry n'est pas positionné (dernier résultat inférieur à 255 ou comparaison entre deux nombres dont le premier est supérieur ou égal au second), le débranchement se produit.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E76 LD A,76H
4 9002 0E0E LD C,0EH
5 9004 81 ADD A,C ;C non positionne
6 9005 D40890 CALL NC,ADR ;Appel effectue
7 ;Traitement Carry on
8 ADR: EQU $
9 ;Traitement Carry off
10 9008 C9 RET
11 END

CALL NZ,ADR

CALL if Not Zéro : Appel au S/P si le bit Z des indicateurs est égal à 0.

Si l'indicateur Zéro n'est pas positionné (le dernier calcul a donné un résultat non nul ou une comparaison a été faite entre deux nombres différents), le débranchement est effectué.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E0C LD A, 12
4 9002 1E04 LD E,4
5 9004 83 ADD A,E ;Z non positionne
6 9005 C40890 CALL NZ,ADR ;Appel effectue
7 ;Traitement Z=1
8 ADR: EQU $
9 ;Traitement Z = 0
10 9008 C9 RET
11 END

CALL P,ADR

CALL if Plus : Appel au S/P si le résultat est positif.

Si le dernier calcul a donné un résultat strictement positif, le débranchement est effectué.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E0C LD A, 12
4 9002 0E04 LD C,4
5 9004 91 SUB C ;resultat > 0
6 9005 F40890 CALL P,ADR ;Appel effectue
7 ;Traitement si résultat < =0
8 ADR: EQU $
9 ;Traitement si résultat > 0
10 9008 C9 RET
11 END

CALL PO,ADR

CALL if Parity Odd : Appel au S/P si le bit P des indicateurs est égal à 0.

Si sur une opération logique, le nombre de bits à 1 du résultat est impair, le débranchement se produit.

1 ORG 9000H
2 LOAD 9000H
3 9000 3E02 LD A,2
4 9002 17 RLA ;1 b a 1 -> P = 0
5 9003 E40690 CALL PO,ADR ;Appel effectue
6 ;Traitement parité paire
7 ADR: EQU $
8 ;Traitement parité impaire
9 9006 C9 RET
10 END

  • Retour de sous-programme :
L'utilisation d'une instruction de retour de sous-programme — ou d'interruptions — provoque un débranchement à l'instruction qui a suivi l'appel. C'est-à-dire à l'adresse de l'ordre ayant provoqué l'appel +3. En effet, l'ordre utilisé pour appeler un sous-programme est un CALL qui est codé sur 3 octets :

1er octet2e octet3e octet
Code OpLSBMSB

Cette adresse est retrouvée en dépilant le PC (Program Counter) de la pile. L'adressage est indirect au travers de la pile.

RET

RETurn from subroutine : Retour inconditionnel.

RETI

RETurn from Interrupt : Retour d'interruption.

RETN

RETurn from Non masquable Interrupt : Retour d'interruption non masquable.

RET C

RETurn if Carry : Retour d'interruption si le bit C des indicateurs est à 1.

Si l'indicateur Carry est positionné (dernier résultat supérieur à 255 ou comparaison entre 2 nombres dont le 1er est strictement inférieur au second), le retour est effectué.

1 ORG 9000H
2 LOAD 9000H
3 SOUP: EQU $
4 ;Corps du sous-programme
5 9000 FE30 CP 30H
6 9002 D8 RET C ;Retour si A < 30
7 9003 18FB JR SOUP ;Poursuite sinon
8 END

RET Z

RETurn if Zéro : Retour si le bit Z des indicateurs est à 1.

Si l'indicateur Zéro est positionné (le dernier calcul a donné un résultat nul ou une comparaison a été faite entre deux nombres identiques), le retour est effectué.

1 ORG 9000H
2 LOAD 9000H
3 SOUP: EQU $
4 ;Corps du sous-programme
5 9000 OD DEC C ;C = C-1
6 9001 C8 RET Z ;retour si C = 0
7 9002 C30090 JP SOUP ;Poursuite sinon
8 END

RET M

RETurn if Minus : Retour si résultat négatif.

Si le résultat du dernier calcul a donné un nombre négatif, le retour est effectué.

1 ORG 9000H
2 LOAD 9000H
3 SOUP: EQU $
4 ;Corps du sous-programme
5 9000 35 DEC (HL) ;Mem(HL) - 1
6 9001 C8 RET M ;retour si résultat < 0
7 9002 18FC JR SOUP ;Poursuite sinon
8 END

RET PE

RETurn if Parity Even : Retour si le bit P des indicateurs est à 1.

Si sur une opération logique le nombre de bits à 1 du résultat est pair, le retour est effectué.

1 ORG 9000H
2 LOAD 9000H
3 SOUP: EQU $
4 ;Corps du sous-programme
5 9000 CB27 SLA A
6 9002 E8 RET PE ;si nbre de b a 1 pair
7 9003 18FB JR SOUP ;Poursuite traitement
8 END

RET NC

RETurn if Not Carry : Retour si le bit C des indicateurs est à 0.

Si l'indicateur Carry n'est pas positionné (dernier résultat inférieur à 255 ou comparaison entre deux nombres dont le premier est supérieur ou égal au second), le retour est effectué.

1 ORG 9000H
2 LOAD 9000H
3 SOUP: EQU $
4 ;Corps du sous-programme
5 9000 34 INC (HL)
6 9001 D0 RET NC ;Retour si (HL) 255
7 9002 18FC JR SOUP ;Poursuite sinon
8 END

RET NZ

RETurn if Not Zéro : Retour si le bit Z des indicateurs est à 0.

Si l'indicateur Zéro n'est pas positionné (le dernier calcul a donné un résultat non nul ou une comparaison a été faite entre deux nombres différents), le retour est effectué.

1 ORG 9000H
2 LOAD 9000H
3 SOUP: EQU $
4 ;Corps du sous-programme
5 9000 35 DEC (HL)
6 9001 C0 RET NZ ;Retour si (HL) < > 0
7 9002 18FC JR SOUP ;Poursuite sinon
8 END

RET P

RETurn if Plus : Retour si résultat positif.

Si le dernier calcul a donné un résultat strictement positif, le débranchement est effectué.

1 ORG 9000H
2 LOAD 9000H
3 SOUP: EQU $
4 ;Corps du sous-programme
5 9000 FE40 CP 40H
6 9002 F0 RET P ;retour si A > = 40H
7 9003 18FB JR SOUP ;poursuite sinon
8 END

RET PO

RETurn if Parity Odd : Retour si le bit P des indicateurs est à 0.

Si sur une opération logique, le nombre de bits à 1 du résultat est impair, le débranchement se produit.

1 ORG 9000H
2 LOAD 9000H
3 SOUP: EQU $
4 ;Corps du sous-programme
5 9000 B7 OR A
6 9001 E0 RET PO ;si nb de b a 1 impair
7 9002 18FC JR SOUP ;poursuite sinon
8 END

Utilisation des retours conditionnels :

Réalisation d'un sous-programme d'attente paramétrable. Le nombre de millisecondes d'attente est passé au sous-programme dans le registre C.

1 ORG 9000H
2 LOAD 9000H
3 9000 1606 LD D,6
4 9002 CD0690 CALL SOUP ;6 ms d'attente
5 9005 C9 RET
6 SOUP: EQU $ ;S/P d'attente
7 9006 0E03 LD C,3 ; 3 boucles
8 B1 : EQU $
9 9008 0600 LD B,0
10 B2: EQU $
11 900A 00 NOP
12 900B 10FD DJNZ B2
13 900D 0D DEC C
14 900E 20F8 JR NZ,B1
15 9010 15 DEC D
16 9011 20F3 JR NZ,SOUP
17 9013 C9 RET
18 END

Page précédente : 4/2.3.3 - Les mots-clés de l'assembleur Z80 et leur utilisation : Lecture, écriture, échanges et opérations sur les registres
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.732-desktop/c
Page créée en 188 millisecondes et consultée 1854 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.