CODINGHEBDOGICIEL ★ FORMATION A L'ASSEMBLEUR PRATIQUE LANGAGE MACHINE SUR ZX81 ★

La page pédagogique d'hebdogiciel 131: Les Instruction de TransfertCoding Hebdogiciel

A L'ATTAQUE DU JEU D'INSTRUCTIONS

Les choses véritablement sérieuses vont commencer avec ce cours, sérieuses ne voulant pas dire difficiles. C'est le moment de détailler le jeu d'instructions du Z80, et il ne comprend pas moins de 694 pièces. Cet ensemble peut se diviser en groupes d'instructions et, quand on en a assimilé une, les autres du même groupe ne posent aucun problème de compréhension. Après avoir divisé le jeu d'instructions du Z80 en dix familles, attaquons aujourd'hui la première d'entre elles.

INSTRUCTIONS DE TRANSFERT

Ce sont les plus nombreuses et les plus faciles à comprendre. Elles servent à transférer une ou plusieurs données d'un endroit à un autre. Leur mnémonique, que vous placez dans le champ opérations (ceux qui, le mois dernier, n'ont pas dormi au fond de la classe près du radiateur s'en souviennent !), est presque toujours LD diminutif de LOAD qui signifie charger dans la langue de Maggy. Dans le champ opérandes on met 2 trucs séparés par une virgule. Le premier truc indique la destination et le deuxième la source. Mais qu'est-ce que c'est que ces trucs ? Voici la réponse.

1. Registre (simple ou double)

A, B, C, D, E, H, L, HL, DE, BC, IX, IY, SP

Exemple : LD A,L

2. Le contenu d'une adresse pointée par un double registre

(HL), (DE), (BC), (IX + IND), (IY + IND)

Exemple : LD B,(HL)

3. Le contenu d'une adresse

