引导IBM 1401:1959年Punch卡计算机如何加载程序

2021-02-24 21:23:43

当计算机没有操作系统而没有ROM时,如何从打卡中启动计算机?要使事情更糟糕,这台计算机需要特殊的元数据,称为#34;字标记"可以' t在卡上代表。在这个博客文章中,我描述了复古IBM 1401计算机中使用的有趣硬件和软件技术,以从打卡甲板加载软件。(除其他内容中,每个人的一半卡包含读取每张卡时运行的加载器代码。)我详细介绍了一些IBM 1401机器代码,这说明了1401' S架构和指令置于现代机器的惯性。

IBM 1401是一台早期的全晶体化计算机,所以早期它没有使用硅晶体管,但锗晶体管。它于1959年宣布,并继续成为20世纪60年代中期的最畅销的计算机在使用中超过10,000个系统。1401每月租用2500美元(目前的美元约20,000美元),为许多公司开辟了计算的低价。即使中型企业可以使用1401美元的工资单,会计,库存,订单处理和发票。

计算机历史博物馆的IBM 1401大型计算机。 IBM 729磁带驱动器位于右侧。

要了解1401'它有助于了解在该时代中使用的打卡方式。在1928年,IBM开发了80列打卡卡,成为几十年的数据处理标准。发布卡持有80个字符,每个列,一个字符由该列中的孔表示,如下所示。6位字符集限制为64个不同的字符:大写字母,数字和一些特殊字符。二进制,卡片使用基于BCD的编码(稍后扩展到创建EBCDIC)。 1

尽管它们的局限性,Punch卡被广泛用于20世纪70年代及以后的数据处理。典型应用程序使用一张卡片为每个数据记录使用一张卡,因此将所有符合80列的一张卡分为80列2,分为固定长度的字段.Ooften,自定义将打印卡,显示应用程序的字段,例如下面的卡设计用于会计。 3each领域具有固定的位置。例如,在下面的卡中,客户名称来自列18到29,而发票金额在列74到80中。

IBM 1401具有特殊的架构,优化以支持这些打卡应用程序。该概念是通过字标记,一种元数据,然后在任意长度字段运行的指令中将固定长度字段分隔在内存中。这允许您使用单个指令移动19个字符的名称字符串。或者您可以在单个指令中执行50位数字字段的算术.Thus,字标记对于固定字段数据方便,因为您不需要循环字段的每个字符。

要实现字标记,每个内存位置有6位,以保持字符以及单独的位以保持单词标记。(这些不是字节,因为IBM 1401捕获基于字节的计算机的普及。)它&#39值得注意的是要注意,单词标记独立于字符。使用不同的指令使用不同的指令来使用不同的指令来设置或清除所有作用于字符。配置字标记,因为数据记录被读入内存时,它们保持不变。

单词标记对于机器指令也是至关重要的,因为它们指示了指令的长度。1401中的机器指令由一到八个字符组成。第一个字符是op代码,可能后跟地址和/或修改器.ECH需要在OP代码上设置单词标记,并在指令(即下一个指令的op代码)之后的下一个字符上的字标记。注意字标记创建问题。程序的机器指令直接表示为打卡上的字符,但打卡不能保持必要的单词标记。

因此,将程序加载到1401中提出了两个问题。首先是标准计算机引导问题:如果在机器中没有程序,则执行负载?但是有一秒钟:单词标记是1401机器代码的关键组件,但是单词标记不能在打孔时表示字标记卡片。在下一节,I' LL详细解释了IBM 1401如何解决这些问题。

要加载程序,请将卡片甲板放置在读卡器中,如下面的短版本.CACK具有顶部印刷的卡片内容,孔在下面的列中冲压。前两张牌是自动启动初始化计算机的卡' s内存,清除它和设置所需的单词标记。批量卡在左侧的所需节目的机器代码以及右侧的装载机的机器代码。最后卡运行程序。

在每张卡的最右侧,列72-75持有序列号(0001到0017)。如果您删除了卡片甲板,可以通过卡分拣机将卡片放回顺序,在序列号上排序。 8.

通过按下&#34开始负载过程;负载"读卡器上的按钮(蓝色面板中心附近的橙色按钮).This按钮导致几个操作进行。 4读取第一张牌,内容被放置在存储器地址1到80.A字标记上被设置在地址1上,并从地址2到80清除。最后,执行地址1的指令。纪要这些操作是用包括离散晶体管的电路板在硬件中实现;没有微码或操作系统帮助解决这些任务。 5.

IBM 1402读卡器/打孔。 1401计算机位于背景(左),磁带机位于右侧。

第一个指令,008015是"设置字标记",引导序列的关键部分。逗号是op代码,地址参数是" 008"和#34; 015"(由于1401是小数计算机,而不是二进制,字符" 015"与地址15相同。)该指令在指定地址设置字标记,8和15。

请记住,一条指令需要在操作码上有一个单词标记,并在指令后的字符上有另一个单词标记。 " Load"按钮在地址1上放置了一个字标记,但是第二个字标记呢?事实证明,硬件中的" Set Word Mark"例外。指令6允许它在没有第二个字标记的情况下执行。(此异常非常重要,因为否则第一条指令将无法执行。这是经过精心计划还是为了使事情正常进行破解?我不知道。)

由第一条指令设置的字标使接下来的两条指令运行。它们也是" Set Word Mark"。指令,在地址22、26、30和40上放置文字标记。请注意,每个" Set Word Mark"指令设置了两个单词标记,但只有"用完"第一,因此代码正在取得进展,为将来的指示准备了文字标记。

现在我们来/ 019;带有斜线的操作码表示“好奇”"清除存储"该指令开始清除指定地址(19)上的存储,然后向下进行直到地址为100的倍数,因此,在这种情况下,它将从地址19向下清除到地址0,同时擦除字符和单词标记。位置包含我们刚刚执行的指令。)通过存储空格来擦除位置;这似乎是一个奇怪的选择,但请记住,空的打孔卡列将被读取为空白。下一个Set Word Mark指令,001将单词标记放回位置1。

此时,存储器的内容如下所示。带下划线的字符表示单词标记,这是IBM文档中表示单词标记的方式。

下一条指令是L020100"将字符加载到单词标记中"该指令将地址20处的字符(即" 4")复制到地址100中,然后该指令继续向下复制(复制总而言之,地址20到1被复制到地址100到81。位置81到99接收到空格,而地址100则接收到" 4&# 34;。这似乎毫无意义,但" 4"不久后,它将成为重要的指示符。该指令还说明了单词标记如何允许使用单个指令复制长字段。

接下来的三个指令在地址47、54、61、68和72上设置了字标记(引导代码需要花费很多精力来确保为将来的指令设置了字标记。)下一条指令⌑081081具有IBM的不寻常菱形锭剂字符作为操作码。该指令清除地址81上的字标记(该地址已从地址1复制)。卡上的最后一条指令1022读取下一张卡(操作码1为" Read"),然后跳转到地址22,执行一张卡的工作很多,但是下一张卡上有一些非常棘手的代码。

该卡的执行从地址22的清除存储指令/ 000开始,请记住清除存储指令如何向下执行直到地址为100的倍数?在这种情况下,它将清除地址0然后立即停止在地址0( 100的倍数)。但是,称为B寄存器的寄存器将保存下一个地址(向下计数),该地址将从0到内存中的最高地址换行。为简单起见,我将假定代码正在运行一个1401型,具有1,000个字符的存储器,因此B寄存器将保存地址999。7

下一个指令H025是自修改代码的棘手位。它将B地址寄存器的内容存储到位置23-25,改变"清除存储"我们刚执行的指令,我们刚刚执行到/999.next,B022100 4指令将分支到地址22,如果地址100保持A" 4" (这是真的,因为第一张牌放了一个" 4"那里。)

回到地址22时,修改了清除存储指令为/ 999,因此它现在将清除地址999-900.它后跟H025,如前所述,它将将B寄存器存储到清除存储指令中。这次它将修改清除存储在899开始。最后,条件分支循环回到以前的地址22。

结果是,此循环一次清除内存100个字符,使用自修改代码更新位置。此循环继续直到清除地址100-199。在这一点上,分支指令将失败,因为地址100 holdsa空白而不是a" 4"。此点,循环已将所有存储从100到内存结束,擦除字符以及删除字符任何单词标记。

下一个指令是清除存储/ 061046,它将存储器从地址46到0清除到0,然后分支到61.AT地址61 ,,001040在地址1和40处设置字标记。最后,1040读取下一个卡并在地址开始执行40.使用第一张卡,卡的列1到80被读入存储器地址1到80。

下一阶段包括将所需的程序读取到内存中。典型卡是:

卡的左侧部分(列1-29)包含我们想要运行的程序的机器代码。右侧部分(列41-71)包含将执行卡片的加载器代码,将该代码加载到逐个卡片中内存的右侧部分和设置字标记。

第一个加载程序指令L029368将程序代码从卡读取器缓冲区复制到所需的存储器位置。具体来说,它将从地址29开始,从地址29开始到地址1.这些字符将被复制到地址368到340.下一个指令在此代码中设置字标记,在地址343,346,351,356 ,361和364.这回答了内存中程序如何获得字标记的问题,即使打卡卡可以' t明确存储单词标记。最后,1040读取下一个卡并在地址40开始执行它。

以下卡具有相同的结构:左侧的程序和右侧的加载器代码。互联器,程序代码的字符数是可变的,因为加载器代码可以设置每卡最多6个字标记。在最坏的情况下,所有字符都需要字标记,所以卡可以提供6个字符。在最佳情况下,40个字符可以安装在卡的左侧。

最后一张卡具有清晰的存储指令/ 333080。这将内存从地址80向下清除为0,擦除Thecard缓冲区和加载器代码,因此程序将从干净的板岩开始。然后清除存储指令然后跳转到地址333,开始执行程序。在所有这项工作中,计算机终于运行了我们想要运行的程序。当加载过程似乎很长时间写完时,读卡器很快一种机电装置,通过它有超过13个小卡片。

我在该示例中使用的程序是我写的Mandelbrot分形发电机。下面的照片显示了程序的结果,需要12分钟才能执行。我在这篇文章中详细讨论了该计划。

计算机历史博物馆的IBM 1401大型计算机(左)在1403线打印机(右)上打印Mandelbrot分形。

上面描述的引导码i只是可能的引导序列之一.Programmer可以编写自己的引导码,尝试尽可能短。我在此描述了更长的三卡序列。IBM 1401也可以从a启动磁带使用类似的过程;按下"磁带负载"控制台上的按钮加载了RecordFrom磁带,就像从卡启动一样。

IBM 1401计算机的控制台。 "磁带装载"按钮在右下方。

术语" bootstrap"有一个有趣的历史。它从物理靴开始,它经常在顶部有靴子绑带,物理带子有助于拉动靴子(如下所示)。在1800年代,俗话说"没有人可以通过他自己的靴子"被用作不可能通过一个&#39的努力来改善的隐喻。(拉动你的靴子上的皮带,看起来应该把你抬起,但当然是不可能的。)

从专利41087,不是第一引导表专利的引导脚跟处的靴子带的示例。

到20世纪40年代中期," Bootstrap"用于电子设备来描述通过积极反馈开始自身的电路,通过其靴子牵引自身。(参见1943年,1944年和1946年的用法).By 1952,模拟计算机使用了叫做&#34的电路。 Bootstrap Integrators"

当一个数字计算机通过自己的努力加载了程序时,这取决于姓名" bootstrap",追溯到20世纪50年代。(使用程序加载程序似乎是矛盾的,因为你的引导举起自己,但幸运的是它有效。)1954年术语词汇表定义" Bootstrap"作为"输入磁带开头的编码指令,以及由交换机或按钮插入的一个或两个指令,用于将例程放入计算机。"由部门发布的1955年计算机调查商业有类似的定义。

引导IBM 1401很复杂,并且在后面的计算机中进程变得更加复杂。在20世纪60年代,IBM系统/ 360等计算机具有存储在只读存储中的引导微码。这代码可以加载一系列引导程序首先,首先是64字节的引导卡,然后将加载4千字节的引导程序,然后加载磁盘操作系统。一些早期的小型计算机和微型计算机缺少ROM并落后一步,要求用户在启动代码中彻底切换在前面板上开关。

现代计算机通过更复杂的Bootstrap进程。x86系统的初始引导码存储在ROM中,并通过更旧的计算机或更现代系统中的UEFI中的BIOS进行引导。系统在没有缓存的原始状态下启动虚拟内存,在&#34运行单个核心; 8086实模式"。启动代码设置系统并加载Bootloader程序,然后加载另一个引导加载程序,该程序加载内核,启动计算机&#39 ;在这个演示文稿中,各种进程。

研究1401&#39的机器代码显示了与现代计算机和指令集的现代计算机相比的许多不寻常的特征。能够处理单词标记是最明显的差异,具有特殊说明来设置和擦除它们。从现代透视,它'不寻常看一台与#39; t使用字节的计算机,虽然这是常见的。当时使用十进制算术和十进制寻址也似乎似乎奇怪的从现代的视角。其他好奇心是自我修改的代码。虽然现在不鼓励自修改代码,但它在1401上很常见(与那个时代的其他计算机一样)。

我在Twitter上宣布我的最新博客帖子,所以跟随我@kenshirriff。我也有RSS饲料。

虽然打牌卡几乎总是持有字符数据,一个名为"列二进制&#34的可选功能;允许的二进制数据是PunchedOnto卡,每列中的12位,12位,为列二进制功能每月收取101美元(以20世纪60年代)。 ↩

需要将所有数据分为80列是导致Y2K问题的因素之一。如果您在卡上使用了四列来持有年份而不是两个,而且需要放弃两个珍贵的列别的地方。 ↩

以下打卡是客户申请的卡定制卡的示例。本卡用于凤凰钢公司的薪资。

负载键的操作在1401参考手册(P118)中指定:"此键用于开始加载指令卡。按压负载键在ACARD通过读取站之前操作读取源。设置为001的I-AddRess Registis和字标记在地址001中设置。地址002到080中的Allower字标记areremoved。"执行第一列中的指令,然后继续操作第一条指令。 ↩

装载第一张卡时,第一个单词标记如何设置?我看过电路的文档,并找到了相关的触发器(下面)。它由“加载”按钮设置,设置第一字标记(WM),然后清除。

下面的照片显示了实现该触发器的卡。在1401,您实际上可以看到实现每个功能的物理晶体管。

需要用单词标记用单词标记指示,具有少数特定例外。在1401参考手册(p15)&#34中记录了一些特定的例外; 4个字符的无条件分支指令,7个字符集字标记,以及清除存储和分支指令唯一的指令随后是一个没有单词标记的空白。所有其他指示都必须是单词标记。" ↩

我使用的1401台计算机有16,000个字符的内存(不是16,384,因为它' sa小数机!)所以在清晰的存储指令之后,B寄存器将持有15,999,指向内存的顶部。您可能想知道如何 地址15,999以三十进制字符表示。诀窍是特殊的地址代码使用字符的顶部两个位来保存地址的千字节部分。结果地址为999,其中数百个和单位字符的顶部两个位为999 SET.结果是三个字符的字母数字地址I9I代表地址15,999。 ↩ 如果您有不幸删除您的卡片,卡片分拣机可以使用序列号来将它们放回序号。卡分拣机将卡片快速分类为基于一个c的数字打孔的插槽 ......