CP/M v2.23

Vue d'ensemble

Linux et Windows sont aujourd'hui les systèmes d'exploitation de référence sur les micro-ordinateurs, mais il y a des années tout a commencé lorsque Digital Research a créé le Control Program/Monitor (CP/M). CP/M fut l'un des premiers véritables systèmes d'exploitation pour micro-ordinateurs, offrant un moyen commun d'exécuter des applications sur des matériels variés. Toute machine exécutant CP/M a accès à des milliers de programmes, ce qui a lancé la quête visant à faire fonctionner CP/M sur le Sharp MZ80A.

Une version de CP/M a été créée par Micro Technology pour le Sharp MZ80A, mais comme il lui manquait un écran 80 colonnes, elle n'était pas très utile sans une mise à niveau. En cherchant, on découvrait que des tiers tels que Kuma avaient développé une mise à niveau 80 colonnes que l'on pouvait ensuite se procurer auprès du SUC, mais CP/M sur le MZ80A, bien que mentionné dans de nombreux articles, est en réalité assez difficile à obtenir en 2020. Divers excellents sites tels que original.sharpmz.org proposent les versions 80K/80B/800, mais pas pour le MZ80A.

J'ai développé la carte de mise à niveau couleur 80 colonnes et le Rom Filing System dans le but premier de réaliser CP/M sur le MZ80A. Il est très facile dans le projet d'émulateur matériel à base de FPGA d'ajouter des modifications pour prendre en charge diverses sorties de colonnes, la couleur ou les graphiques, mais le faire sur le matériel original réel en apportant un minimum de modifications à une machine d'époque représentait davantage un défi, ainsi qu'un désir personnel depuis que je possède cette machine depuis 1983. La plupart des mises à niveau du passé exigent des coupures et des straps sur le PCB d'origine, ce que je ne voulais surtout pas ; je veux conserver le matériel original tel que Sharp l'a fabriqué ! La seule modification que j'apporte à mes mises à niveau du PCB d'origine consiste à monter une puce sur support (IC8 74LS165, registre à décalage vidéo), ce qui pourrait facilement être fait en cas de défaillance et de remplacement, de sorte que la machine reste 100 % d'origine et puisse être très facilement remise dans son état d'usine d'origine.

J'ai donc commencé à essayer de faire fonctionner CP/M, et même avec une pléthore d'informations sur le net, ce ne fut pas une tâche aisée. Tout d'abord, l'obtention de la version de CP/M de Micro Technology pour le MZ80A s'est révélée très difficile, je me suis donc rabattu sur les versions MZ80K et MZ80B. Je me suis ensuite heurté aux divers formats de disque atypiques, le MZ80A étant conçu pour lire des données inversées venant aggraver la mêlée. Pour faire court, j'ai fini par décider d'écrire ma propre version du CBIOS en ROM et de la fusionner avec le BDOS+CCP de CP/M v2.23. Cette section détaille les informations relatives à ce travail.

Processus d'amorçage de CP/M

L’amorçage de CP/M se déroule en deux phases :

  1. À l’aide du logiciel original de contrôle de disquette AFI, lire un secteur d’amorçage inversé, vérifier qu’il contient à l’adresse 0x0000 le code de contrôle 0x02 + « IPLPRO », puis passer le contrôle au chargeur d’amorçage encapsulé
  2. Charger, à partir de 0x9C00, le CCP, le BDOS et le CBIOS. Le CBIOS prend alors le contrôle, applique un format de disque différent et utilise une logique de contrôleur FDC différente (c.-à-d. réinverse les données).
À cette fin, j'ai désassemblé la ROM AFI du MZ80A (que l'on trouve dans le dépôt) afin de comprendre les actions qu'elle effectuait. Le chargement initial vérifie si le disque est un disque amorçable sous le MZ80A. Pour le MZ80K, le marqueur d'un disque amorçable (outre le fait que le format est très différent et que les données ne sont pas inversées) était 01 + IPLPRO dans les premiers octets du premier secteur. Pour le MZ80B, c'était 03 + IPLPRO.

Comme je n'avais pas de copie MZ80A de CP/M, j'ai essayé de charger la version MZ80K, mais les données non inversées m'ont obligé à convertir un disque d'amorçage MZ80K au format MZ80A. Une fois cela fait, j'ai essayé d'amorcer CP/M mais il y avait des incompatibilités, par exemple le contrôleur de disque !! J'ai ensuite passé du temps à examiner les versions MZ80B et MZ800 du CP/M de Micro Technologies, qui utilisaient là encore des formats de disque différents, et j'ai finalement décidé que la meilleure approche serait de construire un CP/M personnalisé et d'écrire mon propre CBIOS.


Mise à jour — prise en charge directe des disques MZ-80K : le chargeur d'amorçage CP/M du RFS et le CBIOS détectent désormais automatiquement le format de disque MZ-80K d'origine, de sorte qu'il n'est plus nécessaire de convertir au préalable les disques MZ-80K au format MZ-80A. Lors de l'amorçage via la carte MZ80AFI, le contrôleur indique la taille des secteurs présents sur le disque (128 octets pour un disque MZ-80K, 256 octets pour un disque MZ-80A). Un disque de 128 octets, non inversé, portant le marqueur 01h + IPLPRO est reconnu comme un disque CP/M MZ-80K : les pistes système réservées sont chargées dans l'ordre et le contrôle est transféré au chargeur d'amorçage encapsulé (JP 09803H). Une fois en fonctionnement, les disques CP/M MZ-80K d'origine sont montés directement en lecture en tant que lecteurs CP/M C: et D:, aux côtés des lecteurs de carte SD et ROM. Cela fonctionne sur un MZ-80A réel équipé de la carte MZ80AFI, ainsi que sur le picoZ80 exécutant la persona MZ-80A ou la nouvelle persona MZ-80K avec une interface MZ80AFI.

