NEC PC-9800シリーズ上のMS-DOSにおける実行可能プログラムサイズ、いわゆるフリーエリアを極限まで確保しようという試み。
いい加減この手の話題(→古い環境の話)はやめようと思っていましたが、予想以上に需要があるので、今後も暇と機会と必要性があれば書いていこうと思います。
MS-DOSのメモリ利用を手動で徹底的に最適化するには(今では使われなくなった)様々な知識が必要で、それだけで本1冊ができ上がるほどになります。なのでここでは具体例を挙げて簡単にまとめるだけに留めておきます。
実行可能プログラムサイズ(コンベンショナルメモリ)を空けるだけなら何も余分なデバイスドライバを入れないのが一番です。でもそれではつまらないので、今回は日本語入力ドライバ(NECAI)、RAMディスクドライバ(RAMDISK)、CD-ROMドライバを組み込んだオールラウンドな環境を構築しようと思います。使用OSはMS-DOS Ver.5.0A-Hです。
○最適化前
最適化する前のCONFIG.SYSとAUTOEXEC.BAT。DEVICEHIGHコマンドを使わない(デバイスドライバをUMBに移さない)場合。
CONFIG.SYS
FILES=30
LASTDRIVE=H
BREAK=OFF
SHELL=\COMMAND.COM /P
DEVICE=A:\WINDOWS\HIMEM.SYS
DEVICE=A:\WINDOWS\EMM386.EXE /P=256 /UMB
DEVICE=A:\DOS\KKCFUNC.SYS
DEVICE=A:\DOS\NECAIK1.DRV
DEVICE=A:\DOS\NECAIK2.DRV /R NECAI.SYS
DEVICE=A:\DOS\RAMDISK.SYS 4096 /E
DEVICE=A:\PLUGPLAY\DRIVERS\DOS\DWCFGMG.SYS
DEVICE=A:\DOS\NECCD.SYS /D:CD_101
DOS=HIGH,UMB
AUTOEXEC.BAT
PATH A:\DOS;A:\WINDOWS
SET TEMP=A:\WINDOWS\TEMP
SET DOSDIR=A:\DOS
A:\DOS\MSCDEX /E /D:CD_101 /L:H
この時の実行可能プログラムサイズは535KBでした。(ちなみにUMBメモリの総容量は36KB。)
○EMM386 + デバイスドライバをUMBメモリに移す
デバイスドライバはDEVICEHIGHコマンド、常駐プログラムはLH(LOADHIGH)コマンドを使うことでUMBメモリに移すことができます。ただしNECAIK1.DRVなどの一部のデバイスドライバはUMBに移すことができません。
CONFIG.SYS
FILES=30
LASTDRIVE=H
BREAK=OFF
SHELL=\COMMAND.COM /P
DEVICE=A:\WINDOWS\HIMEM.SYS
DEVICE=A:\WINDOWS\EMM386.EXE /P=256 /UMB
DEVICEHIGH=A:\DOS\KKCFUNC.SYS
DEVICE=A:\DOS\NECAIK1.DRV
DEVICE=A:\DOS\NECAIK2.DRV /R NECAI.SYS
DEVICEHIGH=A:\DOS\RAMDISK.SYS 4096 /E
DEVICE=A:\PLUGPLAY\DRIVERS\DOS\DWCFGMG.SYS
DEVICEHIGH=A:\DOS\NECCD.SYS /D:CD_101
DOS=HIGH,UMB
AUTOEXEC.BAT
PATH A:\DOS;A:\WINDOWS
SET TEMP=A:\WINDOWS\TEMP
SET DOSDIR=A:\DOS
LH A:\DOS\MSCDEX /E /D:CD_101 /L:H
この時の実行可能プログラムサイズは556KBでした。約20KB分のプログラムがUMBメモリに移った計算になります。これとDEVICEHIGHやLHコマンドで指定したプログラムの合計サイズが釣り合わないことから、一部のプログラムはUMBに収まりきらず、コンベンショナルメモリを消費していることがわかります。
○メモリ管理ドライバにVEM486を利用
フリーのメモリ管理ドライバ・ソフト「VEM486」を利用します。HIMEM.SYSやEMM386.EXEはそれ自身がコンベンショナルメモリを消費するのに対し、VEM486はUMBメモリに常駐するため、その分だけコンベンショナルメモリを空けることができます。また、BIOS ROM(ROM BASIC)の一部の領域 約40KBほどをUMBメモリとして利用できます。
FILES=30
LASTDRIVE=H
BREAK=OFF
SHELL=\COMMAND.COM /P
DEVICE=A:\VEM\VEM486.EXE /U
DEVICEHIGH=A:\DOS\KKCFUNC.SYS
DEVICE=A:\DOS\NECAIK1.DRV
DEVICE=A:\DOS\NECAIK2.DRV /R NECAI.SYS
DEVICEHIGH=A:\DOS\RAMDISK.SYS 4096 /E
DEVICE=A:\PLUGPLAY\DRIVERS\DOS\DWCFGMG.SYS
DEVICEHIGH=A:\DOS\NECCD.SYS /D:CD_101
DOS=HIGH,UMB
この時の実行可能プログラムサイズは578KB。UMBメモリの総容量はなんと83KBもありました。そのうちUMBの空き容量が30KBほどあるので、まだまだデバイスドライバや常駐プログラムが入りそうです。以下はMEM /Cコマンドの出力です。
コンベンショナルメモリ : 名前 サイズ(10進数) サイズ(16進数) ------------- --------------------- ------------- MSDOS 45792 ( 44.7K) B2E0 NECAIK1 7040 ( 6.9K) 1B80 NECAIK2 272 ( 0.3K) 110 DWCFGMG 3072 ( 3.0K) C00 COMMAND 2896 ( 2.8K) B50 フリー 64 ( 0.1K) 40 フリー 592704 (578.8K) 90B40 全フリーメモリ : 592768 (578.9K) アッパーメモリ : 名前 サイズ(10進数) サイズ(16進数) ------------- --------------------- ------------- システム 221440 (216.3K) 36100 KKCFUNC 4128 ( 4.0K) 1020 RAMDISK 2080 ( 2.0K) 820 NECCD 17616 ( 17.2K) 44D0 MSCDEX 15696 ( 15.3K) 3D50 フリー 144 ( 0.1K) 90 フリー 12064 ( 11.8K) 2F20 フリー 8816 ( 8.6K) 2270 フリー 8128 ( 7.9K) 1FC0 フリー 16832 ( 16.4K) 41C0 全フリーメモリ : 45984 ( 44.9K) プログラムへの使用可能全バイト数(コンベンショナル+アッパー) : 638752 (623.8K) 実行可能プログラム最大サイズ : 592560 (578.7K) 使用可能最大アッパーメモリブロック : 16832 ( 16.4K) 14352384 バイト : 全 EMSメモリ 9879552 バイト : 使用可能 EMSメモリ 14680064 バイト : 全エクステンドメモリ 9879552 バイト : 使用可能エクステンドメモリ 9879552 バイト : 使用可能 XMSメモリ MS-DOS は, ハイメモリ領域に常駐しています.
○VEM486 + UMBメモリの領域を手動で設定する
UMBメモリは本来はシステム予約領域である部分からメモリ管理ドライバが未使用領域を探し出して、それをプロテクトメモリの一部分のミラーとして割り当てています。しかし未使用領域がはっきりしているのであれば、ユーザーが直接UMBメモリの領域を指定することでより多くのUMBメモリを確保できます。
PC98のメモリマップはこのようになっています。このうち、空き領域と拡張ROM領域、システムROMの一部の領域をUMBメモリとして使用できます。拡張ROM領域については機種や実装している拡張ボードによってどの領域を使用しているかは異なるので、マニュアル等で確認・把握する必要があります。PC-9821Xn/Xp/Xs/Xeでは次のようになっています。
(引用元:『PC-9821Xn/Xp/Xs/Xe 98MATE GUIDE BOOK』、日本電気株式会社、1994年)
他にSCSIインターフェースボードなどの拡張ボードを実装している場合はそのボードが利用するROMアドレスを確認する必要があります。プラグアンドプレイ(PnP)に対応するボードならPnP コンフィグレーション ユーティリティからボードが使用するROMアドレスを確認できます。
これらの情報から、この例の環境の上位メモリのメモリマップは次のようになります。
アドレス | サイズ | 種別 | 割り当て | 説明 |
0xA0000 - 0xA4FFF | 20KB | サブRAM | システム | テキストVRAM等 |
0xA5000 - 0xA7FFF | 12KB | (予約) | (空き) | 空き(UMB領域として使用可能) |
0xA8000 - 0xBFFFF | 96KB | サブRAM | システム | グラフィックVRAM |
0xC0000 - 0xCFFFF | 64KB | ROM(予約) | (空き) | 空き(仮想EMSページフレームとして使用) |
0xD0000 - 0xD7FFF | 32KB | ROM(予約) | (空き) | 空き(UMB領域として使用可能) |
0xD8000 - 0xDBFFF | 16KB | ROM | システム | 内蔵固定ディスク I/F BIOS |
0xDC000 - 0xDDFFF | 8KB | ROM | 拡張ボード | MELCO IFC-NN(SCSI I/F BIOS) |
0xDE000 - 0xDFFFF | 8KB | ROM(予約) | (空き) | 空き(UMB領域として使用可能) |
0xE0000 - 0xE7FFF | 32KB | サブRAM | システム | グラフィックVRAM |
0xE8000 - 0xF3FFF | 48KB | ROM | システム | ROM BASIC(通常はUMB領域として使用可能) |
0xF4000 - 0xFFFFF | 48KB | ROM | システム | BIOS |
0xE8000 - 0xF3FFFはEMM386.EXEでHIGHSCANスイッチを指定したときにUMBメモリとして利用できる範囲で、通常のMS-DOSアプリケーションは問題なく動作します。ただし一部のアプリケーションはROM BASICのルーチンを使用することがあり、それらが動作しなくなることがあります。
以上を踏まえるとCONFIG.SYSでVEM486に次のようにパラメータを指定します。
この時の実行可能プログラムサイズは578KBと変化なし。UMBメモリの総容量は99KBに増えました。まだまだUMBに空きがあるため、UMBに移動できるデバイスドライバを全て移動させた後もUMBメモリが余っている状態であることが予想できます。
○UMBメモリ100KBオーバー
せっかくなのでSCSIボードを取り外してUMBメモリ100KB超えに挑戦してみました。下はMSD.EXE(Microsoft 診断プログラム)で上位メモリのメモリマップを表示したところです。
日本語入力ドライバ、RAMディスクドライバ、CD-ROMドライバ、MSCDEX、PnPコンフィグレーションマネージャを組み込んだ状態でありながら、これだけのメモリを確保することができました。UMBメモリは68KBも余っています。
○フリーエリア600KBオーバー
前に書いたように、一部のデバイスドライバはUMBメモリに移動できません。そういった類のデバイスドライバはEMSメモリを使用するようになっています。しかしEMSメモリの管理の仕組み上、プログラムの全てをEMSメモリに移すことはできず、幾らかはコンベンショナルメモリを消費することになります。そのため、これ以上CONFIG.SYSの最適化で実行可能プログラムサイズを増やすことはできません。
そこで、コンベンショナルメモリを使用するドライバ(NECAIK1.DRV、NECAIK2.DRV、DWCFGMG.SYS)を外して実行可能プログラムサイズ600KB超えに挑戦してみました。RAMディスクドライバ、CD-ROMドライバ、MSCDEXは組み込んだままです。VEM486は標準設定で組み込んでいます。
コメントありがとうございます。お役に立ててもらえたようで何よりです。こういった反応があるととても嬉しいですし、書いた甲斐があったものです。
PC98について仕様(うわべ)だけをまとめたサイトや技術的なことをまとめた上級者向けのサイトはちょこちょこあるのですが、MS-DOSの活用術など実用的なことをまとめた中級者向けの情報はあまりありません。
例えば、PC98の本体で記憶する設定にはディップスイッチの他にメモリスイッチがあります。この設定が狂うとメインメモリの認識容量が減ったり、テキスト画面が緑色になったり、ディスクブートができなくなったりします。しかし、メモリスイッチについて詳しく触れたサイトはありませんでした。
今回のCONFIG.SYSやAUTOEXEC.BATの最適化術にしたってそうです。
今後も気が向いたらそういったことを書いていこうと思いますので、よろしくお願いします。
いつかLifeTouchNOTE版MSDOS活用術もお願いできたら…