CODING ★ Les flags, grands délires ★

Assembleur ACPC n°41 - Les flags, grands délires

Or donc, le soir du 14 juillet 1956, vous déclarez ne pas avoir mis à zéro l'accumulateur qui devait, sous cette condition, brancher la routine des scores! Messieurs les jurés, voici la preuve de sa culpabilité. J'appelle à la barre, les « flags ».

Suite à notre initiation assembleur du dernier numéro, voici enfin toutes les informations nécessaires sur les « flags 1) dits également, drapeaux.

Tout registre a bits et son compagnon de route. « B » aime « C », « D » flirte avec « E » quant à « H » il adore se chamailller avec « L ». Ainsi, lors des douces nuits légèrement rafraîchies,  ces registres s'accouplent pour nous donner des doubles registres encore plus forts, 16 bits.

Le seul à qui on ne connaissait pas de copine était l'accu. Voici enfin l'heure de vérité. Même si durant plusieurs numéros nous avons fait volontairement le silence sur ce dernier, nous sommes en mesure aujourd'hui de vous annoncer que l'accu peut être accompagné d'un autre registre 8 bits, le registre des « flags ».

Le registre « F » est bien différent des autres. Il n'existe quasiment aucune instruction le concernant directement. , Par exemple, vous pouvez attribuer à tout registre une valeur (LD A,12 LD HL,456) mais il est hors de question de faire ce type d'opération avec « F». .

L'utilité de ce registre est beaucoup plus subtile que celle de ses compagnons. En effet, le registre de statuts réagit en fonction des opérations effectuées sur les autres registres. C'est pas clair? Imaginez une addition avec l'accu du type ADD A,200. Si le résultat est supérieur à 255 la valeur sera tronquée. Par contre, un flag sera positionné pour que l'utilisateur puisse rectifier son tir si le besoin s'en fait sentir. Détaillons ce registre avant de poursuivre nos investigations.

Il existe six bits (appelés également indicateurs). Les bits 3 et 5 ne sont pas utilisés. Les indicateurs 2 et 4 ne seront pas détaillés dans cette initiation car ils servent pour les opérations qui portent sur des quartets codés en DCB (vous n'avez pas tout compris? c'est pas grave, moi non plus). Ce mode est le décimal codé binaire qui permet de stocker la valeur maximale de 99 sur un octet, au lieu de 255. Chaque quartet ne peut contenir de valeur supérieure à 9. Nous en reparlerons plus tard.

Il nous reste donc à ce jour, quatre indicateurs dits flags. Le bit 0 du registre F dit CARRY (indicateur C), le 6 dit ZERO (indicateur Z), le bit 1 est l'indicateur de parité utilisé aussi en tant que débordement de signe ( indicateur P/V ) et le 7 dit SIGNE (indicateur S).

TESTER LES FLAGS

Vous pouvez effectuer directement des tests sur les bits du registre F. Pour cela il faut empiler le double registre AF sur la pile et dépiler un autre double registre comme HL et tester les bits du registre L qui occupent la même position que F. Cette opération est fort fastidieuse et les programmeurs du zao ont prévu d'autres raccourcis.

Pour tester le flag C (la CARRY), il suffit de faire appel à des mnémoniques comme RH C, RET NC, JR C ou JP NC. Comme vous le constatez rapidement, toutes les opérations de branchement peuvent travailler avec les flags. Cela permet de brancher la routine à un point donné en fonction des opérations précédentes. Ex : Si une soustraction est égale à zéro, branche la routine « Tartempion » sinon poursuis ton chemin.

Voici une application très simple de ce principe:

