KDF11

ミニコンピュータらしいミニコンピュータといったら、何を思い浮かべますか。こんな質問をしたら、どんな答が返ってくるでしょうか。知らないよ、そんなもん、なんて答が大部分を占める時代になってしまっているだろうとは思います。。でも中には、NOVAだね、うん、いいコンピュータだった、なんていう人もいるかもしれません。しかし、おそらくDECの製品、しかもPDP-11という答は有効解答の中でそれなりの割合を占めるに違いないでしょう。
最大の特徴は整った命令体系にあり、強力なアドレッシングモードによってアセンブラプログラミングが比較的しやすく、スタックフレームを使う高級言語を実装することも容易で、魅力的でした。アーキテクチャがシンプルで理解しやすい上に(ほかのコンピュータに比べれば)安価だったため、計算機教育の現場でも使われることが多かったと思います。
そんなわけで、多数のユーザがいて、多くのソフトウェア資産やハードウェア資産があり、新興勢力のマイクロコンピュータ勢とは貯えているものが違いました。

とはいえ、ミニコンピュータのCPUをLSI化、つまりマイクロコンピュータ化するのをためらう理由はありません。ミニコンピュータをLSIで実装すれば、コンパクトで低価格、さらに高性能を引き出せるかもしれない。しかも手本は手元にある。大型コンピュータと違い、比較的小規模なコンピュータなので、当時のLSI技術でもLSI化できる見込みはある。ソフトウェアはそのまま使えるし、バスも従来製品のものを踏襲すれば、入出力やメモリシステムを最初から設計し直す必要はない。というわけで、ミニコンピュータを製造していた各社はLSI化に取り組みます。先に話に出てきたNOVAもmicroNOVAとしてマイクロコンピュータ化されています(Fairchild Semiconductor社が製造)。もちろん、ミニコンピュータ界の巨人DECも動きます。
結局、DECは1975年6月に、Western Digitalからマイクロプログラム方式のLSIセットであるMCP-1600を買い込み、それに実行させるマイクロプログラムを書き上げてPDP-11と互換を持たせる方法で、LSI化したミニコンピュータを開発し発表しました。それがLSI-11です。そして、1977年には半分の基板サイズにCPUだけを実装したLSI-11/2を発表します。なお、MCP-1600はPascalのP-Codeを直接実行するPascal Microengineの実装にも使用されたLSIセットです。

ここに紹介するのは、モジュール番号M8186、モデル番号KDF11-AA、LSI-11/23 CPUという製品です。22.8 cm×13.2 cmの基板上に中心的な働きをする3個のMOS LSIが搭載され、さらにバッファや周辺回路のサポートに約50個のICが実装されています。中心となるLSIのチップセットはF11と呼ばれ、データチップのDC302、コントロールチップのDC303、メモリ管理ユニット(MMU)のDC304から構成されます。オプションで浮動小数点演算命令をサポートするマイクロプログラムROMも搭載できます。これらはDECの独自開発で、LSI-11とLSI-11/2の後継として1979年3月に発表されました。
初期のPDP-11は16 bitアドレスで64 KByteのメモリ空間でしたが、後にMMUを搭載したモデルも開発されました。その最終的なMMUと互換のLSIを搭載しているため、最大4 MByteのメモリ空間をサポートします(組み込むシステムのバス仕様によっては18 bitアドレス空間しか使えない場合もあり、その時は256 KByte)。なお1980年頃は16 Kbit D-RAMが主流の時代です。4 MByteというアドレス空間は広大でした。

これがボード全景。4層基板にLSIが3個の他、約50個のICが実装されている。右側がLSI-11バスに接続するカードエッジコネクタ。このほかにメモリボードやI/Oボードなど数枚から十数枚の基板を組み合わせてシステムを構築する。

LSI11/23 full

基板中央部のチップセット周辺を拡大すると、こうなります。え、抵抗モジュールの色なんかが上と違う?2枚あるんです。

KDF11 up

中央上部に見える40ピンパッケージの上にある2個の金色部分がデータチップとコントロールチップ。中央下部の40ピンパッケージがMMUになります。空きソケットのうち、上にある方が浮動小数点演算命令追加用ROMのスペース。残るひとつは予備のマイクロプログラム用ソケット。
1979年の設計としては高級で美しい基板です。4層基板にピン間2本通し。普通のパーソナルコンピュータや民生組み込みコンピュータでは両面基板の1本通しが普通の時代ですから。

