总结上文可知,DOS游戏最致命的瓶颈就是内存管理,其次是其对新硬件的兼容支持。不过对于Win98,解决问题的方案与上述NT系统不大相同,总的来说需要你对DOS基础知识有相当的了解。
1.内存管理的解决方案
前面提到,由于DOS系统不同于Windows系统那样能够智能管理内存,所以其内存管理设置都需手动调试,在上面提到的内存问题解决实例中,你会发现,我们一般在游戏提示内存不够时,通过修改Autoexec和Config的具体配置解决此问题。这个方法对于Win98系统同样适用,但却有一些实践上的不同。
大家都知道Win98问世时宣称是带有一个DOS的,微软把它叫作DOS 7.0。在Win98开始菜单中的“程序”组中,你会看到一个名为“MS-DOS方式”的快捷方式,指向“c:\windows\command”,其实这只是个伪DOS罢了,不过它与WinXP/2000/NT中NTVDM系统下的Dos Command Prompt又有很大的不同。
旧版DOS(6.22及其以前版本)启动后都会加载Config.sys和Autoexec.bat中的管理程序,用于管理内存和配置系统。但从 Win1.0到Win98,视窗系统的启动总是在DOS的基础上进行,即先启动DOS,再启动Windows。Win32的用户都知道,Windows的启动是通过在DOS命令行下键入“Win”命令实现,要能执行这个Win.com,Config和Autoexec中必须要加载内存管理器 EMM386.exe和高端内存驱动Himem.sys等。然而发展到Win98之后,Win.com仍存在(但它默认会在启动时自动执行),但已相当智能,无需在两个初始化文件中进行设置即可正常运行。因此你可以看到,C盘根目录下这两个文件是空的(Config.sys是系统文件,默认情况下为隐藏,需要在“文件夹选项”进行设置:图1)。
但Win98系统的Config和Autoexec仍然重要,因为它们控制着“MS-DOS方式”的内存及系统配置,也就是说,当你在Windows 中开启“MS-DOS方式”窗口或运行Command.com命令,甚至双击DOS程序的图标,系统都会为这个运行于兼容模式下的DOS选择Config 及Autoexec——而它们就位于C盘根目录之下。不过需要说明的是,你若修改了这两个文件,必须重启系统后才能生效。以下将举例进行具体说明,举例时我们尽量采取与前文相同的游戏,以便大家对照分析。
(1)扩充内存EMS的正确配置
实例6:《三国志Ⅳ》
与前文所说不同的是,如果没有作过调整,进入San486.com的属性你会发现,Win98下居然无法设置EMS内存,因为系统并没有自动加载内存管理工具(图2),如果执行当然游戏会报“not enough memory”的。所以我们先要将扩充内存EMS的设置项加上。用记事本打开系统盘下Config.sys文件,在其中加上如下两行命令(图3):
DEVICE=C:\WINDOWS\HIMEM.SYS
(这个语句非常重要,意思是加载高端内存管理,使DOS能使用高端内存。)
DEVICE=C:\WINDOWS\EMM386.EXE ram
(EMM386.exe用于管理扩充内存,常用参数为“ram”和“noems”,使用后者能比前者释放更多的常规内存,但很多DOS程序不支持“noems”参数,故使用面较窄。)
之后保存好文件,重新启动机器后再打开San486.com的属性,扩充内存EMS的设置项回来了(图4),根据上文,将它设置为“自动”即可。这样扩充内存EMS的问题就解决了,双击执行San486.com即可顺利进行游戏(图5)。
(2)常规内存的正确配置
实例7:《龙骑士4》(Dra4)
如前文所说,这款游戏对常规内存的要求非常高,差不多接近590kB了,同时这款游戏也需要有EMS支持。而通常装载了EMM386.exe,DOS启动后,剩余的常规内存无法满足需要。还是尝试编辑Config.sys文件来释放更多的常规内存。
在编辑前,我们还是先在Win98的DOS兼容模式下键入命令“mem /c /p”查看内存的具体分配情况(图6)。在图中可以看到,常规内存剩余有577kB,系统其他常驻程序都是加载在常规内存里的,而上位内存是空的,所以我们要将一些常驻程序尽量加载到上位内存中,从而使常规内存空出,于是将Config.sys文件作如下修改(图7):
DOS=HIGH,UMB
DEVICE=C:\WINDOWS\HIMEM.SYS
DEVICEHIGH=C:\WINDOWS\EMM386.EXE ram
(“DEVICEHIGH”表示在上位内存中加载EMM386文件)
DEVICEHIGH=C:\WINDOWS\IFSHLP.SYS
其实这里要做的事情,就是将图6中看到的常规内存出现的程序都尽量加载到高端内存和上位内存中。保存文件后重启,然后再键入命令“mem /c /q”查看(图8),果然这时候常规内存已经有592kB了。这时候运行龙骑士4的Dra4.com,一样没有问题。
(3)超大常规内存的配置
不过不管如何配置Config.sys文件,由于上位内存有限,在Windows环境下又要加载EMM386.exe,你几乎没有办法使常规内存高于 590kB,虽然这时候绝大部分老DOS游戏都可以玩了,但也有部分“变态”游戏要求590甚至600kB以上内存,很多专业级游戏网站都建议放弃。其实问题依然可以解决。
一种方法就是从纯DOS模式启动,即在Win98运行前按F8并选择从命令行启动(图9),由于这时已经不是视窗环境,所以系统默认加载的常驻程序要少一些,只要合理配置Config和Autoexec文件,常规内存就可达到600kB以上。
另外一种方法就是使用第三方内存管理驱动软件。这里介绍UMBPCI 3.41版(下载地址:
http://www.uwe-sieber.de/files/umbpci_e.zip),整个文件只有30kB,是很有用的上位内存(UMB)扩充驱动程序(注:可能有某些主板暂不被支持),在Config.sys中用Device命令可以直接加载,最多可提供高达160多 kB的UMB。假设将压缩文件解开为文件夹UMBPCI在C盘,然后在Config.sys文件中加入此行语句“DEVICE=C:\UMBPCI\ UMBPCI.SYS”,注意需要把它放在Himem.sys文件之后(图10)。这样系统启动时,就会调用Umbpci.sys,如果文件被正确调用,你应该可在启动时看到相关信息(图11)。这时机器启动后其常规内存已经通常能轻易达到或超过600kB(图12)。
不过这种情况适用于不需EMS扩充内存的DOS游戏,因为这时候EMM386是被默认屏蔽的。如果万一游戏既需要600kB以上的常规内存又需要EMS扩充内存,那么我们就必须进行特殊设置同时加载UMBPCI和EMM386。
首先我们必须知道机器所使用上位内存的具体情况。这个可以利用UMBPCI所带的Umbchk.exe工具查看。方法是在机器启动时,按F8选取最后一项跳过Config和Autoexec文件,进入DOS 7.0后,执行Umbchk.exe即可查看到机器上位内存的空闲情况(图13),将其记录下来。然后在Config.sys文件中,将加载UMBPCI 的语句修改为“DEVICE=C:\UMBPCI\UMBPCI.SYS /I=XXXX-YYYY”,这表示我们将“XXXX-YYYY”这一段上位内存地址交给UMBPCI来处理,但并不是重点,我们要解决的是UMBPCI 和EMS同时加载的问题。UMBPCI的作者建议将EMS加载在特定的某个64kB的内存段内,只要这一段是可用的,就最好强制指定它为EMS的加载区。通常情况下这段地址是C800-D7FF,那么就需要如下编写Config.sys文件:
DOS=HIGH,UMB
DEVICE=C:\WINDOWS\HIMEM.SYS
DEVICE=C:\UMBPCI\UMBPCI.SYS /I=D800-EFFF
DEVICE=C:\WINDOWS\EMM386.EXE X=D800-EFFF X=B800-C7FF I=C800-D7FF I=B000-B7FF RAM M3 D=256 AUTO (注:无换行)
这样,我们就可以同时加载UMBPCI和EMS了。另外一种情况是,如果你的显卡有一个48kB的BIOS而无法使用C800-D7FF(例如NVIDIA GeForce),那么尝试将参数作如下修改:
DEVICE=C:\UMBPCI\UMBPCI.SYS /I=DC00-EFFF
DEVICE=C:\WINDOWS\EMM386.EXE X=DC00-EFFF X=B800-C7FF I=CC00-DBFF I=B000-B7FF RAM M3 D=256 AUTO
当然,此时系统仍有可能无法正确启动,一般来说是因为无法加载EMM386的页面框架,那么我们可以在加载语句中加上“FRAME=NONE”参数: DEVICE=C:\WINDOWS\EMM386.EXE FRAME=NONE X=D800-EFFF X=B800-C7FF I=C800-D7FF I=B000-B7FF RAM D=256 AUTO。
通过这样的调整,Win98下的MS-DOS就可同时支持EMS和拥有超高的空闲常规内存(图14)。需要说明的是,也有一些DOS游戏程序不能在没有加载页面框的情况下运行,此时就只好使用第一种方法。