Skip to content

prcoder-1/bk0010-emulator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

88 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Эмулятор-отладчик БК-0010-01

Эмулятор советского персонального компьютера БК-0010-01 (процессор К1801ВМ1, клон PDP-11) на C++17 / Qt6 / OpenGL с отладчиком в стиле Soft-ICE.

debugger

Возможности

  • Процессор К1801ВМ1 — полный набор инструкций PDP-11 (+ SOB, XOR), точный расчёт флагов N/Z/V/C, все 8 режимов адресации, прерывания и векторы.
  • Экран через OpenGL (QOpenGLWidget): режимы 256×256 (4 цвета) и 512×256 (ч/б), палитры БК-0010, вертикальный скролл. Переключение — F10.
  • Загрузка и исполнение .BIN (игр) с автозагрузкой ПЗУ-монитора.
  • Клавиатура БК-0010: когда отладчик выключен, ввод с клавиатуры хоста идёт в БК (коды КОИ-7). Латиница/цифры/пунктуация, кириллица (КОИ-7 Н1), спец-клавиши (стрелки, ВВОД, ЗАБ, ВС, СБР, функциональные), СУ(Ctrl)+буква → управляющий код; РУС/ЛАТ переключается автоматически при смене языка ввода, а также вручную клавишами левый Shift (РУС) и правый Shift (ЛАТ) — их же игры часто используют как «выстрел влево/вправо» (Shift, а не Ctrl, чтобы не мешать Ctrl-шорткатам приложения). 50 Гц прерывание (вектор 0100) и прерывание клавиатуры (векторы 060 / 0274).
  • Звук пищалки — генерация сэмплов в ядре (Speaker) с воспроизведением через QAudioSink (при наличии Qt6 Multimedia). Отключение звука — Ctrl+M.
  • Отладчик Soft-ICE (F12) — полупрозрачный оверлей поверх экрана БК: регистры/PSW, дизассемблер с подсветкой PC и точками останова, дамп памяти, стек. Пошаговая отладка с одновременным показом экрана БК.
  • Визуализация памяти — графический вид памяти 1/4/8 бит на пиксель, ч/б и цвет, с тепловой картой обращений: давно не используемая память показывает своё содержимое ярко, а свежий доступ вспыхивает цветом и плавно затухает — чтение зелёным, запись красным, исполнение кода синим. По умолчанию во всё окно показывается только ОЗУ; флажок «Показать ПЗУ» добавляет ПЗУ (весь адресный диапазон в более мелком масштабе).
  • Горячий путь — самые исполняемые цепочки базовых блоков (пути), связанные наиболее частыми переходами, отсортированные по доле времени CPU (топ-N). Каждый путь свёрнут в строку-сводку (ранг, вход, число блоков, %, тепловая полоса); левый клик по треугольнику разворачивает путь в его блоки (с переходами → адрес), а блок — в ассемблерные инструкции со счётчиками исполнений. Клик по телу строки ведёт дизассемблер на адрес. Правый клик скрывает адрес (напр. цикл-пустышку), 0 — показать всё, +/ — число путей. Прокрутка — колесо / перетаскивание. Строки подкрашены по «температуре» (частоте исполнения).
  • Пламенный граф (Ctrl+F) — flame graph по восстановленному дереву вызовов: каждый прямоугольник — кадр стека, ширина ∝ времени CPU (inclusive), вниз = глубже по стеку (корень/main вверху). Стек восстанавливается на лету по JSR/возвратам (и прерываниям). Клик — углубиться в поддерево, ПКМ/ Backspace — вверх, 0 — весь граф, Del — сброс; клик ведёт дизассемблер на подпрограмму, наведение показывает собств./вкл. долю.
  • Хронология вызовов (Ctrl+T) — времяупорядоченный flame chart (как в Chrome DevTools/speedscope): X = время CPU, Y = глубина стека, каждый бар — один вызов подпрограммы на всём протяжении, пока он был на стеке. Правый край — «сейчас». Колесо — зум времени, тащить — прокрутка по глубине, клик — в дизассемблер.
  • Все окна профилировщика связаны общей подсветкой (наведение на подпрограмму подсвечивает её во всех окнах и в дизассемблере). У «Горячих инструкций во времени» дополнительно: G — агрегация по подпрограммам, S — стопка (streamgraph), F — маркеры кадров по таймеру, колесо над графиком — зум по времени.
  • Сохранение/восстановление полного состояния (Ctrl+S / Ctrl+L).

Сборка

