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, SPExemple : 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, #5000Malheureusement, 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. - 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. - 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. - 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 - Même principe pour le contenu d'une adresse.
Exemple : LD A,( #65CD); LD ( #ED67),A - 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 - 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. - Mais jamais dans une adresse directement !
Exemple : LD (#7000), #34 est formellement interdit. - 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. - 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,ALe 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 RETLES 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 &BD3AEt amusez-vous bien les enfants ! Patrick Dublanchet ,Hebdogiciel n°131 p34 ★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser... |
CPCrulez[Content Management System] v8.7-desktop/c Page créée en 320 millisecondes et consultée 2360 foisL'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. |
|
|