DOS游戏怀旧全攻略 第四章 声音的女巫

2003-04-29 00:00 | wolfccb

DOS游戏怀旧全攻略 第四章 声音的女巫

DOS游戏最难搞的是什么?声卡!随着微软帝国的扩张,声音的女巫无情的剥夺了我们游戏的乐趣。没有了声音,游戏的色彩大打折扣,直接影响着我们怀旧的心情。本章将从声卡工作原理与游戏声卡编程入手,向大家介绍相关的知识和设置。与前几章一样,你可以跳过原理部分的内容,直接根据自己的情况选择合适的设置。OK,先来一声狼叫试试嗓子,嗷嗷嗷~~~

1、声卡的基本概念。熟悉声卡设置的朋友肯定对以下的名词有着深厚的感情:IRQ、I/O Address、DMA……我们不妨回顾一下这些概念。

IRQ(Interrupt Request中断请求)是由某个设备发出的请求CPU产生中断的一个请求响应信号。当某个设备发出中断请求时,CPU会暂停当前的工作,根据中断请求的优先级来决定首先响应哪一个设备的中断请求。中断请求IRQ0到1RQ15中,IRQ0的优先级别最高,IRQ15最低。原则上,计算机中每个设备自身只有惟一的一个中断请求通道,即IRQ值(又叫IRQ号)。当两个硬件设备同时使用同一个IRQ时,就会发生冲突,因为这时CPU已经无法判断收到的中断请求究竟来自于哪个设备了。一个好好的DOS游戏到了win32环境下,由于中断管理发生了很大的变化,声卡在dos7.0下就会出现兼容性不好的问题,GUI中的问题则更多了。

I/O Address(Input/Output Address输入输出地址),可以理解为CPU和外部设备之间的接口,在调用外部设备时,程序通过I/O地址告诉CPU数据将要被传送到什么地方。好比母老虎(程序)说:把啤酒(数据)送到老狼的宿舍4036(设备I/O地址),老熊(CPU)就扛着酒上楼,如果送错了,只怕会被人当成胡乱灌水的家伙拒之门外。声卡常用的I/O是220h,有一些老声卡甚至只能使用这个地址。多数的游戏会提供一个设置程序,允许玩家选择自己的IRQ和I/O Address。

DMA(Direct Memory Access直接内存访问),是一种完全由硬件执行I/O交换的工作方式。在这种方式中,DMA控制器从CPU中完全接管对总线的控制,数据交换不经过CPU,直接在内存和I/O设备之间进行。声卡与内存之间采用DMA方式传送数据,以便让CPU有更多的时间去处理其它事情。在输出声音信号时,用DMA方式将声音数据直接从主内存传向声卡的缓冲区,进行数/模转换后再送至音频放大器,最后到扬声器发声。DOS下的声卡默认的DMA通道是1,绝大多数游戏根本没有给我们选择的机会,我们只能使用这个设置。遗憾的是,多数AC'97集成声卡已经不再占用DMA通道了,所以这些声卡可能需要软件模拟等方式来兼容老游戏。老狼的机器太破,跑不了虚拟机软件,有兴趣的朋友不妨试试。

FM合成是运用特定的算法,用正弦波来模拟乐器的声音。其主要特点是电路简单、成本低,不需要存储器支持。由于FM是靠算法来合成某个声音,因此实现方法过于生硬、效果单一,所生成的声音与真实乐器产生的声音距离很大,电子味很浓。多数DOS游戏的音乐就是针对FM制作的,用FM听虽然音色不逼真,确是实实在在的原汁原味。相对而言,Wavetable波表合成把真实的乐器采样储存起来,音色很逼真,却并不适合用来玩老游戏,这一点很多朋友会有体会。比较好的PCI声卡会提供两种合成方式,比如老狼的Sonic Impact S70,在仙剑的设置中如果选择“声霸卡”,听到的就是220h端口送出的FM音乐;如果选择“声霸卡+MIDI”,就能听到330h端口送出的波表MIDI。330h本来是外部MPU-401的端口,在这里却被模拟成了内部MIDI,看来Diamond在兼容性方面确是下了不少苦功啊。

2、为了解释声卡不正常的问题,我们先看看游戏中声卡编程的原理。我们先来看一个函数:

void writefm(char reg,char data)
{
int ioport=0x220;
outportb(ioport,reg);
delay(1);
outportb(ioport+1,data);
delay(2);
}

