Эмулятор Радио-86РК
May 17, 2026 · View on GitHub
Эмулятор Радио-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) — production | just 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 | Кириллица → RK86 | J | Прямой ввод |
Заморозка состояния
Кнопка «Заморозить состояние» (или 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>
| Атрибут | По умолчанию | Описание |
|---|---|---|
monitor | mon32.bin | Файл монитора (ПЗУ) |
file | — | Программа для автозагрузки и запуска |
files-path | files/ | Базовый URL для файлов |
scale | 1: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