CBIOS

CP/M est constitué de 3 modules distincts : le CCP (Console Command Processor), le BDOS (Basic Disk Operating System) et le CBIOS (Custom Basic Input Output System). En général, le CCP + BDOS sont standard et le CBIOS est personnalisé selon le matériel sous-jacent.

Les 3 composants sont amorcés depuis la disquette, chargés en mémoire (0x9C00 pour le MZ80K/A) et le contrôle est passé au CBIOS, qui configure la machine avant de céder le contrôle au CCP. En conditions normales de fonctionnement, toute application chargée appellerait le BDOS pour effectuer des services tels que l'écriture sur la console, la lecture du clavier, l'accès au disque, etc., via une API bien définie ; mais si elle n'avait pas besoin des services du BDOS, elle pouvait appeler directement le CBIOS via son API et utiliser en retour la RAM du CCP+BDOS pour gagner davantage d'espace programme. Lorsqu'une application se termine, elle saute au vecteur 0x0000, initiant un démarrage à chaud (Warm start) impliquant le rechargement du CCP+BDOS.

La façon dont CPM est écrit ne se prête pas à un stockage en ROM, car il se modifie lui-même et utilise des variables intégrées ; mais pour le CBIOS, c'est une autre histoire. Il est possible de placer le CBIOS en ROM pour gagner davantage de RAM tout en ayant accès au Rom Filing System avec ses banques de ROM paginées ; c'est la voie que j'ai choisie.

Afin de créer un CBIOS, vous devez fournir les méthodes d’API suivantes :

Méthode d’API Description
BOOT Démarrage à froid, initialiser tout le matériel avant l’invocation du CCP.
WBOOT Démarrage à chaud, annuler toute modification matérielle puis recharger le CCP+BDOS avant l’invocation du CCP.
CONST Console Status, vérifier si une frappe au clavier est en attente de lecture.
CONIN Console Input, récupérer une touche du clavier, attendre si aucune n’est disponible.
CONOUT Console Output, envoyer un caractère à l’écran.
LIST List Device Output, envoyer un caractère au périphérique d’impression (c.-à-d. l’imprimante).
PUNCH Punch Device Output, envoyer un caractère au périphérique de perforation (eh oui, les rubans ou cartes perforés étaient utilisés dans les années 70) !
READER Reader Input, lire un caractère depuis le périphérique de lecture (c.-à-d. ruban papier) !
HOME Déplacer la tête du disque sélectionné vers la piste 0.
SELDSK Sélectionner/activer un disque.
SETTRK Définir la piste du disque pour la prochaine opération de lecture/écriture.
SETSEC Définir le secteur du disque sur la piste sélectionnée pour la prochaine opération de lecture/écriture.
SETDMA Définir la Disk Memory Address, l’emplacement où les données seront lues/stockées.
READ Lire un secteur du disque.
WRITE Écrire un secteur du disque.
LISTST List Device Status, vérifier si le périphérique d’impression est prêt à accepter un nouveau caractère.
SECTRN Sector Translate, traduction de secteur logique en secteur physique pour s’adapter à un matériel spécifique ou améliorer la réactivité du sous-système disque.
Cela ressemble à une exigence simple, mais il faut considérer qu'une machine telle que le MZ80A ne dispose pas de son propre BIOS et que le firmware de sa ROM, lorsqu'il s'exécute sous CP/M, est relocalisé en 0xC000 et donc inutilisable. De plus, le firmware de contrôle de disquette est très rudimentaire et ne gère que l'amorçage d'un disque.

Une exigence supplémentaire, au-delà des mécanismes de base d'entrée/sortie de caractères fournis par CP/M, est que la plupart des applications s'attendent à ce qu'un terminal intelligent (Smart Terminal) soit installé devant la machine CP/M pour fournir des fonctionnalités avancées d'écran et de clavier. Cela se présenterait normalement sous la forme d'un terminal tel qu'un DEC VT52 ou VT100. Comme le MZ80A possède son propre écran et son propre clavier, cette fonctionnalité intelligente doit être écrite.

Ainsi, afin d’écrire le CBIOS, les sous-modules de firmware suivants doivent être codés :

Sous-module Description
E/S écran de base Les fonctions de bas niveau pour placer un caractère à l’écran, effacer l’écran, etc.
E/S écran avancées Intelligence pour positionner la sortie d’affichage, effacer des portions de l’écran, attributs spéciaux tels que le gras, etc.
E/S clavier Scruter et renvoyer les codes de touches, les mapper en ASCII selon les besoins.
E/S disque Fournir des fonctions de lecture et d’écriture de plusieurs secteurs de disque.
Ayant précédemment désassemblé le moniteur Sharp SA-1510, j'avais une bonne base de départ pour fournir les fonctions de base d'écran et de clavier ; le désassemblage du firmware de disquette AFI a donné un aperçu du code nécessaire pour lire une disquette, et plus particulièrement de ses lacunes. Le MZ80A est un ordinateur à 2 MHz et n'a pas la vitesse nécessaire pour traiter le flux d'entrée/sortie disque ; il doit s'appuyer sur un élément matériel qui pagine une banque de ROM en fonction du signal Data Request/Ready du FDC. Les composants FDC ont donc nécessité un travail important. Pour les E/S écran avancées, j'ai décidé d'utiliser le standard ANSI et je me suis procuré l'émulateur de terminal Amstrad CPC d'Ewen McNeill. Je pensais initialement qu'il s'agirait d'une simple extraction et intégration de son analyseur ANSI, mais cela s'est avéré être un travail considérable. Parfois, l'option la plus facile est la plus difficile !!

