游戏吧+ 关注 关注:2 帖子:338

  

当年的精彩:DOS游戏怀旧全攻略

  • 枫之精英

    1、运行exe时出现Runtime error xxx at xxxx-xxxx,比如仙剑的install.exe。

      出现这种问题可能的原因比较多,如果确定游戏本身没有问题,或者曾经有过正常运行的历史,则基本可以判断是CPU和内存的问题了。Runtime error后面的错误编号可以帮助判断错误原因,最常见的是Runtime error 200,这是因为CPU速度太快引起的,具体问题分析和解决请参见第五章“捣乱的喽罗”。

      2、运行游戏时显示:
      Error: Free memory is not enough 570k,或Base memory not enough,这是常规内存不足,可能是加载了太多的常驻程序所至。

      3、运行游戏时显示:
      XMS not found! 这是因为没有加载扩展内存管理程序himem.sys所致。

      4、运行游戏时显示:
      XMS = -xxxxx,Error: XMS is not enough xxxk,这是因为xms太大,而很多老游戏采用了一个signed integer来存储xms的数量,导致32767以上的数值变成负数。

      5、运行游戏时显示:
      Error: No EMS found!!! 这是因为在内存配置时加载了关闭EMS的选项,可以通过修改config.sys来解决。

      6、运行游戏时显示:
      EMM386 has detected error #xx in an application at memory address xxxx:xxxx. To minimize the chance of data loss, EMM386 has halted your computer. For more information, see the readme.txt file. To restart your computer, press enter. 然后死机。这是EMM386的设置有问题,可以根据游戏的要求,对config.sys进行修改。

      以上问题,请参见第三章“内存的结界”。

      7、游戏的音乐和音效问题。音乐的设置相对简单,但多数人玩仙剑没有音效,采用AC“97集成声卡的更可怜,很多玩友连音乐都没有……这是因为新的操作系统对中断、DMA的管理方式做了改动,以前的DOS游戏出现了很多兼容性问题。另外大多数AC”97集成声卡都不支持DOS,或者根本不提供DOS驱动程序。目前只有CMI8738等少数硬声卡可以支持DOS,如果你的声卡是ALC650等软声卡的话,建议你买一块PCI声卡,老狼现在对这个问题没有什么办法。关于声卡的问题,请参见第四章“声音的女巫”。

      8、在纯DOS系统下,游戏花屏直至死机,这种问题虽然不常见,但却直接影响我们游戏的进行。这多半是因为你的显卡太新了,或者显存太大了。另外,还可能与显卡支持的VBE版本和BIOS中显卡的相关设置有关。具体问题分析和解决请参见第五章“捣乱的喽罗”。



    内存的问题是我们能否运行游戏的关键,没有声音还好办,好歹游戏还能玩;内存出错可就惨了,给面子的来个xxx Error,不给面子的干脆死机!为了能把问题讲的更清楚些,这里老狼先介绍一下混蛋微软的内存管理,有相关基础的兄弟和不想浪费时间的玩友不妨跳过这一段。以下内容老狼参考了不少资料,涉及到微机原理相关内容,如有不妥之处还请各位指正。

      1、结界的历史

      1979年,Intel推出了具有20根数据总线的8088芯片,寻址能力为1MB,并且受到了IBM的扶植。另一方面,Microsoft在为基于8088的电脑设计的操作系统DOS中,采用了“段内寻址”的方式,每个段的长度为64K字节,共有65535个段,但是因为段与段之间可以互相重叠,段的起始地址间距为16字节,所以DOS的寻址能力只有65535*16Byte,也就是1MB。然而,IBM认为1MB实在太大了,没有人会用到那么多的内存,于是又把384K内存(UMB,Upper Memory Block)分配给ROM BIOS和视频内存等等,于是,邪恶的640K结界形成了,出于兼容性的考虑,此后的DOS一直保留着原有的内存管理机制。这个640K的Base memory,又叫Conventional memory,是系统最基本内存,它是DOS和所有程序都可以用的内存区,被称为常规内存。它是系统内存中最宝贵、最紧张的资源,如果一个程序因为内存不够而无法运行,大多是因为这部分空间不够使用造成的。

      随着硬件的发展,80386DX已经是32位微处理器,实际寻址能力达4GB,反观旧的内存管理规范却处处碍手碍脚,于是扩页内存Expanded memory规范横空出世,取代了INT 15H,使程序能够访问32MB的内存空间。EMS通过一种页面映射分配技术的反复映射访问所有的EMS内存,这样的效率并不高,所以只有少数老游戏使用了EMS,比如《魔神战记2》。由于EMS并没有解决根本的问题,Microsoft又制定了扩展内存Extended memory管理规范XMS,通过在实模式与保护模式之间的快速切换,使程序在保护模式中能够直接使用系统所有内存,从而快速访问XMS。XMS简单而实际,被众多DOS游戏采用。我们打破了结界吗?还没有!很多游戏采用了一个signed integer来存储XMS的数量,导致32767以上的数值变成负数,这就要求我们降低内存数量了。唉,如果说640K的结界是天灾,这个signed integer的结界就是人祸了。

      再后来,人们终于找到了理想的突破640K结界的方法:使用DOS保护模式(DOS Protected Mode)。80386及以后的CPU在电脑启动后都会进入实模式(Real Mode),以兼容早期的8088。当运行在保护模式中时,CPU的直接寻址能力高达4GB,并且提供了很多高级功能,使程序可以直接使用系统所有的内存资源,常规内存、扩页内存和扩展内存统统失去了意义;并且,保护模式能够充分发挥32位CPU的威力,极大的提高了效率。常玩游戏的各位一定对DOS4GW非常熟悉,它是Watcom C/C++专用的内存管理工具,可以使程序运行在32位保护模式下。著名的《金庸群侠传》就是用了这个DOS扩展器。运行在32位保护模式下的游戏很少遇到内存问题,只可惜这样的游戏真是不多啊。

      2、贤者的符咒

      这里我们将结合config.sys中内存的有关设置,结合具体游戏来介绍突破内存结界的方法。config.sys是DOS的主要配置文件,放在系统盘的根目录下。

      一个典型的config.sys,可以适应多数游戏:

      ①device=c:\dos\himem.sys /testmem:off
      ②device=c:\dos\emm386.exe ram
      ③devicehigh=c:\dos\ide.sys /d:MSCD000
      ④dos=high,umb
      ⑤files=30
      ⑥buffers=30
      ⑦stacks=9,256

      为了方便解释,老狼在行首加了行号。

      ①himem是XMS存储器的管理驱动程序,它的主要功能是把扩展存储器按XMS规范来管理,也就说,它把传统的扩展存储器改造成了XMS存储器。此外,HIMEM.SYS可以建立HMA(High Memory Area)存储器供DOS使用。如果运行游戏时显示:XMS not found! 这就是因为没有加载himem.sys所致。为了加快启动的速度,可以在后面加上 /testmem:off 参数,跳过内存检测。另外,加上 /cpuclock:on 可以修正系统时钟速度变化的错误。

      ②emm386是EMS的管理驱动程序。它的功能是把XMS存储器模拟成EMS存储器来使用,并且建立UMB存储器。后面的ram参数表示同时建立UMB和EMS存储器,如果你确定游戏不需要EMS内存,可以考虑把ram换成noems参数,这样可以获得更多的UMB空间。但如果运行游戏时显示:Error: No EMS found!!! 也就是说游戏要求使用ems,你就不能用noems参数了。如果运行游戏时显示:Error: Free memory is not enough 570k,或Base memory not enough,这是常规内存不足,应该考虑减少常驻内存的程序或将程序加载到UMB中。

      ③devicehigh=c:\dos\ide.sys /d:MSCD000,这是光驱的驱动程序,devicehigh表示把程序加载到UMB中,这样可以为常规内存腾出更多的空间。如果你不需要在DOS下使用光驱,这行可以省略。

      ④dos=high,umb,设置DOS占用的内存,high表示把DOS核心部分装入HMA以节省常规内存,umb表示允许DOS与UMB建立联系,以便装载TSR程序或设备驱动程序到UMB中,若改成noumb则表示不允许使用UMB。

      ⑤files=30,设定程序可以同时打开的最大文件数,若不写这一行,相当于默认值files=10,可能导致大型程序运行失败。

      ⑥buffers=30,设定缓冲区数量。DOS默认缓冲区数Buffers的值为15,每个Buffer占523字节。如果设定了DOS=HIGH,Buffers会移到HMA中,这当然是好事,但是如果用户自己设定的Buffers太大,超过47个,则HMA装入DOS核心后的剩余空间无法容纳,就把全部Buffers移至常规内存中,这将得不偿失,30的数量比较合理。buffers还可以在后面加上一个数字,表示高速缓冲区数量,如buffers=20,8。老狼没感觉到这个选项对游戏有什么影响,也就没有使用过这种设置,所以就不管它了。

      ⑦stacks=9,256,设定使用的堆栈的数量。第一个数字是堆栈数量,第二个是每个堆栈的大小。通常指定的值是9,256,这个值可以满足大多数的需求。

      只有这些显然是不够的,让我们再来看看其他可能遇到的内存问题。如果运行游戏时显示:EMM386 has detected error #xx in an application at memory address xxxx:xxxx. To minimize the chance of data loss, EMM386 has halted your computer. For more information, see the readme.txt file. To restart your computer, press enter. 这多半已经死机了,不过根据老狼的经验,出现这种错误偶然成分居多,就好像windows的非法操作一样,重新启动后多半就能恢复正常。如果还是不行,可能是EMM386的设置有问题,可以根据游戏的要求,对其进行修改,遇到具体问题时我们再讨论。

      下面是本章的重点,很多玩友在玩游戏时收到的错误信息是 XMS = -xxxxx,Error: XMS is not enough xxxk,冤枉啊,内存怎么成了负数呢?其实这是因为xms太大,而很多老游戏偏偏采用了一个signed integer来存储xms的数量,导致32767以上的数值变成负数。解决的办法有很多,如果你的内存是64M,你可以在运行游戏之前运行lh smartdrv 32768 16384,加载高速磁盘缓冲程序。lh表示将smartdrv读入UMB,32768表示使用的内存数量(KB),16384表示提供给windows的缓存数量。这样一来,既减少了内存,又增加了系统效率,一举两得。为什么高于64M内存的电脑不能使用这种办法呢?因为smartdrv的缓存越大,它本身占用的空间也就越大,如果UMB容不下它,他会毫不客气的抢占常规内存,直接导致游戏无法运行。实际上,加载带/x参数的smartdrv可以极大的提高游戏性能,所以它是我们必备的法宝。

      还有一种办法是使用虚拟硬盘程序,将内存虚拟成硬盘,用很小的常规内存或UMB就可以轻松占用掉大量XMS,很适合大内存的玩友使用。DOS中自带的ramdrive.sys必须在config.sys中加载,一旦加载就不可调整内存盘的大小或删除。而且虚拟硬盘有容量限制,不能超过32M,它们自己还占用较多的常规内存。幸好有人开发了完美的虚拟硬盘软件XMSDSK,这个小东西的好处太多了,它可以在命令行方式下无限次动态调节虚拟硬盘的大小,并可以随时卸载;它占用内存相当才几百字节,而且能够自动调入到UMB,而不需用LH命令,最重要的是,它支持极大的内存,目前高达2G!XMSDSK的使用非常简单,只需执行xmsdsk xxxxx就行了,单位是KB。卸载的命令是xmsdsk /u,非常轻松。下载地址是http://firststep./dosware/xmsdsk.exe。

      如果你打算在windows下玩老游戏,以上问题的解决就更简单了,直接编辑游戏可执行文件的属性,点“内存”,然后按照需要选择合适的内存数量即可。但你可能要忍受无声甚至噪音的痛苦,而且多数游戏的时钟会有所变化。

      另外,通过himem.sys调用int 15h也可以限制内存,但15h中断很不安全,微软早已放弃使用了,而且从未公布himem的int 15h用法,所以这种办法不推荐使用,有兴趣的朋友可以自己查阅相关资料。

      到这里,我们不妨编一个批处理文件来简化我们玩游戏的过程,建立一个扩展名是bat的文件,在里面输入如下内容(假定你的内存是256M):

      lh c:\dos\smartdrv.exe /x
      lh c:\dos\xmsdsk.exe 240000 /y
      lh c:\dos\mouse.com

      以上的路径和程序请根据个人的需要修改。

      到这里,相信大家在内存方面不会遇到什么障碍了,多数游戏已经能够运行起来,至于怎么让游戏运行得有声有色、原汁原味,敬请期待后几章的内容。








    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设置的具体选项根据个人的主板不同可能略有区别,意思一样即可。

      
    除去前几章提到的问题,还有很多杂七杂八的喽罗影响游戏的正常运行,下面是老狼曾经遇到过的麻烦,希望对大家有所帮助。问题尽量从原理上加以解释,以适合各种需要的玩家。

      1、CPU

      运行exe时出现Runtime error 200 at xxxx-xxxx,比如仙剑的install.exe,新蜀山剑侠的mark.exe。

      多数情况下,这是因为这个exe是采用Borland Pascal 7.0编译的,要解释这个问题,就不得不说说Borland Pascal的历史。使用Borland Pascal 6.0编译的程序并没有这样的问题,但是这些程序的延迟(delay)在快速计算机上却是完全错误的。BP7修正了这个问题,却带来了更大的隐患:BP7编译出来的所有使用系统CRT单元的程序在比较快的计算机上都会出现Runtime Error 200错误。很可怜,几乎所有的程序都会用到CRT单元。
      下面是这个错误的一些解释:CRT单元在初始化时,会初始化delay procedure,delay初始化时,会使用内存地址为40:6C的每秒钟跳动18.2次的BIOS定时器,来计算55毫秒(1/18.2)需要多少条IRET空指令。这个数字会被除以55来得到能延迟1毫秒的数字,计算的结果被写到一个2字节的变量里。这个变量的溢出就导致了Runtime Error 200。Runtime Error 200的含义是Division by zero,但在这里它是由溢出引起的。由此可见,比较快的计算机很可能导致这个错误。

      既然知道了问题的起因,解决办法也就有了——或者修正错误,或者给CPU降速。直接修正错误的软件并不好找,而且对压缩过的或加密过的exe无能为力,有时间的朋友可以找一个叫PROT 200的TSR程序,它可以自动使后面有CRT单元问题的程序正常运行,而不需修改文件本身。我们主要考虑第二种方法。http://www./ftp/slowdown.com是一个很好的DOS下的降速软件(还可以降Windows的速度)。选项很多,有热键和命令行两种方式。我们可以在游戏开始前运行它,随时按Ctrl+Alt+5键就可将速度降低50%,Ctrl+Alt+0就是恢复原来的速度。另外,每按一次Ctrl+Alt+加号键可以增加10%的速度,每按一次Ctrl+Alt+减号键可以减少10%的速度。如果热键无效,用SLOWDOWN /P:55 install命令就可以以55%的速度来运行install程序。有些游戏速度太快,没办法正常玩,用它也可以解决了。如果你觉得麻烦,可以在BIOS中把CPU的一级缓存CPU Internal Cache设成Disabled,这样也可以极大的降低速度。

      2、显卡

      在DOS下运行仙剑花屏?这是由于老的DOS游戏不能够支持AGP接口的大显存显卡。解决的办法就是把显卡伪装成一个比较破的东西。经常玩DOS游戏的朋友对于UNIVBE一定不会陌生:UNIVBE是Scitech出品的一种通用的显示驱动软件,可以为各种不同的显卡配备统一的标准VESA显示驱动程序,从而为各种游戏提供一致的图形显示接口。到了Windows时代,Scitech在UNIVBE的基础上,出品了新的Scitech Display Doctor(简称SDD),提供从DOS到Windows 3.x以至于Windows 98的全系列操作环境,并且包含对非常多的显示卡的支持,用来解决在显示卡使用过程中可能碰到的绝大多数与显示相关的问题。遗憾的是,SDD已经停止更新了,在Scitech的网站http://www.可以看到,最新版的SDD6.53提供了免费下载和自由注册码,需要的朋友可以下载,老狼也不知道它能支持多少新显卡。我们的伪装主要是针对DOS的,所以在安装以后最好把SDD的目录Copy一份,以避免伪装对Windows的影响。具体的方法是运行下面两条语句:

      C:\SDD2\UNIVBE32.EXE -w
      C:\SDD2\CONFIG.EXE -m1024

      第一行的意思是加载UNIVBE,并防止Windows的Logo扭曲;第二行中 -m1024的意思是把显存限制为1MB,以解决花屏等问题。使用UNIVBE的好处还有一个,就是为游戏提供更多种非标准分辨率的支持,这对一些模拟器非常有用。

      3、硬盘

      硬盘也有问题吗?如果你想用DOS6.x玩游戏的话,你需要注意,这个系统是不支持FAT32分区的,而且,如果你的扩展DOS分区大于8.4G,即使里面的逻辑盘采用了FAT16,DOS6.x还是不能识别。最好的办法是使用DOS7.0,老狼还没见过非要DOS6.x不可的游戏呢。如果你真的需要DOS6,可以考虑做一张DOS6的启动盘,然后在里面放上FAT32支持一类的软件,Volkov Commander似乎不错,老狼没有用过,各位不妨试试看。

      另外,如果你的游戏还是遇到一些莫名其妙的问题,可以尝试在BIOS中将硬盘的PIO调低一些,并关闭UDMA的选项,以避免IDE计时器的相关问题。

      4、DOS7.x的设置

      Windows 9x所附带的DOS7.x对老DOS游戏的兼容性不错,我们可以通过修改MSDOS.SYS来让我们的DOS7用得更舒服,顺便获得较多的常规内存。下面向大家简要介绍一下:在DOS方式下,进入系统盘根目录,去掉MSDOS.SYS的属性并修改之。对于系统盘是C盘的玩友,命令如下:

      c:
      cd attrib msdos.sys -h -s -r
      edit msdos.sys

      在弹出的页面中找到[Options]这一段,改成以下内容(;后面的内容为注释):

      BootMulti=1 ;允许多重引导
      BootMenu=1 ;出现多重引导菜单
      BootMenuDelay=30 ;菜单默认项等待时间
      BootGUI=1 ;以normal启动是否直接进入图形界面
      DoubleBuffer=1 ;磁盘缓冲,并不占多少内存,留着算了
      Logo=0 ;是否显示LOGO
      Dblspace=1 ;设置成1可以获得对压缩盘的支持
      drvspace=1 ;同上,这两项对内存也没有什么影响
      AutoScan=1 ;非法关机后是否自动检查硬盘

      值得一提的是,MSDOS.SYS中大片的XXX是为了兼容性而设置的,不要删掉。编辑完成后,保存退出,打

      attrib msdos.sys +s +r +h

      以策万全。这样的设置配合我在第三章给出的CONFIG.SYS,可以获得600k以上常规内存,如果不加载光驱等,可达621k,足以满足游戏的需要。

      5、日文游戏的解决办法。DOS/V似乎是一个很难缠的家伙,这里有一个据说是DOS/V的完美替代品http://firststep./dosware/dosj.zip,老狼没有试过,想玩日文游戏的玩友不妨下载一个。

      6、呼,暂时想不到了~~~喽罗难免有漏网的,胆敢现身者格杀勿论!

      洋洋洒洒一大堆字写下来,也不知道对大家有帮助没有,反正老狼现在正在痛痛快快的怀旧呢,祝大家都能有一个好的怀旧心情!最后奉上我的一些游戏的运行情况:

      仙剑奇侠传,Windows下音效不正常,FM音乐时钟不正常。DOS各版本下均调试通过,install.exe需降速使用,若无音效,需打开Memory Hole。

      轩辕剑2,Windows和DOS下完全正常。

      轩辕剑外传——枫之舞,Windows和DOS下完全正常。

      新蜀山剑侠,Windows下FM音乐时钟不正常,有音效时出现噪音,速度奇慢,但不影响游戏。DOS下一切正常。如果屏幕闪烁,请运行play1.bat进入游戏;mark.exe只是一个商标,需降速使用。

      金庸群侠传,Windows和DOS下完全正常。

      魔神战记2,Windows下不能运行,DOS下emm386的参数不能是noems,退出时偶尔死机,其余一切正常。

      皇帝,Windows下和DOS下完全正常,DOS下需加载鼠标驱动程序。

      欢乐幸福人,Windows下不能运行,DOS下完全正常,需加载鼠标驱动程序。

      大富翁3,Windows下FM音乐时钟不正常,DOS下完全正常,DOS下可选鼠标驱动程序。

      明星志愿,Windows下FM音乐时钟不正常,音调不准,DOS下完全正常,DOS下可选鼠标驱动程序。

      超级医生2,Windows下和DOS下完全正常,DOS下可选鼠标驱动程序。

    1楼  2024/11/10 14:57:40  回复
  • 枫之精英

    CONFIG.SYS文件的命令与配置

    CONFIG.SYS是DOS系统中的一个重要文件,它的配置直接影响到系统的使用及其效率。如果配置不当的话,可能很多程序都无法正常运行。因此,正确合理地配置CONFIG.SYS文件是十分必要和重要的。下面我向大家介绍一下CONFIG.SYS中的命令及其配置方法。

    CONFIG.SYS中的命令:
    注意:所有以HIGH结尾的命令(如DEVICEHIGH)表示将其调入UMB(上位内存),但有些这样的命令(如FILESHIGH)必须在MS-DOS 7.x版本中使用。

    ACCDATE:指定对每一个驱动器是否记录文件最后被访问的日期。
    用法:ACCDATE= 驱动器 1+|- [ 驱动器 2+|-]...
    如:ACCDATE=C+ D+ E+将在C,D,E盘中记录文件最后被访问的日期。
    此命令仅用于MS-DOS 7.x中。

    BREAK:设置或清除扩展的CTRL+C检查。
    用法:BREAK=ON|OFF

    BUFFERS/BUFFERSHIGH:为指定数量的磁盘缓冲区分配内存。
    用法:BUFFERS=磁盘缓冲区数量,[从属高速缓存中的缓冲区数量]

    DEVICE/DEVICEHIGH:将指定的设备驱动程序装入内存。
    用法:DEVICE/DEVICEHIGH 文件名 [参数]
    其中,文件名是文件的完整路径,如C:/DOS/HIMEM.SYS。

    DOS:用于DOS系统的配置,如是否使用HMA(高端内存区)等。
    用法:DOS=[HIGH|LOW][,UMB|,NOUMB][,AUTO|,NOAUTO][,SINGLE]
    其中,HIGH和LOW表示使用HMA或不使用HMA,UMB和NOUMB表示使用UMB或不使用UMB,AUTO或NOAUTO表示系统自动配置或不自动配置,SINGLE表示使用单一模式的DOS。其中,AUTO/NOAUTO和SINGLE仅用于MS-DOS 7.x中。

    DRIVPARM:设置现有物理设备的参数。
    注:此命令用得很少,我也没用过,所以暂时跳过。

    FCBS/FCBSHIGH:指定可以同时打开的文件控制块 (FCB) 的数量。
    用法:FCBS/FCBSHIGH=可以同时打开的FCB的数量。
    注:由于FCB主要是在DOS 1.x中使用,对于高版本,所以可以让系统自动配置。

    FILES/FILESHIGH:指定 可以同时访问的文件数量。
    用法:FILES/FILESHIGH=可以同时访问的文件数量。
    注:一般FILES/FILESHIGH的设置值在30左右比较合适。

    INSTALL/INSTALLHIGH:用于加载TSR(内存驻留程序)。
    用法:INSTALL/INSTALLHIGH=文件名 [参数]
    如:INSTALLHIGH=C:/DOS/DOSKEY.COM /APPEDIT

    LASTDRIVE/LASTDRIVEHIGH:指定可以访问的驱动器的最后有效的驱动器字母。
    用法:LASTDRIVE=驱动器字母
    如LASTDRIVE=F会将F设置成最后有效的驱动器字母。

    NUMLOCK:指定启动时NUMLOCK指定灯是否打开。
    用法:NUMLOCK=ON|OFF

    REM:添加注解。
    用法:REM [注解字符串]
    注:注解中的字符串只是用来增加可读性,将不被执行。

    SET:设计DOS环境变量。
    用法:SET 变量=[变量值]

    SHELL:指定DOS 使用的命令解释程序的名称和位置。
    用法:SHELL=文件名 [参数]
    注:文件名默认是COMMAND.COM,您也可以指定其它的文件,如4DOS.EXE等。

    STACK/STACKHIGH:指定使用的堆栈数量。
    用法:STACK/STACKHIGH=堆栈数量,每个堆栈的大小
    注:通常指定的值是9,256,这个值可以满足大多数的需求。

    SWITCHES:指定一些特殊选项。
    用法:SWITCHES=[/W] [/F] [/K] [/N] [/E[:n]]

    其它的是一些菜单配置命令,如MENUITEM,MENUCOLOR等。

    在MS-DOS 7.x中还有一些未公开命令,如LOGO,COMMENT等。

    知道了以上的命令后,就要谈谈如何利用这些命令来配置CONFIG.SYS文件了。配置的好坏对系统的影响是非常大的。以下是我的电脑(都是MS-DOS 7.10)中CONFIG.SYS文件中的内容,大家可以用作参考。

    电脑一,使用EMM386.EXE:

    device=d:/tools/dostools/echo.sys L/o/a/d/i/n/g CONFIG.SYS...
    device=d:/tools/mdctools/himem.sys /testmem:off
    device=d:/tools/mdctools/emm386.exe noems novcpi i=b600-b7ff
    devicehigh=d:/tools/mdctools/setver.exe
    devicehigh=d:/software/pwin98se/ifshlp.sys
    devicehigh=d:/tools/dostools/vide-cdd.sys /d:CDROM1
    devicehigh=d:/tools/dostools/cloaking.exe
    country=086,936,d:/tools/mdctools/country.sys
    shell=c:/command.com /p /e:640
    set temp=e:/temp
    set tmp=e:/temp
    accdate=c+ d+ e+
    dos=high,umb
    numlock=off
    files=30
    buffershigh=30,0
    fcbshigh=4,0
    lastdrivehigh=n
    stackshigh=9,256

    电脑二,使用UMBPCI.SYS:

    device=d:/tools/dostools/echo.sys L/o/a/d/i/n/g CONFIG.SYS...
    device=d:/tools/dostools/echo.sys
    device=d:/tools/dostools/umbpci.sys
    device=d:/tools/dostools/hiram.exe
    devicehigh=d:/tools/mdctools/himem.sys /testmem:off
    devicehigh=d:/software/pwin98se/setver.exe
    devicehigh=d:/software/pwin98se/ifshlp.sys
    devicehigh=c:/dos/vide-cdd.sys /d:CDROM1
    shell=d:/tools/mdctools/command.com /p /e:640
    set temp=e:/temp
    set tmp=e:/temp
    accdate=c+ d+ e+
    dos=high,umb,auto
    country=086
    numlock=off
    fileshigh=30
    buffershigh=30,0
    stackshigh=9,256
    lastdrivehigh=n



    2楼  2024/12/13 13:01:14  

  发表回复

    发帖