基于 Arduino 的 Altair 8800 模拟器套件 —— 构建并编程复古计算机
组件与物料清单
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino Mega 2560 | 1 | 二选一,不可同时使用 |
| Arduino Due | 1 | 二选一,不可同时使用 |
| LED(通用) | 36 | 前面板指示灯 |
| 通用 NPN 三极管 | 36 | 驱动 LED 所需 |
| 电阻 10kΩ | 36 | LED 驱动电路 |
| 电阻 150Ω | 36 | LED 限流 |
| 迷你拨动开关 SPDT On-On | 17 | 16 个地址开关 + 电源开关 |
| 瞬动开关 SPDT (On)-Off-(On) | 8 | 功能开关(RUN/STOP/EXAMINE 等) |
| 金属板(前面板底板) | 1 | 用于固定开关和 LED |
| SparkFun 蓝牙调制解调器 BlueSMiRF Silver | 1(可选) | 连接 Arduino TX/RX,使蓝牙设备可作为串口终端 |
| microSD 卡及适配器 | 1(可选) | 仅磁盘驱动模拟需要 |
应用与在线服务
- Arduino IDE
- Arduino DueFlashStorage 库(Due 无 EEPROM,用于将数据保存到片上闪存,重新烧录会擦除)
- Arduino Due soft_uart 库(软件 UART 实现,允许任意引脚作为串口,已集成到模拟器源码)
项目简介
如果你想制作这个项目但不想从零开始,可以看看 Chris Davis 的 Altair-Duino 套件,它包含所有元件、PCB、外壳和预编程的 Arduino Due。
以下是其他制作者的作品:
- Alan Lowther 找到了一个漂亮的金属外壳,并连接了 Raspberry Pi 用于输入/输出和语音合成。
- Martin Zumr 制作了一个全木质的精美盒子。
- Chris Davis (kb0wwp) 制作了 PCB 和精美的外壳。
- Justin Davis 为 Arduino Due 制作了 Altair 扩展板。
如果你也想分享你的作品,请告诉我,我会发布在这里。
我一直想拥有一台 Altair 8800 来把玩。但真正的古董 Altair 稀有且昂贵,轻松要价 1500-2500 美元。还有 altairclone.com 等替代方案,但 600 美元对我来说仍太贵。幸运的是,Altair Clone 的创建者 Mike Douglas 公开了他收集的所有文档和软件,为社区提供了丰富的 Altair 内部工作原理及其热门外设资料。
某天我看着 Arduino Mega 2560 的规格,想知道它是否有足够的 I/O 引脚直接连接 Altair 前面板的 LED 和开关,并编写自己的模拟器软件。结果发现 Arduino Mega 的 I/O 引脚数量 恰好 匹配。于是我决定自制 Altair 克隆。

使用 Arduino Mega 驱动模拟器运行良好且设置简单,但模拟速度仅为原版 Altair 的约 25%,且只能提供 6KB 模拟内存(当年已算不少)。永久存储容量也受限,Mega 的 EEPROM 仅 4KB。
Arduino Due 拥有充足内存,支持完整 64KB 模拟内存,运行速度远超 Mega。此外,Due 可在运行时将数据保存到闪存,使得模拟器未使用的 512KB 闪存可作为半永久存储,用于在模拟器中加载/保存程序和数据。
使用 Due 后,我得到了一个运行速度接近原版、提供 64KB 模拟内存、包含大量 Altair 软件,并能提供 32KB 半永久存储的 Altair 8800 模拟器。
我的目标是让模拟器在操作体验上尽可能接近“真实”的 Altair 8800,包括前面板指示灯反映真实行为。一个标准是能运行前面板“Kill-the-Bit”游戏——确实可以:
模拟器甚至能运行 Altair 8800 音乐演示。注意:这依赖 AM 收音机接收 Altair 电路产生的电磁干扰!
当年 Processor Technology 发布了一块小型扩展板(仅几个电容和电阻)配合软件,将 Altair 变成了当时不错的音乐系统。同样的扩展也可加到模拟器上(见文档),播放当年的曲目。示例:
另一个历史重要扩展是 Cromemco Dazzler 显卡。通过软件或硬件扩展,模拟器也能模拟该板:


另一个软/硬件扩展允许模拟器模拟 Processor Technology VDM-1 视频终端卡:

