tranZPUter FusionX Guida per Sviluppatori
Panoramica
Lo stack software del tranZPUter FusionX e organizzato in tre livelli distinti che insieme formano un sistema completo di emulazione Z80 e hardware virtuale. Ogni livello ha una responsabilita chiaramente definita, e l'aggiunta del supporto per una nuova macchina host — o l'estensione di una esistente — richiede modifiche coordinate su tutti e tre i livelli.
- Moduli kernel Linux (
z80drv.ko,ttymzdrv.ko) — scritti in C, compilati contro l'albero del kernel Linux 4.9-rt SigmaStar.z80drvesegue il ciclo di dispatch dell'emulazione Z80 su un core CPU isolato e comunica con il CPLD tramite SPI e GPIO.ttymzdrvfornisce un'interfaccia TTY alla tastiera e al display di caratteri del Sharp MZ. - Utility spazio utente (
z80ctrl,k64fcpu,sharpbiter) — scritte in C, cross-compilate conarm-linux-gnueabihf-gcc. - RTL CPLD (VHDL) — compilato con Altera Quartus II 13.0.1 SP1 Web Edition. Il CPLD si trova direttamente sul bus Z80 della macchina host e funge da interfaccia hardware tra i segnali fisici del bus Z80 e il SOM SigmaStar.
L'aggiunta del supporto per una nuova macchina richiede modifiche a tutti e tre i livelli: una nuova definizione della mappa di memoria e un modulo hardware virtuale nel driver del kernel, una nuova variante VHDL CPLD compilata per il pinout del bus e il timing della macchina target, e uno script di avvio che li collega.
Albero sorgente
FusionX/
├── CPLD/
│ └── v1.0/
│ ├── MZ80A/build/ Quartus II project for Sharp MZ-80A
│ ├── MZ700/build/ Quartus II project for Sharp MZ-700
│ ├── MZ2000/build/ Quartus II project for Sharp MZ-2000
│ ├── PCW8256/build/ Quartus II project for Amstrad PCW-8256
│ ├── tzpuFusionX.vhd Main RTL (FSMs, SPI, bus interface, video/audio)
│ ├── tzpuFusionX_Toplevel.vhd Top-level entity and I/O pin assignments
│ └── tzpuFusionX_pkg.vhd Shared package (types, constants, generics)
└── software/
├── linux/
│ └── Build_FusionX.sh Master build script (U-boot + kernel + rootfs + apps)
└── FusionX/
└── src/
├── z80drv/
│ ├── src.mz80a/ Makefile and symlinks for MZ-80A build variant
│ ├── src.mz700/ MZ-700 build variant
│ ├── src.mz2000/ MZ-2000 build variant
│ ├── src.pcw/ PCW-8256 build variant
│ └── src/ Common source files
├── ttymz/
│ └── ttymzdrv.c MZ keyboard/display TTY driver
└── utils/
├── z80ctrl.c z80drv control utility
├── k64fcpu.c K64F virtual CPU daemon
└── sharpbiter.c Keyboard/display arbiter daemon
Configurazione dell'ambiente di sviluppo
L'ambiente di compilazione del FusionX richiede tre toolchain separate: un cross-compilatore ARM, il SDK SigmaStar e Altera Quartus II per la sintesi CPLD.
Setup automatizzato e build (raccomandato)
Tutto cio che i passi manuali qui sotto installano a mano — il cross-compilatore ARM, il runtime Java per l'assemblatore GLASS, le dipendenze di compilazione del kernel e la toolchain Quartus II — viene installato e gestito automaticamente dallo script di setup incluso per la propria piattaforma. Ogni script e autonomo: copiare il singolo file per la propria piattaforma ed eseguirlo. Installa i prerequisiti, clona il repository con i suoi sottomoduli (default
~/FusionX), scarica il bundle di contenuti SharpSoft (TZFS_Files.zip, ~110 MB), prepara la toolchain e propone di eseguire il primo build. Usarlo per ottenere un ambiente funzionante in un solo passo; le istruzioni manuali dettagliate che seguono rimangono il riferimento per configurazioni personalizzate, per comprendere i singoli strumenti e per la CI.
| Script | Platform | Notes |
|---|---|---|
setup_FusionX.sh |
Linux (native) / macOS (Docker) | On Linux offers a native tool chain (Java JRE + the Linaro gcc-linaro-5.5.0-2017.10-arm-linux-gnueabihf cross toolchain to /opt/arm-linux-gnueabihf + kernel build deps) or reproducible Docker images (fusionx-build:latest, fusionx-quartus:13.0.1); on macOS uses Docker. The CPLD always builds via the Quartus Docker image (MAX7000AE). |
setup_FusionX_windows.cmd |
Windows 10/11 | Double-click launcher for the native PowerShell setup. No Docker, no WSL2. |
setup_FusionX_windows_native.ps1 |
Windows 10/11 (native, no WSL2) | winget-installs Git for Windows + Temurin 17 JRE; locates an existing Quartus II 13.x (MAX7000AE — not auto-installed, warns if absent); sets up a WSL1 distro (default Ubuntu) for the Linux-only components. |
setup_FusionX_wsl1.sh |
WSL1 / Ubuntu (called by the Windows script) | Provisions the WSL1 distro: build deps, image extras, 32-bit libs, python2 for the SigmaStar SDK, and the Linaro ARM toolchain; writes /etc/profile.d/fusionx.sh (CROSS_COMPILE=arm-linux-gnueabihf-, ARCH=arm). |
Linux / macOS:
chmod +x setup_FusionX.sh ./setup_FusionX.sh
Windows 10/11 — doppio clic su
setup_FusionX_windows.cmd, oppure da PowerShell:Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass .\setup_FusionX_windows_native.ps1
Il build e guidato da
build.sh, che seleziona una toolchain nativa, un'immagine Docker o una distribuzione WSL1 per componente a seconda dell'host (Linux: tutto nativo; macOS: tutto Docker; Windows: ROM/CPLD nativi + WSL1 per le parti solo-Linux). Eseguirlo senza argomenti per costruire tutto, oppure passare un flag per un singolo componente:
build.sh flag |
Builds | Output |
|---|---|---|
--asm --tzfs --cpm |
Z80 ROMs / TZFS / CP/M (Java + GLASS glass-0.5.1.jar) |
software/roms/*.bin (incl. cpm223_*.bin) |
--drivers |
z80drv / ttymz kernel modules + apps | arm-linux-gnueabihf objects |
--spi |
SPI tools | mspi_main |
--cpld |
CPLD bit streams (MZ80A/MZ700/MZ2000/PCW8256) | .pof under CPLD/v1.0/<machine>/build/output_files/ |
--image |
full SigmaStar SSD202 Linux SD image (u-boot + kernel 4.9 + Buildroot) | image under software/linux/.../images |
(none) / --all |
everything | — |
./build.sh # all components ./build.sh --cpld # just the CPLD bit streams ./build.sh --help # list all options
Override utili dell'ambiente (tutti opzionali):
| Variable | Purpose |
|---|---|
FUSIONX_REPO_URL |
Repository to clone (default https://git.eaw.app/eaw/tzpuFusionX.git). |
FUSIONX_METHOD |
Force one build method for all components: native, docker or wsl. |
FUSIONX_FILES_URL |
SharpSoft content bundle URL (default the shared TZFS_Files.zip). |
FUSIONX_TOOLCHAIN_URL / FUSIONX_TOOLCHAIN_DIR |
Linaro ARM toolchain download URL / install directory (default /opt/arm-linux-gnueabihf). |
FUSIONX_DIR |
Build in an existing checkout instead of cloning. |
FUSIONX_WSL_DISTRO |
WSL1 distro name (default Ubuntu). |
FUSIONX_ASSUME_YES |
Accept all prompts non-interactively (used by the Windows launcher). |
Preferite installare la toolchain da soli, o avete bisogno di una configurazione personalizzata o per la CI? I passi manuali qui sotto installano esattamente cio che gli script automatizzano.
sudo apt update
sudo apt install -y make bc libssl-dev git default-jre docker.io u-boot-tools
# Scaricare Linaro GCC 5.5-2017.10 per ARM hard-float
wget https://releases.linaro.org/components/toolchain/binaries/5.5-2017.10/arm-linux-gnueabihf/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf.tar.xz
sudo mkdir -p /opt/arm-linux-gnueabihf
sudo tar xJf gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf.tar.xz \
-C /opt/arm-linux-gnueabihf --strip-components=1
export PATH="/opt/arm-linux-gnueabihf/bin:$PATH"
Clonazione e compilazione
git clone https://git.eaw.app/eaw/tzpuFusionX.git cd tzpuFusionX git submodule update --init --recursive ./build.sh --all
Per i Dockerfile completi di Quartus II, gli script del pipeline Jenkins, la configurazione dei webhook Gitea e la documentazione dettagliata dei container gemelli, consultare la Guida dello sviluppatore in inglese.
Strutture dati chiave
typedef struct {
uint32_t baseAddr; // Inizio spazio indirizzi Z80
uint32_t size; // Dimensione della regione in byte
uint8_t *data; // Puntatore al buffer di memoria emulato
uint8_t type; // MEM_ROM, MEM_RAM, MEM_VHARDWARE, MEM_PHYSICAL
void (*read_fn)(uint16_t addr, uint8_t *data);
void (*write_fn)(uint16_t addr, uint8_t data);
} t_memRegion;
Aggiungere una nuova macchina
L'aggiunta del supporto per una nuova macchina host e il compito di sviluppo piu comune. Il processo prevede cinque passaggi discreti che coprono tutti e tre i livelli dello stack software:
- Definire la mappa di memoria in
z80driver.h - Creare il modulo hardware virtuale (
z80vhw_*.c) - Creare la directory della variante di build
- Creare la variante VHDL CPLD
- Creare lo script di avvio
Per esempi di codice dettagliati di ogni passaggio (inclusa un'implementazione completa dell'ULA dello ZX Spectrum 48K), consultare la Guida dello sviluppatore in inglese.
Insidie comuni
- Blocco sulla CPU0 in z80drv: qualsiasi syscall Linux dal codice in esecuzione nel ciclo di dispatch z80drv sulla CPU1 rischia la preemption dello scheduler o il deadlock.
- Mismatch della variante del bitstream CPLD: compilare il CPLD con le assegnazioni pin MZ-80A e programmarlo in hardware collegato a un MZ-700 causa timing del bus e decodifica indirizzi errati.
- Isolamento CPU non attivo: se
isolcpus=1non e presente negli argomenti di boot del kernel, lo scheduler Linux preemptera il thread di dispatch z80drv. - Immagine ROM mancante: verificare sempre con
dmesg | grep z80drvche il modulo kernel riporti un caricamento ROM riuscito prima di avviare lo Z80.
Siti di riferimento
| Risorsa | Link |
|---|---|
| Pagina progetto tranZPUter FusionX | /tranzputer-fusionx/ |
| Manuale utente tranZPUter FusionX | /tranzputer-fusionx-usermanual/ |
| Guida tecnica tranZPUter FusionX | /tranzputer-fusionx-technicalguide/ |
Avviso normativo wireless
Questo dispositivo incorpora un ricetrasmettitore wireless SSW101B 2,4 GHz IEEE 802.11 b/g/n (integrato nel SOM SigmaStar SSD202), rendendolo un emettitore intenzionale secondo le normative sulle radiofrequenze a livello mondiale.
Responsabilita del costruttore
E responsabilita esclusiva del costruttore assicurarsi che qualsiasi dispositivo costruito sulla base di questi progetti sia conforme a tutte le normative sulle radiofrequenze applicabili nella propria giurisdizione.
E responsabilita esclusiva del costruttore assicurarsi che qualsiasi dispositivo costruito sulla base di questi progetti sia conforme a tutte le normative sulle radiofrequenze applicabili nella propria giurisdizione.