Ordinateur Rétro: RC2014 PRO avec ROM88 (SCM, CP/M, Basic)

Bonjour,

Je poursuis mes découvertes Retro autour du Z80 et viens d'atteindre un tournant intéressant. Les articles RC2014 vont devenir moins fréquents au profit de l'assembleur.

Je vais aussi pouvoir reprendre les articles habituels sur MicroPython, matériel Maker, etc.

ROM88 sur RC2014

La ROM88 (voir article sur décodage des ROMs du RC2014) est celle qui m'intéresse le plus.

RC2014 Z80 sous SCM (ROM-88)

Cette configuration permet de faire un choix de démarrage de 3 firmwares distincts. 

Cette ROM de 16 Kio contient:

  • SCM : Small Computer Monitor - permet de faire de l'assembleur directement sur le RC2014. C'est le système par défaut.
  • Basic Loader : permet de démarrer le Basic
  • CP/M Loader : permettant de charger CP/M 2.2 depuis une CF card.

Nous passerons en revue les différentes options: SCM, Basic Loader et CP/M Loader.

Note:
il n'est pas obligatoire de passer par la ROM 88 pour utiliser SCM, Basic ou CP/M, SCM est accessible en ROM 6 et CP/M en ROM 9. Disposer d'un choix me paraît pertinent. 

ROM 88 - configuration

Configuration RAM

RAM module - configuration

Tel que configuré, la Paging est désactivé, ce qui veut dire que le module RAM inférieure ne sera pas activé par le signal PAGE. En conséquence, seul le module de RAM supérieur sera exploité.

