Эмулятор Радио-86РК

May 17, 2026 · View on GitHub

kit

Эмулятор Радио-86РК

Эмулятор советского домашнего компьютера Радио-86РК (1986) на базе процессора Intel 8080 (КР580ВМ80А). Эмуляция на уровне команд процессора.

Запустить можно сразу — rk86.ru.

Историческая классическая версия (vanilla JS) удалена из master; последний рабочий снимок живёт в ветке classic.

Проект основан на i8080-js. Пост с описанием. Немного информации о семействе микросхем КР580.

Установка инструментов

Нужны bun (runtime + пакетный менеджер + тест-раннер) и just (таск-раннер).

# bun (macOS/Linux)
curl -fsSL https://bun.sh/install | bash
# либо через Homebrew
brew install oven-sh/bun/bun

# just
brew install just        # macOS / Linux (через Homebrew)
cargo install just       # через Rust toolchain
# Windows: scoop install just   /  winget install Casey.Just

Полный список способов установки — bun.sh и just.systems.

Быстрый старт

Инструментарий — just + bun. Единый Justfile в корне:

just                      # тесты + сборка (по умолчанию)
just install              # bun install
bun run dev               # dev-сервер на http://localhost:5173
bun run build             # статическая сборка в build/
just test                 # модульные тесты + тесты CPU
just test-ci              # полный набор включая CPU Exerciser
just release              # сборка + публикация в docs/ (production)
just release-experimental # публикация в docs/beta
just serve [port]         # локальный вебсервер из docs/ (по умолчанию :8000)
just clean                # git clean -fdx (сохраняет .claude)

Проверка с нуля:

just clean && just

Деплой

GitHub Pages публикует docs/ на https://rk86.ru.

ПутьКоманда сборки
docs/ (root) — productionjust release
docs/beta/ — экспериментальный (BASE_PATH=/beta)just release-beta
docs/monitor/ — поддерживается вручнуюкоммитится напрямую

Маршрут /classic/ остаётся как HTML-редирект на корень (src/routes/classic/+page.svelte), чтобы старые ссылки не давали 404.

Возможности

  • Полная эмуляция процессора Intel 8080 (проходит CPU Exerciser)
  • Экран 78×30 символов, клавиатура с экранной подсказкой
  • Звук через Web Audio API
  • Загрузка программ из каталога (180+ программ) или внешних файлов
  • Сохранение/восстановление состояния (JSON-снимки)
  • Заморозка состояния в памяти (до 20 снимков с миниатюрами экрана, мгновенное восстановление)
  • Ассемблер Intel 8080 (встроенный asm8 playground)
  • Компилятор C для i8080 (встроенный c8080-js playground)
  • Компилятор PL/M-80 (встроенный plm80 playground)
  • Визуализатор WAV-лент (встроенный rk86-tape playground)
  • Дизассемблер с навигацией по коду и данным
  • Визуализатор набора команд
  • GUI-отладчик: дизассемблер, регистры, стек, точки останова, пошаговое выполнение, карта памяти
  • Каталог программ со скриншотами

Горячие клавиши (новая версия)

Cmd/Ctrl+K, затем:

КлавишаДействиеКлавишаДействие
LВыбрать файлVВизуализация
OОткрыть каталогBПомощь по клавиатуре
GЗапустить программуPПриостановить процессор
UЗагрузить внешний файлCСигнал RESET
AАссемблерRПерезапустить эмулятор
DОтладчикSЗвук
FПолноэкранный режимWСохранить состояние
ZЗаморозить состояниеXВосстановить состояние
NКириллица → RK86JПрямой ввод

Заморозка состояния

Кнопка «Заморозить состояние» (или Cmd/Ctrl+K, Z) сохраняет полный снимок эмулятора в памяти страницы вместе с миниатюрой экрана на момент заморозки. Хранится до 20 снимков (новые вытесняют старые). Кнопка «Восстановить состояние» (Cmd/Ctrl+K, X) открывает модальный список со скриншотами и временем создания.

В селекторе восстановления:

  • / — выбрать снимок
  • Enter — применить снимок к работающему эмулятору
  • S — скачать снимок как <имя_файла>-YYYYMMDD-hhmmss.json (или rk86-snapshot-… если файл не был загружен на момент заморозки)
  • D — удалить выбранный снимок
  • Esc — закрыть

Заморозки живут только до перезагрузки страницы. Для постоянного хранения снимка используйте кнопку «Сохранить полное состояние» в тулбаре или скачайте снимок из селектора восстановления.

Отладчик

Режим отладки (Cmd/Ctrl+K, D) разворачивает интерактивный GUI с пятью областями:

ОбластьСодержит
Верх-левоХолст эмулятора 1:1 (зелёная рамка — ввод направлен в эмулятор)
Верх-центрКарта памяти — heatmap всего 64 КБ адресного пространства
Средняя строкаИнфо под курсором холста (адрес видеопамяти, байт, атрибуты FA)
Низ-левоТочки останова и кнопки управления выполнением
Низ-центрРегистры, флаги, стек (SP + 5 значений вверх от него)
Правый столбецДизассемблер с подсветкой PC и контекстными аннотациями

Клик-фокус. Клик на холсте — клавиатура в эмулятор (зелёная рамка); клик на любой другой области — клавиатура в эту область.

Дизассемблер. Подсвечивает PC, показывает байты, символы, мнемонику и контекстные аннотации:

  • [XXXX] — текущее значение по адресу (LDA/STA/LHLD/LXI/M-операнды), либо адрес возврата у RET когда строка — текущий PC.
  • / — направление перехода/возврата для JMP/CALL/RET/условных.
  • Z=1 ✓ / Z=0 ✗ — состояние флага и взятие условной ветви.
  • 10t или 17t/11t — такты; для условных CALL/RET показаны обе ветки (активная ярче, пропущенная — тусклее).
  • Любая hex-ячейка (байты, регистры, поля редактора точек останова) кликабельна и открывает inline-редактор.

PC всегда центрируется на ~½ высоты code-пейна после каждого step/stepOver/stepOut/breakpoint/pause. Граница верхней строки выровнена по реальной инструкции (не разрезает байты); undocumented 3-байтные алиасы (FD/DD/ED CALL?, CB JMP?) клампятся до 1 байта в GUI, чтобы не вводить рендер в заблуждение.

Регистры и стек. A с двоичным представлением и флагами S/Z/H/P/C; BC, DE, HL (клик — переход к данным по адресу); SP с 6 значениями стека (клик по адресу — переход к данным, по значению — переход к коду).

Точки останова. Таблица: тип (exec/read/write/opcode), адрес/опкод, длина (для read/write), счёт (пропускать N попаданий), попадания, временная (удалить при попадании). Сохраняются в localStorage под ключом rk86:debugger:breakpoints. Кнопки управления выполнением — там же в нижнем-левом блоке.

Карта памяти. Цветовая карта 64 КБ. Клик — переход к этому адресу в данных; правый клик — переход к коду.

Горячие клавиши

Активны при видимом окне отладчика:

КлавишаДействие
F5Запуск / пауза
F11Шаг
F10Шаг через подпрограмму (step over)
Shift+F11Выход из подпрограммы (step out)
F9Точка останова на курсоре кода
Ctrl+F10Выполнить до курсора кода

В hex-редакторе (байты памяти, регистры, поля точек останова):

КлавишаДействие
Tab / Shift+TabПерейти к следующему / предыдущему байту
EnterПодтвердить значение
EscОтменить

Автозагрузка через URL

ПараметрДействие
?file=<url> или ?run=<url>загрузить и запустить
?load=<url>загрузить без запуска
?handoff=<uuid>забрать бинарник из localStorage["<asm8|c8080|plm80>-handoff:<uuid>"] и запустить

Значение — имя файла из каталога, абсолютный URL, или data:[;name=<имя>];base64,<payload> (без name= используется inline.bin, загрузка с 0000h). Значение должно быть percent-encoded; поддерживается URL-safe base64 (-_).

Запуск через ?run= / ?file= / ?handoff= инъектирует G<addr>Enter монитору (а не прямой cpu.jump), чтобы монитор оставался в чистом prompt-loop и клавиатурные флаги были согласованы.

Handoff через localStorage

Для больших программ data URL не помещается в адресную строку (~8 КБ в Chrome, ошибка 431). Playground пишет {ts, url} в localStorage["<prefix>-handoff:<uuid>"] (префикс свой для каждого: asm8, c8080, plm80), открывает эмулятор с ?handoff=<uuid>; эмулятор пробегает по всем известным префиксам, читает и удаляет ключ (one-shot). Старые ключи (>1 часа) подметаются при следующей записи.

Ассемблер

Под /asm/ развёрнут asm8 playground — standalone-редактор i8080-ассемблера. Кнопка «Ассемблер» (или Cmd/Ctrl+K, A) открывает его в новой вкладке. Кнопка «run» собирает .rk-файл (заголовок start/end + трейлер E6 cs_hi cs_lo) и передаёт эмулятору через handoff.

