Chris.Dev.Blog电子学、编程与开发页面提供英文、德文、法文、荷兰文、意大利文、西班牙文、葡萄牙文、俄文、简体中文等语言选项。还有主页、关于我、GitHub、Youtube、隐私政策等链接。在百灵达 DDX3216 上从零开始使用自制 x86 BIOS 运行 DOS2026 年 6 月 8 日发布作者 Chris。1994 年作者拥有第一台电脑是配备 4MB 内存和 512MB 硬盘的英特尔 i486 DX2 - 66安装了 IBM 的 OS/2 和微软的 Windows 3.11。之后四年不断升级电脑学会了升级电脑、安装新软件和使用 BASIC 编写新软件但未接触过启动过程或 MS - DOS 细节。32 年后的 2026 年作者从 DDX3216 的截图中得知其使用真正的 386 处理器便思考能否在该设备上启动软件甚至运行完整操作系统目标是了解 x86 系统启动方式、DOS 接管系统的方式以及进入命令行界面的条件。目录1. 百灵达 DDX3216 的技术细节2. 为裸机 x86 开发自有软件的第一步3. 让 LCD 正常工作——并与段地址作斗争4. 为 SC300 实现功能齐全的 x86 BIOS5. 中断函数以及尝试启动 MS - DOS 6.226. 成功启动 FreeDOS v1.47. 更多内部硬件及下一步计划。1. 百灵达 DDX3216 的技术细节DDX3216 使用的硬件组件包括主处理器为 AMD Elan SC300 386 SoC27C512 64k x 8 位 ROM 芯片用于 BIOS8 片 HYB5117400BJ60 4M x 4 位 RAM共 16MB DRAM1 片 UM61256 SRAM 用作视频内存4 片 29C040 - 120 闪存芯片存储主软件SC300 内部 LCD 接口上的 4 位 LCD配备 3 片东芝 T6A39 列控制器和 1 片 T6A40 行控制器东芝 TLC16C552 外部 UART有 2 个串口和 1 个并口用于连接外部 CF 卡的 PCMCIA 接口未组装的英特尔 82078 FDC 软盘控制器连接到备用 34 针接口。AMD Elan SC300 周边硬件不错应与普通 x86 系统兼容。2. 为裸机 x86 开发自有软件的第一步作者搜索 AMD ELAN SC 的 BIOS在瑞士找到 PC Engines 公司其为 AMD ELAN SC400 和 520 及其他一些 SoC 设备开发了 BIOS 程序。作者联系该公司主要开发者起初得到有 SC300 源代码的答复但几天后开发者承认只有 SC400 及以上型号的源代码。作者又联系提供支持 SC300 的“嵌入式 BIOS”的“通用软件”公司该公司 1989 年成立2008 年被 Phoenix 收购。作者联系 Phoenix 在德国的负责人几周后被告知获取 SC300 兼容 BIOS 包已不可能。于是作者决定自己动手阅读 x86 系统文档记录为 SC300 编写自有 BIOS 的要点。最现代的 x86 兼容 CPU 采用 8086 兼容启动过程复位后 CPU 跳转到内存空间末尾 0xFFF0 处找到可执行的 x86 代码即复位向量再跳转到 BIOS 的 ROM 中接下来要执行的代码。作者实现有效 x86 复位向量的代码禁用硬件中断后跳转到 start 函数进入“实模式”。复位向量代码由链接脚本放置到最终 ROM 的 0xFFF0 位置。DDX3216 使用 64k x 8 位 ROM 芯片代码和数据存储在 0x0000 到 0xFFFF 之间。作者还给出了链接脚本和编译后的二进制文件。在 x86 系统中段是特殊概念为寻址更多地址使用 64k 段段地址指针有 16 字节重叠可得到 0x00000 到 0xFFFF0 的 1MB 地址空间。DOS 及其游戏在常规内存方面存在问题只有前 640kB 可作常规内存更高地址被保留用于视频内存、扩展 ROM 和 BIOS 本身形成实模式下的内存映射。由于 IVT、BDA 和引导扇区占用内存实际可用 605kB 空闲 RAM 运行代码0x0500 到 0x7C00 有空间用于内核0xC8000 到 0xF0000 的高端内存若没有可选 ROM 有 160kB 可用。作者起初不确定如何测试编译后的代码常见方法是用 EEPROM 编程器烧录 BIOS 镜像但影响开发周期速度。作者发现 PicoROM 项目和 OneROM 项目使用树莓派 Pico 控制器模拟 ROM 芯片从美国和英国订购设备后测试代码。先上传 DDX3216 原始 ROM 确认音频混音控制台能正常启动接着想让外部 UART 正常工作。DDX3216 有 RS232 9 针接口百灵达使用外部东芝 TLC16C552 芯片外部 UART 连接地址线和数据线TLC16C552 由两个串口和一个并口组成通过片选信号启用功能片选信号连接逻辑芯片并与其他地址线相连。使用不同 IO 地址激活不同片选信号使用 9 针 UART 接口前要确保逻辑芯片“IC110”被启用传递 TxD 信号。作者给出启用外部 UART 的代码对 ELAN SC300 的约 20 个配置寄存器编程使 SoC 达到 33MHz 并正常运行。作者向串口收发器发送字符进行调试最终成功上传 ROM 镜像并在连接计算机上以 9600 波特率接收到字符。3. 让 LCD 正常工作——并与段地址作斗争作者成功初始化栈并跳转到主 C 函数后初始化显示器较容易因为它直接连接到 AMD Elan SC300 的 4 位 LCD 接口该接口实现 CGA/HGA 兼容视频卡。SC300 在文本模式下使用内存段 0xB800 存储字符每个显示字符需两个字节第一个是显示字符第二个是属性字节包含对比度和颜色。但不能直接写入段 0xB800因为 BIOS 在段 0xF000 中工作。x86 系统在实模式下用 CS 和 DS 寄存器访问代码和变量目前都设置为 0xF000还可使用 ES 寄存器设置目标段并复制数据作者给出写入和读取变量的内联函数。SC300 支持为 LCD 使用一个或多个字体但无存储字体的 ROM作者逐字节实现完整 ASCII 表字体头文件约 22kB使用谷歌 Gemini 生成字体手动修复部分字符像素错误。4. 为 SC300 实现功能齐全的 x86 BIOS作者花时间初始化 SC300 的更多组件如中断向量表IVT、BIOS 数据区BDA、内部键盘控制器、定时器和 CF 卡接口。IVT 和 BDA 在内存底部x86 CPU 读取 IVT 获取中断服务函数指针BDA 类似配置空间DOS 用 16 位值与 BIOS 交互。内部定时器芯片是 8254 类型由 1.1892 MHz 时钟驱动为实现 18.207 Hz 时钟中断将定时器计数器配置为 0xFF23。SC300 键盘控制器是标准 XT 控制器需制作适配器将 AT/PS2 键盘数据转换为 XT 格式。CF 卡接口是挑战SC300 有两个原生 PCMCIA 卡接口只有端口 A 连接外部卡插槽作者买了 PCMCIA - CF 卡适配器。CF 卡是带有 ATA 命令接口的 IDE 驱动器PCMCIA 直接连接 CF 卡。但作者的 CF 卡容量超 500MB实模式下只能寻址最多 1MB。SC300 有内存映射单元 MMSA 和 MMSBMMSA 能将 8 个 64kB 页面映射到 0xD0000 到 0xEFFFF 之间MMSB 能将 4 个 64kB 页面映射到 0xA0000 到 0xAFFFF 之间DRAM、PCMCIA 卡、ROM - BIOS 或 ROM - DOS 可映射到这些区域。CF 卡可在不使用 MMS 的情况下读写ATA 命令支持 LBA 或 CHS 访问可访问约 8GB。但作者的 CF 卡未以 TrueIDE 模式启动需初始化 CF 卡使用 MMS 访问 CIS 并切换到 TrueIDE 模式作者给出相关代码。之后可使用常规 ATA 命令访问 IO 地址 0x1F0 到 0x1F7 或 0x3F6 和 0x3F7作者给出读取扇区到 RAM 的示例函数。那么后续能否更顺利地在百灵达 DDX3216 上运行 DOS 系统呢
2026 年,如何在百灵达 DDX3216 上用自制 x86 BIOS 运行 DOS?
Chris.Dev.Blog电子学、编程与开发页面提供英文、德文、法文、荷兰文、意大利文、西班牙文、葡萄牙文、俄文、简体中文等语言选项。还有主页、关于我、GitHub、Youtube、隐私政策等链接。在百灵达 DDX3216 上从零开始使用自制 x86 BIOS 运行 DOS2026 年 6 月 8 日发布作者 Chris。1994 年作者拥有第一台电脑是配备 4MB 内存和 512MB 硬盘的英特尔 i486 DX2 - 66安装了 IBM 的 OS/2 和微软的 Windows 3.11。之后四年不断升级电脑学会了升级电脑、安装新软件和使用 BASIC 编写新软件但未接触过启动过程或 MS - DOS 细节。32 年后的 2026 年作者从 DDX3216 的截图中得知其使用真正的 386 处理器便思考能否在该设备上启动软件甚至运行完整操作系统目标是了解 x86 系统启动方式、DOS 接管系统的方式以及进入命令行界面的条件。目录1. 百灵达 DDX3216 的技术细节2. 为裸机 x86 开发自有软件的第一步3. 让 LCD 正常工作——并与段地址作斗争4. 为 SC300 实现功能齐全的 x86 BIOS5. 中断函数以及尝试启动 MS - DOS 6.226. 成功启动 FreeDOS v1.47. 更多内部硬件及下一步计划。1. 百灵达 DDX3216 的技术细节DDX3216 使用的硬件组件包括主处理器为 AMD Elan SC300 386 SoC27C512 64k x 8 位 ROM 芯片用于 BIOS8 片 HYB5117400BJ60 4M x 4 位 RAM共 16MB DRAM1 片 UM61256 SRAM 用作视频内存4 片 29C040 - 120 闪存芯片存储主软件SC300 内部 LCD 接口上的 4 位 LCD配备 3 片东芝 T6A39 列控制器和 1 片 T6A40 行控制器东芝 TLC16C552 外部 UART有 2 个串口和 1 个并口用于连接外部 CF 卡的 PCMCIA 接口未组装的英特尔 82078 FDC 软盘控制器连接到备用 34 针接口。AMD Elan SC300 周边硬件不错应与普通 x86 系统兼容。2. 为裸机 x86 开发自有软件的第一步作者搜索 AMD ELAN SC 的 BIOS在瑞士找到 PC Engines 公司其为 AMD ELAN SC400 和 520 及其他一些 SoC 设备开发了 BIOS 程序。作者联系该公司主要开发者起初得到有 SC300 源代码的答复但几天后开发者承认只有 SC400 及以上型号的源代码。作者又联系提供支持 SC300 的“嵌入式 BIOS”的“通用软件”公司该公司 1989 年成立2008 年被 Phoenix 收购。作者联系 Phoenix 在德国的负责人几周后被告知获取 SC300 兼容 BIOS 包已不可能。于是作者决定自己动手阅读 x86 系统文档记录为 SC300 编写自有 BIOS 的要点。最现代的 x86 兼容 CPU 采用 8086 兼容启动过程复位后 CPU 跳转到内存空间末尾 0xFFF0 处找到可执行的 x86 代码即复位向量再跳转到 BIOS 的 ROM 中接下来要执行的代码。作者实现有效 x86 复位向量的代码禁用硬件中断后跳转到 start 函数进入“实模式”。复位向量代码由链接脚本放置到最终 ROM 的 0xFFF0 位置。DDX3216 使用 64k x 8 位 ROM 芯片代码和数据存储在 0x0000 到 0xFFFF 之间。作者还给出了链接脚本和编译后的二进制文件。在 x86 系统中段是特殊概念为寻址更多地址使用 64k 段段地址指针有 16 字节重叠可得到 0x00000 到 0xFFFF0 的 1MB 地址空间。DOS 及其游戏在常规内存方面存在问题只有前 640kB 可作常规内存更高地址被保留用于视频内存、扩展 ROM 和 BIOS 本身形成实模式下的内存映射。由于 IVT、BDA 和引导扇区占用内存实际可用 605kB 空闲 RAM 运行代码0x0500 到 0x7C00 有空间用于内核0xC8000 到 0xF0000 的高端内存若没有可选 ROM 有 160kB 可用。作者起初不确定如何测试编译后的代码常见方法是用 EEPROM 编程器烧录 BIOS 镜像但影响开发周期速度。作者发现 PicoROM 项目和 OneROM 项目使用树莓派 Pico 控制器模拟 ROM 芯片从美国和英国订购设备后测试代码。先上传 DDX3216 原始 ROM 确认音频混音控制台能正常启动接着想让外部 UART 正常工作。DDX3216 有 RS232 9 针接口百灵达使用外部东芝 TLC16C552 芯片外部 UART 连接地址线和数据线TLC16C552 由两个串口和一个并口组成通过片选信号启用功能片选信号连接逻辑芯片并与其他地址线相连。使用不同 IO 地址激活不同片选信号使用 9 针 UART 接口前要确保逻辑芯片“IC110”被启用传递 TxD 信号。作者给出启用外部 UART 的代码对 ELAN SC300 的约 20 个配置寄存器编程使 SoC 达到 33MHz 并正常运行。作者向串口收发器发送字符进行调试最终成功上传 ROM 镜像并在连接计算机上以 9600 波特率接收到字符。3. 让 LCD 正常工作——并与段地址作斗争作者成功初始化栈并跳转到主 C 函数后初始化显示器较容易因为它直接连接到 AMD Elan SC300 的 4 位 LCD 接口该接口实现 CGA/HGA 兼容视频卡。SC300 在文本模式下使用内存段 0xB800 存储字符每个显示字符需两个字节第一个是显示字符第二个是属性字节包含对比度和颜色。但不能直接写入段 0xB800因为 BIOS 在段 0xF000 中工作。x86 系统在实模式下用 CS 和 DS 寄存器访问代码和变量目前都设置为 0xF000还可使用 ES 寄存器设置目标段并复制数据作者给出写入和读取变量的内联函数。SC300 支持为 LCD 使用一个或多个字体但无存储字体的 ROM作者逐字节实现完整 ASCII 表字体头文件约 22kB使用谷歌 Gemini 生成字体手动修复部分字符像素错误。4. 为 SC300 实现功能齐全的 x86 BIOS作者花时间初始化 SC300 的更多组件如中断向量表IVT、BIOS 数据区BDA、内部键盘控制器、定时器和 CF 卡接口。IVT 和 BDA 在内存底部x86 CPU 读取 IVT 获取中断服务函数指针BDA 类似配置空间DOS 用 16 位值与 BIOS 交互。内部定时器芯片是 8254 类型由 1.1892 MHz 时钟驱动为实现 18.207 Hz 时钟中断将定时器计数器配置为 0xFF23。SC300 键盘控制器是标准 XT 控制器需制作适配器将 AT/PS2 键盘数据转换为 XT 格式。CF 卡接口是挑战SC300 有两个原生 PCMCIA 卡接口只有端口 A 连接外部卡插槽作者买了 PCMCIA - CF 卡适配器。CF 卡是带有 ATA 命令接口的 IDE 驱动器PCMCIA 直接连接 CF 卡。但作者的 CF 卡容量超 500MB实模式下只能寻址最多 1MB。SC300 有内存映射单元 MMSA 和 MMSBMMSA 能将 8 个 64kB 页面映射到 0xD0000 到 0xEFFFF 之间MMSB 能将 4 个 64kB 页面映射到 0xA0000 到 0xAFFFF 之间DRAM、PCMCIA 卡、ROM - BIOS 或 ROM - DOS 可映射到这些区域。CF 卡可在不使用 MMS 的情况下读写ATA 命令支持 LBA 或 CHS 访问可访问约 8GB。但作者的 CF 卡未以 TrueIDE 模式启动需初始化 CF 卡使用 MMS 访问 CIS 并切换到 TrueIDE 模式作者给出相关代码。之后可使用常规 ATA 命令访问 IO 地址 0x1F0 到 0x1F7 或 0x3F6 和 0x3F7作者给出读取扇区到 RAM 的示例函数。那么后续能否更顺利地在百灵达 DDX3216 上运行 DOS 系统呢