CP/M v2.23
Panoramica
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:
- 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
- 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).
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.
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
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. |
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. |
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
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’ |
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)
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
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
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
| 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 |
Creazione di un Disco CPM
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
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/
Estrazione di Dischi CP/M MZ80K
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
# 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
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
# 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
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
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]_
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
Riconoscimenti
Licenze
La Licenza Pubblica Generale GNU v3
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/.