| 開発者 | デジタル・イクイップメント・コーポレーション |
|---|---|
| 製品ファミリー | プログラムされたデータプロセッサ |
| タイプ | ミニコンピュータ |
| 発売日 | 1965年3月22日 (1965年3月22日) |
| 導入価格 | 18,500米ドル、2024年には約185,000米ドルに相当 |
| 販売数 | 50,000以上 |
| プラットフォーム | PDP 12ビット |
| 前任者 | PDP-5 |
| 後継 | PDP-12 |
PDP -8は、Digital Equipment Corporation (DEC)が製造した12ビットミニコンピュータシリーズです。1965年に発売され、2万ドル以下で販売された最初のミニコンピュータであり、システム全体の価格が2万5000ドルという水準は、後にミニコンピュータクラスの定義となりました。[ 1 ]このモデルの生涯販売台数は5万台を超えました。[ 2 ]
基本設計は先駆的なLINCを踏襲していますが、命令セットはPDP-5命令セットの拡張版であり、より小規模です。 [ 3 ]実装コストを削減するため、このシステムでは一般的に使用されるいくつかの機能が省略されており、これらの機能は他の命令の組み合わせで記述する必要があります。これにより、プログラムが複雑になります。
PDP -12はPDP-8の派生機種で、PDP-8およびLINCシステム用のプログラムを実行できるプロセッサを搭載しています。PDP-8シリーズの後継機種であるPDP-11は、より包括的な命令セットを備えていましたが、下位互換性はありませんでした。


初期のPDP-8モデル(後に非公式に「Straight-8」として知られるようになった)は、1965年3月22日に18,500ドル[ 4 ](2024年時点で約185,000ドルに相当[ 5 ] )で発売されました。小型家庭用冷蔵庫ほどの大きさのこのコンピュータは、フリップチップカードに実装されたダイオード・トランジスタ・ロジックを採用していました。これは20,000ドル未満で販売された最初のコンピュータであり[ 6 ] 、当時史上最も売れたコンピュータとなりました[ 7 ] 。 [ 8 ]
ストレート8は1966年にPDP-8/Sに取って代わられ、デスクトップ型とラックマウント型が用意されました。1ビットのシリアル算術論理ユニット(ALU)を採用したPDP-8/Sは、オリジナルのPDP-8よりも低速ではありましたが、小型化と低価格化を実現しました。ベーシックな8/Sは1万ドル以下で販売され、この価格帯に到達した最初のマシンとなりました。[ 6 ] [ 9 ]
後期のシステム(PDP-8/Iおよび/L、PDP-8/E、/F、/M、そしてPDP-8/A)は、より高速で完全な並列実装に戻りましたが、はるかに安価なトランジスタ・トランジスタ・ロジック(TTL)MSIロジックを採用しました。現在も残っているPDP-8のほとんどはこの時代のものです。PDP-8/Eは広く普及しており、様々な種類のI/Oデバイスが利用可能であった ため、高く評価されています。
1979年に発売された最後の商用PDP-8モデルは「CMOS-8」と呼ばれ、CMOSマイクロプロセッサをベースとしていました。価格競争力に欠け、販売は失敗に終わりました。インターシルは1982年までこの集積回路をIntersil 6100ファミリーとして販売しました。CMOS技術を採用していたため消費電力が低く、一部の組み込み軍事システムに使用されました。
PDP-8の初期バージョンを設計した主任技術者は、後にデータジェネラル社を設立したエドソン・デ・カストロであった。[ 10 ]
PDP-8は、低コスト、[ 4 ]、シンプルさ、拡張性、そして価値を重視した綿密な設計を兼ね備えています。PDP-8の最大の歴史的意義は、その低コストと大量生産により、多くの新規顧客が様々な用途でコンピュータを利用できるようになったことです。そして、その継続的な重要性は、価値工学に基づいた[ 11 ]コンピュータ設計の歴史的例として挙げられます。
複雑さが低いことは、他のコストももたらしました。この記事の例や「ページ」と「フィールド」の議論からもわかるように、プログラミングは煩雑になりました。コードの多くは、アルゴリズムを記述するのではなく、必要なメカニズムを実行するだけで済みました。例えば、数を減算するには、その2の補数を計算してから加算する必要があります。条件付きジャンプを書くには、ジャンプの前後に条件付きスキップを記述し、そのスキップで、目的の条件に対する負の条件をコーディングする必要があります。野心的なプログラミングプロジェクトの中には、メモリに収まらなかったり、解決できない設計上の欠陥が生じたりしたものもあります。例えば、後述するように、サブルーチンの意図しない再帰は、問題のサブルーチンへの追跡が困難な欠陥を引き起こします。
設計の進歩によりロジックとメモリのコストが削減されるにつれて、プログラマーの時間は相対的に重要になってきました。[ 12 ]その後のコンピュータ設計ではプログラミングの容易さが重視され、通常、より大きく直感的な命令セットが使用されました。[ 13 ]
最終的に、ほとんどのマシンコードはコンパイラとレポートジェネレータによって生成されるようになりました。[ 14 ]縮小命令セットコンピュータは、実行速度を最大化するために、PDP-8のシンプルな命令セットと単一命令サイクルでの複数のアクションの達成に重点を置いた方法に戻りましたが、新しいコンピュータでは命令語がはるかに長くなっています。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
PDP-8の前身はPDP-5でした。PDP-5は、シーモア・クレイのCDC 160ミニコンピュータに触発されたWAクラークとCEモルナーが設計したLINCなど、いくつかの12ビットの前身機種のアイデアも取り入れていました。[ 3 ] [ 15 ] LINCは特に実験装置との容易なインターフェースを目的として設計されており、PDP-5とPDP-8にも同様の機能が搭載されていました。

