Image: 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\HIMEM.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

@ECHO OFF
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)を利用する

Quarterdeck QEMM 8J
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ソフトはかなり希少です。新規入手は難しいでしょう。

Quarterdeck OPTIMIZE
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

BUFFERS=38,0
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

@ECHO OFF
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までメモリを使うことができます。
Quarterdeck MANIFEST (MFT)

○設定例3 (PC DOS 2000 日本語版 + QEMM 8.0J)

CONFIG.SYS

BUFFERS=20
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

@ECHO OFF
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でのメモリ状況モニタ

QEMM for Windows
Manifest for Windows


※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい。コメントはスパム防止フィルターによる承認制のため、投稿してもすぐに反映されない場合があります。

管理人 : Akamaki (akm)

は、PCとVTuberに夢中になっている電気技術者です。

私はレトロコンピューティングの愛好家ですが、そのようなリグはもう収集していません。

私の活動はトップページで見ることができます。読んでくれてありがとう!