1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-18 01:07:58 +00:00
A latency-hating emulator of 8- and 16-bit platforms: the Acorn Electron, Amstrad CPC, Apple II/II+/IIe and early Macintosh, Atari 2600 and ST, ColecoVision, Enterprise 64/128, Commodore Vic-20 and Amiga, MSX 1, Oric 1/Atmos, Sega Master System, Sinclair
Go to file
Thomas Harte c1dc42a094 Add comment on latent design aim.
In the hope that I don't forget why I did this.
2020-08-09 21:18:23 -04:00
.github/workflows ccpp.yml: Changes 2020-06-28 19:53:19 -07:00
Activity Starts to add Qt target; resolves many build warnings. 2020-05-30 00:37:06 -04:00
Analyser Ensures that the MultiKeyboard functions. 2020-07-31 21:48:20 -04:00
ClockReceiver Attempts to improve vsync deadline estimation. 2020-07-27 21:08:00 -04:00
Components Resolves receive_bit_count-unused warnings. 2020-07-24 21:59:27 -04:00
Concurrency Cleans up all redundant lock/unique_guard declarations. 2020-06-15 00:24:10 -04:00
Configurable Removes dead StandardOptions.cpp. 2020-05-09 21:35:15 -04:00
Inputs Cuts down unused parameter warnings to just a few that may well indicate implementation errors. 2020-05-30 01:06:43 -04:00
Machines Reenable MaserSystem code. 2020-08-04 21:50:54 -04:00
Numeric Increases const correctness, marks some additional constructors as constexpr, switches std::atomic construction style. 2020-05-20 23:34:26 -04:00
OSBindings Hacks to make RGB1 visible (in a fashion). 2020-08-09 20:45:51 -04:00
Outputs Add comment on latent design aim. 2020-08-09 21:18:23 -04:00
Packaging add Ansible build playbook to create RPM package for clksignal and create basic man page 2020-05-11 00:52:51 -04:00
Processors Increases likelihood of 68000 Program offset-size assumptions being met. 2020-07-02 22:24:04 -04:00
READMEImages Switches to an image more distinct from the existing. 2020-07-04 22:03:08 -04:00
Reflection Ensures Reflection::set is widely available. 2020-06-27 16:26:01 -04:00
ROMImages Imagines a future of being able to boot into the BIOS. 2020-04-29 22:07:20 -04:00
SignalProcessing Merge pull request #800 from TomHarte/QtProject 2020-07-06 22:33:39 -04:00
Storage Gives Qt disk controllers independent ROM/RAM selection logic. 2020-07-29 21:06:41 -04:00
.editorconfig Adds a .editorconfig to aid Github display. 2018-07-16 19:59:03 -04:00
.gitignore
BUILD.txt
LICENSE
README.md Add link to Snap releases. 2020-07-25 23:00:29 -04:00

Clock Signal Application Icon

Clock Signal

Clock Signal ('CLK') is an emulator for tourists that seeks to be invisible. Users directly launch classic software with no emulator or per-emulated-machine learning curve.

macOS and source releases are hosted on GitHub. For desktop Linux it is also available as a Snap.

On the Mac it is a native Cocoa application; under Linux, BSD and other UNIXes and UNIX-alikes it can be built either with Qt or with SDL; the Qt build should be considered preliminary and is currently closely bound to X11 as Qt doesn't abstract game-like keyboard handling.

So its aims are:

  • single-click load of any piece of source media for any supported platform;
  • with a heavy signal processing tilt for accurate reproduction of original outputs;
  • that aims for the lowest possible latency; and
  • 100% accurate emulations, naturally.

It currently contains emulations of the:

  • Acorn Electron;
  • Amstrad CPC;
  • Apple II/II+ and IIe;
  • Atari 2600;
  • ColecoVision;
  • Commodore Vic-20 (and Commodore 1540/1);
  • Macintosh 512ke and Plus;
  • MSX 1;
  • Oric 1/Atmos;
  • Sega Master System; and
  • Sinclair ZX80/81.

In addition, emulation of the Atari ST is experimental.

Single-click Loading

Through the combination of static analysis and runtime analysis, CLK seeks to be able automatically to select and configure the appropriate machine to run any provided disk, tape or ROM; to issue any commands necessary to run the software contained on the disk, tape or ROM; and to provide accelerated loading where feasible.

The full process of loading a title — even if you've never used the emulated machine before — is therefore:

  1. locate it in your OS;
  2. double click it.

Signal Processing

Consider an ordinary, unmodified Commodore Vic-20. Its only video output is composite. Therefore the emulated machine's only video output is composite. In order to display the video output, your GPU then decodes composite video. Therefore all composite video artefacts are present and exactly correct, not because of a post hoc filter combining all the subjective effects that this author associates with composite video but because the real signal is really being processed.

Similar effort is put into audio generation. If the real machine normally generates audio at 192Khz then the emulator generates a 192Khz source signal and filters it down to whatever the host machine can output.

If your machine has a 4k monitor and a 96Khz audio output? Then you'll get a 4k rendering of a composite display and, assuming the emulated machine produces source audio at or above 96Khz, 96,000 individual distinct audio samples a second. Interlaced video also works and looks much as it always did on those machines that produce it.

Samples

1:1 Pixel Copying Composite Decoded
The Electron start screen, with a classic 1:1 pixel emulation The Electron start screen, decoded from an interlaced composite feed
Repton 3 in game, with a classic 1:1 pixel emulation Repton 3 in game, decoded from an interlaced composite feed
Stormlord with a classic 1:1 pixel emulation Stormlord decoded from a composite feed
Road Fighter with a classic 1:1 pixel emulation Road Fighter decoded from a composite feed
A segment of the ColecoVision Donkey Kong title screen with a classic 1:1 pixel emulation A segment of the ColecoVision Donkey Kong title screen decoded from a composite feed
Sonic the Hedgehog with a classic 1:1 pixel emulation Sonic the Hedgehog screen PAL decoded from a composite feed
1:1 Pixel Copying Correct Aspect Ratio, Filtered
Amstrad text, with a classic 1:1 pixel emulation Amstrad text, with correct aspect ratio and subject to a lowpass filter
The Amstrad CPC version of Stormlord, with a classic 1:1 pixel emulation The Amstrad CPC version of Stormlord, with correct aspect ratio and subject to a lowpass filter

Low Latency

The display produced is an emulated CRT, with phosphor decay. Therefore if you have a 140Hz monitor it can produce 140 distinct frames per second. Latency is dictated by the output hardware, not the emulated machine.

The machine update mechanism is influenced separately by both screen refresh and audio stream processing; audio latency is therefore generally restrained to 510ms regardless of your screen's refresh rate.

A corollary of emulating the continuous nature CRT, not merely performing end-of-frame transcriptions, is that the most common motion aliasing effects of displaying 50Hz video on a 60Hz display are minimised; you don't have to own niche equipment to benefit.

Accurate Emulation

Cycle-accurate emulation for the supported target machines is fairly trite; this emulator seeks to follow that precedent. All emulation logic is written in C++ for explicit control over costs but, where a conflict arises, the presumption is towards clarity and simplicity of code. This emulator is willing to spend the processing resources available on modern hardware.

Additional Screenshots

Apple IIe Prince of Persia Apple Macintosh MusicWorks
Atari ST Stung Car Racer Amstrad CPC Chase HQ
Acorn Electron Chuckie Egg ColecoVision Galaxian
ZX81 3D Monster Maze ZX80 Kong
SG1000 Chack'n'Pop Atari 2600 Solaris
Vic-20 Gridrunner VIC-20 BASIC

macOS Version Qt Version