LUMENCD.SYS 是面向 DOS 实模式的 16 位 ATAPI CD-ROM 设备驱动。一个 SYS 同时覆盖 8088/8086、80286、80386、80486 及以上处理器,并在启动时选择安全的 CPU 专用传输路径。
驱动主体使用 C++ 编写;汇编只承担 DOS Strategy/Interrupt ABI、私有栈、入口级重入保护、CPU 检测、端口批量传输、PCI BIOS 和 VDS 调用。项目不使用堆、STL、异常、RTTI、虚函数、递归或全局构造器,采用 MIT 许可证。
当前发布状态:
- PIO、双光驱、多子单元注册、MSCDEX 请求协议、SHSUCDX、cooked/raw 读取、跨 64 KiB 传输、无介质与托盘控制已经在 DOSBox-X 完成四档 CPU 端到端验证。
- PCI Bus Master DMA 是 386+、仅由 /DMA 显式启用的真实硬件功能。算法、PRDT、VDS 清理和故障回退已做宿主测试,但尚未在真实控制器上验证;DOSBox-X 测试不会发送其不支持的 ATAPI DMA packet。
正式二进制请从 GitHub Releases 下载;仓库内 dist 目录同时保存 SYS、标准 360 KiB FAT12 软盘镜像与 SHA-256 清单。
把 LUMENCD.SYS 复制到 DOS 目录,在 CONFIG.SYS 中加入:
DEVICE=C:\DOS\LUMENCD.SYS /D:MSCD001
然后在 AUTOEXEC.BAT 中加载 CD-ROM 扩展管理器:
MSCDEX /D:MSCD001 /L:D
也可以使用:
SHSUCDX /D:MSCD001 /L:D
扩展管理器不包含在本项目中。
使用 360 KiB 软盘镜像时,可在模拟器中把 LUMENCD-360K.IMG 挂载为 A:,或写入一张 5.25 英寸 360K 软盘,然后执行:
COPY A:\LUMENCD.SYS C:\DOS\LUMENCD.SYS
镜像是数据盘,不包含 DOS 系统文件。
| CPU | 自动路径 | 行为 |
|---|---|---|
| 8088 / 8086 | 兼容基线 | 只执行 8086 指令,展开 IN AX / STOSW 循环 |
| 80286 | 286 优化 | REP INSW |
| 80386 | 386 优化 | 16 位端口读取与 32 位内存合并 |
| 80486+ | 486 优化 | 进一步展开循环,降低分支开销 |
所有通用 C++ 对象以 8086 指令集生成;后续 CPU 指令只存在于经过运行时检测保护的汇编分派路径。8088 主机仍需具备能以端口 I/O 访问的 IDE/ATAPI 控制器,CPU 兼容不代表早期 PC 原机自带 ATAPI。
- 默认只使用有限超时的 PIO,不在探测时复位 IDE 通道。
- 探测前后保存并恢复设备选择,识别同通道 ATA peer。
- 错误恢复最多对当前选中的 ATAPI 设备执行一次 DEVICE RESET;失败后该单元离线。
- 00h、FFh、永久 BSY、异常 DRQ、短传输和设备消失都返回明确错误。
- 请求长度、命令、子单元、地址模式、扇区范围和远指针范围均经过验证。
- 汇编入口在切换私有栈之前处理嵌套请求,避免覆盖正在执行的栈帧。
一个设备头最多公开 8 个 ATAPI 子单元,每个单元独立维护介质代次、音频、sense、DMA 状态和诊断计数。实现范围包括:
- 初始化、打开、关闭、输入刷新;
- 输入和输出 IOCTL;
- READ LONG cooked/raw、实际预取和寻道;
- 介质状态、容量、托盘弹出/装入和锁定;
- TOC、音轨、Q 子通道、原始 P-W 子通道、UPC/EAN;
- 音频播放、暂停、恢复、停止和声道控制;
- HSG/LBA、绝对 Red Book MSF 与 Q 子通道相对 MSF。
不支持的命令或设备可选能力返回 DOS/MSCDEX 错误,不伪造成功。
- cooked 请求最多按 31 × 2048 字节分块,raw 请求最多按 26 × 2352 字节分块。
- 8 KiB 全局 cooked 滑动窗口以单元号、LBA 和介质代次为标签;大块读取直接传输。
- 换盘、弹出、Unit Attention、复位和读取失败使相关缓存失效。
- /DMA 只接受标准 PCI IDE Bus Master I/O BAR,通过 PCI BIOS 访问配置空间,不访问 CF8h/CFCh。
- PRDT 最多 16 项、4 字节对齐,每项不跨 64 KiB 物理窗口;V86 环境通过 VDS 锁定。
- 首次 DMA 读取用 PIO 影子扇区校验。任意 DMA、VDS、设备或校验异常都会清理资源、PIO 重读并在本次启动期间隔离该单元的 DMA。
| 参数 | 作用 |
|---|---|
| /D:name | 1–8 字符设备名,默认 MSCD001 |
| /DMA | 显式启用实验性 PCI Bus Master DMA |
| /BM | /DMA 的兼容别名 |
| /PIO | 强制使用 PIO |
| /PIO0 … /PIO4 | 请求指定 ATA PIO 模式 |
| /P:port,irq | 添加或覆盖 IDE 通道 |
| /S:port,irq | /P 的兼容别名 |
| /N:1 … /N:8 | 限制公开单元数量 |
| /NOPCI | 禁止 PCI BIOS 探测 |
| /I | 显式允许 PCI BIOS 探测;默认已启用 |
| /V | 显示详细初始化状态 |
| /Q | 静默安装 |
| /C | 在合适的 80 列彩色文本模式中使用状态颜色 |
| /DIAG | 执行非破坏性 PIO 就绪与容量诊断 |
参数按完整 token 匹配。未知、格式错误或互相冲突的选项会终止安装并显示简短用法。
/V /C 显示纯 ASCII 的 LUMEN 标题、CPU 路径、单元数、设备名、传输状态和光驱列表。界面不清屏、不等待按键,不包含光盘图标、在线横条、底部设备图案、构建工具或协助信息。
构建步骤见 BUILD.md,兼容边界见 COMPATIBILITY.md,本次验证结果见 TEST-REPORT.md。
tests/read_iso.asm 会生成 READISO.COM,用于模拟器内回读测试 ISO。它不会链接进 LUMENCD.SYS,也不属于发布驱动。
MIT,详见 LICENSE。