Tel que configuré, l'adressage débute à 0x0000 pour les deux modules. Le module RAM inférieur n'étant pas sélectionné (c'est là que se trouvera la ROM), la RAM sera accessible à partir de 0x8000 

Configuration ROM

ROM module - configuration pour ROM88

La ROM-88 utilise une page de 16Kio qui débute à 0x0000.

Module Horloge

configuré comme le Basic 32 Kio.

Module SIO/2

Configuré comme le Basic 32 Kio.

Résumé de la configuration sur RC2014 PRO

La ROM commence donc à l'adresse 0x0000 et la RAM débute à 0x8000.

Basic Loader

Ce loader permet de démarrer le Basic 32K que nous avons déjà rencontré dans le précédent article.

Le Basic est entièrement inclus dans la ROM.

CP/M Loader 

Je m'intéresserais plus tard à CP/M (ancêtre du DOS mais disposant de nombreux logiciels).

Mon seul regret est qu'il sera limité à 32 Kio de RAM puisque la ROM n'utilise pas le signal PAGE.  Le Loader ne contient pas CP/M lui-même mais recherche le module avec la carte CF puis charge le système d'exploitation depuis la carte CF.

Selon toute vraisemblance, les fonctions du BIOS CP/M devrait être présent dans la ROM-88. Du coup, ces fonctions BIOS sont aussi disponibles pour SCM et codes assembleur.

Small Computer Monitor

SCM : présentation

Small Computer Monitor (SCM pour les intimes) est un outils qui permet d'écrire des programmes assembleur, de désassembler du contenu, d'inspecter et/ou modifier le contenu de la RAM, inspecter/modifier les registres et même un mode de chargement à l'aide de HexLoader.

Bref, un couteau Suisse pour découvrir et/ou appendre l'assembleur.

Ecran d'accueil de Small Comupter Monitor

Cet outil est vraiment très complet tout comme son guide utilisateur (voir ci-dessous).

La seule chose qu'il faut savoir c'est que sur le RC2014-RPO la RAM débute à 0x8000 et ce c'est à partir de cette adresse qu'il est possible de faire de l'assembleur.

SCM: guide utilisateur

Le guide utilisateur est accessible depuis le billet "Learning the Small Computer Monitor" (Google Group, Document PDF).  

Ce document est très utile et détaille bien les fonctions de SCM.
Il reprend par ailleurs les détails de l'API (probablement celle de  reprend les points d'entrée des différentes fonctions appelable depuis le code assembleur. 

A propos de HEXLoader

Le format HEX d'Intel est une format texte très simple qui permet d'écrire des octets à une adresse donnée.

Initialement prévu pour initialiser une ROM, ce format permet aussi d'envoyer un programme assembleur quelque part en mémoire... comme par exemple à partir de 0X8000 (donc dans la RAM du RC2014).

Exemple de fichier HEX:

:1040000021354006090E80EDB3061A3E41F5DB80EE
:10401000CB5728FAF1D3813CCD2A4010F0DB80CB7E
:104020004728FADB81D38118F4C9F5C50E0911645C
:1040300000F7C1F1C91814C403C105681100FFFFDE
:00000001FF

Le format:

  • commence par un ":" 
  • suivit de deux octets "ll" indiquant la longueur (ex: 0x10 dans le premier enregistrement = 16 octets).
  • suivit de 4 octets "aaaa" pour l'adresse (ex: 0x4000 pour le premier enregistrement)
  • suivit de 2 octets "tt" pour le type d'enregistrement
    • 00 : enregistrement de donnée
    • 01 : fin de fichier
    • 02 : extended segment address record
    • 04 : extended linear address record
    • 05 : start linear address record (MDK-ARM only)
  • suivit des données au format hexadécimale
  • terminé par 2 octets "CC" contenant le checksum (complément à deux du modulo 256 de la somme des octets).

Ce format permet également de transférer des programmes assembleurs en RAM... de quoi transférer des programmes depuis la section Apps du site SCM.

Note: l'exemple ci-dessus ne fonctionne pas sur un RC2014-PRO car l'adresse 0x4000 présent dans l'exemple est un emplacement dans l'espace d'adresse de la RAM.

Quel intérêt?

Cela permet aussi de transférer un programme Z80 compilé et assemblé sur un ordinateur hôte vers la plateforme rétro (il suffit d'indiquer l'adresse 0x8000 comme adresse d'origine pour charger le code assembleur dans la section RAM du SCM).

Comment utiliser HexLoader ?

C'est très simple, SCM réagi à la présence d'un ":" en premier caractère d'une commande puis débute immédiatement le chargement.

Il suffit donc d'ouvrir un fichier Hex sur votre ordinateur puis de faire un copié/collé dans le terminal :-)

Note: si vous utilisez Putty sur Linux il faut presser le bouton centrale de la souris (souvent une roulette) pour faire un coller dans le terminal.

SCM : utilisation des deux ports séries

Comme vous le voir l'image d'accueil de l'article, j'utilise le module PicoTerm pour créer un système autonome.... du coup ce n'est pas facile d'utiliser HexLoader dans ces conditions.

La bonne nouvelle, c'est que SCM dispose de la commande CONSOLE permettant de passer d'un port série à l'autre sur le module DUAL Serial Module SIO/2

Voici la marche à suivre:

  1. Brancher une connexion USB/Série de sur le port 2 du module SIO/2 et démarrer le terminal sur l'ordinateur (Ex: Putty).
  2. Sur SCM exploitant le port 1 (PicoTerm dans mon cas): saisir CONSOLE 2 pour passer sur la deuxième connexion série.
  3. Maintenant que la connexion série a basculée vers l'ordinateur, le terminal (Putty) peut être utilisé pour dialoguer avec SCM.
  4. Copier/Coller le contenu du fichier HEX dans le terminal.
  5. Dans le terminal, saisir CONSOLE 1 pour rebasculer vers le port série 1 (et le module PicoTerm dans mon cas)
Il ne reste plus qu'à débrancher la connexion USB/série de l'ordinateur.

SCM API

SCM dispose d'une série d'API qu'il est possible d'appeler directement depuis SCM lui-même (ces API sont décrite dans le "Guide utilisateur de SCM").

Les API sont appelable via la commande API mais aussi depuis du code assembleur.
Les deux API d'intérêt sont:
  • $01 - Input Character : attend la saisie d'un caractère à la console puis retourne sa valeur.
  • $02 - Ouput Character : sortie d'une caractère sur la console.

Input character

Voici l'appel dans SCM qui attend la saisie d'une touche dans le terminal
Small Computer Monitor - RC2014
*api 1
61 0001
L'appel d'API attend une entrée sur la console. J'ai pressé le caractère "a" qui correspond au caractère ASCII 97 (ou 0x61), résultat affiché par l'API.
La réponse d'API affiche le registre A et les registres DE (si je ne me trompe pas)

Output character

Voici l'appel dans SCM pour sortir un caractère dans le terminal.
Small Computer Monitor - RC2014
*api 2 62
b62 0062
L'appel d'API envoi le caractère "b" (0x62) que l'on peut voir juste avant la réponse de l'API (qui indique en retour le caractère envoyé vers la sortie).

Appel d'API en assembleur

Grâce à l'assembleur de SCM il est possible de saisir l'exemple à partir de l'adresse 0x8000.
L'appel d'API se fait en indiquant la fonction à appeler dans le registre C puis faire un appel à l'adresse $0030.

Il faut passer les paramètres attendus dans les différents registre (le A pour la plupart des appels d'API). Voici la sortie du caractère 'b' sur la console.
from $8000: 

LD C,$02 ; call Output Char API
LD A,$62
RST $30 ; call API
RET ; return SCM
L'appel RST $30 est équivalent à CALL $0030 mais RST 30 nécessite uniquement 2 octets pour le coder alors de CALL $0030 nécessite 3 octets! 

Ressources

Ensuite...

Equipé des appels d'API pour envoyer (ou recevoir) un caractère vers (de) la console, je vais maintenant vraiment pouvoir faire de l'assembleur :-)
Suivre les vidéos YouTube  "Z80 Assembly for the Sinclair" et adapter le contenu pour mon RC2014.

Aucun commentaire