★ CODING ★ AMSTRAD CPC 464 - CRÉER DE NOUVELLES INSTRUCTIONS ★ |
Nouvelles Instructions 003 |
LE LANGAGE MACHINE COMMENT IMPLANTER UN PROGRAMME EN LANGAGE MACHINE Nous allons nous servir, pour illustrer cette section, du programme proposé dans l'avant-propos, et qui colorait l'écran (cette fois, pourtant, nous n'y inclurons pas la possibilité de faire varier X). 10 MODE 1 : MEMORY 40000 La ligne 10, outre qu'elle initialise l'ordinateur en model, nous intéresse surtout parce qu'elle protège une zone de mémoire, à partir de l'adresse 40000. 1. La boucle démarre en 40001. 2. La première donnée stockée en DATA est écrite dans cette case mémoire. 3. La deuxième boucle commence : la deuxième donnée stockée en DATA est écrite en 40002, et ainsi de suite. Une fois le programme écrit en mémoire, il ne reste plus qu'à l'appeler grâce à l'instruction CALL, suivie de son adresse (c'est-à-dire l'adresse de la première de ses instructions, en l'occurrence 40001). Deux remarques s'imposent : • La longueur de la zone à protéger dépend bien évidemment de la longueur du programme à y implanter (dans notre cas, un MEMORY 43887 aurait pu suffire, puisque notre programme ne fait que 16 octets). 20 FOR I = 40001 TO 40016 : READ A$ : POKE I, VAL("&H" + A$) : NEXT Un dernier conseil enfin, avant de clore le sujet : vous vous rendrez vite compte que rien ne se produit plus facilement, lorsqu'un programme est assez long, qu'une ou deux erreurs lors de la copie des lignes de DATA. Or, les conséquences d'une erreur dans un programme en langage machine sont parfois lourdes (nous y reviendrons). C'est pourquoi la ligne suivante, insérée juste après la boucle de chargement, permet en principe de signaler ce genre d'erreur : 25 W = 0 : FOR l = Adresse de départ TO adresse de fin: W = W + PEEK(I): NEXT: IF W< > Vérification THEN PRINT "Erreur de data" : END Pour l'exemple précédent, adresse de départ = 40001, adresse d'arrivée =40016, et vérification = 1742. Si l'instruction CALL ne pouvait être utilisée que sous la forme que nous avons vue précédemment, il est bien évident qu'elle serait d'un emploi très limité. CALL adresse du programme, X, X1, X2, X3,... On peut ainsi transmettre jusqu'à 32 paramètres I Reprenons l'exemple du carré. L'appel de la routine pourrait se présenter ainsi (ne pas oublier les virgules) : CALL adresse, X, Y, L X et Y seraient les coordonnées du coin supérieur gauche de notre carré, et L la longueur des côtés. Ainsi donc, avec un seul programme, nous pourrions dessiner n'importe quel carré. CALL adresse, X Précisons tout de suite que l'ordinateur va systématiquement réserver deux cases mémoire pour ranger chaque paramètre, au cas où ils seraient supérieurs à 255. Notre paramètre X se présentera donc quelque part en mémoire sous la forme : A ce propos, il est important de noter que, lorsqu'un nombre est écrit en mémoire, l'octet faible est toujours écrit avant le fort. Cela peut être formulé de différentes manières : * Octet faible de X = contenu de la case mémoire dont l'adresse est dans IX (on dit "adressée par IX"). Ou encore : * Octet faible de X = (IX) et octet fort de X = (IX + 1). Comme il est obligatoire d'utiliser IX avec ce qu'il est convenu d'appeler un déplacement, nous écrirons (IX + 0) au lieu de (IX), ce qui revient exactement au même. CALL adresse, X, X1, X2 Ils seront rangés en mémoire de la manière suivante : On remarquera que le dernier paramètre est rangé le premier dans la mémoire. CALL adresse, 300, 120, 5000, 0 (Rappelons que HEX$(300) = 12C, HEX$(120) = 78, HEX$(5000) = 1388 et que HEX$(0) = 0.) Si nous voulons par exemple charger le registre DE avec le troisième paramètre, en l'occurrence 5000 (&1388), il nous faut charger l'octet fort dans D et l'octet faible dans E : (IX + 3) dans D et (IX + 2) dans E Précisons enfin que le nombre de paramètres transmis est chargé, lui, dans le registre A (accumulateur) au moment de l'appel du programme. Nous verrons que cela peut être très utile. LES PRÉCAUTIONS INDISPENSABLES Le langage machine n'est pas d'un maniement aussi aisé que le BASIC, et si vous ne voulez pas être rapidement et à tout jamais découragé, vous ferez bien de tenir compte des conseils suivants : * N'oubliez pas de protéger votre zone d'implantation grâce à l'instruction MEMORY. De plus, faites bien attention que votre programme ne "déborde" pas de l'adresse 43903. Évitez également d'implanter vos programmes dans des zones inférieures à 16384, cela vous épargnera des désagréments dont il serait trop long de parler ici. * Enregistrez systématiquement vos programmes avant de les essayer. Il arrive souvent, lorsqu'un programme se "plante", que rien ne se passe et que le clavier ne réagisse plus. Dites-vous bien qu'il s'agit toujours d'une erreur de conception (inutile d'accuser la machine, elle ne fait jamais d'erreur), et que l'ordinateur doit être branché sur une boucle malsaine dont il ne peut plus sortir. Dans ce cas-là, une seule solution : éteindre et rallumer. * Tenez la pile sous haute surveillance. Comme il a été dit précédemment, la pile est souvent un moyen- commode pour stocker des données. Mais n'oubliez pas que l'ordinateur s'en sert également de son côté, et voici de quelle manière : Nous avons déjà comparé l'instruction CALL à l'instruction GOSUB, la seule différence étant que la première appelle un sous-programme en langage machine, et la seconde un sous-programme en BASIC. Cette adresse, il s'attend donc à la retrouver sur la pile au moment du retour. Si un "tripotage" intempestif de la pile l'a entre-temps dénaturée sans la remettre en état, l'ordinateur récupérera une donnée fausse et le programme va sauter n'importe où. La règle d'or est donc: Au moment du retour d'un sous-programme en langage machine, la pile doit être dans le même état qu'au moment de l'appel de ce sous-programme. Vous verrez que cette règle n'est pas très difficile à appliquer pour peu que l'on fasse preuve d'un minimum de rigueur et de minutie. Lorsque j'utilise beaucoup la pile, je me sers pour ma part d'un petit "truc" aussi simple qu'efficace : je manipule physiquement une pile faite de petits cartons que j'entasse les uns sur les autres, ou au contraire que j'enlève de la pile en même temps que mon programme. Le premier carton à être systématiquement déposé est bien sûr intitulé "adresse de retour du programme". Quand le programme s'achève, c'est-à-dire au moment où l'instruction de retour au BASIC est rencontrée, il ne doit plus rester d'autre carton au-dessus de celui-là. Si c'est le cas, je rajoute, avant l'instruction de retour, les instructions nécessaires pour les faire disparaître. Cette histoire de pile est réellement très importante. Combien de débutants se sont arraché les cheveux devant des programmes qui se plantaient, alors qu'il s'agissait tout simplement d'un problème de pile !
|