如何用C头文件构建一台8位计算机
想象一下,你决定为Commodore 64或ZX Spectrum编写一个模拟器。通常这会演变成深入研究Z80或MOS 6502处理器手册、实现时序、以及尝试让图形输出正常工作的漫长过程。但有一个项目提供了不同的方法——就像在面包板上组装套件一样。
我们要说的是开发者floooh的chips仓库。这是一个纯C语言编写的8位芯片模拟器和完整系统集合。其主要亮点是所有内容都封装在头文件中(纯头文件),组件之间的交互模拟真实的物理引脚。
这个项目的核心是什么
当我们写代码时,习惯于对象、方法和回调。而在chips中,一切都不同。作者引入了引脚位掩码的概念。每个芯片都有一个函数,该函数接受一个64位数字。这个数字中的每一位代表芯片特定"引脚"的状态:地址总线、数据总线、读/写信号或中断。
你输入一个掩码,函数计算芯片的一个时钟周期,然后返回更新后的掩码。要构建一台计算机,你实际上是在代码中"拉线",将一个芯片输出掩码的位复制到另一个芯片的输入掩码。如果你曾经拿过烙铁或研究过旧硬件原理图,这会感觉非常符合逻辑。
盒子里有什么
该仓库包含了家用电脑黄金时代的相当多的硬件。
首先是处理器。有经典产品:Z80、6502和8080。与它们一起的还有外围芯片,没有这些芯片计算机无法启动。例如i8259中断控制器、i8253定时器或MC6845视频控制器。
除了单独的组件,作者还在项目中包含了现成的组装系统。你可以运行以下模拟:
- Amstrad CPC 464/6128
- Commodore 64
- ZX Spectrum 48/128
- Acorn Atom
- 甚至还有苏联的RK-86(或者更准确地说,是基于8080的近亲)
所有这些都是用GCC、Clang甚至MSVC都能正常处理的C99子集编写的。无需外部依赖——只需包含相应的头文件就可以开始。
技术原理
尽管追求引脚模拟的"纯粹性",作者在性能方面做出了合理的妥协。如果我们诚实地模拟每个逻辑门,即使在顶级硬件上模拟器也会运行得很慢。这就是为什么系统模拟器中的地址解码通常被简化了。
测试的处理方式很有趣。主仓库中没有测试——它们在另一个项目。示例用法也在那里。如果你想在浏览器中看到它的能力,作者有编译成WebAssembly的演示。它们运行得非常快,这证实了纯头文件方法的可行性。
实际好处
当有数十个现成的模拟器时,现代开发者为什么还需要这个?
首先,这是创建自己专用工具的理想基础。如果你需要为旧处理器调试代码或编写自定义调试器,chips提供了一个现成的、经过测试的、非常紧凑的基础。
其次,它是计算机架构的优秀教科书。与其阅读枯燥的理论,不如看看数据如何通过总线从处理器流向内存,只需在代码中放置断点即可。
第三,这个项目对嵌入式系统爱好者很有用。由于没有依赖且资源需求低,这些模拟器可以在微控制器上运行,创建"计算机中的计算机"。
值得尝试吗
如果你喜欢复古计算或者只是热爱优美简洁的C代码,绝对值得去看看这个仓库。位掩码架构是对旧模拟问题的新尝试。
该项目是活跃的,持续更新和维护。当然,README本身的文档相当简略,但代码写得非常干净,很容易自己弄清楚。对于想要更深入研究的人,作者甚至在配套仓库中整理了一套原理图和手册。
需要注意的是——这不是面向普通用户的"即插即用"库。要在屏幕上显示图像,你需要附加一些图形后端(如Sokol或SDL),并弄清楚如何将模拟视频内存中的数据转换为像素。但对于喜欢深入系统软件"内脏"的人来说,这更像是优点而不是缺点。
相关项目