Salut les aminches. J’espère que vous vous portez tous bien et que votre forme intellectuelle est à son zénith, car nous allons commencer à voir les instructions de notre assembleur Comme c’est là que tout devient important, il va vous falloir une concentration plus qu’exceptionnelle. Alors, ouvrez grand vos yeux et venez avec moi dans ce monde fabuleux qu’est l’assembleur.

Grrrr !!! J’enrage. C’est vrai, quoi ! Qu’est-ce qu’elle lui trouve, au chef, ma Miss X préférée, pour aller s’exhiber légèrement vêtue sur les plages avec une brute comme lui ? Je vous le dis , moi , il faut pas avoir toute sa tête ! Mais je suis sur que cela n’est qu’un passage et que la somptueuse Miss X reviendra bientôt pleurer au creux de mes bras puissants et musclés.

Ah ! je vous jure, les femmes, c’est quelque chose. Mais quelle chose ! Bon. passons, et revenons à nos soucis actuels, c’est-à-dire l’assembleur et ses mnémoniques. Quoique, je casserais bien la figure au chef, d’abord ! Cela me soulagerait un peu… M’enfin.

Les mnémoniques sont de petits mots représentant des codes machine reconnus par le Z80. Il en existe quelques-uns qui peuvent parfois, représenter plu sieurs codes, selon la syntaxe utilisée, mais cela a peu d’importance pour nous car c’est l’assembleur qui gère tout cela Comme nous l’avons vu, I assembleur Z80 possède une syntaxe relativement simple, puisqu’il n’utilise que trois colonnes dans un source.

La première est prise par une étiquette, la deuxième par le mnémonique, et la troisième par les registres influencés ou par l’adresse nécessaire. Dans le cas où, dans cette troisième colonne, sont utilisées deux valeurs, il est convenu que la seconde influencera la première. Ainsi, LD A,B transfère B dans A. Cela pour dire que tous les exemples qui seront cités ci-après pourront être interprétés aussi à l’envers. Ainsi, si nous montrons qu’il est possible d’écrire LD A,(IX+10). vous pouvez en déduire que LD (IX+10),A fait aussi partie d’une syntaxe comprise et utilisée. Bien, lançons-nous directement dans le vil du sujet et éludions les instructions de chargement de registre.

WAH LOAD HE !!!
LOAD, mieux connu en assembleur sous sa forme abrégée, LD, permet de faire des chargements de registres ou de mémoire. Il est ainsi possible de modifier le contenu d’un registre de trois manières différentes. La première façon consiste à charger une valeur littérale dans le registre de son choix. La syntaxe est la suivante :

LD                A, 12
LD                HL,#C000

Comme vous le voyez-, c’est simple. Dans te premier cas. la valeur 12 est mise dans le registre A. et dans le deuxième HL est subtilement repli avec 49152 ( C000 en hexadécimal). Cela ne pose pas de problème spécial, si ce n’est qu’il faut faire attention à deux choses.

D’abord, ne pas remplir un registre huit hits avec une valeur de seize bits. C’est logique non ? (Note pour le chef, qui ne comprend jamais rien : essaye de mettre deux litres d’eau dans une bouteille d’un litre et tu verras !) Ensuite, ne pas négliger, dans l’exemple ci-dessus, le clou nie registre HL. contenant 49152 ; H contiendra #C0 et L 0.

Encore une fois, cela est d’une logique implacable. La deuxième manière de charger un registre est de passer par un second registre, Voici donc un exemple.

LD             A,B
LD             HL,SP

Il est facile de charger des registres huit bits les uns avec les autres, mais cela n’est pas aussi simple de faire de même avec les registres seize bits. En effet le Z80, étant « un microprocesseur 8/16 bits, ne possède qu’un faible jeu d’instructions réservées aux registres doubles.

Ainsi, le seul registre capable d’être chargé avec quelques-uns de ses compères est le pointeur de pile SP. qui peut être rempli avec HL , IX , et IY. Dans tous les autres cas , pour passer une valeur contenue dans un registre double vers un autre registre seize bits, il faudra passer par la pile (ex. : PUSH HL et POP DE pour charger DE avec HL) ou passer par les registres simples (LD B,D et LD C,E pour que BC soit égal a DE).

La troisième manière de charger un registre est de lire directement son futur contenu dans la mémoire. On utilise pour cela les parenthèses, qui signifient justement « le contenu de ». Par exemple :