当然我没有原版 Altair,所有信息来自文档和视频(见致谢)。可能存在细微差别,但整体复现得很好。一个已知的有意差别是 HLDA 状态灯:原版指示 CPU 确认被外部设备暂停;模拟器中该功能未用,改为指示文件(串口/磁带捕获/重放)当前打开。
主要特性
- 精确复现 Altair 前面板元件行为。
- 使用 Arduino Due 时运行速度接近原版 Altair 8800;用 Mega 则为原版 25% 速度。
- 模拟内存 64KB(Due)或 6KB(Mega)。
- 内置多款 Altair 程序,易于加载:Pong、Altair 4K BASIC(微软首个产品)、Altair 扩展 BASIC、MITS Programming System II(仅 Due)、Altair Time Sharing BASIC(允许多用户同时使用 BASIC)。
- 内置 BASIC 和汇编示例程序,可轻松加载到 BASIC/汇编器。
- 模拟一块 88-SIO、88-2SIO 和 88-ACR(音频磁带接口)板。每个模拟串口设备可映射到 Arduino 串口。默认将两个最常用(88-SIO 和 88-2SIO 端口 1)映射到 Arduino 主串口 115200 波特率 8n1,可通过 USB 线访问。建议将串口转蓝牙模块连接到 RX/TX 引脚,使任何蓝牙设备均可作为 Altair 终端。
- Due 上主串口(USB)和 Serial1(引脚 18/19)可同时使用。
- 发送到每个串口设备(含 ACR 磁带)的数据可捕获/重放,最多 256 个文件,存储在 Arduino 本地存储(EEPROM 或闪存)。
- 磁带接口支持扩展 BASIC 的 CSAVE/CLOAD 命令(自动支持,无需用户干预),适合开发 BASIC 程序。
- 模拟 Cromemco Dazzler 显卡(需额外硬件/软件)。
- 模拟 Processor Technology VDM1 视频终端卡(需额外硬件/软件)。
- 模拟多达 16 个 88-DCDD 磁盘驱动器(默认 4 个)。磁盘模拟可选,需将 SD 卡连接到 Arduino SPI 接口,仅 Due 支持。
- 模拟 88-HDSK 硬盘控制器,最多 4 个硬盘单元(默认 1 个),每单元 4 个盘片。
- 模拟 88-RTC-VI 板(实时时钟和向量中断),使 Altair Time Sharing Basic 可运行。
- 256 字节内存页可保存到永久存储并重新加载,提供通过前面板开关输入程序的简单保存方式。
- 集成配置编辑器,可轻松更改许多设置。
注意:使用 Due 时,模拟器内捕获或保存的所有数据在上传新草图时会被擦除,因为数据存储在闪存中,烧录新草图会擦除闪存(Due 无 EEPROM)。若连接 SD 卡,数据存储在 SD 卡上,烧录新草图不会丢失数据。
文档
模拟器工作方式与 Altair 8800 完全相同,原版 Altair 文档(Google 可搜到)提供了操作前面板开关所需的所有信息。
但模拟器包含许多额外功能和内置软件,可通过前面板 AUX1/AUX2 开关访问(原版 Altair 包含但未使用)。这些功能在单独文档中解释,我开发模拟器软件时编写了该文档,内容很多,请参考源码仓库中的 Documentation.pdf。
构建说明
目标是尽可能少用辅助电路。Arduino Mega 和 Due 均有足够 I/O 引脚直接连接所有前面板元件。唯一额外电路是驱动 36 个 LED 所需的三极管和电阻(若 LED 直接连接 Arduino 输出引脚,同时点亮过多会超出电流限制)。
绘制完整原理图既繁琐又重复(36 个相同 LED 驱动电路,32 个开关接线),帮助不大。因此原理图文档改为详细表格,列出各元件连接到哪个 Arduino 引脚,并给出子电路原理图(如 LED 驱动)。还添加了 Fritzing 文件展示条形板上 LED 驱动元件布局。
制作前面板:从 vintage-computer.com 找到高质量 Altair 前面板扫描图,在复印店打印到卡纸上。底板用 22 号规格金属板,用普通电钻钻 LED 和开关孔。LED 驱动电路焊在条形板上,直接焊接到 LED,LED 由金属板固定。
前面板由简单木箱支撑竖立。箱子深度不如原版 Altair(仅需容纳前面板和 Arduino)。

