修复一台棘手的 Commodore PET:追踪 6 个半坏芯片

Ken Shirriff's blog

计算机历史,修复老式计算机,IC 反向工程,以及其他

修复一台棘手的 Commodore PET:追踪 6 个半坏芯片

1977 年,Commodore 发布了 PET 电脑,这是一款独特的家用电脑,它将处理器、一个微型键盘、用于存储的盒式驱动器和一个梯形屏幕组合在一个金属单元中。Commodore PET、Apple II 和 Radio Shack 的 TRS-80 以即用型计算机开启了家用电脑市场,这些系统后来被称为 1977 Trinity。我早期的很多编程工作都是在 PET 上完成的,所以几年前当有人给我一台无法工作的 PET 时,我出于怀旧的原因收下了它。

你可能会认为家用电脑很容易修理,但事实证明这是一个挑战。1 早期 PET 中的芯片以容易出故障而闻名,果然,我们发现了多个坏芯片。而且,这些 RAM 和 ROM 芯片是特殊设计,现在基本上无法获得。在这篇文章中,我将总结我们如何修复系统,以帮助其他人。

当我第一次启动电脑时,屏幕上充满了随机字符。这实际上令人感到安心,因为它表明电脑的大部分都在工作:不仅仅是显示器,还有视频 RAM、字符 ROM、系统时钟和电源都在运行。

The Commodore PET started up, but the screen was full of garbage. Commodore PET 启动了,但屏幕上充满了乱码。

我用示波器检查了系统总线上的信号,发现时钟、地址和数据线都很活跃,所以 6502 CPU 似乎在运行。然而,一些数据线有三个电压级别,如下图所示。这显然不好,表明总线上的一个芯片搞乱了数据信号。

The scope shows three voltage levels on the data bus. 示波器显示数据总线上有三个电压级别。

一些有用的在线站点7 建议,如果 PET 在清除屏幕之前卡住,最可能的原因是系统 ROM 芯片出现故障。幸运的是,Marc 有一个 Retro Chip Tester,这是一款用于测试老式 IC 的很酷的设备:不仅可以测试 7400 系列逻辑,还可以测试老式 RAM 和 ROM。此外,测试仪知道大量旧电脑的正确 ROM 内容,因此它可以判断 PET ROM 的内容是否正确。

Retro Chip Tester 显示 PET 的七个 ROM 芯片中有两个已损坏。这些芯片是 MOS Technologies MPS6540,这是一种 2K×8 ROM,其设计怪异,与标准 ROM 不兼容。幸运的是,有些人制造适配器板,让你可以替换标准的 2716 EPROM,所以我订购了两个适配器板,组装了它们,Marc 从在线数据文件中为 2716 EPROM 编程。2716 EPROM 需要比 Marc 的编程器支持的电压稍高才能编程,但芯片似乎具有正确的内容(伏笔)。

The PET opened, showing the motherboard. PET 打开了,显示主板。

PET 的外壳可以摆动打开,左侧有一个臂可以像汽车引擎盖一样将其保持打开状态。主板前部的第一排和第二排芯片是 RAM 芯片。RAM 后面是七个 ROM 芯片;其中两个已被 ROM 适配器板替换。6502 处理器是 ROM 后面右侧的大型黑色芯片。

安装好适配器板后,我怀着极大的成功期望启动了 PET,但它的故障方式与以前完全相同,无法清除屏幕上的乱码。Marc 决定是时候使用他的 Agilent 1670G 逻辑分析仪来找出发生了什么;(追溯到 1999 年,这款逻辑分析仪以 Marc 的标准来看算是现代的。)他将逻辑分析仪连接到 6502 芯片,如下图所示,以便我们可以跟踪地址总线、数据总线和读取/写入信号。同时,我使用 Ghidra 反汇编了 ROM 内容,以便我可以根据汇编代码解释逻辑分析仪。(Ghidra 是美国国家安全局 (NSA) 开发的用于逆向工程软件的程序,这很奇怪。)

Marc wired up the logic analyzer to the 6502 chip. Marc 将逻辑分析仪连接到 6502 芯片。

逻辑分析仪提供了来自 6502 处理器的每次内存访问的跟踪,显示了它正在执行的操作。系统启动后,一切顺利进行了一段时间:处理器跳转到复位向量位置,进行了一些初始化,测试了内存,但随后一切都失控了。我注意到内存测试在第一个字节上失败了。然后,软件尝试通过垃圾回收 BASIC 程序和变量来获取更多存储空间。由于根本没有任何存储空间,因此这没有进展顺利,系统在到达清除屏幕的代码之前挂起。

