1977年12月,《BYTE》杂志刊出Gerry Wheeler的《Undocumented M6800 Instructions》。文中有两个字节很扎眼:$9D和$DD。Wheeler把它们命名为HCF,Halt and Catch Fire。
这不是后来AMC剧集造出来的流行语。剧集晚得多。HCF先是程序员式玩笑,后来被拿来指代一类真实现象:某段机器码、非法操作码或未公开状态,会让CPU停止正常执行,系统通常只能reset,严重时要power-cycle。
我更在意的是后半句。HCF不是“芯片里藏了恶意后门”的故事。它更像早期处理器设计留下的边角:手册写的是秩序,硅片上还有没被写进手册的路径。
HCF说的不是起火,而是CPU进入不可恢复状态
HCF这个名字本来就带玩笑味。
汇编指令常用三字母助记符,比如ADD、CMP、JMP。工程师也会编一些黑色幽默式名字,HCF里的“Catch Fire”多半也在这个语境里。
但玩笑之所以留下来,是因为它碰到了硬件事实。
早期CPU并不会为每个未使用的操作码都设计干净出口。晶体管预算有限,译码逻辑也要省。于是,256种字节模式里,官方手册只解释其中一部分,剩下的位模式不一定会被安全地当成NOP。
有的非法操作码会像无害空指令。有的会改寄存器。有的会进入半测试状态。有的会把CPU锁住。
这就是HCF真正指向的东西:不是火焰,而是失控。
需要划清一个边界。IBM System/360相关传闻里,“catch fire”常被联系到磁芯存储反复访问、局部过热这类物理风险。但到Motorola 6800这里,重点不是芯片真的烧起来,而是CPU不再执行正常程序。
这个区别很要紧。把HCF理解成“所有CPU都会物理起火”,是误读;把未公开指令理解成“厂商故意埋后门”,也证据不足。
M6800的$9D和$DD:地址线在跑,CPU已经不处理数据
Wheeler那篇文章的核心,是Motorola 6800的未公开操作码。
他统计M6800官方文档中有197个操作码,另有59个字节模式没有公开说明。在这些未公开操作码里,$9D和$DD被他命名为HCF。这个助记符是Wheeler给的,不是Motorola官方指令名。
触发后,M6800的表现很怪。
程序计数器继续递增。地址总线像16位计数器一样扫过内存。CPU持续发起读操作,却不处理读到的数据。中断也救不回来,恢复通常只剩复位或断电。
换成板级调试视角,这反而有用。David J. Agans在《Debugging》中提到,工程人员把DD叫作“Drop Dead”指令,因为它能让地址线和时钟线上出现适合示波器观察的规则方波。
用户看到的是死机。硬件工程师看到的,可能是一个便宜的测试信号源。
| 案例 | 发生了什么 | 关键限制 | 对读者的意义 |
|---|---|---|---|
| IBM System/360传闻 | 非法操作可能反复访问磁芯存储位置并导致过热 | 这里涉及磁芯存储的物理特性 | “catch fire”有历史影子,但不能套到所有CPU上 |
| Motorola 6800 $9D/$DD | 程序计数器递增,地址线连续计数,CPU不处理读数 | HCF是Wheeler命名,不是官方指令 | 复古硬件调试和模拟器实现不能只看手册 |
| 6502非法操作码 | 部分未公开操作码会锁住CPU或产生非文档行为 | 不同芯片、批次和兼容实现可能不同 | 模拟器作者要决定是否复现真实硅片行为 |
| Pentium F00F bug | 特定非法指令序列可使早期Pentium挂起 | 已进入现代CPU漏洞与补丁语境 | 非法路径仍是验证难点 |
这张表背后的判断很简单:非法操作码不是同一种东西。
它们可能来自译码副作用,可能来自测试需求,也可能只是设计取舍。没有证据时,不该把它们一概说成恶意后门。疑罪从无,在芯片史里同样适用。
对复古开发者和验证团队,HCF不是段子,是决策成本
最受影响的不是普通消费者,而是两类人。
一类是复古计算、汇编和模拟器开发者。对他们来说,问题不是“官方手册有没有写”,而是“真实机器是不是这么跑”。
如果要做游戏机模拟器、老式单板机修复、教学CPU板,开发者至少要多做一个选择:默认按官方指令集实现,还是增加“真实硅片兼容”选项。更稳的做法,是把未公开操作码单独列成测试项,并在文档里说明哪些行为可复现,哪些只在特定芯片上观察到。
另一类是芯片验证和安全研究人员。
Pentium F00F bug就是后来的提醒。这个问题常被写作字节序列F0 0F C7 C8,特定非法指令会让早期Pentium挂起。它不属于复古冷知识,而是说明一件事:异常路径比正常路径更难测干净。
现代x86复杂得多。厂商有形式化验证、微码更新、内部测试套件,外部研究者也会做fuzzing,把随机或边界输入喂给处理器,寻找异常状态。
这里的现实约束也很硬。公开指令越多,兼容包袱越重,微架构越复杂,非法状态越不可能只靠人工审查扫完。真正该看的,不是哪颗芯片会不会“起火”,而是三件事:厂商是否把异常行为写进勘误,是否能用微码或系统补丁隔离问题,修补时会不会破坏旧软件兼容性。
这也是HCF留下来的技术史价值。
它把一个冷笑话拉回了工程现场:手册之外不是虚无,那里有译码逻辑、测试模式、兼容债,也有会把系统拖死的缝。
