CP/M-86与MS-DOS交叉开发环境
原标题:CP/M-86 & MS-DOS Cross Development Environment
速览
该资讯介绍了针对CP/M-86和MS-DOS操作系统的交叉开发环境。此类工具允许开发者在一种平台上为另一种平台编写和调试代码。这反映了早期个人计算机操作系统竞争时期的软件开发技术背景。
AI 深度解读
CP/M-86 & MS-DOS 交叉开发环境深度解读
背景
在个人计算机发展的早期,Digital Research 推出的 CP/M-86 及其配套的 MS-DOS 曾是 x86 架构下的主流操作系统。然而,随着现代开发环境的演进,针对这些古老系统的原生编译器和构建工具已难以直接在 macOS、Linux 等现代操作系统上运行。
该项目由开发者基于“极客精神”和兴趣发起,旨在构建一个完整的 CP/M-86 交叉开发环境。其核心理念在于:既然所有基于 DOS 的工具都可以用于构建 DOS 程序,那么利用现代模拟器(如 emu2)和交叉编译工具链,便可以在现代 Shell 环境中重现当年的开发流程。该项目不仅整合了多种历史编译器(如 Aztec C、Microsoft MASM),还包含了针对 CP/M-86 的清理版内核和补丁,旨在为复古计算爱好者、历史软件研究者以及系统底层开发者提供一个可复现、可测试的开发闭环。
核心内容
该项目提供了一个标准化的脚本和工具集,用于自动化获取、配置和运行一系列用于 CP/M-86 和 MS-DOS 开发的遗留工具。以下是该环境的详细构成与工作机制:
1. 支持的开发语言与工具链
环境支持 C(K&R 及近似 ANSI 标准)、汇编器和 Basic 语言的开发。具体包含以下核心组件:
- Aztec C 编译器:
- 版本 3.4/3.40a:基于 K&R 标准,提供 CP/M-86 库
c86.lib,已打补丁。 - 版本 4.2/4.10d:近似 ANSI 标准。由于默认包中不包含 CP/M-86 库代码,该项目从 3.4 源码中修补并重新编译了
c86.lib,同时提供了 DOS 1.1 库d11.lib。
- 版本 3.4/3.40a:基于 K&R 标准,提供 CP/M-86 库
- Digital Research (DR) 工具集:
rasm86/link86/lib86(DOS 版本)。asm86.com和gendef.com。cb86.exe及相关库(CBASIC 编译器)。
- Microsoft 工具集:
- 包含
masm,link,asm,exe2bin,hex2bin。其中masm版本经过修补以兼容emu2等模拟器。
- 包含
- 其他汇编器:
nasm(Netwide Assembler)。- 用于运行 CP/M-80 程序的
tinylpo模拟器。
2. 模拟器与运行环境
为了在现代系统(macOS/Linux)上运行上述 DOS/CP/M 工具,项目引入了两个关键模拟器:
- emu2:一个强大的 DOS 模拟器,允许在现代化的基于 Shell/Make 的开发环境中直接运行 DOS 命令行工具。它与
PCE(PC Emulator)配合使用效果极佳,既用于构建工具链,也用于最终程序的测试。 - tinylpo:专门用于运行 CP/M-80 程序(如
asm86.com和gencmd.com)的轻量级模拟器。
3. 自动化构建与缓存机制
项目通过 fetch_tools 脚本自动化下载所有依赖项,并通过 archive/ 目录实现版本锁定和离线构建支持:
- 自动化拉取:运行
./fetch_tools会自动下载 Aztec C、DR 工具、Microsoft MS-DOS 工具、NASM、emu2 等所有组件。 - 缓存与离线重建:所有下载的归档文件(如
.zip,.tar.gz)均缓存于archive/目录。如果网络下载失败,脚本会回退使用缓存文件。 - 版本锁定:设置环境变量
ARCHIVE_FIRST=1可强制仅从本地缓存重建环境,确保构建的可复现性,即使上游源消失也能正常工作。 - 清理机制:
./clear_tools可清除工作目录,但保留archive/中的缓存,便于后续重新构建。
4. 自定义模拟器与补丁
- cpm86 模拟器:项目逆向工程并修补了随 Aztec C 提供的
cpm86模拟器,修复了部分 Bug 并增加了新功能。 - EOF 处理优化:增强版的
cpm86支持使用 EOF 填充记录而非 NULL,这简化了文本文件处理。但由于这与真实 CP/M-86 行为不符,默认禁用。用户可通过设置CPM86_EOF=1环境变量来启用此功能。 - 启动对象预处理:针对 Aztec 编译器的一次性链接器(
ln)特性,项目通过预处理自动在命令行添加匹配的 C 运行时启动对象(startup object)。这解决了因未引用 libc 符号导致链接失败或程序退出时崩溃的问题,无需再使用ord命令或重复链接库文件。
5. Docker 容器化支持
项目提供了 Dockerfile,允许用户在容器中隔离构建环境:
- 构建镜像:
docker build --rm=true -t cpm86:latest -f Dockerfile . - 运行示例:通过挂载本地路径(
-v \pwd`:/work)并在容器内执行特定的开发命令(如pcdev_rasm86,aztec34_cc` 等),实现跨平台的编译体验。
6. 许可证与法律声明
- Microsoft MS-DOS 工具:遵循 MITS 许可证。
- Aztec C:遵循 Aztec Museum 文档中规定的条件。
- Digital Research 工具:遵循 CP/M 博物馆(cpm.z80.de)的许可和 FAQ 规定。
- 开源组件:
emu2、tnylpo和nasm均为开源,遵循各自特定的许可证。 - 免责声明:开发者不提供任何担保,用户需自行承担使用风险并遵守上述各组件的使用条款。
关键要点
- 交叉开发核心:该项目本质是一个“复古计算”的交叉编译环境,利用现代模拟器(emu2)在 Linux/macOS 上运行古老的 DOS/CP/M 编译器和工具。
- 工具链完整性:整合了从 K&R C 到近似 ANSI C 的 Aztec 编译器、Microsoft MASM、Digital Research 的汇编器以及 NASM,覆盖了 CP/M-86 开发的主要语言需求。
- 可复现性设计:通过
archive/缓存机制和ARCHIVE_FIRST环境变量,确保即使上游资源失效,构建环境依然可复现,适合长期维护和历史软件还原。 - 模拟器增强:不仅使用了现成的
emu2和tinylpo,还逆向工程并修补了cpm86模拟器,解决了文本文件处理(EOF vs NULL)和链接器启动对象缺失等具体痛点。 - 自动化与容器化:提供
fetch_tools脚本一键获取依赖,并提供 Docker 支持,降低了现代开发者搭建复古开发环境的门槛。 - 严格的合规性:明确区分了开源组件(emu2, nasm)与专有/历史遗留组件(Aztec, DR, MS-DOS tools)的许可证,要求用户自行确认使用权限。
意义与影响
- 降低复古计算门槛:对于希望研究或维护早期 x86 软件(如 CP/M-86 时代的应用)的开发者而言,该项目提供了一个开箱即用的解决方案,无需在复杂的虚拟机或老旧硬件上折腾。
- 软件工程的历史价值:通过保留和修补这些历史工具链,该项目不仅是一个开发环境,更是一个软件考古平台。它展示了早期编译器(如 Aztec C 的一次性链接特性)和操作系统(CP/M-86)的技术细节,为理解现代编译器和操作系统的发展提供了实证参考。
查看原文 →github.com
