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
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
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
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はMS-DOS 6.2の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においてフリーエリアを極限まで確保する
○コンベンショナルメモリ占有量削減のポイント
- その時必要なプログラムだけを組み込む → 例えばCD-ROMを使わない時はCD-ROMドライバやMSCDEXの行をREMでコメント化しておく。基本中の基本。
- HMAを有効にする → MS-DOS実行部のコンベンショナルメモリ使用量を削減。
- EMSを有効にする → EMSに対応するデバイスドライバ・常駐プログラムはコンベンショナルメモリ使用量を削減できる場合がある。(EMS使用のスイッチが必要な場合がある。例えばMSCDEXの場合は/Eを指定することでバッファをEMSから確保する。)
- DEVICEHIGH(CONFIG.SYS)、LH(AUTOEXEC.BAT)を使う → UMBに格納可能なデバイスドライバ・常駐プログラムをコンベンショナルメモリからUMBに移動できる。
- UMBの領域を手動で指定する → 自動で検出する場合よりも多くのUMBメモリを確保できる。ただし、システム構成やハードウェアについて熟知している必要がある。設定を誤ればシステムの不安定化を招く。
- 拡張ボードのROMアドレスを無効化または変更する → メモリ空間を使用する拡張ボードは必要時以外は取り外すかリソースを切り離す。例えばPC-9801-86のサウンドBIOSを使うソフトウェアは少ないので、普段はそれをディップスイッチで無効にしておく、など。やむを得ずメモリ空間を使用する拡張ボードを使う場合は、可能ならUMBを分断しないようにROMアドレスを変更する。
○関連記事
- CONFIG.SYSのコマンドと特殊な環境変数 [DOS]
CONFIG.SYSで設定可能な内容や各コマンドの意味はこちらを参照。内容は主にIBM PC互換機を対象としているが、ほとんど機種共通の仕様なのでPC98についてもほぼ同様である。 - MS-DOSの標準デバイスドライバについて [PC98]
PC-98版MS-DOSに標準で用意されているドライバおよび指定可能なスイッチの情報はこちらを参照。 - NEC PC98のメモリマップと割り込み
PC-98の標準的なシステムのメモリマップおよびNEC純正拡張ボードが使用するメモリアドレスや割り込みリソースの一覧。リソースの空きを探すときの参考に。 - MS-DOS 6.2/Vにおいてフリーメモリを確保する
こちらはPC/AT互換機のMS-DOS 6.2/Vを対象にしていますが、テクニック自体はPC98でやっていることに共通します。
[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になり、ゲームも起動できました。
メモリスイッチだけではダメなんですね・・。
ありがとうございます!