CODING ★ AS SIESTE DE SERPENT ★

Assembleur ACPC n°24

Quel régal ! Nous avons vu ensemble qu'il n'était pas vraiment sorcier d'utiliser les vecteurs systèmes pour venir à bout de quelques tâches assez fastidieuses, comme l'affichage d'un caractère ou le positionnement du curseur sur l'écran (l'équivalent Basic de PRINT et LOCATE).

Dans notre élan, nous allons continuer de faire mumuse avec les vecteurs et, pour ne pas paraître trop rébarbatif, on va écrire un petit jeu en en utilisant quelques-uns vecteurs. Logiquement, à la Fin de cette programmation, on les aura tellement vus et revus qu'ils vous apparaîtront comme des amis de longue date.

UN SERPENT SUR LES ECRANS

Je ne sais pas comment on appelle ce jeu archi-classique. Il s'agit d'un serpent que l'on dirige dans un tableau, qui grandit de plus en plus, et qui inévitablement se mordra tôt ou tard. Le but du jeu étant bien sûr de retarder cette morsure le plus possible. Un jeu tout bête, mais ma mission n'est pas de vous pondre des jeux hyper géniaux, seulement de vous familiariser avec l'assembleur. Alors sans complexe, OK ?

Pour commencer, on met le mode écran à 1 (sous Basic on écrirait 10 MODE 1). En assembleur, le vecteur BCOE se charge à merveille de cette tâche, à condition toutefois de placer dans l'accumulateur le numéro du mode choisi (0 à 2). Pour la bonne cause je choisis le mode 1. Il faut ensuite donner des couleurs aux encres, car celles choisies par les constructeurs de la bécane ne me vont, mais alors pas du tout Je désire avoir, sur un fond noir, du blanc, de l'orange et du vert.

Voilà-t-y pas que les choses se compliquent, il existe un vecteur qui attribue aux PEN les couleurs désirées. C'est le BC32. Il suffit de mettre dans l'accu le numéro de l'encre, dans le registre B la première couleur, et dans le registre C la deuxième couleur. Si les valeurs de B et C sont différentes, on aura une couleur clignotante, l'équivalent Basic INK A,B,C. C'est ensuite que l'on appelle le père BC32 et le tour sera joué.

Pour donner un exemple, si je charge l'accu avec la valeur 2 (LD A2) et le registre B avec 26 qui correspond au blanc de la palette (LD B,26), qu'ensuite je charge dans C la même valeur que B (LD C.26 ou LD C,B) et que j'appelle le vecteur par CALL &BC32, je verrais bien que la couleur du PEN 2 est mise à blanc. Mais voilà, je dois faire cette même opération quatre fois de suite, je trouve qu'il n'est pas beau d'écrire quatre fois la même chose, alors que je sais utiliser les boucles (vous en avez sûrement vu sous Basic comme les FOR-NEXT).

UNE BOUCLE D'OR, AIE !

On fait une petite pause en ce qui concerne le programme pour voir en détail ce que l'on peut faire avec les boucles. Vous savez tous écrire des boucles FOR-NEXT sous Basic ? Du moins je l'espère, car dans le cas contraire, il vous sera très difficile de nous suivre. Dans ce genre de boucle, on repète plusieurs fois les mêmes opérations tout en gardant à nos petits esprits qu'il existe une variable : l'indice de boucle que l'on peut utiliser à gogo dans le programme. En assembleur, il est fréquent que l'on utilise le registre B comme indice de boucle. Non pas que cela soit une convention, mais tout simplement parce qu'il existe sur ce registre des instructions bien spécifiques, que d'autres ne possèdent pas. L'instruction ou plutôt la mnémonique DJNZ est un saut relatif. Voilà ce qu'elle fait en détail : le programme, à la vue du DJNZ décrémente le registre B et le compare à 0. Si le 0 est atteint, le programme suit son cours, sinon il se branche sur l'adresse indiquée après le DJNZ. Durant tout ce bla-bla informatique, on pourra utiliser le registre B, car on sait à présent qu'il part de la valeur par laquelle on l'a honoré et se décrémente au fur et à mesure pour atteindre la valeur 0. Revenons à notre programme. Je viens de vous bassiner la tête avec le registre B, tout en vous démontrant ses grandes qualités de travail sur les boucles. Quelle horreur de voir que dans le programme on n'utilise pas B comme compteur, mais l'accu. Qu'est-ce que nous prépare le père Zède ? La réponse est toute simple. Dans le petit sous-programme qui attribue les couleurs aux PEN, on est obligé de passer par le registre BC, et, comme vous le savez, après l'appel du vecteur BC32, ce registre est totalement mis aux fraises. Etant donné que, durant ces opérations, je n'utilise pas l'accu, je simule avec ce dernier l'opération du DJNZ, Et voilà, c'est aussi bête que ça.

Donc, en ligne 60, on met 3 dans l'accu (ce qui correspond aux valeurs 3,2,1 et 0 car on va le décrémenter pour atteindre le 0), ce qui correspondra au numéro des encres. On fait pointer HL sur une zone de quatre octets dans lesquels sont stockées les quatre couleurs (dans le sens inverse des aiguilles d'une montre). La couleur 3, suivie de la 2, la 1 et enfin la couleur 0 qui est celle du fond. Etudions ce que fait je prog à ce moment précis. On charge dans B la valeur stockée dans la zone INKS pointée par HL. En 110 on met la même valeur dans C et on appelle le vecteur Victor pour mettre l'encre à sa place. Vous n'êtes pas sot car vous avez remarqué qu'avant de faire ce genre de galipette, on sauve d'abord les deux registres qui seront utilisés (AF et HL) par les deux PUSH qui ne font qu'empiler ces valeurs sur la pile. Tiens, voilà du nouveau. Le registre A (l'accu) peut s'accoupler avec le registre F (FLAG) pour former un double registre (c'est beau l'amour !). La suite est toute bête. On retire les valeurs ainsi sauvées par des POP. On incrémente HL, donc HL ne pointe plus sur la première valeur de INKS mais sur la deuxième. On récupère ensuite AF dans la ligne 150 et on le décrémente pour tester s'il est passé en négatif. Sinon on rebranche la routine et rebelote.

