PDP-8
![](http://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/PDP-8.jpg/220px-PDP-8.jpg)
概要
[編集]PDP-8のバージョン
[編集]![](http://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/PDP_8_e_Trondheim.jpg/220px-PDP_8_e_Trondheim.jpg)
後の実装例
[編集]PDP-8のアーキテクチャは非常に単純なので、それをエミュレートするのは容易である。愛好家がPDP-8全体を1個のFPGAで実装した例もある。
インターネット上にはPDP-8をシミュレート/エミュレートするソフトウェアもいくつか存在する。うまく実装されたものはDECのOSや診断プログラムを実行可能である。後期のPDP-8に可能な限りの周辺機器を接続した状態をシミュレートすることが多い。そこまでしても、現代のパーソナルコンピュータのリソースのほんの一部しか占めない。
入出力
[編集]プログラミング環境
[編集]命令セット
[編集]12ビットの命令ワードの先頭3ビット(ビット0から2)が命令コードである。ビット5から11までの7ビットのオフセット部でアクセスするメモリを示す。ビット4がセットされていたら、プログラムカウンタ (PC) の上位5ビットとオフセットを連結してアドレスを完成させる。そのビットがゼロならアドレスの上位はゼロとする。ビット3は間接かどうかを示す。セットされていたら、それまでに得られたアドレスはメモリ上にある実効アドレスのある位置を示していることになる。JMP命令は、間接指定されていない場合はメモリワードを読み込むわけではないが、命令のフォーマットは同じである。
0 | 2 | 3 | 4 | 5 | 11 | ||||||
Operation | I | Z | Offset |
メモリページ
[編集]基本命令
[編集]- 000 - AND - メモリオペランドと AC の AND (ACはアキュムレータの略)
- 001 - TAD - メモリオペランドと <L,AC>(ACのビット値とLのキャリー)の加算(2の補数とみなす、つまり符号付)
- 010 - ISZ - メモリオペランドをインクリメントし、結果がゼロならば次の命令をスキップする
- 011 - DCA - ACをメモリオペランド位置に保存し、ACをクリアする
- 100 - JMS - サブルーチンへジャンプ(サブルーチンの先頭ワードにリターンアドレスを保持する)
- 101 - JMP - ジャンプ
- 110 - IOT - 入出力転送(後述)
- 111 - OPR - マイクロコード化操作(後述)
IOT(入出力転送)命令
[編集]PDP-8はIOT命令をほとんど定義せず、単に枠組みを提供している。多くのIOT命令がどう作用するかは個々の周辺機器によって異なる。
0 | 2 | 3 | 8 | 9 | 11 | ||||||
6=IOT | Device | Function |
OPR (OPeRate) 命令
[編集]グループ1
[編集]00 01 02 03 04 05 06 07 08 09 10 11 ___________________________________ | 1| 1| 1| 0| | | | | | | | | |__|__|__|__|__|__|__|__|__|__|__|__| |CLA CMA RAR BSW CLL CML RAL IAC Execution order 1 1 2 2 4 4 4 3
- 7200 – CLA - AC クリア
- 7100 – CLL - L ビットのクリア
- 7040 – CMA - ACの 1の補数
- 7020 – CML - L ビットの反転
- 7010 – RAR - <L,AC> の右ローテート
- 7004 – RAL - <L,AC> の左ローテート
- 7002 – BSW – 6ビットの「バイト」のバイトスワップ(PDP-8/E以降)
- 7001 – IAC - <L,AC>のインクリメント
- 7012 – RTR - <L,AC> の右ローテート(2回)
- 7006 – RTL - <L,AC> の左ローテート(2回)
グループ2、Orグループ
[編集]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
- 7600 – CLA - ACをクリア
- 7500 – SMA - AC < 0 のとき次命令をスキップ (or group)
- 7440 – SZA - AC = 0 のとき次命令をスキップ (or group)
- 7420 – SNL - L ≠ 0 のとき次命令をスキップ (or group)
- 7404 – OSR - ACとフロントパネルスイッチの間の論理和
- 7402 – HLT - 停止
ビット8がセットされていない場合、指定された条件のいくつかが真ならばスキップを行う(条件はORされる)。例えば、"SMA SZA" 命令コード 7540 の場合、AC ≤ 0 ならスキップする。
グループ2のOPR命令もマイクロコード化ビットが全くセットされていない場合、NOP命令として扱われる。
グループ2、Andグループ
[編集]00 01 02 03 04 05 06 07 08 09 10 11 ___________________________________ | 1| 1| 1| 1| | | | | 1| | | 0| |__|__|__|__|__|__|__|__|__|__|__|__| |CLA SNA OSR SPA SZL HLT 2 1 1 1 3 2
- 7410 – SKP - 無条件に次命令をスキップ
- 7610 – CLA – ACをクリア
- 7510 – SPA - AC >= 0 のとき次命令をスキップ (and group)
- 7450 – SNA - AC ≠ 0 のとき次命令をスキップ (and group)
- 7430 – SZL - L = 0 のとき次命令をスキップ (and group)
ビット8がセットされている場合、スキップ条件はOrグループのときと逆であり、いずれかの条件が真でないときスキップは行わない。つまり、指定された条件が全て真となる必要がある(条件はANDされる)。例えば "SPA SNA" 命令コード 7550 は AC > 0 のときスキップする。ビット5からビット7が全くセットされない場合、無条件でスキップする。
グループ3
[編集]00 01 02 03 04 05 06 07 08 09 10 11 ___________________________________ | 1| 1| 1| 1| | | | | | | | 1| |__|__|__|__|__|__|__|__|__|__|__|__| |CLA SCA \_ _/ | MQA MQL CODE 1* 2 2 2 37601 – CLA – ACをクリア 7501 – MQA – Multiplier/Quotient をACにORする 7441 – SCA – ステップカウンタをACにロード 7421 – MQL – AC を Multiplier/Quotient にロードし、ACをクリア 7621 – CAM – CLA + MQL なので、ACとMQを共にクリア 通常、CLAとMQAを組み合わせてMQの中身をACに転送する。MQAとMQLの組合せも便利で、ACとMQの中身を交換する。 ビット8からビット10までの3ビットで以下のいずれかの命令が実行される。
- 7401 – 何もしない
- 7403 – SCL – ACからステップカウンタへのロード(即値ワードが後置される。PDP-8/Iかそれ以降)
- 7405 – MUY – 乗算
- 7407 – DVI – 除算
- 7411 – NMI – 正規化
- 7413 – SHL – 左シフト(即値ワードが後置される)
- 7415 – ASR – 算術右シフト
- 7417 – LSR – 論理右シフト
メモリ制御
[編集]![](http://upload.wikimedia.org/wikipedia/commons/thumb/5/57/PDP-8I-core.jpg/220px-PDP-8I-core.jpg)
仮想化
[編集]コーディング例
[編集]PDP-8のアセンブリ言語プログラムを例として示す。以下のコード例はPAL-IIIアセンブラによる。
2つの数の比較
[編集]単に2つの数を比較するだけでどれだけのコードが必要となるかを示したコード断片。
/Compare numbers in memory at OPD1 and OPD2 CLA CLL /Must start with 0 in AC and link TAD OPD1 /Load first operand into AC (by adding it to 0); link is still clear CIA /Complement, then increment AC, negating it TAD OPD2 /AC now has OPD2-OPD1; if OPD2≥OPD1, sum overflows and link is set SZL /Skip if link is clear JMP OP2GT /Jump somewhere in the case that OPD2≥OPD1; /Otherwise, fall through to code below.
見ての通り、PDP-8の典型的なプログラムは作者が意図したアルゴリズムよりも低レベルな機構に集中する傾向がある。また、可読性を損なうもう1つの問題として、条件分岐部分のコーディングがある。上の例で判るとおり条件判断命令(JMP命令をスキップしている命令)は、注目している条件とは反対の条件判断をしなければならない。
文字列出力
[編集]PDP-8で "Hello, world" をテレタイプ端末に出力するアセンブリ言語のプログラム。
*10 / Set current assembly origin to address 10, STPTR, STRNG-1 / 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 again (needed when we loop back from tls) TAD I Z STPTR / Get next character, indirect via PRE-auto-increment address from the zero page 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 HELLO / 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 $HELLO /DEFAULT TERMINATOR
サブルーチン
[編集]*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を代替に使用するかどうかを指定する︵要するに非常に特殊なメモリを使用する︶。 ●サブルーチンを全く使わない。またはJMS命令の代わりに次のようなコードを使い、書き換え可能なメモリにリターンアドレスを置く。
JUMPL, DCA TEMP / Deposit the accumulator in some temporary location TAD JUMPL+3 / Load the return address into the accumulator: hard coded JMP SUBRO / Go to the subroutine, and have it handle jumping back JUMPL+4 / Return addressJMS命令を使用するとデバッグが難しくなる。例えば、リターンアドレスの書き換えによって無限ループに陥ることもあるし、サブルーチンのアドレスを間違うとサブルーチンの先頭ではないワードをリターンアドレスで書き換えてしまうこともある。こういった誤りは実行してみないとわからないこともある。
ソフトウェアスタック
[編集]PDP-8 はスタックをハードウェアでサポートしていないが、ソフトウェアでの実装は可能である。以下はPUSHとPOPというサブルーチンの実装例だが、単純化するためスタックのオーバーフローやアンダーフローはチェックしていない。
PUSH, 0 DCA DATA CLA CMA / -1 TAD SP DCA SP TAD DATA DCA I SP JMP I PUSH /Return POP, 0 CLA CLL TAD I SP ISZ SP JMP I POP DATA, 0 SP, 0
以下は、"Hello World" を "OUT" というサブルーチンとこのスタックを使って実装したものである。
*200 MAIN, CLA CLL /Set the message pointer TAD (MESSG /To the beginning of the message (literal) DCA SP LOOP, JMS POP SNA /Stop execution if zero HLT JMS OUT /Otherwise, output a character JMP LOOP MESSG, "H "e "l "l "o ", " "w "o "r "l "d "! 015 012 0 OUT, 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 OUT / Return to caller
連結リスト
[編集]PDP-8での連結リストの実装例。
GETN, 0 /Gets the number pointed to and moves the pointer CLA CLL /Clear accumulator TAD I PTR /Gets the number pointed to DCA TEMP /Save current value ISZ PTR /Increment pointer TAD I PTR /Get next address DCA PTR /Put in pointer JMP I GETN /return PTR, 0 TEMP, 0
割り込み
[編集]JM
P I 0
命令で割り込まれた箇所に戻るとき割り込み可とする。
I/Oバスの割り込みラインが1本なので、割り込み発生源が何かということは分からない。そのため、割り込み処理ルーチンは順に各デバイスのステータスをポーリングしてチェックし、割り込み元を識別した。この処理は条件スキップ命令が並ぶので "skip chain" と呼ばれた。skip chain の最後まで実行しても割り込み元が見つからないことは珍しいことではなかった。相対的な割り込みの優先順位は skip chain でチェックする順番で決定され、先に見つかった割り込みの処理が優先される。
脚注
[編集]- ^ Douglas W. Jones. “The Digital Equipment Corporation PDP-8” (英語). 2009年10月30日閲覧。
- ^ The ultimate entrepreneur: the story of Ken Olsen and Digital Equipment Corporation entry in Google Books, by Glenn Rifkin, George Harrar, 1988, ISBN 978-1-55958-022-9
- ^ a b P.HAYES, JOHN (1978,1979). Computer Architecture and Organization. pp. 42. ISBN 0-07-027363-4
- ^ Bell, Gordon; C. Mudge, J. McNamara (1978). Computer Engineering: A DEC View of Hardware Systems Design. Digital Press. ISBN 0-932376-00-2
- ^ Bell & Newell 1971
- ^ PDP-8/S Maintenance Manual, DEC, 1971
- ^ “PDPシリーズはどれくらい売れたのか---Part.5”. 2020年12月12日閲覧。
- ^ 『Computer Report』Vol.10 No.10、日本経営科学研究所、1970年
参考文献
[編集]- Bell, C. Gordon; Newell, Allen (1971), Computer Structures: Readings and Examples, New York: McGraw-Hill Book Company, pp. 120-136
外部リンク
[編集]- pdp-8 Documentation: The Small Computer Handbook (1966 Edition), Sections 1 and 2 and others are available from Simon Fraser University
- PDP-8 Frequently Asked Questions, FAQS.ORG
- pdp8online.com has a running PDP8 that anyone can control through a Java applet, plus a webcam to show the results
- dpa ポータブルなPDP-8クロスアセンブラ
- SBC6120 PDP-8互換マシン販売サイト
- Still working Classic 8, PDP 8e and 8i in a German computer museum
- PDP-8/E Simulator for Macintosh (Bernhard Baehr)
- Willem van der Mark's PDP-8/E Simulator in Java
- SimH "Classic" 各種OSで動作する非常にポータブルなPDP-8シミュレータ
- The Digital Equipment Corporation PDP-8, 1965 - スミソニアン博物館のコレクション
- PDP11 Website Blogs the restoration of PDP-8 computers
- GRC's | Digital Equipment Corporation's PDP-8 Steve Gibson's explanation on how the PDP-8 works and how to program it.
- (61) PDP8 - Presentation #1 - YouTube has a video series showing the PDP-8
- “Index of PDP-8 documents”. BitSavers.Org web site. 2011年5月29日閲覧。