Toute cette fonctionnalité prend de la place et a été répartie comme suit :

ROM Adresse Description
MROM 4K (ROM moniteur relocalisée de 0x0000 - 0x0FFF) 0xC000 - 0xCFFF CBIOS fournissant l’API CP/M, les routines d’initialisation, les routines du contrôleur de ROM Disk, les routines d’interruption.
ROM paginée 2K 0xE800 - 0xEFFF, Bank 12 Son et mélodie de base, RTC, clavier et fonctions auxiliaires.
ROM paginée 2K 0xE800 - 0xEFFF, Bank 13 E/S écran et analyseur de terminal ANSI.
ROM paginée 2K 0xE800 - 0xEFFF, Bank 14 Fonctionnalité du contrôleur de carte SD.
ROM paginée 2K 0xE800 - 0xEFFF, Bank 15 Fonctionnalité du contrôleur de disquette.

Lecteurs de disque CPM

Comme cette implémentation de CPM et du Custom BIOS utilise 3 contrôleurs de lecteur de disque différents, dont certains peuvent ne pas être présents à un moment donné, les lecteurs sont créés dynamiquement dans CPM lors du démarrage à froid.

L’ordre des lecteurs est indiqué dans le tableau suivant. Les disques CP/M MZ-80K (et MZ-80A) d’origine lus via la carte MZ80AFI apparaissent comme les lecteurs Floppy Disk de ce tableau — généralement C: et D: lorsqu’un lecteur ROM et/ou une carte SD sont également présents.

Rom Drive # Présent 0 1 2 Présent 0 1 2
Rom Drive n/a   A A,B n/a   A A,B
Floppy Disk Oui A,B B,C C,D Non      
SD Card Oui C,D,E,F D,E,F E,F,G Oui A,B,C,D,E B,C,D,E C,D,E,F
SD Card Non       Oui      
La limite du nombre de lecteurs est imposée par CPM (limite de 16 lecteurs) et par la quantité de RAM allouée aux lecteurs, régie par la variable « CSVALVEND - CSVALVMEM » qui est définie dans le fichier CPM_Definitions.asm du dépôt. L'allocation des lecteurs est dynamique : plus de mémoire allouée signifie plus de lecteurs disponibles. La carte SD peut contenir des centaines de lecteurs de disque SD de 16 Mo ; le problème est donc purement la RAM affectée à leur utilisation.

Fonctionnalités

Outre la fonctionnalité BIOS standard, les fonctionnalités suivantes ont été ajoutées au CBIOS.

  • Horloge temps réel avec une granularité de 50 ms
  • Clavier piloté par interruption avec tampon et répétition automatique.
  • Verrouillage de touches tri-mode : Normal, Caps Lock, Shift Lock
  • Fonctionnalité de terminal ANSI
  • Lecteurs de disquette reciblables de taille 1,44 Mo, 720 Ko et 320 Ko
  • Amorçage et lecture directs des disques CP/M MZ-80K d’origine (non convertis) via la carte MZ80AFI, détectés automatiquement par la taille des secteurs et montés en tant que lecteurs C:/D:
  • Lecteurs ROM reciblables de taille 240 Ko (modifiable via la configuration)
  • Disques durs reciblables de 16 Mo sur carte SD.
  • Sortie vers le moniteur via SHIFT+GRAPH+BREAK.

Installation et build automatisés (recommandé)

CP/M pour RFS est assemblé et empaqueté dans le cadre du build RFS normal, de sorte que la manière la plus simple de produire le CBIOS, l'application CP/M au format MZF et les images de disque CP/M est le script d'installation automatisé pour votre plateforme. Chaque script est autonome — copiez simplement le fichier unique correspondant à votre système d'exploitation et exécutez-le. Il installe les prérequis, clone le dépôt RFS, récupère le bundle de contenu d'environ 110 Mo (RFS_Files.zip, qui inclut le logiciel CP/M), et peut lancer le premier build pour vous, sans nécessiter de connaissance approfondie de la chaîne d'outils. Les étapes manuelles, outil par outil, plus bas sont destinées aux utilisateurs avancés et aux reconstructions partielles.
Script Plateforme Notes
setup_RFS.sh macOS / Linux / WSL Installe un JRE Java (assembleur GLASS), une chaîne d’outils C + make (pour compiler le sous-module cpmtools inclus), perl, git, unzip, curl, et (sous macOS) GNU coreutils. Le premier build est ./build.sh -m.
setup_RFS_windows_native.ps1 Windows 10 / 11 — natif, sans WSL (recommandé) Utilise winget pour installer Git for Windows et un JRE Temurin 17, puis construit via Git Bash. Aucun compilateur C nécessaire — les outils préconstruits tools\cpmcp.exe et tools\sdtool.exe sont inclus.
setup_RFS_windows.ps1 Windows 10 / 11 — via WSL2 / Ubuntu Installe WSL2 + Ubuntu si absents (redémarrage unique), puis exécute setup_RFS.sh dans Ubuntu.

macOS / Linux / WSL — setup_RFS.sh

chmod +x setup_RFS.sh
./setup_RFS.sh

Windows 10 / 11 (natif — recommandé) — setup_RFS_windows_native.ps1, depuis une invite PowerShell :

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\setup_RFS_windows_native.ps1

Windows 10 / 11 (via WSL2) — setup_RFS_windows.ps1, depuis une invite PowerShell Administrateur :

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\setup_RFS_windows.ps1