前面板电源开关接线:在箱子上加一个电源插座(同 Arduino 自带),接到前面板开关,再接电源插头插入 Arduino。
使用 Arduino Due 时,可通过将 SD 卡连接到 Due 的 SPI 端口启用多达 16 个 88-DCDD 磁盘驱动器模拟。原理图文档最后一页详细显示所需接线。
上传草图到 Arduino Due 前,请将 Arduino 编译器优化设置改为“performance”。默认是“size”(不确定为什么,Due 有 512KB 闪存)。方法:用文本编辑器打开文件
c:\Users\[user]\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.9\platform.txt
将所有“-Os”改为“-O3”。可跳过此步,但模拟器会明显变慢。
模拟器软件也可在无前面板控制的裸机 Arduino(Mega 或 Due)上运行。这允许运行许多内置程序(主要使用串口终端而非前面板元件)。方法:编辑 config.h 源文件,设置 #define STANDALONE 1(默认 0)。参考文档“调试能力”部分了解如何操作虚拟前面板元件。但这不是模拟器预期用法;若不想制作前面板硬件,建议使用基于 PC 的全软件模拟器。config.h 包含多个开关控制功能启用/禁用,默认设置效果良好,若想调整可从此入手。
致谢
因无原版 Altair,我依赖网络资料。Mike Douglas (deramp5113) 制作的 Altair 8800 教学视频(altairclone.com)帮助极大,且非常有趣。此外,Mike 收集了大量 Altair 相关硬件和软件手册并公开在其网站。
(注:Mike 的视频对构建模拟器后的玩法很有启发)
Martin Eberhard 的 ADEXER 工具对硬盘支持的底层调试至关重要。他还编写了模拟器使用的两个引导加载程序:组合磁盘引导加载程序(CDBL)用于引导磁盘和迷你磁盘,以及硬盘引导加载程序(HDBL),比原版更短更稳定。
CPU 模拟代码我自己编写,但在半进位计算和 DAA 指令高效实现上参考了 i8080 核心模型项目。
模拟器包含一些原版 Altair 8800 软件。再次感谢 Mike Douglas 花费无数小时搜集、整理并使这些软件运行,最后公开在 altairclone.com:
- Altair 4K BASIC (MITS 1975)
- Altair Extended ROM Basic (MITS 1975)
- Altair Time Sharing Basic (MITS 1977)
- Kill-the-Bit 游戏 (Dean McDaniel, 1975)
- Pong 游戏(前面板版,Mike Douglas)
- 'Daisy, Daisy...' 音乐 (Steve Dompier, 1975)
- Music System (Processor Technology 1977)
- MITS Programming System II (MITS 1976)
- Altair Turnkey Monitor (MITS 1977)
- i8080 CPU Diagnostic (Microcosm Associates, 1980)
- i8080 CPU Exerciser (Frank D. Cringle 1994, Ian Bartholomew 2009)
磁盘和硬盘镜像(源码压缩包中 disks 子目录)也来自 altairclone.com 和 deramp.com(Mike Douglas 个人网站)。包含 CP/M、各种磁盘 BASIC、Altair DOS(含 Fortran)等。Mike 在寻找软件和制作可用磁盘镜像上做了惊人工作。我只选用了一部分,建议去 altairclone.com 或 deramp.com 看看更多。
讨论论坛
Altairduino.com 的 Chris Davis 建立了 Google Group 讨论 Altair-Duino 相关问题:
https://groups.google.com/forum/#!forum/altair-duino
欢迎访问并参与讨论!
代码
Arduino Altair 8800 模拟器代码
https://github.com/dhansel/Altair8800
原理图
不提供完整原理图(太重复),而是描述各前面板元件连接哪些 Arduino 引脚,并给出子电路原理图(如 LED 驱动电路)。
尝试展示连接 LED 的条形板布局。虽然拥挤,但足以看出连接方式。关键是每个 LED 的元件在条形板上不超过 5 个孔位,这样 LED 间距足够小,前面板可保持原版尺寸。
ledstrip_4OVCpRyKQS.fzz
制造工艺
- Arduino Nano飞行模拟2020控制面板——LCD与CDI显示
- DIY 蓝牙控制 Arduino 间谍小车
- FlickMote:基于手势的智能家居红外遥控器
- DIY Arduino TV-B-Gone:万能关机遥控器
- 自制大尺寸LED主时钟带闹钟功能 — 12米外清晰可见
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- Arduino 项目优化供电方案:从按键开关到电池监测与数据记录
- Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
- 从零构建智能 Arduino 四足机器人:完整指南
- DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
- 利用 Arduino Nano R3 自制全功能 CNC 雕刻机
- Earth Analyzer:面向精准农业的多模态物联网环境监测巡检车