CP/M v2.23

Panoramica

Linux e Windows sono ormai i sistemi operativi di riferimento in uso sui microcomputer, ma anni fa tutto inizio con Digital Research che creo il Control Program/Monitor (CP/M). Il CP/M fu uno dei primi veri sistemi operativi per microcomputer, fornendo un mezzo comune per eseguire applicazioni su hardware diverso. Qualsiasi macchina che esegue CP/M ha accesso a migliaia di programmi e cosi inizio la ricerca di far girare il CP/M sullo Sharp MZ80A.

Una versione del CP/M fu creata da Micro Technology per lo Sharp MZ80A, ma poiche' era priva di uno schermo a 80 colonne, non era molto utile senza un upgrade. Una ricerca mostro che terze parti come Kuma svilupparono un upgrade a 80 colonne che si poteva poi reperire dal SUC, ma il CP/M sull'MZ80A, sebbene menzionato in molti articoli, e in realta piuttosto difficile da ottenere nel 2020. Vari siti eccellenti come original.sharpmz.org offrono le versioni 80K/80B/800 ma non quella per l'MZ80A.

Ho sviluppato la scheda upgrade colore a 80 colonne e il Rom Filing System con l'obiettivo primario di realizzare il CP/M sull'MZ80A. E molto facile, nel progetto dell'emulatore hardware basato su FPGA, aggiungere modifiche per supportare varie uscite a colonne, colore o grafica, ma farlo sull'hardware originale apportando modifiche minime a una macchina d'epoca era una sfida maggiore e anche un desiderio personale da quando possiedo questa macchina dal 1983. La maggior parte degli upgrade che si vedono dal passato richiede tagli e ponticelli sul PCB originale, cosa che specificamente non volevo: voglio mantenere l'hardware originale come Sharp lo ha realizzato! L'unica modifica che apporto nei miei upgrade al PCB originale e mettere su zoccolo un chip (IC8 74LS165, registro a scorrimento video) che potrebbe essere facilmente fatto in caso di guasto durante l'uso e di sostituzione: in questo modo la macchina e al 100% originale e puo' essere riportata molto facilmente allo stato di fabbrica originale.

Cosi iniziai a cercare di far funzionare il CP/M, e anche con una marea di informazioni in rete non fu un compito facile. Innanzitutto, ottenere la versione del CP/M di Micro Technology per l'MZ80A si rivelo molto difficile, quindi ripiegai sulle versioni MZ80K e MZ80B. Mi imbattei poi nei vari formati di disco anomali, con l'MZ80A progettato per leggere dati invertiti ad aggiungersi alla mischia. Per farla breve, alla fine decisi di scrivere la mia versione su rom del CBIOS fondendola con il BDOS+CCP del CP/M v2.23. Questa sezione illustra di conseguenza le informazioni su questo lavoro.

Processo di Avvio del CP/M

L’avvio del CP/M avviene in due fasi:

  1. Usando il software di controllo Floppy Disk AFI originale, leggere un settore di boot invertito, verificare che contenga a 0x0000 il codice di controllo 0x02 + “IPLPRO”, quindi passare il controllo al boot loader incapsulato
  2. Caricare, a partire da 0x9C00, il CCP, il BDOS e il CBIOS. Il CBIOS prende ora il controllo e applica un formato di disco diverso e usa una logica del controller FDC diversa (cioe’ re-inverte i dati).
A tal fine ho disassemblato la ROM AFI dell'MZ80A (che si trova nel repository) per capire quali azioni stesse eseguendo. Il caricamento iniziale verifica se il disco e un disco avviabile sotto l'MZ80A. Per l'MZ80K il marcatore di un disco avviabile (oltre al formato molto diverso e al non invertire i dati) era 01 + IPLPRO nei byte iniziali del primo settore. Per l'MZ80B era 03 + IPLPRO.

Poiche' non avevo una copia MZ80A del CP/M, provai a far caricare la versione MZ80K, ma i dati non invertiti significavano che dovevo convertire un disco di boot MZ80K in un formato MZ80A. Una volta fatto questo, provai ad avviare il CP/M ma c'erano incompatibilita, per esempio il controller del disco!! Trascorsi poi del tempo a esaminare le versioni MZ80B e MZ800 del CP/M di Micro Technologies, che di nuovo usavano formati di disco differenti, e alla fine decisi che l'approccio migliore sarebbe stato costruire un CP/M personalizzato e scrivere il mio CBIOS.