Примеры — static/asm/examples/*.asm, редактируются без пересборки playground.

Компилятор C

Под /c8080/ развёрнут c8080-js playground — компилятор подмножества C в ассемблер Intel 8080 прямо в браузере. Кнопка «Компилятор C» в тулбаре открывает его в новой вкладке. Кнопка «run» компилирует, ассемблирует итоговый .asm, упаковывает в .rk и передаёт эмулятору через handoff — тем же путём, что и асcемблер.

Обновить playground из локальной копии c8080-js: just update-c8080.

Компилятор PL/M-80

Под /plm80/ развёрнут plm80 playground — компилятор PL/M-80 (язык системного программирования Intel, 1973) в ассемблер i8080. Кнопка «Компилятор PL/M-80» в тулбаре открывает его в новой вкладке; «run» доставляет результат эмулятору через тот же handoff-протокол.

Примеры — static/plm80/examples/*.plm (hello, counter, greeting, literally, strlen, sum, videomem). Обновить playground: just update-plm80.

Визуализатор WAV-лент

Под /tape/ развёрнут rk86-tape playground — визуализатор WAV-записей кассетных лент Радио-86РК (полог, синхромаркер, заголовок, данные, контрольная сумма; binary и BASIC). Кнопка с иконкой ленты в тулбаре открывает его в новой вкладке.

Демо-WAV — static/tape/wav/*.wav.

Веб-компонент

Эмулятор доступен как самостоятельный <radio86-emulator> (~45 КБ).

<script type="module" src="radio86-emulator.js"></script>
<radio86-emulator monitor="mon32.bin" file="CHESS.GAM" files-path="/files/"></radio86-emulator>
АтрибутПо умолчаниюОписание
monitormon32.binФайл монитора (ПЗУ)
fileПрограмма для автозагрузки и запуска
files-pathfiles/Базовый URL для файлов
scale1:1 пиксель"auto" для масштабирования

Каждый экземпляр полностью независим: собственный процессор, память, экран. Компонент генерирует событие ready с machine в e.detail. Демо с четырьмя эмуляторами — demo.html.

Терминальный эмулятор

bunx rk86                                  # монитор
bunx rk86 CHESS.GAM                        # загрузить и запустить
bunx rk86 -p CHESS.GAM                     # загрузить без запуска
bunx rk86 --exit-halt prog.bin             # выход при HLT
bunx rk86 -l                               # список файлов
bunx rk86 --online CHESS.GAM               # открыть в онлайн-эмуляторе rk86.ru

# детерминированные e2e-сценарии
bunx rk86 --headless --turbo --exit-halt \
  --input "KeyM,Enter,*500,Digit7,Digit6,Enter" \
  --snapshot out.json
ФлагОписание
-v, -h, -lверсия / справка / список файлов
-m <файл>монитор (по умолчанию: встроенный mon32.bin)
-pзагрузить без запуска
-g <адрес> / -G <адрес>запуск: CPU jump / через G-команду монитора
--exit-halt / --exit-address [адрес]условия выхода
--headless / --turbo / --timeout <сек>режимы для автотестов
--memory[-from|-to] <…> / --screen <файл> / --snapshot <файл>дампы при выходе
--input <seq>инъекция клавиш (*N — пауза на N мс)
--color <0|1|2|3>режим цвета: 0 ч/б (по умолчанию), 1 Толкалин, 2 Акименко, 3 Апогей
--onlineзагрузить файл на rk86.ea.deno.net (TTL 60 с) и открыть в браузере на rk86.ru

Форматы файлов: .pki/.gam/.rk/.rkr — магнитофонный формат с заголовком; .bin — сырой бинарный (с 0000h, или 10000h - размер если имя начинается на mon); .json — полный снимок состояния.

Структура репозитория

src/lib/core/           — ядро эмулятора (CPU, память, экран, клавиатура, звук, runner)
src/lib/web/            — браузерный слой
src/lib/terminal/       — терминальный эмулятор
src/lib/component/      — веб-компонент <radio86-emulator>
src/routes/             — SvelteKit страницы
static/files/           — бинарные файлы программ (180+)
static/catalog/         — метаданные и скриншоты
tests/                  — bun-тесты (166 тестов, 1.7M проверок)
packages/rk86/          — npm-пакет для терминала
docs/                   — публикуемый сайт (GH Pages, rk86.ru)
  (root)                — production-сборка
  beta/                 — экспериментальный слот (BASE_PATH=/beta)
  monitor/              — просмотрщик ROM-монитора (отдельный артефакт)
info/                   — документация и ассемблерные примеры
  RK86.md               — справочник программиста (память, периферия, монитор, видео, клавиатура)
  MIKROSHA.md           — заметки по Микроше
  SNAPSHOT.md           — формат JSON-снимков
  asm/                  — примеры на i8080-ассемблере

Документация

  • info/RK86.md — справочник программиста: карта памяти, периферия, монитор (переменные, таблица переходов, команды), видео, клавиатура, магнитофон, форматы файлов, шпаргалка по реверсингу i8080
  • info/MIKROSHA.md — заметки по компьютеру «Микроша»
  • info/SNAPSHOT.md — формат JSON-снимков эмулятора

Лицензия

MIT