硬核还原:显微镜手撸晶体管,逆向工程还原经典计算器

文章正文
2020-06-18 15:15

Sinclair Scientific 计算器酷吗?

它很受欢迎,自 1974 年发售,就频频出现在《大众机械》等出版物封面。其巧妙编写的固件,使它本只用于基础算术的处理器,能马力倍开远远超出正常性能。这也使得 Sinclair 能将这款计算器卖给无数人,尤其那些买不起高价计算器的人。但它也有弊端,比如,速度很慢,有时不够准确,提供的数学函数也不足以成为科学计算器,而且对于初学者来说操作困难。

我之前对它偶有耳闻,主要还是因为它算是英国微机产业的一个里程碑。因此,当我在 Tindie(硬件产品电商平台)看到 Chris Chung 的该计算器复制套件时,我便点进去看了看。然后浏览了一下有关原计算器工作原理的说明——只有科学计数法?没有 “等于”按钮?——这个复制品通过在固件上运行仿真器,来模拟这些行为。而该固件则是通过肉眼观测原处理器上的线路,然后逆向工程出来的。这简直太酷了!于是我也想试着捣鼓捣鼓。

复制品:原始的 Sinclair Scientific 也以套件形式出售。

Chris Chung 的版本小些,用的组件也少些,并且能模拟基于 TMS080x CPU 系列的两个计算器:一个简单的算术计算器 TI Datamath 以及 Sinclair Scientific。因此,电路板上的印刷丝同时印有两个计算器的布局。

首先,来看看硬件吧。该工具包是众多 Sinclair 计算器复制品中的一个,但在简化方面做得很有特色:只由一个芯片、一张信用卡大小的印刷电路板、还有少量分立组件组合起来。Chung 实际上提供了两款套件:原始套件——这个套件于 2014 年开发,但 2019 年底才投入使用,用了两个小型 QDSP-6064 圆形罩 LED 模块来显示数字,该模块有着 70 年代计算器经典外观,但长期以来停产,很难入手。

于是 Chung 在 2020 年对该套件的更新中,用了更先进的七段 LED 显示屏。两种套件的不同稀有性,价格就能看出:2020 版的价格为 39 美元,而原始版本是 79 美元。虽然贵,但原始版本能让你很方便地和圆形罩 LED 一起使用:PCB 板上孔的尺寸都设计得刚刚好能用摩檫力卡住。这意味着都无需焊接,这样也就可以将组件进行重复使用。

两种版本的功能差不多,均基于 MSP430 微控制器。而 MSP430 消除了对 Sinclair Scientific 中大多数其他组件的需求,并可以运行 TMS080x 芯片系列的仿真器。TMS080x 系列是由德州仪器(TI)构建,其特定版本(如 Sinclair Scientific 中用的 TMS0805)因其 3520 位的 ROM 而与众不同。

70 年代外观:圆形罩 LED 组件在早期计算器中很常见。圆形罩是用来视觉放大的。

一直以来,Sinclair 是如何将这块芯片发挥到如此高性能之谜,还一直封存在 TMS0805 芯片的 ROM 中。直到 2013 年,在 Ken Shirriff 加入 Visual 6502 团队听说 Sinclair Scientifi 后,这个谜题才慢慢解开。这个团队喜欢对经典芯片进行逆向工程,因为很多经典芯片的原始设计图纸都已丢失,所以有时,该团队会用酸蚀刻掉芯片封装,再用显微镜仔细拍摄裸露的硅芯片,以查看各个晶体管。而 Shirriff 先是只通过研究德州仪器(TI)的专利申请,就用 JavaScript 写出了 TMS080x 芯片的通用仿真器,但 Sinclair 的 TMS0805 ROM 中使用的特定代码却让他百思不得其解,直到 Visual 6502 团队成员 John McMaster 在 2014 年拍下一块硅片后,他才终于搞明白。

同时因为 Shirriff 对计算史做过大量研究,所以他和 IEEE Spectrum 也很熟。我就直接给他发邮件,问他怎么从显微照片变成工作代码。“通过查看金属氧化物门在芯片 ROM 中的排列方式,我就能提取出直接的二进制码,” Shirriff 写邮件回复说,“ Phil Mainwaring,Ed Spittles 和我花了一天时间弄清楚原始二进制码如何与代码对应… 代码是 11 比特的 320 个字节,但 ROM 实际上电路是 55 行和 64 列…  通过检测各种电路组合,分析二进制码中的模式,然后暴力尝试各种租合,我们就找出了正式排列方式并能提取代码了。”

一旦将代码加载入模拟器后,Shirriff 和他的团队就可以梳理其工作原理了。对于贯穿其始终用到的算法,Shirriff 解释说:“本质上就是一种能得到答案的最简单的暴力算法。但开发者用了一些有趣的数学技巧来提高准确性,而且还有一些编程技巧来优化代码。”(如果需要详细解释,Shirriff 有维护模拟器的在线版本,可以逐行查看代码。)

转一转:Sinclair Scientific 计算器中三角函数计算,是通过不断旋转初始矢量到目标角度而实现的。计算大多数角度都需花数秒钟。

Sinclair Scientific 还通过后置表示法来降低复杂度,在后置表示法中运算符紧随其运算的数字之后,比如说 “ 5 + 4 =”表示为 “ 5 4 +”。而三角函数的计算则用迭代逼近技术,该技术可能得几秒才能获得结果,而且通常仅精确到前三个有效位数。此外还对所有内容用了固定的科学计数法—因此无法输入小数点。所以如果要输入 “ 521.4”,就要先输入 “ 5214”它在计算器上显示为 “5.214”;接着按 “ E”并输入 “ 2”,使数字成为 “ 5.214 x 10^2”。这过程中,一次还只能输入一个数字。

其实这样写出来一看,大家可能会觉得这东西非常破,让人感觉就是在经济上负担不起的情况下,才用的玩意儿。类似 HP-35,虽然 HP-35 的设计者也以其准确性和功能性为荣(HP-35 也用了后置表示法,但以一种更巧妙的方式)。

但我们需要知道的是,Sinclair 并不是要和其他计算器竞争,而是要与计算尺竞争。我以前在其他文章中读过这一点,但我一直无法理解这句话的含义,直到我亲手拿到这个工具包。之前一次偶然机会,我还入手了一把老式的 Pickett 计算尺,并了解了如何用它进行基本操作——多亏了国际计算尺博物馆官网上的课程。

所以当我用 Sinclair Scientific 时,我对其中概念与使用计算尺时概念的高度相似性感到震惊。这里,精度通常也为 2 到 3 位数,滑动 “游标”意味着在刻度间仅传递一个数字,并且通常不理会 0。仅使用最高有效的数字,并由使用者大致估算,得出在末尾哪儿插入小数点,或加多少 0。这意味着,使用者会以完全相同的方式,来计算 52 x 2 和 5200 x 20。

这也是为什么,我觉得这款复制套件如此重要——这个机器提供了一种简单的方法,使人无需双手来实际操作设备就能明白计算尺的原理。值得注意的是,正如 Henry Petrosk 指出的,好的设计实际上并非作为抽象事物独立存在的,而得存在于特定上下文中。

那么,再回到开头的问题,Sinclair Scientific 酷吗?

对我来说,答案是肯定的。

文章评论