Diary on wind

おもにパソコン関係、その他日常の戯言などなど

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

2011-11-29 06:31:58 | 古いPC関係

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

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

@ECHO OFF
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

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は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においてフリーエリアを極限まで確保する

ジャンル:
OS
キーワード
デバイスドライバ メモリ管理 拡張ボード エクステンド コンフィグレーション 日本語入力 固定ディスク プロテクトメモリ 日本電気株式会社 プラグアンドプレイ
コメント (3) |  この記事についてブログを書く
Messenger この記事をはてなブックマークに追加 mixiチェック
« ロックアウト機能... | トップ | PC98のMS-DOSにお... »

3 コメント

コメント日が  古い順  |   新しい順
Unknown (Unknown)
2012-07-24 10:12:08
スマートブックのLifeTouchをnp2で98note専用機並?に使っていますので、こちらのサイト相当に重宝しています。PCもメインの用事は98環境に移行中…なのです。
コメントありがとうございます。 (kari)
2012-07-29 01:14:49
>>Unknown(名無し)さん
コメントありがとうございます。お役に立ててもらえたようで何よりです。こういった反応があるととても嬉しいですし、書いた甲斐があったものです。

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

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

コメントを投稿


コメント利用規約に同意の上コメント投稿を行ってください。
※文字化け等の原因になりますので、顔文字の利用はお控えください。
下記数字4桁を入力し、投稿ボタンを押してください。この数字を読み取っていただくことで自動化されたプログラムによる投稿でないことを確認させていただいております。
数字4桁

トラックバック

現在、トラックバックを受け取らないよう設定されております。
※ブログ管理者のみ、編集画面で設定の変更が可能です。

あわせて読む