CODING ★ INITIATION A l'ASSEMBLEUR : LA FEMME AU SCROLL INFAME ★

Assembleur ACPC n°31 - La femme au scroll infame

Le mois dernier, nous avons attaqué sauvagement, en traîtres, sans pitié et à plusieurs, un scrolling en Assembleur dont voici la suite des explications. Pourquoi ce titre ? Ma.... Porque no ???

C'est vrai ça. Apres l'homme, la femme. C'est pas moi qui le dits, c'est la Bible. Je cite : "D'une côte d'Adam, dieu fit Eve." Le premier titre prévu était "Le retour de la revanche du fils de l'homme du scroll mignon 2", mais il n'y avait pas assez de place. Donc, d'un commun accord, nous avons choisi ce titre quelque peu antiféministe {pardon maman). Quelques récapitulatifs : il était une fois, dans un écran sombre et triste, de petits caractères moroses et mélancoliques qui voulaient traverser l'écran de manière jolie, gaie et permanente. La fée Carapoum. qui passait par là, entendit leurs complaintes. Elle exauça les voeux et le miracle fut. Tournicoti, tournicoton et tout ce beau monde était animé par la "Boujetousseul" aiguë.

Comme le programme de préparation a été expliqué le mois dernier, il est temps pour nous de passer à la partie importante, voire cruciale : l'explication de la partie Assembleur.

En parlant du mois dernier, une erreur s'est glissée dans le premier programme Basic ; il ne fallait pas lire "Vive Amstrad 100 %", mais "Vive Amstrad Cent Pour Cent". Comme vous avez pu le voir, les caractères 1,0, et % ne figurent pas dans la fonte. Ils ne sont donc pas affichés lors du scrolling. Pardon encore pour cette petite erreur qui ne nuit nullement au bon fonctionnement du programme ( Sined : "C'est ma faute !", Poum : "Gnarkgnarkgnark..." ).

ÇA COULE DE SOURCE

Voici donc quelques remarques détaillées sur le déroulement du listing Assembleur : Avant tout, les deux EQU permettent de définir deux constantes en leur affectant des valeurs définitivement. Nous pouvons donc dorénavant considérer que la variable TEXT vaut 39600 et que FONTE correspond à la valeur 37000. Ce genre de procédure permet de faire moins d'erreurs. Travailler avec des noms est bien plus simple que de jongler avec des valeurs. De plus, dans le cas d'une erreur sur le texte, l'Assembleur le signale alors qu'un 8 à la place d'un 3 engendrera un bug à l'exécution mais pas à l'assemblage.

Si Motorhead dit Orgasmatron. nous répondons ORG 40000. Le programme est mis à cette place mais il ne tient qu'à vous de le reloger selon vos besoins. La seule contrainte est de ne pas le mettre dans les données. INIT est la routine d'initialisation de la partie créatrice des adresses de début des 16 lignes dont nous aurons besoin. HL contient l'adresse de la première ligne. B le nombre de lignes et enfin IX pointe sur la table de réception (quel banquet !). BOUCLE est le nom donné à la boucle dans laquelle l'adresse est stockée, le pointeur incrémenté deux fois et la nouvelle adresse calculée par l'intermédiaire du vecteur système bien connu. Seize fois elle fera cela. PROG. comme il est précisé dans le listing, est le point d'entrée de la routine. C'est ici qu'un compteur est installé. La position dans le caractère courant est prise, incrémentée et stockée. Si elle vaut 4, c'est qu'il faut passer au caractère suivant car un de ceux-ci possède normalement 4 colonnes numérotées de 0 à 3. Dans le cas du passage à un autre caractère, le précédent compteur est remis à zéro et le caractère suivant est pris dans la chaîne de stockage. Si ce caractère vaut 0, c'est la lin de texte et tout est remis en route pour le premier caractère.

En premier lieu, si le compteur est à trois et que le pointeur sur le texîe est juste devant celui-ci, c'est pour des raisons d'initialisation. Il faut que le scrolling commence sur un caractère entier, et comme le pointeur sur la chaîne est incrémenté automatiquement, il faut se placer juste avant le texte pour commencer dessus. Remarquez que les variables sont stockées directement dans le code exécutale. Cela permet un gain de place minable mais surtout une grande lisibilité et une économie d'étiquettes relative (gain de vitesse à l'assemblage). Notez que pour utiliser cette technique, il faut analyser le code machine de l'instruction de chargement mémoire. Pour les registres IX et IY, il est certain que vous devrez prendre en compte le fait que le code de commande est stocké sur deux octets et que la donnée visée se trouve non pas à étiquette+1 mais +2.

UN GOUT DE BOUCHON

