现在还怎么玩 DOS 时代的游戏?
在电子游戏文化中,DOS时代有者特别的意义,在90年代IBM PC/MS-DOS几乎结束了8位/16位PC各种不同品牌、架构“百家争鸣”的局面,将“PC游戏”整合为一个统一的市场,让DOS成为复古游戏,特别是那些PC优势的游戏类型:模拟类、即时战略、第一人称射击和部分角色扮演游戏的最佳平台。
近年来,DOS游戏经历了一场显著的复兴,而运行DOS游戏的门槛也大幅降低:DOSBox、PCem等模拟器已经高度成熟,甚至能在现代网页浏览器端流畅运行。但对于教育和展示用途来说,实体机仍然是构建具有易于维护并且代入感强的展览展示装置的必要组件。
令人欣慰的是,DOS游戏对硬件并不算挑剔。即便是2010年之后的现代主板,只要带有Legacy/CSM模式的UEFI BIOS,通常都能成功引导DOS系统。得益于显卡对VBE(VESA BIOS Extensions)标准的长期向下兼容,大多数现代显卡在DOS下显示高彩画面也并非难事。对于现代电脑而言,运行DOS游戏最大的技术断层在于音频输出。
DOS游戏声卡的现状
在DOS系统中并没有统一的音频API,但在80年代末,AdLib和SoundBlaster声卡的流行逐渐成为一套事实标准:1987年推出的AdLib引入了基于雅马哈OPL2芯片的FM音乐合成,之后1989年的SoundBlaster在继承OPL2的FM合成功能的基础上加入了数字音频播放能力,让之前只有音乐的PC游戏可以播放真人语音、或者脚步声、枪炮声等音效,构成了90年代初、中期DOS游戏黄金时代的事实标准——声霸卡(SoundBlaster)兼容。
声卡和游戏音乐的发展史(上)但在DOS下只有ISA接口的声卡能够直接以“兼容声霸卡”的方式,不做特殊配置而直接使用,而随后的PCI声卡在DOS下的兼容性就比较“参差不齐”,比较常见的问题是大部分DOS游戏和软件都只支持IRQ3、5、7的声卡,而这些IRQ默认情况下为ISA接口保留,而不会分配给PCI声卡。比如《移花接木,在Windows 3.x下驱动CMI8738》文中就提到需要修改BIOS设置将PCI声卡强制分配到较低的IRQ。
而对于更新的AC97和HD Audio声卡,仅有VIA 686A/B、VT8231等少数南桥芯片提供了适用于DOS的声霸卡兼容驱动。这种技术断层为部分老旧声卡提供了炒作空间。在DOS下兼容性较好的雅马哈YMF724 PCI声卡普遍被炒到百元以上,而带有MIDI波表库加载功能的ISA声卡如AWE32/64系列,其二手价格已明显脱离了实用价值。
对于使用全尺寸台式机的爱好者来说,目前仍有CMI8738这类DOS兼容性尚佳,同时价格便宜的PCI声卡,但对于瘦客户机、小主机、上网本等不具备PCI插槽的机型来说,如何在DOS下发声一直是一个颇为棘手的问题。
复古计算社群从未放弃让更多现代电脑运行DOS游戏的努力,2023年,开源项目SBEMU让许多较新的电脑第一次获得完整模拟SoundBlaster音乐输出的能力,并衍生出更专注于主板集成声卡、功能更丰富的 VSBHDA。这两个开源项目为部分PCI声卡、以及大部分AC97声卡和HD Audio架构提供了在DOS环境下的声卡模拟层,显著扩大了DOS游戏的适用硬件范围。
SBEMU下载:https://github.com/crazii/SBEMU/releases
VSBHDA下载:https://github.com/Baron-von-Riedesel/VSBHDA/releases/
搭建一个适合游戏的DOS环境
对于2000~2010年代的电脑硬件而言,最简单的使用DOS的方法是制作一块DOS启动U盘,使用Rufus可以很容易地制作FreeDOS启动U盘。

