コンテンツにスキップ

PDP-8

出典: フリー百科事典『ウィキペディア(Wikipedia)』
スミソニアン博物館に展示されている PDP-8。初期のトランジスタを使用したPDP-8で、Straight 8と呼ばれる。

PDP-8121960 (DEC) 19653225DECPDP[1]PDP-8[2]PDP-8 PDP(Programmed Data Processor[3])PDP-5 [3]

PDP-8 "Straight-8"  diode-transistor logic (DTL) 

PDP-8/S1ALUPDP-8PDP-8/SDF3232K

PDP-8/I/L/E/F/M/ATTLIC使DTL[?]PDP-8PDP-8/E使使

1975使 Altair 8800  TRS-80  Apple II 

1979 PDP-8 CMOS使"CMOS-8s" 使1981 IBM PC CMOS-8s1982 Intersil 6100 CMOS

概要

[編集]

PDP-8Apple IIPDP-8

PDP-812 W.A. Clark  C.E. Molnar LINCLINC CDC 160 [4]

I/O (PIO) DMAPIO/DMA--使

1204095 -2048  +2047 12ASCII612

使[5]

PDP-84,096IOT使

PDP-88212ACL1.5μ120.333MIPS1974 Pocket Reference Card 1.2μ2.6μ(/MQ)

PDP-8ALUPDP-8/S519使200815使使PDP-8CPU124使使PDP-8/S2使 diode-transistor logic (DTL) [6]

PDP-8のバージョン

[編集]
PDP-8/E PDP-8

PDPPDP-850,000[7] PDP-812bit

PDP-8 - 16,000

LINC-8

PDP-8/S - Small PDP-8ICPDP1

PDP-8/I - PDPIC

PDP-8/L - Low Cost

PDP-12

PDP-8/E - Economy8/S1970$4,9902023$39,1504kTTY[8]

PDP-8/F

PDP-8/M

PDP-8/A

Intersil 6100 PDP-8VT78使

Harris 6120 CMOSPDP-8DECmate使

後の実装例

[編集]

PDP-8のアーキテクチャは非常に単純なので、それをエミュレートするのは容易である。愛好家がPDP-8全体を1個のFPGAで実装した例もある。

インターネット上にはPDP-8をシミュレート/エミュレートするソフトウェアもいくつか存在する。うまく実装されたものはDECのOSや診断プログラムを実行可能である。後期のPDP-8に可能な限りの周辺機器を接続した状態をシミュレートすることが多い。そこまでしても、現代のパーソナルコンピュータのリソースのほんの一部しか占めない。

入出力

[編集]

I/OPDP-8PDP-8ASR-33/KSR-33RS-232C(dumb)[?]IDEPDP-8

I/O:

I/O

"Negative" I/O(Lo1)

"Positive" I/O(Hi1)

Omnibus PDP-8/E

DMA (three-cycle data break) I/ODMA3I/OPDP-8PDP-8/E"one-cycle data break"I/ODMAI/ODMA3

プログラミング環境

[編集]

PDP-8PAL-8 FOCAL  4K FORTRAN OS/8  COS-310 PAL-IIIFORTRANBASICDIBOL

PDP-8RTOS/ RTOS RTS-8 COS-300  COS-310 WPS-8 

 TSS-8 使TSS-8 110//BASICFORTRAN()ALGOLFOCALPAL-D

DECUS (Digital Equipment Computer User Society) PDP-8

命令セット

[編集]

12ビットの命令ワードの先頭3ビット(ビット0から2)が命令コードである。ビット5から11までの7ビットのオフセット部でアクセスするメモリを示す。ビット4がセットされていたら、プログラムカウンタ (PC) の上位5ビットとオフセットを連結してアドレスを完成させる。そのビットがゼロならアドレスの上位はゼロとする。ビット3は間接かどうかを示す。セットされていたら、それまでに得られたアドレスはメモリ上にある実効アドレスのある位置を示していることになる。JMP命令は、間接指定されていない場合はメモリワードを読み込むわけではないが、命令のフォーマットは同じである。