Требуется CMake ≥ 3.16, компилятор C++17, Qt6 (Core, Gui, Widgets, OpenGLWidgets). Опционально Qt6 Multimedia для звука (qt6-qtmultimedia-devel).

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j

Запуск

./build/bk0010-emulator [путь/к/игре.bin]

ПЗУ (monit10.rom, basic10.rom) ищутся в каталоге roms/ (задаётся при сборке, переопределяется --roms <dir> или переменной BK_ROM_DIR).

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

Клавиша Действие
F12 Включить/выключить отладчик Soft-ICE
F7 Шаг с заходом (step into)
F8 Шаг с обходом (step over)
F9 Точка останова на текущем PC
G Продолжить выполнение
F10 Переключить режим экрана (цвет ↔ ч/б)
Ctrl+R Сброс
Ctrl+M Включить/выключить звук
Ctrl+G Горячий путь
Ctrl+K Граф вызовов
Ctrl+F Пламенный граф
Ctrl+T Хронология вызовов (flame chart)
Ctrl+H Горячие инструкции во времени
Ctrl+I Визуализация памяти
Ctrl+S/Ctrl+L Сохранить / восстановить состояние

Меню Отладка открывает окна профилировщика (горячий путь, граф вызовов, пламенный граф, горячие во времени) и визуализации памяти.

Тесты

ctest --test-dir build          # или ./build/cpu_tests

Юнит-тесты покрывают декодер инструкций, флаги, ветвления, JSR/RTS, SOB и сохранение/восстановление состояния.

Безголовый режим (для проверки/скриншотов)

QT_QPA_PLATFORM=offscreen ./build/bk0010-emulator --frames 200 --shot out.png game.bin

Доступны: --frames N, --shot, --dbgshot, --memvis, --hotpath, --callgraph, --flame, --flamechart, --hotchart, --mono, --key <код>, --keyframe N.

MCP-сервер (отладка через Claude)

Эмулятор умеет работать как MCP-сервер (Model Context Protocol) — тогда Claude может загружать .BIN, шагать по коду, читать/писать память и регистры, ставить точки останова, снимать скриншоты и смотреть «горячие» инструкции сам.

./build/bk0010-emulator --server        # JSON-RPC 2.0 по stdio (по строкам)

Регистрация в Claude Code — файл .mcp.json в корне проекта уже готов (сервер bk0010). После сборки запустите Claude Code из этого каталога и подтвердите подключение сервера.

Инструменты (все адреса/значения принимают десятичное, 0x… hex или восьмеричное с ведущим 0 — по соглашению БК):

Инструмент Назначение
bk_load загрузить .BIN (сначала грузится монитор) и запустить
bk_reset сброс машины
bk_run / bk_run_until выполнять кадры / до адреса-символа
bk_step / bk_step_over шаг внутрь / через JSR·EMT
bk_regs / bk_set_reg чтение / запись R0–R7, SP, PC, PSW
bk_read_mem / bk_write_mem память словами или байтами
bk_disasm дизассемблирование
bk_break / bk_unbreak / bk_breakpoints точки останова
bk_key нажать клавишу (КОИ-7); hold:true — удерживать (для игр, опрашивающих 0177716, напр. движение в Digger), hold:false — отпустить
bk_screenshot PNG экрана БК
bk_audio записать звук динамика (0177716) в WAV за N кадров + пик/активность/высота
bk_state_save / bk_state_load сохранить / восстановить состояние
bk_symbols загрузить символы из .map (GNU ld) — адреса по имени
bk_hotspots самые часто исполняемые инструкции

Архитектура

  • src/core/ — ядро эмуляции (без Qt): Cpu, Memory, Disasm, Screen, Speaker, Trace, Board (главный цикл, I/O-регистры, прерывания, save/restore).
  • src/ui/ — Qt6: MainWindow, GlScreen (OpenGL), DebuggerOverlay, MemVisWidget, HotPathWidget, CallGraphWidget, FlameWidget, FlameChartWidget, HotChartWidget.
  • src/mcp/McpServer: MCP-сервер поверх ядра (JSON-RPC по stdio, QtCore JSON).

Ядро исполняет инструкции по кадрам 50 Гц (3 МГц), UI-поток отображает текстуру экрана и панели отладчика.

Справочник по железу БК-0010-01 (карта памяти, регистры, векторы, кодирование экрана, палитра, формат .BIN, тактирование) — в docs/BK0010-hardware.md. Указания для будущих сессий Claude Code — в CLAUDE.md.

About

Эмулятор советского персонального компьютера БК-0010-01 (процессор К1801ВМ1, клон PDP-11) на C++17 / Qt6 / OpenGL с отладчиком и профилятором.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors