☰
86-DOS 1.00内核完全指南:Paterson-Listings中3600行汇编源码的入门导读
2026/10/15 19:01:32 网站建设 项目流程

【免费下载链接】Paterson-Listings

Transcription of Tim Paterson's DOS printouts.

项目地址:https://gitcode.com/gh_mirrors/pa/Paterson-Listings
点击查看免费下载

想了解 IBM PC 上第一代操作系统的真容?Paterson-Listings 项目收录了 Tim Paterson 亲笔打印并保存下来的 86-DOS 1.00 内核打印清单,经完整转录后,这份约 3600 行 8086 汇编源码终于变成了可以直接阅读、甚至直接汇编的86DOS.ASM。无论你是 DOS 历史爱好者、系统程序员,还是汇编语言初学者,本文都是一份完整的入门导读:从仓库布局、内核结构、37 个系统调用函数,到亲手汇编出 86DOS.COM 的最快方法,一次讲清楚。

1. 项目背景:一摞 1981 年的打印纸如何变成可编译源码

1981 年,西雅图电脑产品公司(Seattle Computer Products)的工程师 Tim Paterson 写了一个面向 8086 的操作系统 86-DOS 1.00,它后来被微软收购并演化为 PC-DOS / MS-DOS,成为 IBM PC 的第一任"管家"。

40 多年后,研究者向 Paterson 本人求证,他寄出了一摞约 3.5 英寸厚的针式打印机输出纸(原始信件见 Tim_Paterson_24Apr2025_emails.txt)。这摞纸里包含 DOS 内核、CHKDSK 工具、SCP 汇编器等多个版本的打印清单。Paterson-Listings 项目将它们逐页扫描、转录,并"还原"为可编译源码,共整理出 10 个装订卷(bundle)中的前 8 卷。

想快速了解项目全貌,直接读 README.md 即可。

2. 仓库导读:三个目录分别该看什么

仓库按"加工深度"分成三层,新手建议直奔第三层:

目录内容适合谁
1_transcription/原始打印输出的逐页转录(bundle_1 ~ bundle_8)考据党
2_printed_files/从打印输出中提取出的原始文件(如 86DOS.ASM)对比核对
3_source_code/整理后可编译的源码大多数人(推荐)

3_source_code下又按版本细分:

  • 86-DOS 1.00:正式发行版内核,也就是本文主角;
  • PC-DOS_1.00_dev:1981-06-15、1981-06-16、1981-07-07 等多个开发快照,以及 CHKDSK 工具;
  • MS-DOS_1.25:1982 年 3 月的 MS 官方版本内核;
  • SCP_ASM:Seattle Computer Products 的 8086 汇编器 2.40/2.43 源码(编译这份内核需要它)。

3. 3600 行源码导读:86DOS.ASM 内部结构拆解

打开 3_source_code/86-DOS_1.00/86DOS.ASM,全文 3621 行,却涵盖了整个操作系统:启动初始化、磁盘 I/O、文件管理、内存控制,全部在这一个文件里。推荐按以下顺序精读。

3.1 文件头与修订历史(第 1~30 行)

文件开头就是一份完整的版本沿革(第 4~15 行):从 1980 年 12 月的 0.34 到 1981 年 4 月 28 日的 1.00 正式发布,仅用 4 个月迭代了 8 个小版本。每一版都有明确的功能说明,例如 0.42 版引入 32 字节目录项、0.80 版增加不回显的键盘输入——这本身就是一部微型的 DOS 开发史。

紧随其后是两个编译开关(第 22 行SMALLDIR、第 29 行DSKTEST),用来兼容旧格式目录和调试磁盘代码。

3.2 三大核心数据结构(第 32~129 行)

这段注释是整个文件最值得细读的部分,它定义了 86-DOS 磁盘世界的三大基石:

  • FCB(文件控制块),第 60~73 行:打开文件时的 32 字节状态描述,包含文件长度、日期、起始簇号等字段——它一直沿用到 DOS 3.3 时代;
  • 32 字节目录项,第 76~98 行:注释里完整描述了 FAT 表 12 位打包条目的解码算法,这正是后来整个 MS-DOS 磁盘格式的源头;
  • DPB(磁盘参数块),第 103~115 行:每块磁盘一张"身份证",记录扇区大小、每簇扇数、FAT 位置与目录起始扇区。

读完这 100 行注释,你就掌握了理解后面所有 I/O 代码的钥匙。

3.3 双入口与函数分发表(第 199~346 行)

86-DOS 设计了一个巧妙之处:同一组系统调用有两个入口。

  • COMMAND(第 199 行):中断入口,程序通过INT 80H调用;
  • ENTRY(第 206 行):远调用入口,程序通过CALL 5调用(段号 0Ch:偏移 64h),比中断方式开销更小。