0 2 3 4 5 11
Operation I Z Offset

メモリページ

[編集]

74,09612840 0000  017700 0000  0010  0017 



128PC

基本命令

[編集]
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

Device

IOT38I/O便
00 - I/O ION (6001) IOFF (6002) 

01 - 

02 - 

03 - 

04 - 

Function

IOT911/
11 - 

10 - AC 

9 - AC1I/O



38

OPR (OPeRate) 命令

[編集]

OPROPR11JMP

OPR1OR1IOT

便

OPR38111

グループ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回)

便 CLA (CLear Accumulator)  CLL (CLear Link)  IAC (Increment ACcumulator) ACLINKAC1 RAL AC21

CMAIACCIAAC2PDP-8 (TAD) 2

1OPRNOP使

グループ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

[編集]

使OPR3 MQ (Multiplier/Quotient) 
           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     3

7601  CLA  AC

7501  MQA  Multiplier/Quotient ACOR

7441  SCA  AC

7421  MQL  AC  Multiplier/Quotient AC

7621  CAM  CLA + MQL ACMQ

CLAMQAMQACMQAMQL便ACMQ

8103
7401 – 何もしない
7403 – SCL – ACからステップカウンタへのロード(即値ワードが後置される。PDP-8/Iかそれ以降)
7405 – MUY – 乗算
7407 – DVI – 除算
7411 – NMI – 正規化
7413 – SHL – 左シフト(即値ワードが後置される)
7415 – ASR – 算術右シフト
7417 – LSR – 論理右シフト

メモリ制御

[編集]
PDP-8/I のコアスタック

124,096PDP-8

832,76815032KCPU

4KDF (Data Field)  IF (Instruction Field) 2315IFDF

IOT 6200  6277 DFIF62X1  (CDF, Change Data Field) DFX62X2 (CIF) IFX62X3 XCIFCDFDFIFCIFJMPJMSCIF

DF/IF使1512 Intel 8086 Intel 8080 1620

4K FOCAL 3K使1KFOCAL4K4K

仮想化

[編集]

PDP-8/EPDP-8使1PDP-8IO

IOTDF/IF/CIFCIFPDP-88CIFCIF

PDP-8/A32KPDP-8/A8ACPDP-8使

コーディング例

[編集]

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

サブルーチン

[編集]

PDP-8(AC)

使 "Hello world" JMSOUT1:0
    *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

RAMROM使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 address

JMS使

ソフトウェアスタック

[編集]

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

割り込み

[編集]

PDP-81 0JMP I 0 

I/O1 "skip chain" skip chain  skip chain 

脚注

[編集]
  1. ^ Douglas W. Jones. “The Digital Equipment Corporation PDP-8” (英語). 2009年10月30日閲覧。
  2. ^ 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
  3. ^ a b P.HAYES, JOHN (1978,1979). Computer Architecture and Organization. pp. 42. ISBN 0-07-027363-4 
  4. ^ Bell, Gordon; C. Mudge, J. McNamara (1978). Computer Engineering: A DEC View of Hardware Systems Design. Digital Press. ISBN 0-932376-00-2. https://books.google.co.jp/books?id=rN0iAAAAMAAJ&dq=Computer+Engineering:+A+DEC+View+of+Hardware+Systems+Design&q=Computer+Engineering:+A+DEC+View+of+Hardware+Systems+Design&pgis=1&redir_esc=y&hl=ja 
  5. ^ Bell & Newell 1971
  6. ^ PDP-8/S Maintenance Manual, DEC, 1971
  7. ^ PDPシリーズはどれくらい売れたのか---Part.5”. 2020年12月12日閲覧。
  8. ^ 『Computer Report』Vol.10 No.10、日本経営科学研究所、1970年

参考文献

[編集]

外部リンク

[編集]