AS PROS ET FERS NAISSANTS

Voilà un titre qui est sans aucun doute, le plus bête que j’ai jamais créé. En fait , j’aimerais bien que cette rubrique vous fasse devenir les fers de lance de la programmation en assembleur, les as du langage machine, en bref, les pros du micro-ordinateur. Bon. Passons aux choses sérieuses et entamons dès maintenant la suite de cette initiation à l’assembleur. Reprenons les principes de base et repartons pour un tour.

En parlant de programmation , faites un tour du côté du courrier. Le copain Einstein se débrouille bien dans son genre. Alors, jetez un coup d’œil sur ses élucubrations. et je suis sûr que vous trouverez des choses intéressantes. Bon, repassons encore sur ce point et attaquons de plein fouet le vif du sujet.

Le langage machine est, comme nous l’avons souvent répété, le langage du microprocesseur. Ainsi, un nombre nous paraissant insignifiant est un mot clef que le microprocesseur comprendra comme un ordre précis.

Malheureusement, les quelques ordres qu’il comprend ne sont pas très puissants. Il ne sait rien faire de très évolué et n’est même pas capable d’exécuter directement une multiplication ou une division. Le Basic, que vous utilisez tous les jours, n’est qu’une suite de quelques milliers d’instructions machine interprétées à la vitesse de l’éclair. C’est parce que les microprocesseurs sont très rapides qu’ils sont capables de se hisser au niveau de l’homme, mais non sans perte. En effet, vous avez pu vous apercevoir que certaines boucles réalisées sous Basic sont très très lentes et ne font que des travaux simples sur des morceaux de mémoire. De plus, ces programmes Basic ne font pas que ce que l’on pourrait croire.

En dehors de l’exécution du programme proprement dite, l’interpréteur Basic vérifie la syntaxe des commandes, le nombre des paramètres et leur validité.

Ainsi, gentil qui est perdu à vérifier et revérifier les organes de l’instruction en cours. En assembleur, vous ne programmez que ce que vous désirez faire, et rien de plus. De cette manière, c’est 100 % du temps de travail qui est utilisé au fonctionnement et à l’exécution de la routine. Merveilleux, dites-vous.

Allez, Sined, dépêche-toi de nous apprendre ce langage que nous puissions utiliser notre CPC au maximum de ses possibilités. Moi je veux bien, mais ce n’est pas si facile. Comme nous l’avons expliqué ci-dessus, chaque instruction machine ne fait qu’une toute petite opération et, pour faire un programme conséquent, c’est quatre ou cinq mille instructions qu’il faut aligner. Alors, pas de panique. Pour comment fonctionne approximativement un CPC. Essayons de faire imagé, pour que les novices ne soient pas perdus en route.

ARCHITECTURE INTERNE

En fait, votre CPC est un grand magasin, dont vous ne voyez que la vitrine, qui est l’écran, et où vous pouvez passer des commandes par l’intermédiaire du clavier. Comme vous le savez , les grands magasins ne vous montrent qu’une infime partie de leur stock. Un hangar est souvent bourré de tas de choses différentes allègrement éparpillées. Lorsque vous commandez une instruction à l’ordinateur, c’est comme si vous désiriez un costume dans une boutique.

Le nom simple de « costume bleu » se transforme rapidement en une référence incompréhensible, puis en trois références (une pour chaque pièce) ; vient alors le moment où il faut que quelqu’un aille se promener dans le stock pour prendre les différents éléments composant le costume tant convoité.

PAGE 1

Ces éléments doivent être sortis de leur emballage, quelque peu nettoyés, conditionnés, et enfin emballés, pour que le client soit satisfait. Le CPC fonctionne de la même manière. Lorsque vous lui demandez 

               ORG       #9000

FOR       LD        HL,#C000
TO         LD        A, H
              AND       L
              CP        #FF
              RET       Z
POKE    LD        (HL),1
NEXT    INC       HL
              JR        TO

de faire une quelconque opération, il doit parcourir son stock (la mémoire) pour prendre les in forma lions demandées, les conditionner pour qu’elles soient compréhensibles, et enfin les afficher, si vous l’avez précisé. Comme dans une grande surface, if existe deux lieux distincts mais liés ; l’exposition et le stock. Dans le CPC l’écran est le lieu d’exposition, et le stock est le reste de la mémoire vive. Mais ces deux parties sont gérées de la môme manière, avec les mêmes instructions, comme si une seule personne s’occupait simultanément du magasin et du stock.

 

SURVOL DU FONCTIONNEMENT

