国外一名大神突发奇想,使用一台上世纪60年代的老式IBM 1401大型机设计并打印出了一张贺卡。从这件事中我们能看出来,人一旦无聊起来,什么事都会做的。当然,如果要追溯计算机历史的话,这篇文章对我们了解当年大热的IBM大型机可能也会有一定帮助(关于IBM 1401大型机的详细信息请点击文末链接查看)。以下是博客原文:
我最近遇到了一个挑战,要在一台老式电脑上制造节日贺卡。经过一系列的挑选,我最终选定了20世纪60年代的IBM 1401主机。IBM 1401计算机是1959年宣布的低端商业主机,是20世纪60年代中期最流行的计算机,当时使用中的系统超过1万套。1401的租金是每月2500美元(约相当于如今的2万美元),这是一个很低的价格,可以让一个中型企业也有可能拥有一台电脑来支付工资、会计、库存和其他任务。1401是一台早期的全晶体管计算机,但使用的不是硅晶体管——而是锗晶体管,属于硅之前的技术。它使用磁芯存储器,可储存16000个字符。
▲一张表面有树,里面是“Ho Ho Ho” 的贺卡,是在老式1401主机上做的。卡片放在1403行打印机上,背景就是1401主机。
你可以通过打印一个页面来制作贺卡,然后把它四分折叠,使表面和里面都有文字。行式打印机的问题在于,当你把它折叠成一张卡片的形状时,打印出来的文本就会横在上面,因此你不能单纯地打印可读文本。所以我决定用横向ASCII图形制作一个图像和单词。(实际上1401早于ASCII码面世,曾使用基于BCD的字符集,称为BCDIC,所以它是真正的BCDIC图形。)起初我想写“圣诞快乐”,但在一页纸上没有足够的字符来写出“Chrstmas”这个词,所以我就选择了一个愉快的语气词“Ho Ho Ho”。我弄清楚了怎么画树和字,具体方法在这个文件中。https://gist.github.com/shirriff/e52c864f43ef02daee487b0e0cfd68fd
▲贺卡的特写,前面是一棵圣诞树。
接下来,我需要一个程序来打印这个文件。我写了一个简短的程序,从穿孔卡片上读取行,并在高速1403行打印机上打印这些行。简单的方法是从卡片上读取一行,打印行,然后重复,直到完成。不过与之相反,我选择先将整个页面图像读到内存中,然后打印整个页面。原因是这样可以在不重载的情况下打印多个贺卡,并重新读取整个卡片组。第二个问题是,打印机有132个列宽,而穿孔卡是80列。相对于每个打印行中使用两张穿孔卡片,我对卡片进行了编码,使“-”在第一列,表示卡片图像应该移到页面的右边。(当然,我可以压缩数据,但我不想花太多精力。)
1401的架构比较奇怪,有十进制运算和任意长度的单词,所以我不会详细解释上面的代码。我要指出的是,r指令读取一张卡片,mcw移动字符,w为打印机写一行,如果字符等于指定的值,则bce分支。(详见参考手册http://bitsavers.org/pdf/ibm/1401/A24-1403-5_1401_Reference_Apr62.pdf)
下一步是将代码和数据打到卡片上。
▲一个由PC控制的IBM 029键控打孔机打了这一叠卡片。
几分钟后,我就有了77张穿孔卡片。程序本身只用了9张牌;剩下的牌都是打印出来的。
▲在IBM 1401上运行的一叠穿孔卡片。最初的几张牌是程序,剩下的牌保留打印的行。
卡片准备好了之后,我们把牌载入读卡器,点击“加载”,卡片就会以每秒12张的速度通过读卡器。不幸的是,读卡器遇到了错误并停止了。显然,击键孔的对齐方式与读卡器的对齐方式不匹配,导致读取错误。
▲IBM 1401的读卡器出现错误,所以我删除了画笔并重新进行调整。
卡片阅读器包含80个金属笔刷(卡片的每一栏的一个),检测出有一个洞。我们拆开了读卡器,从读卡器上删除了笔刷,并进行了调整。
▲笔刷模块的特写,有80个刷子读卡片。
经过几次尝试,我们让读卡器成功地读取程序并开始执行。行打印机迅速启动,打印出卡片的行。我们必须对行打印机的顶部进行几次调整,这样卡片就能在页面上显示出来,最终我们获得了成功。
▲在IBM 1403行打印机上打印贺卡。
我把那页纸从打印机里取出来,将卡片四分折叠,贺卡就这样完成了。这是一个有趣的项目,虽然卡片看起来并不美观。
▲用IBM 1401主机(背景)做的贺卡。
如果您想了解更多关于IBM 1401的内容,请点击以下链接查看。http://www.righto.com/2015/10/repairing-50-year-old-mainframe-inside.html