CP/M

CP/M（Control Program for Microcomputer、シーピーエム）は1970年代にデジタルリサーチ (Digital Research Inc.) の創業者ゲイリー・キルドールによって開発、1976年に発売された、パソコン用のシングルユーザー・シングルタスクのオペレーティングシステム (OS) である。 最初は8ビットのCPUであるインテルの8080プロセッサ用に作られ、8ビットのパソコン用OSとしては最も代表的な存在だった。初期に普及したバージョンはCP/M 1.4で、そののち改訂されたCP/M 2.2が広く普及した。さらに、より洗練されたCP/M 3.0 (CP/M Plus) が登場したが、既に16ビットマシンへの移行が始まっていた時期でもあり普及することはなかった。 他のプロセッサに移植されたバージョンも存在するが、単にCP/Mといえば8080プロセッサ用のもの（中でもバージョン2.2）を指す。なおマイクロソフトによってOEMされたIBMのPC DOS（及び、のちにマイクロソフト自らが直販したMS-DOS）は、CP/Mをモデルに開発されたシアトル・コンピュータ・プロダクツの86-DOS（後に "QDOS" と改名）を前身としている。 キルドールは、インテルからマイクロコンピュータ開発システム (MDS) 用の高級言語を受注。PL/I風に作られた8080用のシステム記述向け言語であるPL/M（Programming Language for Microcomputer、後のPL/M-80）コンパイラを開発した。 このPL/Mの動作環境として、キルドールがインテルに提案したフロッピーディスクベースのDOSがあった。これは採用されなかったため、後に自ら販売することにしたものがCP/Mである。インテルは後に8080/8085からの移行を支援するため、8086/8088用にPL/M-86を開発した。 CP/Mは8080マイクロプロセッサ（およびその上位互換CPU）、0番地から配置されたRAM（最小はCP/M 1.4で16KB）、最低1台の8インチフロッピーディスク装置、シリアル端末（CRTディスプレイとキーボード、あるいはASR-33のようなテレタイプ端末）があれば動作した。オプションとして、プリンタ、紙テープ読取装置・紙テープ穿孔装置、ハードディスク装置をサポートした。一般的には32KB以上、可能なら56KBくらいのRAMがあると、当時としては大規模なコンパイラなどが実行できた。 CP/Mは、シェルであるCCP (Console Command Processor)、OSの本体であるBDOS（ビードス、Basic Disk Operating System）、入出力を処理する下位プログラムの集合体であるBIOS（バイオス、Basic Input and Output System）で構成される。ハードウェア依存部分はBIOSに集中させてあるので、BIOSだけを変更することで大抵のハードウェアに移植可能となっていた。BIOSの機能はシステムの初期化、CCPのリブート（アプリ実行の終了とシェルの再起動）、コンソールなどのキャラクタデバイスのリダイレクト付入出力、フロッピーディスク/ハードディスク等の1セクタ単位の入出力だけである。 なお、BIOSという用語は一般化して普通名詞となり、PC/AT互換機の普及以降はROMに記録された低レベル入出力プログラムを指すことが多くなったが、CP/MにおけるBIOSは殆どの場合はディスクからメモリにロードされるものである。 CCPに内蔵されているコマンドをビルトインコマンド (built-in command) といい、次のようなものがある。 DIR REN TYPE それぞれ、MS-DOSの同名コマンドと同様。 ERA MS-DOSのDEL (ERASE)に相当。 SAVE アドレス0100hから、256バイトを1ページとして指定のページ数のメモリイメージをディスクに記録する。 USER ユーザ切り替え。主に、MP/Mでユーザごとに記録されたファイルを扱うために存在する。CP/M単独ではあまり意味がない。 これ以外はトランジェントコマンドに委ねている。 フロッピーディスクに実行ファイルとして記録されているコマンドをトランジェントコマンド (transient command)という。 次のようなものがある。 STAT ディスクやファイルのサイズを表示する、ファイルの保護属性を表示・変更する、デバイスのリダイレクト状況を表示・変更する、など様々なシステムの状態を表示・操作する。 PIP 周辺装置やディスクの間でファイルをコピーする(Peripheral Interchange Program)。DECのPDPシリーズのコマンドに由来する。 SUBMIT バッチファイルを実行する。 ED キャラクタ単位のラインエディタ。 ASM 8080用アブソリュートアセンブラ。 LOAD ASMの出力したオブジェクト（インテルHEXフォーマット）を.COMファイルに変換する。コマンド名から機能を連想しづらいことで有名。 DUMP ファイルの16進ダンプツール。アセンブリソースコードが添付されており、プログラミングのサンプルでもあった。特に、ASCIIダンプがついていなかったため、この機能を追加することは定番の改造だった。 DDT セルフ環境のデバッガ (Dynamic Debugging Tool)。殺虫剤のDDTにかけた命名である。 XSUB バッチ処理中にコンソール入力をファイルから取得する際にSUBMITと同時に用いる。CP/M 2.x以降に用意された。 MOVCPM CP/M自身の再配置ツール (move CP/M)。CP/M自身のコードは実装されたRAMの最上位に配置される。つまり、実装メモリが変わるとCP/M自身の配置を変更する必要があった。リロケータブルでない8080コードで書かれたBDOSとCCPを再配置するためのツールがMOVCPMである。各マシン向けのBIOS (Customized BIOS, CBIOS) はソースコードが供給されるのが普通だったので、インストールする人が自分で再アセンブルすることで必要なアドレスで実行できるバイナリを得られた。 パソコンメーカーが自社製品用に供給するCP/Mのパッケージには、上記以外にもフロッピーのフォーマットやコピー、ハードウェアの設定など独自コマンドが追加されていることが多かった。 なお、トランジェントコマンドがロードされるメモリ上の領域 (0100H - ) をTPA (Transient Program Area) と呼ぶ。 CP/Mは8ビットマイコン上で主要な地位を占めたため、CP/M環境で動作するプログラムが大量に発売されており、ソフトウェア開発用ソフトのみならず1バイト文字圏におけるビジネスソフトウェアも数多くあった。 ユーザ・コミュニティでのフリーソフトウェアの流通もあり、当時はPDSと呼ばれていた。当時は通信環境がまだ普及していなかったので、フロッピーによって配布するのが主流だった。CP/M UGなど、組織的にソフトの収集と配布を行なっていたユーザグループも存在した。 マイクロソフトは、当時OEM各社より発売していたマイコン用のスタンドアロンBASICとは別に、CP/M汎用のBASIC処理系としてM-BASICインタープリタ (MB80) およびコンパイラ (BASCOM) をリリースしていた。他に、マクロ機能付リロケータブルアセンブラMACRO-80やFORTRAN-80、COBOL-80なども製品ラインに存在した。 デジタルリサーチ自身は、PL/I-80、 CBASIC（ビジネス向きBASICコンパイラ）、MACとRMAC（マクロアセンブラとリロケータブル・マクロアセンブラ）、Pascal/MT+（これはMT Microsystemsから買収。Z80専用コードも生成できるコンパイラ。高速なオブジェクトコードを出力した）などを出荷した。 CP/M上でC言語の処理系として名高いものは、Leor ZolmanのBDS-C、Whitesmith、AZTEC、HITECHのCコンパイラ、日本のLSIジャパンのLSI-C80などがある。日本では、ライフボート（当時）とそのOEM供給を受けたシャープが、CP/M向けに安価な各種言語のパッケージを販売していたこともある。ラインアップとしては、FORTRAN、COBOL、LISP、LOGO、Prolog、BDS-C（サブセット）、Pascal、Forthなどが存在した。 また、統合開発環境という概念を打ち立てたボーランドのTurbo Pascalは、WordMasterライクなスクリーンエディタ、極めて高速なコンパイラと、リンカのすべてをわずか30KB程度の実行形式に組み込んで提供されていた。さらに販売価格も廉価に抑えられていたため、驚きの目で迎えられ一時代を築いた。これは以後のマイコン向け開発用ソフトウェアに影響を与え、同時にボーランド社の地位を確立した。 事務処理用のアプリケーションソフトとしては、WordStar（フルスクリーンワードプロセッサ）、WordMaster（フルスクリーンエディタ）、SuperCalc等があった。WordStar/WordMasterのカーソル移動キーバインドはダイヤモンドカーソルと呼ばれ、その使いやすさからCP/MやMS-DOSの多くのスクリーンエディタに受け継がれた。 CP/Mの特徴的な仕様の一つに、リブート（ウォームブート、ウォームスタート）がある。リブートとは、アプリケーションの終了、または^Cの入力により、ディスクからCCPとBDOSをロードし直してCCPのコマンドラインに戻ることをいう。他のOSのように、IPLから完全に再起動することを指すわけではない。 リブートは以下の場合に発生する。 CP/Mのアプリケーションは、終了してOSに戻るために、0番地にジャンプする (JMP 0)。 CCPのコマンドライン上、またはアプリケーションの動作中に、^Cを入力すると、任意にリブートすることができる。 ディスクI/Oでエラー（BDOSエラー）が発生した際に、Abort（中断）を選ぶとリブートする。 いずれの場合も最終的にBIOSの先頭にジャンプし、BIOSはドライブAのディスクのシステム領域からCCPとBDOSをメモリにロードし、CCPの先頭にジャンプする。これにより、CCPのコマンドラインに戻ることになる。リブートはCP/Mの使用中に頻繁に発生するので、ドライブAにはCCPとBDOSの入ったフロッピー（通常、CP/Mの起動フロッピー）を入れておく必要がある。 CCPとBDOSをロードするのは、アプリケーションによって破壊されている可能性があるためである。 アプリケーションの動作中にはCCPは不要なので、CP/MのアプリケーションはCCPのメモリ領域を食いつぶしてもよいことになっている。さらに、滅多に存在しないが、BDOSすら利用しないアプリケーションでは、BDOSも食いつぶしてよい。そのため、アプリケーションの終了時にはCCPとBDOSをロードする必要がある。ただし、小規模なアプリケーションでは、JMP 0でなく単にRET命令でCCPに直接戻るものもある。この場合はリブートは発生しない。なお、MS-DOSにおいても、COMMAND.COMの非常駐部の再ロードという、似たような機能がある。 このようにリブートとはCP/Mにおけるきわめて基本的かつ重要な動作であるが、一方で多くのユーザーにとっては苦い思い出を呼び起こす言葉でもある。 CP/Mでは、フロッピーの入れ替えを検出すると、前のフロッピーのデータを現在のフロッピーに書き込んでしまうことを避けるため、一時的にフロッピーをリードオンリー扱いとする。これはリブートにより解消される。すなわち、CP/Mでフロッピーを入れ替えるときは、アプリケーションが動作中であればまず終了し、フロッピーを入れ替えてから^Cを押さなければならない。これを怠って、リードオンリーになってしまっているフロッピーにデータを書き込もうとすると、BDOSエラーが発生し、リブートを余儀なくされ、データは失われる。この事態に見舞われる“よくある状況”としては、フロッピーの残り記録容量が足りないことに気付かずに作業をしている際が挙げられる。こうなると、もはや通常の操作ではその作業結果を残す方法がない。救済方法としては、一旦BDOSエラーを発生させ、saveコマンドで空ディスクにメモリイメージを記録し、サードパーティー製ディスク操作ソフトを使用してその記録内容のうちトランジェントコマンド部分を削除した上ディレクトリ情報を書き換える方法がある。これは推奨された使用方法からは大きく外れた事態であり、救済に失敗することもまれではない。 これはCP/Mの重大な問題点で、この事態に陥ったときに表示される"Bdos Err On x: $R/O"（x:はドライブレター）というメッセージは、PC-9800シリーズのMS-DOSの"Int trap halt"や、Windows 3.1の一般保護例外 (GPE)、Windows 95/NTの青画面、Classic Mac OSの爆弾マークと同様に、ユーザーを恐怖と絶望におとしいれた。 この問題は、後のPersonal CP/MやCP/M Plus、CP/M-86では改善されている。 後に、16ビットCPUであるインテル8086用のCP/M-86およびモトローラMC680x0用のCP/M-68K、またザイログZ8000用のCP/M-8000が作られた。これら16ビット版と区別するために、8080用のCP/MをCP/M-80と呼ぶようになった。 しかし、CP/M-86がIBM PCに公式採用されなかったこともあり、結局MS-DOS (PC DOS) に押されて16ビット以降の世界ではマイナーな存在に終わった。 面白い特徴としては、各々トランジェントコマンドの拡張子が異なっており（CP/M-80:.COM、CP/M-86:.CMD、CP/M-68K:.68Kなど）、同一のファイルシステム内で複数のアーキテクチャ用のCP/Mを混在させることが出来た。実際の製品としては、PC-9800シリーズ用のSPARKシリーズがあり、実行を指示されたコマンドを拡張子によって区別し、8086で動作するコマンドと、Z80で動作するコマンドを混用することが出来た。 CP/Mのシリーズには、他に、Personal CP/M (P-CP/M、CP/M Ver.2.8) や、複数のプログラムを同時に走らせることができるMP/M1.1やMP/M II、コンカレントCP/M(-86)というものも存在した。Linuxの仮想コンソールのように、画面を切り替えて使う。 日本電気 (NEC) のPC-8000シリーズ/PC-8800シリーズ、シャープのMZシリーズ/X1シリーズなど、Z80プロセッサ搭載の8ビットパソコンに移植されたCP/Mのパッケージが、ハードメーカーやサードパーティーから提供されていた。特にシャープ自ら供給したX1シリーズ用のものは完成度が高く、しかも安価だった。 NECのワープロ専用機、文豪ミニ5シリーズは、特定のキーを押しながら電源を入れるとCP/M-80が起動し、パソコンとして利用することができた。 ソニーのSMCシリーズのうち、SMC-777は、CP/M 1.4ベースのSONY FILERというOSを標準搭載した。SMC-70, SMC-70G は、別売りではあったが事実上、CP/M 2.2が標準OSとして利用されていた。 6809プロセッサを採用した富士通のFMシリーズでも、オプションのZ80ボードを搭載することでCP/Mが動作する。ワープロ専用機MY OASYSでも同等のボードが提供されていた。 シャープのMZ-2500にはPersonal CP/Mが提供されていた。国産機種でPersonal CP/Mが提供されていたものは他に例がない。 MSXに提供されたMSX-DOSは、外見はMS-DOS、中身はCP/MとでもいうべきOSで、CP/Mのソフトがおおむね動作した。 CP/M-86は、日本語化されたものが三菱電機MULTI 16、富士通FM-11EX/BS、FM-16β/πなどに標準採用された他、NECのPC-9800シリーズにも提供されていた。三菱電機とアスキーによるCP/M-86の日本語化の過程で三菱電機側の提案で策定されたのがシフトJISである。 68000プロセッサ用のCP/M-68Kは各社製パソコンに対応する68000搭載拡張CPUボード向けに提供された他、ソードの68000とZ80をデュアル搭載するM68およびシャープX68000に提供された。また、X68000の標準添付OSであるHuman68k上で動作するCP/M-68kエミュレータが2社から発売された。 一部機種には、CP/M PlusやコンカンレントCP/M-86も提供されていた。 日本でCD-ROMにて初めてCP/Mシリーズを提供していたのは、LASER 5であった。このCP/MはNEC PC-8801MC2等を使用して実機に導入可能なものである。 初期のMS-DOS/PC DOS（の前身であるシアトルコンピュータプロダクツの86-DOS）は、CP/Mをモデルとして設計されたため、さまざまな面で類似点が見られる。 ファイル名が8文字+3文字であり、拡張子でファイルの種類を区別する。実行可能ファイルの拡張子は.COMである。ワイルドカード「*」「?」がある。ワイルドカード自体はUNIX由来だが、CP/M、MS-DOSとも機能は大幅に簡略化されている。なお、CP/Mでは「ファイルマッチ」の名称を用いる。 ドライブレター、カレントドライブ、デバイス名などの概念がある。 コマンドプロンプトは「>」である（例: A>）。 DIR、REN、TYPEなどのビルトインコマンドがある。 ^Sで出力の一時停止、^Cでアプリケーションの中断、^Pでプリンタ出力の切り替えを行う。これもUNIX系のシェル環境由来の機能である。 CP/MのCCP、BDOS、BIOSの三層構造は、MS-DOSではCOMMAND.COM、MSDOS.SYS、IO.SYS（PC DOSではCOMMAND.COM、IBMDOS.COM、IBMBIO.COM）となる。 システムコールの機能や呼び出し方法、アプリケーションのメモリ配置、コマンドライン引数の渡し方などが酷似している。通常、MS-DOSでシステムコールを利用する場合には「INT 21H」のソフトウェア割り込みを利用するという大原則があるが、「CALL 5H」でもそのまま動作するようになっていた。アセンブラのソースファイルをMS-DOSへ転送後、レジスターの名称を置換するだけで動作するプログラムもある。 ファイルを削除すると、ディレクトリエントリの先頭バイトがE5Hになる。 このE5Hという値は、当時フロッピーを物理フォーマットする際に書き込まれた値に由来する。つまり、物理フォーマット後に論理フォーマットする必要がないように設計されている。ただし、MS-DOSの場合はFATやブートセクタを書き込む必要があるため、別途論理フォーマットが必須である。 一方で、以下のような相違点（改善点）もある。 CP/Mでファイルを削除するERA (ERASE) コマンドに相当するMS-DOSのコマンドは、DEL (DELETE) である。ただしERASEという別名も使用可能。 CP/MのDIRコマンドは、MS-DOSのDIR/Wに相当する出力形式しかない。ファイルの詳細を知るにはSTATコマンドを使う。 CP/MのRENコマンドは「REN 新ファイル名 = 旧ファイル名」と書き、さらにMS-DOSのそれとは引数の順序が逆である。 CP/MではファイルのコピーはトランジェントコマンドのPIPを必要としたが、MS-DOSでは内部コマンドのCOPYで行える。引数の順序もRENコマンドと同様に逆になる。 CP/Mでは前述したようなフロッピー入れ替えにまつわる問題があるが、MS-DOSではそのようなことはない。 CP/Mではバッチファイル(.SUB)の実行にはトランジェントコマンドのSUBMITを必要としたが、MS-DOSではCOMMAND.COM自身がバッチファイル実行機能を持っている。 CP/MではCCPなどのOS構成要素はディスク上の専用領域に格納されるが、MS-DOSのCOMMAND.COMなどは通常のファイルとして存在するため柔軟な管理が可能。 CP/MのディスクI/Oの基本単位は128バイトであり、ファイルサイズも128バイト単位である。これは、標準メディアが8インチ単密度フロッピー（セクタサイズ128バイト）だったことによる。一方、MS-DOSのディスクI/Oは128/256/512/1024バイトなどの単位で行え、ファイルサイズもバイト単位でとることができる。 CP/Mのファイルシステムではファイルの配置情報がディレクトリと一体化しており、大きなファイルがあるとディレクトリエントリをいくつも消費するという問題があったが、MS-DOSではFATとして独立している。 また、マイクロソフトがCP/M向けに出していたソフトでは、コマンドラインのスイッチはスラッシュで始まっており（例: M80 =FOO.MAC /R）、PC DOS/MS-DOS 1.xではこれがOS標準の書式として受け継がれた。 そのため、PC DOS/MS-DOS 2.xで階層ディレクトリを導入する際に、UNIXのようにパス名の区切りにスラッシュを使うことができず、バックスラッシュを使うことになった。 しかし、ASCIIのバックスラッシュはISO 646各国版で置き換えが認められており、たとえば日本のJIS X 0201では円記号になっているため、日本のPCではパス名の区切りが円記号で表示されることになった。 なお、これはコマンドラインに限った話であり、MS-DOSのシステムコールやWindows APIにパス名を渡す場合には、コマンドラインスイッチと混同するおそれがないため、区切りとしてスラッシュもバックスラッシュも受け付ける。 デジタルリサーチは1991年にノベルに買収され、さらにカルデラ（2002年SCOに改称）に売却された。現在CP/M資産は同社の子会社であるリネオが所持しており、その大半は同社の許諾を受けた「非公式なCP/Mサイト」からダウンロードすることが可能である。 現在、日本国内でのCP/Mの商標は技術少年出版が保有する。 ^ 通常のコールド・スタートに対してこう呼ばれるようになった。 ^ なお、国産機の多く（NEC PC等）は更に通常の電源断からの再起動を「コールドリスタート」、CP/Mのリブート相当の再起動を「ホットリスタート」とも呼ぶ。 ^ 伏見 (1982:11) ^ 伏見 (1982:13) ^ 伏見 (1982:13) ^ 伏見 (1982:19) 大方の概念について言及。 ^ この2者の用語はNEC PC-8801シリーズやPC-9801シリーズのリファレンスマニュアル等（機種によって構成が違う場合には名称も異なる場合があるので一概に文献名を記載し得ない）に明記されている。 ^ 伏見 (1982:120) ^ 株式会社技術少年出版 会社概要 伏見良隆、1982、『パソコンを使いこなすためのわかるCP/M入門』、誠文堂新光社 ISBN 4-416-18212-0 Intel 8080 MSX-DOS MZ-2500 SMC-777 CP/M-86 MS-DOS OS-9 Kaypro 文豪 - NECのワープロ専用機。ミニ5シリーズでは、CP/M上でワープロソフトウェアが動作していた。 The Unofficial CP/M Web site