CP/M v2.23
Vue d'ensemble
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 :
- À 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é
- 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).
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.
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
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. |
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. |
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
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 |
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é)
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
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
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
| 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 |
Création d'un disque CPM
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
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/
Extraction des disques CP/M MZ80K
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
# 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
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
# 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
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
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]_
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
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/.