主要观点:作者 40 年后重新对 CP/M 感兴趣并购买相关机器,在 C 语言中为 CP/M 开发新工具,如 KCalc-CPM、cpmbox、cpmlife 等,探讨在 CP/M 下用 40 年前的 C 编译器开发与现代 C 开发的不同,包括 Aztec C 编译器的特点、函数原型、数据类型大小、标准库限制、命令行参数、重定向、设备 I/O、系统接口、调用约定、内存管理、分页和覆盖等方面,强调在不同环境下测试和开发的重要性。
关键信息:
- 作者用现代 Z80 交叉编译器实现 cpmlife,但觉得应使用 CP/M 工具。
- Aztec C 编译器小,输出 8080 汇编代码,链接生成可执行文件。
- 不支持完整函数原型,缺乏 const 修饰符,数据类型范围小等。
- 标准库功能有限,需自己实现基本函数。
- CP/M 大小写不区分,需自行处理命令行通配符。
- 无文件重定向设施,需自己实现。
- 通过打开设备伪文件进行设备 I/O 操作。
- 系统接口功能缺失,需直接调用 BDOS 和 BIOS 入口点。
- 调用约定使用栈传递参数,超过一定数量有问题。
- 内存管理可用 malloc 和 free 函数,需注意分配成功情况。
- 支持简单分页机制,通过覆盖实现。
- 开发应在 CP/M 模拟器或真实硬件上进行测试,现代工具可辅助检查。
重要细节: - Aztec C 编译器各部分约 20kB,C 库和数学库稍大。
- 函数声明方式与现代不同,变量声明位置有要求。
- CP/M 内存通常小于 64kB,CP/M 2.2 无分页或虚拟内存概念。
- 现代编译器在某些方面优化更自动,现代 CPU 速度快。
- 测试时在模拟器和真实硬件上结果可能不同,需注意效率。
- GCC 可编译 K&R 风格 C 代码,部分可在现代平台进行单元测试。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。