聪明的你看了这些,一定会对I/O有一个更好的理解。通过对端口220h的操作,游戏就可以调用声卡了。但在DOS这个单任务环境下,声音和图像、文字却是同时出现的,这是怎么回事?让我们先来了解一些程序中断的相关知识。由外设控制器或协处理器引起的中断称为外中断,由程序中安排的中断指令INT产生的中断,或由CPU的某些错误产生的中断称为内中断。下面是一些中断的例子:INT 8h,每1/18.2秒定时器发出的中断;INT 1ch,指向每1/18.2秒时可执行的服务程序的入口;INT 71h,硬件中断9。

在IBM PC系统中,定时器中断INT 1ch是独立于CPU工作的,但因为它是指向INT 8h的入口,我们又叫它伪中断。这一中断在系统初始化后,中断程序仅仅有一条IRET指令,但它是每秒发生18.2次的硬件中断,如果改变这一中断服务程序,使其指向其他进程,这个进程就能以每秒18.2次的速度工作。这样,就可以通过不断比较时钟计数值和声音计数值来实现背景音乐的播放了。当然,具体的过程比这要复杂很多,感兴趣的朋友可以查阅相关资料。

3、我们可能遇到的问题。

①FM音乐时钟不准,音乐忽快忽慢,尤其是在按键盘时。在Windows下运行老游戏多有这样的问题。究其原因,是因为多数dos游戏只能通过调用伪中断INT 1ch来实现诸如背景音乐的功能。而在Windows下中断管理有了较大改动,所以会导致使用这个中断的程序不正常。解决这个问题的办法很简单,就是进入纯DOS环境。

②PCI声卡的兼容性问题。PCI声卡的DOS兼容性确实存在一些麻烦,这也许正是一些已经购买了PCI声卡的朋友常感到困惑的问题。尽管很多PCI声卡厂商都宣布其产品在玩DOS游戏时没有问题,可事实并非如此。究其原因是因为现在的一些PCI声卡在声音合成方式上同ISA声卡有很大不同,它在DOS下不兼容原来的IRQ、DMA等设置,因此导致DOS的很多游戏不认PCI声卡,当然也就没有声音了。这是PCI声卡的一个共同弱点,很多PCI声卡厂家都推出了各自的解决方法,比如Diamond就开发出一个名叫SB-Emu的小程序可以解决兼容性问题。为了检查你的PCI声卡是否已经具有DOS支持,可以在命令行模式下打入set,察看输出结果是否包含Blaster=A220 I5 D1 T4这样的一行,如果有,说明你的声卡已经安装了DOS支持;如果没有,你可能需要下载相关的驱动程序了。

另外,部分PCI声卡(似乎非常少)使用了SB-Link来增强兼容性。这是一条连接主板与声卡之间的5pin排线,不是每一款主板都设有这个接头。SB-Link的作用就是将ISA总线的DMA和IRQ从主板传送到PCI声卡上,让DOS游戏在ISA总线中找到声卡的DMA和IRQ,从而提高PCI声卡在DOS模式下工作的兼容性。创新和Diamond的部分声卡采用了这种连线,如果你试过本章所有方法仍然解决不了兼容性问题,不妨考虑找一根SB-Link试试。

③AC'97集成声卡的兼容性问题。这真是一个大难题,老狼现在还没听说过哪款AC'97软声卡能支持DOS,偏偏新出的主板还都一窝蜂的去赶软声卡的潮流。如果你的集成声卡是硬件的,比如8738和CTxxxx,那老狼可要恭喜你了,他们都提供了DOS支持,请把他们当成一般的PCI声卡好了。对于软声卡,老狼听说用虚拟机可以模拟成Sound Blaster Pro来用,只可惜我没有机会测试。

④怎样设置声卡?建议你看看声卡驱动程序中是否包含有For DOS的驱动,如果有,装之,并在Autoexec.bat中加入Set Blaster=A220 I5 D1 T4这种语句来设置声卡的I/O地址、IRQ和DMA(多数声卡会由驱动程序自动安装完成),这样PCI声卡就可以被DOS游戏识别了。下面说说set blaster的用法:A后面的数字表示I/O Address,I后面的数字是IRQ,D后面的数字是DMA通道,T的参数最容易被忽略,却是游戏是否能识别声卡的关键:它表示声卡的类型。因为Creative公司是声卡的老大,所以其他声卡必须以之为标准,将自己模拟成Creative公司的某种产品。T后面的数字1表示Sound Blaster 1.0,2表示Sound Blaster 1.5,3表示Sound Blaster 2.0,4表示低版本Sound Blaster Pro,5表示高版本的Sound Blaster Pro,6表示Sound Blaster 16及其兼容,如Sound Blaster AWE及Sound Blaster PCI等。按照老狼的经验,A220 I5 D1是兼容性最好的设置,T的类型就要参考你声卡的相关资料了,如果它说“兼容Sound Blaster Pro”,你就毫不犹豫的写上4吧。其实,4和6是最常见的也是兼容性最好的。

