PDP-11

PDP-11 は、ディジタル・イクイップメント・コーポレーション(DEC)が1970年代から1980年代に販売した16ビットミニコンピュータシリーズ[1][2]。PDP-11 は DECのPDPシリーズPDP-8コンピュータの主にリアルタイムシステムの後継であるが、両シリーズは10年間以上並存した。革新的機能をいくつか持ち、従来よりもプログラミングが容易になっていた。ミッドレンジのミニコンピュータとしての後継は32ビットVAXである。

その設計上の特徴は、モトローラMC68000などのマイクロプロセッサの設計に影響を及ぼしている。またPDP-11上のオペレーティングシステム (OS) の設計は他のOS、例えばCP/M[3]MS-DOS[4]の設計に影響を及ぼしている。最初の公式にUNIXと名付けられたバージョンのOSは、1970年に PDP-11/20 上で動作した。PDP-11のプログラミング上の低レベルな特徴とC言語の言語要素の類似は非常によく言われてはいるが[5]、意図的にそのように設計したわけではない[6]。たとえば、C言語の ++ や -- は、PDP-11より古い、PDP-7に実装したB言語に由来していて、ハードウェアの持っていた機能からの影響もあるだろうが、いくつかの特徴はハードウェアからというよりもトンプソンのオリジナルであろうとリッチーが書き残している(en:Increment and decrement operators#Historyを参照)。

PDP-11/40 2台のDECtape英語版装置が見える

歴史

[編集]

DECが16ビットのPDP-11を開発するきっかけとなったのは、データゼネラルが発売したデータゼネラルNova である。Novaはワード長16ビットだが、DECが当時主力としていたPDP-8のワード長は12ビットだった。PDP-11ファミリは1970年1月に発表され、同年前半に出荷が開始された。最終的な売り上げ台数は不明であるが、販売開始後の8年間で5万台が売れたことが知られている[7]。当初はTTLのICで構成されていたが、1975年にはやや大規模な集積回路を使いCPUをワンボード化している。1979年にはマルチチップモジュール化したプロセッサ J-11 を開発。シリーズ最後の機種である PDP-11/94 と PDP-11/93 は1990年に登場した[2]

PDP-11シリーズの特徴

[編集]

命令セット

[編集]

プログラマがPDP-11を好むのは、その直交性の高い命令セットによって命令の種類とメモリアクセス方法を分けて考えることができるからである。任意のメモリアクセス方法(アドレッシングモード)を任意の命令に使用でき、他の命令セットのように例外事項を覚えておく必要がない。例えば、多くの命令セットでは loadstore があるが、PDP-11には move 命令しかなく、転送元と転送先のどちらのオペランドでもメモリもレジスタも指定可能である。また、入出力専用の命令がなく、直交性によって入力デバイスから出力デバイスへ直接データ転送することも可能である。同様に加算命令も任意のオペランド(メモリ、レジスタ、デバイス)を加える数としても計算結果の格納先としても使える。

PDP-11の命令セットアーキテクチャはB言語の慣習的構文に影響を与えていると言われているが、間違いである。レジスタインクリメントやデクリメントを行うアドレッシングモードが C言語の −−i とか i++ といった式に対応していると言われている。もし ij もレジスタ変数なら、*(−−i) = *(j++) といった式は1個の機械語命令にコンパイルできる。デニス・リッチーは、B言語設計時にPDP-11は存在しなかったのだからこの伝説は間違いだと、明確に否定した。ただし、PDP-7の自動インクリメントセルがPDP-11のアドレッシングモードに影響している可能性はあるが、B言語そのものはPDP-7のその機能も使っていないと述べている[8]。それでも、C言語はPDP-11で実装する際にPDP-11の持つ細かい利点を活用しており、そのために後のプロセッサの設計に影響を与えた可能性はある[5]

論理的には、アドレッシングモードと命令セットによってベースが提供されていると言える。2オペランド命令は、2つの6ビットフィールドでオペランドを指定し(3ビットがレジスタ指定で、3ビットがアドレッシングモード指定)、4ビットで命令コードを指定する。1オペランド命令は、6ビットでオペランドを指定し、10ビットで命令コードを指定する。どの命令でもオペランド指定フィールドには任意のアドレッシングモードを指定できる。8本のレジスタ(0番から7番まで)で、7本のレジスタは任意の用途に使用可能だが、6番のレジスタはいくつかの命令ではスタックポインタとして認識され、7番のレジスタはプログラムカウンタである。プログラムカウンタがプログラマから見えているという発明とアドレッシングモードの組合せで、絶対アドレス指定と相対アドレス指定が可能となった。アドレッシングモードとしては、レジスタ、即値、絶対アドレス指定、相対アドレス指定、間接アドレス指定、インデックス付きアドレッシングがあり、さらにレジスタの自動インクリメント/自動デクリメント(バイト操作なら1、ワード操作なら2)を指定できる。相対アドレス指定を使えば、機械語プログラムを位置独立にできる。

PDPエンディアン

[編集]

PDP-11のエンディアンは独特であった。16ビットワードはリトルエンディアンで格納される。すなわち下位バイトがアドレスの小さいほうに格納される。32ビットワードを構成する2個の16ビットワードは、ビッグエンディアンで格納される。すなわち上位16ビットワードがアドレスの小さいほうに格納される。ここで、各16ビットワード内は前述のようにリトルエンディアンである。PDP-11が非常に一般化したため、この形式を PDPエンディアン と呼ぶことがある。

このようなミドルエンディアンにまつわる問題を「NUXI問題」と言う。これは UNIX という文字列をPDPエンディアンの順序で並べ替えたものに由来する。UNIX を他機種に移植した際、最初の起動メッセージ(しばしば、本格的な初期化に入る前、最小限のブートが完了したことを示すため、短い文字列を出力することがある)として「UNIX」ではなく「NUXI」と出力されたことがあった、と言われている。

(なお、コンピュータ中のデータの並べ方について「エンディアン」という語を使う提案は1980年になされたものであるため、初期のPDP-11についてエンディアンという語を使うのは後付けということになる)

I/O専用バスの無い構成

[編集]

他の初期のコンピュータとの大きな違いとして、初期の PDP-11 は入出力専用バスを持たず、Unibus というメモリバスしか持たない。そのため入出力機器はメモリ空間にマッピングされ、特殊な I/O (入出力) 命令を必要としない。また、それぞれに割り込みベクターと割り込み優先度が設定される。プロセッサのアーキテクチャが可能にしたこの柔軟性の高いフレームワークにより、新たなバスデバイスを容易に考案でき、当初予想もしていなかった新たなハードウェアの制御も可能である。DECはこのUnibusの基本仕様を公開し、バスインタフェース回路基板のプロトタイプも提供し、ユーザーが独自のUnibus対応ハードウェアを開発できるようにしていた。

これにより、PDP-11は特注の周辺機器の制御を得意とした。アルカテル・ルーセントの前身の1つである Bell Telephone Manufacturing Company が開発したX.25ネットワーク・パケット交換機 BTMC DPS-1500 は管理システムとしてPDP-11と組み合わせて配備され、Unibus経由で直接接続されていた。

PDP-11ファミリの上位機種であるPDP-11/45やPDP-11/83システムは、この単一バス方式をやめている。その代わり、CPU筐体内だけでCPUとメモリ間の専用インタフェース回路を使用し、UnibusやQ-busはI/O専用とした。PDP-11/70ではさらに、磁気ディスク装置や磁気テープ装置とメモリ間を新たな専用バス Massbus英語版 で接続した。入出力機器はこういった構成でもメモリアドレス空間にマッピングされ続けたが、追加されたバスインタフェースの設定のためのコードを追加する必要があった。

割り込み

[編集]

割り込みシステムはなるべく単純になるよう設計され、割り込みシーケンスでイベントを逃さないことを保証している。デバイスが割り込みを発生する場合、4本の優先度ラインのいずれかをアサートする。プロセッサは優先度毎の割り込みデイジーチェインに応答する(デイジーチェインはイベントを順番に並べる一種の論理回路である。最初の論理ゲートが最初に処理される。デイジーチェインはその優先度でのデバイス間の優先順位に従って設定される)。

PDP-11の設計では、この割り込み応答順はデバイスが物理的にCPUに近い順番になっている。CPUが応答すると、デバイスはそのベクターアドレスをバスに出力する。これは4バイトのメモリブロックのアドレスである。CPUはステータスレジスタとプログラムカウンタをベクターテーブルからロードする。このときのステータスレジスタの値は割り込みを不可とするようになっている。プログラムカウンタにロードされるアドレスは割り込みハンドラのスタートアドレスである。割り込みハンドラがデバイスに関する処理を行い、その過程で割り込んできたデバイスの割り込み信号を再設定する。最後に特殊なRTI (Return From Interrupt) 命令でCPUが割り込まれた箇所に戻る。戻ったところが低優先度の割り込みの処理中の場合もあり、割り込み処理の入れ子が可能である。このような処理によって割り込みを受け付けそこなうことを防いでいる。未処理の割り込みはどの段階であってもそのまま存在していて、次のサイクルで処理可能である。割り込み処理が間違って起動されるとCPUはタイムアウトとなり、特殊な擬似割り込みを発生してユーザーに対してハードウェア故障を警告する。

大量生産のための設計

[編集]

PDP-11は工場でそれなりに熟練した労働者が生産できるよう設計された。あらゆる観点から個々の工程の危険性を低減している。ワイヤラッピング式のバックプレーンを使用し、プリント基板をバックプレーン上のコネクタに差し込むようになっている。バックプレーン上のコネクタ同士はワイヤラッピングで接続される。ワイヤの被覆(テフロン)を剥いだ銅線(鍍金された硬い単芯線)が端子(四角柱の角)に巻かれて食い込むことで密着する。このコネクタ部分は電話の交換機などとよく似ている。

LSI-11

[編集]
LSI-11/2 CPU を搭載したQ-bus基板
Fonz-11 (F11) チップセット
Jaws-11 (J11) チップセット

1975年2月に登場した LSI-11 (PDP-11/03)[2]大規模集積回路を使用した最初のPDP-11である。CPUウェスタン・デジタル製の4個のLSIチップ(MCP-1600チップセット)で構成される。Unibusによく似たQ-busを使用。大きな違いは Q-bus のアドレスバスとデータバスが物理的には同じ線を共有していることである(マルチプレクサ)。I/Oデバイスのアドレッシングも若干異なり、22ビットの物理アドレス(Unibusでは 18ビット)とブロック転送モード(Unibusにはない)をサポートし、全体的には性能が大幅に向上している。

CPUのマイクロコードには直接RS-232Cまたはカレントループ英語版で端末と通信できるデバッガが組み込まれている。当時、そのようなデバッグには制御パネルのスイッチとランプを使うのが普通だったが、端末からコマンドを入力して指定したメモリアドレスやレジスタの内容を八進数で表示できた。このデバッガはコンピュータのレジスタを調べたり、メモリや入出力機器を調べるために使われた。従って、CPUが機能しない場合でもコンピュータの内部状態を調査して修理することが可能であった。

マイクロコードには汎用ブートストラップが含まれ、DEC製の全てのディスクドライブを使用可能であった。

これら2つの発明はコンピュータが動作中は使われない。ハードディスクからブートできないとき、フロッピーからのブートを試すなど、全く起動しないときデバッガを使うといった使い方になる。これによって信頼性が向上し、全体としてコストを低減させている。

後期のQ-busベースのシステム(LSI-11/23、/73、/83 など)はDECが独自設計したチップセットを使用している。また、Unibus対応のPDP-11も後々まで継続し、CPUはQ-bus仕様のプロセッサカードを採用しつつ、アダプタでUnibusと接続してUnibus用周辺機器が使えるようにしており、中には特別なメモリバスを採用して性能向上させた機種もある。

Q-bus系機種では他にも大きな技術革新があった。例えば、PDP-11/03の派生システムではシステム全体の Power On Self Test (POST) を導入している。

PDP-11の衰退とその後

[編集]

基本設計は非常に優れていて、最新技術も次々に取り入れていった。しかし、UnibusやQ-busのスループットがシステム性能のボトルネックとなっていき、最終的に16ビットアーキテクチャではどうがんばっても超えられない限界が見えてきた。一部機種では物理アドレス空間を拡張したが、全てのプログラムは16ビットの仮想アドレス空間(64Kバイト)に制限されていた。1980年代にメモリチップが低価格化していったが、PDP-11上のソフトウェアは大容量メモリを簡単には使えなかった。

DECがPDP-11の後継とした32ビットのVAX(Virtual Address Extension; PDP-11の仮想アドレス拡張という意味)はこのような問題に対応したが、当初はハイエンドタイムシェアリング市場をターゲットとした。初期のVAXにはPDP-11互換モードがあり、32ビットのソフトウェアと同時に既存ソフトウェアも使用可能だった。

インテル8086などはセグメント方式による拡張で16ビットのアドレス空間を超え、32ビット化などという大層なことをしなくても 1Mバイトまでのメモリを扱えた。これは成長過程にあった IBM PC 互換機市場には十分だったが、80286が登場する前に1Mバイトの限界が問題となってきた。80286はセグメントアドレス空間を拡大し、80386では32ビットのリニアなアドレス空間がサポートされた。

技術者がより大きなアドレス空間をサポートするアーキテクチャに移っていったころ、MC68020 (1984) やIntel 80386 (1985) のような32ビットマイクロプロセッサが登場してきた。量産効果でこれらのマイクロプロセッサは低価格化し、PDP-11はコスト面でも太刀打ちできなくなった。PDP-11ベースのパーソナルコンピュータ DEC Professional などの試みも失敗に終わった。

1994年、DECはPDP-11システムのソフトウェアの権利を Mentec Inc. (LSI-11ボードを Q-bus およびパソコン用に製造する会社)に売却した[9]。そして1997年にはPDP-11ファミリの生産を終了させた。Mentecは数年間、PDP-11アーキテクチャの新プロセッサを製造していた。

1980年代、IBM PC とその互換機が小型コンピュータ市場を席巻したが、DECはそれにうまく対抗策を打ち出せなかった。

1990年代後半にはDECを初めとするミニコンピュータ業界は壊滅し、UNIXWindowsサーバやワークステーションに取って代わられたのである。

しかし、2008年時点でも現役で使用されているPDP-11も存在している。[※ 1]

2010年7月までに、VHDLで実装したPDP-11/70のIPコアOpenCoresにて公開された。[10]ライセンスはGPL。2006年にPDP-11のマニュアルを発掘した有志の開発者により実装され、2007年までにFPGA搭載ボード(Digilent S3BOARD)上で初めて動作。2009年までにUNIX 5th Editionおよび2.11 BSDのブートに成功。

アーキテクチャ詳細

[編集]

以下の情報はDECのPDP-11 Processor Handbookにある。[※ 2]

メモリ管理

[編集]

PDP-11のアドレスは16ビットであり、64KBまでのアドレス範囲を指定できる。PDP-11からVAXに移行するころ、8ビットのバイトと16進表記が一般的になっていたが、PDP-11では八進表記が普通で、搭載メモリ容量はワード数で表記されるのが普通だった。したがって、基本論理アドレス空間は32Kワードだが、上位4Kワード(アドレス 160000 から 177777 まで)は周辺機器のレジスタのマッピング用に予約されており、メモリはマッピングされない。したがって、初期のPDP-11の最大メモリ容量は28Kワードだった。

この制約に対して、以下のような技法が使われた。

  • 後期のPDP-11では、仮想記憶をサポートするメモリ管理ユニットが使われた。物理アドレスは18ビットまたは22ビットに拡張され、256KBまたは4MBのメモリを扱えるようになったが、1つの論理アドレス空間は16ビット(32Kワード)に制限されたままだった。
  • PDP-11/45をはじめとする機種では、命令用論理空間(32Kワード)とデータ用論理空間(32Kワード)を設定可能とした。初期のUNIXなどはこの機能を使っていた。
  • 例えば Modula-2 の実装では、実行環境が論理空間を8kBのページに分割して制御し、ユーザーからは隠蔽した形でバンク切り換えのような操作を行っていた(外部リンク参照)。

アドレッシングモード

[編集]

多くの命令で6ビットで1オペランドを構成しており、3ビットで8本ある汎用レジスタのいずれかを指定し、3ビットで8種類あるアドレッシングモードのいずれかを指定する。このため八進表記が自然に使われた。

以下では仮の1オペランド命令をOPRで表し、アセンブリ言語でのアドレッシングモードの表現を示す。Rnは汎用レジスタを意味し、R0からR7まである。コードの "n" はレジスタ番号である。

汎用レジスタのアドレッシングモード

[編集]

任意の汎用レジスタに適用できる8種類のアドレッシングモードを下表に示す。なお、R6(スタックポインタ)とR7(プログラムカウンタ)については別に解説する。

コード 名称 説明
0n レジスタ OPR Rn Rnにオペランドがある。
1n レジスタ間接 OPR (Rn) Rnにオペランドのアドレスがある。
2n 自動インクリメント OPR (Rn)+ Rnにオペランドのアドレスがあり、命令実行後にRnの内容をインクリメントする。
3n 自動インクリメント間接 OPR @(Rn)+ Rnにオペランドへのポインタのアドレスがあり、命令実行後にRnの内容を2だけインクリメントする。
4n 自動デクリメント OPR −(Rn) 命令実行前にRnをデクリメントし、それをオペランドのアドレスとして使用する。
5n 自動デクリメント間接 OPR @−(Rn) 命令実行前にRnを2だけデクリメントし、それをオペランドへのポインタのアドレスとして使用する。
6n インデックス OPR X(Rn) Rn+X がオペランドのアドレス。Xはこの命令に続くワード。
7n インデックス間接 OPR @X(Rn) Rn+X がオペランドへのポインタのアドレス。Xはこの命令に続くワード。

2オペランド命令では両方のオペランドでこれらのモードを使える。インデックスおよびインデックス間接モードは命令に続くワードも命令の一部として使用するので、2オペランド命令は3ワードになる場合がある。

自動インクリメントと自動デクリメントはバイト命令なら1ずつ、ワード命令なら2ずつインクリメント/デクリメントする。間接モードの場合、ポインタ1つ分のインクリメント/デクリメントになるので、2ずつとなる。

プログラムカウンタのアドレッシングモード

[編集]

R7(プログラムカウンタ)を使用する場合、以下の4つのアドレッシングモードが意味のある効果を発揮する。

コード 名称 説明
27 イミディエート OPR #n オペランドは命令内にある。
37 絶対 OPR @#a オペランドの絶対アドレスが命令内にある
67 相対 OPR a 命令に続くワードの内容 a を PC+2 に加算したものをアドレスとして使用する。
77 相対間接 OPR @a 命令に続くワードの内容 a を PC+2 に加算したものをアドレスのアドレスとして使用する。

絶対モードは例えば、固定のアドレスにマッピングされたI/Oレジスタのアクセスに使用する。相対モードはプログラムの変数を参照する場合や分岐先を指定する場合に使用する。相対モードや相対間接モードのみを使ったプログラムは位置独立となる。つまり、プログラムを配置するアドレスが仮定されていないので、任意の位置にロードでき、移動させることも可能である(リロケータブルバイナリ)。

イミディエートモードと絶対モードは通常の自動インクリメントモードと自動デクリメント間接モードに対応している。上の表にあるように補助ワードを「命令内」にあるとするか、命令の次のワードと考えるかは立場によって異なる。なお、PCは常に次々と命令を指していくので、常に2ずつ自動インクリメントされる。

スタックのアドレッシングモード

[編集]

R6はSPと表記されることもあり、トラップや割り込みの際のハードウェアスタックのスタックポインタとして使われる。このスタックは、アドレスの小さい方に向かって成長する。SPまたはプログラマがソフトウェアスタックのスタックポインタとして選択した任意のレジスタには、次のようなアドレッシングモードがある。

コード 名称 説明
16 間接 (SP) オペランドはスタックのトップにある。
26 自動インクリメント (SP)+ オペランドはスタックのトップにあり、それを使用後にポップする。
36 自動インクリメント間接 @(SP)+ オペランドへのポインタがスタックのトップにある。それを使用後にポップする。
46 自動デクリメント −(SP) 値をスタックにプッシュする。
66 インデックス X(SP) スタックのトップからの相対位置でスタック内の任意のアイテムを参照する。
76 インデックス間接 @X(SP) スタックのトップからの相対位置でスタック内の任意のポインタの指すアイテムを参照する。

ソフトウェアスタックはバイトも積むことができるが、SPの場合はワードしか積まない。従ってSPの自動インクリメント/自動デクリメントは常に2ずつである。

命令セット

[編集]

PDP-11はバイト(群)やワード(群)を操作する。バイト(群)はレジスタ番号で指定され、そのレジスタの下位バイトを直接操作するか、そのレジスタでメモリ位置を指す。ワード(群)もレジスタ番号で指定され、そのレジスタの内容を直接操作するか、そのレジスタでメモリ位置を指す。ワードは偶数番地境界になければならない。オペランドのあるほとんどの命令で、ビット15がセットされているものはバイトアドレッシングで、ビット15がクリアされているものはワードアドレッシングである。以下の表で示すとおり、ニーモニックの最後尾に "B" をつけるとバイト操作を意味する(例えば、MOV と MOVB)。

2オペランド命令

[編集]

命令の先頭4ビットが命令コードである(特にビット15でワードアドレッシングかバイトアドレッシングかを示す)。6ビットで1オペランドとなっており、2オペランドある。オペランドの内容については上述のアドレッシングモードを参照。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
opcode mode source mode destination
命令コード ニーモニック 説明
01 MOV 転送: dest = src
11 MOVB
02 CMP 比較: src − dest を計算し、フラグだけセットする。
12 CMPB
03 BIT ビットテスト: dest & src を計算し、フラグだけをセットする。
13 BITB
04 BIC ビットクリア: dest &= ~src
14 BICB
05 BIS ビットセット(論理和): dest |= src
15 BISB
06 ADD 加算: dest += src
16 SUB 減算: dest −= src

ADD命令とSUB命令はワードアドレッシングであり、バイトを対象とするバージョンは存在しない。

一部の2オペランド命令は、一方のオペランドにレジスタしか指定できない。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
opcode register mode source/destination

ここで、レジスタペアが使われる。「(R,R+1)」のように記述し、Rレジスタが上位ワードであって偶数番目でなければならない。2つ目のレジスタは下位ワード(または余り)である。乗算ではRが奇数番目のレジスタであってもよいが、その場合の積の上位ワードはレジスタに保持されない。

命令コード ニーモニック 説明
070 MUL 乗算: (R,R+1) = R × src
071 DIV 除算: (R,R+1) ÷ src を計算。商を R、余りを R+1 へ
072 ASH 算術シフト: R <<= src を行う。シフトするビット数は −32 から 31 まで指定可能。
073 ASHC 連鎖算術シフト: (R,R+1) <<= src を行い、シフトするビット数は −32 から 31 まで指定可能
074 XOR 排他的論理和: dest ^= reg (ワードのみ)
075 (浮動小数点演算)
076 (システム命令)
077 SOB デクリメントし、分岐: レジスタをデクリメントし、結果がゼロでない場合はPC相対で後方へ分岐する。分岐できる範囲は 0 から 63 ワードまで。

1オペランド命令

[編集]

命令の先頭10ビットが命令コードで、特にビット15はワードアドレッシングかバイトアドレッシングかを示す。先頭4ビットの組合せのほとんどが2オペランド命令で使われているため、命令コードが9ビットであっても、それほど命令の種類は多くない。残り6ビットで1オペランドを表す。

15 11 10 6 5 3 2 0
B 0 0 0 1 Opcode Mode Register
命令コード ニーモニック 説明
0003 SWAB バイトスワップ: ワードを8ビットローテート
004r (サブルーチンコール)
104x (エミュレータトラップ)
0050 CLR クリア: dest = 0
1050 CLRB
0051 COM 補数: dest = ~dest
1051 COMB
0052 INC インクリメント: dest += 1
1052 INCB
0053 DEC デクリメント: dest −= 1
1053 DECB
0054 NEG 符号反転: dest = −dest
1054 NEGB
0055 ADC キャリー加算: dest += C
1055 ADCB
0056 SBC キャリー減算: dest −= C
1056 SBCB
0057 TST テスト: src をロードし、フラグのみセットする
1057 TSTB
0060 ROR 1ビット右ローテート
1060 RORB
0061 ROL 1ビット左ローテート
1061 ROLB
0062 ASR 右シフト: dest >>= 1
1062 ASRB
0063 ASL 左シフト: dest <<= 1
1063 ASLB
0064 MARK サブルーチンから復帰。0から63個の命令ワードをスキップ
1064 MTPS ステータスレジスタへ転送: PS = src
0065 MFPI 前のI空間から転送: −(SP) = src
1065 MFPD 前のD空間から転送: −(SP) = src
0066 MTPI 前のI空間へ転送: dest = (SP)+
1066 MTPD 前のD空間へ転送: dest = (SP)+
0067 SXT 符号拡張: dest = (Nフラグを16個コピー)
1067 MFPS ステータスレジスタから転送: dest = PS

SWAB命令は指定したワードの上位バイトと下位バイトを入れ替えるもので、バイトアドレッシングは存在しない。

条件分岐命令

[編集]

多くの分岐命令は、PSW(ステータスレジスタ)の条件コードの状態に基づいて分岐するか否かを決定する。一般に直前にCMP命令、BIT命令、TST命令などを行って条件コードをセットする。算術演算命令や論理演算命令も条件コードをセットする。インテルx86とは異なり、MOV命令も条件コードをセットする。したがって、転送した値がゼロか否か、負か否かで条件分岐することもできる。

命令の上位8ビットが命令コードである。下位8ビットで現在のプログラムカウンタからの相対オフセットを指定する。オフセットはワード数であり、分岐先アドレスはそれを2倍してPCに加えたものとなる。またオフセットは符号付整数なので、前方にも後方にも分岐できる。

15 11 10 8 7 0
x 0 0 0 0 Opcode Offset
命令コード ニーモニック 説明
0000xx (システム命令)
0004xx BR 無条件分岐
0010xx BNE 等しくないとき分岐 (Z=0)
0014xx BEQ 等しいとき分岐 (Z=1)
0020xx BGE 大きいか等しいとき分岐 (N|V = 0)
0024xx BLT 小さいとき分岐 (N|V = 1)
0030xx BGT 大きいとき分岐 (N^V = 1)
0034xx BLE 小さいか等しいとき分岐 (N^V = 0)
1000xx BPL 正のとき分岐 (N=0)
1004xx BMI 負のとき分岐 (N=1)
1010xx BHI 高いとき分岐 (C|Z = 0)
1014xx BLOS 低いか同じとき分岐 (C|Z = 1)
1020xx BVC オーバーフローしていないとき分岐 (V=0)
1024xx BVS オーバーフローしているとき分岐 (V=1)
1030xx BCC キャリーがないとき分岐 (C=0)
BHIS 高いか同じとき分岐 (C=0)
1034xx BCS キャリーがあるとき分岐 (C=1)
BLO 低いとき分岐 (C=1)

2オペランド命令の表にある SOB (subtract one and branch) も条件分岐命令である。レジスタオペランドをデクリメントし、結果がゼロでないとき命令の下位6ビットを符号なしオフセットと解釈して後方に分岐する。

分岐できる範囲が限られているため、コードが成長していくとこれらの命令では分岐先に到達できなくなる可能性がある。その場合2ワードを必要とするJMP命令に書き換え、JMP命令は無条件分岐なので、例えば元が BEQ だった場合は BNE に書き換えてJMP命令をスキップするようにする。

ジャンプとサブルーチン関連

[編集]
  • JMP (ジャンプ)
  • JSR (サブルーチンコール)
  • RTS (サブルーチンから復帰)
  • MARK (復帰時のスタックのクリーンアップ)
  • EMT (エミュレータトラップ)
  • TRAP, BPT (ブレークポイントトラップ)
  • IOT (入出力トラップ)
  • RTI & RTT (割り込みからの復帰)

JSR命令は任意のレジスタをスタック上にセーブできる。セーブすべきレジスタがない場合はPCを指定し (JSR PC,address)、サブルーチンから復帰する際も RTS PC とする。例えば、"JSR R4, address" としてサブルーチンを呼び出すと、R4の元の値がスタックのトップに置かれ、リターンアドレス(JSR命令の次の命令のアドレス)が R4 に格納される。リターンアドレスの位置にはコードではなくデータを置いておいて (R4)+ で読み込んだり、ポインタを置いておいて @(R4)+ で読み込む。すると自動インクリメントでデータ部分を飛ばすことになり、R4が真のリターンアドレスになる。そこで RTS R4 を実行すれば正しい位置に復帰できる。

その他の命令

[編集]
  • HALT, WAIT (割り込みを待ち合わせる)
  • RESET (Unibusをリセット)

条件コード操作

[編集]
  • CLC, CLV, CLZ, CLN, CCC (対応する条件コードをクリア)
  • SEC, SEV, SEZ, SEN, SCC (対応する条件コードをセット)

ステータスレジスタ (PSW) には以下の4つの条件コードがある。

  • N - 負値であることを示す。
  • Z - ゼロ(比較結果が等しい)であることを示す。
  • V - オーバーフローが発生したことを示す。
  • C - キャリーが発生したことを示す。

SCCとCCCはこれら4つを全てクリアまたはセットする。

オプションの命令セット

[編集]
拡張命令セット(extended instruction set、EIS)
PDP-11/35、11/40、11/03 でのオプション。後期機種では標準となった。
  • MULDIV - 乗算と除算
  • ASHASHC - 算術シフト
浮動小数点命令セット (floating instruction set、FIS)
PDP-11/35、11/40、11/03 でのオプション。
  • FADDFSUBFMULFDIV - 単精度のみ。レジスタオペランドの指すスタック上の浮動小数点数を対象とする。
浮動小数点プロセッサ (floating-point processor、FPP)
PDP-11/45およびその後の多くの機種でのオプション。
  • 単精度または倍精度についての全ての浮動小数点演算。どちらになるかは浮動小数点ステータスレジスタ内のビット設定による。
  • 単精度浮動小数点数の形式は IEEE 754 以前のものだが、符号ビット、8ビット指数、23ビット仮数(けち表現)となっている。
ビジネス命令セット (commercial instruction set、CIS)
11/23 と 11/24 ではマイクロコードによるオプション、11/44では追加モジュール、11/74では一部バージョンでサポート。COBOLDibol英語版 で使用する各種文字列命令と十進命令をサポート。
PSWアクセス命令
PSWはメモリアドレス 177 776 にマッピングされているが、最初期の機種以外では以下のような命令があって、PSWにより直接的にアクセスできる。
  • SPL - 優先度レベルの設定
  • MTPS - PSWへ転送
  • MFPS - PSWから転送
他のメモリ空間へのアクセス命令
命令論理空間とデータ論理空間を複数提供する後期機種において、他の論理空間にアクセスするための命令群で、直交性がない。例えば、オペレーティングシステム内のランタイムサービス(システムコール)ルーチンが呼び出し側と情報交換するのに用いた。
  • MTPDmove to previous data space
  • MTPImove to previous instruction space
  • MFPDmove from previous data space
  • MFPImove from previous instruction space

アセンブリ言語によるプログラミング例

[編集]
PDP-11で使用された紙テープ

RT-11で動作するPDP-11マクロアセンブラによる Hello world プログラムである:

        .TITLE  HELLO WORLD
        .MCALL  .TTYOUT,.EXIT
HELLO:: MOV     #MSG,R1 ;STARTING ADDRESS OF STRING
1$:     MOVB    (R1)+,R0 ;FETCH NEXT CHARACTER
        BEQ     DONE    ;IF ZERO, EXIT LOOP
        .TTYOUT         ;OTHERWISE PRINT IT
        BR      1$      ;REPEAT LOOP
DONE:   .EXIT

MSG:    .ASCIZ /Hello, world!/
        .END    HELLO

このプログラムファイル名をHELLO.MACとしたとき、アセンブルしてリンクして実行するときのコンソールの表示は以下のようになる:

.MACRO HELLO
ERRORS DETECTED:  0

.LINK HELLO

.R HELLO
Hello, world!
.

(RT-11のコマンドプロンプトは「.」である)

MACRO-11 のコードのもっと複雑な例としては、ケビン・ミュレル[11]KPUN.MAC[12] やファーバ・リサーチ[13]の JULIAN[※ 3] ルーチンがある。その他のPDP-11用コードのライブラリとして Metalab[※ 4]Trailing Edge[※ 5] アーカイブがある。

これらのコードを PDP-11 エミュレータで実行してみることもできる。ボブ・スプニク[14]SIMHPDP-11だけでなく各種アーキテクチャをエミュレートでき、それらアーキテクチャのオペレーティングシステムのソフトウェアキットを含む(RT-11もある)。

PDP-11 の機種

[編集]

PDP-11プロセッサはI/Oバスの種類などでいくつかのグループに分類される。いずれのグループも各機種にはOEM版とエンドユーザー版がある。どの機種であっても命令セットは同じだが、後期機種には新命令が追加されており、一部命令の動作が若干異なる。アーキテクチャの進化に伴い、プロセッサのステータス/コントロールレジスタ群の扱い方も変化している。

Unibus 機種

[編集]
当初の PDP-11/20 のフロントパネル
当初の PDP-11/70 のフロントパネル
後期の PDP-11/70 とディスク装置とテープ装置

以下の機種は主要バスとして Unibus を使用:

  • PDP-11(後に PDP-11/20 に改名), PDP-11/15 - 最初の機種。マイクロプログラム方式でないプロセッサを使用。ジェームス・オラフリン[15]が設計。浮動小数点数はオプション。
  • PDP-11/35, 11/40 - /20 をマイクロプログラム方式にした後継。ジェームス・オラフリンが設計チームを率いた。
  • PDP-11/45, 11/50, 11/55 - 磁気コアメモリと同時に半導体メモリ(最大256kB)を使用可能とした高速なマイクロプログラム方式プロセッサ。FP11 FPU をオプションでサポートし、浮動小数点数のフォーマットがこれによって確立された。
  • PDP-11/70 - 11/45 のアーキテクチャを物理メモリ4MBまで拡大し、専用メモリバスを装備し、2Kバイトのキャッシュメモリを備え、Massbus で 高速I/Oデバイスを接続。
  • PDP-11/05, 11/10 - 11/20のコスト低減版
  • PDP-11/34, 11/04 - 11/35と11/05のコスト低減版。PDP-11/34 のコンセプトはボブ・アームストロング[16]によるもの。11/34はUnibusメモリを最大256kBまでサポート。11/34a ではFPUオプションをサポートし、11/34c ではキャッシュメモリオプションをサポート。
  • PDP-11/60 - ユーザーが書き込み可能なマイクロプログラム記憶装置を持つ PDP-11。ジェームス・オラフリンが率いる別のチームの設計
  • PDP-11/44 - 11/45と11/70の後継。標準でキャッシュメモリ浮動小数点ユニットを装備したもの。このマシンには洗練されたシリアル・コンソールを装備し、4MBの物理メモリをサポート。設計チームは John Sofio が率いた。複数ICでCPUを構成した最後の機種。
  • PDP-11/24 - Unibus使用のPDP-11で初のVLSI版 PDP-11。Fonz-11 (F11) チップセットとUnibusアダプタを使用
  • PDP-11/84 - VLSI Jaws-11(J11) チップセットとUnibusアダプタを使用
  • PDP-11/94 - J11ベースで 11/84 よりも高速

Q-bus 機種

[編集]
LSI-11/23のカバーを外したところ

以下の機種は主要バスとして Q-bus を使用:

  • PDP-11/03 (LSI-11/03) - 最初のLSI版 PDP-11。ウェスタン・デジタル社のMCP-1600チップセットを使用し、60kBまでのメモリをサポート。
  • PDP-11/23 - 第2世代のLSI (F-11) を使用。初期のユニットのメモリ容量は 248Kバイトだが、後に 4Mバイトまでサポートするようになった。
  • PDP-11/23+/MicroPDP-11/23 - プロセッサカード上の機能を強化した 11/23
  • MicroPDP-11/73 - 第3世代LSI-11。高速な Jaws-11 (J-11) チップセットを使用し、最大4MBのメモリをサポート。
  • MicroPDP-11/53 - オンボードメモリを持つ低速版 11/73
  • MicroPDP-11/83 - PMI(private memory interconnect)を使った高速版 11/73
  • MicroPDP-11/93 - さらに高速。Q-bus を使用した最後の PDP-11
  • Mentec M100 - Mentecが再設計した 11/93.J-11チップセットを 19.66MHz で駆動し、4個のオンボード・シリアルポート、最大4MBのオンボードメモリ、オプションのFPUがある。
  • Mentec M11 - プロセッサアップグレードボード。Mentec による PDP-11マイクロコードの実装で、テキサス・インスツルメンツの TI 8832 ALU と TI 8818 マイクロシーケンサを使用。
  • Mentec M1 - プロセッサアップグレードボード。Mentec による PDP-11マイクロコードの実装で、Atmelの0.35μmASICを使用[17]
  • Quickware QED-993 --高性能 PDP-11/93 プロセッサアップグレードボード

標準以外のバスを採用した機種

[編集]
PDT-11/150
  • PDT-11/110
  • PDT-11/130
  • PDT-11/150

PDTシリーズは「スマート(賢い)端末」としてマーケティングされたデスクトップシステムである。/110 と /130 はVT100端末と同じ筐体だった。/150は8インチFDDを2つ、非同期シリアルポートを3つ、プリンターポートを1つ、モデムポートを1つ、同期シリアルポートを1つ備えた装置で、端末そのものは別途接続する必要がある。どれもLSI-11/03と同じ4つのチップで構成されるチップセットを使用している。/150とVT105を組み合わせたシステムは MiniMINC として販売された。

  • PRO-325
  • PRO-350
  • PRO-380

DEC Professional シリーズは IBM808880286 ベースの初期のパーソナルコンピュータに対抗しようとしたデスクトップ機である。5.25インチフロッピーディスクドライブを装備し、325 以外はハードディスクも装備していた。CPU は LSI-11 で、RSX-11M+ にメニューシステムを追加した P/OS が動作した。既存のPDP-11とのソフトウェア互換を意図的に阻害したため、(DEC以外の人々に予想された通り)市場では全く振るわなかった。また、RT-11も移植された。DEC内部ではRSTS/Eも移植されたが、外部にはリリースされなかった。325と350は DCF-11 (Fonz) チップセットを採用しており、PDP-11/23などと同じである。380は DCJ-11 (Jaws) チップセットを採用しており、MicroPDP-11/53 などと同じだが、周辺チップセットの制約からクロック周波数は10MHzに制限されていた。

実際には商品化されなかった機種

[編集]
  • PDP-11/27 - 主要I/Oバスとして VAXBIバス(VAX用32ビットバス)を使った Jaws-11 を使った実装
  • PDP-11/68 - 物理メモリ4MバイトをサポートするPDP-11/60の後継
  • PDP-11/74 - PDP-11/70をマルチプロセッサ化したもの。最大4個のプロセッサを相互接続し、ケーブルの取り回しが非常に難しくなった。また、ビジネス向きの命令セット拡張も行われている。いくつかのプロトタイプが組み立てられ、少なくとも2台のマルチプロセッサシステムがユーザーサイトでベータテストを受けたが、公式には出荷されることはなかった。4プロセッサシステムは RSX-11 オペレーティングシステム開発チームがテストし、シングルプロセッサ機は開発チーム全体のタイムシェアリング環境として使われた。11/74は32ビット機 VAX 11/780 と同時期に計画された。フィールドでの保守の問題でキャンセルされた[18]。いずれにしてもDECはPDP-11ユーザー全部をVAXに移行させることはできなかった。その原因は性能ではなく、PDP-11のリアルタイム性の良さにある[要出典]

特殊バージョン

[編集]
DEC GT40 (ルナーランダー英語版が動作中)
MINC-23
  • GT40 - PDP-11/05をベースとしたベクターグラフィック端末
  • GT42 - PDP-11/10をベースとしたベクターグラフィック端末
  • GT44 - PDP-11/40をベースとしたベクターグラフィック端末
  • GT62 - PDP-11/34aをベースとしたベクターグラフィック端末
  • H-11 - LSI-11/03の Heathkit社 OEM版
  • VT20 - PDP-11/05ベースのテキスト端末(ダイレクトマップ方式)で、テキスト編集と組版用
  • VT71 - LSI-11/03ベースのテキスト端末(ダイレクトマップ方式)で、テキスト編集と組版用
  • VT103 - LSI-11を搭載したバックプレーン内蔵のVT100端末
  • VT173 - PDP-11/03をベースとしたハイエンド端末。ホストからシリアル接続で編集ソフトウェアをダウンロードして使用できる。出版社などで使われた。
  • MINC-11 -- PDP-11/03 または 11/23 をベースとした実験用システム[19]。11/23ベースのものは MINC-23 として販売されたが、MINC-11からMINC-23へのフィールドアップグレードが可能だった。命令セットが微妙に変更されており、MINC-23用ソフトウェアは11/23では動作できないことがあった。後期モデルでは互換性を確保していた。
  • C.mmp -- カーネギーメロン大学によるマルチプロセッサシステム

海賊版クローン

[編集]

PDP-11は非常に人気があったため、鉄のカーテンの向こう側で無許可のクローンが何種類か製造された。一部はDECのPDP-11とピン互換があり、周辺機器やシステムソフトウェアを流用することができた。以下のような機種が知られている:

オペレーティングシステム

[編集]

PDP-11では以下のようなオペレーティングシステム (OS) が使用可能であった。

DEC製:

サードパーティー製:

使用

[編集]
紫外線観測の人工衛星IUEの制御システム。PDP-11/35が組み込まれている。

PDP-11ファミリは様々な用途で使われた。標準ミニコンピュータとして、タイムシェアリングシステム、科学技術計算、教育、ビジネスなどに使われた。またリアルタイムシステムとして、プロセス制御ファクトリーオートメーションにも使われた。

OEM版は大規模システムの制御用組み込みシステムとして使われることが多かった。交通信号システム、医療システム、CNC機械加工、ネットワーク管理などに使われた。例えば、パケット交換網の管理に使われた例がある。1980年代のイギリスの航空交通管制でのレーダー情報処理には、PDP-11/34をベースとしたシステムが使われていた。放射線療法機器セラック25はPDP-11/23を組み込んでいた[26]

テラダイン英語版半導体試験装置のテストプログラム格納用にPDP-11を採用していた。組み込みシステムで使われたPDP-11は、ソフトウェアの2000年問題で使用不可能になるまで使われ続けたものが多い。アメリカ海軍は、パイロットの空間識失調状態の訓練を行うシミュレータで、2007年までPDP-11/34を使い続けていた。今ではPDP-11のソフトウェアをPC上のエミュレータで実行している[27]

注釈

[編集]

出典

[編集]
  1. ^ What We Learned From the PDP-11”. microsoft.com. p. 139 (1975年). 2008年9月10日閲覧。
  2. ^ a b c 16-bit Timeline”. microsoft.com. 2008年9月閲覧。
  3. ^ Ceruzzi, Paul (2003), A History of Modern Computing, MIT Press, p. 238, ISBN 978-0-262-53203-7, https://books.google.co.jp/books?id=x1YESXanrgQC&lpg=PA238&dq=pdp-11+%22cp/m%22&pg=PA238&redir_esc=y&hl=ja#v=onepagef=false 2010年8月5日閲覧。 
  4. ^ Conner, Doug. “Father of DOS Still Having Fun at Microsoft”. Micronews. 2010年8月5日閲覧。
  5. ^ a b Bakyo, John. "DEC PDP-11, benchmark for the first 16/32 bit generation. (1970)" in Great Microprocessors of the Past and Present (V 13.4.0), Section Three, Part I. Accessed 2011-03-04
  6. ^ "The Development of the C Language" in section More History, by Dennis M. Ritchie. Accessed August 5, 2011.
  7. ^ PDP-11は何台売れたのか
  8. ^ Dennis M. Ritchie (March 1993). “The Development of the C Language”. ACM SIGPLAN Notices 28 (3): 201–208. doi:10.1145/155360.155580. http://cm.bell-labs.com/cm/cs/who/dmr/chist.html. "People often guess that they were created to use the auto-increment and auto-decrement address modes provided by the DEC PDP-11 on which C and Unix first became popular. This is historically impossible, since there was no PDP-11 when B was developed. The PDP-7, however, did have a few `auto-increment' memory cells, with the property that an indirect memory reference through them incremented the cell. This feature probably suggested such operators to Thompson; the generalization to make them both prefix and postfix was his own. Indeed, the auto-increment cells were not used directly in implementation of the operators, and a stronger motivation for the innovation was probably his observation that the translation of ++x was smaller than that of x=x+1." 
  9. ^ Press Release re transfer of Operating Systems
  10. ^ PDP-11/70 CPU core and SoC :: Overview。2014年8月15日閲覧。
  11. ^ : Kevin Murrell
  12. ^ kpun.mac
  13. ^ : Farba Research
  14. ^ : en
  15. ^ : James O'Loughlin
  16. ^ : Bob Armstrong
  17. ^ Development Project Report
  18. ^ Bruce Mitchell, Brian S. McCarthy (2005年). “Multiprocessor FAQ”. Machine Intelligence. 2011年5月21日閲覧。[リンク切れ]
  19. ^ Binary Dinosaurs - Digital MINC-11
  20. ^ TPA-1140
  21. ^ TPA-1148
  22. ^ TPA-11/440
  23. ^ CalData_brochure
  24. ^ a b c http://www.village.org/pdp11/faq.pages/pdpOSes.html
  25. ^ Brinch Hansen, Per (1976), The Solo Operating System: A Concurrent Pascal Program, http://brinch-hansen.net/papers/1976b.pdf 2011年6月22日閲覧。 
  26. ^ Leveson, Nancy G., and Clark S. Turner. "An Investigation of the Therac-25 Accidents." Computer July 1993: 18-41.
  27. ^ Claremont, Bruce (February 2008). “PDP-11 Replacement Keeps the Navy’s MSDD Spinning”. 2012年5月閲覧。

参考文献

[編集]
  • PDP11 processor handbook - PDP11/05/10/35/40, Digital Equipment Corporation, (1973) 
  • PDP11 processor handbook - PDP11/04/34a/44/60/70, Digital Equipment Corporation, (1979) 

関連文献

[編集]
  • Eckhouse, jr., Richard H.; Morris, L. Robert (1979), Microcomputer Systems Organization, Programming and Applications (PDP-11), Englewood Cliffs, New Jersey: Prentice-Hall, ISBN 0-13-583914-9 
  • Michael Singer, PDP-11. Assembler Language Programming and Machine Organization, John Wiley & Sons, NY: 1980.

外部リンク

[編集]