PC98のMS-DOSにおいてフリーエリアを確保する

NEC PC-9800シリーズ上のMS-DOSにおける実行可能プログラムサイズ、いわゆるフリーエリアを極限まで確保しようという試み。
いい加減この手の話題(→古い環境の話)はやめようと思っていましたが、予想以上に需要があるので、今後も暇と機会と必要性があれば書いていこうと思います。

MS-DOSのメモリ利用を手動で徹底的に最適化するには(今では使われなくなった)様々な知識が必要で、それだけで本1冊ができ上がるほどになります。なのでここでは具体例を挙げて簡単にまとめるだけに留めておきます。

実行可能プログラムサイズ(コンベンショナルメモリ)を空けるだけなら何も余分なデバイスドライバを入れないのが一番です。でもそれではつまらないので、今回は日本語入力ドライバ(NECAI)、RAMディスクドライバ(RAMDISK)、CD-ROMドライバを組み込んだオールラウンドな環境を構築しようと思います。

使用OSはMS-DOS Ver.5.0A-H。なお、CPUが80386またはそれ以降でかつ1.6MB以上のメモリを搭載していて、OSがMS-DOS Ver.5.0以降であることが最小必要条件です。(CPUとメモリについてはPC-9821シリーズの全ての機種が条件を満たしています。)

○最適化前

最適化する前のCONFIG.SYSとAUTOEXEC.BAT。DEVICEHIGHコマンドを使わない(デバイスドライバをUMBに移さない)場合。

CONFIG.SYS

BUFFERS=20 ←ディスクキャッシュのサイズ(クラスタ数)
FILES=30 ←同時オープン可能なファイルハンドルの数
LASTDRIVE=H ←アクセス可能なドライブの最大数[A-Z](前もって確保するドライブアクセス用メモリの数)
BREAK=OFF ←コマンドインタープリターによるCtrl+Cキーのチェック機能
SHELL=\COMMAND.COM /P ←コマンドインタープリターの場所
DEVICE=A:\WINDOWS\HIMEM.SYS ←拡張メモリ(プロテクトメモリ)を管理するためのドライバ
DEVICE=A:\WINDOWS\EMM386.EXE /P=256 /UMB ←拡張メモリを使ってEMSメモリをエミュレートするドライバ
DEVICE=A:\DOS\KKCFUNC.SYS ←MS-DOS標準仕様のかな漢字変換システム制御機能をサポートするためのドライバ
DEVICE=A:\DOS\NECAIK1.DRV ←NEC AIかな漢字変換ドライバ
DEVICE=A:\DOS\NECAIK2.DRV /R NECAI.SYS ←NEC AIかな漢字変換ドライバ
DEVICE=A:\DOS\RAMDISK.SYS 4096 /E ←EMSメモリの一部をRAMDISKとして利用するためのドライバ
DEVICE=A:\PLUGPLAY\DRIVERS\DOS\DWCFGMG.SYS ←プラグアンドプレイ機能を管理するためのドライバ
DEVICE=A:\DOS\NECCD.SYS /D:CD_101 ←CD-ROMドライブのドライバ
DOS=HIGH,UMB ←HMA、UMBを有効にする

AUTOEXEC.BAT

@ECHO OFF ←今後実行するコマンドの内容を標準出力にエコーしない
PATH A:\DOS;A:\WINDOWS ←環境パスを設定
SET TEMP=A:\WINDOWS\TEMP ←環境変数TEMPを設定
SET DOSDIR=A:\DOS ←環境変数DOSDIRを設定
A:\DOS\MSCDEX /E /D:CD_101 /L:H ←MS-DOS標準仕様のCD-ROM拡張機能をサポートするためのドライバ

この時の実行可能プログラムサイズは535KBでした。(ちなみにUMBメモリの総容量は36KB。)

○EMM386 + デバイスドライバをUMBメモリに移す

デバイスドライバはDEVICEHIGHコマンド、常駐プログラムはLH(LOADHIGH)コマンドを使うことでUMBメモリに移すことができます。ただしNECAIK1.DRVなどの一部のデバイスドライバはUMBに移すことができません。DOS起動時にUMBに移せなかったドライバは自動でコンベンショナルメモリに確保されます。

CONFIG.SYS

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

@ECHO OFF
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メモリとして利用できます。

BUFFERS=20
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では次のようになっています。