ではチップの拡大写真。

F11 chips

上部右側のLCCパッケージ(金色の部分)がDC302データチップで演算を司る部分。左側がDC303コントロールチップで内蔵のマイクロ命令に従ってデータチップや外部回路を制御する部分になります。この二つのチップはLCCというパッケージに個別に封入されており、40ピンのICパッケージの形をしたセラミック基板にハンダ付けされています。それぞれの電源バイパスコンデンサもそばに取り付けられていますね。下のICがDC304メモリ管理ユニットです。
ところで、データチップとコントロールチップの実装方式が上から見るとわかりにくいので別の角度から。

packages of F11 chips

こんな風にセラミック基板の上にLCCパッケージが取り付けられています。で、セラミック基板の中で多層配線をやっているらしくて、セラミック基板部分が普通のICと比べても厚くなっています。横のMMUと厚みを比較してみてください。

この後、1983年8月にはLSI-11系列最終モデルの、J11チップを用いたLSI-11/73が発表されます。キャッシュメモリまで含んだ高性能16 bitミニコンピュータですが、DECの主力製品はVAX-11系列の32 bitスーパーミニコンピュータになっていました。製品の寿命が終わりかけていた時期にあたります。もっともVAX-11の中にはブート制御やシステムコンソール制御のためにLSI-11が組み込まれていましたが。
私は1985年頃、LSI-11/73を使っていました。当時のPCと比べれば、それなりの高性能でした。ただ、バスの規格が古くなっていて、バスの転送速度によって能力がかなり押さえられてしまっていた印象があります。だからこそLSI-11/73はキャッシュメモリをボード上に搭載し、性能をなんとか維持していたのでしょうが。LSI-11バスはUNIBUSの流れを汲み、IBM-PC/ATのISA busと同程度かそれより遅いくらいでした。バスを再設計して、膨大な周辺ボードまで開発し直したりOSを書き換えるほどの価値はないと判断されたのでしょう。パーソナルコンピュータレベルの能力がだんだん近づいてきていましたから。
また、ミニコンピュータの用途としては汎用計算機として使われる他に、大きな工場の機械群を制御する組み込み用コンピュータという面がありました。こちらは8 bitや16 bitのマイクロプロセッサを複数使って制御した方が開発や運用が楽になるということから、やはりシェアを減らします。マイクロプロセッサを組み合わせるぐらいでは使い物にならない、データベースを操作しながら行うような工場全体の製造管理システムにはスーパーミニコンピュータや大型コンピュータが使われるでしょうから、マイクロプロセッサの高性能化に伴い、未来が閉ざされてしまいました。なお、さらにコストが厳しく性能が低くてもかまなわい分野の組み込み用コンピュータとして使われていたPDP-8シリーズは、PDP-11シリーズより先にマイクロコンピュータの波にのまれてしまっています。そういえば、PDP-8/EはIntersil社からIM6100シリーズとしてマイクロプロセッサ化されています。IM6100シリーズの際立った特徴に完全CMOS化という点があります。低消費電力で電源電圧範囲も広く(4 - 12 V)、乾電池を(安定化電源回路を通さずに)そのまま電源にして動くコンピュータが作れました。

レジスタはR0からR7までの8個。ただし、R6がスタックポインタ、R7がプログラムカウンタとして使われます。これらのレジスタはR7に例外がある他はすべて同等に使われます。R5もR6 (SP)も演算対象になりますし、インデックスレジスタにもなります。
アドレッシングモードは基本が8種類。レジスタ直接、レジスタ間接、オートインクリメントレジスタ間接、オートインクリメントレジスタ間接の間接、オートデクリメントレジスタ間接、オートデクリメントレジスタ間接の間接、インデックス、インデックス間接です。これらのレジスタ指定にはR7 (PC)も使えますが、オートデクリメントモードがないなどの例外があり、特別なアドレッシングモード名で呼ばれます。まずPCのオートインクリメント間接モードですが、PCは常にこれからフェッチする命令を指している、つまりある命令を実行中ならその命令の次のアドレスを指していることを考えると、イミディエートモードであることがわかります。PCの指しているメモリの内容とは実行中の命令の次のアドレスの内容で、それを操作対象にして、ついでにPCを+2するわけですから、イミディエートアドレッシングに他なりません。また、PCのオートインクリメント間接の間接モードは、ダイレクトアドレッシングに相当します。つまりPCの指しているアドレスの内容をアドレスと解釈して、そのアドレスの指すメモリの内容を操作するわけですから、命令直後の内容の示す位置のメモリを操作することになります。PCのインデックス修飾とは、PCに定数を加えたアドレスになりますから、PC相対アドレッシングです。このように、レジスタが汎用であること、そのレジスタの中にプログラムカウンタが含まれてしまうことを利用して、実に強力で多様なアドレッシングモードが使えます。

