CODING ★ LA CARRYNETTA BELLE TCHI TCHI ★

Assembleur ACPC n°40 - Le CARRY

Vous avez passé de bonnes vacances? Les minettes et les virils poilus étaient à votre goût? Vous voulez sans doute des nouvelles des vacances de Sined ou Poum. Ils ont bossé comme des fous et n'ont vu comme soleil que le témoin du moniteur de leurs machines.

Là, Poum, tu exagères. Je dois dire que les vacancières étrangères et estivales étaient assez affriolantes dans leurs dessous inexistants. De plus, Paris, la plus belle ville du monde, est aussi belle sous le soleil que sous la pluie. Quelques chaleurs ne gâchent rien à son charme et ont le mérite d'en ajouter aux femmes. Tu aurais mieux fait de sortir plutôt que de rester cloîtré.

Tes yeux et ton âme en auraient été émerveillés. Si nous passions à la suite, histoire de ne pas laisser languir le lecteur de ces pages. Salut à toi, ô vénéré lecteur qui nous fait manger et sans qui notre loyer serait impayé (NDPoum : Sined vient de se dégoter une chambre à Paris, quel miracle !). Ne sait-tu pas ce que nous avons concocté pour toi ce petit mois? Un simple passage en revue du mnémonique AdC que nous avons entraperçu le mois dernier. Egalement un tableau que notre Poum vous a préparé avec amour. A l'attaque !

ADDITION COHERENTE

ADC est, comme nous l'avons vu le mois précédent, une addition permettant d'obtenir la somme de deux opérandes et d'ajouter à cette dernière ce contenu de Carry. Ce bit est supposé être le résultat du débordement de capacité engendré par la dernière opération (lisez le paragraphe que Poum lui a consacré plus loin). Vous pouvez donc additionner n'importe quoi à n'importe quoi à condition de suivre tout de même le chemin suivant. La première opérande de l'opération doit obligatoirement être un accumula teur simple ou double soit les registres A ou HL.

Les opérandes peuvent être: en huit bits, Z, A, B, C, D, E, H, L, (HL), (IX+Z), (IY+Z) où Z est une valeur huit bits; en seize bits, HL, BC, DE, SP.

Voici quelques exemples:

ADC A,12
ADC HL,DE
ADC B,C

Pas de problème apparent en ce qui concerne les opérations réalisées avec ce mnémonique. Vérifiez tout de même la bonne marche de vos programmes car une retenue mal placée et des résultats peuvent devenir aberrants : 1+1=3 ??? Utilisez donc à bon escient ADD et ADC.

La manière la plus simple de vider la Carry est d'utiliser le mnémonique suivant : OR A. Ainsi la retenue passe à zéro sans modifier aucun registre. Les autres opérations intervenant directement sur la Carry sont SCF (Set Carry Flag soit Carry=C=1) et CCF (Complement Carry Flag soit CarrY=y=Abs(Carry-1) donc inversion de Carry dépendant de son état initial).