Comme dirait Bison futé, on prend les mômes et on recommence. BD19, le vecteur de contrôle du balai de rafraîchissement de l'écran. Malgré la technologie avancée de nos machines, elles ne sont pas encore équipées d'aspirateurs. M'enfin. passons. Attendons simplement que le balai soit derrière l'écran, lors de sa remontée. IX pointe sur la table, A contient le nombre de lignes à décaler et glissez jeunesse.

L'adresse de la ligne est rangée dans HL et le pointeur dans la table avance d'un caractère. HL est alors transféré dans DE puis incrémenté ce qui lui fait prendre un octet d'avance sur le second registre double. BC contient le nombre d'octets à déplacer et LDIR se charge du reste. Cette boucle est effectuée 16 fois car c'est la hauteur d'un caractère. Pour chaque ligne, les 79 premiers octets sont remplacés par leur suivant respectif. La dernière colonne d'octets devenant incohérente, il faut la remplir. Ce n'est pas là une mince tâche mais nous allons l'exécuter tout de même. Il faut avant tout prendre le pointeur, sur l'octet représentant le caractère à afficher, qui est contenu dans COMPT+1. Comme il représente non pas le code ASCII mais la position dans la fonte, il est décrémenté (le premier caractère est 0 et non pas 1 dans la fonte). Pour accéder aux données du caractère, il faut multiplier son numéro par 64 qui est la taille d'un caractère (16 lignes x 4 colonnes). Nous ne nous arrêterons pas particulièrement sur cette multiplication 8 x 16 bits, car nous l'avons déjà abordée dans le cadre de cette initiation. Elle consiste simplement à décaler le multiplicateur à droite, ce qui le divise par deux. Le hit tombé indique s'il faut additionner le multiplicande ou non. Comme le multiplicateur a été divisé par deux, il faut multiplier par deux le multiplicande pour rétablir l'équilibre. C'est fait sur 8 bits que contient le multiplicateur.

Notre travail consiste ensuite à savoir quelle est la colonne que nous devons afficher dans ce caractère. Nous allons la chercher dans PROG+1 et la multiplions par 16 par quatre décalages successifs à gauche. La position selon le caractère et sa colonne sont ensuite additionnées. Il ne reste alors plus qu'à ajouter l'adresse de départ de la fonte et le tour est joué.

FONDS DE BOUTEILLE

Tous nos pointeurs sont maintenant actualisés pour remplir la colonne de droite de l'écran de nos seize lignes. L'adresse de la colonne dans la fonte est transférée de HL dans IY et IX pointe sur la table contenant les adresses de début des lignes écran. B est initialisé avec le nombre de lignes, cl DE contient le décalage relatif au début de ligne soit 79 octets. C'est à ce moment précis qu'il est temps de prendre les choses en main. L'adresse de la ligne est mise dans HL et le pointeur IX est positionné pour l'adresse suivante. L'octet composant la colonne est récupéré dans A et IY est aussi préparé pour la boucle suivante. Comme HL pointe sur le début de ligne et que nous avons besoin de l'adresse de fin, le décalage de DE lui est additionné. L'écran peut alors être actualisé et la boucle réalisée le nombre de fois voulu. Le RET final rend la main au Basic.

Il est certain que ce genre de routine n'est pas le must en matière d'optimisation car. par exemple, il n'est pas nécessaire de calculer IY à chaque fois puisque sa valeur est linéaire pour un caractère donné. De plus, le remplissage de la dernière colonne pourrait être fait dans le même temps que le décalage de la ligne, lorsque DE pointe sur la bonne valeur. Nous n'avons pas essayé de vous donner le meilleur, mais simplement un exemple de programmation ; une logique de travail. Comme dit le mois dernier, il ne faut pas être aveuglé par des choses énormes maïs plutôt essayer d'être le plus rasé possible. Un bon programmeur en Assembleur n'est pas forcément d'une logique spockienne mais assurément aussi rusé qu'une horde de renards affamés. Dussiez-vous avoir la même ténacité que ces petites bêtes.

UN MOIS D'EMOI

Nous ne savons pas encore ce que nous vous proposerons le mois prochain, mais si vous avez des idées ou bien si vous désirez qu'un problème précis soif (s)abordé dans ces pages, faites-le-nous savoir en écrivant à Poum, à la rédaction. En attendant de vous lire aussi, bonne bourre.

Si Poum en avait...

Poum & Sined, A100 n°31

Page précédente : Bidouilles ACPC n°30 - Catalogue et heresie

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

Lien(s):
» Coding » Assembleur ACPC n°41 - Les flags, grands délires
» Coding » Bidouilles ACPC n°42 - La decompression
» Coding » Assembleur ACPC n 07 - Initiation : Les INC / DEC / CP
» Coding » Bidouilles ACPC n°41 - L'art de la compression
» Coding » Assembleur ACPC n°19 - Création d'RSX
» Coding » Assembleur ACPC n 02 - Les vecteurs d'interruption
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.73-desktop/c
Page créée en 158 millisecondes et consultée 2228 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.