Aggiornamento — supporto diretto dei dischi MZ-80K: il boot loader CP/M dell'RFS e il CBIOS ora rilevano automaticamente il formato originale dei dischi MZ-80K, quindi non e piu necessario convertire prima i dischi MZ-80K nel formato MZ-80A. Quando si avvia tramite la scheda MZ80AFI, il controller riporta la dimensione del settore presente sul disco (128 byte per un disco MZ-80K, 256 byte per un disco MZ-80A). Un disco da 128 byte, non invertito, che contiene il marcatore 01h + IPLPRO viene riconosciuto come disco CP/M MZ-80K: le tracce di sistema riservate vengono caricate in ordine e il controllo viene passato al boot loader incapsulato (JP 09803H). Una volta in esecuzione, i dischi CP/M originali MZ-80K vengono montati direttamente in lettura come unita CP/M C: e D:, insieme alle unita su scheda SD e ROM. Questo funziona su un vero MZ-80A dotato della scheda MZ80AFI, e sul picoZ80 con la persona MZ-80A o la nuova persona MZ-80K dotata di un'interfaccia MZ80AFI.

CBIOS

Il CP/M e costruito a partire da 3 moduli distinti, CCP (Console Command Processor), BDOS (Basic Disk Operating System) e CBIOS (Custom Basic Input Output System). Generalmente CCP + BDOS sono standard e il CBIOS e personalizzato in base all'hardware sottostante.

