The Spectrum’s picture is drawn by the ULA, and while it reads screen memory the Z80 has to wait. Games written for real machines depend on exactly how long it waits, down to single clock cycles. Fuse, the Free Unix Spectrum Emulator, is a quarter of a century’s work on getting details like that right. Philip Kendall released version 0.1.0 on 18 July 1999, and the project he leads is still issuing new versions.
Fast facts
- Author: Philip Kendall, with many contributors
- First release: version 0.1.0, 18 July 1999
- Current version: 1.7.0, 21 March 2026
- Runs on: Linux and other Unix systems, macOS and Windows
- Licence: GNU General Public License, version 2 or later
From Unix to everywhere
Fuse’s README is cheerful about its name. The program “was originally, and somewhat unsurprisingly, an emulator of the ZX Spectrum … for Unix”, and has since been ported to Mac OS X, “which may or may not count as a Unix variant depending on your advocacy position”, and to Windows, “which definitely isn’t”.
The early changelog shows the machine taking shape a feature at a time. Border emulation arrived the day after the first release. Version 0.1.2 in August 1999 added the +2 (“Just 128K emulation with different ROMs!”) and flashing characters, and 0.1.3 added the +2A, snapshot saving and “screen rainbowing effects”, colour changes made while the picture is being drawn. Version 0.3.0, in January 2001, fixed the timings of the block I/O instructions such as INI and OUTI, which “were all one T-state too short”.
In 2005 Retro Gamer, surveying emulation on the Mac, named Fuse as a recent arrival there, “brought to the Mac by the talents of Fredrick Meunier”. Meunier is also credited in the program’s AUTHORS file with the Timex TC2048, the SDL interface, Pentagon support and more. Version 1.0.0 followed in December 2010.
Machines
Fuse emulates the 16K, 48K, 128K, +2, +2A and +3 Spectrums, the +3e and SE, the Timex TC2048, TC2068 and TS2068, the Pentagon 128, 512 and 1024, and the Scorpion ZS 256. The Pentagon and Scorpion are Spectrum clones, and Fuse also emulates the Beta 128 disk interface with its TR-DOS system.
Timing and accuracy
What set Fuse apart was its attention to the timing that Spectrum programmers exploited. Its debugger shows which memory is contended, where the ULA delays the processor. An option called “late timings” moves “all screen-related timings (for example, when the screen is rendered and when memory contention occurs)” one T-state later, “an effect which is present on some real hardware”, because not every Spectrum’s ULA behaves the same way.
The changelog records games that only work once the timing is right. Version 0.7.0, in July 2004, improved the floating bus, the value a Spectrum returns when a program reads a port nothing answers, which comes from whatever the ULA happens to be fetching from screen memory at that moment. Fuse follows the byte pattern documented in Ramsoft’s “Floating bus technical guide”, with its own adjusted timings, and with that change “Arkanoid and Sidewize now work”. A bug-fix release in 2007, 0.8.0.1, adjusted the timing of IN instructions and the floating bus again for Sidewize. Version 0.7.0 also saved the top bit of the Z80’s R register in snapshots, and “Bruce Lee now works”.
Peripherals and files
Fuse’s list of supported hardware reads like a catalogue of Spectrum add-ons: Kempston, Sinclair and cursor joysticks; the Kempston mouse; ZX printers; the Interface 1 with its Microdrives; Multiface One, 128 and 3; the Currah µSpeech and µSource; SpecDrum and Fuller audio box; the +D, DISCiPLE, Opus Discovery and Didaktik disk interfaces; the DivIDE and DivMMC storage interfaces; and the Spectranet network card.
The file handling lives in a separate library, libspectrum, which other programs can use too. It reads and writes .tap and .tzx tape images, .z80, .szx and .sna snapshots, and .rzx input recordings. A companion package, fuse-utils, holds command-line tools such as tzxlist, split out from Fuse itself in 2002.
For programmers and players
Fuse includes a debugger with breakpoints on addresses, memory and I/O ports, a disassembler, a profiler and a “poke finder” for locating the memory that holds a game’s lives or energy. It records play as RZX files, and its “competition mode” behaves “just like a real Spectrum would”: no loading snapshots, no pausing, no changing speed. The manual says plainly that the signature it adds to competition recordings “is not secure (and cannot be made so)”.
Released source code
Fuse and libspectrum have been published as source code from the start, under the GNU General Public License (version 2 or later). The source is on SourceForge.
Sources
- Fuse 1.7.0 source distribution (web, secondary), https://fuse-emulator.sourceforge.net/: the
README(the name, the ports, the list of machines and peripherals);AUTHORS(Kendall, Fredrick Meunier and the other credited contributors);ChangeLog(0.1.0 on 18 July 1999, 0.1.1 on 19 July, 0.1.2 and 0.1.3 in August 1999, 0.3.0 on 31 January 2001, the separate utilities package in 2002, 0.7.0 on 16 July 2004, 0.8.0.1 in May 2007, 1.0.0 on 16 December 2010, 1.7.0 on 21 March 2026);COPYINGand source headers (GPL version 2 or later);spectrum.c, comment on the floating bus and Ramsoft’s guide. - Fuse manual page,
man/fuse.1, in the same distribution (web, secondary): late timings, the debugger, the poke finder and competition mode. - libspectrum 1.6.0
README(web, secondary): file formats supported and the GPL. - Retro Gamer issue 21, 2005, feature on emulation on the Mac: “FUSE (the Free Unix Spectrum Emulator), brought to the Mac by the talents of Fredrick Meunier”.