Assembleur Z80 sur RC2014 - épisode 1 - les bases

Bonsoir à tous,

Voici le début des découvertes de l'assembleur Z80 sur RC2014. Maintenant que SCM (Small Computer Monitor) est configuré, il est possible de faire de l'assembleur directement sur le RC2014-Pro.

J'ai donc décidé de me baser sur les vidéos de Matt Heffernan relatif à la programmation Z80 sur Spectrum pour adapter les exemples au RC2014.


Episode 1: les bases

Voici donc la première vidéo de Matt Heffernan sur les bases de l'assembleur. Ensuite nous passerons aux exemples Z80 pour le RC2014


Premier programme Z80

Version Spectrum

Ce programme propose de charger la valeur dans $D6 (214) dans la mémoire vidéo du Spectrum à l'adresse $5800.

ld a, $D6
ld ($5800), a
ret

Version RC2014

Puisque le RC2014 PRO n'a pas de carte/chip vidéo, il ne sera pas possible d'écrire à l'adresse $5800 (qui est d'ailleurs en ROM donc en lecture seule). Le RC2014 dispose d'un espace RAM de 32 Kio à partir de $8000 pour les programmes assemblés avec SCM et pour stocker les données.
SCM peut uniquement assembler un programme dans un espace mémoire accessible en lecture/écriture... donc en RAM.

Qu'allons nous faire?

Assembler un programme en $8000 pour écrire la valeur $D6 en RAM à l'adresse $8500.

Etape 1: Inspecter le RAM

Commençons par examiner la mémoire à $8500 avec "m 8500. C'est là que nous écrirons nos données.

*m 8500
8500:  B3 FC 1D DB 64 9C F3 5E  A9 C0 D3 8C 7E 21 74 F3  ....d..^....~!t.
8510:  EE 13 14 4C C4 6A 54 E2  94 8D C1 A3 53 15 E5 78  ...L.jT.....S..x
8520:  B5 C3 71 BA 6E DC 62 5E  81 F4 B6 BC D8 11 07 E5  ..q.n.b^........
8530:  D1 D0 22 C2 01 EC 21 18  6C 36 10 BA 44 5A 28 6D  .."...!.l6..DZ(m
8540:  01 B1 35 AD B3 BE F4 D6  5A 0F 64 56 E3 3B DC 91  ..5.....Z.dV.;..
8550:  41 57 6E 99 DB 8A 18 91  74 76 78 11 B3 26 46 C3  AWn.....tvx..&F.
8560:  D5 57 1B 5C 75 C3 79 3F  14 38 F3 6D F6 EA 2B 35  .W.\u.y?.8.m..+5
8570:  41 33 79 0C 50 80 3C 4B  B0 9A CC 12 80 7C 10 5A  A3y.P.<K.....|.Z

Cette portion de la RAM contient des informations aléatoire. Nous allons donc commencer par nettoyer cet espace pour faciliter notre lecture. Remplissons cet espace avec des 0 puis en ré-inspecter le contenu.

Etape 2: Initialiser la RAM

Initialisation de la RAM située entre $8500 et $8570 avec des zéros à l'aide de la commande "fill 8500 8570 0" puis ré-affichage de la mémoire avec "m 8500".

*fill 8500 8570 0
*m 8500
8500:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
8510:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
8520:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
8530:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
8540:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
8550:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
8560:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
8570:  00 33 79 0C 50 80 3C 4B  B0 9A CC 12 80 7C 10 5A  .3y.P.<K.....|.Z

Etape 3: Assembler le programme

Nous allons maintenant pouvoir écrire le programme qui place la valeur $D6 à l'adresse $8500. 

ld a,$D6
ld ($8500), a
ret

Le programme d'assemblage est démarré avec "a 8000" et terminé par l'instruction "." .

*a 8000
8000: 00           .     NOP                   > ld a,$D6
8000: 3E D6        >.    LD A,$D6
8002: EE 8C        ..    XOR $8C               > ld ($8500),a
8002: 32 00 85     2..   LD ($8500),A
8005: 2C           ,     INC L                 > ret
8005: C9           .     RET
8006: 8E           .     ADC A,(HL)            > .
*

Le programme se termine avec RET (à $8005) pour revenir au Moniteur SCM. Le programme encodé peut être contrôlé/relu avec "d 8000". 

Au delà de $8005, les instructions sont aléatoires (comme le contenu de la mémoire). Cela n'a pas d'importance puisqu'elle ne seront pas exécutées (grâce au RET).

* d 8000
8000: 3E D6        >.    LD A,$D6
8002: 32 00 85     2..   LD ($8500),A
8005: C9           .     RET
8006: 8E           .     ADC A,(HL)
8007: A9           .     XOR C
8008: A0           .     AND B


Etape 4: Exécuter et résultats

Nous pouvons maintenant exécuter le programme avec "g 8000" (Go 8000).

*g 8000
*

Le programme n'affiche rien mais fait son job. Nous pouvons à nouveau inspecter le contenu de la mémoire à l'adresse $8500 (là où nous avons écrit le $D6)

*m 8500
8500:  D6 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
8510:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
8520:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
8530:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
8540:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
8550:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
8560:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
8570:  00 33 79 0C 50 80 3C 4B  B0 9A CC 12 80 7C 10 5A  .3y.P.<K.....|.Z
Le premier octet à $8500 est bien $D6

Voilà, c'est tout pour notre premier programme assembleur.
Le prochain article se penchera sur les modes d'adressages.

Dominique

Aucun commentaire