SB16 与 ES1370 声卡——DOS 经典音效和现代 PCI 声卡配置
SB16:DOS 时代的音效之王
Sound Blaster 16 是 Creative Labs 在 1992 年推出的 ISA 声卡,定义了整个 DOS/Win95 时代的 PC 音效标准。几乎所有 DOS 游戏(Doom、Quake、StarCraft 等)都支持 SB16 协议输出音效和音乐。
Bochs 模拟的 SB16 是 ISA 设备,bochsrc 配置:
sb16: enabled=1, midimode=dummy, wavemode=dummy, waveintfreq=44100
| 字段 | 说明 |
|---|---|
midimode | MIDI 输入/输出模式:dummy(静音)、dumper(转储到文件) |
wavemode | Wave 音频模式:dummy(静音)、wav(录到 .wav 文件) |
waveintfreq | Wave 播放的中断频率(Hz) |
SB16 的默认 I/O 端口是 0x220-0x233,IRQ 5,DMA 1——DOS 游戏在自动检测时会用这些默认值。
ES1370:PCI 时代的声卡
Ensoniq ES1370 是 Creative 后来推出的 PCI 声卡,支持 Windows 95 起的多平台。bochsrc 配置:
es1370: enabled=1
pci: ... slot3=es1370
PCI 设备,需要在 PCI slot 里声明。ES1370 被 Windows 98/2000/XP 自带驱动支持。
OS 开发不开声卡
原因:
- 声卡驱动是另一个独立的复杂子系统——DMA 传输、采样率转换、缓冲区管理、IRQ 协调
- Bochs 的声卡模拟对 OS 内核开发来说没有帮助——你不会在内核里写音效驱动
- 如果调试 DMA 控制器(8237),ISA SB16 是一个很好的 DMA 激活源——但这个用途太窄
除非你在写一个带音效的 OS(比如自己写一个游戏内核),否则别开。
经典系统场景:跑 DOS 游戏的音效
如果你想在 Bochs 里体验 Doom 或 StarCraft 的原始音效:
# bochsrc 里
sb16: enabled=1, midimode=dummy, wavemode=wav, waveintfreq=44100
wavemode=wav 会把所有 Wave 音频输出录成 .wav 文件在 Bochs 启动目录。但注意:Bochs 不把声音直接输出到宿主机扬声器——它的设计哲学是模拟,不是声音桥接。你需要:
- 要么录成 wav 自己后期播放
- 要么用
wavemode=dsp(需要编译时开 SDL 并正确配置) - 要么改用 DOSBox(它专门处理了音效输出,比 Bochs 方便得多)
SB16 在 Bochs 里的价值是协议级兼容——游戏认为自己在和一张真正的 SB16 对话,会正确触发所有 DMA 和 IRQ 行为。声音能不能出来是另回事。
调试器里观察声卡行为
如果你的内核在调试 DMA 或 IRQ 处理,SB16 可以作为"测试触发器":
# 在 bochsdbg 里对 IRQ 5 下断点(SB16 默认中断)
bochs:1> set_interrupt_mask ...
bochs:2> b 0x220 # SB16 端口
每次 SB16 触发 IRQ 5 或访问 0x220 端口时,调试器会停住——你可以观察中断控制器(PIC/APIC)的行为和内核的中断处理路径。
总结
| 场景 | 声卡建议 |
|---|---|
| OS 内核开发 | 不开 |
| 经典 DOS 游戏(音效研究) | SB16,wavemode=dummy 或 wav |
| 经典 DOS 游戏(只想玩) | 用 DOSBox,BoX 不是做这个的 |
| Windows 95/XP 体验 | ES1370(可选,声音不一定能出来) |