★ CODING ★ AMSTRAD CPC 464 - CRÉER DE NOUVELLES INSTRUCTIONS ★ |
Nouvelles Instructions 004 |
EXEMPLES DE PROGRAMMES 1. PAUSE DE X SECONDES Nous allons, pour votre baptême du feu, nous attaquer à un programme bien modeste, puisqu'il ne comprend que 23 octets. Il permettra d'effectuer des pauses de longueur variable, et remplacera avantageusement les boucles de temporisation laborieuses et imprécises que l'on est obligé d'utiliser sur l'Amstrad. Ce programme débute à l'adresse 43880, finit en 43902 (chiffre de vérification : 2976), est relogeable (ce qui veut dire que l'on peut l'implanter ailleurs en mémoire si l'on veut ce qui n'est pas le cas de tous les programmes, nous le verrons plus tard), et son format d'appel est le suivant : CALL 43880,X Le paramètre X détermine, en secondes, la longueur de pause désirée. Voici les conventions de la présentation du listing : La première colonne indique des numéros de ligne qui ne servent à rien d'autre qu'aux explications. La deuxième indique l'adresse du premier octet du code machine de cette ligne (cette adresse est également fournie en hexadécimal si, pour une raison ou pour une autre, elle est remarquable). La troisième colonne, sans titre, sert à visualiser les sauts éventuels. La quatrième indique les instructions du programme (en hexadécimal, bien sûr), et la cinquième les mnémoniques de ces mêmes instructions (les mnémoniques sont simplement des représentations symboliques des différentes instructions, dont il est plus facile de se souvenir que des codes machine). Le principe de ce programme est exactement le même que celui d'une boucle de temporisation en BASIC : nous allons demander à l'ordinateur... de ne rien faire, mais un grand nombre de fois, pour faire "passer le temps". Ligne 5 Chargement du registre HL avec le nombre 65110 (&FE56). Vous remarquerez qu'après le code de chargement (&21), on met d'abord l'octet faible de la valeur à charger, et ensuite l'octet fort (signalons également que pour charger un registre double, l'octet fort doit toujours être indiqué, même s'il est égal à 0). Pourquoi ce nombre 65110 ? Il a été déterminé par essais successifs, de manière que cette boucle centrale dure une demi-seconde (à quelques millièmes près). Ligne 6 Décrémentation du registre HL, ce qui signifie que l'on enlève 1 au contenu de ce registre. Ligne 7 Chargement du registre A (ou accumulateur) avec le contenu du registre H (donc avec l'octet fort du contenu de HL). Remarque Le contenu de H n'est pas modifié après l'instruction. D'une manière générale, les instructions de chargement n'affectent jamais le contenu de la source. Ligne 8 Littéralement "Exécution d'un OU logique entre le registre L et le registre A". Il faut savoir que le résultat d'un OU logique entre un registre et l'accumulateur n'est égal à 0 que si le contenu de ces deux registres est égal à 0. Ligne 1 Si vous avez bien lu la section "Les paramètres transmissibles", cette ligne ne devrait pas poser de problème : chargement du registre H avec le contenu de l'emplacement mémoire d'adresse IX+1, c'est-à-dire avec l'octet fort de X. Ligne 2 Chargement du registre L avec le contenu de l'emplacement mémoire d'adresse IX+ 0, c'est-à-dire avec l'octet faible de X. Après ces deux lignes, HL est donc chargé avec X. Lignes 3 Addition de HL... avec lui-même ! Le résultat étant chargé dans HL, cela revient donc à multiplier par 2 son contenu. Il est maintenant chargé avec 2 * X. Ligne 4 Empilement du registre HL : le contenu du registre HL est déposé sur la fameuse pile évoquée dans la Première Partie. Le registre HL va en effet être utilisé pour autre chose, mais nous aurons encore besoin de son contenu, que nous stockons donc en le déposant sur la pile. Ligne 10 Dépilement du registre HL : la donnée sauvegardée en ligne 4 est retirée de la pile et chargée dans le registre HL, qui contient donc maintenant à nouveau X * 2. Lignes 11,12, 13 Elles suivent exactement le même processus que les lignes 6, 7 et 8 déjà étudiées : décrémentation de HL, chargement de A avec H, OU logique entre A et L. Comme vous l'avez sans doute déjà compris, il s'agit là de notre boucle générale, ou tout au moins de sa partie compteur. Ligne 14 Saut relatif de -15 (en ligne 4) si non nul : ni HL n'est pas encore égal à 0, le programme saute en ligne 4 où le contenu actuel de HL est de nouveau "mis au frais". Ensuite, nouveau départ de la boucle centrale pour une demi-seconde. Ligne 15 Cette instruction signale la fin du programme en langage machine et provoque le retour au BASIC. 100 CALL 43880,10 Cette ligne BASIC provoquera une pause de dix secondes. 100 TE = TIME/300 : CALL 43880,1 : TE1 = TIME/300 : PRINTTE1-TE Le temps de pause s'affichera en secondes.
|