>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
C

如何用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),并弄清楚如何将模拟视频内存中的数据转换为像素。但对于喜欢深入系统软件"内脏"的人来说,这更像是优点而不是缺点。

相关项目