Sono innamorato delle macchine ad 8 bit e di UNIX, e allora mi son detto : perchè non far convivere questi 2 mondi apparentemente lontani. Mi son messo quindi alla ricerca di un software libero che girasse in OpenBSD, e che fosse capace di emulare il microprocessore Zilog Z80. Quanto riportato in questo appunto, è il risultato di ciò che al momento ho appreso.
La scelta è presto ricaduta su ZEsarUX, che a quanto pare, risulta essere uno dei migliori emulatori UNIX per macchine ad 8bit, tra gli utenti UNIX, per i seguenti motivi :
- E’ un progetto storico, ancora manutenuto ed evoluto.
- E’ capace di emulare tantissime macchine ad 8bit (tra cui tutte le macchine Sinclair)
- E’ rilasciato come Software Libero, ossia accompagnato da una licenza GNU GPLv3.
- E’ seguito da una vasta comunità di utenti, a me affini.
Non potevo trovare *davvero* di meglio.
Caratteristiche generali
Secondo la documentazione di progetto, ZEsarUX è capace di emulare tutte le macchine ufficiali di Sinclair Research Ltd : MK14, zx80, zx81, ZXSpectrum, z88 ed anche il QL (come non monta un z80, ma il Motorola 68008 ossia una via di mezzo tra un 8 ed un 16 bit). Il supporto è esteso anche alle tante varianti, sia ufficali (come i Timex 1000, 1500, 2048 e 2068 per il mercato Nord Americano), che non ufficiali e a volte non autorizzati, come il Pentagon.
…e non finisce qui, perchè ZEsarUX, è capace di emulare tante altre macchine Z80, come le MSX (versione 1) ed altre ancora. Riporto di seguito l’elenco di tutte le macchine ad 8/16 bit supportate :
| Nome | Marchio | CPU | Paese Origine | |
|---|---|---|---|---|
| 1 | mk14 | Sinclair | Gran Bretagna | |
| 2 | zx80 | Sinclair | z80 | Gran Bretagna |
| 3 | zx81 | Sinclair | z80 | Gran Bretagna |
| 4 | zx spectrum | Sinclair | z80 | Gran Bretagna |
| 5 | z88 | Sinclair | z80 | Gran Bretagna |
| 6 | QL | Sinclair | 68008 | Gran Bretagna |
| 7 | Timex 1000 | Sinclair Timex | z80 | USA, Portogallo |
| 8 | Timex 1500 | Sinclair Timex | z80 | USA, Portogallo |
| 9 | Timex 2048 | Sinclair Timex | z80 | USA, Portogallo |
| 10 | Timex 2068 | Sinclair Timex | z80 | USA, Portogallo |
| 11 | MSX 1 | z80 | Giappone | |
| 12 | CPC464 | Amstrad | z80 | Gran Bretagna |
| 13 | CPC4128 | Amstrad | z80 | Gran Bretagna |
| 14 | CPC 664 | Amstrad | z80 | Gran Bretagna |
| 15 | CPC 6128 | Amstrad | z80 | Gran Bretagna |
| 16 | PCW 8256 | Amstrad | z80 | Gran Bretagna |
| 17 | PCW 8512 | Amstrad | z80 | Gran Bretagna |
| 18 | TK80 | Microdigital Eletronica | z80 | Brasile |
| 19 | TK82 | Microdigital Eletronica | z80 | Brasile |
| 20 | TK82C | Microdigital Eletronica | z80 | Brasile |
| 21 | TK83 | Microdigital Eletronica | z80 | Brasile |
| 22 | TK85 | Microdigital Eletronica | z80 | Brasile |
| 23 | TK90X | Microdigital Eletronica | z80 | Brasile |
| 24 | TK95 | Microdigital Eletronica | z80 | Brasile |
| 25 | CZ 1000 | Czerweny Electronica | z80 | Argentina |
| 26 | CZ 1500 | Czerweny Electronica | z80 | Argentina |
| 27 | CZ 2000 | Czerweny Electronica | z80 | Argentina |
| 28 | CZ 1000 Plus | Czerweny Electronica | z80 | Argentina |
| 29 | CZ 1500 Plus | Czerweny Electronica | z80 | Argentina |
| 30 | CZ Spectrum | Czerweny Electronica | z80 | Argentina |
| 31 | CZ Spectrum Plus | Czerweny Electronica | z80 | Argentina |
| 32 | Inves Spectrum + | Investrónica SA | z80 | Spagna |
| 33 | Sam Coupe | Miles Gordon Technology | z80 | Gran Bretagna |
| 34 | Pentagon | Vladimir Drozdov | z80 | Unione Sovietica |
| 35 | Chloe 140 SE | Andrew Owen, Jarek Adamski | z80 | |
| 36 | Chloe 280 SE | Andrew Owen, Jarek Adamski | z80 | |
| 37 | Chrome | |||
| 38 | Prism | |||
| 39 | ZX-Uno | z80 | Spagna | |
| 40 | ZX-Evolution BaseConf | https://zx.andrew-lazarev.com/en/ | z80 | Russia |
| 41 | ZX-Evolution TS-Conf | https://zx.andrew-lazarev.com/en/ | z80 | Russia |
| 42 | ZX Spectrum Next | specnext.com | z80 | Brasile, Gran Bretagna |
| 43 | Jupiter Ace | Jupiter Cantab Ltd. | z80 | Gran Bretagna |
| 44 | Spectravideo 318 | Spectravideo | z80 | Stati Uniti |
| 45 | Spectravideo 328 | Spectravideo | z80 | Stati Uniti |
| 46 | Colecovision | Coleco | z80 | Stati Uniti |
| 47 | Sega SG1000 | Sega | Giappone | |
| 48 | Sega Master System | Sega | Giappone |
BUILD di ZesarUX.
Al momento, non è disponibile il pacchetto binario per OpenBSD, ma esclusivamente come port. E’ necessario quindi compilarlo, o tramite Port oppure recuperando dall’autore, l’ultima versione dei sorgenti disponibili. Preferisco partire dall’ultima versione dei sorgenti.
Installazione di GIT.
I sorgenti di ZEsarUX sono su github alla url https://github.com/chernandezba/zesarux
Per prelevarli bisogna averci il client git, che andrò ad installare.
arcadia$ doas pkg_add git
quirks-7.147 signed on 2026-01-01T21:20:01Z
git-2.51.0:gitwrapper-0.123: ok
git-2.51.0:p5-Error-0.17029: ok
git-2.51.0:p5-Time-TimeDate-2.33: ok
git-2.51.0:p5-Mail-Tools-2.21p0: ok
git-2.51.0:ngtcp2-1.16.0: ok
git-2.51.0:nghttp2-1.68.1: ok
git-2.51.0:nghttp3-1.12.0: ok
git-2.51.0:nghttp3-1.12.0: ok
git-2.51.0:curl-8.19.0: ok
git-2.51.0: ok
The following new rcscripts were installed: /etc/rc.d/gitdaemon
See rcctl(8) for details.
New and changed readme(s):
/usr/local/share/doc/pkg-readmes/git
Download dei Sorgenti (clone)
Tramite il comando GIT è possibile scaricare –con un operazione di clone– l’attuale albero dei sorgenti di zesarux.
arcadia$ git clone https://github.com/chernandezba/zesarux
Cloning into 'zesarux'...
remote: Enumerating objects: 46304, done.
remote: Counting objects: 100% (829/829), done.
remote: Compressing objects: 100% (805/805), done.
remote: Total 46304 (delta 55), reused 48 (delta 24), pack-reused 45475 (from 3)
Receiving objects: 100% (46304/46304), 75.89 MiB | 2.73 MiB/s, done.
Resolving deltas: 100% (36598/36598), done.
Updating files: 100% (1489/1489), done.
arcadia$ ls -la zesarux/
total 84
drwxr-xr-x 5 jack0e jack0e 512 Jan 2 21:34 .
drwxr-xr-x 6 jack0e jack0e 512 Jan 2 21:32 ..
drwxr-xr-x 7 jack0e jack0e 512 Jan 2 21:34 .git
-rw-r--r-- 1 jack0e jack0e 702 Jan 2 21:34 .gitignore
-rw-r--r-- 1 jack0e jack0e 3452 Jan 2 21:34 PREVIOUS_SCREENSHOTS.md
-rw-r--r-- 1 jack0e jack0e 18529 Jan 2 21:34 README.md
drwxr-xr-x 2 jack0e jack0e 2048 Jan 2 21:34 screenshots
drwxr-xr-x 32 jack0e jack0e 7168 Jan 2 21:34 src
alfree$
Compilazione
Il processo di compilazione segue lo standard GNU: i sorgenti sono sotto la /src ed è presente uno script di configure che genera un Makefile personalizzato, per eseguire il vero e propro di build (make). Nello script di configure è necessario modificare il valore preimpostato della variabile CCOMPILER da gcc a cc, per poter utilizzare il compilatore C di OpenBSD, anzichè GNU GCC. Se si riesce ugualmente, evitiamo di installare un secondo compilatore sulla macchina.
arcadia$ cd zesarus/src
arcadia$ grep CCOMPILER=gcc configure
CCOMPILER=cc
Come parametri di configure, imposto la directory dove voglio installare il pacchetto binario di zesarus. Inoltre, prefisso il comando di configure con ksh, per evitare che cerci di eseguirlo con bash, che non è installato sulla macchina.
Dall’Output mostrato, si evince che mancano alcune componenti software sul sistema legate all’audio (dsp, onebitspeaker, alsa, pulse, coreaudio ed sdl) e al video (cursesw, aa, caca, cocoa, sdl, fbdev). Di fatto al momento non ci sarà supporto all’audio, o molto ridotto. In ogni caso la configure si conclude positivamente, e questo vuol dire che non c’è nulla di vitale che manchi nel sistema, e che si può proseguire.
arcadia$ ksh ./configure --prefix=/home/jack0e/zesarux.bin
Configuration script for ZEsarUX
Initial CFLAGS=
Initial LDFLAGS=
Initial LIBS=
Enabling all compiler warnings on snapshot version
Checking Operating system ... OpenBSD
Checking machine hardware name ... amd64
Checking for cc compiler ... found
Checking size of char ... 1
Checking size of short ... 2
Checking size of int ... 4
Checking size of long long int ... 8
Checking Little Endian System ... ok
Checking for stdout functions ... found
Checking for simpletext functions ... found
Checking for fbdev functions ... not found
Checking for cursesw libraries ... not found
Checking for curses libraries ... found
Checking for aa libraries ... not found
Checking for caca libraries ... not found
Checking for SSL libraries ... disabled
Checking for xwindows libraries ... found
Checking for xwindows extensions ... found
Checking for posix threads ... found
Checking for audio dsp ... not found
Checking for audio onebitspeaker ... not found
Checking for audio alsa ... not found
Checking for audio pulse ... not found
Checking for coreaudio ... not found
Checking for Cocoa Mac OS X GUI ... not found
Checking for sdl libraries ... not found
Checking for libsndfile ... not found
Checking for linux real joystick ... not found
Final CFLAGS= -fsigned-char -I. -Iaudio -Icopy_interfaces -Icores -Icpus -Imachines -Imenu -Isnap -Istorage -Isoundchips -Ithird_party -Ivideo -Ivideo_chips -Izrcp -Izxvision -Wall -Wextra
Final LDFLAGS= -L/usr/X11R6/lib -L/opt/X11/lib
Final LIBS=-lpthread -lXext -lX11 -lncurses
Creating Makefile
Creating compileoptions.h
Config files successfully generated by ./configure
Enabled Video output drivers: stdout simpletext curses xwindows null
Disabled Video output drivers: cursesw aa caca cocoa sdl fbdev
Enabled Audio output drivers: null
Disabled Audio output drivers: dsp onebitspeaker alsa pulse coreaudio sdl
Enabled Audio File output drivers: raw
Disabled Audio File output drivers: wav
Pthreads support: yes
SSL support: no
Networking support: yes
Remote command protocol support: yes
Linux real joystick support: no
MEMPTR emulation: yes
Visual memory option: yes
CPU statistics option: yes
Raspberry extensions: no
Contended memory emulation: yes
Putpixel cache: yes
Spectrum default core: Normal
Install prefix: /home/jack0e/zesarux.bin
A titolo di documentazione, e per tracciare nel dettaglio il mio processo di build, mostro di seguito anche il config.log generato dal processo di configure. In questo file di log son presenti maggiori dettagli sui test effettuati per verificare la presenza o meno di tutte le componenti software che il processo vero è proprio sarebbe predisposto ad utilizzare per attivare o meno certe funzionalità utente.
In pratica per verificare la presenza di una componente software effettua il controllo di esistenza di un certi file header che lo caratterizza. Ad esempio ricerca il file “linux/fb.h” per verificare che framebuffer sia presente a livello di kernel linux. Chiaramente su OpenBSD non potremo avere tale funzionalità, quindi è corretto che sia stata disabilitata. Cosi come per il supporto del joystick, in cui cerca l’header linux/joystick.h. Negli altri casi cerca le componenti audio e video che verificherò successivamente la possibilità di installare, ma anche poi l’utilità reale di avere certe funzionalità.
Begin configure on date Fri May 1 20:38:02 CEST 2026
Configure sentence: ./configure --prefix=/home/jack0e/zesarus.bin
Initial CFLAGS=
Initial LDFLAGS=
Initial LIBS=
uname: unknown option -- o
usage: uname [-amnprsv]
configure.compile.c:1:10: fatal error: 'linux/fb.h' file not found
1 | #include <linux/fb.h>
| ^~~~~~~~~~~~
1 error generated.
configure.compile.c:1:10: fatal error: 'ncursesw/curses.h' file not found
1 | #include <ncursesw/curses.h>
| ^~~~~~~~~~~~~~~~~~~
1 error generated.
configure.compile.c:1:10: fatal error: 'aalib.h' file not found
1 | #include <aalib.h>
| ^~~~~~~~~
1 error generated.
configure.compile.c:1:10: fatal error: 'caca.h' file not found
1 | #include <caca.h>
| ^~~~~~~~
1 error generated.
configure.compile.c:1:10: fatal error: 'sys/soundcard.h' file not found
1 | #include <sys/soundcard.h>
| ^~~~~~~~~~~~~~~~~
1 error generated.
configure.compile.c:1:10: fatal error: 'sys/io.h' file not found
1 | #include <sys/io.h>
| ^~~~~~~~~~
1 error generated.
configure.compile.c:1:10: fatal error: 'alsa/asoundlib.h' file not found
1 | #include <alsa/asoundlib.h>
| ^~~~~~~~~~~~~~~~~~
1 error generated.
configure.compile.c:1:10: fatal error: 'pulse/pulseaudio.h' file not found
1 | #include <pulse/pulseaudio.h>
| ^~~~~~~~~~~~~~~~~~~~
1 error generated.
configure.compile.c:1:10: fatal error: 'CoreAudio/AudioHardware.h' file not found
1 | #include <CoreAudio/AudioHardware.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
configure.compile.m:1:9: fatal error: 'Cocoa/Cocoa.h' file not found
1 | #import <Cocoa/Cocoa.h>
| ^~~~~~~~~~~~~~~
1 error generated.
cc: warning: -lSDL: 'linker' input unused [-Wunused-command-line-argument]
configure.compile.c:8:11: fatal error: 'SDL/SDL.h' file not found
8 | #include <SDL/SDL.h>
| ^~~~~~~~~~~
1 error generated.
configure.compile.c:4:10: fatal error: 'sndfile.h' file not found
4 | #include <sndfile.h>
| ^~~~~~~~~~~
1 error generated.
configure.compile.c:1:10: fatal error: 'linux/joystick.h' file not found
1 | #include <linux/joystick.h>
| ^~~~~~~~~~~~~~~~~~
1 error generated.
Final CFLAGS= -fsigned-char -I. -Iaudio -Icopy_interfaces -Icores -Icpus -Imachines -Imenu -Isnap -Istorage -Isoundchips -Ithird_party -Ivideo -Ivideo_chips -Izrcp -Izxvision -Wall -Wextra
Final LDFLAGS= -L/usr/X11R6/lib -L/opt/X11/lib
Final LIBS=-lpthread -lXext -lX11 -lncurses
Per poter portare a termine compilazione senza errori, ho dovuto apportare una piccola modifica all’header cpus/m68kcpu.h, ed in particolare al blocco (nel mio caso dalla riga 79-87) in cui viene definito il tipo uint. La definizione evidenziata va in conflitto con quanto dichiarato (per compatibilità al SYS V) nell’header del compilatore /usr/include/sys/types:58.
//Para haiku
#ifdef HAIKU_OS
typedef unsigned int uint;
#else
#define uint unsigned int
#endif
Per conformità a quando già dichiarato, di questo blocco, va commentato tutto tranne la typedef.
//Para haiku
//#ifdef HAIKU_OS
typedef unsigned int uint;
//#else
//#define uint unsigned int
//#endif
Dopodichè avvio la compilazione, eseguendo il comando make. Compaiono un pò di warning (per il parametro -WAll importato nel file Makefile generato al precedente passo di configure), ma nessun errore bloccante quindi il processo di compilazione termina correttamente, producendo i binari.
arcadia$ make 2>&1 | tee make.log
__CUT__
Compilation finished
You can run it without installing by typing ./zesarux (or just zesarux on Windows)
Installazione
Prima di eseguire l’installazione eseguendo il solito “make install”, è necessario modificare lo script generate_install_sh.sh, andando a sostituire ancora una volta, bash con ksh.
arcadia$ # sostituisce bash con ksh
arcadia$ sed 's/bash/ksh/' generate_install_sh.sh > generate_install_sh.sh.ksh
arcadia$ mv generate_install_sh.sh.ksh generate_install_sh.sh
arcadia$ chmod +x generate_install_sh.sh
arcadia$ # esegue l'installazione
arcadia$ make install
./generate_install_sh.sh
./install.sh
Installing ZEsaUX under /home/jack0e/zesarux.bin ...
Install done
Installazione terminata.