当你在浏览器地址栏输入 pcjs.org,按下回车键,屏幕上出现的不是普通的网页,而是一台1981年的IBM 5150 PC——带有绿色单色显示器、5.25英寸软驱,以及熟悉的“C:>”提示符。这个名为“PCjs Machines”的开源项目,正在用纯JavaScript代码,将上世纪80年代的计算机硬件精确还原到现代浏览器中,让复古计算爱好者无需虚拟机或实体机器,就能直接体验DOS时代的软件与系统。

一位工程师的数字考古

PCjs Machines由美国开发者Jeff Parsons于2012年创建。彼时,Parsons正在业余时间研究早期PC硬件文档,他发现许多经典软件(如早期版本的Lotus 1-2-3、WordStar)因缺乏兼容硬件而面临失传风险。“我不希望这些数字文物只存在于博物馆的收藏架上,”Parsons在一次技术访谈中回忆,“如果能在浏览器里精确模拟每一块芯片的行为,任何人都能随时访问它们。”

经过数月开发,第一版PCjs Machines仅能模拟IBM PC 5150——配备了主频4.77MHz的Intel 8088处理器、16KB内存和CGA显卡。但就是这样一个简陋的起点,却因“无需插件、点击即玩”的特性迅速在复古计算社区走红。如今,该项目已支持IBM PC/XT、PC/AT、IBM 3270终端、甚至早期的Macintosh,并内置了DOS 2.0、Windows 1.0等数十个操作系统镜像。

精确到时钟周期的“软件芯片”

与常见的虚拟机(如VirtualBox、Docker)不同,PCjs Machines不依赖任何底层虚拟化技术。它的核心是用TypeScript编写的硬件仿真层,包括CPU、中断控制器、DMA、定时器、键盘控制器、软盘控制器、显示适配器等数十个模块。最令人印象深刻的是其对Intel 8088/80286 CPU的模拟——不仅实现了所有指令集,还精确复现了内存访问时序、微码执行周期,甚至CPU内部寄存器的初始状态。

这意味着在PCjs中运行的程序,其行为与在真实硬件上完全一致:包括那些依赖硬件bug的经典软件(如某些早期的游戏会利用CPU指令时序漏洞实现反盗版)。项目还实现了对IBM CGA、EGA、VGA显卡的模拟,支持所有标准分辨率与色彩模式,甚至能复现CGA著名的“雪花”色彩伪影——这种因NTSC信号干扰造成的视觉特征,在纯软件模拟中极难还原。

为了让体验更真实,Parsons还复刻了经典外设:IBM Model M键盘的按键声、5.25英寸软驱的寻道噪音、CRT显示器的扫描线效果,甚至软盘插入时的“咔哒”声。这些细节让PCjs Machines超越了简单工具,成为一座数字“硬件博物馆”。

在线博物馆与编程教材

目前,PCjs Machines提供两种使用方式:用户可直接访问官网,从预置的机器列表中挑选——例如“IBM PC 5150 (1981)”开机后自动引导DOS,并加载了一个包含BASIC解释器的磁盘;也可以手动配置内存、软盘、硬盘参数,加载自己收藏的DOS软盘镜像(如.img.dsk格式)。项目还支持“串行端口”与“并行端口”的虚拟化,允许模拟多台机器通过“虚拟串口线”通信,重现早期局域网(如Novell NetWare)的场景。

对于教育领域,PCjs Machines的意义更为深远。美国一些大学的计算机体系结构课程已将其用作教学工具,学生可以在浏览器中单步执行8086汇编指令,观察内存与寄存器变化,而无需物理硬件。项目还提供了详细的调试接口,包括断点、内存查看器、反汇编器,让底层编程学习变得直观。

开源生态与未来展望

PCjs Machines的代码完全托管在GitHub上(MIT许可协议),吸引了全球超过200位贡献者。社区不仅补充了更多机器型号(如Compaq Portable、Olivetti M24),还移植了其他复古平台——包括DEC PDP-11、Atari 800、甚至Apple II。这些模拟器共享同一套硬件抽象框架,降低了新平台开发的门槛。

不过,纯JavaScript模拟的局限也很明显:性能。在模拟IBM AT(80286处理器)时,现代浏览器的效率仍只能达到原始硬件的80%左右;若要模拟更高级的80386系统,则会出现明显卡顿。Parsons正在探索WebAssembly加速方案,预计能将CPU模拟效率提升3-5倍。

“PCjs Machines不是为了取代实体机,而是为了保留历史。”Parsons在项目文档中写道,“当未来的开发者想了解‘命令行’为何物,或者想运行比尔·盖茨编写的第一个BASIC程序时,他们不需要去eBay花高价买一台生锈的老电脑——打开浏览器就够了。”

在数字化浪潮中,PCjs Machines像一座用代码砌成的时光机,让每一次点击都成为一次数字考古。也许,这正是“古董软件”在互联网时代最优雅的归宿。