はじめに
大原雄介さんがASCII.jpに連載されている「ロードマップでわかる!当世プロセッサー事情」のうち、最近掲載された以下の2本の記事を読んでみたところ気になる点がありました:
- 第402回 業界に痕跡を残して消えたメーカー MS-DOS誕生のきっかけとなったOS「CP/M」を生みだしたDigital Research
- 第403回 業界に痕跡を残して消えたメーカー メモリー領域確保で世話になった「QEMM」のQuarterDeck
今回はそのことについて書いてみたいと思います。
第402回について
この回はDigital Research社のCP/M関連の話題です。歴史的背景については私はあまり詳しくないので面白く読まさせていただきました。ただ、以下の部分はいただけません:
CP/Mがブートすると、BDOS/BIOS/CCPが全部メモリーにロードされるが、そこからアプリケーションを起動する際にメモリー中に残るのはBIOSだけである。アプリケーションはBIOSを経由して、FDDを含む周辺機器にアクセス可能である。
そしてアプリケーションが終了すると、もう一度メモリーにBDOSとCCPを再ロードする。この再ロードの仕組みをリブートと称した形だ。これにより、利用可能メモリー量を最大限に確保することが可能になっていた。
8ビット版のCP/MにおけるBDOS、BIOS、CCPが起動時にメモリーにロードされるのは正しいのですが、アプリケーションを起動する際にメモリー中に残るのはBIOSだけではなくBDOSも残ります。また、CP/MアプリケーションはBDOSコール(0005h
をCALL
する:CD 05 00
)することで動作するものです。
CP/MのBIOSはローレベル(Low-level)の入出力を担うもので、ファイルの入出力といった機能を提供するものではありません※1。アプリケーションは当然ファイルの入出力を行いたいわけですから、BDOSを呼び出すわけです※2。
そのBDOSがアプリケーションの実行中にメモリーに残らないのでは何のためのBDOSでしょう? CP/MのBDOSがCCPとアプリケーションを読むだけに存在することになってしまいます。各種ファンクションは一体何のためにあるでしょうか?
ということからわかるように、アプリケーションがCP/Mを使う理由はファイルを扱う部分に集約されているのですから、当然これの説明は誤りです。
英語版のWikipediaでも、この仕組みについては言及があります:
Components of the operating system
In the 8-bit versions, while running, the CP/M operating system loaded into memory had three components:
- Basic Input/Output System or BIOS,
- Basic Disk Operating System or BDOS,
- Console Command Processor or CCP.
The BIOS and BDOS were memory-resident, while the CCP was memory-resident unless overwritten by an application, in which case it was automatically reloaded after the application finished running.
(以下、筆者による日本語意訳)
オペレーティング・システムのコンポーネント
8ビット・バージョンにおいては、CP/Mオペレーティング・システムはメモリー上に3つのコンポーネントをロードして動作します:
- Basic Input/Output System つまり BIOS,
- Basic Disk Operating System つまり BDOS,
- Console Command Processor つまり CCP.
BIOSとBDOSはメモリーに常駐します。一方でCCPはメモリーに常駐するものの、アプリケーションによって上書きされた場合には、アプリケーションの実行終了後に自動的にリロードされます。
英語版WikipediaのCP/M – Components of the operating systemより引用
(2017年5月23日23時現在)
そのうえで、CP/Mにはメモリーを最大限使うための仕組みとしてBDOS部分を含めてアプリケーションで使うことができるという仕組みも用意されています。これが「リブート」というCP/Mへの「復帰方法」ではあるのですが、アプリケーションの実行時点ではBIOSおよびBDOS、CCPが有効な形でメモリーに残存しています。なぜなら起動時点でそのアプリケーションがリブートという仕組みを使用するかどうかは予想できる仕組みとなっていないからです。アプリケーションはBDOSが不要になるまではBDOSを破壊せずに使用し、不要になればBDOSの存在した領域を独自に使用し、最終的にCP/Mへ復帰するために「リブート」を使用するという選択肢を持つことができるというものでした。決して、アプリケーションの実行開始時にBDOSが存在しないという状態にはなっていません。
これらの意味するところをまとめると、
- BIOSとBDOSはアプリケーションとは扱いの異なるメモリーに常駐する※3。
- CCPもメモリーに常駐するが、アプリケーションの領域内に置かれているため、アプリケーションのメモリーの使い方によっては破壊されてしまう。破壊された場合にはアプリケーションからCP/Mのシステムに制御が戻った際に、再度メモリー上にロードし直す。
- BDOSの存在するメモリー領域をアプリケーションで使用する場合には、CP/Mを再度起動して復帰する「リブート」という仕組みは存在したが、これはオプション的な選択肢であり、アプリケーションの起動時に「BDOS」が存在しないという状況はない。
ということになります。
これらのうち、CCPに関する部分についてはMS-DOSやMSX-DOSにおけるCOMMAND.COM
と似た挙動です※4。
第403回について
この回はMS-DOS上のソフトウェアを出していたQuarterdeck社の話題です。同社のソフトウェアは日本でメジャーであったPC-9800シリーズ用のソフトウェアではなかったこともあり、私はあまり同社については知らないので興味深く読みました。この会社はMS-DOS用のメモリー管理ソフトウェアや機能を拡張するソフトウェアをリリースしていた関係で、それにまつわる技術的な話が出てきますが、やはりいくつか気になる点があります。
1つ目はメモリーの640 KB制限にまつわる話です:
これはMS-DOSが640KBしかプログラムにメモリーを提供しない、という制限が諸悪の根源だったわけだが、その制限を緩和すべくいろいろな方策が考え出されており、QuarterDeckもこうした方面の製品を投入し始める。
ASCII.jp:業界に痕跡を残して消えたメーカー メモリー領域確保で世話になった「QEMM」のQuarterDeck (1/3)|ロードマップでわかる!当世プロセッサー事情より引用
MS-DOS自体は1 MBのメモリーを提供しうる機能を持っています※5。640 KBに制限されるのはマシン側の制限であり、MS-DOSが640 KB制限の「諸悪の根源」としてしまうのはややミスリードであろうと考えます。
例えば、日本でも640 KBを超えてメモリーを提供できるマシンがありました:
これはNEC(日本電気)のPC-H98 model 90のハイレゾモード(ハイレゾリューションモード)でMS-DOS 5.0A-HをCONFIG.SYS
に何も組み込まずに起動させ、メモリー・マップを出力して撮影したものです※6。このように640 KBの容量を超えて768 KBのメモリーを提供しています※7。
さらに、以下の点は事実に反します:
ところが80286になると、メモリー空間が16MBまで拡張された。ただ互換性を考えると、MS-DOS自身は最初の1MBしか利用できない。そこでこれを回避する方法として、従来のメモリー空間の中に16KB×4の、ページフレームと呼ばれる領域を設け、このページフレームに1MBより上のアドレスをマッピングするという方法が標準化された。
ASCII.jp:業界に痕跡を残して消えたメーカー メモリー領域確保で世話になった「QEMM」のQuarterDeck (2/3)|ロードマップでわかる!当世プロセッサー事情より引用
EMSはプロテクト・メモリーを下位1 MBのメモリー空間に出現させるための規格ではありません。特定のセグメントにページ・フレームを出現させ、それを16 KB単位のページに分けてアプリケーションごとの要求に合わせて切り替えるという規格です※8。もちろん、プロテクト・メモリーから持ってきてもよいのですが、80286はそれ自身の機能だけではそれを実現させることはできません。CPU単体としてそれが可能になるのはページングをサポートする80386になってからです。
なお、PC-9800シリーズの一部で実現されるB0バンク※9EMSは80286向けのエミュレーションを行うための特殊な実装であり、B0バンクに対応したアプリケーション以外からは使用することができません。なぜならばアプリケーションは、B0バンクに本来存在するGVRAMとEMSを切り替えるために追加された専用のEMMファンクションを呼び出す必要があるからです。
また、当時はプロテクト・メモリー以外にEMS専用あるいは兼用のメモリー・ボード(例えば、日本の市場ではいわゆるCバス用のマルチファンクション・メモリー・ボード)が販売されており、これらのボードは一般に8086やV30以上をサポートしており、80286を必須とはしていません。このマルチファンクション対応のボードとしては、該当記事がまさに写真で掲載しているメルコ(現・バッファロー)のボード「EMJシリーズ」が該当します。
これは余談になりますが、LIM EMS 4.0ではページ・フレームは4ページ固定ではなくなっています。これよりも少ないことも、また多いこともあります。
続いての指摘ですが、EMSの容量について言及している以下の点は同規格に即していません:
これがEMS(Expanded Memory Specification)である。プログラムはEMSのドライバーに対してリクエストを出すことで、ページフレームがマッピングするアドレスを入れ替えることが可能で、これによって最大15MBものメモリー領域を利用可能だった。
ASCII.jp:業界に痕跡を残して消えたメーカー メモリー領域確保で世話になった「QEMM」のQuarterDeck (2/3)|ロードマップでわかる!当世プロセッサー事情より引用
これは80286のプロテクト・メモリーを活用するという誤った前提に基づいているために、「最大15MBものメモリー領域を利用可能」と結論を導き出してしまっているように思われます。
実際には、EMS 3.0では4 MB(?)※10、同3.2 では8 MB、LIM EMS 4.0では32 MBを上限と規定しています。これらの規格に15 MBを上限とするものはありません。
EMSについては英語版Wikipediaの「Expanded memory – Expanded Memory Specification (EMS)」項によくまとまっています。
余談ですが、これらの規格上の上限を超えたメモリー容量をサポートするEMSドライバー(EMM)も存在しています:
これはNECのPC-9821Xt/C10Wにメモリーを160 MB載せた状態でK.Ogino(荻野 晃史)さんによる「VEM486(Virtual XMS/EMS/VCPI Memory Server)」※11を動作させた状態でK-CRAFT(笠松 勝徳)さんによる「MS」でEMSの状態を表示させたものです。この表示によれば、LIM EMS 4.0の規格上の上限である32 MBの約2倍である約64 MBをサポートしていることがわかります。
さらに以下の点についても疑問符が付きます:
もっともEMSは、プログラムがメモリー管理を自分で行なわないといけない。あくまでもデータ領域として使えるだけで、プログラムの拡張には使えないなどいろいろ制限も多かった。
ASCII.jp:業界に痕跡を残して消えたメーカー メモリー領域確保で世話になった「QEMM」のQuarterDeck (2/3)|ロードマップでわかる!当世プロセッサー事情より引用
EMSのページ内にプログラムを入れておき、それをページ・フレームに出現させて実行することは問題なく行うことができます。特に日本では各種かな漢字変換システム(FEP : Front-End Processor)がこれを行っていました※12し、各種の著名な常駐プログラム、例えばかつて存在したビレッジセンターより販売されていたc.mos(兵藤嘉彦)さんによる「VZ Editor(製品にソース・コードが含まれる)」などがこれを行っています。
EMS 3.0では常駐プログラム(TSR : Terminate and Stay Resident program)やデバイス・ドライバーなどが安全にEMSを使うことが難しいという制限がありましたが、一般に広くいきわたった3.2以降であれば、「INT 67H 4700H: Save Mapping Context」および「INT 67H 4800H: Restore Mapping Context」があり、この制限もなくなっています。このあたりの事情を何か混同されているのでしょうか?あるいはXMSと混ざってしまっているのでしょうか…?
なお、最後に指摘をしておくと固有名詞である以上「QuarterDeck」ではなく「Quarterdeck」と書くべきだと考えます。
まとめ
この連載は週刊連載ということでファクトの確認までなかなか手が回らないのかもしれませんが、大原雄介さんは長い経歴を持ち、固定の読者(ファン)を多く抱える著名なライターであり、発信力と影響力はかなりのものがあります。それだけに、もう少し慎重に書いていただけることを当時を知る者の一人として願わずにはいられません。
2022年6月14日追記
CP/M関連の記述を一部変更しました。
- CP/MのBIOSが持つ機能については「CP/M information archive : BIOS(英語)」というページが詳しいです。
- CP/MのBDOSが持つ機能については「CP/M information archive : BDOS system calls(英語)」というページが詳しいです。
- 8080やZ80などの8ビットCPUはメモリー保護機能を持っていないため、あくまでも「規約」的に保護されているメモリーに置かれていることを意味します。
- 厳密に言えば、MS-DOSにおける
COMMAND.COM
は少量の常駐部とその他のアプリケーション領域に配置される部分に分けられ、アプリケーション領域に配置された部分が破壊された場合には再度メモリー上にロードし直すようになっています。 - それ以上のメモリーについてはOS/2がサポートしています。これを歴史(=当時の消費者)が選択しなかったことによってMS-DOSが引き続き居続けたわけであり、これをもってMS-DOSが「諸悪の根源」というのはいささか表現が過ぎるのではないかと筆者は感じます。
- いずれもMS-DOSが使用する分を含むメモリーの総量です。
- 出現させるメモリーはプロテクト・メモリーである必要はありません。ほかに搭載したメモリー(例えばEMS専用のメモリー)でもかまいません。
- 0BバンクあるいはBバンクとも呼ばれる、
0B000H
からのセグメントの領域を指します。 - これは正確ではない可能性があります。
- 荻野さんより直接メールにてお送りいただいた「Version 1.31β13」を現在でも使用しています。もしも荻野さんがこのメモをご覧になっていて、さらに新しいバージョンが存在し、それをご提供いただけるのであれば、ご連絡をいただけるととてもうれしく思います。
- 今でも同一の製品名が残っている「ATOK」も7の一部バージョンおよび8と9がそのように実装されています。なぜそのことを言い切れるのかというと、私がATOKPLUSというATOK6/7/8/9を30行BIOSとTT.comに対応させるための常駐ソフトウェアの作者であったことによります。