割り込みレベル・DMAチャネル・ROMアドレス空間
(引用元:『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はMS-DOS 6.2のEMM386.EXEでHIGHSCANスイッチを指定したときにUMBメモリとして利用できる範囲で、通常のMS-DOSアプリケーションは問題なく動作します。ただし一部のアプリケーションはROM BASICのルーチンを使用することがあり、それらが動作しなくなることがあります。

以上を踏まえるとCONFIG.SYSでVEM486に次のようにパラメータを指定します。

DEVICE=A:\VEM\VEM486.EXE /U=A5-A7,D0-D7,DE-DF,E8-F3

この時の実行可能プログラムサイズは578KBと変化なし。UMBメモリの総容量は99KBに増えました。まだまだUMBに空きがあるため、UMBに移動できるデバイスドライバを全て移動させた後もUMBメモリが余っている状態であることが予想できます。

○UMBメモリ100KBオーバー

せっかくなのでSCSIボードを取り外してUMBメモリ100KB超えに挑戦してみました。下はMSD.EXE(Microsoft 診断プログラム)で上位メモリのメモリマップを表示したところです。
MSD
日本語入力ドライバ、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は標準設定で組み込んでいます。
MSD

まだまだ続く。→PC98のMS-DOSにおいてフリーエリアを極限まで確保する

○コンベンショナルメモリ占有量削減のポイント

○関連記事

[EOF]


旧ブログでのコメント

AUTHOR: Unknown
URL:
DATE: 07/24/2012 10:12:08
Unknown
スマートブックのLifeTouchをnp2で98note専用機並?に使っていますので、こちらのサイト相当に重宝しています。PCもメインの用事は98環境に移行中…なのです。

AUTHOR: kari
URL:
DATE: 07/29/2012 01:14:49
コメントありがとうございます。
>>Unknown(名無し)さん
コメントありがとうございます。お役に立ててもらえたようで何よりです。こういった反応があるととても嬉しいですし、書いた甲斐があったものです。

PC98について仕様(うわべ)だけをまとめたサイトや技術的なことをまとめた上級者向けのサイトはちょこちょこあるのですが、MS-DOSの活用術など実用的なことをまとめた中級者向けの情報はあまりありません。
例えば、PC98の本体で記憶する設定にはディップスイッチの他にメモリスイッチがあります。この設定が狂うとメインメモリの認識容量が減ったり、テキスト画面が緑色になったり、ディスクブートができなくなったりします。しかし、メモリスイッチについて詳しく触れたサイトはありませんでした。
今回のCONFIG.SYSやAUTOEXEC.BATの最適化術にしたってそうです。

今後も気が向いたらそういったことを書いていこうと思いますので、よろしくお願いします。

AUTHOR: chappe
URL:
DATE: 08/10/2012 16:48:21
すごく役立っています!
ありがとうございます。こちらのサイト、本当に初心者の私にとっては重宝です。日本語をライフタッチノート(アンドロイド)でタイプしていますと、変換の順序が逆になったりと変で、これは入力情報がキャッシュに拾われてるからかも、と不安になりました。漏洩してる感じでしたので、エミュレータ上での活用を思いつきました。テキスト主体なら98環境でVZがあったはず!…と。それにマルチウインドウ(二画面表示)が可能なため、アンドロイドのアプリより遙かに快適な感じがします。設定とか難しいことがわかりませんでしたが、こちらのお手本で助けていただきました。本当に有り難く感謝いたします。
いつかLifeTouchNOTE版MSDOS活用術もお願いできたら…

AUTHOR: K
URL:
DATE: 07/28/2013 00:30:38
DOS3.3D
5.0A-HでDOSゲームが実行できず
3.3Dで実行しようとしているのですが
「プログラムが大きすぎてメモリに入りません」と出てしまいます。
コンベンショナルメモリ不足だと思いますが
3.3での情報不足で空け方がわかりません。

現在は、Config.sysにfilesとbuffersを設定しているだけです。

ご教授いただければ幸いです。

AUTHOR: kari
URL:
DATE: 07/29/2013 00:01:28
Re: DOS3.3D
>>Kさん
こんにちは。
お使いの機種は何ですか。使用するソフトウェアが必要とするシステム(機種、DOSのバージョン、コンベンショナルメモリ、EMSメモリなど)は何ですか。

親切な市販ソフトならマニュアルや補足テキストにメモリ確保のためのヒントが書いてあったりしますが。
とにかく、単純にコンベンショナルメモリさえ確保できれば良いということなら、
DOS3.3ならCONFIG.SYSに何も記述しない状態で約550KBが最大です。
DOS5.0の場合はCONFIG.SYSに何も記述しない状態だと535KB、DOS6.2ではさらに少なくなります。
DOS5.0以降にはプロテクトメモリにHMAという領域を確保してそこにDOSシステムの一部を移動させる機能があり、これによってコンベンショナルメモリを55KBほど空けることができます。
HMAを使うにはCONFIG.SYSに以下の2行を加えます。
DEVICE=\DOS\HIMEM.SYS
DOS=HIGH
または、CUSTOMコマンドでXMSメモリを有効に設定すれば自動でHMAも有効になります。

コンベンショナルメモリの空きサイズを確認するには、DOS3.3以前ではCHKDSKコマンド、DOS5.0以降ではMEMコマンドも使えます。

AUTHOR: K
URL:
DATE: 07/29/2013 23:18:29
Unknown
kariさん

ご返事ありがとうございます。
できればDOS5.0A-Hでやりたいので、その前提でご助言いただけると助かります。

【マシン】
 DA2+外付けFDD+86音源+SCSIボード+MOドライブ
 512K+92168K
 CPU:Cx486DLC
 コプロ:CX-83D87-25-GP

kariさんの次ページの方法で試してみて
コンベンショナルメモリが486.3Kとなっています。

良く考えると起動時のメモリチェックが
512Kですが640Kで表示されるのが正しいですよね?
これが原因でしょうか・・・?

よろしくお願いします。

AUTHOR: kari
URL:
DATE: 07/30/2013 01:20:57
Re: DOS3.3D [2]
「xxx KB + yyyy KB OK」 のxxxKBがコンベンショナルメモリのサイズ、yyyyKBがプロテクトメモリのサイズになります。
PC-9801DAは標準で640KBのコンベンショナルメモリを搭載しているはずなので、640KBにならない場合はメモリスイッチの設定が狂っている可能性があります。(まれに意図的に変更する場合もあります。)

MS-DOSのSWITCHコマンドで設定を変えるか、本体前面のディップスイッチ3をOFFにしてメモリスイッチの設定を初期化して下さい。
起動時に「640 KB + yyyy KB OK」 と表示されれば正常です。
「MEMORY ERROR 080000FEFE」が表示される場合は、システムセットアップメニューからSW3-6をOFFに設定します。
このことはPC-9801DAガイドブックにも記載されています。

AUTHOR: K
URL:
DATE: 07/30/2013 22:23:20
Re: DOS3.3D [3]
kariさん

ご指定の方法で640KBになり、ゲームも起動できました。
メモリスイッチだけではダメなんですね・・。
ありがとうございます!


QLOOK ANALYTICS