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.

Aucun commentaire