虽然Rufus也有制作MS-DOS启动U盘的选项,但它默认的是Windows Me的启动软盘环境,其内置的高内存管理模块(相当于内置的himem.sys)兼容性并不是特别好,往往需要自己使用Windows 98的三个DOS系统文件(msdos.sys/io.sys/command.com)进行替换。因此本文以FreeDOS为示例环境进行配置。
SBEMU 和 VSBHDA 的运行依赖于保护模式环境。但由于其设计需要加载HDPMI32和QPIEMU构建基于DOS保护模式接口(DPMI)的声霸卡模拟环境,因此它们与MS-DOS自带的himem.sys、emm386.exe并不兼容,一般建议使用JemmEx作为内存管理器。需要注意的一点是,JemmEx与Windows 9x不兼容,因此如果需要在一台电脑上同时运行SBEMU/VSBHDA和Windows 9x,则需要分别配置config.sys,或者在config.sys中构建菜单选项,由于本文假定使用单独的DOS启动U盘,因此不详述JemmEx和Windows 9x共存的问题。
JemmEx一般通过config.sys文件加载,对于内存较大,超过512M的电脑来说,可能会有一些兼容性的问题,可以通过jemmex.exe的MAXEXT参数限制最大内存容量,比如下面的config.sys示例就限制了最大内存容量为128MB。
Device=sbemu\jemmex.exe MAXEXT=131072
DOS=HIGH,UMBSBEMU配置实例
虽然目前SBEMU的开发者目前已减少了对SBEMU的更新频率,但其代码库已相当稳定,兼容的声卡范围也比较广,因此可以视作“标准方案”。
在运行SBEMU之前,首先要加载QPIEMU 和HDPMI32I两个内存管理模块,并设置BLASTER环境变量,我们可以把它们放在一个BAT文件里一同加载,我参照VSBHDA的习惯将其名命为start.bat,内容参考如下
JLOAD QPIEMU.DLL
LH HDPMI32I
SET BLASTER=A220 I5 D1 H5 T6 P330
SBEMU/VOL9这个文件一共只有四条命令,前两条是加载内存管理模块,之后设置环境变量,最后启动SBEMU,并将音量设置为最大值9(范围为0~9)。BLASTER环境变量除了提供给SBEMU一个初始值之外,一些游戏也会参考它来操作声卡,一般来讲A220 I5 D1 H5 T6 P330这个默认设置不用改,其含义如下:
| 变量名 - 含义 | 常用值 | 解释 |
|---|---|---|
| A - Address | 220 | 内存地址,默认220,遇到冲突可以选240、260或280 |
| I - IRQ | 5 | IRQ,一般为5或7 |
| D - DMA | 1 | 8 bit DMA通道,一般为1,遇到冲突可选0、3 |
| H - High DMA | 5 | 16位DMA通道,一般为5,遇到冲突可选7 |
| T - Type | 6 | 1~6对应SoundBlaster 1.0/1.5/2.0/Pro/Pro MCA/16 |
| P - Port | 330 | MIDI端口地址,默认330,遇到冲突可以选300 |
SBEMU的默认设置在大多数情况下都可以正常工作,但有两个参数需要注意,一个是/vol,这个参数可以设置SBEMU输出的音量;另一个参数是/o,这个参数设置HD Audio声卡输出的pin,它决定音频输出是从机身前置还是后置接口出声,由于不同主板的pin配置会有所不同,通常可以使用/o0或者/o1以及/o2这三种配置来测试那个值可以在你的主板上工作。
一旦SBEMU启动成功,就可以在DOS游戏的设置程序,通常是setup.exe 或install.exe 中将声卡设置为SoundBlaster、SoundBlaster Pro或SoundBlaster 16并测试实际运行的效果,一般来讲越高的设置音效越好,但也越有可能不兼容。在我的机器上,DOS版《红色警戒》可以设置使用SoundBlaster Pro在SBEMU下运行,却不能设置为SoundBlaster 16。

