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.
  1. Moduli kernel Linux (z80drv.ko, ttymzdrv.ko) — scritti in C, compilati contro l'albero del kernel Linux 4.9-rt SigmaStar. z80drv esegue il ciclo di dispatch dell'emulazione Z80 su un core CPU isolato e comunica con il CPLD tramite SPI e GPIO. ttymzdrv fornisce un'interfaccia TTY alla tastiera e al display di caratteri del Sharp MZ.
  2. Utility spazio utente (z80ctrl, k64fcpu, sharpbiter) — scritte in C, cross-compilate con arm-linux-gnueabihf-gcc.
  3. 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:
  1. Definire la mappa di memoria in z80driver.h
  2. Creare il modulo hardware virtuale (z80vhw_*.c)
  3. Creare la directory della variante di build
  4. Creare la variante VHDL CPLD
  5. 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=1 non 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 z80drv che 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.