基本アドレッシングモードが8種類であることから、アドレッシングの種別を示すために3 bitが必要です。その時に併用されるレジスタも8種類ですから、レジスタ指定に3 bit、合計6 bitが完全なアドレッシングモード指定に必要となります。ADDやMOVなどの2項演算命令では、両方のオペランドに6 bitずつのアドレッシングモード指定が行われます。片方のオペランドがレジスタに固定されるようなことはありません。つまり、単独のADD命令で、R2の指すメモリの内容と、R4の指すメモリの内容をポインタとして間接参照したメモリ内容を加算して、R2の指すメモリに格納し、ついでにR2をオートインクリメントで+2するといったようなことがまとめて行えます。C言語風に書けば、register int *p, **q;のときに、*p++ += **q;みたいなことが1命令で可能です。MOV命令もレジスタを介さずにメモリ─メモリ間の転送を行うこともできますし、オートインクリメントやオートデクリメントアドレッシングを使えば、ブロック転送も簡単です。2項演算命令は15種類ありますから、なんと全命令ビットパターンの15/16までを2項演算命令で消費してしまいます。(インデックス修飾定数などアドレッシングで使われるワードを除く命令本体は16 bitで表され、2項分のアドレッシングに12 bit使われるので、残り4 bit、つまり16種類の命令空間しか残されていない。そのうちの15個まで、実際に2項命令に使われてしまうので、残りの命令は上位4 bitが固定された値になる。)もちろん、1項演算もすべてのアドレッシングモードが使えますし、JMP命令にもすべてのアドレッシングモードが使えます。

個別の命令ですが、まずは簡単にアセンブリ言語のニーモニックだけ示すことにします。よく言われるMC6800/MC6809/MC68000との類似が(もちろんこちらがオリジナルですが)わかると思います。詳細はリクエストがあれば。なお、LSI-11/23標準命令セットだけです。ニーモニック名の後ろに(B)とあるのはバイト操作命令であることを示します。つまりADCならワード単位でADCBならバイト単位の操作命令になります。

ADC(B)  ADd Carry
ADD     ADD
ASH     Arithmetic SHift
ASHC    Arithmetic SHift Combined
ASL(B)  Arithmetic Shift Left
ASR(B)  Arithmetic Shift Right
BCC     Branch if Carry Clear
BCS     Branch if Carry Set
BEQ     Branch if EQual
BGE     Branch if Greater than or Equal
BGT     Branch if Greater Than
BHI     Branch if HIgher
BHIS    Branch if HIgher than or Same
BIC(B)  BIt Clear
BIS(B)  BIt Set
BIT(B)  BIt Test
BLE     Branch if Less than or Equal to
BLO     Branch if Lower
BLOS    Branch if Lower or Same
BLT     Branch if Less Than
BMI     Branch if MInus
BNE     Branch if Not Equal
BPL     Branch if PLus
BPT     BreakPoint Trap
BR      Branch
BVC     Branch if V bit Clear
BVS     Branch if V bit Set
CLR(B)  Clear
CCC     Clear all Condition Code bits
CLC     CLear C
CLN     CLear N
CLV     CLear V
CLZ     CLear Z
CMP(B)  CoMPare
COM(B)  COMplement
DEC(B)  DECrement
DIV     DIVide
EMT     EMulator Trap
HALT    HALT
INC(B)  INCrement
IOT     I/O Trap
JMP     JuMP
JSR     Jump to SubRoutine
MARK    MARK
MFPD    Move From Previous Data space
MFPI    Move From Previous Instruction space
MFPS    Move byte From Processor Status word
MFPT    Move From Processor
MOV(B)  MOVe
MTPD    Move To Previous Data space
MTPI    Move To Previous Instruction space
MTPS    Move byte To Processor Status word
MUL     MULtiply
NEG(B)  NEGate
NOP     No OPeration
RESET   RESET external bus
ROL(B)  ROtate Left
ROR(B)  ROtate Right
RTI     ReTurn from Interrupt
RTS     ReTurn from Subroutine
RTT     ReTurn with T bit Set
SBC(B)  SuBtract Carry
SCC     Set all Condition Code bits
SEC     SEt C
SEN     SEt N
SEV     SEt V
SEZ     SEt Z
SOB     Subtract One and Branch if not Equal to 0
SUB     SUBtract
SWAB    SWAp Byte
SXT     Sign eXTend
TRAP    TRAP
TST(B)  TeST
WAIT    WAIT for interrupt
XOR     eXclusive OR
以上です。拡張命令や条件分岐命令やフラグ操作命令など、概念的には共通で個別の命令になっているものが多くわかりにくくなっていますが、直交性のあるシンプルで強力な命令体系になっています。Motorolaは少なくともニーモニックを参考にしていたことはわかりますよね。
 

