PDP-8

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内, 検索
スミソニアン博物館に展示されている PDP-8。初期のトランジスタを使用したPDP-8で、Straight 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-8/E のフロントパネル(筐体前面の外観。高さと幅の全寸法を撮したもの。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アセンブリ言語、FORTRANBASICDIBOLなどがある。

初期の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 でチェックする順番で決定される。


[編集] 脚注

  1. ^ The Digital Equipment Corporation PDP-8” (英語). アイオワ大学Computer Science Department. 2009年10月30日閲覧。

[編集] 関連項目

[編集] 外部リンク

いずれも英文

個人用ツール
名前空間
変種
操作
案内
ヘルプ
ツールボックス
他の言語