YAZE: un ottimo emulatore Z80 + CP/M

Per chi vuole cimentarsi con l’utilizzo e lo sviluppo su sistemi CP/M ci sono essenzialmente due possibilità: usare una macchina reale oppure un emulatore. In questo articolo segnalo un ottimo emulatore di una “generica” macchina equipaggiata di CPU Z80 nonché del sistema operativo CP/M, che utilizza come input/output la finestra di terminale del nostro sistema operativo preferito (che sia Linux, Windows, Mac OS X).

L’emulatore in quesitone si chiama YAZE, ed è di un certo pregio in quanto, oltre a una perfetta emulazione della CPU Z80, consente in maniera relativamente semplice lo scambio di file col sistema host, e viene già fornito di un certo numero di software interessanti, preinstallati e funzionanti, tra cui i compilatori HiTech C e Turbo Modula-2  di Borland.

Download e build

YAZE è multipiattaforma, potete scaricarne i sorgenti da questo sito, da cui suggerisco di scegliere l’ultima versione disponibile (a oggi la 2.40.2):

http://www.mathematik.uni-ulm.de/users/ag/yaze-ag/

Le istruzioni per compilarlo sono molto semplici: bisogna prima di tutto scegliere per quale piattaforma vogliamo compilare. Lanciando un “ls -l Make_*” dalla cartella principale otteniamo l’elenco delle piattaforme disponibili:

Makefile_Orange_Pi_Plus2_ARMv7
Makefile_Raspberry_Pi_1
Makefile_Raspberry_Pi_2_Model_B
Makefile_Raspberry_Pi_3_Model_B_ARMv7_32Bit
Makefile_Raspberry_Pi_3_Model_B_ARMv8_64Bit
Makefile_cygwin
Makefile_cygwin_64
Makefile_first
Makefile_freebsd
Makefile_linux_32_i586
Makefile_linux_64_amd_athlon64
Makefile_linux_64_intel_corei7
Makefile_linux_64_intel_nocona
Makefile_radxa_Rock_RockPro_RockLite
Makefile_solaris_cc
Makefile_solaris_gcc

La prima operazione da fare è copiare il Makefile corretto in quello effettivo, per esempio per una macchina Linux con processore Intel i7 lanceremo:

cp Makefile_linux_64_intel_corei7 Makefile

NOTA BENE: Sembra non essere disponibile l’opzione per compilare per Mac OS X. In realtà è sufficiente utilizzare il makefile “Makefile_solaris_gcc“, quindi il comando da lanciare sarà il seguente:

cp Makefile_solaris_gcc Makefile

A questo punto si lancia “make“, e dopo qualche secondo/minuto sarà disponibile nella cartella il file “yaze_bin“, che conviene lanciare tramite lo script “yaze” (per piattaforme UNIX) oppure “yaze.bat” (per Windows). Supponendo di essere su Mac OS X lanceremo:

sh yaze

Per comodità fornisco una versione precompilata per Mac OS X, basta cliccare qui.

Esecuzione e feature built-in

Al momento dell’esecuzione viene creato un ambiente completo: viene eseguito il sistema operativo CP/M e vengono montati una serie di immagini di floppy disk (sono presenti nella distribuzione con estensione .ydsk). L’avvio si presenta con un ricco README che descrive questa fase.  I floppy che vengono montati automaticamente sono presenti in altrettanti drive virtuali, e sono i seguenti:

Drive Immagine Contenuto Spazio libero
A: BOOT_UTILS Disco di boot con CCP.COM (processore dei comandi)  3434 kB
B: CPM3_SYS Utility di sistema CP/M 492 kB
C: ./disksort/ Link alla cartella ./disksort read-only
D: DISKSORT File batch di esempio per l’utility disksort 138 kB
F: ZINC Utility ZINC di John Elliott 136 kB
G: TEST-UTILS-1.10 Utility di test per la vecchia versione 1.10 di Yaze 88 kB
H: HI-C-Z280-Compiler Compilatore C di HiTech Soft 1056 kB
I: UNIXLIKE Utility UNIX-like 124 kB
J: MMU-Utils Test per la Memory Management Unit 118 kB
K: Kermit_SZRZ Kermit 926 kB
L: spl Ambiente di sviluppo per compilare sorgenti .spl 146 kB
M: Turbo-Modula-2 Compilatore Modula-2 di Borland 44 kB
N: testdsk testdisk 64 kB
P: BIOS3 Sorgenti del BIOS di YAZE 136 kB

