
Эмулятор PDP-11/34 на уровне схем
ll/34 — это эмулятор на уровне схем для PDP-11/34A (1976), выполняющий виртуальный ЦП, восстановленный по принципиальным схемам, микрокоду и захватам логики реальной PDP-11/34A.
Изначально он создавался как цифровая копия реального ЦП для помощи в отладке на уровне сигналов. Виртуальный ЦП KD11-EA по сути представляет собой перевод принципиальных схем на C с обращениями к таблицам ПЗУ. Все комбинационные ПЗУ восстановлены, а тактовый генератор смоделирован с высокой точностью.
Эмуляция на уровне схем (таблицы истинности ПЗУ + комбинационная логика) была выбрана вместо вентильного уровня (Verilog), поскольку она достаточно низкоуровневая для воспроизведения аппаратных ошибок, но при этом достаточно быстрая для запуска программ.
Все устройства подключены к системной магистрали UNIBUS (unibus.c), которая выполняет декодирование адресов, синхронизацию и циклы шины.
Внутренне ЦП состоит из следующих компонентов:
Эмулирует передние панельные переключатели и индикаторы PDP-11/34A. Активна, когда ЦП остановлен (включение питания, команда HALT или Ctrl-P).
Позволяет инициализировать шину, загрузить ЦП, выполнять пошаговое исполнение кода, просматривать и записывать данные по произвольным адресам, а также завершить эмулятор.
Интерфейс отделён от движка, поэтому фотореалистичный графический интерфейс передней панели также предоставляется в WebAssembly.
Отладочная консоль предоставляет интерактивный отладчик как для микрокода, так и для кода на уровне команд:
s [n]: выполнить n микроинструкций по шагам с полным дампом состояния (MPC, АЛУ, шина, регистры)b адрес: установить точку останова по PC (восьмеричный), bl — список, bd n — удалитьg: продолжить выполнениеu [адрес] [n]: дизассемблировать инструкцииc [адрес] [n]: дамп памяти (восьмеричный)mmu: показать состояние ММУ (PAR/PDR ядра и пользователя, текущий режим помечен)r: дамп регистровОтладка ll-34 в процессе разработки оказалась настолько похожей на отладку реального оборудования, что был реализован внутренний логический анализатор для трассировки сигналов и зондирования тракта данных. Это оказалось решающим для отслеживания тонких ошибок в ПЗУ и синхронизации виртуального ЦП. Он также может использоваться как справочное средство для отладки реального оборудования, как и работающее оборудование помогло разработать эмулятор.
Логический анализатор позволяет зондировать 102 точки по основным сигналам ЦП, привязанным к физическим выводам микросхем (обозначения KD1:xx:pin соответствуют схемам DEC K1-5…K2-9). Для удобства предоставлены логические псевдонимы (MPC, ALU_OUT, IR, PSW…).
Частота дискретизации — тактовая частота ЦП в реальном времени (5 555 556 Гц) с разрешением 180 нс на отсчёт. Настраиваемый делитель уменьшает частоту для более длинных окон захвата.
Захваты используют кольцевой буфер (до 64 000 отсчётов) с настраиваемым запуском по любому сигналу, регулируемым положением триггера (соотношение до/после) и экспортом в CSV для автономного анализа.
Захваты логики широко использовались на протяжении всего проекта для картирования и отладки плохо документированных мультиплексных трактов.
ll-34 поставляется с несколькими программами и системами для тестирования: «Игра Жизнь», V6 UNIX, RT-11 V4 с оригинальной игрой Tetris и ATTN/11 — небольшим обучаемым трансформером с самовниманием.
./ll-34 --rk ./wasm/demos/rtv4_rk.dsk
Загрузочное ПЗУ автоматически загрузится с RK11 и запустит операционную систему. Команда DIR выведет список файлов, HELP — справку, RUN TETRIS запустит демо Tetris (хотя $TERM, вероятно, будет неверным). RUN ADVENT запустит Colossal Cave Adventure, собранную на реальной PDP-11/34.
./ll-34 --rk ./wasm/demos/v6bin.rk
Загрузчик выведет минимальное приглашение @. Введите rkunix и нажмите Enter; через несколько секунд должно появиться приглашение login:. Введите имя пользователя root без пароля — и вы в системе! Обратите внимание, что в ранних версиях Unix команда cd называлась chdir.
make + компилятор C11, других зависимостей нет.
Проверено: компилируется без предупреждений на Linux (x86_64 и aarch64) как с musl, так и с glibc, macOS aarch64, NetBSD 10 aarch64.
Кроме CLI, доступна автономная версия WebAssembly с фотореалистичным графическим интерфейсом: https://dbrll.github.io/ll-34.
Примечание: ll-34 — ресурсоёмкий эмулятор. В отличие от эмуляторов уровня команд, он выполняет микрокод по одному такту за раз и на каждом шаге запускает АЛУ, комбинационные ПЗУ, сверхоперативную память, тактовый генератор и шинную синхронизацию. Хост должен непрерывно поддерживать темп тактового генератора 5,5 МГц, чтобы обеспечить цикловую точность.
При запуске эмулятор выполняет самодиагностику и сообщает свою скорость относительно реального KD11-EA. Коэффициент ниже 1x означает, что хост не справляется, и точность синхронизации не гарантируется. Диагностика недоступна в версии WebAssembly из-за низкого разрешения таймеров браузера. Поскольку сборка WASM медленнее нативной, запуск на смартфоне, как правило, будет слишком медленным.
| Файл | Описание |
|---|
ucode_rom.h | 512×48-битное хранилище микрокода (биполярные ПЗУ), основанное на Verilog и дампах с Bitsavers. Каждое микрослово управляет АЛУ, сверхоперативной памятью, интерфейсом шины и ветвлением для одного микротакта. |
combo_roms.h | Комбинационные ПЗУ (E51-E83, E107), декодирование IR (E59/E60/E63/E69/E70/E71/E74), выбор функций АЛУ (E61/E82/E83), приоритет прерываний/ловушек (E52/E53) и логика кода условия (E68/E107), восстановленные по схемам и захватам логики. ПЗУ с открытым коллектором объединяются по схеме «монтажное ИЛИ» на шину MPC. |
kd11ea.c | Движок тракта данных. Выполняет один микротакт за такт. Базовые вентили 74xx симулируются с помощью логических операторов C (!, &&, >> и т.д.). АЛУ 74S181 полностью смоделировано (4 секции, 16 бит). |
mmu.c | Управление памятью. Пространства ядра/пользователя, 18-битная переадресация (3 сумматора 74S283), 16 пар PAR/PDR, регистры прерываний SR0/SR2 с логикой фиксации. |
clockgen.c | Тактовый генератор. Моделирует линию задержки E106 (обратная связь TAP 30/90/120, ожидание шины TRAN INH). Короткие такты: 180 нс, длинные: 240 нс, передачи по шине растягиваются до возврата SSYN. |
clock.c | Синхронизация реального времени. Поддерживает соответствие симулированного времени системному. |
int.c | Арбитр прерываний. Очередь приоритетов BR4-BR7, приблизительно воспроизводит порядок передачи по цепочке UNIBUS. |