L'assembleur Z80 plus en détail
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 :
- 15 jours pour comprendre le PHC-25
- Utiliser l’émulateur pour PHC-25
- Quelques réflexions sur le BASIC du PHC-25
- Portage du jeu Blitz sur le PHC-25
- Le mode graphique 2 du PHC-25
- Palettes de couleur du PHC-25 en mode graphique 2
- L’assembleur sur le PHC-25
- Un script ruby pour passer de l’assembleur au basic pour le PHC-25
- L’assembleur Z80 plus en détail
Commentaires
Pas encore trouvé de solution simple et non-invasive pour avoir des commentaires sur le blog. En attendant vous pouvez laisser votre Commentaire sur mastodon@lkdjiin