PDP-8
PDP-8は、世界で初めて商業的に成功したミニコンピュータであり、1960年代にディジタル・イクイップメント・コーポレーション(DEC)が製造した。1965年3月22日に登場し、DECのPDPシリーズでも最初に広く販売されるコンピュータとなった[1]。
目次 |
[編集] 概要
PDP-8は12ビットコンピュータである。標準では、主記憶装置は4,096ワード(6Kバイト相当)で、最大32,768ワード(48Kバイト相当)まで搭載可能。当初、PDP-8は8種類の基本命令、ほかにグループ1 命令、グループ2 命令と呼ぶ命令群と2個のレジスタ(12ビットのアキュムレータ(AC)1個と1ビットのリンクレジスタ(L)と呼ぶキャリーのレジスタ、またはキャリーフラグ、1個)を備えていた。磁気コアメモリをクロックサイクル時間1.5μ秒で駆動し、一般的な2サイクル(フェッチ、実行)のメモリ参照命令の実行速度は 0.333MIPSである。後期の機種では新たなレジスタが追加され(積/商レジスタ、MQ)、乗除算命令が追加された。
技術史的観点からもPDP-8は重要な位置を占めている。入出力機構、ソフトウェア開発、オペレーティングシステム設計などに影響を与えた。Apple IIのようなマイクロコンピュータが一般化するまで、PDP-8は世界で最も販売台数の多いコンピュータであった。 これ以前にPDP-5が出ているが、汎用のコンピュータを指向したものではなかった。
最初のPDP-8("Straight 8"と呼ばれる)はトランジスタで構成されており、フリップチップカードでパッケージされ、小型冷蔵庫並みのサイズであった。その後、トランジスタ構成のままPDP-8/Sが登場。1ビット直列ALUを採用したため PDP-8/S は小型化/低価格化されたものの、オリジナルに比べて遥かに低速だった。その後のシステム(PDP-8/I(PDPシリーズ初のIC化), /E, /M, /A)は完全並列ALUに戻され、TTL集積回路を採用している。最終バージョンではカスタムCMOSマイクロプロセッサが使われている。いわゆる「System-on-a-chip」が使われたことはない。しかし、最近ではFPGA1個にPDP-8のシステム全体を構成する者もいた(PDP-8のCPU、メモリ、I/Oの全てを含めても最近のマイクロプロセッサのキャッシュメモリ以下の論理ゲート数で済むのである)。
[編集] PDP-8のバージョン
PDPシリーズのベストセラーPDP-8ファミリーの総売上台数は300,000台を超えると推定されている。以下のような機種が製造された。
- PDP-8 (16,000ドル、机上据え置き型)
- LINC-8
- PDP-8/S Small (PDP-8の次機種。小型化IC化前PDPシリーズ最後のトランジスタ回路機、驚異の「1万$コンピュータ」と言われた画期的低価格で日米欧市場で歓迎された。ラックマウント型。)
- PDP-8/I PDPシリーズ初IC化
- PDP-8/L Low Cost
- PDP-12
- PDP-8/E Economy(外観寸法は8/Sと同じ)
- PDP-8/F
- PDP-8/M
- PDP-8/A
- Intersil 6100 はシングルチップのPDP-8互換マイクロプロセッサ (VT78端末に使われた)
- Harris 6120 は、CMOS版シングルチップのPDP-8互換マイクロプロセッサ (DECmate ワープロ機に使われた)
[編集] 入出力
I/O(入出力)システムはPDP-8の頃に大きな変化を迎えた。初期のPDP-8の入出力は、フロントパネル、紙テープリーダー、テレタイププリンタ(ASR-33/KSR-33)、そしてオプションの紙テープパンチャーで構成されていた。その後、磁気テープ、RS-232Cなどによるダム(dumb)端末、パンチカードリーダー、固定ヘッド式磁気ディスク装置などが追加されていった。最後のころにはフロッピーディスクやハードディスクが一般的になっていた。最近の愛好家はIDEアダプターを(本物あるいはシミュレートされた)PDP-8に接続している。
I/Oは以下のようないくつかの手段でサポートされている:
- バックプレーン上の専用I/Oコントローラ
- "Negative" I/Oバス(Lo電圧が1)
- "Positive" I/Oバス(Hi電圧が1)
- Omnibus(専用でないバックプレーン上のスロット)
基本的なDMA方式 (three-cycle data break) がサポートされている。これにはプロセッサの支援が必要だった。本来ならば各I/Oデバイスが持つべき回路を共通化してプロセッサ側に置き、プロセッサがDMAアドレスレジスタとワードカウントレジスタを設定する。その後の3メモリサイクルでプロセッサはワードカウントを更新し、転送アドレスを更新し、最後に実際のI/Oデータワードをやりとりする。初期のPDP-8から備えられていた機能であるが、PDP-8/Eのころにはこの回路は非常に安価になったので、"one-cycle data break"が一般化した。これは個々のI/Oデバイス側にハードウェアによるDMAアドレスレジスタとワードカウントレジスタを持たせ、ディスクドライブや磁気テープなど高速I/Oデバイスとメモリ間でプロセッサを介さず直接メモリへの読み・書きをするDMAを行うものであり、実質3倍の転送性能となった。
[編集] プログラミング環境
PDP-8の最も基本的なソフトウェア開発システムは、機械語をバイナリ形式でフロントパネルから入力するものであった。その後、PAL-8アセンブリ言語のソースコードを紙テープに格納し、メモリにロードし、紙テープにセーブされ、紙テープからアセンブルされてメモリに格納されるようになった。紙テープ方式のプログラミング言語としては他に FOCAL インタプリタや 4K FORTRANコンパイラなどがある。最終的には OS/8 や COS-310 といったオペレーティングシステムによって、ラインエディタやコマンドラインコンパイラといった開発システムが構築された。サポート言語としては、PAL-IIIアセンブリ言語、FORTRAN、BASIC、DIBOLなどがある。
初期のPDP-8システムにはオペレーティングシステムがなく、フロントパネルのスイッチしかなかった。様々な紙テープ式「オペレーティングシステム」が開発されたが、いずれもシングルユーザー方式であった。最後期には先進的なRTOSやマルチタスク/マルチユーザーシステムが利用可能となった。例えば RTOSの RTS-8、マルチユーザーシステムの COS-300 や COS-310、シングルユーザー用ワードプロセッシングシステム WPS-8 などがある。
タイムシェアリングシステム TSS-8 も使用可能であった。TSS-8 では複数のユーザーが110ボーの端末からシステムにログインすることができ、プログラムのエディット/コンパイル/デバッグが同時にできた。言語としては、BASICの特別バージョン、FORTRANのサブセット(サブルーチンを書けない)、ALGOLのサブセット版、FOCAL、PAL-Dアセンブラなどが利用可能である。
DECUS(Digital Equipment Computer User Society)はPDP-8用にユーザーが寄贈した相当量のソフトウェアを保有している。
[編集] 命令セット
- 基本命令
- 000 - AND - メモリオペランドと AC の AND (ACはアキュムレータの略)
- 001 - TAD - メモリオペランドと <L,AC>(13ビット値)の加算(2の補数とみなす、つまり符号付)
- 010 - ISZ - メモリオペランドをインクリメントし、結果がゼロならば次の命令をスキップする
- 011 - DCA - ACをメモリオペランド位置に保存し、ACをクリアする
- 100 - JMS - サブルーチンへジャンプ(サブルーチンの先頭ワードにリターンアドレスを保持する)
- 101 - JMP - ジャンプ
- 110 - IOT - 入出力転送
- 111 - OPR - マイクロコード化操作(必要に応じてAC、L、MQレジスタを使用)
- OPR命令では、様々な条件分岐を含むマイクロコード命令を使用できる。
- 一般に、同じグループ内の命令のビットパターンをORで合成してひとつの命令にすることができる。
- ビットパターンがゼロなら、それはNOP命令として扱われる。
- グループ1 命令
- CLA - AC クリア
- CLL - L ビットのクリア
- CMA - ACの 1の補数
- CML - L ビットの反転
- IAC - <L,AC>のインクリメント
- RAR - <L,AC> の右ローテート
- RAL - <L,AC> の左ローテート
- RTR - <L,AC> の右ローテート(2回)
- RTL - <L,AC> の左ローテート(2回)
- グループ2 命令
- SMA - AC < 0 のとき次命令をスキップ (or group)
- SZA - AC = 0 のとき次命令をスキップ (or group)
- SNL - L /= 0 のとき次命令をスキップ (or group)
- SKP - 無条件に次命令をスキップ
- SPA - AC >= 0 のとき次命令をスキップ (and group)
- SNA - AC /= 0 のとき次命令をスキップ (and group)
- SZL - L = 0 のとき次命令をスキップ (and group)
- CLA - ACをクリア
- OSR - ACとフロントパネルスイッチの間の論理和
- HLT - 停止
[編集] プログラム例
PDP-8のアセンブリ言語プログラムを例として示す。以下はPAL-IIIアセンブラによる"Hello world"である。
*10 / Set current assembly origin to address 10, STPTR, 0 / an auto-increment register (one of eight at 10-17) *200 / Set current assembly origin to program text area HELLO, CLA CLL / Clear AC and Link (carry) TAD (STRNG-1) / Set up string pointer in PRE-auto-increment register DCA STPTR / : NEXT, CLA CLL / Clear AC and Link again (needed when we loop back from tls) TAD I STPTR / Get next character, indirect via PRE-auto-increment address SNA / Skip if non-zero (not end of string) HLT / Else halt on zero (end of string) TLS / Output the character in the AC to the teleprinter TSF / Skip if teleprinter ready for character JMP .-1 / Else jump back and try again JMP NEXT / Jump back for the next character STRNG, 310 / H 345 / e 354 / l 354 / l 357 / o 254 / , 240 / (space) 367 / w 357 / o 362 / r 354 / l 344 / d 241 / ! 0 / End of string
[編集] PDP-8でのサブルーチン
PDP-8では汎用スタックをアーキテクチャ上サポートしていないため、サブルーチンを呼び出すときや割り込みが発生したときのコンテキスト(プログラムカウンタやACなどのレジスタ値)をセーブする方法が確立されていない。その代わり、リターンアドレスとしてのプログラムカウンタ値がターゲットサブルーチンの先頭ワードに格納される。従って、間接ジャンプ命令でサブルーチンから戻ることができる。
以下のプログラムはサブルーチンを使うように改造した "Hello world" である。
*200 / Set assembly origin (load address) HELLO, CLA CLL / Clear the AC and the Link bit TAD (DATA-1) / Point AC just *BEFORE* the data (accounting for later pre-increment behavior) DCA 10 / Put that into one of ten auto-pre-increment memory locations LOOP, TAD I 10 / Pre-increment mem location 10, fetch indirect to get the next character of our message SNA / Skip on non-zero AC HLT / Else halt at end of message JMS OUT1 / Write out one character JMP LOOP / And loop back for more OUT1, 0 / Will be replaced by caller's updated PC TSF / Skip if printer ready JMP .-1 / Wait for flag TLS / Send the character in the AC CLA CLL / Clear AC and Link for next pass JMP I OUT1 / Return to caller DATA, "H / A well-known message "e / "l / NOTE: "l / "o / Strings in PAL-8 and PAL-III were "sixbit" ", / To use ASCII, we'll have to spell that out, character by character " / "w / "o / "r / "l / "d / "! / 015 / 012 / 0 / Mark the end of our .ASCIZ string ('cause .ASCIZ hadn't been invented yet!)
リエントラント性や再帰呼び出しを実現しようとすると、プログラマは自分でコールスタックを用意し、リターンアドレスをスタックにセーブしなければならない。また、ROMを使うのも困難である(プログラムが書き換え可能でないとサブルーチンを使えないため)。ROMにプログラムを格納する場合、以下のような回避方法があった。
- サブルーチンを全く使わない
- 実行時にはRAMにコピーする
- RAMも一部内蔵したROMを使い、各ワードにフラグを設定してRAMを代替に使用するかどうかを指定する。(要するに非常に特殊なメモリを使用する)
[編集] 割り込み
PDP-8の入出力バスには1本の割り込みラインがあり、割り込みが発生すると割り込み不可状態となって 0番地のサブルーチンを呼び出すように動作する。サブルーチンと同様、割り込みもリエントラント性は無く、割り込みを不可とした状態で割り込みハンドラが動作し、JMP I 0 命令で割り込まれた箇所に戻るとき割り込み可とする。
I/Oバスの割り込みラインが1本なので、割り込み発生源が何かということは分からない。そのため、割り込み処理ルーチンは順に各デバイスのステータスをポーリングしてチェックし、割り込み元を識別した。この処理はスキップ命令が並ぶので"skip chain"と呼ばれた。skip chain の最後まで実行しても割り込み元が見つからないことは珍しいことではなかった。相対的な割り込みの優先順位は skip chain でチェックする順番で決定される。
[編集] 脚注
- ^ “The Digital Equipment Corporation PDP-8” (英語). アイオワ大学Computer Science Department. 2009年10月30日閲覧。
[編集] 関連項目
[編集] 外部リンク
いずれも英文
- the alt.sys.pdp8 FAQ
- http://www.cs.uiowa.edu/~jones/pdp8/
- PDP-8/E Simulator for Macintosh (Bernhard Baehr)
- http://simh.trailing-edge.com 各種OSで動作する非常にポータブルなPDP-8シミュレータ
- dpa ポータブルなPDP-8クロスアセンブラ
- SBC6120 PDP-8互換マシン販売サイト
- The Digital Equipment Corporation PDP-8, 1965 - スミソニアン博物館のコレクション