LD                A,( 0)
LD                HL,(#C000)

Le premier exemple transfère dans A le contenu de l’adresse 0 , HL , dans le deuxième exemple, est initialisé avec le contenu de l’adresse #C000. Celte syntaxe exprime l’équivalent de PEEK en Basic.

Mais attention, parce qu’un terrible piège survient dans le cas des registres doubles.

PAGE 1

Imaginons que, dans l’exemple ci-dessus, l’adresse #C000 contienne la valeur #1234. Eh bien l’instruction LD HL.(#C000) placera la valeur #12 non pas dans H mais dans L, H étant alors chargé avec la valeur #34. Tous les registres doubles peuvent être initialisés de cette manière, mais, en ce qui concerne les registres huit bits, seul A peut accéder directement à la mémoire. Il est ainsi impossible d’écrire :

LD             B,(TOTO)

Deux astuces permettent de contourner ce problème, mis à part ta vraie solution : la première est de passer par l’accumulateur ( LD A,(TOTO) puis LD B,A ). mais on perd alors le contenu de A. La seconde méthode consiste à passer par le registre double BC, en faisant LD BC,(TOTO-1). Pourquoi -1 ? A cause du piège dont nous venons de parler.

Si nous faisions LD BC, (TOTO) c’est C qui serait chargé avec le contenu de TOTO et non pas B. Mais cette technique-là n’est pas encore sans faille, car le registre C est aussi influencé Vous avez pu lire plus haut :  la vraie solution, bile consiste à faire pointer le registre double HL sur l’adresse de la donnés, puis de la charger directement par :

LD              B,(HL)

Cela permet de remplir n’importe quel registre huit bits avec une valeur de la même taille. Une fois que vous avez bien compris cette astuce, plus rien ne peut entraver vos esprits vifs et hautement imaginatifs.

Nous n’avons malheureusement pas encore abordé tous les modes d’adressage de ce fabuleux petit microprocesseur. En effet, un des plus lents mais des plus puissants modes d’adressage du Z80 est l’adressage indexé. Il permet simplement d’accéder à une table, ou à plusieurs, tout en gardant la même routine. Voici la syntaxe de cet adressage :

LD           E,(IX+d)

Comme vous pouvez vous en apercevoir, tout registre huit bits peut être utilisé pour récupérer une valeur adressée, grâce à un registre  d’index ( IX ou  IY ,  mais  aucun autre).

C’est sous cette forme qu’il est possible de récupérer, en assembleur, les paramètres envoyés par le Basic.

Comme vous avez pu le voir, une donnée est à additionner au registre d’index pour obtenir l’adresse finale. Le terme additionner n’est pas le plus juste, car la valeur suivant le signe + est en fait un déplacement. Cela signifie que IX+0 fait pointer sur IX ,  IX+1 sur IX+1 , mais IX+255 sur IX-1 ( 255 ou #FF correspond à -1 lorsqu’on l’utilise avec le complément à 2 sous forme de chiffre précédé d’un signe, c’est bien connu).

Ainsi, l’aire adressable par ce principe ira de IX-128 à IX+127. Il faut faire attention à ce genre de chose, car j’en connais plus d’un, moi compris, qui se sont fait avoir par cet infâme piège.

 

POUR FINIR
Dans la même optique, pour rester dans le stockage des données, deux instructions sont souvent employées, n s’agit de PUSH et de POP, qui font appel à la pile. La pile est une zone de mémoire, gérée par l’intermédiaire de SP ( Stack Pointer ), où il est possible de faire transiter des registres pour des opérations nécessitant la libération momentanée d’un registre.

Un empilage ou un dépilage ne peuvent se faire qu’avec un registre seize bits. Ainsi, il est possible d’empiler tous les registres doubles (HL, BC, DE , IX , IV). Pour empiler l’accumulateur, il faut obligatoirement empiler aussi le registre des drapeaux indicateurs (F). L’instruction d’empilement du registre A sera PUSH AF. 11 faut faire très attention à ne pas empiler plus que Ton dépile, ou inversement, vice versa, l’opposé du contraire, sans quoi vous assisterez à de somptueux plantages, le CPC refusant totalement de rendre la main sans débranchement ou arrêt. C’est pour cela et pour bien d’autres raisons qu’il faut toujours sauver son source avant de le lancer.

Il n’est pas nécessaire de trop s’étendre sur la pile et son utilité, puisque notre cher Franck a fait un petit cours à ce sujet dans le courrier des lecteurs (et je vous conseille vivement de le lire avec attention).

PAGE 2

ECHANGES COMPLETS
Non, non et non. ( PAF !!! Aïe). Ca – est, le chef s’est mangé sa baffe. Ah ! ça’ ait du bien, je vous le dis. C’est normal, il n’avait pas à dire « Peau douce » après mon fabuleux intertitre. Je parlais des échanges entre les registres primaires et les registres secondaires  ( prim ). Ils permettent de sauver tous les registres doubles d’un coup, ou bien l’accumulateur et le registre des drapeaux. Vous pouvez ainsi protéger vos registres sans avoir à faire d’empilement. Les mnémoniques sont les suivantes :

EX      AF.AF
EXX
EX      DE,HL

Le premier permet de sauver A et F ; le second, tous les registres doubles ; et le troisième, d’intervertir HL et DE. sans perte des registres.

 

 

BONNES VACANCES
Mon Dieu, mon cœur est au zénith de son bonheur. Vous ne pouvez pas savoir le bien que cela fait de mettre une praline au chef. Eh bien, je vais vous laisser, en vous souhaitant de passer de bonnes vacances.

Nous irons peut-être au bord de la mer. Miss X et moi. Lipfy est en train de faire des séances d ultra-violets, et cela le rend tout rosé. Vous imaginez un peu l’ambiance au journal lorsque 1 on voit passer Miss X. colorée comme dans un rêve, et Lipfy, rosé comme une écrevisse. Cela provoque un grand silence suivi dune hilarité non dissimulée, au grand regret de notre Lipfy national. M’enfin. A plus tard, et surtout, bonnes baignades.

En espérant que Miss X me reviendra…

Sined le Barbare

PAGE 3