Di particolare interesse segnalo il compilatore Modula-2 (sul drive M:) di Borland per una serie di ragioni: è un IDE completo (editor + compilatore), è stato sul mercato per un brevissimo lasso di tempo, è stato scritto da Martin Odersky (il papà di Scala), e smanettandoci un po’ si nota che l’evoluzione del Pascal in Turbo Pascal (dalla versione 4 in poi, che include il concetto di UNIT) è stata chiaramente ispirata da questo linguaggio. Un esempio di progetto in Modula-2 è il mio porting di “Gorillas”, il classico gioco presente nei floppy di MS-DOS.

Interessante è anche il compilatore HiTech C (sul drive H:), che è standard ANSI e consente quindi il porting dei propri software su CP/M in maniera relativamente semplice.

Come si nota dall’ultima colonna della tabella, il drive A: è quello che ha più spazio libero (ben 3.4 MB). Consiglio pertanto di utilizzare questo come “posto” per scrivere i propri file.

Tipo di terminale utilizzato

YAZE prevede come terminale quello emulato dal sistema operativo host: di conseguenza si tratta dello standard VT100/ANSI in quanto WindowsLinuxMac OS X implementano tale standard nei loro programmi di emulazione terminale.

Questo deve fortemente essere tenuto in considerazione nel caso in cui si decida di utilizzare l’emulatore con software che fanno uso di editor a tutto schermo (vanno configurati per supportare tale standard) o se si vuole sviluppare qualcosa. Ricordo che CP/M è “agnostico” sul terminale usato ed è quindi a carico del programmatore stabilire quali standard si vogliono supportare.

È fortemente consigliato “allungare” la finestra del terminale in modo da avere 25 righe (su Windows è già così, su Linux e Mac OS X di default si hanno 24 righe) in quanto ai programmi che utilizzano l’intero schermo (per esempio l’editor di Modula-2) viene “comunicato” tale valore come altezza dello schermo.

Personalmente consiglio inoltre di impostare caratteri bianchi su sfondo nero, ma solo se in qualche modo si voglia “giocare” con il colore durante la programmazione.

Lettura/Scrittura dal file system locale

Il sistema operativo CP/M pre-installato mette a disposizione 4 comandi aggiuntivi (W, R, mount, E) due dei quali servono per leggere/scrivere dal file system host, e altri due sono di servizio.

Comando W. Esportazione YAZE -> Sistema host

Copia uno o più file (usando la wildcard “*“) presente sul file system virtuale di YAZE sul disco del sistema host. Sintassi:

W <filename> [B|T]

il secondo parametro specifica se si tratta di un file binario (B) o di testo (T), nel secondo caso infatti ci sarà la traduzione della sequenza <CR><LF> in <LF>. Il valore di default è B, cioè binario quindi una copia esatta. Qui un approfondimento sul modo di andare “a capo” nei file di testo, su CP/M e non solo.

Lanciato senza parametri fornisce un HELP sulla sintassi.

Comando R. Importazione Sistema host -> YAZE

Copia uno o più file (usando la wildcard “*“) presente nel sistema host sul file system virtuale di YAZE. Sintassi:

R <filename> [U]

Il secondo parametro specifica se il nome del file è case sensitive. La copia viene effettuata in modalità binaria, quindi copia esatta byte-per-byte.

Lanciato senza parametri fornisce un HELP sulla sintassi.

Comando mount. Visualizzazione dischi virtuali

Non ha parametri e visualizza l’assegnazione dei dischi virtuali ai file immagine dei floppy:

Comando E. Uscita da YAZE

No comment: si lancia senza parametri e si ritorna al prompt dei comandi del sistema host.

Ultime note sull’utilizzo

Nel caso di operazioni sul file system virtuale di YAZE, è bene non lanciarne istanze multiple, in quando gli accessi in scrittura sulle varie istanze e sullo stesso file immagine produrrebbero effetti imprevedibili.

Buon divertimento!

(l’immagine introduttiva è la copertina del libro “CP/M Il sistema operativo per microcomputer” di Thom Hogan, ed. Zanichelli)

Link esterni

Francesco Sblendorio

Francesco Sblendorio nasce nel 1977. Nel 1985 fa conoscenza con il mondo dei computer attraverso un Commodore 16: da quel momento la discesa verso il lato oscuro è inesorabile e si trasforma in un geek impenitente. Nell'ambito del retrocomputing ha un sogno: che i vecchi computer non debbano semplicemente sopravvivere (conservando la loro funzionalità), piuttosto devono vivere, attraverso nuovi software sviluppati oggi per i computer di ieri.

Potrebbero interessarti anche...