【免费下载链接】Paterson-Listings
Transcription of Tim Paterson's DOS printouts.
想了解 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 个功能,值得对照收藏:
| 功能号 | 函数 | 功能号 | 函数 |
|---|---|---|---|
| 0 | ABORT | 19 | DELETE |
| 1 | CONIN(读控制台) | 20 | SEQRD(顺序读) |
| 2 | CONOUT(写控制台) | 21 | SEQWRT(顺序写) |
| 3/4 | READER / PUNCH | 22 | CREATE |
| 5 | LIST(打印机) | 24 | INUSE |
| 7/8 | RAWIO / RAWINP | 25 | CURDRV(当前盘符) |
| 9 | IN | 26 | SETDMA |
| 10 | PRTBUF | 27/28 | GETFATPT / WRTPROT |
| 11 | BUFIN | 33/34 | RNDRD / RNDWRT(随机读写) |
| 12 | CONSTAT | 35 | FILESIZE |
| 13 | VERSION | 41 | MAKEFCB(扩展函数) |
| 14/15/16 | DSKRESET / SELDSK / OPEN | 17/18 | SRCHFRST / 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" 一节),流程只有两步:
- 准备一份 Seattle Computer Products 的 8086 汇编器(任意 86-DOS/MS-DOS 发行版里都有;本仓库 3_source_code/SCP_ASM/ 中还收录了汇编器 2.40 和 2.43 的源码);
- 在目标盘上执行:
A:ASM 86DOS A:HEX2BIN 86DOS成功后会看到Error Count = 0,并得到可运行的86DOS.COM。仓库为只读资源,建议先克隆到本地再操作:
git clone https://gitcode.com/gh_mirrors/pa/Paterson-Listings6. 总结:新手推荐阅读路线
最后给出一条最省时间的阅读路线:
- 先读注释:86DOS.ASM 第 1~129 行 的数据结构说明(约 30 分钟);
- 再读入口:第 199~346 行 的双入口与分发表,把 37 个功能号过一遍;
- 然后挑一个函数精读:建议从
CONOUT(功能号 2,屏幕输出)入手,它最短,能完整体会一次系统调用的进入与退出; - 最后看初始化:第 3296 行起 的
DOSINIT,补全"磁盘上的内核如何活过来"的最后一环; - 进阶:对照 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.
相关推荐
Paterson-Listings诞生记:一封粉丝邮件如何让Tim Paterson寄出86-DOS原始打印稿
Paterson Listings诞生记:一封粉丝邮件如何让Tim Paterson寄出86 DOS原始打印稿 Paterson Listings 是 DOS
揭秘MS-DOS的诞生:从86-DOS到微软帝国的崛起之路
揭秘MS DOS的诞生:从86 DOS到微软帝国的崛起之路 MS DOS作为个人计算机时代的操作系统先驱,其诞生背后有着一段鲜为人知的技术传奇。这个由Tim P
两遍汇编深度剖析:Paterson-Listings中ASM 2.43的源码与8087协处理器支持
两遍汇编深度剖析:Paterson Listings中ASM 2.43的源码与8087协处理器支持 本文带你读懂 Paterson Listings 仓库中的经
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考