入口代码统一保存全部寄存器、切换到内核自己的栈,然后根据功能号查分发表(第 302~346 行)跳转。这张表就是 86-DOS 的系统调用"目录",共 37 个功能,值得对照收藏:

功能号函数功能号函数
0ABORT19DELETE
1CONIN(读控制台)20SEQRD(顺序读)
2CONOUT(写控制台)21SEQWRT(顺序写)
3/4READER / PUNCH22CREATE
5LIST(打印机)24INUSE
7/8RAWIO / RAWINP25CURDRV(当前盘符)
9IN26SETDMA
10PRTBUF27/28GETFATPT / WRTPROT
11BUFIN33/34RNDRD / RNDWRT(随机读写)
12CONSTAT35FILESIZE
13VERSION41MAKEFCB(扩展函数)
14/15/16DSKRESET / SELDSK / OPEN17/18SRCHFRST / SRCHNXT

对比后世教材熟知的INT 21H功能号表(AH=3Ch 创建文件、AH=3Eh 读文件……),你会发现 86-DOS 的编号完全不同——这套早期方案在 IBM 版 MS-DOS 中被彻底重排,这段"编号变迁史"正是老玩家津津乐道的话题。

3.4 启动初始化:自定位内核的巧思(第 3286~3305 行起)

文件尾部的DOSINIT(第 3296 行)展示了早期系统程序员的高超技巧:内核代码与数据区共享同一片内存,启动时由引导扇区把内核加载到任意位置,DOSINIT从引导程序读取磁盘参数,计算出 FAT 大小,再把整块内核移动到正确地址后才正式开始运行。注释里特别标注了"这段代码不会被移动覆盖"的安全区(第 3286 行)——这是理解 86-DOS 内存布局的最后一块拼图。

4. 沿着快照看内核演进:从 86-DOS 到 MS-DOS 1.25

仓库最迷人的地方在于,同一套代码的连续时间切片都保存了下来:

  • 86DOS_1981-06-16.ASM 与 86DOS_1981-07-07.ASM:开发期快照,头部注释与 1.00 版一致,记录了交付 IBM 前后的状态;
  • CHKDSK_1981-06-15.ASM、CHKDSK_1981-07-15.ASM:最早期的磁盘检查工具,两个版本可以直观看到两周内的改动;
  • MSDOS.ASM(4030 行):MS-DOS 1.25 内核,比 1.00 版多了约 400 行;
  • STDDOS.ASM:22 行的"版本开关"文件,用MSVER、IBM、HIGHMEM等开关控制生成哪种变体,一个文件说明整个产品线如何共用一份源码。

配合 1981-06-16 打印的 86DOS.DIF 差异文件,你甚至能逐行核对两天之间改了什么。

5. 快速动手:用 SCP 汇编器编译 86DOS.COM

想验证这份源码的真实性?按 README 的说法(README.md 的 "Compiling/Assembling" 一节),流程只有两步:

  1. 准备一份 Seattle Computer Products 的 8086 汇编器(任意 86-DOS/MS-DOS 发行版里都有;本仓库 3_source_code/SCP_ASM/ 中还收录了汇编器 2.40 和 2.43 的源码);
  2. 在目标盘上执行:
A:ASM 86DOS A:HEX2BIN 86DOS

成功后会看到Error Count = 0,并得到可运行的86DOS.COM。仓库为只读资源,建议先克隆到本地再操作:

git clone https://gitcode.com/gh_mirrors/pa/Paterson-Listings

6. 总结:新手推荐阅读路线

最后给出一条最省时间的阅读路线:

  1. 先读注释:86DOS.ASM 第 1~129 行 的数据结构说明(约 30 分钟);
  2. 再读入口:第 199~346 行 的双入口与分发表,把 37 个功能号过一遍;
  3. 然后挑一个函数精读:建议从CONOUT(功能号 2,屏幕输出)入手,它最短,能完整体会一次系统调用的进入与退出;
  4. 最后看初始化:第 3296 行起 的DOSINIT,补全"磁盘上的内核如何活过来"的最后一环;
  5. 进阶:对照 1981-06-16 快照与 MS-DOS 1.25 版,感受一份代码在 10 个月间的演化。

这份 3600 行的汇编源码,是理解现代 PC 操作系统"出身"的原始档案。Paterson-Listings 让每个字都变得可读、可查、可编译——从这个 86-DOS 1.00 内核完全指南出发,欢迎开始你的 DOS 考古之旅。

【免费下载链接】Paterson-Listings

Transcription of Tim Paterson's DOS printouts.

项目地址:https://gitcode.com/gh_mirrors/pa/Paterson-Listings
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询