一个棘手的Commodore PET维修:追踪6个半坏芯片
摘要
一篇详细修复1977年Commodore PET计算机的记录,涉及诊断多个坏芯片以及使用适配板替换过时的ROM。
<style>
code {font-size: 100%; font-family: courier, fixed;}
</style>
<p><title>mult3</title></p>
<p>1977年,Commodore发布了PET计算机,这是一款奇特的家用计算机,它将处理器、小键盘、磁带驱动器用于存储,以及一个梯形屏幕集成在一个金属机箱中。
Commodore PET、Apple II和Radio Shack的TRS-80以即开即用的计算机开启了家用计算机市场,
这些系统后来被称为
<a href="https://web.archive.org/web/20080618072507/http://www.byte.com/art/9509/sec7/art15.htm">1977三圣</a>。
我早期的许多编程工作都是在PET上完成的,所以几年前有人送我一台无法工作的PET时,我出于怀旧收下了它。</p>
<p>你可能会觉得修复一台家用计算机很容易,但事实证明这是一个挑战。
早期PET中的芯片以故障率高而臭名昭著,果然,我们发现了多个坏芯片。
而且,这些RAM和ROM芯片是特殊设计,现在大多已无法获得。
在这篇文章中,我将总结我们修复系统的过程,希望对其他人有所帮助。</p>
<p>当我第一次给计算机通电时,屏幕上显示满了随机字符。
这实际上让人放心,因为它表明计算机的大部分部件是正常工作的:不仅是显示器,
还有显存、字符ROM、系统时钟和电源都在运行。</p>
<p><a href="https://static.righto.com/images/pet/garbage-screen.jpg"><img alt="Commodore PET启动,但屏幕上满是乱码。" class="hilite" height="489" src="https://static.righto.com/images/pet/garbage-screen-w500.jpg" title="Commodore PET启动,但屏幕上满是乱码。" width="500" /></a><div class="cite">Commodore PET启动,但屏幕上满是乱码。</div></p>
<p>我用示波器检查了系统总线上的信号,发现时钟、地址和数据线上都有大量活动,
所以6502 CPU似乎在工作。
然而,有些数据线出现了三个电压电平,如下所示。
这显然不好,表明总线上的某个芯片搞乱了数据信号。</p>
<p><a href="https://static.righto.com/images/pet/scope.jpg"><img alt="示波器显示数据总线上有三个电压电平。" class="hilite" height="286" src="https://static.righto.com/images/pet/scope-w500.jpg" title="示波器显示数据总线上有三个电压电平。" width="500" /></a><div class="cite">示波器显示数据总线上有三个电压电平。</div></p>
<p>网上一些有用的站点<span id="fnref:troubleshooting"><a class="ref" href="#fn:troubleshooting">7</a></span>指出,如果PET在清屏之前卡住,最可能的原因是
系统ROM芯片故障。
幸运的是,Marc有一台<a href="https://americanretro.shop/rctp">Retro Chip Tester</a>,这是一种很酷的设备,用于
测试老式IC:不仅限于7400系列逻辑芯片,还有老式的RAM和ROM。
此外,该测试器知道大量旧计算机的正确ROM内容,因此它可以判断PET ROM是否
包含正确的内容。</p>
<p>Retro Chip Tester显示,PET的七个ROM芯片中有两个已经失效。
这些芯片是MOS Technologies MPS6540,一种2K×8的ROM,设计奇特,与标准ROM不兼容。
幸运的是,有几个人制作了适配板,让你可以用标准的2716 EPROM替代,所以我订购了
两块适配板,组装好,然后Marc从在线数据文件中编程了2716 EPROM。
2716 EPROM需要比Marc的编程器支持的稍高电压来编程,但芯片似乎
内容正确(预兆)。</p>
<p><a href="https://static.righto.com/images/pet/pet-opened.jpg"><img alt="打开的PET,显示主板。" class="hilite" height="556" src="https://static.righto.com/images/pet/pet-opened-w500.jpg" title="打开的PET,显示主板。" width="500" /></a><div class="cite">打开的PET,显示主板。</div></p>
<p>PET的机箱通过左侧的一个臂像汽车引擎盖一样打开。
主板前两排芯片是RAM芯片。
RAM后面是七个ROM芯片;其中两个已被ROM适配板替换。
6502处理器是ROM后面右侧的大黑芯片。</p>
<p>装上适配板后,我怀着极大的成功期望给PET通电,但它以完全相同的方式失败了,仍然无法清除屏幕上的乱码。
Marc决定使用他的Agilent 1670G逻辑分析仪来查明发生了什么;
(追溯至1999年,这个逻辑分析仪按Marc的标准算现代的了。)
他将逻辑分析仪连接到6502芯片上,如下所示,这样我们可以跟踪地址总线、数据总线
以及读/写信号。
与此同时,我使用Ghidra反汇编了ROM内容,以便对照汇编代码解释逻辑分析仪的跟踪结果。
(<a href="https://ghidra-sre.org/">Ghidra</a>是一个由美国国家安全局开发的逆向工程软件,说来也奇怪。)</p>
<p><a href="https://static.righto.com/images/pet/logic-analyzer.jpg"><img alt="Marc将逻辑分析仪连接到6502芯片上。" class="hilite" height="375" src="https://static.righto.com/images/pet/logic-analyzer-w500.jpg" title="Marc将逻辑分析仪连接到6502芯片上。" width="500" /></a><div class="cite">Marc将逻辑分析仪连接到6502芯片上。</div></p>
<p>逻辑分析仪提供了6502处理器每次内存访问的跟踪,显示了它正在执行什么。
系统开机后一切正常了一段时间:
处理器
跳转到复位向量位置,进行了一些初始化,测试了内存,但随后一切变得混乱。
我注意到内存测试在第一个字节就失败了。
然后软件试图通过垃圾回收BASIC程序和变量来获取更多存储空间。
由于根本没有存储空间,这进行得不顺利,系统在到达清屏代码之前挂起了。</p>
<p>我们再次使用Retro Chip Tester测试了内存芯片,发现了三个坏芯片。
与ROM芯片一样,RAM芯片也是不寻常的:MOS Technology <a href="http://blog.tynemouthsoftware.co.uk/2024/06/mos-6550-ram-chips.html">6550</a>静态RAM芯片,1K×4。
通过移除坏芯片并重新排列好芯片,我们将8K的PET缩减为6K的PET。
这次,系统启动了,尽管屏幕中间附近有一个神秘的2×2棋盘格符号(预兆)。
我输入了一个简单的程序来打印"HELLO",但结果非常奇怪:四个浮点数,然后
挂起。</p>
<p><a href="https://static.righto.com/images/pet/floats.jpg"><img alt="这个程序没有按我预期的方式工作。" class="hilite" height="351" src="https://static.righto.com/images/pet/floats-w500.jpg" title="这个程序没有按我预期的方式工作。" width="500" /></a><div class="cite">这个程序没有按我预期的方式工作。</div></p>
<p>这种行为非常令人费解。
我可以成功地向计算机输入程序,这很大程度上锻炼了系统代码。
(这不像终端那样回显文本很平常;PET在后台做了大量处理来解析
输入的BASIC程序。)
然而,程序的输出完全错误,打印的是浮点数而不是字符串。</p>
<p>我们还遇到一个间歇性问题:打开计算机后,
启动信息会完全乱码,如下所示。
不是"*** COMMODORE BASIC ***"横幅,而是随机字符和图形。</p>
<p><a href="https://static.righto.com/images/pet/bad-boot.jpg"><img alt="乱码的启动信息。" class="hilite" height="111" src="https://static.righto.com/images/pet/bad-boot-w500.jpg" title="乱码的启动信息。" width="500" /></a><div class="cite">乱码的启动信息。</div></p>
查看缓存全文
缓存时间: 2026/05/16 03:35
# 棘手的 Commodore PET 修复:追踪 6 又 1/2 个坏芯片
1977 年,Commodore 发布了 PET 计算机,这是一款奇特的家用计算机,它将处理器、微型键盘、用于存储的磁带驱动器和梯形屏幕整合在一个金属机箱中。Commodore PET、Apple II 和 Radio Shack 的 TRS-80 凭借即开即用的计算机开启了家用电脑市场,这些系统后来被称为 1977 三杰 (https://web.archive.org/web/20080618072507/http://www.byte.com/art/9509/sec7/art15.htm)。我早期的很多编程工作都是在 PET 上完成的,所以当几年前有人给了我一台无法工作的 PET 时,出于怀旧,我收下了它。
你可能会认为修复一台家用电脑很容易,但结果却颇具挑战。早期 PET 中的芯片以故障率高著称,果然,我们发现了多块坏芯片。而且,这些 RAM 和 ROM 芯片是特殊设计,现在大部分已经无法获得。在这篇文章中,我将总结我们是如何修复系统的,希望对其他人有所帮助。
第一次给计算机通电时,屏幕上显示的全是随机字符。这实际上让人放心,因为它表明计算机的大部分部件都在工作:不仅是显示器,还有视频 RAM、字符 ROM、系统时钟和电源。
Commodore PET 启动了,但屏幕上全是乱码。
Commodore PET 启动了,但屏幕上全是乱码。
我用示波器检查了系统总线上的信号,发现时钟、地址和数据线都有大量活动,因此 6502 CPU 似乎在工作。然而,一些数据线上有三个电压电平,如下所示。这显然不正常,表明总线上的某个芯片干扰了数据信号。
示波器显示数据总线上的三个电压电平。
示波器显示数据总线上的三个电压电平。
一些有用的网站7 (http://www.righto.com/2025/04/commodore-pet-repair.html#fn:troubleshooting) 建议,如果 PET 在清屏之前卡住,最可能的原因是系统 ROM 芯片故障。幸运的是,Marc 拥有一台 Retro Chip Tester (https://americanretro.shop/rctp),这是一款很酷的设备,旨在测试 vintage 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 编程器支持的范围,但芯片内容似乎正确(此处是伏笔)。
PET 被打开,显示主板。
PET 被打开,显示主板。
PET 的外壳向左打开,左侧有一个支撑臂像汽车引擎盖一样将其撑开。主板前部的两排芯片是 RAM 芯片。RAM 后面是七个 ROM 芯片;其中两个已被 ROM 适配板替代。6502 处理器是 ROM 后面靠右的那颗大黑芯片。
装上适配板后,我满怀期待地给 PET 通电,但它以与之前完全一样的方式失败,未能清除屏幕上的乱码。Marc 决定是时候使用他的 Agilent 1670G 逻辑分析仪来查明情况了(这款逻辑分析仪可追溯到 1999 年,按 Marc 的标准来看已经算现代了)。他如下图所示将逻辑分析仪连接到 6502 芯片,这样我们就可以跟踪地址总线、数据总线和读/写信号。同时,我使用 Ghidra 反汇编了 ROM 内容,这样我就能根据汇编代码解释逻辑分析仪的结果。(Ghidra (https://ghidra-sre.org/) 是一个用于逆向工程软件的程序,奇怪的是,它是由 NSA 开发的。)
Marc 将逻辑分析仪连接到 6502 芯片。
Marc 将逻辑分析仪连接到 6502 芯片。
逻辑分析仪提供了 6502 处理器每次内存访问的踪迹,显示了它正在执行什么。系统开机后的一段时间内一切正常:处理器跳转到复位向量位置,进行了一些初始化,测试了内存,但随后一切都失控了。我注意到内存测试在第一个字节就失败了。然后软件试图通过垃圾回收 BASIC 程序和变量来获取更多存储空间。由于根本没有存储空间,这个过程并不顺利,系统在到达清屏代码之前就挂起了。
我们再次使用 Retro Chip Tester 测试了内存芯片,发现了三个坏芯片。与 ROM 芯片一样,RAM 芯片也不常见:MOS Technology 6550 (http://blog.tynemouthsoftware.co.uk/2024/06/mos-6550-ram-chips.html) 静态 RAM 芯片,1K×4。通过移除坏芯片并重新排列好芯片,我们将 8K PET 缩减为 6K PET。这次系统启动了,尽管屏幕中间附近出现了一个神秘的 2×2 棋盘格符号(又是伏笔)。我输入了一个简单的程序来打印 "HELLO",但结果非常奇怪:四个浮点数,随后系统挂起。
这个程序的运行结果出乎我的意料。
这个程序的运行结果出乎我的意料。
这种行为非常令人费解。我可以成功地将程序输入计算机,这已经测试了大量的系统代码。(这不像终端,回显文本很简单;PET 在后台进行了大量处理来解析输入的 BASIC 程序。)然而,程序的输出完全错误,打印的是浮点数而不是字符串。
我们还遇到了一个间歇性问题:打开计算机后,启动信息完全是乱码,如下所示。不是显示 "*** COMMODORE BASIC ***" 横幅,而是出现随机字符和图形。
乱码的启动信息。
乱码的启动信息。
计算机怎么可能大部分运行良好,同时又完全错误呢?我们再次借助逻辑分析仪来查找原因。
我认为乱码的启动信息可能是最容易追踪的,因为这发生在启动过程的早期。查看代码后,我发现软件在测试内存后,会使用一个相当复杂的算法将内存大小转换为 ASCII 字符串。1 (http://www.righto.com/2025/04/commodore-pet-repair.html#fn:conversion) 然后它将系统启动信息和内存大小写入屏幕。
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,然后按预期将 00 写入地址 0071。接下来,它按预期获取了指令字节 84 和 72,但却将 01 写入了地址 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(一个棋盘格字符)写入了屏幕内存中的 865E 2 (http://www.righto.com/2025/04/commodore-pet-repair.html#fn:screen),而不是写入 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 是我们替换的一个;编程器供电不足导致了一个不稳定的字节。Marc 用一台更强大的编程器重新烧录了 EPROM。系统启动了,但 RAM 比预期少了很多。原来 *又有一块* RAM 芯片失效了。
最终,我们让 PET 运行起来了。我输入了一个简单的程序来生成动画图形图案,那是大约我 13 岁 (http://www.righto.com/2025/04/commodore-pet-repair.html#fn:listing) 时记得的程序,并生成了如下输出:
最后,PET 正常工作了,并显示了一些图形。想象这个图案在不断变化。
最后,PET 正常工作了,并显示了一些图形。想象这个图案在不断变化。
现在回想起来,我应该在开始时就把所有 RAM 和 ROM 芯片都测试一遍,也许不用逻辑分析仪也能找到故障。不过,逻辑分析仪给了我一个学习 Ghidra 和 PET 汇编代码的借口,所以最终结果还不错。4 (http://www.righto.com/2025/04/commodore-pet-repair.html#fn:why)
坏芯片放在键盘上方。
坏芯片放在键盘上方。
最后,PET 共有 6 个坏芯片:两个 ROM 和四个 RAM。6502 处理器本身结果却是好的。5 (http://www.righto.com/2025/04/commodore-pet-repair.html#fn:6502) 下面的照片显示了放在 PET 小巧键盘上的 6 个坏芯片。在每个按键的顶部,你可以看到称为 PETSCII 的奇特图形字符集。6 (http://www.righto.com/2025/04/commodore-pet-repair.html#fn:petscii) 至于标题(6 又 1/2 个坏芯片),我把那个烧录有问题的 ROM 算作半个坏芯片,因为芯片本身没问题,但功能不稳定。
CuriousMarc 制作了一个关于 PET 修复的视频,如果你想看的话:
在 Bluesky (@righto.com (https://bsky.app/profile/righto.com)) 或 RSS (https://www.righto.com/feeds/posts/default) 上关注我以获取更新。(我不再使用 Twitter。)感谢 Mike Naberezny 提供了这台 PET。感谢 TubeTime (https://bsky.app/profile/tubetime.bsky.social)、Mike Stewart,特别是 CuriousMarc (https://www.youtube.com/CuriousMarc) 对修复工作的帮助。一些有用的 PET 故障排除链接在脚注中。7 (http://www.righto.com/2025/04/commodore-pet-repair.html#fn:troubleshooting)
## 脚注与参考
相似文章
Fisher-Price Pixter 的完整保存
详细记录了 Fisher-Price Pixter 设备及其游戏的首次完整逆向工程、文档化和模拟过程,涵盖了硬件分析、ROM 转储以及软件模拟。
超级任天堂卡带内部揭秘
对超级任天堂卡带的详细技术分析,涵盖 CIC 复制保护、ROM 容量分布、带电池备份的 SRAM 以及 Super FX 等增强处理器。
另外八款 8 位时代的微处理器(2024)
本文详细介绍了八款鲜为人知的 8 位时代微处理器,包括德州仪器 TMX-1795 和 Mostek 5065,探讨了它们的历史意义与设计特点。
逆向工程386处理器的预取队列电路
详细介绍386处理器预取队列电路的逆向工程,解释所用的增量器、对齐网络和动态逻辑。
386处理器寄存器的异常复杂电路
对英特尔386处理器寄存器电路的详细逆向工程分析,揭示了六种不同的定制电路和交织位存储。