← 返回信息流
AI 资讯Hacker News·3 天前

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
  • Digital Research (DR) 工具集
    • rasm86/link86/lib86(DOS 版本)。
    • asm86.comgendef.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.comgencmd.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 规定。
  • 开源组件emu2tnylponasm 均为开源,遵循各自特定的许可证。
  • 免责声明:开发者不提供任何担保,用户需自行承担使用风险并遵守上述各组件的使用条款。

关键要点

  • 交叉开发核心:该项目本质是一个“复古计算”的交叉编译环境,利用现代模拟器(emu2)在 Linux/macOS 上运行古老的 DOS/CP/M 编译器和工具。
  • 工具链完整性:整合了从 K&R C 到近似 ANSI C 的 Aztec 编译器、Microsoft MASM、Digital Research 的汇编器以及 NASM,覆盖了 CP/M-86 开发的主要语言需求。
  • 可复现性设计:通过 archive/ 缓存机制和 ARCHIVE_FIRST 环境变量,确保即使上游资源失效,构建环境依然可复现,适合长期维护和历史软件还原。
  • 模拟器增强:不仅使用了现成的 emu2tinylpo,还逆向工程并修补了 cpm86 模拟器,解决了文本文件处理(EOF vs NULL)和链接器启动对象缺失等具体痛点。
  • 自动化与容器化:提供 fetch_tools 脚本一键获取依赖,并提供 Docker 支持,降低了现代开发者搭建复古开发环境的门槛。
  • 严格的合规性:明确区分了开源组件(emu2, nasm)与专有/历史遗留组件(Aztec, DR, MS-DOS tools)的许可证,要求用户自行确认使用权限。

意义与影响

  1. 降低复古计算门槛:对于希望研究或维护早期 x86 软件(如 CP/M-86 时代的应用)的开发者而言,该项目提供了一个开箱即用的解决方案,无需在复杂的虚拟机或老旧硬件上折腾。
  2. 软件工程的历史价值:通过保留和修补这些历史工具链,该项目不仅是一个开发环境,更是一个软件考古平台。它展示了早期编译器(如 Aztec C 的一次性链接特性)和操作系统(CP/M-86)的技术细节,为理解现代编译器和操作系统的发展提供了实证参考。
查看原文 →github.com