Comme disait Lanico Starcrav, ce n’est pas l’homme qui doit être l’esclave de l’assembleur, mais l’inverse de l’opposé du contraire. Moulinex, ébahi par les mots du sage programmeur, répondait sans attendre : ouais, même que ouais ! Septh ne bronchait pas, et moi, je buvais ces paroles comme les mots d’un guide de référence. Poursuivons donc nos investigations au cœur du Z80.

 

Avant de passer aux choses sérieuses, nous allons faire un bref récapitulatif des instructions déjà abordées. Elles sont relativement peu nombreuses puisque au nombre de cinq : LD, INC, DEC, EX, et EXX. Nous allons maintenant voir des instructions très utiles mais dont il est possible de se passer. Ces mnémoniques ont le seul avantage d’être simples et faciles d’emploi.

LES CALLS INFINIS
Qu’est-ce qu’un Call ? Bon nombre de livres disent simplement de cette instruction qu’elle est l’équivalent de la fonction Basic Gosub. C’est en effet le même genre d’instruction. Lorsque le microprocesseur rencontre un Call, il dépose sur la pile l’adresse suivant ce Call. puis met dans le PC (Program counter) l’adresse de la routine à exécuter. Le fait d’avoir sauvegardé l’endroit d’où a été appelé la routine permet, lors d’un RET, de revenir poursuivre le cycle d’instructions suivantes, cela sans perturbations.

La syntaxe de ces instructions est simple, et en voici un exemple d’utilisation dans un programme.

…               ; Début du programme.

CALL   IBRI  ; Appel de la routine.
Al   …
CALL  IBRI   ; Second appel.
A2    …
RET               ; Retour au Basic.
IBRI    …       ; Routine quelconque.
…                   ; Quel style de programmation !
RET               ; Fin et retour à l’appelant.

Dans l’exemple ci-dessus, il est facile de voir que la sous-routine est appelée deux fois. La première fois, l’adresse Al est sauvée sur la pile et la routine IBRI est exécutée. Lors du retour, le programme reprend à l’adresse A1 préalablement sauvée. Lors du deuxième appel, tout se passe de la même manière, mais avec l’adresse A2. Ce genre de programmation est à utiliser lorsque des parties de programme se répètent souvent dans le listing.

Au lieu de répéter les mêmes sequences d’instructions, il est simple de les remplacer par un Call Adresse-de-la-routine. et de loger cette routine en fin de programme, par exemple.

L’avantage est le gain de place certain. Les inconvénients sont nombreux ; lisibilité moindre, lenteur d’exécution accrue, code engendré non relogeable. Tout cela fait qu’il ne faut pas abuser de ces bonnes choses et n’utiliser ces instructions que si elles sont vraiment utiles.

Pour en finir avec les sous-programmes, un Call peut être conditionnel. Cela signifie qu’il est possible de fixer une condition décidant de la validité du Call. CALL Z,Adresse ne se branchera à la sous-routine Adresse que si la dernière opération a forcé le drapeau Z à 1.

Dans le cas contraire, l’instruction sera simplement ignorée. Les instructions de Call conditionnelles sont au nombre de huit :

CALL Z,AD
CALL NZ.AD
CALL C,AD
CALL NC,AD
CALL PO,AD
CALL PE,AD
CALL P,AD
CALL M,AD

Où AD est l’adresse de la sous-routine. Pour les quatre premiers exemples, pas de problème. La condition porte sur les drapeaux Z et C, selon qu’ils sont positionnés ou non. PO et PE portent sur le drapeau de parité, qui est aussi celui de débordement du bit 6 sur le bit 7 (le drapeau V utilisé lors des travaux sur les nombres signés). Il faut simplement savoir que si le mode signé est utilisé, PO vaut V et PE représente NV. Pour les deux derniers exemples cités, P forcera l’exécution du saut si le dernier calcul a provoqué un résultat positif ; M fera de même dans le cas contraire.

L’instruction RET peut aussi être conditionnée. Comme par hasard (content Rosco ?). le jeu d’instructions conditionnelles est le même que pour les Calls. Il n’est donc pas nécessaire de revenir sur les drapeaux capables de décider de l’exécution de l’instruction.

POP TOUT PUSH
Les deux instructions POP et PUSH vont de pair avec les deux instructions CALL et RET. En effet, un RET n’est ni plus ni moins qu’un POP PC. Ces deux nouvelles instructions, PUSH et POP, servent respectivement à sauvegarder provisoirement et à récupérer sur la pile des valeurs importantes. Si vous avez par exemple besoin de l’accumulateur pour faire un calcul, mais qu’il contient un paramètre important pour la suite du programme, il vous suffit de Pusher le double registre AF, de faire le calcul, et de Poper le même registre AF.

