Visual 6502:在浏览器里看着晶体管一颗颗跑起来
文章摘要
Visual 6502 是一个在浏览器里运行的、晶体管级别的 MOS 6502 处理器模拟器——不是指令级模拟,不是逻辑门级模拟,而是把这颗芯片上每一颗晶体管的真实物理状态画出来给你看。页面正中是芯片的彩色版图,颜色对应每个多边形当前是高电平还是低电平;按 n 单步推进模拟,按 z / x 缩放,鼠标左键拖动平移。你能亲眼看到芯片如何从内存取指令和数据、寄存器和内部总线如何工作,以及仅仅是把「时钟」这一个输入引脚来回拉高拉低,就足以驱动整颗芯片一步步跑完一段程序。
这个项目的来路比页面本身更有意思。Visual6502.org 是一个小团队的「计算机考古」工程,目标是保存、研究和记录历史计算机,并且坚持用视觉、直观的方式呈现,既用于教育与启发,也作为经典计算机系统的可验证参考。2009 年夏天,他们从一颗实物 6502 开始:剥开封装露出硅片,对表面做高分辨率拍照,同时也拍下衬底;用这两张高度精细且对齐的照片,为芯片上每一个物理元件手工建立矢量多边形模型——6502 一共约两万个。由于这些元件之间只以几种简单方式相互接触并构成电路,他们通过对多边形做求交运算,就直接得出了整颗芯片的完整数字模型和晶体管级模拟。这个模型精确到可以跑真实的 6502 程序,包括 Atari 游戏。项目于 2010 年 7 月 27 日在洛杉矶 SIGGRAPH 首次亮相。
团队的工作远不止 6502。他们收到了 200 多颗捐赠芯片、开封了其中 100 多颗,还把 Atari 2600 的 TIA 芯片重建结果与 6502 模拟拼在一起,直接产出经典 Atari 游戏的视频帧;他们也在重建若干经典声音与语音合成芯片(Commodore 6581 和 8580 SID 等),以及 Zilog、AMD、Intel、Motorola、General Instruments、TI 等厂商的多颗经典芯片。他们特别欢迎大家提供损坏或已失效的芯片和电路板——恰恰因为坏掉的器件对这种「剥开来拍照建模」的方法毫无损失,反而是完美素材,从而能在实物彻底失效之后,把这些硬件的形态与功能长久保存下来。页面本身老老实实提示这份模拟需要较新的浏览器和大量内存,站点最后一次更新是 2012 年 1 月,那时它已累计 25 万独立访客、送出 2TB 以上的芯片照片与模拟数据。源码在 GitHub 上以 visual6502 开源。
HN 评论精华
这条讨论意外地变成了一场跨平台跑分大会——因为晶体管级模拟极其吃单核性能,这个页面成了一个天然的单线程基准测试。
- ColdStream:开了个头,说这是个很好玩的系统跑分方式,他 13 代 i5 工作本在 Advanced 模式下只跑到 4.1Hz;后来更正说普通模式实际在 22Hz 到 44Hz 之间波动,每次运行差异大得离谱,他决定把锅推给 Windows 的电源管理或热降频。
- va3ndf / andrehacker:M4 Pro 上 88Hz。andrehacker 确认了这个数字并补全浏览器差异:Chrome 88Hz、Firefox 70Hz、Safari 62Hz。
- andrehacker(最妙的一条):顺势点出一个漂亮的历史闭环——ARM 架构(Acorn RISC Machine)由 Sophie Wilson 和 Steve Furber 在 Acorn 设计时,可以说是从 6502 演化而来的。也就是说,跑得最快的 6502 模拟器,跑在 6502 的精神后代上。
- flenserboy:M4 Max + Brave 最高 93Hz,通常 90Hz 左右;但 Advanced 模式下从 22Hz 起步然后一路掉到个位数,Safari 也是从 40Hz 持续下滑——说明高级模式存在某种随时间累积的性能退化。
- 各路硬件数据:12 代 i7-12700 跑 70–75Hz(Firefox 比 Chrome 快约 10Hz,出乎意料);Ryzen 7 3600X 是 Chrome 34Hz / Firefox 47Hz;老旧的 i5-3570K + Firefox 17.5Hz;Ryzen 7640U 省电模式 22–33Hz、性能模式 50–55Hz;iPhone 15 Pro 62Hz;Pixel 6 40–50Hz;M3 Max 85Hz。jandrese 困惑于为何新得多的芯片反而明显更慢,ErroneousBosh 则认为在 i7-8700 上 45–55Hz 大概就是天花板附近了,各种「优化技巧」在这里都没用。
- flohofwoe:最有价值的技术补充。他在某个圣诞假期用 WASM + WebGL + Dear ImGui 重写了一个「remix」版,渲染性能好得多,还集成了汇编器和一批可视化工具,底层沿用 visual6502 团队逆向出的原始网表数据,模拟循环则用 perfect6502。他做了 6502、Z80 和 2A03 三个版本,并提醒模拟被节流到每帧一个半时钟周期,所以别拿它当跑分用。
- wk_end:顺着 perfect6502 的说明算了一笔账:那个 C 实现在 2025 年高端 CPU 上能达到 1MHz 的三十分之一,也就是约 30kHz——虽然依旧很慢,但比本帖里大家报的数字快了约 1000 倍。他指出 JS 和原生的差距通常在一个数量级内而不是三个,于是去 profile 了原版 Visual6502,一眼就能看出大量性能是丢在渲染上的(所以 flohofwoe 重写渲染这一刀砍得对)。他进一步好奇极限在哪:perfect6502 本身也是纯单线程 CPU 驱动,完全没吃到现代机器的红利,但他不确定这类任务能否有效切分到多核或丢给 GPU——硬件本身是天然并行的,可同步开销恐怕会把收益吃光。
- flohofwoe(回应):解释了模拟内核的原理:核心就是两个函数,本质上是对一份「脏晶体管列表」沿其所有连接反复重算状态,循环直到节点列表重新稳定(即上一轮的状态变化不再引发新的状态变化)。他也没想清楚这个过程怎么做多线程或 SIMD 化。
- BiscuitBadger:推荐 metalnes——Nesticle 作者 Icer Addis 做的门级 NES CPU + PPU 模拟,并留下一句很有画面感的评价:一整个世界就藏在一条扫描线里。
- timmg / SomeHacker44 / jagged-chisel:一起惋惜 Evil Mad Scientist 那个用离散元件搭出来的巨型 6502 电路一直没量产。有人说愿意掏钱买,但对方当年估过,真要做来卖大概得 2000 到 4000 美元。
- malkia / wang_li:怀旧线——小时候在 Apple II 兼容机上玩过教学用的 6502 模拟器(MECC 汇编语言课件,现在能在 archive.org 上找到)。用 wang_li 的话说,小时候终于能看见「里面到底在发生什么」,这件事本身就非常了不起。