フロントパネルからプログラムへ:PDP-8のように考える
From Front Panel to Program: Thinking Like a PDP-8 (pikuma.com)
要約
この記事は、初期のミニコンピュータであるDEC PDP-8/Eのフロントパネルを詳細に解説し、当時のハードウェア構成と操作方法を説明しています。CPU、メモリ、I/Oデバイス(ペーパーテープリーダー/パンチャー、DECtape、ディスクドライブ)の配置と機能に焦点を当て、現代のコンピュータとは異なる、ハードウェアと直接対話するようなプログラミングの考え方を考察しています。
全文翻訳
フロントパネルからプログラムへ:PDP-8のように考える
トランジスタ、論理ゲート、フリップフロップ、全加算器、レジスタ、アキュムレータ、メモリ、そして点滅するLED。PDP-8は、従来のデジタルエレクトロニクスとコンピュータアーキテクチャの仕組みを学ぶのに最適なマシンです。
古い機械を眺め、点滅するライト、スイッチ、レジスタ、命令の下に、従来のコンピュータの基本的な構成要素を完全に理解できることがわかることに、深い満足感があります。
もしあなたがこのブログに慣れているなら、私たちがしばしば過去を振り返って技術の進化を理解しようとしていることを知っているでしょう。コンピューティングの初期を研究することで、古い、より原始的なシステムにのみ見られる一種の「シンプルさ」を活用することができます。現代の技術は非常に複雑ですが、コンピュータは究極的には、ビットを操作する小さな回路の巨大な集合体に過ぎません。レトロなアーキテクチャは、デジタル回路とコンピュータの基本概念を完全に理解するための優れた方法です。
コンピュータは巨大な抽象化マシンです。電気の仕組みとその振る舞いを理解することから始め、次にトランジスタがスイッチのように振る舞う方法を理解し、次に少数のトランジスタが論理ゲートを形成する方法、そして論理ゲートが加算器、マルチプレクサ、ラッチ、レジスタを形成する方法を理解します。これらの回路を組み合わせて算術論理演算ユニット(ALU)を形成し、次に制御ユニット、メモリ、クロックを追加すると、突然、シンプルながらも動作するCPUができあがります。
[画像: シリコンからCPUへ]
A textbook CMOS 1-bit full adder circuit example
注: このブログ記事は、プログラムカウンタ、スタック、フリップフロップ、レジスタ、全加算器、ALUといった用語に慣れていることを前提としています。とはいえ、デジタルエレクトロニクスとコンピュータアーキテクチャに関する包括的で詳細な講義のセットを探しているなら、私たちのコースページをご覧ください。
基本的なデジタル回路の仕組みを解剖するのに十分なほどシンプルなコンピュータの優れた例が、DEC PDP-8です。1965年に導入されたPDP-8は、古典的な教科書的な「アキュムレータベース」アーキテクチャの例であり、最も影響力のある初期のミニコンピュータの1つでした。私たちにとってより重要なのは、そのアーキテクチャが十分に小さいため、複雑さに埋もれることなく、驚くほど多くの部分を理解できることです。
PDP-8は、12ビットコンピュータで、非常に小さな命令セット、単一のメインアキュムレータ、独特なメモリのアドレス指定方式、1ビットのリンクレジスタ、一度に複数のジョブを実行する命令、そして実際にはレジスタではないものもあるいくつかのレジスタを備えています。
そしておそらく最も奇妙なことは、これらが恣意的な歴史的奇妙さではないということです。それらは高価なハードウェアから有用なコンピュータを構築しようとした結果なのです。
売るのに十分なほど小さなコンピュータ
PDP-8を理解するためには、1960年代初頭に戻る必要があります。
[画像: University of MelbourneのPDP-8ミニコンピュータ]
University of Melbourne's PDP-8 computer
コンピュータは高価な機械でした。典型的なコンピュータはコンピュータセンターに属しており、誰かの机の上にあるものではありませんでした。研究所、工場、または工学部のために汎用コンピュータを購入するという考えは、まだ珍しいものでした。
1957年にKen OlsenとHarlan Andersonによって設立されたDigital Equipment Corporationは、すでに小型コンピュータを製造していました。1963年に導入されたPDP-5は、PDP-8の重要な前身でした。
[画像: Digital Equipment Corporationの本社]
Headquarters of Digital Equipment Corporation from 1957 to 1992
PDP-8は1965年3月に登場し、そのアイデアをさらに推し進めました。それは12ビットの汎用コンピュータで、当時の主流であった機械よりも劇的に少ない約18,000ドルで購入できました。
最初のPDP-8は、マイクロプロセッサではなく、ディスクリートトランジスタロジックで構築されていました。そのCPUは、Flip-Chipsとして知られる小さなプラグイン回路モジュールで構成され、ワイヤラップバックプレーンを介して接続されていました。
[画像: PDP-8フリップチップモジュール]
Flip-chip module
上記のフリップチップレジスタスライスには、8ビットのストレージと加算器の2ビットが含まれています。これは、ICロジック回路を備えたPDP-8/I(PDP-8の後継機)で使用されました。
したがって、それは文字通りの意味でのコンピュータでした。機械を開いて、プロセッサを実装した回路を見ることができました。ヒートスプレッダーの下に隠されたCPUチップはありませんでした。中央処理装置は、回路基板の集まりそのものでした。
なぜ12ビットなのか?
今日、8ビット、16ビット、32ビット、64ビットのコンピュータは自然に感じられますが、12ビットは奇妙に感じられるかもしれません。しかし、12はPDP-8にとって非常に便利な数です。
12ビットのワードは、4096(2¹²)の可能な値を与えてくれます。さらに重要なのは、12は4ビットの3つのグループにきれいに分割できることです。これにより、マシンのバイナリ表現は、設計者やプログラマにとってかなりコンパクトで便利になります。
PDP-8の元のメモリは、12ビットのコアメモリ4Kワードを含んでおり、これは、ワード全体が理解するのに十分小さく、命令、文字指向の値、または小さな整数を保持するのに十分大きいマシンを提供します。
12ビットアーキテクチャは、実装技術が劇的に変化しても、PDP-8ファミリー全体で維持されました。
PDP-8のファミリー
続ける前に、PDP-8について話すとき、実際にはマシンの「ファミリー全体」について話していることを指摘することが重要です。オンラインで多くの画像(この記事の画像を含む)を見るかもしれませんが、それらは異なるPDP-8モデルのものである可能性があるため、今これを明確にしておきます。
DECは基本的な12ビットアーキテクチャを驚くほど一貫して維持しましたが、その下の電子機器は長年にわたって劇的に変化しました。一部のモデルは安価になり、一部は高速になり、一部は基本的に少ないハードウェアで同じコンピュータを構築する方法の実験でした。
オリジナルのPDP-8
1965年に導入されたオリジナルのPDP-8は、ディスクリートトランジスタロジックと磁気コアメモリで構築されました。当時の比較的コンパクトなマシンでしたが、CPUは依然として個々の回路モジュールの大きな集まりで構成されていました。これはPDP-8アーキテクチャを確立し、ミニコンピュータを商業的に成功させるのに役立ったマシンです。
PDP-8/S
1966年に導入されたPDP-8/Sは、特に興味深いアプローチを取りました。幅広の並列算術ユニットを構築する代わりに、8/Sは多くの操作をシリアルに、一度に1ビットずつ実行しました。これにより回路が節約され、コストが削減されましたが、マシンは大幅に遅くなりました。これは、基盤となるハードウェアが根本的に再構成されても、アーキテクチャのアイデアが生き残った素晴らしい例です。
[画像: PDP-8/S]
PDP-8/S front panel
PDP-8/I
PDP-8/Iは、設計を集積回路(IC)へと移行させ、コンピュータをより小さく、安価で、より実用的にしました。以前のディスクリートトランジスタモジュールからプロセッサを構築する代わりに、DECは統合ロジックを使用して、より小さなスペースに多くの機能性を詰め込むことができるようになりました。
[画像: PDP-8/I]
PDP-8/I front panel
PDP-8/E
1970年のPDP-8/Eは、多数のPDP-8システムと周辺機器のエコシステムの基盤となったため、最も重要なモデルの1つでした。新しいIC技術を使用し、モジュラーバックプレーンを備え、さまざまなメモリとI/Oオプションで拡張可能でした。下の写真の大きなマシンは、8/Eアーキテクチャを中心に構築できるシステムの例です。
[画像: PDP-8/E]
PDP-8/E front panel
PDP-8/F
8/Fは、本質的に8/Eの低コストバージョンでした。PDP-8アーキテクチャを維持しましたが、物理的な実装とパッケージングを簡素化しました。DECは、同じアーキテクチャのアイデアを取り、より安価な製造方法を見つけるのが非常に得意になっていました。
[画像: PDP-8/F]
PDP-8/F front panel
PDP-8/A
小型で安価なPDP-8のアイデアをさらに推し進めたPDP-8/Aもありました。新しい技術を中心に設計され、OEMや組み込み制御アプリケーションにとって特に魅力的でした。この時点では、PDP-8は初期システムの写真から想像されるような大きなミニコンピュータとは必ずしも見えなくなっていました。それは、別の機械の中に隠された比較的コンパクトなコンピュータになり得たのです。
[画像: PDP-8/A]
PDP-8/A front panel
注目すべき重要な点は、これらのマシンが単にますます強力なCPUのシーケンスではなかったということです。多くの場合、DECはプログラミングモデルを安定させ、その下の実装を変更していました。したがって、PDP-8アーキテクチャ用に書かれたプログラムは、ハードウェアの数世代にわたって存続することができました。電子機器はディスクリートトランジスタから集積回路に変わり、メモリは変わり、パッケージングは変わり、マシンは劇的に安価になる可能性がありますが、プログラマは同じ12ビットアキュムレータ、プログラムカウンタ、LINKビット、メモリ参照命令、I/O命令という考え方で作業を続けることができました。
この安定性が、PDP-8ファミリーがアーキテクチャの観点から非常に興味深い理由の1つでした。異なるモデルは、実装に関する実験のようなものです。「本質的に同じコンピュータを、どれだけ安く、速く、またはコンパクトに構築できるか?」
PDP-8/Eフィールドガイド
これは完全に構成されたPDP-8/E、DECの1970年代半ばの12ビットミニコンピュータです。これはおそらく「ミニコンピュータ」という言葉を手の届くものにしたマシンでしょう。1つのキャビネットのように見えるものは、ボルトで留められた3つのベイです:右側はプロセッサと紙テープI/O、中央はDECtapeストレージ、左側はディスクストレージです。詳細については、番号付きランプをタップしてください。
[画像: 3ベイのDEC PDP-8/eミニコンピュータキャビネットの前面ビュー、オペレーターコンソール、DECtapeドライブ、RK05ディスクドライブ、紙テープリーダー/パンチャーを備え、10個の番号付きコールアウトで注釈付けされています。]
1
モデル名板
Digital Equipment Corpの製造者プレートで、この正確なマシンをPDP-8/Eとして識別しています。対応するオレンジからゴールドのストライプは、3つのベイすべての上部に繰り返され、それらを3つの別々のキャビネットではなく1つのシステムとして色分けしています。
2
CPUとオペレーターコンソール
プロセッサ自体はこのパネルの後ろ、オムニバスバックプレーン(コアメモリとともに)にあります。アンバー色のランプは、メモリアドレスレジスタのライブ内容を表示しているため、CPUのプログラムカウンタがリアルタイムで進むのを見ることができます。下のトグルスイッチはスイッチレジスタで、ブートストラップアドレスを入力したり、手動でメモリをデポジット/検査したりするために使用されます。
3
紙テープリーダー/パンチャー
高速紙テープI/Oユニット(一般に「パンチャー」と呼ばれる)の制御が右下に表示されています。ディスクが標準装備になる前は、パンチされた紙テープがPDP-8へのプログラムやデータの出入りの日常的な方法でした。
4
スペアリールストレージ
中央のDECtapeドライブと同じ小さなリール用のスプリングロード式リールラック(現在ロードされていません)です。
5
DECtape制御とステータスペネル
DECtapeコントローラーの内部ロジックの診断ランプ(ユーザーデータではありません)。表示されているレジェンドには、WC(ワードカウント)とSTATEがあり、下のドライブを処理する際の読み書きシーケンスのコントローラーの状態を追跡します。
6
DECtapeリールストレージ
DECtape自体のリール。これは、ブロックアドレス指定可能な低容量フォーマットで、「コンピューティングできるテープ」として人気がありました。通常の磁気テープとは異なり、ランダムアクセスと安全な読み取りながら書き込みをサポートしていました。
7
TU56 DECtapeトランスポート
ここに2つのデュアルトランスポートデッキが積み重ねられています(合計4つのテープユニット)。各トランスポートには独自のWRITE ENABLEとREMOTE/LOCALスイッチがあります。DECtapeは、ディスクドライブがすべてのシステムで安価になる前の数年間、半ランダムアクセスストレージに対するDECの手頃なソリューションでした。
8
RK05Jディスクカートリッジドライブ
それぞれdecpack RK05Jとラベル付けされた2つのディスクドライブ。各ドライブは1つの取り外し可能なトップローディングディスクカートリッジ(すぐ上にラックに収められています)を使用します。これはパックあたり約1.6MBで、OSを実行しファイルを保持するためのテープからの大きな飛躍でした。
9
ディスクカートリッジストレージ
ドライブのすぐ上にラックに収められたスペアのRK05カートリッジ。このシステムを実行していた人が手書きでラベル付けしていました。
10
ブランクフィルパネル
3つのベイ全体に繰り返される大きなプレーンパネルは、無駄なスペースではありません。それらは、各表示パネルの背後で実際の作業を行っているカードケージ、配線、および電源を覆うカバーです。
PDP-8のCPUの内部を見て、その電子機器とコンピュータアーキテクチャをよりよく理解しましょう。
PDP-8 CPUは小さい
最新のCPUアーキテクチャ図を見ると、当惑するほどのレジスタのコレクションが見つかります。
PDP-8は、ほとんどコミカルなほど異なります。マシンでプログラマが視認できるコアには、12ビットのプログラムカウンタ、12ビットのアキュムレータ、そして単一のリンクビットが含まれます。ハードウェアには追加のレジスタがありましたが、レジスタであると期待する多くのものは、代わりにメモリを使用して実装されています。
メモリは、より多くのCPU状態を構築するよりも安価です。
まあ、相対的に安価です。1965年当時、別のレジスタを追加することは、気軽にできることではありませんでした。レジスタはより多くの回路を意味しました。
そのため、プログラマに8つの汎用レジスタを与える代わりに、PDP-8は1つのアキュムレータを提供し、それ以外のすべてにメモリを使用するように求めています。
不便でしたが、信じられないほど経済的でもありました。
必須のPDP-8命令
PDP-8は驚くほど小さな命令セットを持っています。すべての命令は正確に12ビット幅で、最初の3ビットが命令グループを大まかに識別します。
たった8つの基本オペコード
ここにPDP-8のもう一つの奇妙な点があります。「命令ワード」はわずか12ビット幅であり、最初の3ビットが8つの主要な命令グループの1つを決定します。
000: AND // 論理AND
001: TAD // 2の補数加算
010: ISZ // インクリメントしてゼロならスキップ
011: DCA // アキュムレータに格納してクリア
100: JMS // サブルーチンへのジャンプ
101: JMP // ジャンプ
110: IOT // I/O転送
111: OPR // ビット操作
これだけです。たった8つ!
最初は、これは途方もなく小さいように見えます。しかし、PDP-8にとって、これらのいくつかは実際には単一の命令ではなく、「命令ファミリー」です。
以下の表には、この記事で議論されている例やアーキテクチャのアイデアを理解するために必要な、最も重要な命令のいくつかが含まれています。命令の最初の3ビットが、それが属する主要なグループであることを思い出してください。
| オペコード | 意味 | 12ビット | 実行内容 |
|---|---|---|---|
AND | 論理AND | 000 I Z AAAAAAA | AC ← AC AND M[address] |
TAD | 2の補数加算 | 001 I Z AAAAAAA | AC ← AC + M[address], オーバーフロー/キャリーはLINKに影響 |
ISZ | インクリメントしてゼロならスキップ | 010 I Z AAAAAAA | メモリワードをインクリメント;結果がゼロなら次の命令をスキップ |
DCA | アキュムレータに格納してクリア | 011 I Z AAAAAAA | M[address] ← AC、その後 AC ← 0 |
JMS | サブルーチンへのジャンプ | 100 I Z AAAAAAA | リターンアドレスをメモリに格納し、サブルーチンにジャンプ |
JMP | ジャンプ | 101 I Z AAAAAAA | PC ← address |
IOT | 入出力転送 | 110 DDDDDD OOO | I/Oデバイスと通信;デバイスと操作は命令でエンコードされる |
OPR | 操作 | 111 xxxxxxxxx | ACとLINKに対する操作を選択する個々のビットを持つ命令ファミリー |
CLA | アキュムレータクリア | 111 1 00000000 | AC ← 0 |
CLL | リンククリア | 111 0 10000000 | LINK ← 0 |
CMA | アキュムレータ補数 | 111 0 01000000 | ACの全ビットを反転 |
IAC | アキュムレータインクリメント | 111 0 00000001 | AC ← AC + 1 |
RAR | 右ローテート | 111 0 00001000 | 結合された13ビットLINK:AC値を1ビット右にローテート |
RAL | 左ローテート | 111 0 00000100 | 結合された13ビットLINK:AC値を1ビット左にローテート |
HLT | ハルト | 111 1 00000010 | プロセッサを停止 |
6つのメモリ参照命令(AND, TAD, ISZ, DCA, JMS, JMP)の場合、フォーマットは特に重要です。
[画像: 12ビットPDP-8メモリ参照命令]
**I**ビットは直接または間接アドレッシングを選択します。**Z**ビットはページゼロまたはカレントページを選択します。最後の7ビットは、そのページ内の128ワードのいずれかを選択します。
このコンパクトなフォーマットは、PDP-8が非常に興味深い理由の1つです。オペコードとアドレッシング情報を含む命令全体が、わずか12ビットに収まる必要があります。
注: ここでは、JMPやTADのようなニーモニックを使用してこれらのPDP-8オペコードをリストすることにしました。これらのニーモニックは便利で、アセンブラが存在する場合は使用できますが、PDP-8プログラマはしばしばフロントパネルや紙テープを介して生の機械コードを使用してこれらの命令を入力する必要がありました。
アキュムレータ:PDP-8宇宙の中心
PDP-8は、アキュムレータマシンの古典的な例です。そのアキュムレータ、ACは12ビット幅です。ほぼすべての算術および論理演算はこれを中心に展開されます。
例えば、以下の単純な2の補数加算命令(TAD)は次のようになります。
TAD X
X, 0007
これは次のように要約されます。
AC ← AC + Memory[X]
アキュムレータは、アキュムレータ自体とメモリ位置からの内容の間で実行された加算操作の結果を格納します。
アキュムレータは、加算のソースオペランドと最終結果が格納されるデスティネーションの両方です。
アキュムレータを算術・論理命令の中心として使用することは、初期のアーキテクチャではかなり一般的でした。「アキュムレータ」という名前は、初期のコンピューティングや電気機械式計算機にまで遡ります。これは、EDSAC、Manchester Mark 1、そして後のPDP-8のようなストアードプログラムコンピュータで特に顕著になりました。
単一のアキュムレータは、複数のオペランドを必要とする式を計算するには十分すぎるほどです。例えば:
A ← 5
B ← 7
十分なCPUレジスタを持つ最新のプロセッサでは、次のようなものが見られるかもしれません。
R0 = R1 + R2
PDP-8では、これを行うための汎用レジスタファイルはありません。
代わりに、次のように記述するかもしれません。
CLA
TAD A
TAD B
DCA RESULT
A, 0
B, 0
NEXT, 0
ONE, 1
CPUはACをクリアし、Aをそれに加算し、Bをそれに加算し、結果をメモリにデポジットします。
概念的には:
AC ← 0
AC ← AC + A
AC ← AC + B
RESULT ← AC
アーキテクチャは、最新のCPUが隠しがちなものを強制的に見せます。
算術演算は、実際にはデータ移動と比較的少量の計算です。
もしあなたが私たちと一緒に6502プログラミングを学んだことがあるなら、アキュムレータレジスタの使用はあなたにとって第二の天性となるはずです。
符号付きか符号なしか?
見たように、メモリオペランドをアキュムレータに加算するために使用される奇妙な名前の命令はTADです。ニーモニックは2の補数加算(Two's-complement Add)に由来します。
そしてこれは、最初に聞こえるよりも興味深いことです。PDP-8には、符号付き加算と符号なし加算の別々の命令がありません。単に2の補数算術を使用してバイナリ加算を実行します。
ハードウェアレベルでは、これは驚くほど便利です。なぜなら、同じ加算回路が正の値と負の値の両方を処理できるからです。「符号付き整数加算器」と「符号なし整数加算器」はありません。解釈はプログラマに属します。
LINKビット
アキュムレータには、もう一つ興味深い仲間がいます:LINKビットです。
LINKとACを組み合わせると、実質的に13ビットの算術レジスタが形成されます。
その理由は、2つの12ビット数値を加算した結果が、余分なビットを必要とする可能性があるからです。
例えば:
111111111111
+
000000000001
-------------
1000000000000
その結果を12ビットに収めることはできません。したがって、余分なビットはキャリーになります。
LINKビットは単なるキャリービットではありません。LINKは算術モデルに参加するため、プログラマはそれを操作できます。これにより、12ビットを超える数値を扱う算術演算の実装に役立ちます。
例えば、2つの24ビット数値を加算したい場合、各数値を2つの12ビットワード(HIとLO)に格納できます。まず下位ワードを加算し、キャリーがLINKに現れます。次に上位ワードを加算し、そのキャリーを組み込みます。このようにして、ソフトウェアは12ビット加算器から24ビット加算器を構築できます。
[画像: PDP-8リンクビット]
LINKビットの助けを借りた24ビット加算
PDP-8はどのようにプログラムされたか?
それをプログラムする最も初期の方法は、はるかに原始的であり、PDP-8のプログラミングスタイルは本当に3つの段階に分けて考える価値があります。
- フロントパネルプログラミング
- 紙テープマシンコード
- アセンブリ言語とアセンブラ
1. フロントパネル
最初は、文字通りバイナリでプログラムを入力できました。オリジナルのPDP-8にはスイッチ付きのフロントパネルがありました。スイッチを設定して12ビットワードを表し、適切なコントロールを押してそのワードをメモリにデポジットできました。
[画像: PDP-8フロントパネル]
PDP-8 front panel
メモリ位置0200に命令を含めたい場合、そのバイナリ表現を手動で入力しました。
101 001 000 001
スイッチを設定し、アドレスをロードし、ワードをデポジットし、アドレスをインクリメントし、繰り返します。基本的に手作業でのマシンコードプログラミングです。
それは驚くほど教育的でしたが、実質的なものを書くには最適ではありませんでした。
2. 紙テープ
技術とプロセスが進歩するにつれて、プログラムはパンチされた紙テープにも保存できるようになりました。12ビットワードのシーケンスをテープにパンチしてマシンにロードすることができました。これにより、プログラムを保存し、より洗練されたソフトウェアをブートストラップすることが可能になりました。
PDP-8の初期ソフトウェアエコシステムは、紙テープに大きく依存していました。後期のシステムは、DECtapeやディスクシステムを含む他のストレージデバイスを使用できました。
3. アセンブラ
アセンブラが登場すると、状況ははるかに良くなりました。生のバイナリを書く代わりに、次のようなものを書くことができました。
CLA
TAD VALUE
DCA RESULT
JMP LOOP
VALUE, 5
RESULT, 0
そして、アセンブラにニーモニックを12ビットマシン命令に変換させます。
DECはPDP-8ファミリー向けのアセンブラを提供しており、初期の重要なものの一つがPAL(PDP-8 Assembly Language)システムでした。
PDP-8時代の終盤には、OS/8やCOS-310のようなオペレーティングシステムが登場し、PAL-IIIアセンブリ言語、FORTRAN、BASIC、DIBOLなどの言語を使用した、従来のラインモードエディタとコマンドラインコンパイラ開発システムが可能になりました。
フィボナッチ数列をPDP-8アセンブリで
新しいアセンブリ方言を学ぶプログラマにとって、次のシーケンスを計算してメモリに格納する小さなプログラムを書くことは、通過儀礼です。
1, 1, 2, 3, 5, 8, 13, 21, ...
以下は、簡単なバージョンです。
*0200
CLA
TAD ONE
DCA A
TAD ONE
DCA B
LOOP, CLA
TAD A
TAD B
DCA NEXT
TAD B
DCA A
TAD NEXT
DCA B
JMP LOOP
A, 0
B, 0
NEXT, 0
ONE, 1
注: 上記のプログラムが無限にフィボナッチ数を計算し続けるわけではないことは、ほとんどの読者がご存知だと思います。PDP-8は12ビットワードを持ち、算術演算は2の補数表現を使用して実行されるため、符号付き整数は-2048から+2047までの値を表すことができます。したがって、シーケンスは最終的にオーバーフローし、値はラップアラウンドします。
上記のバージョンは意図的にシンプルです。改善されたPDP-8プログラムは次のことができます。
- コンソールテレタイプを介してフィボナッチ数を出力する
- ループカウンタを実装するために
ISZ(インクリメントしてゼロならスキップ)を使用する - 出力のために
JMS(サブルーチンへのジャンプ)を使用してサブルーチンにジャンプする - 2047を超える数値を計算できるように、複数ワード整数を処理する
- 間接アドレッシング(Iビットフラグ)を使用する
- シーケンス全体をメモリバッファに格納する
複数のことを行う
PDP-8には、1つの命令で複数の操作を組み合わせる命令がいくつか見られます。
DCAは格納とクリアを組み合わせる
さらに詳しく調べる価値のあるPDP-8命令は、DCA(デポジット&クリアアキュムレータ)です。
その名前が示すように、単にACをメモリに格納するだけではありません。ACを格納してからアキュムレータをクリアします。
なぜそのような命令を設計したのでしょうか?それは、ハードウェアと制御ステップを節約できるからです!
アキュムレータの値の使用を終えてメモリにデポジットした後、古い値を保持しておく理由がないことがよくあります。そのため、PDP-8は2つの操作を組み合わせます。
2つの操作が頻繁に一緒に行われる場合は、ハードウェアにそれらを一緒に行わせます。
ISZはインクリメントと分岐を組み合わせる
1つの命令で複数のことを行うというこのアプローチのもう一つの例は、ISZ命令です。簡単に言うと、オペコードはCPUにメモリ位置Xをインクリメントし、結果がゼロなら次の命令をスキップするように指示しています。
インクリメントと分岐を組み合わせる理由は何でしょうか?それは非常に安価なループプリミティブを提供するからです。
ある値から始まり、最終的にゼロをラップするカウンタを想像してください。
ISZ COUNT JMP LOOP
COUNTがゼロにならない場合、実行はJMPで続行されます。しかし、COUNTがゼロになった場合、プロセッサはジャンプをスキップします。
それがループです!2つの命令です。
サブルーチンはスタックを必要としない
現代のCPUは、一般的に関数呼び出しを基本的な操作のように感じさせます。ほとんどの場合、関数を呼び出すと次のようになります。
- CPUがリターンアドレスを保存する
- スタックポインタが移動する
- 関数が戻る
PDP-8には、従来のハードウェアスタックはありません。
代わりに、JMS(ジャンプ・トゥ・サブルーチン)はメモリを使用します。
リターンアドレスはサブルーチンエントリに関連付けられたメモリに格納され、サブルーチンはその保存されたアドレスを介した間接ジャンプを使用して戻ることができます。
JMSが実際に行うこと
JMSは、現在のPCをメモリ位置2000に格納し、次にアドレス2001にジャンプします。サブルーチンは、その保存されたアドレスを介した間接ジャンプで戻ります。
次のようなコードを想像してください。
1000: JMS 2000
1001: ... ; コール後の命令
1002: ...
...
2000: 0 ; リターンアドレス用の予約済みワード(12ビット)
2001: ... ; サブルーチンはここから開始
2002: ...
サブルーチンへのジャンプは、実質的に2つのことを行います。
- 現在のPCをメモリ位置2000に格納する
- アドレス2001にジャンプする
サブルーチンは、メモリ位置2000を介した間接ジャンプで戻ることができます。
JMP I 2000
これは、サブルーチンリンケージが基本的にメモリ操作であることを意味します。その下に隠された特別なコールスタックハードウェアはありません。
注: リターンアドレスがメモリに配置されているため、PDP-8プログラマは、サブルーチン呼び出しの後にインラインでパラメータを渡すなどの興味深いトリックを利用できました。
OPR:ビットから作られた命令
OPRオペコードは、PDP-8アーキテクチャのもう一つの非常に興味深い部分です。
可能なすべての操作に独自のオペコードを割り当てる代わりに、PDP-8はOPR命令内の個々のビットを使用して操作を要求します。
つまり、命令は実質的に次のように言うことができます。
ACをクリア + ACを補数化 + ローテート + ...
すべて同じ12ビット命令ワード内で。ビットの組み合わせがマイクロオペレーションを決定します。
これは、多くの人がアセンブリ言語について持つメンタルモデルとは大きく異なります。私たちはしばしば「1つのオペコード、1つの操作」と考えがちです。
PDP-8は、命令ビットがハードウェア制御信号のコレクションのように機能する別の可能性を示しています。
その意味で、OPR命令は、命令ワードに直接埋め込まれたマイクロコードの小さな断片のようなものです。
I/Oは命令セットの一部
PDP-8について考えると、正確な周辺機器はモデルと構成に大きく依存しました。典型的なシステムには次のようなものがありました。
- テレタイプ端末:キーボード入力とプリンタ出力
- 紙テープリーダー:パンチテープからのプログラム/データのロード
- 紙テープパンチャー:パンチテープの生成
- プリンタ
- カードリーダー
- ディスプレイ:ポイントプロットおよびストレージチューブ
- リアルタイムクロック
- アナログ-デジタルコンバータ
- ディスクストレージ
- 磁気テープ
- システムに接続されたさまざまなラボ機器
オリジナルのPDP-8のコンソールテレタイプは、キーボード、プリンタ、紙テープリーダー、紙テープパンチャーを組み合わせたASR-33であることが一般的でした。
[画像: PDP-8 ASR-33]
ASR-33 teletype console
IOT命令
PDP-8には、巨大な標準化されたコントローラー階層を持つ最新のペリフェラルバスはありません。代わりに、IOT命令があります。
命令ワードには、I/Oデバイスと操作を識別するフィールドが含まれています。
デバイスコードと操作の多数を選択するのに十分なビットがあり、IOTの正確な意味は接続されたデバイスによって決定されます。
IOT命令は次の一般的な構造を持っています。
[画像: IOT命令]
デバイスフィールドが6ビット幅であるため、64の可能なデバイスコードがあります。
注: 一部のプログラマは、KSF(Keyboard Skip if Flag)、KRB(Keyboard Read Buffer)、TSF(Teleprinter Skip if Flag)のような便利なニーモニックを提供します。これらは別個の命令のように見えますが、実際にはすべて同じIOT命令のバリエーションです。各ニーモニックは、12ビットIOT命令内の特定のデバイス番号と操作ビットの組み合わせを表すだけです。アセンブラは、対応するビットパターンにニーモニックを変換します。
CPUは周辺機器について知らない
CPUは、プリンタ、紙テープリーダー、またはオシロスコープが実際に何であるかを知る必要はありません。そのため、新しいCPU命令を追加することなく、新しい周辺機器を追加できます。
それは本質的に次のように言います。「デバイス04に向けられたIOT命令です。適切な信号をI/Oバスに出力します。そのデバイス番号を聞いているハードウェアがあれば、どうするかを決定してください。」
PDP-8はどれくらい速かったか?
ファミリーはかなり進化しているので、どのPDP-8モデルについて話しているかによります。しかし、オリジナルの1965年製PDP-8は、現代の基準では非常に遅かったですが、当時の基準では驚くほど有能でした。
PDP-8は、例えば「3.5 GHz」と言って、そのパフォーマンスの有用な説明として使用するような、現代のCPUとは動作しませんでした。そのタイミングはメモリサイクルに密接に関連していました。
オリジナルのPDP-8は、約1.5μsの基本的なメモリサイクルを持っていました。典型的なメモリ参照命令は複数のメモリサイクルを必要としたため、命令の実行レートは、命令とメモリ構成に応じて、毎秒数十万命令のオーダーでした。
オリジナルのPDP-8では、加算は約3μsで実行できました。PDP-8/Sは約36μsかかりました。PDP-8/Sのコアメモリサイクルは約8μsでした。
| モデル | 時期 | パフォーマンス |
|---|---|---|
| PDP-8 | 1965 | TADあたり約3μs |
| PDP-8/S | 1966 | TADあたり約36μs |
PDP-8/Sは、上記の比較で明らかに異質です。PDP-8/Sの36μsの加算値に注目してください。これは、より安価な/Sが存在する理由を正確に示しています。12ビット幅のデータパスを構築する代わりに、DECはデータをシリアルに、一度に1ビットずつ処理しました。これにより必要なハードウェア量が劇的に削減されましたが、代償がありました。オリジナルのPDP-8で約3μsかかった加算が、PDP-8/Sでは約36μsかかりました。つまり、8/Sはハードウェアを時間と引き換えにしました。
PDP-8/IやPDP-8/Eのような後継モデルは、約1.5μsのメモリサイクルを持っていました。
コアメモリは時間に対する考え方を変える
オリジナルのPDP-8は磁気コアメモリを使用していました。これは、ワイヤーを通して小さな磁気コアを使用してビットを格納します。
[画像: 磁気コアメモリ]
PDP-8 magnetic core-memory module
現代のRAMとは異なり、これはシリコンチップ上の微細なトランジスタの海ではありません。磁気コンポーネントの物理的なグリッドです。
これが、PDP-8モデルの速度をメモリサイクルで言及した理由です。メモリは十分に遅かったため、プロセッサのタイミングはコンピュータのメモリサイクルに強く結びついていました。
今日CPUを設計する場合、プロセッサを高速なもの、メモリを低速なものと考える傾向があります。しかし、PDP-8では、CPU自体は比較的シンプルであり、マシンのリズムの多くはメモリ技術によって決定されていました。
したがって、メモリの物理的な実装は、プロセッサのタイミングに直接影響を与えました。
結論
PDP-8は、その下に隠されているものを思い出させてくれる良い例です。もしあなたが私たちと一緒に基本的なコンピュータ回路の仕組みを学んでいて、少数の論理ゲートが加算器になり、加算器がALUの一部になり、ALUと少数のレジスタがCPUになる方法を理解できれば、コンピュータが本当に何であるかの重要な部分をすでに理解したことになります。それ以外のすべては、さらに別の抽象化レイヤーです。
それが、PDP-8のようなマシンを研究するのがとても楽しい理由です!アセンブリ命令TAD Aがもはや神秘的でなくなるまで、それらのレイヤーを一つずつ剥がしていくことができます。
PDP-8が非常に影響力を持つようになったもう一つの歴史的な理由は、それがオープンになるように設計されたことです。DECのドキュメントとハードウェア情報は、当時のマシンを異常にアクセスしやすくしました。大学や研究所はマシンを研究し、変更し、インターフェースを構築することができました。アーキテクチャの周りにサードパーティ製のハードウェアや特殊なシステムが登場しました。
これは計り知れないほど重要でした。理解して変更できるコンピュータは、単に借りて操作するコンピュータとは異なるものになります。
- エンジニアはPDP-8をより大きなシステムのコンポーネントとして使用できました
- 研究所は独自の機器を接続できました
- 製造業者は特殊なコントローラを構築できました
- 学生はマシンが実際にどのように機能するかを学ぶことができました
PDP-8は、私たちが購入またはレンタルしたコンピュータだけではありませんでした。それは、私たちがそれを使って何かを構築できるコンピュータでした!