我们再次使用 Retro Chip Tester 测试了内存芯片,发现了三个坏芯片。与 ROM 芯片一样,RAM 芯片也很不寻常:MOS Technology 6550 静态 RAM 芯片,1K×4。通过移除坏芯片并重新排列好芯片,我们将 8K PET 缩小到 6K PET。这一次,系统启动了,尽管屏幕中间附近出现了一个神秘的 2×2 棋盘符号(伏笔)。我输入了一个简单的程序来打印“HELLO”,但结果非常奇怪:四个浮点数,然后挂起。

This program didn't work the way I expected. 这个程序没有按照我期望的方式工作。

这种行为非常令人困惑。我可以成功地将程序输入到计算机中,这会运行很多系统代码。(这不像终端,在终端中回显文本是很简单的;PET 在幕后做了很多处理,以便在输入 BASIC 程序时对其进行解析。)但是,程序的输出完全错误,打印的是浮点数而不是字符串。

我们还遇到了一个间歇性问题,即打开电脑后,启动消息会完全是乱码,如下图所示。出现的不是“*** COMMODORE BASIC ***”横幅,而是随机字符和图形。

The garbled boot message. 乱码启动消息。

电脑怎么能在很大程度上运行良好,但又完全错误呢?我们回到逻辑分析仪查找答案。

我认为乱码启动消息可能是最容易追踪的,因为它发生在启动过程的早期。查看代码后,我发现软件在测试内存后,会使用一种适度复杂的算法将内存大小转换为 ASCII 字符串。2 然后它将系统启动消息和内存大小写入屏幕。

PET 使用一个子程序将文本写入屏幕。指向文本消息的指针保存在内存位置 0071 和 0072 中。下面的汇编代码将指针(在 X 和 Y 寄存器中)存储到这些内存位置中。(此 Ghidra 输出显示地址、指令字节和符号汇编程序指令。)

d5ae 86 71  STX 71
d5b0 84 72  STY 72      
d5b2 60   RTS

对于上面的代码,你可能会期望处理器读取指令字节 86 和 71,然后写入地址 0071。接下来,它应该读取字节 84 和 72,然后写入地址 0072。然而,下面的逻辑分析仪输出显示发生了略有不同的事情。处理器从地址 D5AE 和 D5AF 获取指令字节 86 和 71,然后如预期的那样写入地址 0071。接下来,它按预期获取指令字节 84 和 72,但写入地址 007A,而不是 0072!

 step  address byte read/write'
112235  D5AE  86   1
112236  D5AF  71   1
112237  0071  00   0
112238  D5B0  84   1
112239  D5B1  72   1
112240  007A  01   0

这是一个确凿的证据。处理器搞砸了,地址中存在一位错误。也许 6502 处理器发出了错误的信号,或者其他东西导致了总线上的问题。此错误的结果是,字符串指针引用了随机内存而不是所需的启动消息,因此随机字符被写入屏幕。

接下来,我调查了为什么屏幕上有一个神秘的棋盘格字符。我编写了一个程序来扫描逻辑分析仪输出,以提取所有写入屏幕内存的操作。大多数屏幕操作都是有意义的——在启动时清除屏幕,然后写入启动消息——但我发现了一次意外的屏幕写入。在下面的汇编代码中,Y 寄存器应写入零页地址 5e,X 寄存器应写入地址 66,这些位置供 BASIC 解释器使用。

d3c8 84 5e  STY 5e
d3ca 86 66  STX 66

但是,下面的逻辑分析仪输出显示了一个问题。第一行应该从地址 d3c8 获取操作码 84,但处理器从 ROM 接收到操作码 8c,即写入 16 位地址的指令。结果是,6502 没有写入零页地址,而是获取了另一个字节以写入 16 位地址。具体来说,它抓取了 STX 指令 (86) 并将其用作地址的一部分,将 FF(棋盘格字符)写入屏幕内存 865E3 而不是写入 005E 的 BASIC 数据结构。而且,STX 指令没有执行,因为它被用作地址。因此,不仅有一个错误字符被写入屏幕,而且内存中的数据结构也没有更新。当 BASIC 解释器尝试运行程序时,它失控也就不足为奇了。

 step  address byte read/write'
186600  D3C8  8C   1
186601  D3C9  5E   1
186602  D3CA  86   1
186603  865E  FF   0