PDP-8はワードサイズと演算に12ビットを使用しているため、内部的には0から4095までの符号なし整数、または-2048から+2047までの符号付き整数で動作できます。より大きな数値と浮動小数点数値の操作をサポートするために、2ワードの24ビットの仮数部と1ワードの12ビットの指数を持つ単一の値を格納するインタープリタが使用されました。[ 16 ]この形式の使用は低速でしたが、PDP-8はIBM 1130やIBM System/360などのはるかに高価なマシンと同種のプログラムを実行でき、外部デバイスとのインターフェイスがはるかに簡単になりました。
メモリアドレス空間も12ビットであるため、PDP-8の基本構成では最大4,096(2の12乗)の12ビットワード、つまり 現代の用語で6KiBのメインメモリを備えています。オプションのメモリ拡張ユニットは、IOT命令を使用してメモリバンクを切り替えることができます。メモリはサイクルタイムが1.5 マイクロ秒( 0.667MHz )の磁気コアメモリであるため、一般的な2サイクル(フェッチ、実行)のメモリ参照命令は0.333MIPSの速度で実行されます。1974年のPDP-8/Eのポケットリファレンスカードでは、基本命令時間は1.2マイクロ秒、メモリを参照する命令の場合は2.6マイクロ秒とされています。
PDP-8は、当時の電気通信とテキスト処理を部分的に目的として設計されました。当時は6ビット文字コードが広く使用されており、PDP-8の12ビットワードはそのような文字を2つ効率的に格納できます。さらに、テレタイプセッティングまたはTTSコードと呼ばれる6ビットのテレプリンターコードは、通信社で広く使用されており、PDP-8の初期の用途の一つは、このコードを用いたタイプセッティングでした。[ 17 ]
PDP-8命令は3ビットのオペコードを持つため、主要な命令は8つだけです。プログラマは多くの追加の命令ニーモニックを使用でき、アセンブラはそれらを特定のOPR命令またはIOT命令に変換します。PDP-8には、プログラマが認識できるレジスタが3つしかありません。12ビットのアキュムレータ(AC)、12ビットのプログラムカウンタ(PC)、および「リンクレジスタ」(L)と呼ばれる1ビットのキャリーフラグです。プログラマには認識されない追加のレジスタは、メモリバッファレジスタとメモリアドレスレジスタです。コストを節約するために、これらは動作サイクルのさまざまな時点で複数の目的に使用されます。たとえば、メモリバッファレジスタは算術オペランドを提供し、命令レジスタの一部であり、読み取り時に消去されるコアメモリを書き換えるためのデータを格納します。
PDP-8は、入出力用に、すべてのデバイスで共有される単一の割り込み、I/O命令でアクセスされるI/Oバス、そしてダイレクトメモリアクセス(DMA)チャネルを備えています。プログラムされたI/Oバスは通常、プリンタ、テレタイプ、紙テープパンチ、紙テープリーダーなどの低速から中速の周辺機器で使用され、DMAはライトペン付きブラウン管ディスプレイ、アナログ-デジタルコンバータ、デジタル-アナログコンバータ、テープドライブ、ディスクドライブで使用されます。
コストを節約するために、この設計では、補助カウンタやサブルーチンリンクなど、 他のコンピュータではより高価なフリップフロップレジスタによって提供される多くの目的に安価なメインメモリを使用しています[ 18 ] 。
基本モデルでは、乗算と除算はソフトウェアで行います。より高速な演算処理を実現するために、拡張演算要素(EAE)が乗算・除算命令と乗算器・商(MQ)レジスタ(追加レジスタ)を提供します。EAEはオリジナルのPDP-8、[ 19 ] 、 8/I、[ 20 ]、8/Eではオプションでしたが、PDP-8のシングルチップ実装である Intersil 6100マイクロプロセッサでは不可欠な要素となっています。
PDP-8は設計のシンプルさを追求して最適化されています。より複雑なマシンと比較して、不要な機能は削除され、可能な限りロジックが共有されています。命令は自動インクリメント、自動クリア、間接アクセスを使用することで、ソフトウェアの速度向上、メモリ使用量の削減、高価なレジスタの代替として安価なメモリを採用しています。
初期のPDP-8モデルは、そのシンプルさゆえに、市販されていた他のほとんどのコンピュータよりも安価でした。IBM [ 21 ]やBurroughs [ 22 ]の同時期のマシンと同様に、DECは初期のPDP-8モデルのバックプレーン配線に半自動ワイヤラップ技術を採用しました。拡張演算要素やその他のオプションを除くオリジナルのPDP-8 CPUは、75個の小型モジュールと25個の倍サイズモジュールを必要とし、そのうち2個を除く全てがRシリーズのフリップチップモジュールファミリから構成されていました。[ 23 ]
1966年8月に発売されたPDP-8/Sモデル[ 9 ]も、主にRシリーズのフリップチップモジュールを使用していましたが[ 24 ]、演算処理にシリアルのシングルビット幅データパスを使用することで論理ゲートの数を削減しました。PDP-8/SのCPUには約519個の論理ゲートしかありません。比較すると、小型マイクロコントローラ(2008年現在)には通常15,000個以上の論理ゲートがあります。電子部品の削減により、筐体はパン箱程度の大きさと大幅に小型化されました。8/Sはソール・ディンマンによって設計されました[ 25 ] 。
PDP-8/Eは、より大型で高性能なコンピュータですが、さらに再設計され、より高い価値を実現しました。集積回路には、より高速なトランジスタ・トランジスタ・ロジックが採用されています。コアメモリも再設計されました。以前のモデルのワイヤラップ式バックプレーンの代わりにOMNIBUSを採用しているため、低コストで拡張が可能です。(PDP-8/Eの開発に関する個人的な記述は、エンジニアリングとテクノロジーの歴史に関するWikiで読むことができます。[ 26 ])
PDP-8シリーズの総販売台数は30万台以上と推定されている。[ 27 ]以下のモデルが製造された。
| モデル | 説明 | 年 | 価格 | 生産量 | 重さ |
|---|---|---|---|---|---|
| PDP-8 | セミディスクリート部品。ハイブリッドICを使用。DTL 。 | 1965 | 1万8000ドル | 1450 | 250ポンド(113 kg)[ 29 ] |
| リンク8 | LINCまたはPDP-8コード を実行可能 | 1966 | 3万8500ドル | 142 | |
| PDP-8/S | PDP-8の低価格シリアルバージョン | 1966 | 1万ドル | 1024 | 84ポンド(38キログラム)[ 30 ] |
| PDP-8/I | 標準TTL IC で作られた最初のPDP-8 | 1968 | 12,800ドル | 3698 | 250ポンド(110 kg)[ 31 ] |
| PDP-8/L | PDP-8/Iの低価格版 | 1968 | 8,500ドル | 3902 | 80ポンド(36kg)[ 32 ] |
| PDP-12 | LINC命令をサポートするPDP-8/I(LINC-8の後継) | 1969 | 27,900ドル | 755 | |
| PDP-8/E | 価格と効率を向上させるために、ボードの数を減らし、ボードを大きくする | 1970 | 6,500ドル | 90ポンド(41kg)(標準)[ 33 ] | |
| PDP-8/F | PDP-8/Eの低価格版 | 1972 | 57ポンド(26kg)(標準)[ 33 ] | ||
| PDP-8/M | フロントパネルが変更されたOEM PDP-8/F | 1972 | 5,000ドル[ 34 ] | 57ポンド(26kg)(標準)[ 33 ] | |
| PDP-8/A | LSIロジックによりCPUを1枚のボードに収めることが可能になった | 1974 | 1,835ドル | ||
| インターシル 6100 | シングルチップ PDP-8 互換マイクロプロセッサ( VT78で使用) | 1975年[ 35 ] [ 36 ] | |||
| ハリス6120 | CMOS シングルチップ PDP-8 互換マイクロプロセッサ ( DECmateワードプロセッサで使用) | 1976年[ 36 ] |
_(17180052250).jpg/440px-PiDP-8_l_(Selbstbau-Kit)_(17180052250).jpg)
PDP-8 は、そのシンプルさゆえに、簡単にエミュレートできます。
PDP-8のソフトウェアシミュレーションはインターネット上にいくつか公開されており、オープンソースのハードウェア再実装も存在します。これらの中でも優れたものは、DECのオペレーティングシステムと診断ソフトウェアを正しく実行します。ソフトウェアシミュレーションの多くは、後期型のPDP-8をあらゆる周辺機器を搭載した状態でシミュレートしています。これらのシミュレーションでさえ、現代のパーソナルコンピュータの能力のごく一部しか消費しません。
愛好家たちは単一のFPGAデバイスを使ってPDP-8全体を作成しました。[ 37 ]
PDP-8の時代、I/Oシステムは大きな変化を遂げました。初期のPDP-8モデルは、フロントパネル・インターフェース、紙テープ・リーダー、そしてオプションの紙テープ・パンチを備えたテレタイプ・プリンターを搭載していました。時が経つにつれ、磁気テープ、RS-232およびカレントループ・ダム端末、パンチカード・リーダー、固定ヘッド・ディスクといったI/Oシステムが追加されました。PDP-8時代の終盤には、フロッピーディスクと可動ヘッド式カートリッジ・ディスク・ドライブが人気のI/Oデバイスとなりました。現代の愛好家たちは、実物および模造PDP-8コンピューター向けに、標準的なPCスタイルのIDEハードディスク・アダプターを 開発しました。
いくつかの種類の I/O がサポートされています。
「3サイクルデータブレーク」と呼ばれる、簡略化され低コストなDMA方式がサポートされています。この方式はプロセッサの支援を必要とします。「データブレーク」方式では、各I/OデバイスからのDMA I/Oを実装するために必要な共通ロジックの一部を、プロセッサ内の共通ロジックに統合します。「データブレーク」方式では、プロセッサがDMAアドレスレジスタとワードカウントレジスタの管理を担います。連続する3つのメモリサイクルで、プロセッサはワードカウントを更新し、転送アドレスを更新し、実際のI/Oデータワードを保存または取得します。
1サイクルデータブレークは、コアメモリとの間で転送するデータのみを対象とするため、DMA転送速度を実質的に3倍に高めます。しかし、I/Oデバイスは、独自のワードカウントレジスタと転送アドレスレジスタを管理するために、より多くの電子ロジックを必要とします。PDP-8/Eが発売される頃には、電子ロジックはより安価になり、「1サイクルデータブレーク」はより一般的になりました。
初期のPDP-8システムは、プリインストールされたソフトウェアなしで出荷されました。PDP-8の電源を入れるたびに、ユーザーは12個のトグルスイッチバンクを使って命令を手入力していました。これらの命令は、テレタイプモデル33の紙テープリーダーからプログラムを読み取るためのブートストラップローダーであることが一般的でした。その後、紙テープの入出力を用いてプログラム開発を進めることができました。
DECのFOCALインタプリタ[ 38 ]や4K FORTRANコンパイラとランタイム など、多くのプログラミング言語の紙テープ版が利用可能になりました。
PDP-8 時代の終わり頃、OS/8や COS-310などのオペレーティング システムでは、PAL-III アセンブリ言語、FORTRAN、 BASIC、DIBOLなどの言語を使用した従来のライン モードエディターとコマンド ラインコンパイラ開発システムが可能になりました。
かなり近代的で高度なリアルタイム オペレーティング システム(RTOS) とプリエンプティブ マルチタスクマルチユーザー システムが利用可能でした。リアルタイム システム (RTS-8) のほか、マルチユーザー商用システム (COS-300 および COS-310) や専用のシングルユーザー ワード プロセッシング システム (WPS-8) も利用可能でした。
タイムシェアリングシステムTSS-8も利用可能でした。TSS-8では、複数のユーザーが110ボー端末を介してシステムにログインし、プログラムの編集、コンパイル、デバッグを行うことができます。言語には、BASICの特別バージョン、FORTRAN-1に類似したFORTRANのサブセット(ユーザー作成のサブルーチンや関数はありません)、ALGOLのサブセットであるFOCAL、そしてPAL-Dと呼ばれるアセンブラが含まれています。
PDP-8 用のユーザー寄贈ソフトウェアの多くは、DECUS (Digital Equipment Corporation User Society) から入手でき、多くの場合、完全なソース リストとドキュメントが付属していました。
12 ビットの命令ワードの上位 3ビット(ビット 0 から 2 とラベル付け) はオペレーション コードです。メモリを参照する 6 つの操作では、ビット 5 から 11 が 7 ビットのアドレスを提供します。ビット 4 が設定されている場合は、プログラム カウンタ(PC) レジスタの上位 5 ビットを使用してアドレスを完了するように指示します。つまり、アドレス指定された位置が命令と同じ 128 ワード内であったことを意味します。ビット 4 がクリアされている場合は 0 が使用されるため、アドレス指定された位置はメモリの最初の 128 ワード内になります。ビット 3 は間接指定を指定します。ビット 3 が設定されている場合は、これまでに説明したように取得されたアドレスが、命令の実際の有効アドレスを示すメモリ内の 12 ビット値を指します。このため、オペランドは、追加のワードを犠牲にしてメモリ内のどこにでも配置できます。JMP命令は、間接指定されている場合を除き、メモリ ワードに対しては動作しませんが、同じビット フィールドを持ちます。
| 0 | 2 | 3 | 4 | 5 | 11 | ||||||
| 手術 | 私 | Z | オフセット | ||||||||
この命令語の使用により、4,096ワードのメモリが128ワードのページに分割されます。命令のビット4は現在のページまたはページ0(8進数でアドレス0000~0177 )のいずれかを選択します。ページ0のメモリは貴重です。なぜなら、ここに配置した変数はどのページからも直接アドレス指定できるからです。(さらに、アドレス0000は割り込みサービスルーチンの開始アドレスであり、アドレス0010~0017は、間接参照の前に自動インクリメントされるという特殊な特性を持っています。)
標準アセンブラは、算術演算用の定数値を現在のページに配置します。同様に、ページ間のジャンプやサブルーチン呼び出しでは、現在のページの間接アドレスが使用されます。
128ワードのページに収まるようにルーチンを記述するか、ページ遷移を最小限に抑えるようにルーチンを配置することが重要でした。これは、現在のページ外への参照やジャンプには追加のワードが必要だったためです。そのため、1ワードまたは数ワードを巧みに節約するために多くの時間を費やしました。プログラマーは、PCがインクリメントされたときに次のページにスムーズに遷移できるように、意図的にページの末尾にコードを配置しました。
PDP-8プロセッサはI/O命令をほとんど定義しておらず、単にフレームワークを提供しただけでした。ほとんどのI/O命令は個々のI/Oデバイスによって定義されていました。
| 0 | 2 | 3 | 8 | 9 | 11 | ||||||
| 6 = IoT | デバイス | 関数 | |||||||||
IOT命令のビット3から8はI/Oデバイスを選択します。これらのデバイスアドレスの一部は、慣例によって標準化されています。
デバイス0に対する命令はプロセッサ全体に影響を及ぼします。例えば、ION(6001)は割り込み処理を有効にし、IOFF(6002)は割り込み処理を無効にします。
IOT命令のビット9~11は、デバイスが実行する機能を選択します。単純なデバイス(紙テープリーダーやパンチ、コンソールキーボードやプリンターなど)では、これらのビットは標準的な方法で使用されます。
これらの操作は明確に定義された順序で実行され、複数のビットが設定されている場合に有用な結果が得られます。
ディスクドライブなどのより複雑なデバイスでは、これらの3ビットをデバイス固有の方法で使用します。通常、デバイスは3ビットをデコードして8つの機能コードを生成します。
多くの操作はOPRを用いて実現され、条件文のほとんどもこれに含まれます。OPRはメモリ位置をアドレス指定しません。条件付き実行は、後続の命令(通常はJMP)を条件付きでスキップすることで実現されます。
OPR命令は「マイクロコード化」されていると言われていました。これは、今日の言葉の意味(低レベルプログラムがOPR命令をフェッチして解釈する)とは異なり、命令ワードの各ビットが特定の動作を指定し、プログラマが複数のビットを設定することで1つの命令サイクルで複数の動作を実行できることを意味していました。使用時には、プログラマは複数の命令ニーモニックを並べて記述することができ、アセンブラはそれらをORで結合して実際の命令ワードを作成します。多くのI/Oデバイスは「マイクロコード化」されたI/O命令をサポートしています。
マイクロコード化されたアクションは、多くの組み合わせの有用性を最大限にするように設計された、明確に定義されたシーケンスで実行されます。
OPR命令はグループに分かれています。ビット3、8、11はOPR命令のグループを識別するため、異なるグループのマイクロコード化されたアクションを組み合わせることはできません。
すべてのグループで共通するアクション(および対応するビット)はビット4のCLAです。このビットが設定されている場合、アキュムレータはクリアされます。
00 01 02 03 04 05 06 07 08 09 10 11 ___________________________________ | 1| 1| 1| 0| | | | | | | | | |__|__|__|__|__|__|__|__|__|__|__|__| |CLA CMA RAR BSW CLL CML RAL IAC 実行順序 1 1 2 2 4 4 4 3
ほとんどの場合、これらの操作は、最も効果的な方法で組み合わせられるよう順序付けられています。例えば、CLA(アキュムレータのクリア)、CLL(リンクのクリア)、IAC(アキュムレータのインクリメント)を組み合わせると、まずアキュムレータとリンクがクリアされ、次にアキュムレータがインクリメントされて1に設定されます。これにRALを追加すると(つまりCLA CLL IAC RAL)、アキュムレータはクリアされ、インクリメントされた後、左に回転されて2に設定されます。このように、小さな整数定数を1つの命令でアキュムレータに格納できます。
CMA IACの組み合わせ(アセンブラではCIAと略記可能)は、ACの算術逆、つまり2の補数の否定演算を実行します。減算命令がないため、差を計算するには、2の補数の加算(TAD)の前に 減数を否定する必要があります。
グループ1のOPR命令は、マイクロプログラムされたビットがいずれもセットされていない場合、何も実行しません。プログラマはNOP(No Operation)を記述することで、このような命令を組み立てることができます。
00 01 02 03 04 05 06 07 08 09 10 11 ___________________________________ | 1| 1| 1| 1| | | | | 0| | | 0| |__|__|__|__|__|__|__|__|__|__|__|__| |CLA SZA OSR SMA SNL HLT 2 1 1 1 3 3
3つのビット(CLA、OSR、HLT)は、設定されている場合、アクションを実行します。残りの3つのビット(SMA、SZA、SNL)はスキップ条件をエンコードします。指定された条件のいずれかが満たされた場合、スキップが実行されます。例えば、オペコード7540の「SMA SZA」は、AC ≤ 0 の場合にスキップします。
マイクロプログラムされたビットがまったく設定されていないグループ 2 OPR 命令は、別の No-Op 命令です。
00 01 02 03 04 05 06 07 08 09 10 11 ___________________________________ | 1| 1| 1| 1| | | | | 1| | | 0| |__|__|__|__|__|__|__|__|__|__|__|__| |CLA SNA OSR スパ SZL HLT 2 1 1 1 3 2
ビット8が設定されている場合、グループ2のスキップ条件は反転されます。つまり、グループ条件のいずれかが真の場合、スキップは実行されません。ド・モルガンの法則によれば、これは指定された反転条件がすべて真の場合にスキップが実行されることを意味します。例えば、オペコード7550の「SPA SNA」は、AC > 0の場合にスキップします。ビット5~7のいずれも設定されていない場合、スキップは無条件です。
アクション (CLA、OSR、HLT) はビット 8 の影響を受けません。
OPRの未使用ビットの組み合わせは、主にMQ(乗算器/商)レジスタに影響を与えるマイクロプログラムされたアクションの第3グループとして定義されます。MQレジスタと拡張演算要素(EAE)命令はオプションであり、EAEオプションを購入した場合にのみ存在します。[ 39 ]
00 01 02 03 04 05 06 07 08 09 10 11 ___________________________________ | 1| 1| 1| 1| | | | | | | 1| |__|__|__|__|__|__|__|__|__|__|__|__| |CLA SCA \_ _/ | MQA MQL コード 1* 2 2 2 3
通常、CLAとMQAはMQをACに転送するために組み合わせられます。もう1つの便利な組み合わせは、2つのレジスタを交換するMQAとMQLです。
3 ビットは、実行する乗算/除算命令を指定します。




