OpenBSD | Build di ZEsarUX, l’emulatore per macchine ad 8bit.

di | Maggio 3, 2026

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 :

NomeMarchioCPUPaese Origine
1mk14SinclairGran Bretagna
2zx80Sinclairz80Gran Bretagna
3zx81Sinclairz80Gran Bretagna
4zx spectrumSinclairz80Gran Bretagna
5z88Sinclairz80Gran Bretagna
6QLSinclair68008Gran Bretagna
7Timex 1000Sinclair Timexz80USA, Portogallo
8Timex 1500Sinclair Timexz80USA, Portogallo
9Timex 2048Sinclair Timexz80USA, Portogallo
10Timex 2068Sinclair Timexz80USA, Portogallo
11MSX 1z80Giappone
12CPC464Amstradz80Gran Bretagna
13CPC4128Amstradz80Gran Bretagna
14CPC 664Amstradz80Gran Bretagna
15CPC 6128Amstradz80Gran Bretagna
16PCW 8256Amstradz80Gran Bretagna
17PCW 8512Amstradz80Gran Bretagna
18TK80Microdigital Eletronicaz80Brasile
19TK82Microdigital Eletronicaz80Brasile
20TK82CMicrodigital Eletronicaz80Brasile
21TK83Microdigital Eletronicaz80Brasile
22TK85Microdigital Eletronicaz80Brasile
23TK90XMicrodigital Eletronicaz80Brasile
24TK95Microdigital Eletronicaz80Brasile
25CZ 1000Czerweny Electronicaz80Argentina
26CZ 1500Czerweny Electronicaz80Argentina
27CZ 2000Czerweny Electronicaz80Argentina
28CZ 1000 PlusCzerweny Electronicaz80Argentina
29CZ 1500 PlusCzerweny Electronicaz80Argentina
30CZ SpectrumCzerweny Electronicaz80Argentina
31CZ Spectrum PlusCzerweny Electronicaz80Argentina
32Inves Spectrum +Investrónica SAz80Spagna
33Sam CoupeMiles Gordon Technologyz80Gran Bretagna
34PentagonVladimir Drozdovz80Unione Sovietica
35Chloe 140 SEAndrew Owen, Jarek Adamskiz80
36Chloe 280 SEAndrew Owen, Jarek Adamskiz80
37Chrome
38Prism
39ZX-Unoz80Spagna
40ZX-Evolution BaseConf https://zx.andrew-lazarev.com/en/z80Russia
41ZX-Evolution TS-Confhttps://zx.andrew-lazarev.com/en/z80Russia
42ZX Spectrum Nextspecnext.comz80Brasile, Gran Bretagna
43Jupiter AceJupiter Cantab Ltd.z80Gran Bretagna
44Spectravideo 318Spectravideoz80Stati Uniti
45Spectravideo 328Spectravideoz80Stati Uniti
46ColecovisionColecoz80Stati Uniti
47Sega SG1000SegaGiappone
48Sega Master SystemSegaGiappone

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.