我们得出结论,ROM 在地址 D3C8 提供了错误的字节 (8C)。事实证明,这个 ROM 是我们的替换品之一;欠功率的 EPROM 编程器导致了一个不稳定的字节。Marc 使用更强大的编程器重新编程了 EPROM。系统启动了,但 RAM 比预期少得多。事实证明,另一个 RAM 芯片坏了。

最后,我们让 PET 运行起来了。我输入了一个简单的程序来生成动画图形模式,这是一个我大约 13 岁时记住的程序4,并生成了以下输出:

Finally, the PET worked and displayed some graphics. Imagine this pattern constantly changing. 最后,PET 运行起来了,并显示了一些图形。想象一下这个模式不断变化。

回想起来,我应该在一开始就测试所有 RAM 和 ROM 芯片,我们可能可以在没有逻辑分析仪的情况下找到故障。但是,逻辑分析仪让我有机会更多地了解 Ghidra 和 PET 的汇编代码,所以最终一切都解决了。

最后,PET 有 6 个坏芯片:两个 ROM 和四个 RAM。6502 处理器本身结果证明没问题。5 下图显示了 PET 微型键盘上的 6 个坏芯片。在每个键的顶部,你可以看到被称为 PETSCII 的古怪图形字符集。6 至于标题,我将编程不良的 ROM 算作半个坏芯片,因为芯片本身没有坏,但它的功能不稳定。

The bad chips sitting on top of the keyboard. 坏芯片放在键盘上。

在 Bluesky (@righto.com) 或 RSS 上关注我以获取更新。(我不再使用 Twitter。)感谢 Mike Naberezny 提供 PET。感谢 TubeTime、Mike Stewart,尤其是 CuriousMarc 在维修方面的帮助。一些有用的 PET 故障排除链接位于脚注中。7

脚注和参考

  1. 那么我为什么突然决定修复自 2017 年以来一直放在我车库里的 PET 呢?嗯,CNN 正在拍摄对 Bill Gates 的采访,他们想要 20 世纪 70 年代的电脑的背景镜头,这些电脑运行着 Bill Gates 编写的 Microsoft BASIC。剧透:我没有及时让我的电脑为 CNN 工作,但 Marc 找到了一些其他电脑。
  2. 在 6502 上将数字转换为 ASCII 字符串有些复杂。你不能快速除以 10 进行十进制转换,因为处理器没有除法指令。相反,PET 的转换例程具有硬编码的四字节常量:-100000000、10000000、-100000、100000、-10000、1000、-100、10 和 -1。该例程重复添加第一个常量(即减去 100000000),直到结果为负数。然后它重复添加第二个常量,直到结果为正数,依此类推。步骤数给出每个十进制数字(调整后)。 相同的算法用于基数为 60 的常量:-2160000、216000、-36000、3600、-600 和 60。这会将正常运行时间计数转换为 TIME$ 变量的小时、分钟和秒。(PET 的基本时间计数是“jiffy”,即 1/60 秒。)
  3. 从技术上讲,地址 865E 不是屏幕内存的一部分,屏幕内存是从地址 0x8000 开始的 1000 个字符。但是,PET 的地址在地址解码中使用了一些快捷方式,因此 865E 与 825e 相同,引用了第 16 行的第 7 个字符。
  4. 这是我的演示程序的源代码,我记得这是我十几岁时编写的。它只是以 8 倍对称显示块(黑色、白色或灰色),使用 POKE 语句直接写入屏幕内存。(事实证明,几乎任何东西都适合 8 倍对称。)第一个 PRINT 语句中神秘的心形是清除屏幕字符。 My program to display some graphics. 我的程序显示了一些图形。
  5. 我怀疑 6502 处理器有问题,因为逻辑分析仪显示 6502 正确读取了一条指令,但随后访问了错误的地址。Eric 提供了一个替换的 6502 芯片,但更换处理器没有效果。但是,重新编程 ROM 解决了这两个问题。我们的理论是,总线上的信号存在时序问题或电压问题,导致逻辑分析仪显示正确的值,但 6502 读取了错误的值。可能 ROM 有一个弱编程位,导致 ROM 对该位的输出要么处于中间电压,要么导致输出花费太长时间才能稳定到正确的电压。寓意是,如果存在模拟故障,你不能总是相信逻辑分析仪。
  6. PETSCII 图形字符现在位于 Unicode 中的 Symbols for Legacy Computing 块中。
  7. PET 故障排除站点 非常有帮助。Commodore PET 的 Microsoft BASIC 源代码位于此处,大部分都没有注释。我将源代码中的许多标签映射到 Ghidra 生成的汇编代码,以了解逻辑分析仪的跟踪结果。ROM 镜像位于此处。PET 的原理图位于此处