Tutti e 3 i componenti vengono caricati in fase di bootstrap dal floppy disk, caricati in memoria (0x9C00 per l'MZ80K/A) e il controllo passa al CBIOS che configura la macchina prima di passare il controllo al CCP. In normali condizioni di lavoro, qualsiasi applicazione caricata chiamerebbe il BDOS per eseguire servizi come scrivere sulla console, ottenere l'input da tastiera, l'accesso al disco ecc. tramite un'API ben definita, ma se non avesse bisogno dei servizi del BDOS potrebbe chiamare il CBIOS direttamente usando la sua API e a sua volta potrebbe usare la RAM del CCP+BDOS per ottenere piu spazio per il programma. Quando un'applicazione termina, salta al vettore 0x0000 avviando un Warm start che comporta il ricaricamento del CCP+BDOS.

Il modo in cui il CPM e scritto non si presta a essere memorizzato in ROM poiche' si auto-modifica/usa variabili incorporate, ma per il CBIOS e una storia diversa. E possibile collocare il CBIOS in ROM per ottenere piu RAM e, avendo accesso al Rom Filing System con i suoi banchi ROM paginati, questa e la strada che ho intrapreso.

Per creare un CBIOS occorre fornire i seguenti metodi API:

Metodo API Descrizione
BOOT Cold start, inizializza tutto l’hardware prima dell’invocazione del CCP.
WBOOT Warm start, ripristina eventuali modifiche hardware e poi ricarica CCP+BDOS prima dell’invocazione del CCP.
CONST Console Status, verifica se l’inserimento di un tasto della tastiera e in attesa di essere letto.
CONIN Console Input, preleva un tasto dalla tastiera, attendi se non disponibile.
CONOUT Console Output, invia un carattere allo schermo.
LIST List Device Output, invia un carattere al dispositivo di stampa (cioe’ la stampante).
PUNCH Punch Device Output, invia un carattere al dispositivo di perforazione (gia’, negli anni ‘70 si usavano nastri o schede perforate)!
READER Reader Input, leggi un carattere dal dispositivo Reader (cioe’ nastro perforato)!
HOME Sposta la testina del disco attualmente selezionato alla Traccia 0.
SELDSK Seleziona/attiva un disco.
SETTRK Imposta la traccia del disco per la successiva operazione di lettura/scrittura.
SETSEC Imposta il settore del disco sulla traccia selezionata per la successiva operazione di lettura/scrittura.
SETDMA Imposta il Disk Memory Address, la posizione dove i dati saranno letti/memorizzati.
READ Leggi un settore del disco.
WRITE Scrivi un settore del disco.
LISTST List Device Status, verifica se il dispositivo di stampa e pronto ad accettare un nuovo carattere.
SECTRN Sector Translate, traduzione del settore da Logico a Fisico per adattarsi a hardware specifico o migliorare la reattivita del sottosistema disco.
Sembra un requisito semplice, ma poi bisogna considerare che una macchina come l'MZ80A non ha un proprio BIOS e il firmware nella sua ROM, quando gira sotto CP/M, viene rilocato a 0xC000 ed e quindi inutilizzabile. Inoltre il firmware di controllo del Floppy e molto basilare e si occupa solo del bootstrap di un disco.

Un ulteriore requisito, oltre ai meccanismi di base per l'input/output di caratteri forniti dal CP/M, e che la maggior parte delle applicazioni si aspetta che davanti alla macchina CP/M sia presente uno Smart Terminal per fornire funzionalita avanzate di schermo e tastiera. Questo sarebbe normalmente sotto forma di un terminale come un DEC VT52 o VT100. Poiche' l'MZ80A ha il proprio schermo e la propria tastiera, questa funzionalita intelligente deve essere scritta.

Quindi, per scrivere il CBIOS, occorre programmare i seguenti sotto-moduli del firmware:

Sotto-Modulo Descrizione
Basic Screen I/O Le funzioni di basso livello per posizionare un carattere sullo schermo, pulire lo schermo ecc.
Advanced Screen I/O Intelligenza per posizionare l’output a video, pulire porzioni dello schermo, attributi speciali come il Grassetto ecc.
Keyboard I/O Scansiona e restituisce i keycode, mappa in ASCII secondo necessita.
Disk I/O Fornisce le funzioni per leggere e scrivere piu settori del disco.
Avendo precedentemente disassemblato il monitor Sharp SA-1510, avevo una buona posizione di partenza per fornire le funzioni di base di Schermo e Tastiera; il disassemblaggio del firmware Floppy Disk AFI ha fornito una visione del codice necessario per leggere un floppy disk, in particolare delle sue carenze. L'MZ80A e un computer a 2MHz e non ha la velocita per gestire il flusso di input/output del disco, deve affidarsi a un pezzo di hardware che pagina un banco ROM in base al segnale Data Request/Ready dell'FDC. Quindi i componenti FDC hanno richiesto un lavoro significativo. Per l'Advanced Screen I/O, ho deciso di usare lo standard ANSI e ho reperito l'Amstrad CPC Terminal Emulator di Ewen McNeill. Inizialmente pensavo che sarebbe stata una semplice estrazione e integrazione del suo parser ANSI, ma si rivelo un'enorme quantita di lavoro. A volte l'opzione piu facile e la piu difficile!!

Tutta questa funzionalita occupa spazio ed e stata ripartita come segue:

ROM Indirizzo Descrizione
MROM 4K (Monitor ROM rilocata da 0x0000 - 0x0FFF) 0xC000 - 0xCFFF CBIOS che fornisce l’API CP/M, le routine di inizializzazione, le routine del controller ROM Disk, le routine di interrupt.
ROM paginata 2K 0xE800 - 0xEFFF, Bank 12 Funzionalita di base per Suono e Melodia, RTC, Tastiera e ausiliarie.
ROM paginata 2K 0xE800 - 0xEFFF, Bank 13 Screen I/O e Parser Terminale ANSI.
ROM paginata 2K 0xE800 - 0xEFFF, Bank 14 Funzionalita del controller della scheda SD.
ROM paginata 2K 0xE800 - 0xEFFF, Bank 15 Funzionalita del controller Floppy Disk.

Unita Disco CPM

Poiche' questa implementazione di CPM e Custom BIOS usa 3 controller di unita disco diversi, alcuni dei quali potrebbero non essere presenti in un dato momento, le unita vengono create dinamicamente all'interno del CPM durante il cold boot.

L’ordinamento delle unita e mostrato nella tabella seguente. I dischi CP/M originali MZ-80K (e MZ-80A) letti tramite la scheda MZ80AFI appaiono come le unita Floppy Disk in questa tabella — tipicamente C: e D: quando sono presenti anche un’unita ROM e/o una scheda SD.

Rom Drive # Presente 0 1 2 Presente 0 1 2
Rom Drive n/a   A A,B n/a   A A,B
Floppy Disk Si’ A,B B,C C,D No      
SD Card Si’ C,D,E,F D,E,F E,F,G Si’ A,B,C,D,E B,C,D,E C,D,E,F
SD Card No       Si’      
Il limite al numero di unita e dato dal CPM (limite di 16 unita) e dalla quantita di RAM allocata alle unita, governata dalla variabile 'CSVALVEND - CSVALVMEM' che e impostata nel file CPM_Definitions.asm nel repository. L'allocazione delle unita e dinamica, quindi piu memoria allocata si tradurra in piu unita disponibili. La scheda SD puo contenere centinaia di unita disco SD da 16MB, quindi il problema e puramente la RAM assegnata al loro uso.

Caratteristiche

Oltre alla funzionalita BIOS standard, le seguenti caratteristiche sono state aggiunte al CBIOS.

  • Real Time Clock con granularita di 50mS
  • Tastiera pilotata da interrupt con buffer e ripetizione automatica.
  • Blocco tasti tri-modale, Normal, Caps Lock, Shift Lock
  • Funzionalita Terminale ANSI
  • Unita Floppy Disk riassegnabili di dimensione 1.44M, 720K e 320K
  • Avvio e lettura diretti di dischi CP/M originali (non convertiti) MZ-80K tramite la scheda MZ80AFI, rilevati automaticamente in base alla dimensione del settore e montati come unita C:/D:
  • Unita ROM riassegnabili di dimensione 240K (modificabile tramite config)
  • Hard disk su scheda SD da 16Mb riassegnabili.
  • Uscita al Monitor tramite SHIFT+GRAPH+BREAK.

Configurazione e compilazione automatizzate (consigliato)

CP/M per RFS viene assemblato e pacchettizzato come parte della normale compilazione di RFS, quindi il modo piu' semplice per produrre il CBIOS, l'applicazione MZF CP/M e le immagini disco CP/M e lo script di configurazione automatizzata per la propria piattaforma. Ogni script e autonomo — e sufficiente copiare il singolo file per il proprio OS ed eseguirlo. Installa i prerequisiti, clona il repository RFS, scarica il bundle di contenuti da ~110 MB (RFS_Files.zip, che include il software CP/M) e puo' eseguire la prima compilazione per voi, senza richiedere una conoscenza approfondita della toolchain. I passaggi manuali, strumento per strumento, piu' in basso sono destinati agli utenti avanzati e alle ricompilazioni parziali.
Script Piattaforma Note
setup_RFS.sh macOS / Linux / WSL Installa un JRE Java (assemblatore GLASS), una toolchain C + make (per compilare il sottomodulo cpmtools incluso), perl, git, unzip, curl e (su macOS) GNU coreutils. La prima compilazione e ./build.sh -m.
setup_RFS_windows_native.ps1 Windows 10 / 11 — nativo, senza WSL (consigliato) Usa winget per installare Git for Windows e un JRE Temurin 17, quindi compila tramite Git Bash. Nessun compilatore C necessario — i precompilati tools\cpmcp.exe e tools\sdtool.exe sono inclusi.
setup_RFS_windows.ps1 Windows 10 / 11 — tramite WSL2 / Ubuntu Installa WSL2 + Ubuntu se assenti (riavvio una tantum), quindi esegue setup_RFS.sh all’interno di Ubuntu.

macOS / Linux / WSL — setup_RFS.sh

chmod +x setup_RFS.sh
./setup_RFS.sh

Windows 10 / 11 (nativo — consigliato) — setup_RFS_windows_native.ps1, da un prompt PowerShell:

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

Windows 10 / 11 (tramite WSL2) — setup_RFS_windows.ps1, da una PowerShell come Amministratore:

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

Gli script rispettano le variabili d’ambiente RFS_REPO_URL (predefinito https://git.eaw.app/eaw/RFS.git) e RFS_FILES_URL (posizione del bundle di contenuti) per sovrascrivere i prompt interattivi. La compilazione scrive le immagini Monitor/User ROM (con il CBIOS CP/M e l’applicazione MZF CP/M incorporati) e l’immagine della scheda SD contenente le immagini disco CP/M nella directory roms/. Per la procedura completa passo passo, vedere la Guida tecnica RFS — Sistema di build.


Compilazione del CPM

La compilazione del CP/M comporta l'assemblaggio del sorgente in linguaggio Assembly Z80 in un binario in codice macchina e quindi la creazione di un disco di boot oppure, nel caso di questa implementazione, un CBIOS basato su ROM e una applicazione avviabile in formato MZF memorizzata in ROM.

Per realizzarlo servono diversi strumenti e al momento e un processo piuttosto manuale.

Percorsi

Per facilitare la lettura, le seguenti abbreviazioni si riferiscono al corrispondente percorso in questo capitolo.

Nome Breve  
[<ABS PATH>] Il percorso dove questo repository e stato estratto sul tuo sistema.
<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

Strumenti

Tutto lo sviluppo e stato fatto sotto Linux, in particolare Debian/Ubuntu. Uso Windows per programmare le RAM e per usare la versione GUI dei CP/M Tools, ma non ho dedicato tempo a compilare l'RFS sotto Windows. A tempo debito creero un'immagine Docker con tutti gli strumenti necessari installati, ma nel frattempo, per assemblare il codice Z80, i programmi C e lavorare con il software CP/M e le immagini dei dischi CP/M, dovrai procurarti e installare i seguenti strumenti.

Z80 Glass Assembler - Un assemblatore Z80 per convertire i file Assembly in codice macchina.
samdisk - Uno strumento multi-OS a riga di comando per la manipolazione di dischi a basso livello.
cpmtools - Uno strumento multi-OS a riga di comando per la manipolazione di dischi CP/M.
CPMToolsGUI - Uno strumento GUI per Windows per la manipolazione di dischi CP/M.
z88dk - Un eccellente kit di sviluppo C per la CPU Z80.
sdcc - Un altro eccellente Small Device C compiler, lo Z80 e uno dei suoi target. z88dk fornisce una versione migliorata (per lo Z80) di questo strumento all’interno del suo pacchetto.

Software

La compilazione delle immagini software puo essere fatta clonando il repository ed eseguendo alcuni degli script shell e dei binari forniti.

Script Descrizione
assemble_cpm.sh Uno script shell per compilare il binario CPM, l’applicazione CPM in formato MZF da caricare tramite RFS e le unita ROM CPM 0 e 1
assemble_rfs.sh Uno script bash per compilare le immagini ROM del Rom Filing System.
assemble_roms.sh Uno script bash per compilare tutte le ROM standard dell’MZ80A, come la ROM del monitor SA-1510.
make_roms.sh Uno script bash per compilare le ROM RFS adatte alla programmazione nelle Flash RAM da 512KByte. Queste immagini contengono le ROM RFS bancate, le varie ROM di sistema come la SA-1510 e tutti i programmi MZF da caricare tramite l’RFS.
make_cpmdisks.sh Uno script bash per costruire un set di dischi CPM, da usare come immagini Raw nella scheda SD o nelle unita ROM e come CPC Extended Disk Format da usare in un emulatore di floppy disk o da copiare su supporto fisico.
make_sdcard.sh Uno script bash per creare un’immagine della scheda SD combinando l’immagine RFS e diverse unita disco CPM. Questa immagine viene poi copiata in modalita binaria sulla scheda SD e installata nel lettore di schede SD dell’RFS.
mzftool.pl Uno script perl per creare/estrarre e manipolare immagini MZF.
processMZFfiles.sh Uno script bash per convertire un set di programmi MZF in immagini settorizzate adatte all’uso nelle ROM del Rom Filing System.
sdtool Un binario creato nel repository src/tools che costruisce l’immagine della scheda SD RFS, creando una directory e aggiungendo applicazioni MZF/Binarie nell’immagine dell’unita.

Il sistema CP/M e costruito in 4 parti,

1. il cpm22.bin che contiene il CCP, il BDOS e uno stub del CBIOS.
2. il CBIOS bancato che ha il suo sorgente primario in una ROM da 4K e 4 ROM bancate da 2K. Questi
   sono generati per essere aggiunti alla Banked Monitor ROM dell'RFS e alla Banked User ROM.
3. fino a 2 (attualmente) unita ROM CP/M in sola lettura che possono essere assegnate a qualsiasi lettera
   di unita CP/M.
4. conversione dei binari generati al punto 1. e 3. in immagini MZF settorizzate adatte
   all'aggiunta diretta nel Rom Filing System come un qualsiasi altro programma.

Tutto quanto sopra e codificato nello script bash assemble_cpm.sh che puo essere eseguito come segue:

cd <software>
tools/assemble_cpm.sh

Lo script e attualmente impostato per generare 1 unita ROM CPM in sola lettura. Per aggiungere una seconda unita ROM CPM, segui queste istruzioni:

1. Modifica lo script <tools>/make_cpmdisks.sh e cambia la
   variabile:
   da BUILDCPMLIST="cpm22 CPM_RFS_1"
   a  BUILDCPMLIST="cpm22 CPM_RFS_1 CPM_RFS_2"

   cambia la variabile:
   da 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*" a
   a  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. Crea una directory (se non esiste): 
   <CPM>/CPM_RFS_2

3. Riempi la directory con i file CPM richiesti da collocare nella ROM.

4. Costruisci l'immagine eseguendo lo script make_cpmdisks.sh o come parte della sequenza di comandi elencata sotto.

Per usare il CPM, e necessario creare le immagini MonitorROM e USERROM che possono essere programmate nelle 2x512KByte Flash RAM. Esegui i seguenti comandi per compilare il CPM insieme a tutto l’RFS, le ROM e le applicazioni in 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

L’output dei comandi sopra sono le immagini ROM <roms>/MROM_256.bin e <roms>/USER_ROM.256.bin che devono essere programmate nelle Flash RAM da 512Kbyte e inserite negli zoccoli sull’ adattatore RFS.

Le immagini dei dischi CPM si trovano in <CPM>/1M44/RAW per le immagini raw o in <CPM>/1M44/DSK per le immagini dei dischi in formato CPC Extended. Queste immagini sono costruite dalle directory in <CPM>, ogni directory che inizia con CPM* viene impacchettata in un’immagine di unita da 1.44MB. NB. Inoltre, le directory sono anche impacchettate in tutti gli altri dischi supportati come immagini in una directory corrispondente, cioe’ <CPM>/SDC16M per l’immagine dell’unita scheda SD da 16MB.

L’immagine della scheda SD si trova in <roms>/SHARP_MZ80A_RFS_CPM_IMAGE_1.img che contiene l’immagine del disco RFS <roms>/SHARP_MZ80A_RFS_IMAGE_1.img all’inizio seguita da sette immagini di unita in formato CPM che, come sopra, sono memorizzate in <CPM>/SDC16M/RAW. Queste immagini sono costruite dalle directory in <CPM> ma vengono aggiunte manualmente nelle immagini finali codificando il tutto nello script make_cpmdisks.sh.

Le applicazioni memorizzate nelle unita ROM si trovano nella directory <MZF>. Copia in questa directory tutte le applicazioni che desideri, quindi esegui il seguente comando per elaborarle in immagini arrotondate al settore memorizzate nella directory <MZB>.

cd <software>
tools/processMSFfiles.sh

Le applicazioni effettive che vengono integrate nella ROM sono selezionate nello script <tools>/make_roms.sh. Questo script elenca tutte le applicazioni richieste e ne impacchettera tante quante lo spazio permette nella ROM. Per assicurarti che la tua applicazione appaia in ROM, aggiungila in cima alla lista (solo il nome del file, non l’estensione .MZF), cioe’:

Modifica il file <tools>/make_roms.sh
Individua la riga: ROM_INCLUDE=
Sotto questa riga, aggiungi la tua applicazione nel formato: ROM_INCLUDE+="${MZBPATH}/<LA TUA APPLICAZIONE>.${SECTORSIZE}.bin"
cioe' ROM_INCLUDE+="${MZB_PATH}/A-BASIC_SA-5510.${SECTORSIZE}.bin:"
Salva il file ed esegui i comandi sopra per compilare la MonitorROM e le USERROM.

Formati di Disco

Come ho scoperto, ci sono centinaia di formati di disco CP/M e la sola serie Sharp ne implementa 2-3 per macchina. Nel decidere quale formato usare per questa implementazione del CP/M ho esaminato i formati esistenti. Non avendo accesso a dischi Sharp MZ80A originali e dato che comunque sono in formato invertito non standard, essendo l’MZ80B simile all’MZ80A ma con capacita leggermente superiore, l’MZ800 un ibrido e l’MZ80K a bassa capacita, ho optato per usare i formati standard per Floppy da 1.44MB, 720K da 3.5”, lo stesso formato fisico dei dischi Sharp MZ80A e l’unita ROM da 240K basata su ROM.

I formati che uso possono essere manipolati da cpmtools usando le seguenti definizioni diskdefs, inserisci quanto sopra nel file diskdefs posizionato insieme a cpmtools o CPMToolsGUI per l’uso:

   # 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   
All'interno del CP/M questi formati di disco fisici sono rappresentati nel disk parameter block come segue. Normalmente non c'e bisogno di preoccuparsi di queste impostazioni o dei diskdefs sopra, ma e utile saperlo se devi aggiungere il tuo formato personalizzato:
Definizione 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
Per usare i programmi CP/M Sharp esistenti sara necessario estrarre i programmi dal disco e aggiungerli a un formato riconosciuto da questa implementazione. A tal fine, le seguenti sezioni descrivono come estrarre i dati dai dischi delle rispettive macchine.

Creazione di un Disco CPM

Nel mio sviluppo ho usato un Lotharek HxC Floppy Emulator collegato a una scheda di interfaccia Sharp MZ80-AFI. Usando questa configurazione e possibile emulare qualsiasi unita disco con cui il Sharp MB8866 Floppy Disk Controller possa comunicare. E cosi che sono arrivato a e ho testato i formati 3.5", poiche' queste unita sono ancora reperibili e hanno capacita sufficiente per la maggior parte delle operazioni CP/M.

Per creare un disco CP/M utilizzabile sullo Sharp MZ80A con questa implementazione del CP/M, devi aggiungere le definizioni di cui sopra al tuo file diskdefs di cpmtools. Una volta aggiunte, copia una delle immagini vuote in \<CPM\>/BLANKFD con un nuovo nome e usala come disco di destinazione oppure creane una dall'interno di CPMTools usando la disk definition. Quindi aggiungi i programmi richiesti al nuovo disco, cosa che in CPMToolsGUI e una semplice procedura di drag and drop.

Per usare la nuova immagine CP/M raw nel Floppy Emulator o in un vero floppy disk drive, e necessario convertire l'immagine raw in un formato che la maggior parte degli strumenti per floppy disk possa leggere e scrivere su un floppy. Nel caso del Lotharek Floppy Emulator, usando il loro strumento HxCFloppyEmulator v2.2.2.1 tramite Load e Export to HFE si genera un'immagine SD adatta a imitare un vero floppy.

Per convertire l’immagine, usa uno dei seguenti:

Per le unita da 1.44MB usa:
./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 riconoscera automaticamente il formato dalla dimensione del file, cioe' 1474560 byte

Per le unita da 720K usa:
./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 riconoscera automaticamente il formato dalla dimensione del file, cioe' 737280 byte

Per le unita MZ80A da 320K usa:
./samdisk copy CPM00_320K_SYSTEM.RAW CPM00_320K_SYSTEM.DSK --cyls=40 --gap3=78 --head=2 --sectors=16
Samdisk riconoscera automaticamente il formato dalla dimensione del file, cioe' 327680 byte

L'unita ROM RFS non necessita di conversione, la funzionalita RFS presuppone un'immagine raw.

NB. Non usare Samdisk v4, ha un bug per cui colloca un settore casuale all'inizio del disco. Molte ore di debug sono andate perse a causa di questo bug. Meglio usare
samdisk v3.8.8

I comandi samdisk sopra creano un’immagine in formato Amstrad CPC Extended DSK che puo essere letta ed elaborata da Lotharek HxCFloppyEmulator o dagli strumenti usati per scrivere floppy disk fisici.

Estrazione di Dischi CP/M MZ80A

Lo Sharp MZ-80A memorizza i dati del floppy disk in formato invertito — ogni byte sul disco e il complemento bit a bit del byte di dati effettivo. Questa e una caratteristica hardware del controller floppy disk dell'MZ-80A e significa che le immagini disco raw non possono essere lette direttamente da CPMTools senza prima invertire ogni byte.

La maggior parte delle immagini disco CP/M MZ-80A disponibili online sono in formato EDSK (Amstrad CPC Extended DSK). La geometria del disco e 40 cilindri, 2 testine, 16 settori per traccia, 256 byte per settore (320KB totali).

Usa samdisk per convertire l’immagine EDSK in un’immagine RAW piatta:

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

Esegui il seguente comando per invertire ogni byte nell’immagine RAW, convertendo il formato invertito dell’MZ-80A in dati standard che CPMTools puo elaborare:

  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

Usa il diskdef MZ80A-A (definito nella sezione delle disk definitions sopra) con CPMTools per elencare ed estrarre i file dall’immagine elaborata:

  # 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/
Una volta estratti, i programmi possono essere collocati su una nuova immagine disco in uno dei formati supportati da questa implementazione del CP/M (MZ80A-1440, MZ80A-720, MZ80A-A o mz80a-rfs) usando CPMTools, e poi convertiti in un'immagine per floppy emulator con samdisk come descritto nella sezione Creazione di un Disco CP/M sopra. Si noti che quando si riscrive su un disco fisico in formato MZ-80A l'inversione dei byte deve essere applicata al contrario.

Estrazione di Dischi CP/M MZ80K

Lo Sharp MZ-80K usa dati standard (non invertiti) sui suoi floppy disk, quindi non e richiesta alcuna inversione di bit. Tuttavia il formato del disco e diverso da quello dell'MZ-80A e ha capacita inferiore — l'MZ-80K fu progettato attorno a unita single-density single-sided da 5.25". Il settore di boot di un disco CP/M MZ-80K e identificato dai byte marcatori 01h seguiti dalla stringa ASCII IPLPRO all'inizio del primo settore.

Le immagini disco CP/M MZ-80K sono tipicamente disponibili in formato EDSK o raw. La geometria del disco e 40 cilindri, 1 testina, 18 settori per traccia, 128 byte per settore (circa 90KB).

Usa samdisk per estrarre l’immagine raw da una sorgente EDSK:

  samdisk copy <MZ80K DISK NAME>.DSK <MZ80K DISK NAME>.RAW --cyls=40 --head=1 --sectors=18 --size=128
Non e necessaria alcuna inversione dei byte. Puoi leggere l'immagine RAW direttamente con CPMTools usando un diskdef adatto al formato MZ-80K. Il percorso tramite CPMTools mostrato qui rimane utile per archiviare il contenuto dei dischi o per trasferire i file verso uno dei formati MZ-80A supportati nativamente (come MZ80A-1440 o MZ80A-720). Si noti, tuttavia, che il CBIOS CP/M dell'RFS ora puo anche leggere direttamente i dischi CP/M originali MZ-80K tramite la scheda MZ80AFI (vedere Processo di Avvio del CP/M sopra) — il disco viene rilevato automaticamente in base alla dimensione del settore di 128 byte e montato come unita CP/M (tipicamente C:/D:), quindi per l'uso quotidiano su hardware reale o sul picoZ80 i dischi non devono piu essere convertiti prima.
  # 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/

Estrazione di Dischi CP/M MZ80B

Lo Sharp MZ-80B, come l'MZ-80A, memorizza i dati del floppy disk in formato invertito — ogni byte sul disco e il complemento bit a bit dei dati effettivi. Il settore di boot dell'MZ-80B e identificato dai byte marcatori 03h seguiti da IPLPRO all'inizio del primo settore, distinguendolo dalle varianti MZ-80A (01h) e MZ-80K (01h).

L'MZ-80B ha una capacita di disco leggermente superiore all'MZ-80A, usando 40 cilindri, 2 testine, 18 settori per traccia, 256 byte per settore (circa 368KB). La maggior parte delle immagini disco disponibili sono in formato EDSK.

Usa samdisk per convertire l’immagine EDSK in un’immagine RAW piatta:

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

Applica la stessa inversione dei byte usata per l’MZ-80A per convertire i dati invertiti in formato 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
Usa CPMTools con un diskdef MZ-80B adatto per elencare ed estrarre i file dall'immagine RAW elaborata. Una volta estratti, copia i programmi su un'immagine disco in formato MZ-80A supportato per l'uso con l'RFS come descritto nella sezione Creazione di un Disco 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/

Estrazione di Dischi CP/M MZ800

I computer della serie MZ800 usano un disco in formato misto con le tracce di boot che usano dati invertiti e le tracce CP/M che usano dati standard. A peggiorare le cose, l'ordinamento delle tracce e tale che mettono la testina 0 come tracce 0-39 e la testina 1 come tracce 40-79. Per usare questi dischi, e meglio estrarre i dati e copiarli in uno dei formati che ho creato, poiche' non vedo motivo di aggiungere codice extra per accomodare questo strano formato.

Usa samdisk per convertire l’EDSK (Extended DSK, formato creato per la macchina Amstrad CPC, la maggior parte dei dischi MZ800 sembra essere in questo formato) in un’immagine RAW.

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

Esegui i seguenti comandi bash per convertire il disco in formato RAW ottenuto sopra in qualcosa che possa essere letto da CPMTools.

   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

Avrai bisogno della seguente definizione diskdefs per leggere i dati dall’immagine RAW elaborata.

   # 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

Archivi CP/M

Ho rimosso gli archivi CP/M da Gitea poiche’ non e il posto per memorizzare/archiviare file. Per favore scarica il file zip se ti servono e scompattalo nella tua directory /software.

I file nell’archivio sono programmi selezionati e provengono da vari archivi CP/M e sono raccolti in directory con la convenzione di denominazione CPM[0-9[0-9]_. E incluso anche (con il dovuto credito e (C) per il suo lavoro nell'assemblare l'archivio) il computer MultiComp di Grant Searle, che e piu computer in uno (o piu tipi di CPU) e una delle sue modalita e l'esecuzione del CP/M. L'archivio di Grant e eccellente e una base ideale per usare il CP/M sull'MZ80A.

Per costruire gli archivi in un set di immagini Floppy da 1.4MB adatte all’uso in un’unita da 3.5” o in un Floppy Emulator, esegui il comando:

cd <software>
tools/make_cpmdisks.sh

I dischi saranno creati nella directory: <CPM>/1M44/DSK.

Questo script costruisce anche le immagini delle unita su scheda SD da 16MB usando una combinazione degli archivi. La combinazione e codificata all’interno dello script.

Manuali CP/M

Manuale Descrizione
User Manual Manuale Utente del CP/M v2.2.
SID Guida Utente del Symbolic Instruction Debugger.
ED Guida Utente dell’EDitor.
MAC Guida Utente del Macro Assembler.
ASM Guida Utente dell’Assembler Z80/8080.
DDT Guida Utente del Dynamic Debugging Tool.

Guida dello Sviluppatore

Per gli sviluppatori che vogliono comprendere l'architettura interna del CP/M sullo Sharp MZ, modificare il CBIOS, aggiungere nuovi formati di disco o compilare dal sorgente, e disponibile una completa Guida dello Sviluppatore CP/M. Copre la stratificazione CCP/BDOS/CBIOS, le mappe di memoria per entrambe le piattaforme RFS e TZFS, i Disk Parameter Block, l'emulatore di terminale ANSI, i controller di storage, il sistema di build e la pipeline CI/CD.

Riconoscimenti

Dove ho utilizzato o basato qualsiasi componente sul design di terze parti, ho incluso l'avviso di copyright dell'autore originale nelle intestazioni o dato il dovuto credito. Tutto il software di terze parti, per quanto ne so e secondo le mie ricerche, e open source e liberamente utilizzabile. Se si dovesse scoprire che un componente e soggetto a restrizioni di licenza, verra rimosso da questo repository e verra fornito un link/configurazione appropriata.

Licenze

Questo progetto, hardware e software, e concesso in licenza sotto la GNU Public Licence v3.

La Licenza Pubblica Generale GNU v3

I file sorgente e binari in questo progetto contrassegnati come GPL v3 sono software libero: puoi ridistribuirli e/o modificarli secondo i termini della Licenza Pubblica Generale GNU come pubblicata dalla Free Software Foundation, sia la versione 3 della Licenza, sia (a tua scelta) qualsiasi versione successiva.

I file sorgente sono distribuiti nella speranza che siano utili, ma SENZA ALCUNA GARANZIA; senza nemmeno la garanzia implicita di COMMERCIABILITA o IDONEITA PER UNO SCOPO PARTICOLARE. Vedere la Licenza Pubblica Generale GNU per maggiori dettagli.

Dovresti aver ricevuto una copia della Licenza Pubblica Generale GNU insieme a questo programma. In caso contrario, vedere http://www.gnu.org/licenses/.