A propos de branchement, le JP M ne vous intrigue pas ? Si vous faites vos premiers pas en assembleur, je suis sûr que vous ne comprenez pas encore très bien ce que l'on nomme les sauts conditionnels. Là, j'hésite, je continue à vous causer du programme ou je vous branche sur les conditionnels ? That is the question... 6 034 caractères, je tente le double.

LA SUITE, MAIS VITE

Le vecteur BC38 s'occupe du border, comme pour les encres. En 220, au lieu de faire LD Hd et LD LJ. je fais LD HL.257. C'est exactement la même chose mais ça va plus vite, ça prend moins de place, ça fait plus pro et ça me plaît mieux, et que c'est comme ça, na ! Pour travailler avec un PEN quelconque, on place son numéro dans l'accu et on appelle le Victor BB90 (ligne 240 à 250). Suivent ensuite trois petits blocs qui tracent les quatre bords de l'écran. Par pitié, décortiquez-les un peu, sans que je sois obligé de vous mâcher tout pour que vous le gobiez ensuite, OK ? Le premier bloc, fastoche. Le deuxième, hummmmm, fastoche aussi. Le troisième est un tout petit peu plus complexe, mais j'ai plus beaucoup de place, alors essayez de le comprendre, il trace les deux lignes horizontales de l'écran.

LES CONDITIONS

Ouf ! je pourrais peut-être m'en sortir (tiens, à propos, vous ne pourriez pas faire les pages un peu plus grandes, histoire que l'on puisse raconter plein de conneries sans se sentir à l'étroit ?). Les conditions sont valables pour les trois mnémoniques CALL, RET et JP. La première, vous la connaissez, c'est l'équivalent d'un GOSUB sous Basic, la deuxième est presque comme un RETURN, quant à la troisième, c'est la sœur jumelle de GOTO. On peut les utiliser telles quelles sans condition, ou les brancher si une condition spéciale est remplie. Pour cela, on doit voir le registre F (vous savez, celui qui peut s'accoupler avec l'accu). Le registre F est un registre 8 bits, il y a donc, dans ce registre, 8 cases qui peuvent prendre les valeurs 0 ou 1, OK ? Les bits se comptent de droite à gauche (à droite le bit 0, et à gauche le bit 7). Les différents bits de ce registre se mettent à 0 ou à 1, selon le résultat de l'opétation en cours. On peut ainsi les tester et, en fonction du résultat, prendre une décision adéquate.

Le bit 0 est l'indicateur de report (C) et est mis à 1 quand il y a retenue lors d'une soustraction, ou report lors d'une addition. Exemple : LD A,200 et ADD A,100 met le bit 0 .du flag à 1, et si les instructions sont suivies de JP C,ADR le saut à l'adresse ADR s'effectuera. On trouve également l'inverse (NC). Le bit 6 est l'indicateur Z et est mise à 1, quand le résultat d'une opération est nul (XOR A par exemple). L'inverse est NZ. L'indicateur S est sur le bit de gauche et est mis à 1 quand le bit le plus significatif du résultat est à 1. Pour être plus clair, si le résultat est négatif ou plus petit que zéro. Je vous donne un petit tableau qui vous servira pour comprendre tout les mécanismes du flag. Il n'est pas complet, mais le reste ne vous servira pas dans les premiers temps. Je vous le donne avec des CALL, sachant qu'il est le même pour JP et RET. Travaillez bien et en attendant la suite de notre jeu, n'hésitez pas à écrire ou phoner le mercredi pour me donner la météo de votre ville. CALL NZ Si Z=0, le résultat n'est pas nul.

CALL Z Si Z-1, le résultat est nul.
CALL NC Si C=0, il n'y a pas de débordement.
CALL C Si C = 1, il y a débordement
CALL P Si S=0, le résultat est positif ou nul.
CALL M Si S =1, le résultat est négatif.

Zède l'inconditionnel , A100% n°24

Page précédente : Assembleur ACPC n°23 - Il cours, il cours l'assembleur

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

Lien(s):
» Coding » Bidouilles ACPC n°46 - Les vecteurs system (4/6)
» Coding » Bidouilles ACPC n°39 - Gestion directe du FDC 765
» Coding » Assembleur ACPC n°11
» Coding » Bidouilles ACPC n°37 - FDC en mode direct
» Coding » Assembleur ACPC n°44 - La programmation HARD du PSG
» Coding » Bidouilles ACPC n°31 - RSX
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 555 millisecondes et consultée 1532 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.