MS-DOS/PC DOSでフリーエリアを極限まで確保する
以前MS-DOS 6.2/Vにおいてフリー領域を確保するという記事を上げましたが、あれからさらにいろんなことがわかり、もっと突き詰められることがわかりました。そこで、さらにさらにコンベンショナルメモリを空けていこうと思います。目標は600KB free
今回はWindows Virtual PC(仮想マシン)上のMS-DOS 6.2/Vと自作PC/AT互換機(実機)上のPC DOS 2000日本語版で検証しています。
○上位メモリからUMBメモリとして使用するアドレス範囲を手動で指定する
UMBメモリは本来はシステム予約領域である部分からメモリ管理ドライバが未使用領域を探し出して、それをプロテクトメモリの一部分のミラーとして割り当てています。しかし、DOSに標準で付属するEMM386は未使用領域を探し出す精度が悪く、一部の領域しか割り当てられない場合が多いです。その場合に、メモリマップがはっきりしているのであれば、ユーザーが直接UMBメモリの領域を指定することでより多くのUMBメモリを確保できます。
Windows Virtual PCの上位メモリの未使用領域の情報がこちらのページにあります。
→Tuning DOS inside Virtual PC - MSDN Blogs
こちらによれば「DEVICE=C:\DOS\EMM386.EXE RAM /I=B100-B7FF /I=C600-C7FF /I=CC00-CFFF /I=E600-EFFF /FRAME=D000」を入れればいいということで、次のように設定してみました。
○設定例1 (MS-DOS 6.2/V 手動設定)
CONFIG.SYS
DEVICE=C:\DOS\EMM386.EXE RAM /I=B100-B7FF /I=C600-C7FF /I=CC00-CFFF /I=E600-EFFF /FRAME=D000
DEVICEHIGH=C:\DOS\SETVER.EXE
DEVICEHIGH=C:\DOS\BILING.SYS
DEVICEHIGH=C:\DOS\JFONT.SYS /P=C:\DOS\
DEVICEHIGH=C:\DOS\JDISP.SYS
DEVICEHIGH=C:\DOS\JKEYB.SYS /106 C:\DOS\JKEYBRD.SYS
DEVICEHIGH=C:\DOS\ANSI.SYS
DEVICEHIGH=C:\DOS\KKCFUNC.SYS
DEVICE=C:\DOS\MSIMEK.SYS /A1
DEVICE=C:\DOS\MSIME.SYS /D*C:\DOS\MSIMER.DIC /DC:\DOS\MSIME.DIC /C1 /N /A1
DEVICEHIGH=C:\VMADD\CDROM.SYS /D:IDECD001 /L:E
LASTDRIVE=E
FILES=30
FCBS=1,0
STACKS=0,0
DOS=HIGH,UMB
SETVER.SYS、ANSI.SYS、MSIME.SYS、MEIMEK.SYSは必要でなければ外した方がいいでしょう。CDROM.SYSはVirtual PCの追加機能にあるCD-ROMドライブデバイスドライバです。Virtual PCの追加機能をインストールするとVMADD386.SYSが追加されますが、共有フォルダー機能を使わない場合は不要です。実機で動かす場合は適切なドライバのファイルパスに変更して下さい。
AUTOEXEC.BAT
LH C:\DOS\SMARTDRV.EXE /X
PROMPT $p$g
PATH C:\WINDOWS;C:\DOS
SET TEMP=C:\DOS
LH C:\DOS\NLSFUNC.EXE C:\DOS\COUNTRY.SYS
C:\DOS\CHEV.COM JP
SET DOSVMADD13=INSTALLED
LH c:\DOS\MSCDEX.EXE /D:IDECD001 /E /L:E /M:8
MEM /Cコマンドの実行結果
1MB 以下のメモリを使っているモジュールは: 名前 合計 = コンベンショナル + 上位メモリ -------- ---------------- ---------------- ---------------- MSDOS 12,269 (12K) 12,269 (12K) 0 (0K) HIMEM 1,120 (1K) 1,120 (1K) 0 (0K) EMM386 4,256 (4K) 4,256 (4K) 0 (0K) MSIMEK 11,728 (11K) 11,728 (11K) 0 (0K) MSIME 8,528 (8K) 8,528 (8K) 0 (0K) COMMAND 4,208 (4K) 4,208 (4K) 0 (0K) SMARTDRV 29,488 (29K) 29,488 (29K) 0 (0K) MSCDEX 15,856 (15K) 15,856 (15K) 0 (0K) JKEYB 5,888 (6K) 0 (0K) 5,888 (6K) KKCFUNC 4,096 (4K) 0 (0K) 4,096 (4K) ANSI 4,784 (5K) 0 (0K) 4,784 (5K) CDROM 4,304 (4K) 0 (0K) 4,304 (4K) NLSFUNC 2,544 (2K) 0 (0K) 2,544 (2K) SETVER 640 (1K) 0 (0K) 640 (1K) BILING 12,160 (12K) 0 (0K) 12,160 (12K) JFONT 2,880 (3K) 0 (0K) 2,880 (3K) JDISP 19,328 (19K) 0 (0K) 19,328 (19K) 空き 599,184 (585K) 567,824 (555K) 31,360 (31K) メモリの概略: メモリの種類 合計 = 使用中 + 空き ---------------- ---------- ---------- ---------- コンベンショナル 655,360 87,536 567,824 上位 87,984 56,624 31,360 予約済み 393,216 393,216 0 XMS メモリ* 65,972,304 3,019,856 62,952,448 ---------------- ---------- ---------- ---------- 全メモリ 67,108,864 3,557,232 63,551,632 全 1MB 以下メモリ 743,344 144,160 599,184 全 EMS メモリ 33,947,648 (33,152K) 空き EMS メモリ* 33,357,824 (32,576K) * EMM386 は EMS メモリをシミュレートするために XMS メモリを使っています. 空き EMS メモリは空き XMS メモリの変更によって変わることがあります. 最大実行可能プログラムサイズ 567,728 (554K) 最大空き上位メモリブロック 13,792 (13K) MS-DOS はハイメモリ領域に常駐しています.
この結果を見ると、SMARTDRV(ディスクキャッシュ)、MSIME(日本語入力システム)、MSCDEX(MS-DOS CD-ROM Extensions)がコンベンショナルメモリを消費していることがわかります。
Virtual PC上ではSMARTDRVなんてあってもなくても大して変わらないので、大量のファイルを操作する時以外では外しておいた方がいいかもしれません。もしくは/Mスイッチで前読みキャッシュのサイズを制限すれば、ある程度コンベンショナルメモリの消費を抑えることができます。
○サードパーティのメモリ管理ソフト(QEMM386)を利用する
MS-DOSにはMEMMAKER、PC DOSにはCentral Point RAMBoostというメモリ最適化ツールが付属します。MEMMAKERはそれなりにコンベンショナルメモリを確保できますが、CONFIG.SYSを書き換えるだけでメモリ管理ソフトはEMM386なので、実行効果は上の手動設定とそれほど変わりません。RAMBoostはそれ自身が多くのコンベンショナルメモリを消費するため、役に立ちません。RAMBoostを使わずに手動で設定した方がいいです。
ということでDOS標準のツールでは限界があるので、サードパーティのメモリ管理ソフトを使うことにします。今回はソフトバンクから発売されていたQuarterdeck社のQEMM 8Jを使います。QEMMは数あるメモリ管理ソフトの中でも特に広く使われたソフトで、日本でも1万円ちょっとの値段で販売されていたようです。残念ながらQuarterdeck本社はSymantec社に吸収され、日本の販売元も移管や合併を繰り返し、それから10年近く経った今ではインターネット上のQEMMに関する情報はほとんど跡形もなく消えています。
(日本におけるQuarterdeck社の製品の販売代理店は、ソフトバンク株式会社(QEMM)、株式会社プロンプト(WINProbe)、株式会社テクノコム(Procomm)、ウイニングラン・ソフトウェア株式会社(MagnaRAM。1995年11月提携開始。1999年に親会社のメディアビジョンに吸収される。)、クォーターデック株式会社(開発のみ)、株式会社メディアヴィジョン(2004年に親会社の丸紅株式会社による再編で解散?)。)
QEMMはPC/AT互換機でしか動作しません。日本でDOSが普及していた頃はまだPC98が一般的だったため、PC/AT互換機のDOSソフトはかなり希少です。新規入手は難しいでしょう。
QEMMをインストールする前にCONFIG.SYSやAUTOEXEC.BATを適当な名前でコピーしてバックアップを取ります。QEMMをインストールすると初回時はOPTIMIZEコマンドが実行されます。設定は自動インストールで進めて問題ありません。ただ、Virtual PCではStealth ROM機能が正常に動作しないので、「STEALTHチェック」の画面でESCキーを押してスキップします。また、QuickBoot機能も正常に動作しないので、OPTIMIZEコマンド完了後にQSETUPコマンドで設定メニューを開いてQuickBoot機能を無効にします。自動最適化中は何度か再起動し、高確率でフリーズするので、その度にリセットします。詳しい設定方法は製品付属のユーザーズガイドを参照して下さい。以下CONFIG.SYS、AUTOEXEC.BAT、MEM /Cの実行結果を上げておきます。
○設定例2 (MS-DOS 6.2/V + QEMM 8.0J)
CONFIG.SYS
FILES=8
FCBS=1,0
STACKS=0,0
LASTDRIVE=E
DOS=HIGH,UMB
DEVICE=C:\QEMM\QEMM386.SYS RAM BE:N R:5
device=c:\qemm\dos-up.sys @c:\qemm\dos-up.dat
DEVICE=C:\QEMM\LOADHI.SYS /R:2 /SIZE=11040 C:\QEMM\QDPMI.SYS SWAPFILE=DPMI.SWP SWAPSIZE=1024
DEVICE=C:\QEMM\LOADHI.SYS /R:4 /SIZE=17104 C:\DOS\SETVER.EXE
DEVICE=C:\QEMM\LOADHI.SYS /R:4 /SIZE=12752 C:\DOS\BILING.SYS
DEVICE=C:\QEMM\LOADHI.SYS /R:2 /RES=2880 /SQF /SIZE=22624 C:\DOS\JFONT.SYS /P=C:\DOS\
DEVICE=C:\QEMM\LOADHI.SYS /R:1 /SIZE=21888 C:\DOS\JDISP.SYS
DEVICE=C:\QEMM\LOADHI.SYS /R:2 /RES=5888 /SQF /SIZE=17760 C:\DOS\JKEYB.SYS /106 C:\DOS\JKEYBRD.SYS
DEVICE=C:\QEMM\LOADHI.SYS /R:5 /SIZE=4960 C:\DOS\KKCFUNC.SYS
DEVICE=C:\QEMM\LOADHI.SYS /R:1 /SIZE=9968 C:\DOS\ANSI.SYS
DEVICE=C:\DOS\MSIMEK.SYS /A1
DEVICE=C:\DOS\MSIME.SYS /D*C:\DOS\MSIMER.DIC /DC:\DOS\MSIME.DIC /C1 /N /A1
DEVICE=C:\QEMM\LOADHI.SYS /R:1 /SIZE=5152 C:\VMADD\CDROM.SYS /D:IDECD001 /L:E
SHELL=C:\QEMM\LOADHI.COM /R:2 /RES=4288 /SQF C:\COMMAND.COM C:\ /P
AUTOEXEC.BAT
C:\QEMM\LOADHI /R:5 /LO C:\DOS\SMARTDRV.EXE /X /B:4096
PROMPT $p$g
PATH C:\QEMM;C:\WINDOWS;C:\DOS
SET TEMP=C:\DOS
C:\QEMM\LOADHI /R:4 C:\DOS\NLSFUNC.EXE C:\DOS\COUNTRY.SYS
C:\DOS\CHEV.COM JP
SET DOSVMADD13=INSTALLED
C:\QEMM\LOADHI /R:4 c:\DOS\MSCDEX.EXE /E /D:IDECD001 /L:E /M:8
c:\qemm\loadhi /r:3 c:\vmadd\idle.com
MEM /C
1MB 以下のメモリを使っているモジュールは: 名前 合計 = コンベンショナル + 上位メモリ -------- ---------------- ---------------- ---------------- MSDOS 9,517 (9K) 9,517 (9K) 0 (0K) QEMM386 784 (1K) 784 (1K) 0 (0K) MSIMEK 11,728 (11K) 11,728 (11K) 0 (0K) MSIME 8,688 (8K) 8,688 (8K) 0 (0K) LOADHI 112 (0K) 112 (0K) 0 (0K) COMMAND 4,208 (4K) 272 (0K) 3,936 (4K) SMARTDRV 21,312 (21K) 13,104 (13K) 8,208 (8K) JDISP 19,248 (19K) 0 (0K) 19,248 (19K) ANSI 4,784 (5K) 0 (0K) 4,784 (5K) CDROM 4,288 (4K) 0 (0K) 4,288 (4K) FILES 208 (0K) 0 (0K) 208 (0K) 96 (0K) 0 (0K) 96 (0K) WKBUFFER 528 (1K) 0 (0K) 528 (1K) LASTDRIV 464 (2K) 0 (0K) 464 (0K) INSTALL 160 (0K) 0 (0K) 160 (0K) QDPMI 2,848 (3K) 0 (0K) 2,848 (3K) JFONT 2,880 (3K) 0 (0K) 2,880 (3K) JKEYB 5,952 (6K) 0 (0K) 5,952 (6K) DOS-UP 240 (0K) 0 (0K) 240 (0K) IDLE 544 (1K) 0 (0K) 544 (1K) SETVER 640 (1K) 0 (0K) 640 (1K) BILING 12,208 (12K) 0 (0K) 12,208 (12K) NLSFUNC 2,544 (2K) 0 (0K) 2,544 (2K) MSCDEX 15,856 (15K) 0 (0K) 15,856 (15K) KKCFUNC 4,128 (4K) 0 (0K) 4,128 (4K) 空き 627,840 (613K) 611,040 (597K) 16,800 (16K) メモリの概略: メモリの種類 合計 = 使用中 + 空き ---------------- ---------- ---------- ---------- コンベンショナル 655,360 44,320 611,040 上位 106,560 89,760 16,800 予約済み 393,216 393,216 0 XMS メモリ 65,953,728 2,957,248 62,996,480 ---------------- ---------- ---------- ---------- 全メモリ 67,108,864 3,484,544 63,624,320 全 1MB 以下メモリ 761,920 134,080 627,840 全 EMS メモリ 66,355,200 (64,800K) 空き EMS メモリ 62,996,480 (61,520K) 最大実行可能プログラムサイズ 610,864 (597K) 最大空き上位メモリブロック 9,424 (9K) MS-DOS はハイメモリ領域に常駐しています.
600Kオーバーまであともう一歩というところです。
ちなみにQEMMが標準で認識するメモリサイズは最大64MBですが、CONFIG.SYSでQEMM386.SYSにUSERAM(UR)パラメータを加えてメモリアドレスを指定すれば、最大256MBまでメモリを使うことができます。
○設定例3 (PC DOS 2000 日本語版 + QEMM 8.0J)
CONFIG.SYS
FILES=40
STACKS=8,256
DOS=HIGH,UMB
COUNTRY=081,932,C:\DOS\COUNTRY.SYS
DEVICE=C:\QEMM\QEMM386.SYS RAM BE:N R:2 ST:F
device=c:\qemm\dos-up.sys @c:\qemm\dos-up.dat
DEVICE=C:\QEMM\LOADHI.SYS /R:2 /SIZE=30160 C:\DOS\$FONT.SYS
DEVICE=C:\DOS\SETVER.EXE
DEVICE=C:\QEMM\LOADHI.SYS /R:2 /SIZE=33904 C:\DOS\$DISP.SYS
DEVICE=C:\QEMM\LOADHI.SYS /R:2 /SIZE=3088 C:\VBE\LPVR\LPVROLL.EXE
DEVICE=C:\QEMM\LOADHI.SYS /R:2 /SIZE=14096 C:\DOS\$IAS.SYS
DEVICE=C:\QEMM\LOADHI.SYS /R:2 /SIZE=9744 C:\DOS\ANSI.SYS /X
DEVICE=C:\QEMM\LOADHI.SYS /R:2 /SIZE=6176 C:\DOS\RAMDRIVE.SYS 4096 512 256 /E
INSTALL=C:\DOS\IBMMKKV.EXE /M=S /Z=4 /C /S=C:\DOS\MULTDICT.PRO /U=C:\$USRDICT.DCT
device=c:\qemm\loadhi.sys /r:2 /size=33824 oakcdrom.sys /D:mscd001
SHELL=C:\QEMM\LOADHI.COM /R:2 /LO C:\DOS\COMMAND.COM /P /E:512 /H
BUFFERS、FILESはUMBメモリに移動させるため、あまり切り詰めていません。CDドライブの使用に必要なOAKCDROM.SYSとMSCDEX.EXEは多くのメモリを消費するので、不要なら外しておきます。LPVROLL.EXEはDSPXVBE(V-Textドライバ)使用時のテキストスクロールを高速化する補助ドライバです。
AUTOEXEC.BAT
SET SYS=C:
SET COMSPEC=C:\DOS\COMMAND.COM
PROMPT $P$G
PATH C:\QEMM;C:\DOS;C:\WINDOWS
MKDIR D:\TEMP
SET TEMP=D:\TEMP
SET TMP=D:\TEMP
c:\ksh\ksh.com
c:\qemm\loadhi /r:1 c:\dos\keyb.com jp,932,c:\dos\keyboard.sys
C:\QEMM\LOADHI /R:1 C:\DOS\MSCDEX.EXE /E /D:MSCD001
VER
KSH.COMはKI-SHELLという常駐型のシェル拡張ソフトです。必須ではありませんがあると非常に便利です。自動でUMBメモリに導入されるので、LOADHIの指定は不要です。
起動時のメッセージ
Starting PC DOS.. Quarterdeck Expanded Memory Manager 386 V8.0J Copyright (c) 1986-1996 by Quarterdeck Corporation U.S. Patent Numbers 5,237,669 and 5,367,658 Serial number: xxx Registered to: xxx Total Memory Available to QEMM386: 65152K Loading font files ... $FONT.SYS Version 1.31 was installed. $DISP.SYS Version 1.32 が導入されました。 LPVROLL ver 1.10 (c)鯖/LP-Project. 1996-97 $IAS.SYS Versino 2.43 がEMSメモリーに導入されました。 IBM RAMDrive version 3.10 virtual disk D: ディスク・サイズ : 1024K セクター・サイズ : 512 バイト クラスター・サイズ : 1 セクター ディレクトリー項目数 : 256 This driver is provided by Oak Technology, Inc.. OTI-91X ATAPI CD-ROM device driver, Rev D91XV352 (C)Copyright Oak Technology Inc. 1987-1997 Devuce Bane : IDECD001 Transfer Mode : Programmed I/O Number of drives : 1 連文節変換ルーチン(IBMMKKV.EXE Version 7.00)が EMS メモリーに導入されました。 KI-Shell for AX & DOS/V (ver1.73g[EMS]) (c)1986-97 by K.Ishino,T.Hotta,yuuji,Mr.No HistBuff=501 AliasBuff=200 DirStack=15393 37FEh Bytes used UMBにロードしました. MSCDEX Version 2.25 Copyright (C) IBM Corp. 1986-1995. All rights reserved. Drive E: = Driver MSCD001 unit 0 PC DOS Version J7.0/V Revision 1
以下はMEM /Cコマンドの出力です。
1MB 以下のメモリーを使用しているプログラム/ドライバー: 名前 合計 = 基本メモリー + UMB メモリー -------- ---------------- ---------------- ---------------- SYSTEM 9,184 (9K) 9,056 (9K) 128 (0K) RSTRCFG 112 (0K) 112 (0K) 0 (0K) QEMM386 768 (1K) 768 (1K) 0 (0K) IBMMKKV 22,288 (22K) 22,288 (22K) 0 (0K) KEYB 6,512 (6K) 6,512 (6K) 0 (0K) MSCDEX 13,536 (13K) 13,536 (13K) 0 (0K) KI-SHELL 14,352 (14K) 0 (0K) 14,352 (14K) DOS-UP 240 (0K) 0 (0K) 240 (0K) $FONT 5,360 (5K) 0 (0K) 5,360 (5K) $DISP 33,888 (33K) 0 (0K) 33,888 (33K) LPVROLL 800 (1K) 0 (0K) 800 (1K) $IAS 7,136 (7K) 0 (0K) 7,136 (7K) ANSI 3,808 (4K) 0 (0K) 3,808 (4K) RAMDRIVE 432 (0K) 0 (0K) 432 (0K) OAKCDROM 28,864 (28K) 0 (0K) 28,864 (28K) FILES 2,096 (2K) 0 (0K) 2,096 (2K) FCBS 272 (0K) 0 (0K) 272 (0K) WKBUFFER 528 (1K) 0 (0K) 528 (1K) LASTDRIV 464 (0K) 0 (0K) 464 (0K) STACKS 2,752 (3K) 0 (0K) 2,752 (3K) INSTALL 160 (0K) 0 (0K) 160 (0K) COMMAND 4,208 (4K) 0 (0K) 4,208 (4K) - 空き - 623,504 (609K) 603,072 (589K) 20,432 (20K) メモリーの概要: メモリーのタイプ サイズ = 使用済 + 使用可能 ---------------- ----------- ----------- ----------- 基本 655,360 52,288 603,072 UMB 125,920 105,488 20,432 アダプタ RAM/ROM 332,832 332,832 0 Extended (XMS) 67,043,328 5,963,776 61,079,552 ---------------- ----------- ----------- ----------- システム全メモリ 68,157,440 6,454,384 61,703,056 1MB 以下全メモリ 781,280 157,776 623,504 全 EMS メモリー 67,305,472 (65,728K) 使用可能 EMS メモリー 61,079,552 (59,648K) 全 XMS メモリー 67,043,328 (65,472K) 使用可能 XMS メモリー 61,079,552 (59,648K) 実行可能プログラム最大サイズ 602,704 (589K) 使用可能最大 UMB メモリー 18,368 (18K) 使用可能 HMA メモリー 12,224 (12K) DOS は HMA 領域に常駐しています
実機ではStealth ROM機能はフレーム法(各種BIOS ROMの配置を変えずにBIOS ROM領域にページフレームを重ねる手法)を指定することで動作しました。そのためUMBメモリは123KBも確保することができました。ただ、Windows 3.1の動作が不安定になりました。ROMのステルス化はなかなか難しいようです。
日本語Microsoft Windows 3.1でのメモリ状況モニタ