CP/M-86 & MS-DOS 交叉开发环境

Hacker News Top 工具

摘要

本项目为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_asm86asm86.cmdDR 汇编器(CP/M-80 工具)
cpm_gencmdgencmd.cmdDR H86 转换器(CP/M-80 工具)
pcdev_rasm86rasm86.exeDR 汇编器(OBJ 格式)
pcdev_linkcmdlinkcmd.exeDR CP/M-86 链接器
pcdev_link86linkcmd.exe“” “” “” “” “”
pcdev_linkexelinkexe.exeDR DOS 链接器
pcdev_lib86lib86.exeDR 库管理器
pcdev_masmmasm.exeMicrosoft 汇编器
pcdev_linklink.exeMicrosoft 链接器
pcdev_exe2binexe2bin.exeMicrosoft EXE 转换器
pcdev_hex2binhex2bin.comMicrosoft HEX 转换器
pcdev_asmasm.comMicrosoft/86-DOS 汇编器
pcdev_cmdinfocmdinfo.comCMD 信息工具
pcdev_bin2cmdbin2cmd.comCMD 转换器
aztec34_asas.exeAztec 汇编器
aztec34_cccc.exeAztec K&R C 编译器
aztec34_sqzsqz.exeAztec C 目标优化器
aztec34_linkln.exeAztec C 链接器
aztec34_liblb.exeAztec C 库工具
aztec34_ordord.exeAztec C 库排序助手
aztec34_obdobd.exeAztec C 目标转储
aztec34_hex86hex86.exeAztec C H86 生成器
aztec42_asas.exeAztec 汇编器
aztec42_cccc.exeAztec ANSI C 编译器
aztec42_sqzsqz.exeAztec C 目标优化器
aztec42_linkln.exeAztec C 链接器
aztec42_liblb.exeAztec C 库工具
aztec42_ordord.exeAztec C 库排序助手
aztec42_obdobd.exeAztec C 目标转储
aztec42_hex86hex86.exeAztec C H86 生成器
drcbcpm_bccb86.exeDR CBASIC 编译器(CP/M-86 版)
drcbcpm_linklink86.exeDR CBASIC 链接器(CP/M-86 版)
drcbdos_bccb86.exeDR CBASIC 编译器(DOS 版)
drcbdos_linklinkexe.exeDR 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 库进行选择:

目标 / 模型启动对象
-lc86CP/M-86 小模式begin86.o
-lc / -lclcMS-DOS 小模式sbegin.o
-lcl / -lcldMS-DOS 大模式lbegin.o

这些启动对象由 fetch_toolssrc/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。

相似文章

Plexus P/20 模拟器

Hacker News Top

一款全新的开源 WebAssembly 模拟器,重现 1980 年代 Plexus P/20 Unix 服务器,让用户可在浏览器中运行 SystemV Unix。

z386:基于原始微码构建的开源80386

Hacker News Top

本文详述了z386,一款基于原始Intel微码构建的开源FPGA 80386 CPU。它能引导DOS 6/7、运行保护模式程序,并玩经典游戏如Doom,既是一种教育性重构,也是一个可用的FPGA CPU。