VSBHDA配置实例
VSBHDA起源于SBEMU的一个分支版本,最初的目标是改善对HX DOS Extender的兼容性。后来经过一系列改写,去除了SBEMU中一系列PCI声卡的支持,逐渐变成以集成声卡为主要目标的声霸卡模拟驱动。在2025年,VSBHDA迎来了一次巨大的改进,一个名为VSBHDASF的项目将TinySoundFont MIDI合成器集成进VSBHDA并合并进主线代码。通过加载SoundFont2音色库,VSBHDA提供了SoundBlaster+MIDI双重模拟环境,而在此之前在实体机上提供此类环境的成本很高:要么使用外置的MIDI音源盒,要么则需要使用Wave Blaster波表子卡或者AWE32/64这类自带MIDI合成功能的声卡。
VSBHDA的压缩包内置的start.bat内容如下
rem run vsbhda
jload -q qpiemu.dll
jload -q jhdpmi.dll
lh hdpmi32i -x2
rem set blaster=A220 I5 D1 T3
rem set blaster=A220 I5 D1 T4
set blaster=A220 I5 D1 H5 T6 P330
vsbhda.exe其中rem开头的行是注释(remarks)可以不用管它,其他部分其实和SBEMU差不多,唯一多出来一行是加载jhdpmi.dll,按照VSBHDA下载包中vsbhda.txt说明文件的说法,它可以增强HDPMI的兼容性。通常我们不需要修改vsbhda默认的start.bat文件,只需要保证jload.exe在vsbhda的同一目录下,或者在DOS的PATH环境变量指定的位置中,就可以正常加载了。
在VSBHDA下加载MIDI音色库
VSBHDA提供/sf参数加载音色库,例如vsbhda.exe /sf:general.sf2即加载general.sf2作为音色库。一个精简注释,并加载音色库的start.bat类似
jload -q qpiemu.dll
jload -q jhdpmi.dll
lh hdpmi32i -x2
set blaster=A220 I5 D1 H5 T6 P330
vsbhda.exe /sf:general.sf2对于DOS游戏,MT-32、Roland SC-55等经典硬件合成器的采样库在网上都不难找到,但很可能会有些乐器映射上的问题,一个明显的例子是《沙丘2》开场动画中的枪炮声,即使许多硬件MIDI音源也无法正常再现,飞船降落、火箭炮发射的音效往往会被重现为铃铛或其他打击乐,对于追求“不出错”的玩家来说,我最建议使用的音色库是GeneralUserGS:https://github.com/mrbumpy409/GeneralUser-GS

GeneralUser GS是免费音色库,其使用条款非常宽松,不仅可以用于回放MIDI音乐,也可以用于录音创作。同时GeneralUser GS对Roland GS标准的兼容性相当好,能够稳定再现当年为Roland SoundCanvas系列设计的游戏音轨,相比同类音色库,它的体积也较小,只有30MB,无论是加载时间还是DOS下的稳定性都表现良好。
通常情况下,默认安装的DOS游戏使用SoundBlaster的FM功能提供音乐,如果希望切换至MIDI音乐,需要使用游戏自带的setup.exe或install.exe进行设置,比如《沙丘2》中的setup.exe就可以选择使用SoundBlaster(FM)或是SoundCanvas(MIDI)

而在《DOOM》里,则直接提供了General Midi选项

与SBEMU类似,VSBHDA也使用/vol 参数控制音量,使用/o控制输出端口,如果没有声音,可以尝试调节这两个选项来尝试增大音量,或调整输出端口来排查故障。
故障排除
SBEMU和VSBHDA虽然兼容硬件范围较广,但也并非所有主板都能顺利支持,一些主板可能只支持SBEMU,而另一些可能只支持VSBHDA。比如我在另一篇文章中提到的样板机HP T610就在VSBHDA上有些兼容性问题。
当然,更多的时候是由配置不当造成的,在确定你的主板不支持SBEMU/VSBHDA之前,可以先排查下面几点。
DOS环境的问题
手工执行start.bat中的每条命令,确定JLOAD版本和JEMMEX兼容,如果JLOAD和JEMMEX不匹配,QPIEMU等模块就无法正常加载。
- 确定路径配置正确,
qpiemu.dll、jhdpmp.dll、hdpmi32i能够正常加载。 - SBEMU/VSBHDA参数的问题
- 确定
/vol音量设置为最大,通过/o参数设置输出针脚
卸载并重新设置VSBHDA
VSBHDA提供一个uninst.exe工具可以将其从内存中卸载,卸载之后需要重新运行hdpmi32i,之后可以重新加载VSBHDA,在我的HP T610上,SBEMU可以正常工作,但VSBHDA初始化有些问题,导致必须二次加载才能启用FM音效。