Cette méthode peut aussi permettre de transférer le contenu d’un registre double dans un autre. Ainsi PUSH BC suivi de POP DE charge DE avec le contenu de BC.

PAGE 1

Mais ces instructions nécessitent une attention toute particulière. En effet, vous avez pu vous apercevoir qu’un retour au Basic se fait par l’intermédiaire de l’instruction RET, qui n’est autre qu’un POP PC. Imaginez donc que vous n’ayez pas retiré de la pile toutes les valeurs que vous y avez mises.

Lorsque le Z80 tombera sur le RET, il dépilera PC et se branchera, non pas à l’adresse de retour au Basic, mais à l’adresse contenue par le dernier registre empilé. Il faut donc faire très attention à bien restituer la pile lors de la fin de la routine machine, et faire de même dans chaque sous-programme appelé. Les registres empilables sont : AF, BC , DE , HL , IX et IY. Voilà, vous savez tout sur ces petites instructions à connaître.

SAUTS PAS SI SOTS
Ça c’est sûr. que les sauts sont pas sots si les sauts sont sensés. Dur à dire mais direct. Bon ! Cessons ces songes pour saisir le sens de ceci. Qu’est-ce qu’une instruction   de   branchement   ?   C’est   une mnémonique qui permet de stopper l’exécution linéaire d’un programme pour la faire se poursuivre à un endroit donné. Il est ainsi possible de sauter des instructions ou  des  données.  Cela  équivaut approximativement à un GOTO du Basic.  

En   Basic,   un   GOTO   ne   peut s’effectuer que vers un numéro de ligne donné et non modifiable. En machine, il est     parfois     possible     de     choisir parfaitement l’adresse de saut. Il existe aussi des instructions de branchement relatives à la position courante du PC. Elles sont appelées instructions de sauts relatifs, et permettent un déplacement de 129 octets vers l’avant, et de  126 vers l’arrière. Il est possible, avec ces instructions,    de    créer   de    petites    boucles totalement relogeables, puisque relatives à l’adresse d’exécution. Les instructions de saut sont donc à séparer en deux classes différentes  ;  les  instructions à adresse de saut fixe, de mnémonique JP. et    les    instructions    relogeables,    de mnémonique  JR.  Ces  deux  types  de branchement peuvent être conditionnels.

Voici la liste de toutes ces instructions :

JR DEP
JR Z,DEP
JR NZ,DEP
JR C,DEP
JR NC,DEP
JP AD
JP Cond,AD
JP (HL)
JP (DC)
JP (IY)

Pour les sauts relatifs, il suffit de donner une étiquette à l’assembleur pour qu’il calcule automatiquement la valeur du déplacement. Ainsi, un listing pourrait s’écrire de la manière suivante :


TOTO …

JR   TOTO

Les conditions données sont simples et ne portent que sur les drapeaux C et Z. Pour l’instruction JP, dans la ligne JP Cond,AD, les conditions sont les mêmes que pour les instructions Call conditionnelles. Comme vous pouvez le remarquer, il existe aussi trois instructions de branchement aux adresses pointées par des registres.

La forme de programmation qui permet d’utiliser ce genre d’instruction est assez complexe et demande une bonne connaissance du langage machine. Nous reparlerons plus tard de ces puissantes mnémoniques de sauts, lorsque l’assembleur sera plus pour vous qu’un fond de poche (c’est bien connu). Pour finir cette initiation dédiée aux sauts, nous parlerons de l’instruction la plus intéressante : DJNZ.

Ce charabia infâme cache une puissante fonction que tous les programmeurs de Z80 connaissent et utilisent couramment. Le travail exécuté par DJNZ est le suivant :

décrémenter le registre B et sauter à l’adresse relative donnée si B est différent de zéro. Comme vous pouvez le voir, cela est très intéressant pour toutes les boucles nécessitant un nombre de passes connu. Sa forme d’utilisation est la suivante :

  LD    B,Nombre
LOOP    …

  DJNZ   LOOP

La boucle entre LOOP et DJNZ sera exécutée « Nombre » fois. Le déplacement est relatif, ce qui implique qu’il n’est pas possible de faire de grandes routines avec cette instruction.

SUITE LE MOIS PROCHAIN
C’est encore et toujours la même chose. Chaque fois que l’on parle de choses intéressantes, la place manque. Je peux vous assurer que, dans le cas contraire, il y a toujours trop de place. Eh bien, je vous laisse et vous souhaite de passer de belles nuits blanches.

 

Sined le Barbare

Page 2