Les instructions Basic se rapprochant le plus de l’assembleur sont Peek et Poke, qui permettent respectivement de lire et d’écrire directement dans la mémoire. Ainsi, tapez le petit programme suivant et vous verrez que l’écran est une partie de mémoire comme les autres, et qu’il suffît de la remplir pour qu’elle soit remplie.

     Vous voyez que le fait de remplir la mémoire écran de I fait afficher des lignes verticales et parallèles. Ce petit programme nous a bien prouvé que l’écran n’était ni plus ni moins qu’une partie de mémoire comme les autres, et qu’il suffit d’y ranger savamment les valeurs appropriées pour qu’un résultat satisfaisant pointe sans la moindre réticence.

Comme vous avez pu le remarquer, ce remplissage se fait avec une lenteur digne d’un escargot. Maintenant, pour vous mettre l’eau à la bouche, nous allons programmer cette même routine en assembleur. Et c’est parti.

Comme Einstein me l’a demandé, voici le programme Basic générateur de codes.

10 MODE 2
20 FOR I=&C000 TO &FFFF
30 POKE I,1
40 NEXT

Comme vous pouvez le voir vous-même, il n’y a aucun rapport entre la vitesse du programme Basic et celle du programme en assembleur. Ce petit exemple est significatif de la différence de vélocité entre ces deux langages. Le programme en assembleur est simple, très très simple même. Voici l’explication de son fonctionnement.

Ligne 1 : l’org force l’implantation du code à l’adresse hexadécimale 9000.
Ligne 2 : le double registre HL est initialisé avec l’adresse de début de l’écran.
Ligne 3 : transfert   du   registre   H   dans l’accumulateur.
Ligne 4 : opération   ET   logique   entre l’accumulateur et le registre L.
Ligne 5 : comparaison de l’accumulateur avec la valeur immédiate 255.
Ligne 6 : sortie si égalité.
Ligne 7 : remplissage de la case mémoire pointée par HL avec la valeur 1.
Ligne 8 : incrémentation du pointeur.
Ligne 9 : boucle sur le test suivant.

Le test de non-débordement de HL est assez simple, malgré les apparences. Lorsque HL vaut &FFFF, H contient &FF et L aussi. Un ET logique ne mettant un bit à 1 que si les deux bits des opérandes sont tous deux à un. il faut que H et L soient égaux à 255 tous les deux, pour que le résultat de cette opération soit lui aussi 255. Sympa, non? Dans cette routine, il y a tout de même un petit bug, car la case mémoire &FFFF ne sera pas remplie. Pour ce faire, il suffit de mettre la ligne Poke en troisième position dans le source. Cela dit, si le test avait été fait sur zéro au lieu de 255, le programme aurait eu la bonne structure.

BIENTOT PLUS DE PLACE

Le petit programme cité ci-dessus n’était donné qu’à titre d’exemple, pour montrer simplement la différence de vitesse entre la programmation normale et la programmation appliquée. Vous vous rendez compte du nombre d’instructions que doit exécuter le Z80 lorsqu’il affiche une chaîne de caractères à l’écran ? Entre aller chercher les caractères, un par un, en mémoire, déduire l’adresse de la définition de ce caractère en fonction de son code Ascii, calculer l’adresse à laquelle seront affichés les octets composant ledit caractère, etc., que de travail pour une pauvre petite bête à mille pattes !

Tentez aussi d’imaginer le nombre insensé de calculs que doit faire le processeur pour trouver le résultat d’un calcul trigonométrique. C’est impensable. L’idée que le Basic fait tourner le Z80 en rond pour rien me répugne. Bon, allons directement à la case sortie, nous reparlerons de tout cela le mois prochain.

PAGE 2

CA Y EST, PLUS DE PLACE

Le mois prochain, nous verrons les instructions du Z80 plus en détail, avec tout ce qui les entoure. Pour ceux qui seraient déjà découragés, je tiens à signaler que le Basic du CPC est bien fan, et qu’il contient des vecteurs. U est ainsi possible d’afficher un caractère en appelant simplement un sous-programme en ROM. Ainsi, presque toutes les instructions du Basic sont disponibles en assembleur, si l’adresse du point d’entrée de la routine est connue.

Nous aborderons aussi ce point dans les prochaines éditions de notre rubrique, en vous communiquant les adresses des points d’entrée les plus utiles. Mais de toute façon, le plus simple est de vous procurer un livre contenant les dits vecteurs. Clefs pour CPC de PSI est un bon manuel, pour débutants ou pour experts, qui contient toutes les informations nécessaires à la bonne programmation du CPC. La bible de Micro Application ne se défend pas mal non plus, mais elle s’adresse plutôt à des programmeurs plus confirmés, car les renseignements sont assez techniques.

Eh bien, je disais que la place allait manquer, et c’est fait. Si un point de cet article vous est apparu sombre, ou pas clair, écrivez-nous, et nous tenterons de vous éclairer. Ecrivez aussi pour demander des petites routines ou des astuces de programmation, si un problème se pose à vous. Bien. J’ai tout dit, alors au mois prochain…

Sined le barbare