Assembleur Z80 sur RC2014 - épisode 2 - l'adressage (partie 2)
Bonsoir à tous,
Nous allons enfin pouvoir terminer l'épisode 2 entamé ici sur l'adressage avec un exercice d'affichage d'une chaîne de caractères .
Nous disposons aussi des informations concernant l'API de Small Computer Monitor.
Exercice: Afficher une chaîne de caractères
Cet exercice propose d'afficher une chaîne de caractère en suivant les recommandations des vidéos de Matt Heffernan relatif à la programmation Z80 sur Spectrum.
Je sais... je sais... l'API de Small Computer Monitor permet d'afficher une Null Terminated String mais ce n'est pas le but de cet exercice.
Comment allons nous faire?
Nous allons stocker une chaîne de caractère (et sa longueur) en RAM à partir de $8500.
Ensuite, nous allons afficher cette chaîne (sur la console) suivie d'un retour à la ligne.
Etapes
Etape 1: Préparer les données
Après avoir effacé la zone mémoire de $8500 à $8600 avec "fill 8500 8600 00" on insère la chaîne de caractère "hello" en mémoire.
Utiliser la commande "e 8500" (edit) pour y stocker la longueur de la chaine de caractère en $8500.
La chaîne fait 5 caractère de long.
Ensuite la chaîne de caractère "hello" est stockée à partie de $8501
*fill 8500 8600 00 *e 8500 8500: 00 . NOP > 5 8501: 00 . NOP > "hello 8506: 00 . NOP > . * *m 8500 8500: 05 68 65 6C 6C 6F 00 00 00 00 00 00 00 00 00 00 .hello.......... 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 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
Etape 2: Préparer l'assemblage
Le programme en assembleur débute à l'adresse $8000.
Nous allons y placer des 00 (équivalent de l'instruction NOP (No Operation)
*fill 8000 8100 00
Etape 3: Saisie du programme
Avec les assembleurs sur PC, il est possible d'utiliser des libellés (label).
Sur le moniteur SCM, il faudra utiliser l'adresse mémoire plutôt qu'un libellé.
start: ; @ $8000 ld a,($8500); charger longueur de la chaine depuis RAM ld b,a ; ld b,($8500) non autorisé ld hl,$8501 ; adresse de la chaine loop: ; @ $8007 ld a,(hl) ; charger caractères @ hl push bc ; API modifie reg. B & HL push hl ld c,$02 ; SCM API: output char rst 30 pop hl pop bc inc hl ; pointer vers caractère suivant dec b ; nbre caracteres jr nz,loop; Jump Relative non-zero @ loop ld c, $07 ; SCM API: output carriage return rst 30 ret ; return to SCM
Assembler le programme sur SCM avec "a 8000"
8000: 00 . NOP > ld a,($8500) 8000: 3A 00 85 :.. LD A,($8500) 8003: 00 . NOP > ld b, a 8003: 47 G LD B,A 8004: 00 . NOP > ld hl,$8501 8004: 21 01 85 !.. LD HL,$8501 8007: 00 . NOP > ld a,(hl) 8007: 7E ~ LD A,(HL) 8008: 00 . NOP > push bc 8008: C5 . PUSH BC 8009: 00 . NOP > push hl 8009: E5 . PUSH HL 800A: 00 . NOP > ld c,$02 800A: 0E 02 .. LD C,$02 800C: 00 . NOP > rst 30 800C: F7 . RST 30 800D: 00 . NOP > pop hl 800D: E1 . POP HL 800E: 00 . NOP > pop bc 800E: C1 . POP BC 800F: 00 . NOP > inc hl 800F: 23 # INC HL 8010: 00 . NOP > dec b 8010: 05 . DEC B 8011: 00 . NOP > jr nz,8007 8011: 20 F4 . JR NZ,$F4 (to $8007) 8013: 00 . NOP > ld c,$07 8013: 0E 07 .. LD C,$07 8015: 00 . NOP > rst $30 8015: F7 . RST 30 8016: 00 . NOP > ret 8016: C9 . RET 8017: 00 . NOP > . *
Etape 4: Tester
* *g 8000 hello *g 8000 hello *
Tester le programme se fait en débutant l'exécution à l'adresse $8000 avec "g 8000".
Comme attendu, le programme affiche bien la chaîne de caractères. Le retour à la ligne permet d'avoir l'invite de commande "SCM" à la ligne lorsque le programme assemblé rend la main à SCM.
Écrire un commentaire