Les scripts tiennent compte des variables d’environnement RFS_REPO_URL (par défaut https://git.eaw.app/eaw/RFS.git) et RFS_FILES_URL (emplacement du bundle de contenu) pour remplacer les invites interactives. Le build écrit les images ROM moniteur/utilisateur (avec le CBIOS CP/M et l’application CP/M au format MZF intégrés) et l’image de carte SD contenant les images de disque CP/M dans le répertoire roms/. Pour le guide pas à pas complet, voir le Guide technique RFS — Système de construction.


Construction de CPM

La construction de CP/M consiste à assembler les sources en langage assembleur Z80 en un binaire en code machine, puis à créer un disque d'amorçage, ou, dans le cas de cette implémentation, un CBIOS en ROM et une application amorçable au format MZF qui est stockée en ROM.

Pour y parvenir, vous avez besoin de plusieurs outils et, pour l’instant, il s’agit d’un processus assez manuel.

Chemins

Pour faciliter la lecture, les noms abrégés suivants désignent le chemin correspondant dans ce chapitre.

Nom abrégé  
[<ABS PATH>] Le chemin où ce dépôt a été extrait sur votre système.
<software> [<ABS PATH>]/MZ80A_RFS/software
<roms> [<ABS PATH>]/MZ80A_RFS/software/roms
<CPM> [<ABS PATH>]/MZ80A_RFS/software/CPM
<tools> [<ABS PATH>]/MZ80A_RFS/software/tools
<MZF> [<ABS PATH>]/MZ80A_RFS/software/MZF
<MZB> [<ABS PATH>]/MZ80A_RFS/software/MZB

Outils

Tout le développement a été réalisé sous Linux, en particulier Debian/Ubuntu. J'utilise Windows pour programmer les RAM et pour la version GUI de CP/M Tools, mais je n'ai pas consacré de temps à la construction du RFS sous Windows. Je créerai en temps voulu une image Docker contenant tous les outils nécessaires installés mais, en attendant, afin d'assembler le code Z80, les programmes C et de travailler avec le logiciel CP/M et les images de disque CP/M, vous devrez vous procurer et installer les outils suivants.

Z80 Glass Assembler - Un assembleur Z80 pour convertir des fichiers assembleur en code machine.
samdisk - Un outil multiplateforme en ligne de commande de manipulation de disque de bas niveau.
cpmtools - Un outil multiplateforme en ligne de commande de manipulation de disque CP/M.
CPMToolsGUI - Un outil GUI Windows de manipulation de disque CP/M.
z88dk - Un excellent kit de développement C pour le CPU Z80.
sdcc - Un autre excellent compilateur C pour petits périphériques (Small Device C Compiler), le Z80 étant l’une de ses cibles. z88dk fournit une version améliorée (pour le Z80) de cet outil dans son paquet.

Logiciel

La construction des images logicielles peut être réalisée en clonant le dépôt et en exécutant certains des scripts shell et binaires fournis.

Script Description
assemble_cpm.sh Un script shell pour construire le binaire CPM, l’application CPM au format MZF à charger via le RFS et les ROM Drives CPM 0 & 1
assemble_rfs.sh Un script bash pour construire les images ROM du Rom Filing System.
assemble_roms.sh Un script bash pour construire toutes les ROM standard du MZ80A, telles que la ROM moniteur SA-1510.
make_roms.sh Un script bash pour construire les ROM RFS adaptées à la programmation dans les Flash RAM de 512 Ko. Ces images contiennent les ROM RFS paginées, les diverses ROM système telles que la SA-1510 et tous les programmes MZF à charger par le RFS.
make_cpmdisks.sh Un script bash pour construire un ensemble de disques CPM, à utiliser comme images brutes (Raw) sur la carte SD ou les lecteurs ROM et comme formats de disque CPC Extended à utiliser dans un émulateur de disquette ou à copier sur support physique.
make_sdcard.sh Un script bash pour créer une image de carte SD combinant l’image RFS et plusieurs lecteurs de disque CPM. Cette image est ensuite copiée en binaire sur la carte SD et installée dans le lecteur de carte SD du RFS.
mzftool.pl Un script perl pour créer/extraire et manipuler des images MZF.
processMZFfiles.sh Un script bash pour convertir un ensemble de programmes MZF en images sectorisées adaptées à une utilisation dans les ROM du Rom Filing System.
sdtool Un binaire créé dans le dépôt src/tools qui construit l’image de carte SD du RFS, créant un répertoire et ajoutant des applications MZF/binaires dans l’image du lecteur.

Le système CP/M est construit en 4 parties :

1. le cpm22.bin qui contient le CCP, le BDOS et un stub de CBIOS.
2. le CBIOS paginé dont la source principale se trouve dans une ROM 4K et 4 ROM paginées 2K. Celles-ci
   sont générées pour être ajoutées à la ROM moniteur paginée RFS et à la ROM utilisateur paginée.
3. jusqu'à 2 (actuellement) ROM Drives CP/M en lecture seule qui peuvent être affectés à n'importe quelle lettre
   de lecteur CP/M.
4. la conversion des binaires générés en 1. et 3. en images MZF sectorisées adaptées
   à un ajout direct dans le Rom Filing System en tant que simple programme supplémentaire.

Tout ce qui précède est codé dans le script bash assemble_cpm.sh qui peut être exécuté comme suit :

cd <software>
tools/assemble_cpm.sh

Le script est actuellement configuré pour générer 1 ROM Drive CPM en lecture seule. Pour ajouter un second ROM Drive CPM, suivez ces instructions :

1. Edit the <tools>/make_cpmdisks.sh script and change the
   variable:
   from BUILDCPMLIST="cpm22 CPM_RFS_1"
   to   BUILDCPMLIST="cpm22 CPM_RFS_1 CPM_RFS_2"

   change the variable:
   from SOURCEDIRS="CPM_RFS_[1] CPM[0-9][0-9]_* CPM_MC_5 CPM_MC_C? CPM_MC_D? CPM_MC_E? CPM_MC_F? CPM[0-9][0-9]_MZ800*" to
   to   SOURCEDIRS="CPM_RFS_[1-2] CPM[0-9][0-9]_* CPM_MC_5 CPM_MC_C? CPM_MC_D? CPM_MC_E? CPM_MC_F? CPM[0-9][0-9]_MZ800*"
   
2. Create a directory (if it doesn't exist): 
   <CPM>/CPM_RFS_2

3. Fill the directory with required CPM files to be placed in the ROM.

4. Build the image by running the make_cpmdisks.sh script or as part of the sequence of commands listed below.

Afin d’utiliser CPM, il est nécessaire de créer les images MonitorROM et USERROM qui peuvent être programmées dans les 2 Flash RAM de 512 Ko. Lancez les commandes suivantes pour construire CPM avec l’ensemble du RFS, des ROM et des applications en ROM :

cd <software>
tools/assemble_cpm.sh
tools/assemble_rfs.sh
tools/assemble_roms.sh
tools/make_cpmdisks.sh
tools/make_roms.sh
tools/make_sdcard.sh

La sortie des commandes ci-dessus correspond aux images ROM <roms>/MROM_256.bin et <roms>/USER_ROM.256.bin qui doivent être programmées dans des Flash RAM de 512 Ko et insérées dans les supports de l’adaptateur RFS.

Les images de disque CPM se trouvent dans <CPM>/1M44/RAW pour les images brutes ou dans <CPM>/1M44/DSK pour les images de disque au format CPC Extended. Ces images sont construites à partir des répertoires de <CPM> ; chaque répertoire commençant par CPM* est empaqueté dans une image de lecteur de 1,44 Mo. NB. En outre, les répertoires sont également empaquetés dans tous les autres disques pris en charge sous forme d’images dans un répertoire correspondant, c.-à-d. <CPM>/SDC16M pour l’image de lecteur de carte SD de 16 Mo.

L’image de carte SD se trouve dans <roms>/SHARP_MZ80A_RFS_CPM_IMAGE_1.img, qui contient l’image de disque RFS <roms>/SHARP_MZ80A_RFS_IMAGE_1.img au début, suivie de sept images de lecteur au format CPM qui, comme ci-dessus, sont stockées dans <CPM>/SDC16M/RAW. Ces images sont construites à partir des répertoires de <CPM> mais sont ajoutées manuellement aux images finales par codage en dur dans le script make_cpmdisks.sh.

Les applications stockées dans les ROM Drives se trouvent dans le répertoire <MZF>. Copiez dans ce répertoire toutes les applications souhaitées, puis lancez la commande suivante pour les traiter en images arrondies au secteur stockées dans le répertoire <MZB>.

cd <software>
tools/processMSFfiles.sh

Les applications réellement intégrées à la ROM sont sélectionnées dans le script <tools>/make_roms.sh. Ce script liste toutes les applications requises et en empaquette autant que l’espace le permet dans la ROM. Pour garantir que votre application apparaisse en ROM, ajoutez-la en haut de la liste (uniquement le nom de fichier, pas l’extension .MZF), c.-à-d. :

Edit the file <tools>/make_roms.sh
Locate the line: ROM_INCLUDE=
Below this line, add your application in the format: ROM_INCLUDE+="${MZBPATH}/<YOUR APPLICATION>.${SECTORSIZE}.bin"
ie. ROM_INCLUDE+="${MZB_PATH}/A-BASIC_SA-5510.${SECTORSIZE}.bin:"
Save the file and run the commands above to build the MonitorROM and USERROMs.

Formats de disque

Comme je l’ai découvert, il existe des centaines de formats de disque CP/M et la seule série Sharp en implémente 2 à 3 par machine. Pour décider quel format utiliser pour cette implémentation de CP/M, j’ai examiné les formats existants. N’ayant pas accès aux disques Sharp MZ80A d’origine et ceux-ci étant de toute façon dans un format inversé non standard, le MZ80B étant similaire au MZ80A mais d’une capacité légèrement supérieure, le MZ800 étant un hybride et le MZ80K étant de faible capacité, j’ai opté pour des formats standard pour les disquettes 3,5” de 1,44 Mo et 720 Ko, le même format physique que les disques Sharp MZ80A, et le Rom Drive de 240 Ko en ROM.

Les formats que j’utilise peuvent être manipulés par cpmtools à l’aide des définitions diskdefs suivantes ; placez ce qui précède dans le fichier diskdefs situé avec cpmtools ou CPMToolsGUI pour les utiliser :

   # 320K Disk for the MZ80A - Same format as the MZ800
   # but implements a cylinder in uniform manner (ie. 1 cyl
   # = 1 track x 2(heads) where as the MZ800 implements as 
   # 160 tracks, 80 x Head 1 0->79 then 80 x Head 2 80->159.
   diskdef MZ80A-A
     seclen 256
     tracks 40
     sectrk 32
     blocksize 2048
     maxdir 64
     skew 0
     boottrk 1
     os 2.2
   end
   
   # A standard format 1.44Mb Floppy format for the MZ80A
   diskdef MZ80A-1440
     seclen 512
     tracks 80
     sectrk 36
     blocksize 2048
     maxdir 128
     skew 0
     boottrk 0
     os 2.2
   end
   
   # A standard format 720K Floppy format for the MZ80A.
   diskdef MZ80A-720
     seclen 256
     tracks 80
     sectrk 36
     blocksize 2048
     maxdir 128
     skew 0
     boottrk 0
     os 2.2
   end
   
   # A 240K Rom Filing System ROM Drive image.
   diskdef mz80a-rfs
     seclen 128
     tracks 15
     sectrk 128
     blocksize 1024
     maxdir 32
     skew 0
     boottrk 0
     os 2.2
   end

   # A 16Mb fixed disk SD Card Image.
   diskdef MZ80A-SDC16M
     seclen 512
     tracks 1024
     sectrk 32
     blocksize 8192
     maxdir 512
     skew 0
     boottrk 0
     os 2.2
   end   
Au sein de CP/M, ces formats de disque physiques sont représentés dans le disk parameter block comme suit. Normalement, vous n'avez pas à vous préoccuper de ces réglages ni des diskdefs ci-dessus ; il est simplement utile de les connaître si vous devez ajouter votre propre format personnalisé :
Définition MZ80A 320K Rom Filing System 1.44MB 3.5” 720K 3.5” 16MB SD Card Image
SPT 64 128 144 72 128
BSH 4 3 4 4 6
BLM 15 7 15 15 63
EXM 1 0 0 0 3
DSM 155 240 719 359 2047
DRM 63 31 127 127 511
AL0 128 128 192 192 192
AL1 0 0 0 0 0
CKS 16 8 32 32 0
OFF 1 0 0 0 0
Afin d'utiliser des programmes CP/M Sharp existants, il sera nécessaire d'extraire les programmes du disque et de les ajouter à un format reconnu par cette implémentation. À cette fin, les sections suivantes décrivent comment extraire les données des disques des machines concernées.

Création d'un disque CPM

Dans mon développement, j'ai utilisé un émulateur de disquette Lotharek HxC connecté à une carte d'interface Sharp MZ80-AFI. Avec cette configuration, il est possible d'émuler tout lecteur de disque avec lequel le contrôleur de disquette Sharp MB8866 peut communiquer. C'est ainsi que j'en suis arrivé aux formats 3,5" et que je les ai testés, car ces lecteurs sont encore disponibles et offrent une capacité suffisante pour la plupart des opérations CP/M.

Afin de créer un disque CP/M utilisable sur le Sharp MZ80A avec cette implémentation de CP/M, vous devez ajouter les définitions ci-dessus à votre fichier diskdefs de cpmtools. Une fois ajoutées, soit copiez l'une des images vierges de \<CPM\>/BLANKFD sous un nouveau nom et utilisez-la comme disque cible, soit créez-en une depuis CPMTools à l'aide de la définition de disque. Vous ajoutez ensuite les programmes requis au nouveau disque, ce qui, dans CPMToolsGUI, n'est qu'une procédure de glisser-déposer.

Afin d'utiliser la nouvelle image CP/M brute dans l'émulateur de disquette ou dans un véritable lecteur de disquette, il est nécessaire de convertir l'image brute en un format que la plupart des outils de disquette peuvent lire et écrire sur une disquette. Dans le cas de l'émulateur de disquette Lotharek, l'utilisation de leur outil HxCFloppyEmulator v2.2.2.1 via Load et Export to HFE générera une image SD appropriée pour imiter une véritable disquette.

Pour convertir l’image, utilisez l’une des commandes suivantes :

For 1.44MB Drives use:
./samdisk copy <RAW IMAGE FILE, ie. CPM00_SYSTEM.RAW> <DSK IMAGE FILE, ie.CPM00_SYSTEM.DSK> --cyls=80 --head=2 --gap3=78 --sectors=36 --interleave=4
Samdisk will automatically recognise the format from the size of the file, ie. 1474560 bytes

For 720K Drives use:
./samdisk copy <RAW IMAGE FILE, ie. CPM00_SYSTEM.RAW> <DSK IMAGE FILE, ie.CPM00_SYSTEM.DSK> --cyls=80 --head=2 --gap3=78 --sectors=36 --size=2 --interleave=4
Samdisk will automatically recognise the format from the size of the file, ie. 737280 bytes

For the MZ80A 320K Drives use:
./samdisk copy CPM00_320K_SYSTEM.RAW CPM00_320K_SYSTEM.DSK --cyls=40 --gap3=78 --head=2 --sectors=16
Samdisk will automatically recognise the format from the size of the file, ie. 327680 bytes

The RFS ROM Drive does not need conversion, the RFS functionality assumes a raw image.

NB. Don't use Samdisk v4, it has a bug where it will place a random sector at the start of the disk. Many hours debugging were lost due to this bug. Best to use
samdisk v3.8.8

Les commandes samdisk ci-dessus créent une image au format Amstrad CPC Extended DSK qui peut être lue et traitée par Lotharek HxCFloppyEmulator ou par les outils utilisés pour écrire des disquettes physiques.

Extraction des disques CP/M MZ80A

Le Sharp MZ-80A stocke les données de disquette au format inversé — chaque octet du disque est le complément binaire de l'octet de données réel. Il s'agit d'une caractéristique matérielle du contrôleur de disquette du MZ-80A, ce qui signifie que les images de disque brutes ne peuvent pas être lues directement par CPMTools sans inverser au préalable chaque octet.

La plupart des images de disque CP/M MZ-80A disponibles en ligne sont au format EDSK (Amstrad CPC Extended DSK). La géométrie du disque est de 40 cylindres, 2 têtes, 16 secteurs par piste, 256 octets par secteur (320 Ko au total).

Utilisez samdisk pour convertir l’image EDSK en une image RAW plate :

  samdisk copy <MZ80A DISK NAME>.DSK <MZ80A DISK NAME>.RAW --cyls=40 --head=2 --sectors=16 --size=256

Exécutez la commande suivante pour inverser chaque octet de l’image RAW, convertissant le format inversé du MZ-80A en données standard que CPMTools peut traiter :

  python3 -c "import sys; sys.stdout.buffer.write(bytes(~b & 0xFF for b in open('<MZ80A DISK NAME>.RAW','rb').read()))" > <MZ80A DISK NAME>_normal.RAW

Utilisez le diskdef MZ80A-A (défini dans la section des définitions de disque ci-dessus) avec CPMTools pour lister et extraire les fichiers de l’image traitée :

  # List files on the disk
  cpmls -f MZ80A-A <MZ80A DISK NAME>_normal.RAW

  # Copy all files to a local directory
  cpmcp -f MZ80A-A <MZ80A DISK NAME>_normal.RAW 0:*.* /output/directory/
Une fois extraits, les programmes peuvent être placés sur une nouvelle image de disque dans l'un des formats pris en charge par cette implémentation CP/M (MZ80A-1440, MZ80A-720, MZ80A-A ou mz80a-rfs) à l'aide de CPMTools, puis convertis en image d'émulateur de disquette avec samdisk comme décrit dans la section Création d'un disque CP/M ci-dessus. Notez que lors de la réécriture vers un disque physique au format MZ-80A, l'inversion des octets doit être appliquée en sens inverse.

Extraction des disques CP/M MZ80K

Le Sharp MZ-80K utilise des données standard (non inversées) sur ses disquettes, aucune inversion de bits n'est donc requise. Cependant, le format de disque est différent de celui du MZ-80A et de capacité inférieure — le MZ-80K a été conçu autour de lecteurs 5,25" simple densité, simple face. Le secteur d'amorçage d'un disque CP/M MZ-80K est identifié par les octets marqueurs 01h suivis de la chaîne ASCII IPLPRO au début du premier secteur.

Les images de disque CP/M MZ-80K sont généralement disponibles au format EDSK ou brut. La géométrie du disque est de 40 cylindres, 1 tête, 18 secteurs par piste, 128 octets par secteur (environ 90 Ko).

Utilisez samdisk pour extraire l’image brute d’une source EDSK :

  samdisk copy <MZ80K DISK NAME>.DSK <MZ80K DISK NAME>.RAW --cyls=40 --head=1 --sectors=18 --size=128
Aucune inversion d'octets n'est nécessaire. Vous pouvez lire l'image RAW directement avec CPMTools en utilisant un diskdef adapté au format MZ-80K. La méthode CPMTools présentée ici reste utile pour archiver le contenu des disques ou transférer des fichiers vers l'un des formats MZ-80A pris en charge nativement (tels que MZ80A-1440 ou MZ80A-720). Notez toutefois que le CBIOS CP/M du RFS peut désormais aussi lire directement les disques CP/M MZ-80K d'origine via la carte MZ80AFI (voir Processus d'amorçage de CP/M ci-dessus) — le disque est détecté automatiquement par sa taille de secteur de 128 octets et monté en tant que lecteur CP/M (généralement C:/D:), de sorte que pour un usage courant sur du matériel réel ou sur le picoZ80, il n'est plus nécessaire de convertir les disques au préalable.
  # List files (adjust diskdef name to match your MZ-80K diskdef entry)
  cpmls -f mz80k <MZ80K DISK NAME>.RAW

  # Extract all files
  cpmcp -f mz80k <MZ80K DISK NAME>.RAW 0:*.* /output/directory/

Extraction des disques CP/M MZ80B

Le Sharp MZ-80B, comme le MZ-80A, stocke les données de disquette au format inversé — chaque octet du disque est le complément binaire des données réelles. Le secteur d'amorçage du MZ-80B est identifié par les octets marqueurs 03h suivis de IPLPRO au début du premier secteur, le distinguant des variantes MZ-80A (01h) et MZ-80K (01h).

Le MZ-80B a une capacité de disque légèrement supérieure à celle du MZ-80A, utilisant 40 cylindres, 2 têtes, 18 secteurs par piste, 256 octets par secteur (environ 368 Ko). La plupart des images de disque disponibles sont au format EDSK.

Utilisez samdisk pour convertir l’image EDSK en une image RAW plate :

  samdisk copy <MZ80B DISK NAME>.DSK <MZ80B DISK NAME>.RAW --cyls=40 --head=2 --sectors=18 --size=256

Appliquez la même inversion d’octets que pour le MZ-80A afin de convertir les données inversées au format standard :

  python3 -c "import sys; sys.stdout.buffer.write(bytes(~b & 0xFF for b in open('<MZ80B DISK NAME>.RAW','rb').read()))" > <MZ80B DISK NAME>_normal.RAW
Utilisez CPMTools avec un diskdef MZ-80B adapté pour lister et extraire les fichiers de l'image RAW traitée. Une fois extraits, copiez les programmes sur une image de disque au format MZ-80A pris en charge pour une utilisation avec le RFS, comme décrit dans la section Création d'un disque CP/M.
  # List files (adjust diskdef name to match your MZ-80B diskdef entry)
  cpmls -f mz80b <MZ80B DISK NAME>_normal.RAW

  # Extract all files
  cpmcp -f mz80b <MZ80B DISK NAME>_normal.RAW 0:*.* /output/directory/

Extraction des disques CP/M MZ800

Les ordinateurs de la série MZ800 utilisent un disque à format mixte, avec les pistes d'amorçage en données inversées et les pistes CP/M en données standard. Pire encore, l'ordre des pistes est tel qu'ils placent la tête 0 sur les pistes 0-39 et la tête 1 sur les pistes 40-79. Pour utiliser ces disques, il est préférable d'en extraire les données et de les copier dans l'un des formats que j'ai créés, car je ne vois aucun intérêt à ajouter du code supplémentaire pour prendre en charge cet étrange format.

Utilisez samdisk pour convertir l’EDSK (format Extended DSK créé pour la machine Amstrad CPC ; la plupart des disques MZ800 semblent être dans ce format) en une image RAW.

  samdisk copy <MZ800 DISK NAME>.DSK <MZ800 DISK NAME>.RAW --cyls=40 --head=2 --sectors=8 --size=256

Exécutez les commandes bash suivantes pour convertir le disque au format RAW obtenu ci-dessus en quelque chose que CPMTools peut lire.

   mv <MZ800 DISK NAME>.RAW workingfile.raw
   > total
   dd if=workingfile.raw of=total count=8192 bs=1
   for i in $(seq 8192 8192 327680); do 
     dd if=workingfile.raw of=blob skip=$i bs=1 count=4096
     cat blob >> total
     echo $i
   done
   for i in $(seq 12288 8192 327680); do
     dd if=workingfile.raw of=blob skip=$i bs=1 count=4096
     cat blob >> total
     echo $i
   done
   mv total <MZ800 DISK NAME>.RAW

Vous aurez besoin de la définition diskdefs suivante afin de lire les données de l’image RAW traitée.

   # Definition for the MZ800 CP/M Boot Disk. The reserved
   # track is in inverted data format but this is skipped in
   # CPM Tools.
   diskdef mz800-BOOT
     seclen 256
     tracks 80
     sectrk 16
     blocksize 2048
     maxdir 64
     skew 0
     boottrk 1
     os 2.2
   end

   # Definition for the MZ800 CP/M Data disk. No reserved tracks.
   diskdef mz800-DATA
     seclen 256
     tracks 80
     sectrk 16
     blocksize 2048
     maxdir 64
     skew 0
     boottrk 0
     os 2.2
   end

Archives CP/M

J’ai retiré les archives CP/M de Gitea, car ce n’est pas l’endroit approprié pour stocker/archiver des fichiers. Veuillez télécharger le fichier zip si vous en avez besoin et le décompresser dans votre répertoire /software.

Les fichiers de l’archive sont des programmes sélectionnés provenant de diverses archives CP/M et assemblés dans des répertoires suivant la convention de nommage CPM[0-9[0-9]_. Sont également inclus (avec tout le crédit et le (C) dus pour son travail d'assemblage de l'archive) des éléments de l'ordinateur MultiComp de Grant Searle, qui est un ensemble de plusieurs ordinateurs en un (ou plusieurs types de CPU), dont l'un des modes consiste à exécuter CP/M. L'archive de Grant est excellente et constitue une base idéale pour utiliser CP/M sur le MZ80A.

Pour construire les archives en un ensemble d’images de disquette de 1,4 Mo adaptées à une utilisation dans un lecteur 3,5” ou un émulateur de disquette, exécutez la commande :

cd <software>
tools/make_cpmdisks.sh

Les disques seront créés dans le répertoire : <CPM>/1M44/DSK.

Ce script construit également les images de lecteur de carte SD de 16 Mo à l’aide d’une combinaison des archives. La combinaison est codée en dur à l’intérieur du script.

Manuels CP/M

Manuel Description
Manuel utilisateur Manuel utilisateur de CP/M v2.2.
SID Guide utilisateur du Symbolic Instruction Debugger.
ED Guide utilisateur de l’éditeur (EDitor).
MAC Guide utilisateur du Macro Assembler.
ASM Guide utilisateur de l’assembleur Z80/8080.
DDT Guide utilisateur du Dynamic Debugging Tool.

Guide du développeur

Pour les développeurs souhaitant comprendre l'architecture interne de CP/M sur le Sharp MZ, modifier le CBIOS, ajouter de nouveaux formats de disque ou construire à partir des sources, un Guide du développeur CP/M complet est disponible. Il couvre la stratification CCP/BDOS/CBIOS, les plans mémoire des plateformes RFS et TZFS, les Disk Parameter Blocks, l'émulateur de terminal ANSI, les contrôleurs de stockage, le système de construction et le pipeline CI/CD.

Remerciements

Lorsque j’ai utilisé ou basé un composant sur la conception d’un tiers, j’ai inclus l’avis de copyright de l’auteur original dans les en-têtes ou rendu crédit en conséquence. Tous les logiciels tiers, à ma connaissance et selon mes recherches, sont open source et librement utilisables ; si un composant s’avère soumis à des restrictions de licence, il sera retiré de ce dépôt et un lien/configuration approprié sera fourni.

Licences

Cette conception, matériel et logiciel, est sous licence GNU Public Licence v3.

La Licence Publique Générale GNU v3

Les fichiers source et binaires de ce projet marqués comme GPL v3 sont des logiciels libres : vous pouvez les redistribuer et/ou les modifier selon les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation, soit la version 3 de la Licence, soit (à votre choix) toute version ultérieure.

Les fichiers source sont distribués dans l’espoir qu’ils seront utiles, mais SANS AUCUNE GARANTIE ; sans même la garantie implicite de QUALITÉ MARCHANDE ou d’ADÉQUATION À UN USAGE PARTICULIER. Voir la Licence Publique Générale GNU pour plus de détails.

Vous devriez avoir reçu une copie de la Licence Publique Générale GNU avec ce programme. Si ce n’est pas le cas, voir http://www.gnu.org/licenses/.