CP/M-86 & MS-DOS 交叉开发环境
摘要
本项目为CP/M-86和MS-DOS提供了一个交叉开发环境,包括用于复古计算的编译器、汇编器和模拟器。
查看缓存全文
缓存时间: 2026/06/04 03:44
tsupplis/cpm86-crossdev
来源:https://github.com/tsupplis/cpm86-crossdev
CP/M-86 与 MS-DOS 交叉开发环境
本项目汇总了一种为 CP/M-86 创建交叉开发环境的简单方法。巧合的是,所有基于 DOS 的工具也可用于构建 DOS 程序。本项目是为满足个人极客趣味和娱乐而开发的,仅作分享,不提供任何担保。
支持的语言包括:
- C(K&R 及接近 ANSI 标准)
- 汇编
- BASIC
到哪里找 CP/M-86?
CP/M-86 文档、源码和二进制文件的来源是 http://www.cpm.z80.de。一个经过清理的分发版和内核可在 https://github.com/tsupplis/cpm86-kernel 获取。该分发版在虚拟环境中运行良好,已打上所有已知补丁、兼容 Y2K(它包含了本项目中 tod 命令的源代码),并且支持 AT 架构。
CP/M-86 开发的关键工具
- Aztec C 编译器 3.4/3.40a 版本(K&R,CP/M-86 库以 c86.lib 形式提供),已打补丁
- Aztec C 编译器 4.2/4.10d 版本(接近 ANSI,CP/M-86 库(c86.lib)的代码已从 3.4 版本源码打补丁并重新编译,因为该库不是默认编译器包的一部分。同样方式提供了 DOS 1.1 库(d11.lib)),文档可查阅(https://www.aztecmuseum.ca/docs/Aztec_C_MSDOS_4.10C_Commercial_Apr88.pdf)
- Digital Research 的 DOS 版 rasm86/link86、lib86
- Digital Research 的 asm86.com 和 gendef.com
- Digital Research 的 cb86.exe 及其库
- NASM 通用汇编器
- Microsoft 的 masm、link、asm、exe2bin、hex2bin(本仓库中的 masm 版本已针对 emu2 及其他模拟器打补丁,详情见 https://github.com/tsupplis/pcdos11-hacking)。asm.com 和 hex2bin.com 已根据修改过的源码重新构建,源码位于 https://github.com/tsupplis/pcdos11-hacking。
- 超酷的 DOS 模拟器 emu2,用于在 macOS 和 Linux 上运行 DR 工具(https://github.com/dmsc/emu2)。这是一种将 DOS 命令行开发工具带入现代 shell/make/任何开发环境的绝佳方式。另一个令人惊叹的模拟器。emu2 和 PCE 是极佳的组合。
- 我们还需要运行一些 CP/M-80 程序,为此使用 tinylpo 模拟器(https://gitlab.com/gbrein/tnylpo)。它与 asm86.com 和 gencmd.com 程序配合得很好。
许可注意事项
- Microsoft MS-DOS 工具采用 MITS 许可证(https://github.com/microsoft/MS-DOS/blob/master/LICENSE.md)
以下工具不包含在内,由 fetch 工具下载,但要求您理解使用条件: - Aztec C 的使用条件在(https://www.aztecmuseum.ca/intro.htm#intro)中说明
- DR 工具的使用条件在(http://www.cpm.z80.de/license.html)和(http://www.cpm.z80.de/faq.html)中说明
- DR CBASIC 编译器 2.0(CP/M-86 版)和 2.1(DOS 版)的使用条件在(http://www.cpm.z80.de/license.html)和(http://www.cpm.z80.de/faq.html)中说明
- emu2 和 tnylpo 是开源软件,其许可证分别见(https://github.com/dmsc/emu2/blob/master/LICENSE)和(https://gitlab.com/gbrein/tnylpo/-/blob/master/LICENSE)
- NASM 许可证条款见(https://www.nasm.us)
- 我不对上述任何组件提供担保。如果您接受上述使用条件,当然可以自行承担风险使用它们。
脚本映射
所有工具都封装在 bin 目录中,可直接使用:
| 脚本名 | 程序 | 简要说明 |
|---|---|---|
| cpm_asm86 | asm86.cmd | DR 汇编器(CP/M-80 工具) |
| cpm_gencmd | gencmd.cmd | DR H86 转换器(CP/M-80 工具) |
| pcdev_rasm86 | rasm86.exe | DR 汇编器(OBJ 格式) |
| pcdev_linkcmd | linkcmd.exe | DR CP/M-86 链接器 |
| pcdev_link86 | linkcmd.exe | “” “” “” “” “” |
| pcdev_linkexe | linkexe.exe | DR DOS 链接器 |
| pcdev_lib86 | lib86.exe | DR 库管理器 |
| pcdev_masm | masm.exe | Microsoft 汇编器 |
| pcdev_link | link.exe | Microsoft 链接器 |
| pcdev_exe2bin | exe2bin.exe | Microsoft EXE 转换器 |
| pcdev_hex2bin | hex2bin.com | Microsoft HEX 转换器 |
| pcdev_asm | asm.com | Microsoft/86-DOS 汇编器 |
| pcdev_cmdinfo | cmdinfo.com | CMD 信息工具 |
| pcdev_bin2cmd | bin2cmd.com | CMD 转换器 |
| aztec34_as | as.exe | Aztec 汇编器 |
| aztec34_cc | cc.exe | Aztec K&R C 编译器 |
| aztec34_sqz | sqz.exe | Aztec C 目标优化器 |
| aztec34_link | ln.exe | Aztec C 链接器 |
| aztec34_lib | lb.exe | Aztec C 库工具 |
| aztec34_ord | ord.exe | Aztec C 库排序助手 |
| aztec34_obd | obd.exe | Aztec C 目标转储 |
| aztec34_hex86 | hex86.exe | Aztec C H86 生成器 |
| aztec42_as | as.exe | Aztec 汇编器 |
| aztec42_cc | cc.exe | Aztec ANSI C 编译器 |
| aztec42_sqz | sqz.exe | Aztec C 目标优化器 |
| aztec42_link | ln.exe | Aztec C 链接器 |
| aztec42_lib | lb.exe | Aztec C 库工具 |
| aztec42_ord | ord.exe | Aztec C 库排序助手 |
| aztec42_obd | obd.exe | Aztec C 目标转储 |
| aztec42_hex86 | hex86.exe | Aztec C H86 生成器 |
| drcbcpm_bc | cb86.exe | DR CBASIC 编译器(CP/M-86 版) |
| drcbcpm_link | link86.exe | DR CBASIC 链接器(CP/M-86 版) |
| drcbdos_bc | cb86.exe | DR CBASIC 编译器(DOS 版) |
| drcbdos_link | linkexe.exe | DR CBASIC 链接器(DOS 版) |
| cpm86 | - | CP/M-86 模拟器 |
| hexcom | - | HEX 转二进制 |
| doscat | - | 截断 ^Z 之后的内容 |
| nasm | - | 通用汇编器 |
获取工具
可通过以下步骤组装开发环境:
./fetch_tools
export PATH=`pwd`/bin
它会下载以下内容:
- aztec 3.4 C 编译器(https://www.aztecmuseum.ca/az8634b.zip)
- link86、lib86 和 rasm86(http://www.cpm.z80.de/download/tools86.zip)
- asm86 和 gencmd(http://www.cpm.z80.de/download/mpm862sr.zip)
- cb86 2.0/2.1 及其库(http://www.cpm.z80.de/download/cbasic86.zip)和(http://www.cpm.z80.de/download/cb86toys.zi)
- masm、link、asm、exe2bin、hex2bin(来自 https://github.com/microsoft/MS-DOS 的本地副本)
- cmdtools(https://github.com/tsupplis/cpm86-cmdtools)
- nasm(https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.gz)
- emu2(https://github.com/dmsc/emu2)
- tnylpo(https://gitlab.com/gbrein/tnylpo.git)
清除目录可通过以下命令实现:
./clear_tools
下载归档 / 离线重建
fetch_tools 下载的每个文件(Aztec、DR、CB86 和 NASM 归档,但不包括 git 检出)都缓存在 archive/ 目录下,而不会被删除。这使得构建环境具有可重现性,即使上游源消失:
- 如果下载失败,
fetch_tools会回退到archive/中的缓存副本。 - 设置
ARCHIVE_FIRST=1可以完全从archive/重建,无需连接网络(例如离线,或锁定精确版本):ARCHIVE_FIRST=1 ./fetch_tools clear_tools不会移除archive/目录,因此清除后的树始终可以从本地缓存重建。
测试
cpm86 工具是一个随 Aztec C 一起提供的 DOS 版 CP/M-86 模拟器。我们对其进行了逆向工程并打了补丁,以修复一些错误并添加一些新功能。不应完全依赖它,因为肯定还存在一些错误,但可以用于试验,并且对许多程序有效。对于构建工具,DOS/CP/M-80 模拟和 DOS/CP/M-80 交叉编译是更好的选择,而适当的 CP/M-86 模拟是测试的最佳选择;PCE 是一个非常好的选择(http://www.hampa.ch/pce/)。
注意:增强版的 cpm86 模拟器支持用 EOF 填充记录而不是 NULL,这可能使处理文本文件更容易,但由于这种行为与真实的 CP/M-86 不匹配,默认是禁用的,只有在设置 CPM86_EOF=1 时才会启用,例如:
env CPM86_EOF=1 cpm86 program.cmd
下一步可能是:
- 自动化 pce、cpmtools
- 可引导的最新 CP/M-86 软盘 ……
Docker 镜像
本项目提供了一个 Dockerfile。要从 docker 目录构建镜像,只需运行 make,或者:
docker build --rm=true -t cpm86:latest -f Dockerfile .
要使用创建的镜像,只需确保本地编译路径正确挂载:
docker run -it --rm -h cpm86 -v `pwd`:/work -w /work cpm86 pcdev_rasm86 helloa.a86
docker run -it --rm -h cpm86 -v `pwd`:/work -w /work cpm86 aztec34_cc helloc.c
命令行的唯一区别在于 \;:
pcdev_masm hellod \;
…… 变成 ……
docker run -it --rm -h cpm86 -v `pwd`:/work -w /work cpm86 pcdev_masm hellod '\\;'
使用工具
最后,提供了一个简单的 Makefile,包含 C、rasm86 汇编、asm86 汇编的示例:
./build_demo
基本程序
drcbcpm_bc hellor.bas
drcbcpm_link hellor.cmd=hellor.o
pcdev_cmdinfo hellor.cmd
C 程序
aztec34_cc helloc.c
aztec34_sqz helloc.o
aztec34_link -o helloc.cmd helloc.o -lc86
pcdev_cmdinfo helloc.cmd
如果代码使用 ANSI 语法:
aztec42_cc helloc.c
aztec42_sqz helloc.o
aztec42_link -o helloc.cmd helloc.o -lc86
pcdev_cmdinfo helloc.cmd
C 运行时启动对象
aztec34_link/aztec42_link 会自动在前面添加匹配的 C 运行时启动对象,因此 $begin -> Croot_ -> main -> exit 的入口/退出代码始终存在。启动对象根据链接的 C 库进行选择:
| 库 | 目标 / 模型 | 启动对象 |
|---|---|---|
-lc86 | CP/M-86 小模式 | begin86.o |
-lc / -lclc | MS-DOS 小模式 | sbegin.o |
-lcl / -lcld | MS-DOS 大模式 | lbegin.o |
这些启动对象由 fetch_tools(src/fetch/buildstartups)从 C 库生成。如果没有这个步骤,Aztec 的单遍 ln 只在需要时才从库中拉取启动对象,因此一个不引用任何 libc 符号的程序——例如 int main(void){ return 0; }——会在链接时没有启动对象,并在退出时崩溃;而间接引用启动对象的程序(例如 exit())可能会链接失败(Undefined symbol: _exit_),除非使用 ord 对库排序或传递两次(-lc86 -lc86)。在命令行中前置启动对象可以解决所有这些情况,因此既不需要 ord 也不需要重复库。要恢复旧行为,设置 AZTEC_NOSTARTUP=1,或使用 AZTEC_STARTUP= 强制指定特定的启动对象。
使用 rasm86 的汇编程序
pcdev_rasm86 helloa.a86 '$' pz sz
pcdev_linkcmd helloa '[$sz]'
pcdev_cmdinfo helloa.cmd
使用 asm86 的汇编程序
cpm_asm86 hellob.a86
cpm_gencmd hellob.h86
pcdev_cmdinfo hellob.cmd
使用 masm 的汇编程序
pcdev_masm hellod \;
pcdev_link hellod \;
pcdev_exe2bin hellod.exe
pcdev_bin2cmd hellod.bin hellod.cmd
使用 nasm 的汇编程序
nasm hellon.asm -fbin -o hellon.bin
pcdev_bin2cmd hellon.bin hellon.cmd
你可以从(https://github.com/tsupplis/cpm86-cmdtools)构建原生的 Unix/DOS 版本的 bin2cmd/cmdinfo。
相似文章
适用于 Linux 的 Windows 9x 子系统
一个让经典 Windows 9x 环境在现代 Linux 子系统中运行的业余项目。
Plexus P/20 模拟器
一款全新的开源 WebAssembly 模拟器,重现 1980 年代 Plexus P/20 Unix 服务器,让用户可在浏览器中运行 SystemV Unix。
z386:基于原始微码构建的开源80386
本文详述了z386,一款基于原始Intel微码构建的开源FPGA 80386 CPU。它能引导DOS 6/7、运行保护模式程序,并玩经典游戏如Doom,既是一种教育性重构,也是一个可用的FPGA CPU。
微软开源“迄今为止发现的最早的DOS源代码”
微软发布了已知最早的DOS源代码,包括86-DOS 1.00内核和实用程序,以及开发者文档。
我建立了一个虚拟博物馆,包含了几乎所有你能想到的操作系统
一个可下载的虚拟机包,提供了预先配置的模拟器和启动器,涵盖计算史上几乎所有操作系统,从 Manchester Baby 到现代操作系统。