Le premier source assembleur nous a été utile pour valider la chaîne d’outils. Mais il répétait la même instruction encore et encore. Il est temps maintenant d’en voir un peu plus.

C’est le même programme, l’affichage de BONJOUR en haut à gauche de l’écran, mais cette fois-ci il fait appel à plus de fonctionnalités de l’assembleur et à plus d’instructions du Z80.

org $f000

  ld de, bonjour
  ld b, 7
  ld hl, $6000
loop:
  ld a, (de)
  ld (hl), a
  inc hl
  inc de
  djnz loop
  ret

bonjour:
  db "BONJOUR"

Je vais disséquer chaque ligne.

org $f000

org indique l’origine en mémoire du programme. C’est à dire l’adresse à laquelle il débute. C’est une directive qui est destinée à l’assembleur (le programme qui transforme notre source). Une directive n’est pas traduite en instruction. Ici nous informons l’assembleur que le programme débute à l’adresse $F000. Ce sera l’adresse physique dans la mémoire de votre ordinateur cible. Parfois on aura différents choix concernant l’emplacement en mémoire de notre programme, parfois on n’aura pas le choix. Mais dans tout les cas, l’assembleur doit connaître cette adresse de départ pour pouvoir calculer pour nous les sauts relatifs et pour remplacer les labels par les bonnes adresses physiques.

ld de, bonjour

de est un registre 16 bits. Il est chargé avec une adresse mémoire. Cette adresse est symbolisée par bonjour. Lorsque l’assembleur transformera le code source en code machine, il substitura le symbole bonjour par son adresse effective. On verra plus tard dans le programme ce qu’est cette adresse.

ld b, 7

Encore un nouveau registre. Cette fois il se nomme b et il pèse 8 bits. On le charge avec le nombre 7, qui est le nombre de lettres dans le mot “BONJOUR”.

ld hl, $6000

Et encore un nouveau registre. Il s’agit de hl et il fait 16 bits. On le charge avec le nombre (hexadécimal) $6000 qui est le début de la mémoire vidéo du PHC-25 en mode texte.

loop:

Nous avons la déclaration d’un label nommé loop. Un label n’est pas transformé en une instruction Z80, mais est utilisé par l’assembleur. Un label représente une adresse. Quelle adresse ? Et bien $F000 + X. Où $F000 est l’origine que nous avons déclaré au tout début du source. Et où X est le nombre d’octets de tout les codes machine qui précède le loop. Nous n’avons pas à nous préoccuper du nombre exact ; si on utilise un assembleur c’est bien pour qu’il fasse ce travail à notre place.

ld a, (de)

Les parenthèses autour de de précisent qu’on ne s’intéresse pas au contenu du registre de lui-même, mais à la valeur de la case mémoire pointée par la valeur dans de. Concrètement si de contient le nombre 16 bits 12345 et si l’emplacement mémoire n° 12345 contient le nombre 8 bits 56, l’instruction ld a, (de) chargera le registre a avec le nombre 56.

ld (hl), a

Toujours le même principe, le nombre 8 bits contenu dans le registre a est placé à l’emplacement mémoire pointé par le contenu du registre hl.

inc hl

On incrémente le contenu du registre hl. S’il valait 123 avant cette instruction, il vaut maintenant 124.

inc de

On incrémente le contenu du registre de.

djnz loop

djnz, ça c’est de la mnémonique ! Cela signifie decrement and jump if non zero. Le registre b est décrémenté. Si le contenu de b n’est pas égal à zéro, on saute à l’adresse qui suit le djnz. Ici l’adresse est symbolisée par loop.

ret

Rien de nouveau, c’est la fin du programme. On rend la main au basic.

bonjour:

C’est la déclaration du label bonjour. Il symbolise l’adresse mémoire à cette position précise du programme. Il a était utilisé dans la première instruction de ce source.

db "BONJOUR"

db veut dire declare bytes, ou define bytes, c’est pareil. Ce qui suit sera intégré directement dans le programme binaire créé par l’assembleur. On peut se représenter cela comme le contenu initial des variables dans les autres langages.

Si on inspecte le contenu du fichier binaire produit par l’assembleur on peut voir, par exemple, l’intégration du mot “BONJOUR” à la fin du programme :

$ xxd a.bin
00000000: 110f f006 0721 0060 1a77 2313 10fa c942  .....!.`.w#....B
00000010: 4f4e 4a4f 5552                           ONJOUR

Bien, je suis prêt à écrire le jeu Blitz en assembleur. Est-ce que je vais y arriver ? J’en sais rien. Mais je suis prêt à essayer ;)


/ / / / / / / / / /


Cet article fait partie d’une série :

  1. 15 jours pour comprendre le PHC-25
  2. Utiliser l’émulateur pour PHC-25
  3. Quelques réflexions sur le BASIC du PHC-25
  4. Portage du jeu Blitz sur le PHC-25
  5. Le mode graphique 2 du PHC-25
  6. Palettes de couleur du PHC-25 en mode graphique 2
  7. L’assembleur sur le PHC-25
  8. Un script ruby pour passer de l’assembleur au basic pour le PHC-25
  9. L’assembleur Z80 plus en détail