12ビットワードは4,096個の異なる値を持つことができ、これはオリジナルのPDP-8がワードポインタを介して間接的にアドレス指定できるワードの最大数です。4,096個の12ビットワードは、現代の用語で言えば6,144バイト、つまり6KBに相当します。プログラムが複雑になり、メモリ価格が下落するにつれて、この制限を拡大する必要性が生じました。
既存のプログラムとの互換性を維持するため、元の設計とは異なる新しいハードウェアが、プログラムによって生成される実効アドレスに上位ビットを追加しました。メモリ拡張コントローラは、アドレス指定可能なメモリを8倍に拡張し、合計32,768ワードまで拡張します。当時のコアメモリのコストは1ワードあたり約50セントだったため、32KBのメモリを搭載すればCPUのコストとほぼ同等になるため、この拡張は十分であると考えられました。
4KBのメモリはそれぞれフィールドと呼ばれます。メモリ拡張コントローラには、DF(データフィールド)とIF(命令フィールド)という2つの3ビットレジスタがあります。これらのレジスタは、CPUの各メモリ参照のフィールドを指定し、合計15ビットのアドレスとなります。IFレジスタは命令フェッチと直接メモリ参照のフィールドを指定し、DFレジスタは間接データアクセスのフィールドを指定します。あるフィールドで実行されているプログラムは、直接アドレス指定によって同じフィールドのデータを参照し、間接アドレス指定によって別のフィールドのデータを参照することができます。
6200から6277までの範囲のI/O命令セットはメモリ拡張コントローラによって処理され、DFレジスタとIFレジスタへのアクセスを提供します。62X1命令(CDF、データフィールド変更)はデータフィールドをXに設定します。同様に、62X2命令(CIF)は命令フィールドを設定し、62X3命令は両方を設定します。既存のプログラムはCIFまたはCDFを実行することはありません。DFレジスタとIFレジスタは両方とも同じフィールドを指し、これらのプログラムはその単一のフィールドに限定されます。CIF命令の効果は次のJMP命令またはJMS命令と一致するように延期されるため、CIFを実行してもジャンプは発生しません。
複数フィールドのプログラムでは、フィールド境界やDFレジスタ、IFレジスタの処理は、単純に15ビットのアドレスを生成できる場合よりも複雑になりましたが、この設計は下位互換性を提供し、PDP-8全体で使用されている12ビットアーキテクチャと一致しています。後期のIntel 8086と比較すると、16ビットのメモリアドレスは、指定または暗黙のセグメントレジスタの内容と組み合わせることで20ビットに拡張されます。
拡張メモリ方式により、既存のプログラムは最小限の変更でメモリ増加に対応できるようになりました。例えば、4K FOCALは通常約3KBのコードで構成され、ユーザープログラムとデータ用に残るのはわずか1KBでした。しかし、いくつかのパッチを適用することで、FOCALは2つ目の4KBフィールドをユーザープログラムとデータ用に使用できるようになりました。さらに、追加の4KBフィールドを個別のユーザーに割り当てることで、4K FOCALをマルチユーザー・タイムシェアリング・システムとして利用できるようになります。
PDP-8/E以降のモデルでは、メモリ拡張コントローラが強化され、マシン仮想化が可能になりました。PDP-8の全リソースを使用するように作成されたプログラムは、仮想マシンマネージャの制御下で、同じPDP-8上で他の同様のプログラムと共存できます。マネージャは、すべてのI/O命令(メモリ拡張コントローラ上で実行される命令も含む)にトラップ(マネージャが処理する割り込み)を発生させることができます。これにより、マネージャはメモリ参照のマッピング、データまたは命令フィールドのマッピング、そしてI/Oを別のデバイスへのリダイレクトが可能になります。各オリジナルプログラムは、マネージャが提供する「仮想マシン」に完全にアクセスできます。
メモリ拡張コントローラへの新しい I/O 命令は、データおよび命令フィールドの現在の値を取得し、ソフトウェアがトラップを越えてマシン状態のほとんどを保存および復元できるようにします。ただし、プログラムは、CPU が CIF 命令の効果を延期しているかどうか (CIF を実行したが、対応するジャンプ命令をまだ実行していないかどうか) を感知できません。マネージャには、完全な PDP-8 エミュレータを含める必要があります (8 命令マシンでは難しくありません)。CIF 命令がマネージャにトラップするたびに、マネージャは次のジャンプまでの命令をエミュレートする必要があります。幸いなことに、ジャンプは通常 CIF の次の命令であるため、このエミュレーションによってプログラムの速度が大幅に低下することはありませんが、一見小さな設計上の欠陥に対する大きな回避策となります。
PDP-8/Aの頃には、メモリ価格が十分に下落し、32Kを超えるメモリが求められるようになっていました。8/Aでは、8フィールドを超えるメモリを扱うための新しい命令セットが追加されました。フィールド番号は、命令にハードコードするのではなく、ACに配置できるようになりました。しかし、この頃にはPDP-8は衰退期にあったため、これらの新機能を利用するために標準ソフトウェアが変更されることはほとんどありませんでした。
次の例は、PAL-III アセンブラ用に記述される可能性のある PDP-8アセンブリ言語のコードを示しています。
次のコードは、2 つの数値を比較するために必要なものを示しています。
/ OPD1とOPD2のメモリ内の数値を比較する CLA CLL / ACとリンクは0で始まる必要があります TAD OPD1 / 最初のオペランドをACにロードします(0を加算します)。リンクはまだクリアされています。 CIA / 補数をとってACをインクリメントし、それを否定する TAD OPD2 / AC には現在 OPD2-OPD1 があります。OPD2≥OPD1 の場合、合計がオーバーフローし、リンクが設定されます。 SZL / リンクが明確な場合はスキップ JMP OP2GT / OPD2≥OPD1 の場合にどこかにジャンプします。 / それ以外の場合は、以下のコードに進みます。
ご覧のとおり、典型的なPDP-8プログラムのテキストの多くは、作成者が意図したアルゴリズムではなく、低レベルのメカニズムに焦点を当てています。この例は、可読性に関するさらなる問題を示しています。条件付きJMPを実現するには、目的のテストの論理的意味とは逆の意味を強調するスキップ命令(JMPをバイパスする命令)をコーディングする必要があります。
PDP-8には、論理和命令を含む多くの一般的な低レベル演算が欠けていました。典型的な解決策は、ド・モルガンの法則を用いて中間ステップをメモリに格納することでした。このコードは、OPD1とOPD2のオペランドの論理和を計算し、メモリ位置TMPに格納し、結果をOPD1 OR OPD2ACに残します。
CLA / クリアAC TAD OPD1 / 最初のオペランドをACにロードする(0に加算する) CMA / 補数AC DCA TMP / それをメモリ位置TMPに保存し、ACをクリアします TAD OPD2 / 2番目の値をACにロードする(0に加算する) CMA / 結果を補完する AND TMP / AC = not(M) AND not(TMP) CMA / 補完結果
この完全な PDP-8 アセンブリ言語プログラムは、テレプリンターに 「Hello, world!」を出力します。
*10 / 現在のアセンブリ原点をアドレス10に設定する。 STPTR、STRNG-1 / 自動インクリメントレジスタ(10~17の8つのレジスタのうちの1つ) *200 / 現在のアセンブリ原点をプログラムテキスト領域に設定する HELLO、CLA CLL / AC をクリアして再度リンクします (tls からループバックするときに必要) TAD IZ STPTR / ゼロページからのPRE自動インクリメントアドレスを介して間接的に次の文字を取得します。 SNA / ゼロ以外の場合はスキップ(文字列の末尾ではない) HLT / そうでなければゼロで停止(文字列の終わり) TLS / AC内の文字をテレプリンターに出力する TSF / テレプリンターが文字入力可能な場合はスキップ JMP .-1 / そうでなければ戻って再試行する JMP HELLO / 次の文字へ戻る STRNG、310 / H 345 / e 354 / リットル 354 / リットル 357 / o 254 /, 240 / (スペース) 367 / 週 357 / o 362 / r 354 / リットル 344 / 日 241 / ! 0 / 文字列の終わり $HELLO /デフォルトターミネーター
PDP-8プロセッサは、サブルーチンの呼び出し時や割り込み発生時にレジスタやその他のコンテキストを格納するスタックを実装していません。(スタックはソフトウェアで実装できます。次のセクションで説明します。)その代わりに、JMS命令は更新されたPC(JMSの先、つまり戻りアドレスを指す)を実効アドレスに格納し、実効アドレスに1を加えたアドレスにジャンプします。サブルーチンは、サブルーチンの最初のワードをアドレス指定する間接JMP命令を使用して呼び出し元に戻ります。
例えば、サブルーチンを使用するように書き直した「Hello, World!」の例を以下に示します。JMS命令がサブルーチンにジャンプすると、OUT1に記述された0が変更されます。
*10 / 現在のアセンブリ原点をアドレス10に設定する。 STPTR、STRNG-1 / 自動インクリメントレジスタ(10~17の8つのレジスタのうちの1つ) *200 / アセンブリ原点の設定(ロードアドレス) LOOP、TAD I STPTR / メモリ位置10を事前に増分し、間接的にフェッチしてメッセージの次の文字を取得します SNA / 非ゼロ AC のスキップ HLT / そうでなければメッセージの終わりで停止 JMS OUT1 / 1文字を書き出す JMP LOOP / さらにループする OUT1, 0 / 呼び出し元の更新されたPCに置き換えられます TSF / プリンタの準備ができたらスキップ JMP .-1 / フラグを待つ TLS / AC内のキャラクターを送信 CLA CLL / 次のパスのために AC とリンクをクリア JMP I OUT1 / 呼び出し元に戻る STRNG、「H / よく知られたメッセージ 「e / 「l / 注記: 「l / 「o / PAL-8とPAL-IIIの文字列は「6ビット」でした ", / ASCIIを使用するには、文字ごとに綴ります 「 / 「w / 「お / 「r / 「l / 「d / 「! / 015 / 012 / 0 / ヌル終了文字列の終了をマークします (.ASCIZ はまだ発明されていませんでした!)
JMS命令はサブルーチンのコードの直前のワードを戻りアドレスの格納に用いるため、プログラマによる追加作業なしに再入性と再帰性を実現できません。また、PDP-8では、読み書き可能な戻りアドレス記憶領域と読み取り専用のコード記憶領域がアドレス空間内で混在するため、 ROMの使用が困難になります。ROMに格納することを想定したプログラムは、この問題にいくつかの方法で対処します。
JUMPL、DCA TEMP / アキュムレータを一時的な場所に保管する TAD JUMPL+3 / 戻りアドレスをアキュムレータにロードする: ハードコード JMP SUBRO / サブルーチンへ移動し、ジャンプバック(JUMPL+3へ)を処理させる
JMS命令の使用はデバッグを困難にします。プログラマがサブルーチン自身を直接または中間サブルーチンを介して呼び出すというミスを犯した場合、外側の呼び出しの戻りアドレスが後続の呼び出しの戻りアドレスによって破壊され、無限ループが発生します。あるモジュールがサブルーチンに対して誤った、または古いアドレスを使用してコーディングされている場合、サブルーチンのコードシーケンス全体を実行できないだけでなく、サブルーチンのコードの1ワードが変更され、戻りアドレスが保存され、プロセッサがその後のサブルーチンへの正しい呼び出し時に命令として解釈する可能性があります。どちらのタイプのエラーも、正しく記述されたコードの実行中に明らかになる可能性があります。
PDP-8にはハードウェアスタックはないが、ソフトウェアでスタックを実装することができる。[ 40 ] 以下は、スタックオーバーフローやアンダーフローのテストなどの問題を省略するために簡略化されたPUSHおよびPOPサブルーチンの例である。
*100 /次の例のためにルーチンをアクセス可能にする 押す、0 DCAデータ CLA CMA / -1 タッドSP DCA SP タッドデータ DCA I SP JMP I PUSH /リターン ポップ、0 CLA CLL タッド・アイ・SP ISZ SP JMP I POP データ、0 SP、0
そして、この「スタック」が実装され、「OUT」サブルーチンを備えた「Hello World」は次のようになります。
*200 MAIN、CLA CLL /メッセージポインタを設定する TAD (MESSG /メッセージの先頭へ(リテラル) DCA SP ループ、JMS ポップ SNA /ゼロの場合は実行を停止 HLT JMS OUT /それ以外の場合は文字を出力する ジャンプループ MESSG、「H 「e 「l 「l 「お "、 「 「わ 「お 「r 「l 「d 「! 015 012 0 OUT、0 / 呼び出し元の更新されたPCに置き換えられます TSF / プリンタの準備ができたらスキップ JMP .-1 / フラグを待つ TLS / AC内のキャラクターを送信 CLA CLL / 次のパスのために AC とリンクをクリア JMP I OUT / 呼び出し元に戻る
PDP-8 で使用できるもう 1 つのサブルーチンは、リンク リストです。
GETN, 0 / 指し示す数値を取得し、ポインタを移動します CLA CLL /クリアアキュムレーター TAD I PTR / 指し示す番号を取得します DCA TEMP /現在の値を保存 ISZ PTR / ポインタをインクリメント TAD I PTR /次のアドレスを取得 DCA PTR /ポインタを挿入 JMP I GETN /リターン PTR、0 温度、0
PDP-8のI/Oバスには割り込みラインが1つあります。プロセッサは、割り込みが発生すると、それ以降の割り込みを無効にし、アドレス0000への命令を実行することで割り込みを処理します。再入可能なサブルーチンを記述することは困難であるため、割り込みをネストすることは難しく、通常は行われません。各割り込みは完了するまで実行され、割り込みから戻る命令 JMSを実行する直前に割り込みを再度有効にします。JMP I 0
I/Oバスには割り込みラインが1つしかないため、割り込みが発生してもプロセッサは割り込みのソースを認識できません。代わりに、割り込みサービスルーチンはアクティブな各I/Oデバイスを順番にポーリングし、そのデバイスが割り込みのソースであるかどうかを確認します。この処理を行うコードは、 PDP-8の「テストを行い、フラグがセットされている場合はスキップする」I/O命令の連続で構成されているため、スキップチェーンと呼ばれます。(スキップチェーンが、サービスを必要とするデバイスが見つからないまま最後まで到達することも珍しくありませんでした。)I/Oデバイスの相対的な割り込み優先度は、スキップチェーン内の位置によって決まります。複数のデバイスが割り込みが発生した場合、スキップチェーン内で先にテストされたデバイスが最初に処理されます。
1980年代に人気を博した工学教科書、デイヴィッド・ウィンケルとフランクリン・プロッサー共著の『デジタル設計の芸術』には、PDP-8/Iと互換性のあるコンピュータの設計プロセスを解説する例題が複数章にわたって掲載されています。各コンポーネントの機能も解説されています。これは量産設計ではありませんが、より現代的なSSIおよびMSIコンポーネントと、コアメモリではなくソリッドステートメモリを使用しています。この演習では、コンピュータの動作を詳細に解説しています。
ソ連は、それぞれ PDP-8 とPDP-8/E のクローンであるミニコンピュータ Saratov-1 と Saratov-2 を製造しました。
70 年代から 80 年代にかけてブルガリアで製造された、PDP-8L のクローンである IZOT-0310 というミニコンピュータがありました。
キューバでは、現在COMBIOMEDとなっているInstituto Central de Investigación Digital ( ICID )が 1970 年代に、 PDP-8/S および PDP-8/L の部分的なクローン (アーキテクチャと命令) であるミニコンピュータCID-201、CID 201-A 、およびCID 201-Bを製造しました。
今日の最も貴重なコンピュータ リソースであるプログラマの時間を最大限に活用する方法...
高級言語を使用するもう一つの利点は、同じプログラムを様々な機械語にコンパイルできるため、様々なマシンで実行できることです。