一个叫floooh的开发者,在2021年12月15日放出一张不起眼的网页:tiny8bit-preview。页面上密密麻麻排着十几台老电脑的截图——Commodore C64、VIC-20、ZX Spectrum 48k/128、Amstrad CPC464/6128、Acorn Atom,还有几台东德时期的Robotron Z1013、Z9001,每一张截图点开都是一个能在浏览器里直接跑起来的模拟器,甚至配了CP/M、FORTH、BASIC开发环境,外加几十个CPC平台的demoscene老作品,点一下就能运行。

单看页面,这就是一份复古电脑的"点播列表",热闹但谈不上新鲜——浏览器里跑老机器模拟器不是新技术方向。但两天后,floooh发了一篇技术博客,讲他把Z80芯片模拟器从指令步进重写成了周期步进(cycle-stepped)模型。这两件事凑在一起看,页面的性质就变了:它更像是一次架构验证的展示,而不是单纯的怀旧陈列。

十几台机器背后是同一套代码

这十几种系统硬件差异很大,东德机器和英美家用机的芯片组几乎不共享设计传统。但它们的浏览器模拟器背后,用的是floooh维护的同一个C语言项目chips——一套无依赖、以头文件形式存在的8位芯片与系统模拟工具箱。

这意味着C64的6502 CPU模拟代码、ZX Spectrum的Z80 CPU模拟代码,理论上是被多个系统复用的,而不是每台机器单独写一遍。对于做模拟器或者研究计算机体系结构的人来说,这才是页面真正值钱的地方:一套底层库撑起了显示芯片、声音芯片、CPU三者的同步逻辑,能同时应付这么多风格迥异的老机型,说明这套架构设计本身经受住了考验。

  • 结论.真正值得关注的不是"又出了几个老游戏模拟器",而是一套C语言底层库能否在多种硬件上稳定复用。

周期步进和指令步进,差在哪

模拟CPU执行指令有两种做法:一种是指令步进,把一条指令当成一个不可分割的黑箱直接跑完;另一种是周期步进,把每条指令拆成一个个时钟周期去模拟,更贴近真实硬件的时序行为。

这个区别在跑简单程序时感觉不出来,但一旦涉及CPU和显示芯片、声音芯片之间的精确同步——比如demoscene作品里那些卡着显示时序做特效的老程序——指令步进模型就容易露馅,画面撕裂或者音画不同步。floooh在2019年12月已经把6502重写成了周期步进版本,Z80这次补上,时间上落后了两年多。

两颗CPU的周期步进重写时间线 6502重写 2019年12月 C64 / VIC-20 用 Z80重写 2021年12月17日 ZX/CPC/东德机用 12月15日:预览页发布 比Z80博文早两天
预览页比技术博文早两天上线,更像是配套展示,不是独立更新。

和JSMESS、v86比,这条路线选的是精简

浏览器怀旧模拟这条赛道,早年靠Flash和Java Applet撑场面,后来出现了JSMESS——把MAME/MESS这套重型模拟框架搬进浏览器,覆盖面极广但体积沉重;另一条路线是v86,专注x86 PC虚拟化,走的是"装一台完整PC进浏览器"的思路。

floooh的chips库明显是另一种取舍:不追求硬件覆盖广度,只服务8位机这个细分领域,用WebAssembly编译精简的C代码,换来更小的体积和更快的启动速度。这个选择的代价是覆盖面窄——你在这个页面上找不到后来的16位机或街机,它服务的是复古计算爱好者、demoscene社区,以及需要教学案例的计算机体系结构老师,而不是想要"什么都能模拟"的收藏家。

对复古玩家而言,这意味着不用装模拟器软件、不用找ROM文件配置环境,打开网页就能看CPC平台的demoscene老作品跑起来。对开发者而言,chips库的周期步进思路和头文件架构,是可以直接借鉴到其他CPU模拟项目里的现成方案。检索线索还提示,Tiny Emulators这个项目名字本身可能在2021年之前就存在过讨论,这次12月的发布更像是一次阶段性升级,而不是从零起步——原文的单一日期容易让人误以为这是个全新项目,实际上它是长期迭代出来的结果。