重新开始为 CP/M 进行 C 编程

主要观点:作者 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 代码,部分可在现代平台进行单元测试。
阅读 54
0 条评论