« ? » peut-être un registre 8 ou 16 bits, une valeur ou une adresse, bref, n'importe quoi.
« RESTANT » tout ce qui n'est pas précisé.
« . » le flag peut être modifié.
« X » le flag reste inchangé.
« 0 » le flag est mis à zero.
« 1 » le flag est mis à l
« S » indicateur de signe.
« Z » indicateur d'opération nulle.
« V » indicateur de dépassement pour une opération arithmétiques) .
« P » indicateur de parité pour une opération logiques).
« C » indicateur de débordement (CARRYY).
(16 B) registre 16 bits (HL, DE, BC, SP, IX et IY

+----------------------+----------------------+
| INSTRUCTION S Z P C | INSTRUCTION S Z P C |
| ; V | ; V |
+----------------------+----------------------+
| ADC ?,? . . . . | LDD X X . X |
| ADD A, ? . . . . | LDDR ;X X 0 X |
| ADD RESTANT x X X . | LDI X X . X |
| AND ? . . . 0 | LDIR ;X X 0 X |
| BIT ?,? . . . X | NEG X X X X |
| CALL ;X X X X | NOP X X X X |
| CCF X X X . | OR ? ;. . . 0 |
| CP ? . . . . | OTDR ;. . . X |
| CPD . . . X | OTIR ;. . . X |
| CPDR ;. . . x | OUT ?,? X X X X |
| CPI . . . X | OUTD ;. . . X |
| CPIR ;. . . x | OUTI ;. . . X |
| CPL x x X x | POP ? X X X X |
| DAA . . . X | PUSH ? X X X X |
| DEC (16B) X X X X | RES ?,? X X X X |
| DEC RESTANT . . . X | RET X X X X |
| DI ;X X X X | RL ? ;. . . . |
| DJNZ ;X X X X | RLA X X X . |
| EI ;X X X X | RLC ? . . . . |
| EX ?,? X X X X | RLCA ;X X X . |
| EXX X X X X | RLD . . . X |
| HALT ;X X X X | RR ? ;. . . . |
| IM ? ;X X X X | RRA X X X . |
| IN ?,? . . . X | RRC ? . . . . |
| INC (16 B) X X X X | RRCA ;X X X . |
| INC RESTANT . . . X | RRD . . . X |
| IND . . . X | RST ? X X X X |
| INDR ;. . . X | SBC ?,? . . . . |
| INI . . . X | SCF X X X 1 |
| INIR ;. . . X | SET ?,? X X X X |
| JP ? ;X X X X | SLA ? . . . . |
| JR ? ;X X X X | SRA ? . . . . |
| LD A, I . . . X | SRL ? . . . . |
| LD A, R . . . X | SUB ? . . . . |
| LD RESTANT X X X X | XOR ? . . . 0 |
+----------------------+----------------------+

SOUSTRACTION IDEM

Comme l'addition avec retenue, il existe la soustraction. Les modes d'utilisation de cette opération sont les mêmes que ceux de l'addition. Si vous désirez effectuer une soustraction seize bits à partir de registres huit bits, utilisez des séquences du type:

LD A,(HL)
SUB A,1
LD (HL),A
INC HL
LD A,(HL)
SBC A,0
LD (HL),A
JR C,ERREUR

Cette routine décrémente un mot de seize bits contenu à l'adresse pointée par HL. Il est sûrement possible d'écrire du code plus compact et plus efficace mais celui-ci évite toute sauvegarde de registres. En espérant que vous trouverez d'autres applications comme celles du genre trente-deux bits:

LD HL,(COMPT)
LD DE,(COMPT+2)
LD BC,(MODIF)
ADD HL,BC
LD (COMPT),HL
EX DE,HL
LD BC,0
ADD HL,BC
LD (COMPT+2),HL

Voilà qui clôt les additions et soustractions diverses.

Revenons tout de même deux secondes sur cette fameuse Carry qui est en fait un carry, mais au féminin ça sonne mieux.

NDPOUM A CARRY

Si le contenu d'un registre quelconque dépasse d'un côté comme de l'autre la capacité de celui-ci (il n'y a pas de barrière de sécurité), le résultat sera modulo la taille maximale stockable par ce registre plus 1 ! Soyons plus clair. Prenons l'accu. Sa valeur maximale stockable est 255. Si on lui ajoute 1, il devrait théoriquement passer à 256. Or les choses étant impossibles, il fera un modulo 256 et passera à O. En gros, pour lui, la valeur suivant 255 est O. De même 250 plus 20 donnera 14. Cela marche également dans l'autre sens. 0 moins 1 sera égal à 255 ou 10 moins 20 sera égal à 246.

Lorsqu'un registre réagit d'une des deux façons sus citées, nous parlerons de débordement. Il existe un moyen de tester dans certains cas ce débordement: la consultation de la Carry.

ATTENTION: tous les débordements ne sont pas pris en compte par la Carry. Il existe quelques instructions qui mettent la Carry à 1 lors d'un débordement et d'autres pas.

Comment s'y retrouver? Pas facile. Il nous arrive à tous (même Sined) de nous poser la question: telle instruction met la Carry ou pas? Pour cela, reportez-vous au tableau ci-joint. Il vous donnera toutes les instructions de notre cher zao et vous pourrez ainsi tout savoir sur leurs réactions durant le déroulement d'un programme.

Prenons une instruction comme CALL connue de tous car utilisée même sous Basic.

CALL C,
ADRESSE

Cela veut dire appelle la routine ADRESSE si la carry est mise. Donc s'il y a eu un débordement avant cette instruction. Prenons un autre exemple. B=250. On lui additionne la valeur A qui est prise elle-même dans une case mémoire.

LD B,250
LD A,(MÉMOIRE) ADC A,B
CALL C,ADRESSE

Si la valeur pokée dans MÉMOIRE est supérieure à 5 le CALL sera lancé, sinon le programme continuera comme si de rien n'était. OK ? Ne vous en faites pas, nous reviendrons sur ce type d'appel, mais il fallait tout de même vous en toucher deux mots. Voici donc un tableau récapitulatif des différentes influences des mnémoniques sur les drapeaux (flags). Tout cela, les flags et les mnémoniques vous seront détaillées dans les numéros des mois suivants.

CARRY FAUT EN FINIR

Car il faut en finir. En espérant que tout cela ne vous sera pas trop incompréhensible. Nous vous souhaitons de bonnes heures de programmation.

Poum et Sined , ACPC n°40

Page précédente : Bidouilles ACPC n°39 - Gestion directe du FDC 765

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Assembleur ACPC n°24
» Coding » Bidouilles ACPC n°39 - Gestion directe du FDC 765
» Coding » Assembleur ACPC n°14 - AS: ÇA C'EST COOL
» Coding » Assembleur ACPC n°29 - On assemble ensemble
» Coding » ASM 48: Quand Elmar fait des siennes
» Coding » Bidouilles ACPC n°48 - Les vecteurs system (6/6)
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

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