基于Web Serial API与Arduino的Commodore复古计算机程序加载方案
1. 项目概述:当浏览器遇见经典计算机
如果你和我一样,对Commodore 64或Vic-20这类八位机黄金时代的产物抱有浓厚兴趣,那么“如何方便地把程序灌进去”这个问题,一定困扰过你。传统的磁带机速度慢且易坏,原装1541磁盘驱动器在今天更是稀罕物件,即便有SD2IEC这类现代解决方案,通常也需要在电脑上运行专门的传输软件,配置起来总感觉隔了一层。今天要聊的这个项目,就提供了一种极其“现代”且优雅的思路:直接用你手边的Chrome或Edge浏览器,通过一个简单的网页界面,配合一块廉价的Arduino开发板,就能把D64、PRG、T64等格式的经典程序加载到你的Commodore电脑里。
这个方案的核心技术支柱是Web Serial API。这是一个相对较新的浏览器标准,允许网页脚本直接与串行设备(比如Arduino)通信,而无需安装任何本地驱动或插件。这意味着,你只需要一个支持该API的现代浏览器(Chrome、Edge、Opera的新版本都行),打开一个本地的HTML文件,就能完成所有操作。整个系统由三部分组成:运行浏览器的现代电脑(Windows PC或笔记本)、作为“翻译官”的Arduino微控制器、以及我们的主角——Commodore 64或Vic-20。Arduino负责在浏览器的Web Serial协议和Commodore的IEC串行总线协议之间进行转换,网页则提供了一个图形化的文件选择界面,甚至能显示游戏的封面图。
我之所以觉得这个项目值得深挖,不仅仅是因为它“酷”。从实用角度看,它极大地降低了复古计算的门槛。你不再需要为古老的计算机寻找专用的、可能已经停止维护的传输软件;所有逻辑都封装在网页和开源固件里,跨平台潜力大(虽然目前主要在Windows测试),未来更新也方便。对于开发者或爱好者而言,它也是一个绝佳的学习案例,涵盖了嵌入式系统编程、浏览器底层API应用、经典计算机硬件协议逆向等多个有趣的技术层面。无论你是想重温《蓝色MAX》空战,还是研究Commodore的IEC总线时序,这个项目都能提供一个清晰、可操作的切入点。
2. 核心硬件连接与安全须知
硬件连接是整个项目的物理基础,看似简单,但涉及不同电压的逻辑电平匹配,是必须严谨对待的一步。首要原则是:所有操作必须在Commodore主机完全断电的情况下进行。
2.1 器件选型与电压安全
项目明确要求使用 5V工作电压、16MHz主频 的Arduino或其兼容板。这是铁律。常见的合格型号包括基于ATmega328P的Arduino Uno、Nano,以及基于ATmega32U4的Arduino Micro、Pro Micro及其各种变体(如USB Beetle)。
重要警告:绝对不要使用3.3V逻辑电平的Arduino板(如某些版本的Arduino Due、MKR系列或ESP32开发板)进行直接连接。 Commodore的IEC总线引脚输出的是5V TTL电平。将3.3V器件的高电平引脚连接到5V系统,长期可能损坏3.3V器件;而将5V信号直接输入到3.3V器件的IO口,则很可能瞬间击穿其输入保护电路。确保你手中的板子是5V版本(通常板载的线性稳压器输出为5V)。
我个人更推荐使用 ATmega32U4 核心的板子,例如Pro Micro或它的紧凑变体USB Beetle。原因有三:第一,它自带USB通信功能,无需额外的USB转串口芯片,电路更简洁,作为串行设备被浏览器识别也更稳定;第二,体积小巧,便于整合;第三,在实现后续要讲到的EPYX快速加载卡带的精确时序控制时,32U4的性能表现足够。
2.2 线缆制备与引脚定义
连接需要一根从Commodore主机后部的6针DIN串行口到Arduino的线缆。你需要一个6针的DIN母头插座和至少5根杜邦线(建议使用不同颜色以便区分)。
Commodore IEC总线引脚定义(面向主机后部6针DIN口):
- Pin 1 (SRQ): 服务请求。本项目未使用,可以悬空不接。
- Pin 2 (GND): 地线。必须连接到Arduino的GND引脚。
- Pin 3 (ATN): 注意线。这是IEC总线的控制信号线,由主机(Commodore)发起。必须连接到Arduino的一个数字输入引脚(如D2)。
- Pin 4 (CLK): 时钟线。用于同步数据传输。必须连接到Arduino的一个数字输入/输出引脚(如D3)。
- Pin 5 (DATA): 数据线。用于传输实际数据位。必须连接到Arduino的一个数字输入/输出引脚(如D4)。
- Pin 6 (RESET): 复位线。本项目用它来复位Arduino(可选,但建议连接)。连接到Arduino的一个数字输出引脚(如D5)。
焊接6针DIN头需要一点技巧,因为引脚间距较小。我的经验是:先给每个引脚上好一点锡,然后用尖头烙铁和细焊锡丝,将杜邦线的金属端头也上锡,最后快速点焊到对应引脚上。务必确保焊点饱满、无虚焊,且各引脚间没有锡桥短路。完成后最好用万用表通断档检查一遍。
Arduino端连接示例(以Pro Micro和Uno为例):
- Pro Micro (ATmega32U4):
- ATN -> D9 (对应芯片引脚PB5)
- CLK -> D18 (对应芯片引脚PF7)
- DATA -> D19 (对应芯片引脚PF6)
- RESET -> D20 (对应芯片引脚PF5)
- GND -> GND
- Arduino Uno (ATmega328P):
- ATN -> D2 (PD2)
- CLK -> D3 (PD3)
- DATA -> D4 (PD4)
- RESET -> D5 (PD5)
- GND -> GND
关于复位按钮: 在调试或加载失败时,复位Arduino比重新插拔USB更便捷。如果你的Arduino板(如许多Pro Micro克隆板)没有复位按钮,可以自己加装一个:找一个轻触开关,一端接在Arduino的RST引脚,另一端接GND。按下时,RST被拉低到GND,触发复位。
2.3 连接检查清单与上电顺序
在首次通电前,请严格按照以下清单检查:
- [ ] Commodore主机电源关闭,并拔掉电源线。
- [ ] Arduino通过USB线连接到PC,但暂不连接到Commodore。
- [ ] 用万用表检查DIN头各引脚与对应Arduino引脚连接正确,无短路(特别是VCC与任何信号线之间)。
- [ ] 检查所有杜邦线插接牢固,无松动。
- [ ] 将DIN头插入Commodore后部串口。
- [ ] **先打开C