ll/34 是一个针对 PDP-11/34A(1976 年)的电路级模拟器,运行着一个根据实际 PDP-11/34A 的原理图、微码和逻辑捕获逆向工程出的虚拟 CPU。
它最初被设计为实际 CPU 的数字复制品,以辅助在信号层面进行故障排除。 虚拟 KD11-EA CPU 本质上由原理图的 C 语言翻译和 ROM 表的查找组成。所有组合逻辑 ROM 均已被逆向工程,且时钟发生器被精确建模。
选择电路级(ROM 真值表 + 组合逻辑)而非门级(Verilog)的原因是,它能够低到足以复现硬件错误,同时又快得足以运行程序。
所有设备都插入 UNIBUS 背板(unibus.c),该背板执行地址解码、时序和总线周期。
在内部,CPU 由以下组件组成:
| 文件 | 描述 |
|---|---|
ucode_rom.h | 512x48 位微代码存储(双极型 PROM),基于 Bitsavers 的 Verilog 和转储。每个微字控制 ALU、暂存器、总线接口和分支,用于一个微周期。 |
combo_roms.h | 组合逻辑 ROM(E51-E83, E107)、IR 解码(E59/E60/E63/E69/E70/E71/E74)、ALU 功能选择(E61/E82/E83)、陷阱/服务优先级(E52/E53)和条件代码逻辑(E68/E107),全部从原理图和逻辑捕获中重新构建。集电极开路 ROM 通过线或连接到 MPC 总线。 |
kd11ea.c | 数据通路引擎。每个周期执行一步微代码。基本 74xx 门通过 C 逻辑运算符(!、&&、>> 等)模拟。74S181 位片 ALU 被完整建模(4 个切片,16 位)。 |
mmu.c | 内存管理。内核/用户地址空间,18 位重定位(3 个 74S283 加法器),16 个 PAR/PDR 对,带冻结逻辑的 SR0/SR2 中止寄存器。 |
clockgen.c | 时钟发生器。模拟 E106 延迟线(TAP 30/90/120 反馈,TRAN INH 总线等待)。短周期:180 ns,长周期:240 ns,总线传输会一直延伸直到 SSYN 返回。 |
clock.c | 实时节拍。使模拟时间与墙钟时间保持同步。 |
int.c | 中断仲裁器。BR4-BR7 优先级队列,近似 UNIBUS 菊花链授权顺序。 |
模拟 PDP-11/34A 的前面板开关和指示灯。当 CPU 暂停时(上电、HALT 指令或 Ctrl-P)激活。
它允许初始化总线、启动 CPU、单步执行代码、检查与存入任意地址的数据,以及退出模拟器。
前端与引擎分离,因此还以 WebAssembly 形式提供了一个逼真的前面板 GUI。
调试控制台为微代码级和指令级代码提供交互式调试器:
s [n]:单步执行 n 条微指令,并完整显示状态转储(MPC、ALU、总线、寄存器)b addr:设置 PC 断点(八进制),bl 列出,bd n 删除g:继续执行u [addr] [n]:反汇编指令c [addr] [n]:内存转储(八进制)mmu:显示 MMU 状态(内核 + 用户 PAR/PDR,当前模式标记)r:寄存器转储在开发 ll-34 过程中的故障排除与在真实硬件上的故障排除非常相似,因此实现了一个内部逻辑分析仪来追踪信号并探测数据通路。这有助于发现虚拟 CPU 中微妙的 ROM 和时序错误。它也可以作为真实硬件故障排除的参考,就像工作硬件帮助开发了模拟器一样。
逻辑分析仪允许探测 102 个主要 CPU 信号点,映射到物理芯片引脚(KD1:Exx:pin 表示法,匹配 DEC 原理图 K1-5 到 K2-9)。提供了逻辑别名(MPC、ALU_OUT、IR、PSW…)以方便使用。
采样率是实时 CPU 时钟(5,555,556 Hz),分辨率为每样本 180 ns。可配置的分频器可降低采样率以获取更长的捕获窗口。
捕获使用环形缓冲区(最多 64K 样本),可在任意信号上配置触发、可调触发位置(前/后比例),并支持 CSV 导出以进行离线分析。
在整个项目中大量使用逻辑捕获来映射和调试不为人知的多路复用通路。
ll-34 附带了一些可供尝试的程序和系统:生命游戏、V6 UNIX、RT-11 V4 及原始俄罗斯方块游戏,以及 ATTN/11,一个带有自注意力机制的小型可训练 Transformer。
./ll-34 --rk ./wasm/demos/rtv4_rk.dsk
引导 ROM 会自动从 RK11 加载并启动操作系统。DIR 列出文件,HELP 打印帮助信息,RUN TETRIS 启动俄罗斯方块演示(尽管 $TERM 可能设置错误?)。RUN ADVENT 启动 巨洞冒险,它是在真实的 PDP-11/34 上构建的。
./ll-34 --rk ./wasm/demos/v6bin.rk
引导加载程序会打印一个最小的 @ 提示符。输入 rkunix 并回车,几秒钟后您应该会看到一个 login: 提示符。输入用户名 root(无密码),即可进入系统!注意:在早期 Unix 中,cd 被称为 chdir。
make + C11 编译器,无其他依赖。
已验证可在 Linux(x86_64 和 aarch64)上使用 musl 和 glibc 编译无警告,macOS aarch64 以及 NetBSD 10 aarch64。
除了 CLI 外,还有一个独立的 WebAssembly 版本,带有逼真的 GUI,可在此处获取:https://dbrll.github.io/ll-34。
注意:ll-34 是一个资源密集型模拟器。与指令级模拟器不同,它逐周期执行微代码,并在每一步运行 ALU、组合逻辑 ROM、暂存器、时钟发生器和总线时序。 宿主必须持续维持 5.5 MHz 的时钟发生器速度,以保持周期精确。
启动时,模拟器会进行自基准测试,并报告其相对于真实 KD11-EA 的速度。低于 1x 的比率意味着宿主无法跟上,时序精度无法保证。该基准测试在 WebAssembly 版本中不可用,因为浏览器计时器分辨率使其不可靠。由于 WASM 构建比本机慢,在智能手机上运行通常会过慢。