おまけ。

manual etc.

LSI-11システムのマニュアル・資料類。厚さは3 - 4 cmあります。ボードを自作するのにも重要な資料となります。バスタイミングの説明方法など、Motorola社のMC68000のマニュアルとそっくりなのだけど、当然Motorolaが参考にしていたのだろうね。

忘れていましたが、右側の書籍の表紙のコンピュータには、昔のミニコンピュータに見られたLEDとスイッチの並んだパネルがありません。これもある意味PDP-11シリーズの特徴です(コンソールパネル付きのモデルもある)。(スーパーのつかない)ミニコンピュータ全盛の時代には、ROMというICは特殊なものでしたから、紙テープやディスクからのブートプログラムをROMに内蔵できないことも多く、最初のブートプログラム(IPL)はコンソールパネルから手でメモリに書き込む必要がありました。その他、ソフトウェアやハードウェアトラブルの対処のためにもコンソールパネルからメモリやI/Oを直接読み書きできると便利なため、普通はコンソールパネルにスイッチやランプが並べられていました。なにせ4 KWordとか8 KWordとかしかメインメモリがないシステムも多かったですから、メモリに自分のプログラム以外のデバッガまでロードする余裕がないってこともありますし。ですからコンソールパネルからプログラムをシングルステップ実行させ、メモリの内容を確認したりするのがデバッグ手段として有効だったりしたのです。
それに対し、PDP-11ではコストダウンのため、マイクロプログラム内にデバッガを組み込んでいました。つまりメインメモリ上に何もプログラムがなくても、CPU内のマイクロプログラム制御だけでテレタイプ端末からメモリを読み書きできるようになっていました。ハードウェア異常割り込みのときにも自動的にこのデバッガが動作するように設定することもできます。8進数でデータやアドレスを表現したためOctal Debugging Technique (ODT)あるいはMicrocode ODTと呼ばれていた、このコンソールパネルエミュレータは、ODT-11というデバッガのサブセットになっています。
LSI-11シリーズではジャンパーオプションでリセット時にODTが起動するか特定のアドレスからブートプログラムを自動実行するか選べました。また、筐体フロントパネルのHALTスイッチでOSを含むプログラムの実行を中断してODTを起動することができます(ODTでの操作が何か完了してから継続実行のODTコマンドを打ち込めば、ちょうど割り込みから帰るように中断されたプログラムを継続実行することもできる)。
CPUボードとTTYインターフェースが1ポート、さらに電源とバスラインが正常であるならばODTを使えます。メモリやディスクなどの他の入出力装置は不要です。時間的制約を除けば入出力装置もすべてメモリ空間にマップされていましたから、ODTから操作できます。そのため、LSI-11を計測制御に使うためにボードの自作をしたりとか、デバッグ用ツールの使いにくいシステムレベルのプログラムをいじっているような人なら、しばしばODTを使うこともあったはずです。そんな方なら、イナナゴロシなんて語呂合せを覚えているかもしれません。というか、誰かとミニコンピュータ関係の話題で会話しているときに、突然イナナゴロシって言葉を出して反応があれば、PDP-11の管理やら下位レベルの何かをしていた経験がある人だって見分けがつきます。はい。ちなみにこれは8進数表示の177564で、ODTも使用するシステム標準TTYインターフェースのレジスタアドレスのひとつです。

Return to IC Collection