CODING ★ Initiation : Les inc/dec/cp ★

Assembleur ACPC n 07 - Initiation : Les INC / DEC / CP
AS: TIQUON

Alors les petits, vous avez passé de bonnes vacances, cet été, au soleil ? Pour nous, c'était le pied. Mis à part le fait que Lipfy n'a pas bronzé, que le pauvre Pierre est en train de contaminer la rédaction avec une maladie hautement contagieuse, et que Robby s'est fait voler sa voiture. A part cela, tout se passe le mieux du monde. Allez, retrouvons donc notre bon vieux Z80 après l'avoir délaissé pendant nos batifolages estivaux.

Comme je vous le disais, mis à part de petits ennuis dus aux retours de vacances, la joie et l'allégresse règnent dans nos locaux. A la vue de la superbe crinière (et du reste ) de notre Miss X nationale, bon nombre de rédacteurs sont tombés mollement sur le sol moquette mais non moins dur de nos bureaux. Lipfy. dont tous les lecteurs se demandent à quoi il ressemble exactement, vient de faire l'acquisition d'une conduite : ne plus se taper la tête contre les murs à la vue de Miss X. Pour moi. tout va, sauf que je suis obligé de partager mon petit bureau avec un être étrange (de cake) : Brice. C'est dur d'être ainsi, minute après minute, confronté avec des génies ( sans bouillir ). Peut-être que si cela continue dans la voie actuelle, je changerai de pseudonyme en devenant Disciplus Simples, pour faire allusion à la fameuse BD Léonard génie.

Zap , lecteur assidu de notre revue, ne cesse de nous appeler au téléphone pour nous parler de choses et d'autres. Surtout d'autres à vrai dire. Mais je jure devant Miss X que tout cela ne m'empêchera pas de vous faire encore un petit cours assembleur maison. Comme dans le dernier numéro nous avions vu les instructions de chargement nous nous sommes dit qu'il serait bienvenu de faire un petit programme illustrant toutes ces connaissances. C'est pour cela que nous allons encore aborder quelques petites mnémoniques, avant de nous lancer dans la programmation en assembleur.

C'EST QUOI INC ET DEC
DIS DONC DOC?

Eh bien, voilà enfin une bonne question. Ce ne sont que quelques petites instructions permettant d'additionner ou de soustraire la valeur un à l'opérande désirée et précisée. Ainsi. INC B sera exécuté de la manière suivante : B=B+1. Mais, comme rien ne vient sans rien et que l'assembleur n'est fait que de petits ennuis, un dépassement de capacité de l'opérande entraîne une remise à zéro de celle-ci- Si par exemple C vaut 255. la valeur de C après un INC C sera 0. De la même manière, si D vaut 0 et que l'instruction DEC D est rencontrée, D vaudra 255. Certains pourront penser que cela fausse les calculs. Eh bien pas du tout, car la retenue est positionnée en cas de dépassement de capacité. Donc, si un débordement intervient, que ce soit lors d'un INC ou d'un DEC. la retenue sera là pour témoigner de l'infâme affront qu'aura provoqué le pauvre Z80. DEC sert donc à soustraire un et INC à additionner un à la valeur représentée par l'opérande. Cette opérande peut être tout registre de huit ou seize bits, et des octets en mémoire adressés par le registre HL ou les registres d'index. Mais voici quelques exemples.

INC (HL)
DEC (IX+0)
INC HL
DEC B

COMPARONS EN CŒUR

