早些时候,微软发布了一篇名为《续写早期 DOS 开发的故事》的文章,公开了目前发现的最早的 DOS 源代码。来自 45 年前的纸质打印稿。@Appinn

1980 年,一家叫 Seattle Computer Products(SCP)的小公司正在卖基于 Intel 8086 的电脑板卡。
机器有了,但没有系统。
当时他们手里唯一能配套卖的软件,只有微软帮忙写的 BASIC-86。但用户既没法方便地管理文件,也没法正常加载和运行软件,所以机器一直卖得不太好。
(早期计算机,开机直接进入 BASIC,并没有操作系统的概念)
后来,公司里的工程师 Tim Paterson 干脆自己动手,用几个月时间快速写了一个新系统,最早叫 QDOS(Quick and Dirty Operating System),后来改名成 86-DOS。
它原本只是一个为了“先让机器能用起来”的临时方案,却刚好赶上了 IBM PC 诞生前夜。
那时候,IBM 正在开发第一代 IBM PC,而微软自己又没有现成的操作系统,于是微软找上了 Seattle Computer Products,获得了 86-DOS 的授权,后来又直接买下了全部权利。
另外,后来 SCP 认为,微软在购买 86-DOS 全部权利时,故意隐瞒了 IBM 已经是大客户这件事,因此用很低的价格(5 万美元)拿走了系统,于是起诉了微软。
1986 年,陪审团已经开始讨论结果时,双方庭外和解,微软向 SCP 支付了约 92.5 万美元,作为交换,微软彻底拿回 DOS 相关授权问题。
再往后,86-DOS 被改造成 IBM PC 使用的 PC-DOS,并逐渐发展成后来的 MS-DOS。
参与恢复与校对的 Rich Cini 在对比源码时发现,86-DOS 与后来的 PC-DOS 之间,其实并不像很多人想象中那样“完全不同”。很多代码、结构甚至注释,都能直接对应上。
当年的源码保存方式和今天完全不同,很多资料并不是磁盘文件,而是打印出来保存的 listing。部分源码后来又经过传输、复制和重新打印,因此不同版本之间会出现细微差异。

45 年,已经非常久远了。青小蛙遇到这个情况,肯定是要计算一下的:2026-45=1981。
这次微软公开在 GitHub 的核心代码几乎都是 Intel 8086 汇编写的,源码文件以 .ASM 为主。


这些代码并没有保存在硬盘中,而是保存在打印纸上。
86-DOS 作者 Tim Paterson 当年保留下来的,是一摞摞连续的打印纸。打印出来的包括源码、汇编列表、调试记录,还有大量手写修改痕迹。
DOS History(DOS 历史)保存团队重新扫描这些老打印稿,再通过 OCR 把图片转成文本。但由于年代太久,很多字符已经模糊,OCR 识别错误也不少,比如 0 和 O、1 和 I、: 和 ;,于是又需要人工逐行校对、修复。

还有个更麻烦的问题:空格。当这些老打印稿重新整理成源码文件时,空格在哪里,有几个,都是问题。
早期汇编代码非常依赖固定列宽,指令、参数、注释通常都要严格对齐。一旦 OCR 把空格、Tab 或字符间距识别错位,整段代码的布局就会乱掉。
比如下面的指令、参数、注释,都要严格对齐(现代显示都很难对齐啊):
而 1980 年代的打印稿,又大量使用固定空格进行排版。甚至连当年开发过程中划掉的代码、临时修改、注释痕迹,也尽量保留了下来。
最后,他们才把这些资料重新整理成今天的 GitHub 仓库。
这次公开的,是“目前发现的最早 DOS 源代码”。


Rich Cini 在分析源码时发现,部分内容存在缺失:有些地方会突然少掉几行代码,部分注释也出现了中断。
他认为这些缺失不像 OCR 识别错误,更像是在早年源码传输过程中就已经出现的问题。并推测当年 SCP 向 Microsoft 传输源码时,可能发生过串口传输错误。
Rich Cini 还发现,这次公开的“86-DOS 1.00”内核,其实已经修复了 STORE Bug,因此功能上更接近后来的 1.01。这部分代码修改时间,可能已经晚于最初的 1.00 版本。
Rich Cini 说,对他来说,最特别的,是能与那些亲历 PC 革命早期的人交流。当年的很多开发者,并不觉得自己正在“创造历史”。
这些项目对他们来说,更像是一份工作、一个项目,或者一种兴趣爱好。
那时候还没有 Git、GitHub 和云同步,很多源码真正留下来的方式,只是一摞摞连续打印纸。
谁也没想到,45 年后,人们还会重新翻出这些打印稿、软盘和 listing,试着把 DOS 最早的开发历史重新拼回来。
原文:https://www.appinn.com/microsoft-open-45-year-old-dos-source-code-paper-listing/
参考链接: