CODING ★ Convertion numerique ★

Assembleur ACPC n°20 - Convertion numerique
Je me creusais la tête, et cherchais de quoi que je vais causer ce mois-ci dans la rubrique Assembleur. Les idées n'étant pas claires, je pris un fanzine nommé Syntax Error et le lis pour me divertir. Et la lumière fut. Elle émanait d'un certain CACH, qui a une action humanitaire des plus honorables.

Et de quoi causait le fameux CACH ? Il venait juste de me rappeler la question que des lecteurs nous posent si souvent, qu'à force on y fait même plus gaffe. On s'est tous, un jour ou l'autre, tapé la tête contre les murs pour trouver une routine qui affiche le score dans un jeu. On s'est tous révolté en voyant l'instruction DAA qui ne fonctionnait pas sur le CPC. Et on a tous rêvé d'avoir une belle routine qui affiche le contenu d'un octet. L'idée était là.

AFFICHE-MOI UN OCTET

A Cent Pour Cent, on ne fait pas les choses à moitié. Non seulement on vous donne la routine pour afficher la valeur d'un octet en hexa (idée de CACH), mais en plus on vous donne une routine pour afficher deux octets, en décimal, cette fois. Si vous n'êtes pas de gros fainéants, il vous sera très facile de l'adapter pour la faire travailler sur un octet seulement. (Là, on remercie Yves Lamoureux.)

JE CACHE A DROITE, JE CACHE A GAUCHE

Pour les quelques rigolos qui pensent qu'il suffit de pointer l'accumulateur sur l'octet en question et d'envoyer la sauce par le vecteur BB5A je dirais qu'il ne s'agit pas de l'affichage Ascii d'un octet mais bel et bien de la valeur qu'il contient. Par exemple, si un octet est chargé avec la valeur 123, on veut que notre routine affiche cette valeur, c'est-à-dire 1 suivi de 2 suivi enfin du 3, compris ?

L'idée première est l'affichage en hexadécimal. Il est vrai que c'est un casse-tête plus simple à résoudre que l'affichage décimal. Alors, suivez le guide.

La valeur à afficher est dans l'accu. On sauve par un PUSH cette valeur, car la suite va modifier le contenu de l'accu qui doit nous servir plus tard. Quatre rotations à gauche en plantant un zéro à chaque fois dans le septième bit (c'est elle, c'est l'instruction SLR A), et voilà que les quatre bits de gauche se trouvent dans les quatre premiers bits de l'accu. Une petite routine nommée TEST compare la valeur de l'accu à 10. Si cette valeur est supérieure à 10, il faudra afficher une lettre allant de A à F, donc additionner à l'accu la valeur &37 avant l'utilisation du vecteur BB5A Dans le cas contraire, si la valeur est inférieure à 10, on ajoute tout simplement à l'accu &30 pour transformer la valeur en code Ascii représentant un chiffre (de 0 à 9). Une fois les quatre bits de gauche affichés, on récupéré la valeur initiale, on masque les quatre bits de gauche, et rebelote. Avouez que plus simple que ça, on meurt.

VOUS POUVEZ LES FAIRE UN PEU PLUS LONGS ?

Dans la deuxième routine, c'est moins évident. On tranche des valeurs de 10000, 1000, 100 et 10 en comptant à chaque fois le nombre de valeurs retranchées. On pointe le registre IX sur une zone de cinq octets qui contiendra en sortie les valeurs allant de 1 à 10 représentant les unités, dizaines, centaines, milliers, et dix millièmes. La valeur à afficher se trouve dans le double registre HL. Regardez, les opérations se ressemblent toutes. On annule la valeur de l'accu (XOR A, qui revient à LD A0 en plus beau), on met dans le registre BC la valeur à retrancher. Et puis, comme un grand, on compte jusqu'au débordement. On arrête tout et, pour remettre les choses en place, on ajoute la dernière valeur retranchée. Cela est répété plusieurs fois, avec la seule différence que le résultat est mis dans les cinq octets pointés par IX, qui peut être indexé comme nous le savons tous.

ET QU'A QUOI QUE CA SERT ?

Il faut vraiment être trop bête pour faire ce genre d'intertitre. Primo, cela comble une lacune du CPC, qui ne savait pas le faire ; deuxio, ça va encore plus vite que l'affichage Basic. Si, si essayez ceci :

“A%=23516:T=TIME:PRINT A%: PRINT TIME-T”

ensuite après avoir assemblé le deuxième source, essayez

“T=TIME:CALL 40000: PRINT TIME-T”

Si vous n'êtes pas convaincu, je baisse les bras, car vous êtes dans un cas désespéré.

Il me semble inutile de vous faire des remarques sur les dernières lignes qui ne font qu'afficher une suite d'octets. Pour la modification des deux routines, vous allez un peu travailler. On ne va pas mâcher tout le boulot à votre place, non mais !

Zède, qui ne compte plus, A100% n°20

Page précédente : Assembleur ACPC n°19 - Création d'RSX

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

Lien(s):
» Coding » Bidouilles ACPC n°14 - Les secrets du GATE ARRAY (1/2)
» Coding » Assembleur ACPC n°08 - Initiation : Les CALL / JR
» Coding » Assembleur ACPC n°25
» Coding » Assembleur ACPC n°39 - L'addition s'il vous plait
» Coding » Assembleur ACPC n°29 - On assemble ensemble
» Coding » Bidouilles ACPC n°42 - La decompression
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 063 millisecondes et consultée 1744 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.