PDP-10

PDP-10は、1960年代後半からディジタル・イクイップメント・コーポレーション(DEC)が製造したメインフレームファミリ。PDPシリーズコンピュータのひとつ。1966年に最初の機種が出荷された。タイムシェアリングシステムを一般に浸透させたマシンであり、多くの大学や研究機関で採用されたことから1970年代のハッカー文化に大きな影響を与えた。PDP-10を導入した主な大学/研究機関としては、MITの人工知能研究所およびProject MAC、スタンフォード大学のSAIL、カーネギーメロン大学などがある。 PDP-10のアーキテクチャはPDP-6とほぼ同じで、36ビットワードである。命令セットは若干拡張されており、ハードウェアの実装は進歩している。命令セットは未だに卓越しているという見方もあり、特に "byte"命令は任意のビットフィールドを操作することができた（この場合の byte は必ずしも8ビットを意味せず「固定ビット数の連続の並び」という意味である）。 最初のPDP-10のプロセッサは1968年に登場したKA10である。トランジスタをDECのフリップチップ（英語版）技術でパッケージし、半自動化された工程によってバックプレーンのワイヤラッピングが行われている。サイクルタイムは1μ秒、加算命令にかかる時間は2.1μ秒である。1973年、KI10が新たに登場した。これはTTL集積回路を使っている。さらに1975年には高性能なKL10（さらに後にはKL20）が登場。こちらはECLで構成され、マイクロプログラム方式を導入し、キャッシュメモリを搭載している。低価格版のKS10も1978年に登場し、TTLとAm2901ビットスライスチップで構成され、PDP-11のUnibusを使って周辺機器を接続するようになっていた。 KA10の最大メモリ容量は256Kワード（1152Kバイト）である。ページング機構は持たず、2本のプロテクション/リロケーションレジスタ（base and bounds レジスタとも呼ぶ）でメモリ管理を行っている。これによりユーザーのアドレス空間の半分をメインメモリの指定した領域に限定できる。従って、リードオンリーで共有可能なテキストセグメント（high segmentとも呼ばれた）とリード/ライト可能なデータセグメントおよびスタックセグメント（low segmentとも呼ばれた）という後のUNIXでも使われたプロセスモデルが可能であった。MITやBBNでは、KA10 に改造を加えて物理メモリ容量を増やし、ページング機構を追加してデマンドページング（英語版）方式の仮想記憶をサポートした。 KI10およびその後のプロセッサではページング方式が採用され、最大4Mワードの大容量物理アドレス空間をサポートした。KI10の機種としては1060、1070、1077があり、特に1077は2CPUを搭載している。 最初のKL10の機種（1080, 1088など。DECsystem-10とも称した）はオリジナルのPDP-10のメモリバスを使用し、拡張メモリモジュールを追加していた。この場合のモジュールとは筐体（キャビネット）を意味し、高さ180cm、幅と奥行きが70cm程度であり、32kワードから256kワードの磁気コアメモリを搭載できる（本項目冒頭右端にある写真にはそのようなキャビネットが6台写っている）。DECSYSTEM-20 (2040, 2050, 2060, 2065) のプロセッサは KL20 と（間違って）呼ばれているが、CPUと同じ筐体内のメモリを使用していた。10xxモデルの構成はこれとは異なり、DECSYSTEM-20の背の低い筐体ではなくオリジナルのPDP-10と同じ背の高い筐体を使用していた。10xx と 20xx のモデル間の差異は見た目の問題が大きく、10xx系であっても20xx系のようなメモリおよびI/Oの構成のものもあったし、20xx系でも10xx系のような構成のものもあった。どちらの系列でもTOPS-10とTOPS-20のマイクロコードが実行できたため、どちらのオペレーティングシステムも実行できた。 20xxシリーズKLマシンのI/OアーキテクチャはDECの新たなバス MASSbus に基づいていた。UnibusをオープンアーキテクチャとしたことがPDP-11成功の要因のひとつだが、KLにおいてはDECはMASSbusをプロプライエタリとし、従来の方針に戻している。結果としてMASSbus向けの周辺機器を製造するサードパーティは登場せず、DECは例えばRP06ディスクドライブの価格を同等のIBM互換機器よりかなり高く設定することができた。CompuServeはMASSbusに接続可能なディスクコントローラを独自開発したことがあるが、接続したのは IBM 3330 ディスク装置だった。 後に2060プロセッサの Model B 版では仮想アドレス空間の256Kワードという制限を取り払い、最大32個の256Kワードまでの「セクション」を構成可能にして命令セットもそれに応じて変更した。従って同じKL10でも、従来の Model A と Model B は全く別のCPUとみなすことができる。Model B の機能を生かした最初のオペレーティングシステムは TOPS-20 release 3 であり、ユーザーモードのアドレッシング拡張は TOPS-20 release 4 でサポートされた。TOPS-20 release 4.1 は Model B プロセッサでのみ動作し、Model A では動作できなかった。 困ったことに、KS10は Model B アーキテクチャを実装するだけの余裕があったにもかかわらず Model A アーキテクチャであった。明らかに市場価格帯をにらんでの決定だが、このためにKS10の製品寿命は非常に短かったのである。 最後のアップグレードはMCA25と呼ばれ、2060 から 2065 へのアップグレードであった。これにより複数セクションで動作するプログラムの性能が向上した。 KLクラスのマシンを立ち上げるには、内蔵されているフロントエンドコンピュータ PDP-11/40 が必須である。PDP-11はデュアルポートのRP06ディスクドライブ（または8インチフロッピーディスクドライブまたはDECtape（英語版））からブートし、PDP-11にメインプロセッサを起動するコマンドを入力すると、同じRP06ディスクドライブからブートさせることになる。このPDP-11はメインプロセッサが運用状態に入るとそれを監視する機能を果たす。 KSシステムでも似たようなブート手順を採用していた。Intel 8080 がメインプロセッサのマイクロコードを外部記憶装置からロードする方式である。メインプロセッサが立ち上がると、8080はコンソールと遠隔監視ポートの制御を担当した。 最初のPDP-6から KL-10 の Model A まで、ユーザーモードの命令セットアーキテクチャはほぼ変わっていない。本節ではその部分のアーキテクチャを解説する。 PDP-10のワード長は36ビットで、アドレスは18ビットである。スーパーバイザモードでは、命令アドレスは直接物理アドレスとなっている。ユーザーモードでは、アドレスは物理メモリアドレスに変換される。初期の機種ではユーザープロセスはアドレス空間の先頭と最後尾、0番地付近と最も大きなアドレスの付近から使用した。どちらのセグメントも連続である。後期アーキテクチャではページング方式となり、不連続なアドレス空間が可能となった。CPUの汎用レジスタにもメモリアドレスがふられており、0番地から15番地に対応していた。 汎用の36ビットレジスタが16本ある。0番のレジスタ以外では、右半分がインデックスに使われる。一部の命令はレジスタを組み合わせて使用する。条件レジスタ（ステータスレジスタ）もあり、算術命令の結果（オーバーフローなど）を示すビット群を保持していて、一部の命令からアクセスできる。 動作モードとしては、スーパーバイザモードとユーザーモードの2つがある。メモリ参照に上述の差異がある他に、スーパーバイザモードでは入出力操作が可能である。 ユーザーモードからスーパーバイザモードへの移行には、未実装ユーザー命令 (UUO) を使用して例外を発生させ、スーパーバイザがそれをトラップして処理を行うようになっていた。安価な機種でハードウェア実装を省略した場合も同様の機構でスーパーバイザによるエミュレーションを行っていた。 アーキテクチャ上直接サポートしていた主なデータ型は2の補数形式の36ビット整数、36ビット浮動小数点数、ハーフワードである。拡張された72ビットの浮動小数点数は複数命令連鎖で使うよう設計された特別な命令でサポートされる。バイト単位のポインタも特別な命令でサポートしている。1ワードの半分をカウンタ、半分をポインタとしてメモリ範囲を指すことができ、スタックなどに使われた。 命令セットは非常に直交性が高い。命令のフォーマットは、9ビットの命令コード、4ビットのレジスタ番号、23ビットの実効アドレスフィールドからなる。実効アドレスフィールドは、1ビットの間接ビット、4ビットのレジスタ番号、18ビットのオフセットからなる。命令実行は実効アドレスの計算から始まる。指定されたレジスタが0番でなければ、その中身とオフセットを加算する。間接ビットが1なら、計算で求めたアドレスにあるワードをフェッチし、その中身の間接ビットが1でなくなるまで、同様の処理を続ける。こうして得られた実効アドレスを命令がメモリ内容のフェッチに使ったり、そのまま定数として使ったりする。例えば、MOVEI A,3(C) という命令は、レジスタCの下位18ビットに3を加算し、レジスタAにその結果を格納するもので、メモリには全くアクセスしない。 命令は、算術・論理・転送、条件分岐、条件スキップの3種類に分類される。さらに細かい分類もある。 算術・論理・転送命令は、即値からレジスタ、メモリからレジスタ、レジスタからメモリ、レジスタとメモリからレジスタとメモリ、メモリからメモリという操作の種類がある。レジスタもメモリの一部としてアドレスを持っているので、レジスタからレジスタという操作も事実上存在する。例えばADD命令には、ADDI（18ビット即値定数をレジスタに加算）、ADDM（レジスタの内容を指定したメモリ位置に加算）、ADDB（レジスタの内容を指定したメモリ位置に加算し、その結果をレジスタに格納）といった種類がある。精巧な例として HLROM (Half Left to Right, Ones to Memory) 命令がある。これはレジスタの中身の左半分を取り出して、メモリ位置の右半分に置き、メモリ位置の左半分を全て1にするという命令である。 条件分岐命令はレジスタの内容を調べ、その結果によって指定されたアドレスに分岐するか否かを決める。ニーモニックはJUMPで始まり、JUMPAは「無条件分岐」、JUMPは「無条件で分岐しない」という意味である。命令セットの対称性を重視したため、一部の命令は何もしない命令になっている。例えば JUMPN A,LOC という命令は、レジスタAの中身がゼロでない場合LOCというアドレスに分岐する。条件（ステータス）レジスタの内容に従って判断する条件分岐命令として、JRST命令がある。KA10とKI10では、JRSTの方がJUMPAより高速だったため、標準の無条件分岐としてJRSTを使っていた。 条件スキップ命令は、レジスタの内容とメモリの内容を比較し、その結果によって次の命令（無条件分岐であることが多い）をスキップするか否かを決める。単純な例として CAMN A,LOC という命令では、レジスタAとLOCという位置の内容を比較し、等しくなければ次の命令をスキップする。より複雑な例として TLCE A,LOC という命令では、LOCの内容をマスクとしてレジスタAに適用して対応するビット群を取り出し、取り出したビットが全てゼロなら次の命令をスキップする。そしてスキップするか否かに関わらず、それらのビットを反転させる。 シフトやローテート命令、プロシージャコール命令などもある。特筆すべき命令としてスタック操作のためのPUSHとPOP、それらに対応するスタックコール命令PUSHJとPOPJがある。バイト操作命令はワード内の任意長のビットフィールドを操作し、同時にポインタをそのフィールドのぶんだけ進めることができる。 当初のPDP-10のオペレーティングシステム(OS)は単に "Monitor" と呼ばれたが、後にTOPS-10と改称され、システム全体も DECsystem-10 と呼ばれるようになった。MonitorとTOPS-10はスタンフォードのWAITS（英語版）オペレーティングシステムやCompuServeのタイムシェアリングシステムの基盤となった。 後に一部のPDP-10はDEC以外で開発されたコンポーネントを中心に構築されたOSを動作させ始めた。例えば、主スケジューラはこちらの大学製、ディスクサービスはあちらの大学製といった具合である。CompuServeなどの商用タイムシェアリングサービスは自前のシステムプログラミング部門を持っており、独自にOSを改造して自社の事業のニーズに合わせていた。またDECUS（英語版）などの強力なユーザーコミュニティがあり、ユーザーが自身で開発したソフトウェアを共有することができた。 BBNは独自のOSであるTENEXを開発し、これが様々な研究機関で使われ一種のデファクトスタンダードとなった。DECはTENEXをKL10に移植して大幅に機能強化し、TOPS-20と名づけ、DECSYSTEM-20のOSとした。MITもITSと呼ばれる独自OSを開発した（名称はMITが IBM 7094 上で開発したCTSS (Compatible Time-Sharing System) のパロディ）。 Tymshareは TOPS-10 をベースとしてTOPS-20のようなページング機構を採用した TYMCOM-X を開発した。 1970年代初め、パロアルト研究所の研究者たちは経営陣がPDP-10購入を許可しなかったため不満がたまっていた。というのもゼロックスはSDS（英語版）社を買収したところで、パロアルト研究所にもそのマシンを使ってほしかったのである。しかしチャック・サッカー率いるチームは、PDP-10のクローンシステム "MAXC"（SDS社をゼロックスに売った Max Palevsky にちなんだ名称）を自前で設計し、2台構築して使用した。MAXCという名称はバクロニムとして Multiple Access Xerox Computer の略とされた。OSはTENEXを移植して使用した。 PDP-10のクローンを販売しようというサードパーティ（Foonly、Systems Concetps、XKLなど）もあったが、あまり成功していない。ディズニーのSF映画 トロン ではCGIにPDP-10クローンの Foonly F-1 が使われている。 DECsystem-10アーキテクチャのシステムを最も多く所有していたのがCompuServeで、ピーク時にはオハイオ州コロンバスの3つのデータセンターにて200台以上が運用されていた。CompuServeはそれらシステムを「ホスト」とし、商用アプリケーションへのアクセスを提供すると同時に CompuServe Information Service も提供していた。当初はDECからシステムを購入していたが、DECがVAXに集中するためにPDP-10を販売終了としたため、CompuServeや他の顧客は Systems Concepts から互換機を購入し始めた。2007年1月現在、CompuServeは数台のPDP-10アーキテクチャのマシンを稼働させている。 KLシリーズの主電源は非常に効率が悪く、CompuServeでは自社の技術者が設計した電源に置き換え、消費電力を半分に抑えた。CompuServeはその電源の設計をDECに無償で提供し、CompuServeがその後購入するKLシリーズの電力消費を抑えることをDECに約束させようとした。DECはこの申し出を断わっている。 CompuServeがPDP-10に施したもう1つの改造は、KI10プロセッサ筐体にある数百個のインジケーターランプをLEDに置換することだった。置換にかかったコストは電力消費量を抑えたことですぐに回収でき、同時に発熱も減り、切れた電球を交換する手間も省けた。DECはこれを全世界に適用した。右の写真は KI10 CPU と同時代のMF10メモリのパネルである。博物館に展示されているものだが、2008年にLEDに置換している。後継のKLやKSプロセッサでは、このような多数のインジケータランプは存在しない。 PDP-10と（PDP-11の後継である）VAXスーパーミニコンピュータ製品ラインが競合するようになったことから、DECはより高収益が望めるVAXにソフトウェア開発を集中することに決定した。PDP-10製品ラインの開発中止は1983年に発表され、開発中だったハイエンドプロセッサ (Jupitor) も同時に中止となった。また、デスクトップ型PDP-10開発プロジェクト Minnow はプロトタイプ製作段階にまで到達していた。 この出来事はITSやジャーゴンファイルを生んだ文化の終焉を招くきっかけとなったが、1990年代になるとPDP-10をかじったことがあるというのが古いハッカーの勲章のように扱われるようになった。 PDP-10のアセンブリ言語命令であるLDB(load byte)およびDPB(deposite byte)は、プログラミング言語Common Lispの関数として生き残っている。また、PDP-6やPDP-10の36ビットワードは18ビットのLISPポインタを2つ格納することができ、これはLISP処理系を考慮したものと言われている。 ウィル・クラウザー（英語版）はPDP-10上に世界初のアドベンチャーゲーム「コロッサル・ケーブ・アドベンチャー」を開発した。そのほかにもPDP-10上では、世界初のコンピュータ野球ゲーム（Don Daglow作、1971年）、初期のコンピュータRPG Dungeon（1975年）が作られた。ウォルター・ブライトはPDP-10上で最初のウォー・シミュレーションゲーム Empire を作成した。Roy Trubshaw と Richard Bartle はPDP-10上で世界初のマルチユーザーダンジョンゲーム（MUD）を作成した。さらにパソコンで人気となったテキストアドベンチャー『ゾーク』もオリジナルはPDP-10で作られ、インフォコムは開発用にPDP-10を数台使用していた。 1967年にシアトルの私立中学に入学したビル・ゲイツは、学校で触れたゼネラル・エレクトリックのGE-635でコンピュータに興味を持ち、その後CCCという会社でPDP-10に慣れ親しんだ。その後、友人のポール・アレンとともにトラフォデータという名称で交通量計測システムを開発するが、その際に、当時アルバイトをしていた電力事業団にあったPDP-10を用いた。また、1975年にAltair 8800用BASICインタプリタを開発した際には、ポール・アレンがPDP-10上に構築した Altair 8800 エミュレータを用いた。 歴史的コンピュータのシミュレーションソフトウェアSIMH（英語版）には、KS10 CPU をWindowsやUnix系マシンでエミュレートするモジュールが含まれている。DECが配布したテープのコピーもインターネット上にあってダウンロード可能であり、SIMH上でTOPS-10やTOPS-20、さらにはITSを動作させることは可能である。 Ken Harrenstien の KLH10 はUnix系システム上で、KL10B および KS10 プロセッサをエミュレートでき、KL10BではTOPS-10とTOPS-20の最終版が動作し、KS10ではITSとTOPS-10とTOPS-20の最終版が動作する。