Pas de chance, mais nous ne pourrons toujours pas écrire notre petit programme si nous n'avons pas abordé cette instruction plus qu'indispensable. CP permet de faire des comparaisons, mais uniquement avec l'accumulateur (le registre A). Vous pouvez comparer n'importe quoi, mais seulement avec le bon vieux maître des lieux. Le mode d'adressage est le même qu'à l'habitude, c'est-à-dire qu'il est possible de comparer A avec tous les registres huit bits, et également avec de la mémoire adressée par HL et les registres d'index. Une comparaison est comme son nom l'indique, un moyen d'obtenir des informations sur les différences existant entre les deux valeurs prises en compte. Que peut-il se passer ? Soit une valeur est plus grande que l'autre, soit c'est l'inverse, soit encore les valeurs sont égales. Ceci paraît simple, à première vue, mais les choses peuvent se corser si vous travaillez en mode signé. Nous avions vu qu'il est possible d'utiliser le Z80 de deux manières différentes. La première est de voir les valeurs des registres comme de simples entiers de 0 à 255. la seconde est de dire que le bit 7 contient le signe de la valeur codée sur les sept autres bits (de zéro à six). Pour le premier mode d'utilisation, aucun problème. Il faut simplement savoir que l'opération CP effectue une soustraction entre l'accumulateur et l'opérande, soit, en clair, A-op. Mais cette opération n'affecte aucun registre et ne fait que déposer les résultats dans le registre d'état F : donc, ni A ni l'opérande utilisée ne sont modifiés. Cette instruction force de toute manière le drapeau N, ce qui signifie que la dernière opération réalisée était bien une soustraction. Si le drapeau Z d'égalité passe à un. cela signifie que les deux valeurs testées sont les mêmes. Si l'indicateur de retenue C est positionné ( à 1 ), cela veut dire qu'un débordement a été enregistré et que la valeur soustraite de A est plus grande que le contenu de A. Dans le cas contraire, si C reste à l'état passif, le contenu de l'accumulateur est alors supérieur ou égal à l'opérande comparée. Dans le cas où le mode signé est utilisé, les choses peuvent se compliquer relativement. En fait, je ne conseillerai jamais assez de faire des essais simples avec des valeurs immédiates et connues. Mais passons à l'explication avant tout. Si les deux valeurs sont supérieures à 0 et inférieures à 127, tout se passe comme dans le cas précédent. Mais vous comprenez bien que. si vous considérez le bit 7 comme le bit de signe, cela pose des problèmes car un nombre dont ce bit est à 1 est inférieur a un nombre dont ce bit est à 0. Ce qui montre bien la différence de traitement entre ce mode de travail et le précédent Eh bien, ne vous inquiétez pas , c'est beaucoup plus simple qu'il n'y paraît suffit de tester le bit S , qui donne le signe du résultai, en mode signé. Quand le drapeau S passe à un, cela signifie que l'accumulateur est inférieur à l'opérande comparée. Quand S est à zéro. l'accumulateur est supérieur à l'opérande rencontrée, quel que soit le signe des deux octets. Il suffît de se rappeler que dans tous les cas. en mode signé. S ne signifie pas supérieur. Pour les branchements, il n'y a malheureusement pas de sauts conditionnels relatifs influences par S, et les seules instructions utilisables sont alors JP M (S=1) et JP P (S=0), qui ne font pas partie du jeu relogeable. Tant pis. il faut faire avec. Maintenant que nous savons cela, nous pouvons faire notre petite routine bête mais pas si méchante que cela.

REMPLISSAGE BIDON

Nous allons faire un petit programme de remplissage de l'écran qui pourra tout aussi bien servir de CLS. ceci avec ou sans barreau. Cette routine sert simplement à illustrer les quelques instructions que nous avons passées en revue ce mois-ci. Voici d'abord un petit idéogramme du programme pour que tout soit clair. D'abord, il faut savoir que la mémoire écran s'étend de l'adresse &C000 à &FFFF. Pour que ce que nous venons de dire soit juste, il faut que nous utilisions dans notre routine les instructions INC et CP. au moins. Voici la petite explication du listing suivant.

D'abord on charge l'adresse de l'écran dans HL, et on met A à zéro. Pourquoi diront certains ? C'est simple. Nous savons que l'écran finit en #FFFF : il suffit donc d'arrêter de remplir avant le dernier octet lui sera zéro pour que la routine s'arrête, et : surveiller te débordement sur zéro. Cela car l'incrémentation d'un double registre n'influence aucun drapeau indicateur et qu'il faut tout de même que le programme soit stoppé. Nous mettons ensuite dans .le registre B la valeur de remplissage, et la registre B la valeur de remplissage, ei la boucle peut alors commencer. Dans cette boucle, le contenu de B est rangé à l'adresse pointée par HL qui est ensuite incrémenté pour passer à la case suivante. L'instruction de comparaison sert à tester si H vaut A donc zéro, pour témoigner du débordement. Si non. la boucle reprend son cours, si oui. le programme s'arrête en revenant au Basic.

ORG #9000

LD HL,#C000
XOR A
LD B, A
BOUC LD (HL),E
INC HL
CP H
JR NZ.BOUC
RET

SEE YOU NEXT MONTH

Nous vous souhaitons donc de bien travailler sur votre CPC. pendant o,ue nous vous concoctons quelques petites routines d'enfer. De plus, si vous êtes un tantinet curieux, vous pouvez aller faire un tour sur Amcharge, où nous aurons plaisir à vous voir.

Sibar le nénède , A100% n°7 p48-49

Page précédente : Assembleur ACPC n 06 - Initiation : Les transferts

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

Lien(s):
» Coding » Assembleur ACPC n°40 - Le CARRY
» Coding » Bidouilles ACPC n 03 - Les Instructions supplemetaires du Z80
» Coding » Assembleur ACPC n°10: ADES un assembleur d'enfer
» Coding » Bidouilles ACPC n°41 - L'art de la compression
» Coding » ASM 48: Quand Elmar fait des siennes
» Coding » Bidouilles ACPC n°46 - Les vecteurs system (4/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
Page créée en 796 millisecondes et consultée 2296 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.