⑤声卡使用的不是A220 I5 D1的设置,游戏不认,但在autoexec.bat里改了set blaster却无效?这可能是你的声卡使用了特殊的设置方式,使Dos和Windows的设置挂了钩。进入Windows,选系统属性,设备管理,找到你的声卡最上层设备或SB Emu一类根DOS兼容有关的设备,选属性,重新配置资源,改成A220 I5 D1的设置。如果出现资源冲突,不要理它,按照自己的意愿改好,然后按照它的要求重启就行了。如果出现资源冲突,强烈建议你先禁用掉与之冲突的设备,先设置好声卡再说。如果你没有打印机等使用LPT的设备,可以在BIOS中把Parallel Port改成Disabled,可以节省一个IRQ。

⑥都设置好了仍然无声或死机?进入BIOS设置,在PCI/PNP Configuration中设置PNP OS Installed为Yes,Resouce Controlled By为Manual,然后在下面的列表中找到你声卡的IRQ,如果你用的是PCI声卡,选PCI/ISA PNP Device,如果是ISA声卡,选Legacy ISA;对DMA也如此设置。好了,多数游戏已经能正常发声了,除了——

⑦一些游戏有音乐,没有音效?一提到这个问题,老狼脑子里马上出现两个名字:仙剑!枫之舞!经过不懈的努力,老狼终于把这老哥俩折腾出声了!在完成了上面的声卡设置后,运行游戏的设置程序,可能是install.exe,按照你声卡的设置情况调整设置,完成后选“中止”即可。运行不了?请参见第五章捣乱的喽罗~。建议大家在游戏里存一个可以马上遇到简单敌人的档,比如仙灵岛的入口,因为这一步可能需要很多次尝试。请先检验一下:进入游戏,有音乐;开始游戏,战斗,没有音效?察看系统选单,音效是关还是开?如果是关,不用徒劳去打开它了,你前面的设置肯定有问题,再折腾折腾吧。如果是开,请重启,进入BIOS设置,在Advanced Chipset Settings里找到Memory Hole At 15~16M,选Enable!这个,老狼也很奇怪,和声卡有啥关系啊?疯狂查资料,等找到了再告诉大家吧。保存设置——音效有了吗?如果还没有,回到刚才的设置页,有两项8 bit IO Recovery Time和16 bit IO Recovery Time,两项都改成2,呵呵,这下总行了吧?不行就再改大点,不过超过3可能会死机哦,做好放电的准备吧~~~

⑧考虑装两块声卡——PCI/ISA或PCI/AC'97。这也是很好的选择,如果你按照上面的方法还是解决不了问题,只能考虑换声卡了。老一点的机器还有ISA插槽,太好了,随便买一块ISA声卡,找驱动,两块声卡可以共存。而且既然是为了玩DOS游戏,Windows的驱动完全可以不装了,省得冲突。将ISA声卡的Line Out用音频线接入PCI声卡的Line In,再把音箱接到PCI声卡的输出上,大功告成。老狼就在使用ALS200和Diamond S70的组合,任何一个都可以完全正常的玩DOS游戏,但ALS的FM音色更“古”些,所以在仙剑里我还是偏爱它的。

如果你的主板没有ISA槽,那就买一块兼容性好的PCI声卡吧,二手就行,一定要支持DOS。因为出现冲突的可能性比较大,所以老狼劝你还是屏蔽掉集成声卡。

至于两块PCI声卡共存,老狼除了死机啥结果也没得到,难道是因为我还不够执著?呵呵,算了,我放弃了。

4、我的测试结果。

我手头的声卡在大多数游戏都能正常发声,共测试了4块声卡:ESS688(ISA),Diamond S70(ESS1968芯片,又称Maestro2,PCI),S3 Sonic Vibes(PCI),ALS200(ISA)。

ESS688完全没有音乐,但音效正常,可能是卡的问题?

S70一切正常!究极感动,真不枉老狼当年400大洋请她回家~~~

S3 Sonic Vibes原装声卡,可能是驱动程序的原因,噪声非常大,老狼没有多试。不过老马说他的启亨小辣椒(同一芯片)完全正常,看来这块卡还是有价值的。而且这是自带DLS的声卡,太少见了,是老狼的收藏品。

ALS200完全正常,没啥说的,老东西了。

这几天如果有机会,我会在找一些卡来测试。以上关于BIOS设置的具体选项根据个人的主板不同可能略有区别,意思一样即可。

好了,我能写的也只有这么多了,希望能对大家有所帮助。现在,我以狼族的荣耀向敌人发出胜利的宣言:声音的女巫,消失吧!嗷嗷嗷~~~