(#8000), LABEL Exemple : LD HL,(#8000)

4. Une valeur huit ou seize bits

#4F, #4C0F Exemple : LD DE, #5000

Malheureusement, toutes les combinaisons ne sont pas possibles. Si LD A,(DE) est correct, en revanche LD B,(DE) ne l'est pas. Il est donc nécessaire (voire indispensable) de posséder une liste complète des instructions Z80, que l'on trouve dans tous les livres écrits autour de ce microprocesseur, et de connaître quelques principes de base.

1. Toutes les combinaisons de registre simple à registre simple sont possibles. Ce qui nous donne déjà 49 instructions.

Exemple : LD A,B; LD B,D; LD H,E; LD L,D; etc.

2. Seul le contenu d'une adresse pointée par les doubles registres HL, IX et IY peut être transféré dans n'importe quel registre simple et inversement.

Exemple : LD D,(HL); LD C,(HL); LD (HL),E; LD (HL),A; etc. Les registres d'index IX et IY seront examinés plus loin.

3. Le contenu d'une adresse pointée par les doubles registres DE et
BC ne peut être transféré que dans l'accumulateur et réciproquement. Exemple : LD A,(DE); LD (BC),A

4. Même principe pour le contenu d'une adresse.

Exemple : LD A,( #65CD); LD ( #ED67),A

5. Une donnée huit bits peut être transférée dans n'importe quel registre simple.

Exemple : LD A,#34; LD E, #56; LD C,#EF

6. Ou par l'intermédiaire d'un double registre, mais uniquement HL, IX ou IY.

Exemple : LD (HL), D 23 est permis, LD (DE), ff FF est interdit.

7. Mais jamais dans une adresse directement !

Exemple : LD (#7000), #34 est formellement interdit.

8. Une donnée seize bits ne peut être chargée que dans un double registre.

Exemple : LD HL, #34EF; LD DE, #E34A; LD BC, #1E38; etc.

9. Le contenu de deux adresses peut être transféré dans un double registre et inversement (ce qui correspond à une donnée seize bits). Exemple : LD DE,(#30E0)

Cette dernière instruction correspond à la séquence :

LD A,(#30E0)
LD E,A
LD A,(#30E1)
LD D,A
Le contenu de #30E0 va dans E et celui de #30E1 dans D.

Sachez encore que toute parenthèse signifie contenu d'une adresse. Elle peut être directe ( #
8000) ou pointée par un double registre (HL). Et souvenez-vous définitivement que le second opérande va dans le premier. Quand vous aurez assimilé ces quelques principes de base concernant les instructions de transfert et de chargement, vous connaîtrez déjà la majorité des instructions Z80. Pour terminer avec cette famille, il nous faut encore aborder les transferts de blocs, les échanges de registres et les registres d'index. Commençons par ces derniers.

LES REGISTRES D'INDEX IX ET IY

On peut faire avec eux tout ce que l'on peut faire avec la paire de registres HL. Il faut y ajouter un avantage et deux inconvénients, mais chacun a son rôle. Et le rôle de ces deux registres-là est de permettre l'adressage indexé. Nous avons vu que l'on pouvait transférer dans n'importe quel registre simple le contenu d'une adresse pointée par le double registre HL, avec les doubles registres IX et IY, nous pouvons y ajouter un index ou, si vous préférez, un nombre à ajouter ou à déduire de l'adresse. Mais exemptons !

EX:

LD HL,#8000
LD A,(HL)
LD HL,#8010
LD E , (HL)
LD HL,#7FF0
LD D,(HL) équivaut à
LD IX,#8000
LD A,(IX+#00)
LD E,( IX+#10)
LD D,( IX-#10) N'est-ce pas suffisamment clair ? Le microprocesseur ajoute à la donnée seize bits, contenue dans le double registre IX ou IY, l'index huit bits précisé dans l'instruction. Il prend en compte ce résultat et non plus la valeur simple du double registre. Les inconvénients sont le temps d'exécution et la place mémoire. En effet l'instruction LD A,(HL) ne prend que 7 cycles d'horloge alors que LD A,(IX + ind) prend 19 cycles.
Parenthèse : avec les Amstrad, le temps réel s'obtient en divisant le nombre de cycles par 4, soit 1,75 microseconde pour 7 cycles.

Vous serez toujours fasciné par les temps d'exécution. Pour vous donner un ordre d'idées, sachez que le microprocesseur peut exécuter un million de LD A,B à la seconde ! La place mémoire varie de 1 à 3 : un octet pour LD A,(HL) et trois octets pour LD A,(IX + ind). Pour conclure, nous dirons que les registres d'index sont très utiles dans des cas spécifiques.

10 ORG #6000
20 LD HL,#8000
30 LD DE, #C000
40 LD BC,#3FFF
50 LDIR
60 RET LES TRANSFERTS DE BLOC (LDD, LDI, LDDR, LDIR)

Ces quatre instructions sont de petites merveilles ! Elles permettent de déplacer, en une seule fois, un bloc allant jusqu'à 64 Ko ! Le D, placé après un LD, signifie décrémenter et le I, incrémenter. Le R signifie répéter jusqu'à ce que le double registre BC soit à zéro. .
LDD prend le contenu de

l'adresse pointée par HL, le transfère dans l'adresse pointée par DE, décrémente HL et DE, décrémente BC

LDI prend le contenu de l'adresse pointée par HL, le transfère dans l'adresse pointée par DE, incrémente HL et DE, décrémente BC

LDDR prend le contenu de l'adresse pointée par HL, le transfère dans l'adresse pointée par DE, décrémente HL et DE, décrémente BC et recommence jusqu'à BC=0

LDIR prend le contenu de l'adresse pointée par HL, le transfère dans l'adresse pointée par DE, incrémente HL et DE, décrémente BC et recommence jusqu'à BC = 0

Chargez votre assembleur préféré et essayez ceci.

;On commence en 8000
;Adresse source
;Adresse destination (écran) ;Longueur du bloc
;Transfert
;Et c'est fini! RÉCRÉATION

Pour les quatre cent soixante-quatrards seulement :

CALL &BD3A Et amusez-vous bien les enfants !

Patrick Dublanchet ,Hebdogiciel n°131 p34,

★ LICENCE: COMMERCIALE
★ ANNÉES: 1985
★ AUTEUR: Patrick Dublanchet

Page précédente : La page pédagogique d'hebdogiciel 130

CPCrulez[Content Management System] v8.75-desktop
Page créée en 491 millisecondes et consultée 531 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.