Alternative firmware that turns the OneChipBook FPGA laptop (Altera Cyclone I EP1C12Q240C8) into a Soviet Elektronika BK-0010(-01) or BK-0011M - the PDP-11-class home computers built around the 1801VM1 CPU. It runs the real ROMs, boots to the real firmware, and aims at cycle-accurate timing rather than "close enough": the 1801VP1-037's memory arbitration is reproduced, so the screen slows the CPU exactly as it does on real silicon, and beam-raced demo effects land where their authors intended.
Everything below is confirmed running on the device.
- BK-0010-01 - MONITOR + BASIC Vilnius, 3.02 MHz.
- BK-0011M - BOS, 4.03 MHz, banked memory, two video pages, the 16-colour programmable palette and the 50 Hz frame interrupt.
- Display - full-screen borderless 1024×768@60 on the panel, integer ×2 horizontal / ×3 vertical scaling (so the BK's 2:3 pixel shape is right). Both colour-256 and mono-512 modes.
- Keyboard - a PS/2 keyboard behaves as the BK's own, including the Russian/Latin and case triggers, СУ/АР2/НР modifiers and СТОП.
- Sound - the 1-bit speaker, TurboSound (2x YM2149) and a stereo Covox 8-bit DAC.
- Joysticks - both MSX joystick ports drive the BK's joystick register: four directions and two buttons each, so two-player games work.
- Mouse - connected USB 1.1 mouse acts as the BK's UVK-01 "Marsianka" mouse.
- Tape - the right audio jack doubles as the cassette port. Load real BK tape recordings from a PC, and save back to one.
- SMK512 - the 512 KB RAM extension, its BIOS, and an IDE drive backed by an SD card. Boots an OS from a standard AltPro HDD image.
- Turbo - an optional 6.04 MHz mode, roughly 1.8× (BK-0011M) to 2.2× (BK-0010) faster than authentic.
- Reset button - warm-restarts the machine with memory intact, like a real BK's reset. Also how you switch models.
| Switch | Function |
|---|---|
| 1 | Model: OFF = BK-0010, ON = BK-0011M. Needs reset when switched |
| 4 | Tape mode: ON = the right audio jack is the cassette port |
| 5 | Covox: OFF = stereo, ON = mono. Takes effect immediately |
| 8 | SMK512: ON = the storage controller is present. Needs reset when switched |
| Key or Button | Does |
|---|---|
| FN+R | Reset |
| F12 / F button / FN+F | Turbo on/off |
| Print Screen / V button | display mode: colour-256 ↔ mono-512 |
| Delete | СТОП |
| Caps Lock | ЗАГЛ/СТР - the upper/lower case trigger |
| Left Ctrl | РУС - switch to Russian |
| Home | ЛАТ - switch to Latin |
| Insert | СУ - control modifier (hold) |
| Alt | АР2 - the second-function modifier (hold) |
| Shift | НР - the BK's own shift |
| Esc / F2 / F9 | КТ / ВС / СБР |
| F1, F3, F5 | ПОВТ, graphics, kill-to-end-of-line |
| F6, F7, F8 | ИНД СУ, БЛОК РЕД, ШАГ |
| Arrows | cursor movement |
Turbo and the display mode are remembered across the reset button; they reset only on power-off.
Both MSX joystick ports are live. Plug in any standard MSX or Atari-style digital pad - four directions and two fire buttons are read.
A USB 1.1 mouse connected to the side USB-A port appears to the BK as a UVK-01 "Marsianka" mouse. While a mouse is connected the Covox output is muted.
| LED | Meaning |
|---|---|
| 9 | solid = running. Blinking = the firmware image in flash failed its checksum and the CPU is held in reset. |
| 8 | SMK512 drive access - blinks while the drive is busy, one short flash for a single access |
| 7 | tape mode is on |
| 6 | turbo is on |
| 5 | PSG is active |
| 4 | PSG TurboSound mode is active |
| 3 | the audio output overloaded (for diagnostic purposes; should never light) |
| 2 | the audio mixer overloaded (for diagnostic purposes; should never light) |
| 1 | speaker activity |
Switch DIP 4 on (LED 7 lights). Play a BK tape recording - e.g. a WAV
rendered from a .BIN - into the right audio channel, then load it the
normal way. Switch DIP 4 off when you're done - that jack is the right audio channel otherwise.
Write a raw AltPro HDD image to the card starting at the very beginning - no partition table, no filesystem, just the image at sector 0:
sudo dd if=your_image.img of=/dev/sdX bs=1M conv=fsync status=progress
Put the card in the board's SD slot, switch DIP 8 on, and press reset: the SMK BIOS finds the drive and boots from it. There is no card-detect pin, so insert the card first, then reset.
With DIP 8 on and no card, the BIOS reports no drive and drops to its own command line - the same as a real SMK with nothing attached. Switch DIP 8 off and reset for a plain machine.
make # build the bitstream (Quartus II 11.0) -> ocbk.pof
make flash # write it to the board's config flash over USB-Blaster
Needs Quartus II 11.0 at /opt/altera/11.0/quartus (override with
QUARTUS_HOME=). Flashing is Active Serial over a USB-Blaster; it programs
the FPGA configuration and the BK ROM images in one shot, so the board comes
up standalone afterwards.
The BK ROM images live in mem/roms/ and are built into the flash image
automatically - nothing to load at runtime. If that image is ever corrupt the
board refuses to run the CPU and blinks the power LED rather than booting
something broken.
It fits in 9,058 of 12,060 logic elements (75 %), 4 memory blocks and the board's single PLL.
Developer documentation is in doc/dev/, one file per subsystem - the architecture, the platform constraints, the memory map, the per-module design rules and the simulation oracles that keep the timing honest. Start with doc/dev/platform.md; CLAUDE.md is the index and the list of rules a change must not break.
- The 1801VM1 CPU and 1801VP1-037/014 chip models are reverse-engineered gate-level designs from the cpu11 and k1801 projects - the reason this can be cycle-accurate at all rather than merely compatible.
- YM2149 / AY-3-8910 PSG core was adapted from BK0011M for MiSTer Board project.
- The board bring-up (clocking, SDRAM, VGA) builds on esemsx3 from ocm-pld-dev, the 1chipMSX firmware project.
- The USB side is usb_hid_host by nand2mario.