dbreunig/nesformer
游戏把一个 NES 6502 CPU 与部分 NROM 游戏编译进固定的模型权重,以极慢但精确的方式运行。
nesformer 是一个概念验证项目:它把 NES 的 6502 CPU、2 KB 工作内存和卡带程序 ROM 放进一个标准 Qwen3_5ForCausalLM checkpoint 里。这些权重不是训练出来的,而是由编译器计算生成的。运行游戏时,模型逐个 token 预测 CPU 的执行日志,小型宿主程序负责画画面、读手柄并触发 vblank 中断。它沿用了 Qwenputer 的编译器,以及“用模型的 Gated DeltaNet 状态充当机器内存”的核心技巧。
实际能做什么
CLI 提供 run(运行 ROM 并保存 GIF)、check(权重与参考 6502 并排运行,遇首个差异即停)、trace(打印 token 流)、build(重新编译 checkpoint)和 info。手柄输入是帧区间脚本,例如按住 right+b,或在指定帧两次按 a,因此可以确定性地驱动游戏,并把输出保存为 GIF 或 PNG。
模型里有什么、没有什么
权重里包含全部官方操作码、寻址模式、标志位、栈、BRK/NMI 入口、2 KB RAM,以及按两份存储的 32 KB PRG-ROM。PPU、手柄、APU 寄存器与 NMI 时序都在宿主程序里,宿主只能通过 trace 看到 CPU 寄存器和内存。PPU 逐扫描线渲染,所以扫描线中途的特效无法还原;没有声音,sprite-0 命中与 sprite 溢出只是近似。如果期待的是通用 NES 模拟器,而非可视演示,这些差异很关键。
依赖与限制
需要 Python 3.11 或更高版本,以及 numpy、scipy、numba、pillow;需在顶层目录运行,并把单独下载的 weights/ 放在包旁边,README 给出了校验解压结果的命令。只支持 NROM 卡带(iNES mapper 0),且 ROM 需自备——仓库仅附带三个自由许可的测试 ROM。使用 bank 切换芯片的游戏会直接报错停止。非官方操作码和跳入 RAM 都会输出 HALT,不支持 IRQ(APU frame、DMC);BRK 和 NMI 可用,读取 $4020–$7FFF 返回 0。
速度是最大约束:默认 numba 引擎在作者机器单核 CPU 上约 1,650 tokens/s,numpy 约 210,原生 transformers 约 10,而真实主机大约需要 700,000 tokens/s。开启空闲循环跳过后,README 报告运行速度比真机慢 150–290 倍;快速开始示例中 600 帧(10 秒 NES 时间)约需 25 分钟。
验证范围
参考 CPU 与 nestest 的黄金日志在 3,348 条指令上一致,并与 py65 在 570 万条游戏指令上一致;自由运行的权重在 nestest、Thwaite 和 Full Game 上据称与参考完全一致,保存的帧也全部匹配,见 README 的验证章节。这些是作者自己与常规模拟器的对比,并非独立审计。
许可方面:nesformer 为 MIT,改编自 Qwenputer 的编译器代码也是 MIT,附带的测试 ROM 保留各自许可(Full Game 为 MIT,Thwaite 为 GPL-3.0)。作者在 Show HN 讨论中说明,最初可用的代码和权重来自对 AI 模型的两条提示,并以模拟社区的 conformance 测试作为 oracle 讨论;这只是制作背景,不构成验证。该 checkpoint 是普通 Hugging Face 目录,可由原生 transformers 加载。
本文由 AI 根据项目 README 生成,更新于 2026年10月30日,以项目官方文档为准。