This project is a reasonably accurate emulation of the Soviet 8-bit home computer Apogee BK-01 and its components from the KR580 microprocessor family: namely the VG75 programmable CRT controller, VI53 programmable interval timer, VT57 programmable DMA controller, and VV55A programmable peripheral interface, all of which are exact copies of the Intel 8275, 8253, 8257, and 8255A respectively. CPU emulation is provided by the iz80 library, into which corrections were made to match the VM80A (Intel 8080) specification precisely. Since iz80 is instruction-accurate, there is no true cycle-accuracy in this project in the purist sense of the word, despite the precise modelling of the behaviour of all the main components.
This project set out to give a great machine a second life, and a musical one at that. I had been working mostly in live coding before, but decided that working with church organs called for something more serious, and so resolved to turn to, that is, offline assembling. To that end I equipped the emulator with MIDI via VV55A and the Apogee SDK for flat assembler g, which includes VM80A assembler definitions and other things useful for development. Since the aim was accuracy in MIDI timing and minimising jitter, the synchronisation mechanism is tied to the sound card clock: a deliberate compromise, due to which video stuttering may occur on weaker hardware, but the emulation stream itself will remain smooth.
To download the source code, build the Apogee binary, and install it in $HOME/.cargo/bin in one go run:
cargo install --locked --git https://github.com/coignard/apogeeYou can also install the latest release directly from crates.io:
cargo install apogee-rsOr install via Homebrew:
brew install coignard/tap/apogeeAlternatively, you can manually download the source code and build the Apogee binary with:
git clone https://github.com/coignard/apogee
cd apogee
cargo build --release
sudo cp target/release/apogee /usr/local/bin/Add the following to your Cargo.toml:
[dependencies]
apogee-rs = "0.3.2"cargo testTests use a replay-based snapshot system. Each file in tests/replays/ is a JSON recording of a session: input events, timing, and metadata (ROM name, sample rate, display settings, SHA-256 of the ROM).
The emulator replays the events and at each checkpoint compares machine state and screenshot against the expected dumps in tests/dumps/.
To update snapshots after an intentional change:
UPDATE_SNAPSHOTS=1 cargo testPlease note that changes to iz80 that affect instruction timing or CPU state require manually reviewing and rerecording the affected replays, not just regenerating snapshots.
Thanks to Kakos Nonos for sharing his Apogee BK-01 programs used in the test suite, Victor A. Pykhonin for helping debug checksums and KR580VI53 and for emu80 which was the main reference for this emulator, and Olga Podivilova for the Apogee BK-01 illustration.
The Apogee source code is © 2026 René Coignard and licensed under the GNU General Public License v3.0 or later.
The Apogee SDK source code is © 2026 René Coignard and licensed under the zlib License.
The flat assembler g source code is © 2015-2025 Tomasz Grysztar and licensed under the BSD 3-Clause License.
The .rka files in tests/assets/ are Apogee BK-01 programs written by and © Kakos Nonos, included with his kind permission. Some programs may contain third-party assets whose rights belong to their respective owners. proverka.rka is included for testing purposes; its authorship and copyright status are unknown. If you are the copyright holder and object to its inclusion, please open an issue.