LD A,(SCOREJ
DEC A
LD (SCORE),A
JP Z,MORT

Résumons-nous. Les mnémoniques CALL, JP et RET peuvent être activés en fonction des flags. Voici la syntaxe de ces appels pour les CALL, elle est de même pour les deux autres.

CALL Z  si Z=1
CALL NZ si Z=0
CALL C  si C=1
CALL NC si C=0
CALL PO si P/V=0
CALL PE si P /V=1
CALL P  si S=0
CALL M  si S=1

En ce qui concerne JR, elle ne connaît pas tous les modes de tests des flags. Elle ne peut gérer que la CARRY et le bit représentant zéro. Cela nous donne donc des mnémoniques du type:

JR Z  si Z = 1
JR NZ si Z = 0
JR C  si C = 1
JR NC si C = 0

Pour JR, un bit de signe ou un bit de dépassement parité ne signifie pas grand-chose. Cela est triste car il n'est pas possible de tester une valeur négative. Triste sort pour les programmeurs avides de codes optimisés et relogeables.

Gardez dans un coin le tableau que nous vous avons dressé avec amour. Il vous donnera l'état de tous les flags en fonction de tous les mnémoniques de votre assembleur. Vous saurez ainsi qu'une addition de type ADD peut affecter le flag C et que lors d'additions de registres a bits les flags S, Z et PN peuvent également être affectés. De même, les CALL ne toucheront en aucun cas aux flags, etc. Ce tableau doit vous servir de bible car même Sined qui a plus d'une dizaine d'années d'expérience derrière lui, ne connaît pas ses classiques par coeur, c'est vous dire. (NDSined : Comme il est si joliment dit dans Ainsi parlait Zarathoustra, rien ne sert d'apprendre par coeur ce qui est écrit dans les livres, le tout est de ne pas égarer ses ouvrages.)

LES FLAGS (ADA ?)
Ce n'est pas tout de pouvoir utiliser les flags, encore faut-il savoir comment ils réagissent. Ce ne sont pas toutes les instructions qui influencent ses drapeaux. Seules quelques privilégiées modifient les indicateurs et dans certaines conditions seulement. Voici quelques exemples:

LD A,-12
JP M,TOTO

Quoi que vous pensiez de cette instruction, le branchement à TaTa ne se fera pas ce coup-ci. En effet, la commande LD n'influence aucunement les indicateurs. Il faudrait, pour que le branchement se produise, intercaler la commande XOR A ; ce qui nous donne:

LD A,-12
XOR A
JP M,TOTO

Si vous procédez ainsi, TOTO sera exécuté, sans le moindre problème. Voici une table de déchaînement des indicateurs par les mnémoniques.

Drapeau S :
ADC, ADD A,X, EX AF,AF', SUB, SBC, AND, OR, XOR, LD A,I, LD A,R, DEC, INC, lN, CP et tous les mnémoniques de décalages et rotations.

Drapeau Z :
ADC, ADD A,X, EX AF,AF', SUB, SBC, AND, OR, XOR, LD A,I, LD A,R, DEC, INC, lN, CP, BIT et tous les mnémoniques de décalages et rotations.

Drapeau P/V:
ADC, ADD A,X, EX AF,AF', SUB, SBC, AND, OR, XOR, DEC, INC et tous les mnémoniques de décalages et rotations.

Drapeau C :
ADC, ADD A,X, EX AF,AF', SUB,SBC, AND, OR, XOR, SCF, CCF et tous les

mnémoniques de décalages et rotations. .

A vous de bien utiliser les instructions relativement aux drapeaux et réciproquement l'inverse de l'opposé du contraire. Sachez tout de même que les plantages les plus difficilement détectables sont dus à des aberrations provoquées par des têtes en l'air du type « je ne fais pas attention aux flags » .

Il vous faut suivre à la lettre les modifications de ces drapeaux pour ne pas laisser passer la moindre pétouille.

A NE PAS FAIRE...

Je vais vous citer les erreurs à ne pas faire. Je me rappelle d'un plantage que j'avais magnifiquement mis 2 heures à trouver, perdu dans quelques centaines de lignes d'assembleur à peine traçable (il paraît que je ne programme pas propre, chacun son style...).
Ce petit plantage de mes deuses était simplement dû à l'utilisation des instructions :

DEC A
JR C,CARRY

Comme vous pouvez vous en douter, ce petit drapeau n'est jamais passé à un, ce qui me permit de ne jamais voir ma routine CARRY utilisée par le processeur.

Son usage étant tout de même relativement utile, mon programme se voyait dépourvu d'un organe vital et se voyait entraîné dans une course folle. Comme rien n'est programmé pour rien (il faudrait être un peu pas bien) ma réalisation se trouvait inexorablement rejetée à la poubelle.

FLAGORNER SANS FAIRE MOUSSER

A vous de bien utiliser ces nouvelles possibilités. Il va sans dire que tous vos travaux seront sans aucun doute compromis par quelques fausses manipulations. Ne craignez rien, même le meilleur de tous s'est sûrement laissé prendre par ces innommables flags...

Sined & Poum, ACPC n°41 p42-43

Page précédente : Bidouilles ACPC n°40 - Gestion d'erreurs des routines disques

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 843 millisecondes et consultée 1290 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.