CODINGCLASSEURS WEKA ★ Comment exploiter toutes les ressources et augmenter les performances de votre AMSTRAD CPC ★

4/2.5.1 - II. Votre première routine machineCoding Classeurs Weka
4/2 - Assembleur Z80 : Définitions et rappels de base

4/2.5 - Cours de programmation

4/2.5.1 Initiation au langage machine

II. Votre première routine machine

Puisque nous avons vu que l'Amstrad attend des instructions Basic dès sa mise sous tension, il est clair que nous allons devoir « partir » du Basic pour accéder au langage machine.

Nous utiliserons donc les instructions suivantes :

  • POKE pour « implanter » des « octets » en mémoire
  • PEEK pour aller lire en mémoire
  • MEMORY pour réserver des zones de mémoire pour le langage machine
  • CALL pour « appeler » nos routines en langage machine

    L'Amstrad venant d'être mis sous tension, frappons la commande :

PRINT HIMEM ( + ENTER)

Une valeur apparaît, par exemple 43903, qui indique l'adresse mémoire (c'est-à-dire le numéro de « case ») maximale dans laquelle le Basic peut avoir à écrire : en dessous de 43903, donc, la mémoire n'est pas « sûre » et ce qu'on y écrit risque tôt ou tard de se trouver « écrasé » par autre chose.

Protégeons donc une zone qui nous sera strictement réservée, en frappant :

MEMORY 39999 (+ ENTER)

Il est facile de vérifier que HIMEM vaut dorénavant 39999 : toute la zone mémoire entre 40000 et 43903 soit plus de 3 Ko est maintenant à notre disposition sans surprise possible.

Un programme machine n'est rien d'autre qu'une suite d'octets, c'est-à-dire de valeurs comprises entre 0 et 255 (en décimal) ou entre 0 et FF (en hexadécimal) ou encore entre 00000000 et 11111111 (en binaire).

Notre exemple (195 64 156) n'échappe pas à cette règle même s'il ne comporte que trois octets en tout et pour tout !

Il s'agit donc de l'implanter en mémoire, puis de l'exécuter. Faisons donc successivement :

POKE 40000, 195 (+ ENTER)
POKE 40001, 64 (+ ENTER)
POKE 40002, 156 (+ ENTER)

Nos trois octets de programme machine sont désormais rangés à la suite les uns des autres à partir de l'adressse 40000, qu'il ne s'agit plus d'oublier car elle devra être spécifiée pour « lancer » l'exécution.

Faites NEW si vous voulez pour bien montrer que vos octets sont en sécurité, puis :

PRINT PEEK (40000) ( + ENTER)
PRINT PEEK (40001) (+ ENTER)
PRINT PEEK (40002) (+ ENTER)

Notre programme est bien là !

Pour le lancer, il suffit de faire :

CALL 40000 ( + ENTER)

Allons-y, et constatons qu'il ne se passe rien. Ce qui est pire, c'est que le clavier n'agit plus et que même la touche BREAK est inopérante : l'ordinateur est « planté » ! Ce n'est pas grave, mais pour reprendre « la main », il va falloir faire un « reset », c'est-à-dire un CTRL-SHIFT-ESC qui effacera toute la mémoire, y compris notre programme : n'oublions pas qu'en faisant un CALL, nous avons arrêté l'exécution du programme « interpréteur Basic » de la ROM pour travailler complètement « sans filet ». Perdre un programme de trois octets n'est rien, en perdre un de 300 ou 500 octets, représentant des heures de travail, est une tout autre affaire : il faudra être prudent lorsque vous en arriverez là et effectuer des sauvegardes !

En fait, ce qui est arrivé était voulu : ce programme est une « boucle » utilisant l'instruction de « saut » JP NN.

195 est le code de l'instruction JP (jump), 64 et 156 indiquent l'adresse à laquelle il faut faire « sauter » l'exécution, soit 64 +(256x 156) = 40000.

Notre CALL 40000 a donc appelé une instruction appelant elle-même sa propre exécution !

En Basic, un RUN déclenchant l'exécution de 10 GOTO 10 aurait le même effet, à ceci près que BREAK serait efficace, et que cette ligne occupe largement plus de trois octets en mémoire. Toutes les instructions machine n'occupent pas le même nombre d'octets : elles sont plus ou moins longues selon leur complexité. Cependant, toute suite d'octets ne correspond pas nécessairement à un programme machine vraisemblable : un CALL vers une adresse mémoire quelconque a toutes les chances de « planter » l'ordinateur : sachez exactement ce que vous faites... Certaines adresses de la ROM correspondent toutefois à des routines préprogrammées qu'il peut être utile d'exploiter (Voir partie 4, chap. 2.7).

★ NOTE: 9e Complément

Page précédente : 4/2.5.1 - I. Assembleur ou langage machine ?
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
Page créée en 752 millisecondes et consultée 711 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.