bochs 中文文档 下载 App

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
字段说明
midimodeMIDI 输入/输出模式:dummy(静音)、dumper(转储到文件)
wavemodeWave 音频模式:dummy(静音)、wav(录到 .wav 文件)
waveintfreqWave 播放的中断频率(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 开发不开声卡

原因:

  1. 声卡驱动是另一个独立的复杂子系统——DMA 传输、采样率转换、缓冲区管理、IRQ 协调
  2. Bochs 的声卡模拟对 OS 内核开发来说没有帮助——你不会在内核里写音效驱动
  3. 如果调试 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 不把声音直接输出到宿主机扬声器——它的设计哲学是模拟,不是声音桥接。你需要:

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(可选,声音不一定能出来)