■■■ PDP−10アセンブラ・命令解説書 ■■■
著:Henry Baker		訳:Sufoo
(途中、省略してあります。間違っているところは、ごめんなさい。)
■  メモリ
 全メモリ空間は、ほとんどの場合において同等のものである。しかし、OSによっては特定の目的のため
にメモリを予約している。
■  アーキュムレータ(レジスタ)
PDP−10には、16個のレジスタがあり、0から17までの番号で区別される。(8進数であることに
注意)
■  命令フォーマット
PDP−10はワード志向のマシンで、1ワードは36ビットから成る。全ての命令は1ワードである。
命令フォーマットは2種類あって、ほとんどは次の形式である。
 000000000 0111 1 1111 112222222222333333
 012345678 9012 3 4567 890123456789012345
 ________________________________________
|         |    | |    |                  |
|   OP    | AC |I| X  |        Y         |
|_________|____|_|____|__________________|
ただし、入出力命令については、次の形式である。
 000 0000000 111 1 1111 112222222222333333
 012 3456789 012 3 4567 890123456789012345
 _________________________________________
|   |       |   | |    |                  |
|111|  DEV  |IOP|I| X  |        Y         |
|___|_______|___|_|____|__________________|
ここで、OPは命令コード、ACはレジスタの番号、Iは間接参照のフラグ、Xがインデックス、Yがアド
レス、DEVはデバイス・コード(I/Oポートのアドレスのようなものか?)、IOPは、入出力命令の命
令コードである。
例:
        MOVE 1,@100             ;OPにはMOVEの命令コードが入る。ACには1が入る。
                                ;@をつけることにより、Iがセットされる。
                                ;X=0, Y=100
        HRRZ 17,1(3)            ;OPにHRRZの命令コード、 AC = 17,
                                ;Y = 1, X = 3, I = 0
        SOS FOO                 ;OPにSOSの命令コード, FOOは、Yに入る文字定数
                                ;AC, X, I =0
■  用語法
#	...	等しくない
<=	...	以下
>=	...	以上
<-	...	代入する
AC	...	現在の命令のACフィールドの値を示す(0から17の値をとる)
E	...	現在の命令の有効アドレスを示す
PC	...	次の命令のアドレスが入っている
C(x)	...	xで示されたアドレスのメモリの内容を示す
CR(x)	...	xで示されたアドレスのメモリの内容の右半分を示す
CS(x)	...	xで示されたアドレスのメモリの内容の左右半分づつの内容を入れ替えたものを示す
CL(x)	...	xで示されたアドレスのメモリの内容の左半分を示す
x,,y	...	左半分がx、右半分がyであるワード型データを示す
<x>	...	代数学の丸カッコと同じ働きをします。5*<1,,1>は<5,,5>と同じです。
[x]	...	xという内容を含むメモリのアドレスを示します。これをリテラルと呼びます。
(x)	...	xの左右を入れ替えたものを示します。(3,,4)は4,,3と同値です。
(覚え方)
AC = Accumulator
C = Container
E = Effective Address
PC = Program Counter
CR = Container Right
CS = Container Swap
CL = Container Left
■  有効アドレスの計算方法
ほとんど全ての命令は、有効アドレスを計算します。有効アドレスは、オペランドのアドレスとして使わ
れます。命令によって、オペランドは読み書きされますが、immediate命令と呼ばれる命令では、有効アド
レスはメモリのアドレスとしては使われません。その場合、直接、数字として使われます。例えば、ADD
命令は有効アドレスによって示された数字を加算しますが、ADDI(ADD Immediate)命令は、有効アド
レスそれ自体の数字を加算します。
実効アドレスの計算にはYフィールド(18ビット)、Xフィールド(4ビット)、Iフィールド(1ビット)
が使われます。この3つから、18ビットの有効アドレスを計算します。
1.X=I=0の場合、有効アドレスはそのままYの値になります。
2.Xが0でない場合、Xは、アーキュムレータの番号になります。ただし、アーキュムレータ0は使えま
せん。そのアーキュムレータは、インデックス・レジスタとして働き、有効アドレスは、Yフィールドにイ
ンデックス・レジスタの内容の右半分を足したものになります。
3.間接参照のフラグ(Iビット)がセットされていると、その命令のYフィールド(Xが0でない場合は、
Yにインデックス増分をたしたもの)で示されたメモリの内容から、新しくX,Y,Iフィールドを得て、
そして、それを使って、始めから処理を開始します。Iビットがセットされている限り、間接参照は何度で
も起こり、Iビットが0になった時点で終了します。
以上のような有効アドレスの計算の結果、OPとACフィールドは元の命令のまま、XとIが全て0で、Y
フィールドに有効アドレスが入ったのと同じ状態になり、これが実行されます。
以下に有効アドレスの計算方法を流れ図で示します。ただし、MAは、メモリのアドレスを示します。
IFETCH: MA <- PC
        OP <- Bits  0:8  of C(MA);
        AC <- Bits  9:12 of C(MA);
EACOMP: I  <- Bit  13    of C(MA);
        X  <- Bits 14:17 of C(MA);
        Y  <- Bits 18:35 of C(MA);
        E  <- Y;
        IF NOT(X=0) then E <- E+C(X);
        IF I=0 then go to done;
        MA <- E;
        GO TO EACOMP;
DONE:
■  ワード内の全ビットを扱う命令:MOVE,BLT,EXCH,PUSH,POP
ワードをメモリやアーキュムレータにコピーする命令です。絶対値や、符号の反転などの、比較的簡単な
数学処理の機能も含まれている場合があります。
MOVE命令群は、アーキュムレータとメモリの間のワード転送をします。MOVE命令群には16の命令
が含まれます。全てのニーモニックはMOVで始まり、その次の一文字はデータ転送の機能の修飾を示し、、
その次の一文字はコピー元やコピー先を示します。
        |E 修正無し		|  from memory to AC
MOV     |N 符号反転(negate)	|I Immediate.  Move the address to AC.
        |M 絶対値(magnitude)	|M from AC to memory
        |S 交換(swap)		|S to self.  If AC#0, move to AC also
Swapで、もし、命令のACフィールドが0でなければ、処理結果はACで示されるアーキュムレータに
も送られます。
MOVE                    C(AC) <- C(E)
MOVEI                   C(AC) <- 0,,E
MOVEM                   C(E)  <- C(AC)
MOVES                   C(E)  <- C(E); if AC#0 then C(AC) <- C(E)
MOVN                    C(AC) <- -C(E)
MOVNI                   C(AC) <- -E
MOVNM                   C(E)  <- -C(AC)
MOVNS                   C(E)  <- -C(E); if AC#0 then C(AC) <- -C(E)
MOVM                    C(AC) <- |C(E)|
MOVMI                   C(AC) <- 0,,E
MOVMM                   C(E)  <- |C(AC)|
MOVMS                   C(E)  <- |C(E)|; if AC#0 then C(AC) <- |C(E)|
MOVS                    C(AC) <- CS(E)
MOVSI                   C(AC) <- E,,0
MOVSM                   C(E)  <- CS(AC)
MOVSS                   C(E)  <- CS(E); if AC#0 then C(AC) <- CS(E)
EXCH(Exchange)命令は、ACの内容とEの内容を交換します。
EXCH    C(AC)><C(E)
BLT(Block Transfer)命令は、連続したメモリ空間上にあるワードを一気に転送します。ACの内容の左
半分は、コピーもとの最初のワードのアドレスを、右半分はコピー先の最初のワードのアドレスを示します。
有効アドレスは、コピー先の最終アドレスを示します。ワードは、BLTの有効アドレスの値以上になるま
で、1つずつコピーされます。
注意:BLT命令は、ACの内容を破壊します。
もし、コピー元とコピー先が重なっている場合には、”BLT命令は、低アドレスから順番にコピーしていく”
と覚えておくと良い。もし、コピー先がBLTで使っているACと重なっている場合には、ACは、コピー
先の最後のアドレスになっている方が良い。
;Save all the accumulators:
        MOVEM   17,SAVAC+17     ;AC 17の保存(BLT命令でAC17を使うため)
        MOVEI   17,SAVAC        ;Source is 0, destination is SAVAC
        BLT     17,SAVAC+16     ;AC 0から16の保存
;Restore all the accumulators:
        MOVSI   17,SAVAC        ;Source is SAVAC, destination is 0
        BLT     17,17
■  スタック操作命令
PUSH命令とPOP命令はワードをスタック・リストに追加、削除します。リストのトップのアドレス
(スタックポインタみたいなもの)は、ACの内容の右半分に入っていて、これらの命令に参照されます。
ACの内容の左半分はコントロール・カウンタとして、プログラムによって利用されるかもしれません。
PUSH    C(AC) <- C(AC)+<1,,1>;  C(CR(AC)) <- C(E)
ACによって選択されたアーキュムレータの左右両半分はインクリメントされます。もし、ACの内容の左
半分が正の値になったら、スタック・オーバーフロー状態になります。しかし、PUSH命令はちゃんと実
行されます。有効アドレスによって示されたワードが読み込まれ、ACの内容の右半分によって示されたス
タック・リストのトップに追加されます。
POP     C(E) <- C(CR(AC)); C(AC) <- C(AC)-<1,,1>
POP命令は、PUSH命令のちょうど逆の動作をします。もし、コントロール・カウンタが負の値になっ
たら、スタック・オーバーフローになります。
たいてい、プッシュダウン・ポインタ(スタック・ポインタ)として使われるアーキュムレータには、Pと
いうシンボル名が付けられます。Pを初期化する(PDLISTから始まり、Nワードの長さを持つリスト
を設定する)には、次のようにします。
        MOVE P,[-N,,PDL-1]
どこか他の場所で、次のようにスタック・リストの領域が確保されていなくてはいけません。
PDL:    BLOCK   N	;PLDというシンボル・ラベルを定義し、そこからNワード予約する。
■  ハーフ・ワード操作命令
ハーフ・ワード操作命令群は、アーキュムレータの半ワードとメモリの半ワードとの間でデータ転送を行
います。ハーフ・ワード操作命令群には、64の命令が含まれます。各ニーモニックはHで始まり、その次
に動作を修飾する4つのアルファベットが続きます。始めにコピー元は左右のどちらか、次にコピー先は左
右のどちらか、次にコピー先のもう片方の半ワードをどうするか、そして、最後にコピー元とコピー先を設
定します。
H halfword from |R right  of source to
                |L left
                |R right  of destination
                |L left
                |  no modification of other half
                |Z zero other half
                |O set other half to ones
                |E sign extend source to other half
                |  from memory to AC
                |I Immediate
                |M from AC to memory
                |S to self. If AC#0, then move to AC also.
C18は、内容の18ビット目を示します。C0は、内容の0ビット目を示します。
E18は、有効アドレスの18ビット目を示します。E0は、有効アドレスの0ビット目を示します。
777777*X は、Xが0ならば0、1ならば777777(全ビット1)を示します。そのような表現によって、符
号拡張がなされます。
HRR             CR(AC) <- CR(E)
HRRI            CR(AC) <- E
HRRM            CR(E)  <- CR(AC)
HRRS            CR(E)  <- CR(E); if AC#0 then CR(AC) <- CR(E)
HRRZ            C(AC) <- 0,,CR(E)
HRRZI           C(AC) <- 0,,E
HRRZM           C(E)  <- 0,,CR(AC)
HRRZS           C(E)  <- 0,,CR(E); if AC#0 then C(AC) <- 0,,CR(E)
HRRO            C(AC) <- 777777,,CR(E)
HRROI           C(AC) <- 777777,,E
HRROM           C(E)  <- 777777,,CR(AC)
HRROS           C(E)  <- 777777,,CR(E); if AC#0 then C(AC) <- 777777,,CR(E)
HRRE            C(AC) <- 777777*C18(E),,CR(E);
HRREI           C(AC) <- 777777*E18,,E
HRREM           C(E)  <- 777777*C18(AC),,CR(AC)
HRRES           C(E)  <- 777777*C18(E),,CR(E);
                        if AC#0 then C(AC) <- 777777*C18(E),,CR(E)
HRL             CL(AC) <- CR(E)
HRLI            CL(AC) <- E
HRLM            CL(E)  <- CR(AC)
HRLS            CL(E)  <- CR(E); if AC#0 then CL(AC) <- CR(E)
HRLZ            C(AC) <- CR(E),,0
HRLZI           C(AC) <- E,,0
HRLZM           C(E)  <- CR(AC),,0
HRLZS           C(E)  <- CR(E),,0; if AC#0 then C(AC) <- CR(E),,0
HRLO            C(AC) <- CR(E),,777777
HRLOI           C(AC) <- E,,777777
HRLOM           C(E)  <- CR(E),,777777
HRLOS           C(E)  <- CR(E),,777777; if AC#0 then C(AC) <- CR(E),,777777
HRLE            C(AC) <- CR(E),,777777*C18(E)
HRLEI           C(AC) <- E,,777777*E18
HRLEM           C(E)  <- CR(AC),,777777*C18(AC)
HRLES           C(E)  <- CR(E),,777777*C18(E);
                        if AC#0 then C(AC) <- CR(E),,777777*C18(E)
HLR             CR(AC) <- CL(E)
HLRI            CR(AC) <- 0
HLRM            CR(E)  <- CL(AC)
HLRS            CR(E)  <- CL(E); if AC#0 then CR(AC) <- CL(E)
HLRZ            C(AC) <- 0,,CL(E)
HLRZI           C(AC) <- 0
HLRZM           C(E)  <- 0,,CL(AC)
HLRZS           C(E)  <- 0,,CL(E); if AC#0 then C(AC) <- 0,,CL(E)
HLRO            C(AC) <- 777777,,CL(E)
HLROI           C(AC) <- 777777,,0
HLROM           C(E)  <- 777777,,CL(AC)
HLROS           C(E)  <- 777777,,CL(E); if AC#0 then C(AC) <- 777777,,CL(E)
HLRE            C(AC) <- 777777*C0(E),,CL(E);
HLREI           C(AC) <- 0
HRREM           C(E)  <- 777777*C0(AC),,CL(AC)
HRRES           C(E)  <- 777777*C0(E),,CL(E);
                        if AC#0 then C(AC) <- 777777*C0(E),,CR(E)
HLL             CL(AC) <- CL(E)
HLLI            CL(AC) <- 0
HLLM            CL(E)  <- CL(AC)
HLLS            CL(E)  <- CL(E); if AC#0 then CL(AC) <- CL(E)
HLLZ            C(AC) <- CL(E),,0
HLLZI           C(AC) <- 0
HLLZM           C(E)  <- CL(AC),,0
HLLZS           C(E)  <- CL(E),,0; if AC#0 then C(AC) <- CL(E),,0
HLLO            C(AC) <- CL(E),,777777
HLLOI           C(AC) <- 0,,777777
HLLOM           C(E)  <- CL(E),,777777
HLLOS           C(E)  <- CL(E),,777777; if AC#0 then C(AC) <- CL(E),,777777
HLLE            C(AC) <- CL(E),,777777*C0(E)
HLLEI           C(AC) <- 0
HLLEM           C(E)  <- CL(AC),,777777*C0(AC)
HLLES           C(E)  <- CL(E),,777777*C0(E);
                        if AC#0 then C(AC) <- CL(E),,777777*C0(E)
■  算術分岐:AOBJP, AOBJN, JUMP, SKIP, CAM, CAI, AOS, SOS, SOJ, AOJ
AOBJ (Add One to Both halves of AC and Jump)命令は、アーキュムレータの左半分にあるコントロー
ル・カウンタの管理している間、配列を前方参照していきます。AOBJNや、AOBJPを使うと、ルー
プのコントロールを1つの命令に減らせます。
AOBJN   C(AC)<-C(AC)+<1,,1>; If C(AC)<0 then PC<-E;
AOBJP   C(AC)<-C(AC)+<1,,1>; If C(AC)>=0 then PC<-E;
Example. TABで始まるNワードにそれぞれ3を足す。: 
        MOVSI 1,-N              ;Initialize register 1 to -N,,0
        MOVEI 2,3               ;register 2 gets the constant 3.
        ADDM 2,TAB(1)           ;add 3 to one array element.
        AOBJN 1,.-1             ;increment both the index and the control.
ところで、命令の一貫性のためにAOBJNはAOBJL(Lower)、AOBJPはAOBGE(Greater or 
Equal)と呼ばれなくてはならないのですが、そのようにはなっていません。
JUMP命令は、選択されたアーキュムレータと0を比較してもし、指定された関係がその間に成り立って
いれば、その命令の有効アドレスで示されたところへジャンプします。
JUMP            ジャンプしません。この指示は、命令ではありません。
JUMPL           If C(AC) < 0 then PC<-E;
JUMPLE          If C(AC) <= 0 then PC<-E;
JUMPE           If C(AC) = 0 then PC<-E;
JUMPN           If C(AC) # 0 then PC<-E;
JUMPGE          If C(AC) >= 0 then PC<-E;
JUMPG           If C(AC) > 0 then PC<-E;
JUMPA           PC<-E.  無条件分岐です。
Example: 
        JUMPLE 5,FOO    ;Jump to FOO if AC 5 is negative or zero.
SKIP命令は、有効アドレスで示されたメモリの内容を0と比較して、指示された関係が成り立っている
ならば、次の命令を飛ばします。もし、ACフィールドが0でなかったならば、有効アドレスで示されたメ
モリの内容は、選択されたACにロードされます。
SKIP            If AC#0 then C(AC)<-C(E);
SKIPL           If AC#0 then C(AC)<-C(E);  If C(E) < 0 then skip
SKIPLE          If AC#0 then C(AC)<-C(E);  If C(E) <= 0 then skip;
SKIPE           If AC#0 then C(AC)<-C(E);  If C(E) = 0 then skip;
SKIPN           If AC#0 then C(AC)<-C(E);  If C(E) # 0 then skip;
SKIPGE          If AC#0 then C(AC)<-C(E);  If C(E) >= 0 then skip;
SKIPG           If AC#0 then C(AC)<-C(E);  If C(E) > 0 then skip;
SKIPA           If AC#0 then C(AC)<-C(E);  skip;
Example: 
        SKIPL FOO       ;FOOの内容が負でない限り
         MOVE 1,BAR     ;BARの内容をAC 1にロードする
        SKIPN 2,FOO     ;FOOの内容をAC 2にロードする。
                        ;もし、それらが0でなかったら、次の命令を飛ばす。
AOS (Add One to memory and Skip)命令群は、指定されたメモリの内容をインクリメントして、その結果
を0と比較して、次の命令をスキップするかどうか決定します。ACフィールドが0でない場合、インクリ
メントされた結果がACにロードされます。
AOS             Add One to Storage (don't skip).
                C(E) <- C(E)+1;  If AC#0 then C(AC)<-C(E);
AOSL            Add One and Skip if Less than zero.
                C(E) <- C(E)+1;  If AC#0 then C(AC)<-C(E);
                 If C(E) < 0 then skip;
AOSLE           Add One and Skip if Less than or Equal to zero.
                C(E) <- C(E)+1;  If AC#0 then C(AC)<-C(E);
                 If C(E) <= 0 then skip;
AOSE            Add One and Skip if Equal to zero.
                C(E) <- C(E)+1;  If AC#0 then C(AC)<-C(E);
                 If C(E) = 0 then skip;
AOSN            Add One and Skip if Not zero.
                C(E) <- C(E)+1;  If AC#0 then C(AC)<-C(E);
                 If C(E) # 0 then skip;
AOSGE           Add One and Skip if Greater than or Equal to zero.
                C(E) <- C(E)+1;  If AC#0 then C(AC)<-C(E);
                 If C(E) >= 0 then skip;
AOSG            Add One and Skip if Greater than zero.
                C(E) <- C(E)+1;  If AC#0 then C(AC)<-C(E);
                 If C(E) > 0 then skip;
AOSA            Add One and Skip Always
                C(E) <- C(E)+1;  If AC#0 then C(AC)<-C(E);
                 skip;
Example: 
;これは、並列処理で使われるやり方です。
;ロックが解除されるのを待って、それをロックします。
;もしロックされていないならば、ロックには−1が入っているので、それを0になるまでインクリメントします。
        AOSE FOO        ;Increment FOO's contents, skip if zero.
         JUMPA .-1      ;If they aren't zero, do it again.
SOS (Subtract One from memory and Skip)命令群は、指定されたメモリの内容をデクリメントして、その
結果を0と比較して、次の命令をスキップするかどうか決定します。ACフィールドが0でない場合、イン
クリメントされた結果がACにロードされます。インクリメントとデクリメントの違いを除いて、SOS命
令群はAOS命令群と同じ動作です。
SOS             Subtract One from Storage (don't skip).
                C(E) <- C(E)-1;  If AC#0 then C(AC)<-C(E);
SOSL            Subtract One and Skip if Less than zero.
                Perform SOS instruction:
                        C(E) <- C(E)-1;  If AC#0 then C(AC)<-C(E);
                Then, if C(E) < 0 then skip;
以下のSOSL命令以外のSOS命令群は、SOSL命令と、スキップ条件が違うだけです。
SOSLE           Subtract One and Skip if Less than or Equal to zero.
SOSE            Subtract One and Skip if Equal to zero.
SOSN            Subtract One and Skip if Not zero.
SOSGE           Subtract One and Skip if Greater than or Equal to zero.
SOSG            Subtract One and Skip if Greater than zero.
SOSA            Subtract One and Skip Always
AOJ (Add One to AC and Jump) 命令群は、選択されたアーキュムレータの内容をインクリメントしてから
0と比較して、その結果が指定された条件を満たしていれば、有効アドレスで指定された場所にジャンプし
ます。
AOJ             Add One (don't jump).
                C(AC) <- C(AC)+1;
AOJL            Add One and Jump if Less than zero.
                C(AC) <- C(AC)+1; If C(AC) < 0 then PC <- E;
以下のAOJL命令以外のAOJ命令群は、AOJL命令と、スキップ条件が違うだけです。
AOJLE           Add One and Jump if Less than or Equal to zero.
AOJE            Add One and Jump if Equal to zero.
AOJN            Add One and Jump if Not zero.
AOJGE           Add One and Jump if Greater than or Equal to zero.
AOJG            Add One and Jump if Greater than zero.
AOJA            Add One and Jump Always
SOJ (Subtract One to AC and Jump) 命令群は、選択されたアーキュムレータの内容をデクリメントしてか
ら0と比較して、その結果が指定された条件を満たしていれば、有効アドレスで指定された場所にジャンプ
します。
SOJ             Subtract One (don't jump).
                C(AC) <- C(AC)-1;
SOJL            Subtract One and Jump if Less than zero.
                C(AC) <- C(AC)-1; If C(AC) < 0 then PC <- E;
以下のSOJL命令以外のSOJ命令群は、SOJL命令と、スキップ条件が違うだけです。
SOJLE           Subtract One and Jump if Less than or Equall to zero.
SOJE            Subtract One and Jump if Equal to zero.
SOJN            Subtract One and Jump if Not zero.
SOJGE           Subtract One and Jump if Greater than or Equal to zero.
SOJG            Subtract One and Jump if Greater than zero.
SOJA            Subtract One and Jump Always
CAM (Compare Accumulator to Memory) 命令群は、選択されたアーキュムレータの内容と有効アドレスで
指定されたメモリの内容を、指定された条件で比較して、結果が真ならば、次の命令を飛ばします。CAM
命令群は、固定小数点、浮動小数点のどちらの比較にも適しています。C(AC)とC(E)は、同じフォ
ーマット(固定小数点か浮動小数点)でなければいけません。
CAM             命令ではありません。メモリは参照します。
CAML            If C(AC) < C(E) then skip;
CAMLE           If C(AC) <= C(E) then skip;
CAME            If C(AC) = C(E) then skip;
CAMN            If C(AC) # C(E) then skip;
CAMGE           If C(AC) >= C(E) then skip;
CAMG            If C(AC) > C(E) then skip;
CAMA            skip;
CAI (Compare Accumulator Immediate) 命令群は、選択されたアーキュムレータの内容と有効アドレスの
数値そのものとを比較して、指定された条件で比較して、結果が真ならば、次の命令を飛ばします。もし、
間接参照フラグが立っている場合には、この命令はスキップされます。有効アドレスは、18ビットの数で、
正の数として扱われます。
CAI             命令ではありません。
CAIL            If C(AC) < E then skip;
CAILE           If C(AC) <= E then skip;
CAIE            If C(AC) = E then skip;
CAIN            If C(AC) # E then skip;
CAIGE           If C(AC) >= E then skip;
CAIG            If C(AC) > E then skip;
■  固定小数点・算術命令:ADD, SUB, IMUL, IDIV, MUL, DIV
正の数では、ビット0は0です。ビット1は最も意味があり、ビット35はもっとも意味が薄いです。負
の数は、正の数の2の補数になっています。ADD,SUBやIMUL命令の結果が、−2^35から、2
^35−1の間にない場合は、オーバーフロー・フラグ(PCのビット0)がセットされます。
各算術演算命令には、4つの形態があり、(文字無し),M,B,Iの4つの文字で識別します。
1.通常の形態は、アーキュムレータとメモリとの間で行なわれ、結果はアーキュムレータに入ります。
2.M(Memory)形態では、結果を、メモリに入れます。アーキュムレータの内容は変化しません。
3.B(Both)形態では、結果を、アーキュムレータとメモリの両方に入れます。
4.I(Immediate)形態では、アーキュムレータと有効アドレスの間で行なわれ、結果はアーキュムレータ
に入ります。
ADD     C(AC) <- C(AC) + C(E);
ADDI    C(AC) <- C(AC) + E;
ADDM    C(E)  <- C(AC) + C(E);
ADDB    C(AC) <- C(AC) + C(E);  C(E) <- C(AC);
SUB     C(AC) <- C(AC) - C(E);
SUBI    C(AC) <- C(AC) - E;
SUBM    C(E)  <- C(AC) - C(E);
SUBB    C(AC) <- C(AC) - C(E);  C(E) <- C(AC);
IMUL命令群は、積が1ワードに収まる範囲内での掛け算命令です。
IMUL    C(AC) <- C(AC) * C(E);
IMULI   C(AC) <- C(AC) * E;
IMULM   C(E)  <- C(AC) * C(E);
IMULB   C(AC) <- C(AC) * C(E);  C(E) <- C(AC);
IDIV命令群は、商が1ワードに収まる範囲内での割り算命令です。結果は2つの連続したアーキュムレ
ータに入ります。C(AC)には商が入り、C(AC+1)には余りが入ります。(AC+1は、mod 20(8
進数に注意)演算されるので、もし、AC=17ならば、余りはアーキュムレータ0に入ります。)もし、0
で割ろうとすると、オーバーフロー・フラグがセットされ、割り算は実行されません。すなわち、C(AC)
やメモリのオペランドは変更されません。その時、余りは被除数と同じ数字です。
IDIV    C(AC) <- C(AC) / C(E);  C(AC+1) <- 余り;
IDIVI   C(AC) <- C(AC) / E;  C(AC+1) <- 余り;
IDIVM   C(E)  <- C(AC) / E;
IDIVB   C(AC) <- C(AC) / C(E);  C(AC+1) <- 余り; C(E) <- C(AC);
MUL命令群は、2ワードの積をします。2ワードの整数は70ビットの語長を持ちます。高アドレスの方
にあるワードのビット0は符号ビットです。低アドレスの方のビット0はハードウエアに無視されます。そ
の結果、低アドレスの方のビット0は高アドレスの方のビット0と同じ内容になります。MUL命令は、も
し両方のオペランドが−2^35だった場合、オーバーフローをセットします。
MUL     C(AC AC+1) <- C(AC) * C(E);
MULI    C(AC AC+1) <- C(AC) * E;
MULM    C(E)  <- high word of product of C(AC) * C(E);
MULB    C(AC AC+1) <- C(AC) * C(E);  C(E) <- C(AC);
DIV命令群は、被除数が2ワードの数(例えば、MUL命令の結果など)のための割り算命令です。もし、
C(AC)がメモリのオペランドよりも大きかった場合には、オーバーフローがセットされ、除算は実行さ
れません。
DIV     C(AC) <- C(AC AC+1) / C(E); C(AC+1) <- 余り;
DIVI    C(AC) <- C(AC AC+1) / E;    C(AC+1) <- 余り;
DIVM    C(E)  <- C(AC AC+1) / E;
DIVB    C(AC) <- C(AC AC+1) / C(E); C(AC+1) <- 余り;
■  浮動小数点演算について
不動小数点は36ビットの1ワードで次のように表現されます。
 0 00000000 011111111112222222222333333
 0 12345678 901234567890123456789012345
 ______________________________________
| |       |                            |
|S| EXP   |     Fraction               |
|_|_______|____________________________|
もし、Sが0ならば、符号は正です。もし、Sが1ならば、符号は負で、ワード全体は2の補数になってい
ます。小数(Fraction)は、ビット8と9の間に小数点があるものとして解釈されます。指数は、
2を底とする指数として表現され、200(8進数)を越します。
???不明
普通の浮動小数点数では、ビット9はビット0とは違う値です。ただし、負の数で、ビット10から35ま
でが全て0の場合、ビット0と9はともに1となります。浮動小数点数の0は、ワードの全ビットが0とし
て表現されます。浮動小数点数は、絶対値が 0.5*2^-128 から、(1-2^-27)*2^127 までの数と、0を表
現できます。
ビット0が1で、ビット9から35が0の数は、全ての浮動小数点演算命令で、間違った答えを出す可能性
があります。小数が0で、指数が0でないワードは、浮動小数点加算、減算命令のオペランドとして使われ
ると、極度に正確性を欠く恐れがあります。
            |AD add                       |  result to AC
F floating  |SB subtract  |R rounded      |I Immediate. result to AC
            |MP multiply  |               |M result to memory
            |DV divide    |               |B result to memory and AC
                          |
                          |
                          |  no rounding  |  result to AC
                                          |L Long mode
                                          |M result to memory
                                          |B result to memory and AC
                   |AD add
DF double floating |SB subtract
                   |MP multiply
                   |DV divide
immediateモードでは、メモリのオペランドは、<E,,0>です。Long モードでは、FDVLを除いて、結果
は、ACとAC+1に入ります。FDVLでは、オペランドは、ACとAC+1に入れますが、結果の商も
ACに入り、余りはAC+1に入ります。
他の浮動小数点命令群:
■  シフト命令群
以下は、ACやACとAC+1の2ワード・フォーマットのための、回転・シフト命令群です。
シフト命令群は、全てimmediate命令です。有効アドレスは、メモリ上にあるオペランドを指し示すアドレ
スとしては使われず、どれだけの数だけシフトするのかを示すために使われます。正の数は、左シフトを意
味し、負の数(ビット18が1)は右シフトを意味します。有効アドレスの符号ビットは別として、下から
8ビットのみが使われます。他の9ビットは使われません。
LSH (Logical Shift)命令:C(AC AC+1)を72ビット数としてシフトします。シフトして空いたビットには
0が入ります。
ASH (Arithmetic Shift)命令:ビット0は変化しません。左シフトでは、C(AC)の右端に0が投入され
て行きます。左シフトで、もし意味のあるビットが全てビット1の外に出てしまったならば、AROV(オ
ーバーフロー)がセットされます。右シフトでは、ビット0がビット1にシフトされます。
ASHC (Arithmetic Shift)命令:C(AC)のビット0は変化しません。もしEが0でないならば、C(A
C)のビット0はC(AC+1)のビット0にコピーされます。C(AC AC+1)は、70ビットの数
としてシフトされます。左シフトでは、C(AC+1)の右端に0が投入されていきます。左シフトで、も
し意味のあるビットが全てビット1の外に出てしまったのならば、AROVがセットされます。右シフトで
は、C(AC)のビット0がビット1にシフトされます。
ROT (Rotate)命令:36ビットのC(AC)が回転シフトされます。左回転シフトでは、ビット0よりはみ
出たビットはビット35に入ります。右回転シフトでは、ビット35からビット0に入ります。
ROTC (Rotate Combined)命令:C(AC AC+1)が72ビット数として回転シフトされます。左回転シ
フトでは、C(AC)のビット0よりはみ出たビットはC(AC+1)のビット35に入り、C(AC+1)
のビット0がC(AC)のビット35に入ります。右回転シフトでは、C(AC+1)のビット35からC
(AC)のビット0に入り、C(AC)のビット35がC(AC+1)のビット0に入ります。
JFFO (Jump if Find First One)命令:これは実際にはシフト命令ではないのですが、似たような働きをしま
す。これは、C(AC)のビット0より、右方向に順に0ビットの数を数えて、その結果をC(AC+1)
に入れます。もし、C(AC)が0(全ビット0)だった場合、C(AC+1)は36ではなく、0になり
ます。それから、もしC(AC)が0でなければ、この命令の有効アドレスで示される地点へジャンプしま
す。言いかえれば、もし最初に1であるビットをみつけたならば、ジャンプします。
Example: 
アーキュムレータ1の各ビットは、ある種の処理を必要とすることを私たちに知らせるフラグだと仮定します。私
たちは、どのフラグが立っているか見つけ出して、各フラグについて、必要な処理を実行しなくてはなりません。
しかし、私たちは立っていないフラグをチェックするために沢山の時間を無駄にしたくありません。
LOOP:   JFFO 1,[JRST @TABLE(2)]
        ...                     ;ここに来た時点で、全てのフラグは0になっています。
TABLE:  FOO                     ;フラグ・ビット0で必要な処理のアドレスFOO
        BAR                     ;フラグ・ビット1で必要な処理のアドレスBAR
        ...                     ;Other addresses for the remaining
flags.
FOO:    ...                     ;ここで、必要な処理をする。
        TLZ 1,400000            ;フラグ・ビット0をクリアする。
        JRST LOOP               ;セットされている次のフラグを探す。
■  バイト操作命令群
 PDP−10では“バイト”とは、あるワードの中に隣接するある数のビットのことを言います。バイト・
ポインタとは、1ワード全体を占め、バイトの位置を指定するものです。バイト・ポインタは、3つの部分
から成っています:ワード指定の部分(アドレス)と、ワードの中でバイトが始まる位置を示す部分と、バ
イトの長さを示す部分です。
バイト・ポインタは次のようなフォーマットです。
 000000 000011 1 1 1111 112222222222333333
 012345 678901 2 3 4567 890123456789012345
 _________________________________________
|      |      | | |    |                  |
| POS  | SIZE |U|I| X  |        Y         |
|______|______|_|_|____|__________________|
POS(Position)はバイトの位置を示します:バイトの右端からそれが入っているワードの右端までのビット
数です。
SIZEはバイトのサイズです。
Uフィールドは、バイト操作、命令群では無視されます。
I,X,Yフィールドは、普通の命令群と同じように、バイトの入っているワードの位置を指定する有効ア
ドレスを計算するために使われます。
バイト操作命令群を次に示します。
LDB(Load Byte)命令:有効アドレスで示されたメモリの内容をLDB命令はバイト・ポインタとして解釈
します。それで示されたバイトの内容が右揃えされてC(AC)にロードされます。C(AC)の残りの部
分は0です。
DPB(Deposit Byte)命令:有効アドレスで示されたメモリの内容をDPB命令はバイト・ポインタとして
解釈します。それで示されたバイトにC(AC)の右づめのバイトと同じサイズの数がコピーされます。C
(AC)と、バイトの入っているワードの残りの部分は変化しません。
IBP(Increment Byte Pointer)命令:この命令は、バイト・ポインタを連続した次のポインタの位置に移
動します。ACフィールドは0でなくてはなりません。有効アドレスの内容がバイト・ポインタとして読み
込まれ、そのPOSフィールドからSIZEフィールドの値が減算されます。もし、その減算の結果が0以
上ならば、結果はPOSフィールドに書き戻されます。もし、結果が負の値ならば、Yフィールドをインク
リメントして、POSフィールドを44(8進数)にセットします。この動作によって、バイト・ポインタ
は、元のポインタの示す位置に続く、次の同じサイズのバイトの位置に移動します。
ILDB(Increment and Load Byte)命令:有効アドレスで示されるバイト・ポインタをインクリメントし
て、その次に、インクリメントされたバイト・ポインタを使ってLDB命令を実行します。
IDPB(Increment and Deposit Byte)命令:有効アドレスで示されるバイト・ポインタをインクリメント
して、その次に、インクリメントされたバイト・ポインタを使ってDPB命令を実行します。
テキスト文字列は、典型的に1文字に7ビット・バイト(つまり1ワードにつき5文字)で蓄えられます。
ILDBやIDPBは、文字列を1文字ずつ処理することができます。この場合、バイト・ポインタは
440700,,<Address of String>に初期化されていなくてはいけません。そうすれば、最初のILDB命令によ
って文字列の最初の文字のバイトを指し示すようになります。
■  論理的検査・修正
 Test命令群は、アーキュムレータ中のビットの検査(分岐)、修正を行います。この命令群には64
の命令が含まれます。各命令の名前はTで始まり、その後に3つの修飾文字が続きます。
                 |R right half immediate
Test accumulator |L left half immediate
                 |D direct mask
                 |S swapped mask
                        |N 修正なし(no modification)
                        |Z 選択されたビットを0にセット
                        |O 選択されたビットを1にセット
                        |C 指定されたビットの反転(complement)
                                |  never skip
                                |N 選択された全ビットが0ないならば、スキップ
                                |E 選択された全ビットが0ならば、スキップ
                                |A skip always
Test命令は、2つの36ビット数を使います。まず1つは、C(AC)です。もう1つの数は、マスク
と呼ばれ、最初の修飾文字によって決定されます。文字がRの場合にはマスクは<0,,E>で、Lの場合には
<E,,0>で、Dの場合にはC(E)で、Sの場合にはCS(E)です。
もし、スキップ条件がNの場合、C(AC)とマスクのANDの結果が0でない場合にスキップします。
もし、スキップ条件がEの場合、C(AC)とマスクのANDの結果が0である場合にスキップします。
もし、修正コードがZの場合は、マスク中の1のビットの位置のC(AC)のビットが0になります。
もし、修正コードがOの場合は、マスク中の1のビットの位置のC(AC)のビットが1になります。
もし、修正コードがCの場合は、マスク中の1のビットの位置のC(AC)のビットが反転されます。
スキップ条件に使われるC(AC)は、修正される前のC(AC)だと、覚えておいて下さい。
Test命令群の主な使用目的はアーキュムレータ中の1ビット・フラグの検査・修正です。
Example: 
      TRON 5,FOOFLG   ;Where FOOGLF has the value 200
これによって、アーキュムレータ5の右半分中のビット200(8番目のビット)が変化します。
■  ブール・論理演算命令群
 PDP−10は、16の論理演算命令群を持ち、各命令群は4つの修飾命令を持ちます。各論理演算命令
は、C(AC)やメモリの36ビット全てについて個々に働きます。
C(AC)   0       0       1       1
C(E)    0       1       0       1
SETZ    0       0       0       0       SET to Zero
AND     0       0       0       1       AND
ANDCM   0       0       1       0       AND with Complement of Memory
SETA    0       0       1       1       SET to AC
ANDCA   0       1       0       0       AND with Complement of AC
SETM    0       1       0       1       SET to Memory
XOR     0       1       1       0       eXclusive OR(排他的OR)
IOR     0       1       1       1       Inclusive OR(包括的OR)
ANDCB   1       0       0       0       AND with Complements of Both
EQV     1       0       0       1       EQuiValence(同じならば1)
SETCM   1       0       1       0       SET to Complement of Memory(C(E)の補数)
ORCA    1       0       1       1       OR with Complement of Memory
SETCA   1       1       0       0       SET to Complement of AC(C(AC)の補数)
ORCA    1       1       0       1       OR with Complement of AC
ORCB    1       1       1       0       OR with Complements of Both
SETO    1       1       1       1       SET to One
16の各命令群は、それぞれ4つの、結果を入れる場所を指定するための修飾文字を持ちます。修飾文字な
しは、結果をアーキュムレータに入れることを意味します。文字Iは、Immediateを示します。メモリから
のデータは<0,,E>となり、結果はアーキュムレータに入ります。文字Mの場合、結果はメモリに入ります。
文字Bの場合、結果はメモリとアーキュムレータの両方に入ります。
■  PC(プログラム・カウンタ)のフォーマット
サブルーチン・コール命令は、ジャンプするためにPCを変化させます。しかし、サブルーチンがその仕事
を終了した時にもとの位置に戻るために、古いPCの値を保存しておきます。PDP−10には、いくつか
のサブルーチン・コール命令があります。しかし、それらは全て、PCを同じフォーマットで保存します。
 0 0 0 0 0 0 0 0 0 0 1 1 1 11111 112222222222333333
 0 1 2 3 4 5 6 7 8 9 0 1 2 34567 890123456789012345
 __________________________________________________
|A|C|C|F|F|U|I|P|A|T|T|F|D|     |                  |
|R|R|R|O|P|S|O|U|F|R|R|X|C|00000|       PC         |
|O|Y|Y|V|D|E|T|B|I|A|A|U|K|     |                  |
|V|0|1| | |R| |L| |P|P| | |     |                  |
| | | | | | | | | |2|1| | |     |                  |
|_|_|_|_|_|_|_|_|_|_|_|_|_|_____|__________________|
右半分が本来のPCの部分、つまり、次に実行される命令(サブルーチン・コール命令の次の命令)のアド
レスが入っています。他の個々のビットは、ステータス・フラグです。これらは、サブルーチンからリター
ンする時にそれらを復旧させるのに使います。
AROV(ARithmetic OVerflow)フラグが、以下の状況でセットされます:
ある命令が、CRY0とCRY1の両方ともセットせずに、片方だけセットした場合。
ASHかASHCによってC(AC)の意味のあるビットがビット1より外に出てしまった場合。
AMULx命令が、−2^35を自分自身に掛けた場合。
ADMUL命令が、−2^70を自分自身に掛けた場合。
IMULx命令が、−2^35より下、又は2^35−1より上の結果を出した場合。
AFIXやFIXRが35より大きい指数のオペランドを読み込んだとき。
FOV(Floating OVerflow)やDCK(Divide ChecK)がセットされた場合。
CRY0(Carry 0)は、足し算によって、ビット0が繰り上がった(キャリーアウトした)ことを意味します。
ビット0がキャリーアウトして、ビット1がビット0にキャリーアウトしないのは、AROVをセットさせ
ます。
CRY0がセットされ、CRY1がセットされない正確な場合は:
ADDxが、その和が−2^35を越えない2つの負の数を足した時。
SUBxが、負の数から正の数を引いて、その結果が−2^35を越えない時。
AOSxやAOJx命令が、2^35−1をインクリメントした場合。
AMOVNxやMOVMxが、−2^35を符号転換した場合。
ADMOVNxが、−2^70を符号転換した場合。
それに加えて、以下のオーバーフローでない状態も、CRY0とCRY1を両方セットします:
ADDxの足す数が両方とも負の数か、それらの符号が違っていて、正の数が負の数の絶対値以上の時。
SUBxで、両方のオペランドの符号が一緒で、アーキュムレータのオペランドがメモリのオペランド以上、
又はアーキュムレータが負の数でメモリのオペランドが正の数の場合。
AOJxやAOSxが−1をインクリメントした場合。
ASOJxやSOSが−2^35以下の数をデクリメントした場合。
AMOVNxが0の符号転換をしようとした場合。
FOV(Floating OVerflow)は、以下の場合にセットされます:
浮動小数点演算命令で、FLTR、DMOVNx、DFN以外の命令で、結果の指数が127を超えた場合。
FXU(Floating eXponent Underflow)がセットされた場合。
DCK(Divide ChecK)が、FDVxやFDVRxやDFDVによってセットされた場合。
FPD(First Part Done)がプロセッサが優先割り込みの返答をして、2ワードの命令の(ILDBなど)最
初のワードの処理が完了している時にセットされた場合。このフラグはプログラマにとって、たいてい重大
ではありません。
USERが、プロセッサーがユーザー・モードであって、セットされている場合。ユーザー・モードでは、
さまざまな命令やアドレッシング制限が有効になります。
IOT(User IN-Out mode,IOT Userとも呼ばれる)は、いくつかのユーザーモード命令の(アドレ
ッシングを除く)制限が取り除かれます。このモードでは、ユーザー・プログラムはハードウエアI/O命
令群を実行するかもしれません。
[PUBL(Public mode)は、プロセッサーがユーザー・パブリック・モード、又は実行管理者モードで動い
ていることを示します。このビットは、標準的なKL−10システムにしか存在しません。ANY ITS
システムには存在しません。]
FXU(Floating eXponent Underflow)は、DMOVNx、FLTR、DFN以外の浮動小数点命令で結果の
指数が−128より下で、かつAROVとFOVがセットされている場合にセットされます。
DCK(Divide ChecK)は、以下の状況のどれかがAROVをセットしたことを示します:
1. DIVxで、被除数の高アドレスの方のワードの数が、除数の数以上の場合。
2. IDIVxで、除数が0の場合。
3. FDVx、FDVRx、DERVで、除数が0、又は被除数の絶対値が除数の絶対値の2倍以上の場合。
どちらの場合も、FOVもまた、セットされます。
PCのビット13から17までは、サブルーチンから戻るための間接アドレッシングを容易にするために、
常に0になっています。
PCのビット18から35までは、PCを保存した命令の1つ次の命令のアドレスを保存しています。この
ようにして、PCは直ちにサブルーチン・コールの次の命令を指し示します。
■ 推奨されるジャンプ命令群:PUSHJ,POPJ,JRST,JFCL,XCT
PUSHJ   C(AC)<-C(AC)+<1,,1>;  C(CR(AC))<-<flags,,PC>; PC<-E;
PUSHJ (PUSH return address and Jump) 命令は、スタックのトップにプッシュされるのがPCとフラグ
のワードであることを除けば、PUSH命令と似ています。プッシュされるPCは、PUSHJの次の命令
へのPCです。それから、そのPCにはその命令の有効アドレスがセットされます。もし、C(AC)がイ
ンクリメントされた時に正の数になったら、プッシュダウン・オーバーフローが発生します。
POPJ    PC<-CR(CR(AC)); C(AC)<-C(AC)-<1,,1>
POPJ (POP return address and Jump)命令は、PUSHJ命令のちょうど逆の動作をします。スタックの
トップにあるワードの右半分がPCにロードされます。PCのフラグは変化しません。それから、スタック・
ポインタがPOPの場合と同じようにデクリメントされます。POPJの有効アドレスは無視されます。も
し、C(AC)が減算の結果負の値になったら、プッシュダウン・オーバーフローが発生します。
プログラミング・ヒント:
もし、PUSHJ ACによって呼び出されたサブルーチンがPUSHJ命令に続く次の命令をスキップしたい場
合、サブルーチンの最後に次のようにします:
        AOS (AC)                ;PCをインクリメント(ACは0でない方が良い)
        POPJ AC,
もし、PUSHJで保存されたフラグを復旧させなくてはいけない場合は、サブルーチンの最後にPOPJの代わ
りに次のようにします:
        POP AC,(AC)             ;スタックポインタを調整する(POPJの代わりに1つ読み出す)
        JRST 2,@1(AC)           ;古いスタックのトップから、フラグとPCを読み込む
                                ;1(AC)で、古いスタックのトップ(現在のトップの1つ上)を示す
しかし、この方法では、ワードがスタックから開放される時に、その内容がまだ必要な場合、タイミング・
エラーを発生します。これによって、割り込み処理を伴うプログラムでバグを引き起こします。JRST
(Jump and ReSTore)命令は、無条件ジャンプ命令です。JRSTでは、ACフィールドはアーキュムレー
タのアドレスを示すのではなく、いろいろな事を意味するのに使われます。
JRST            PC<-E;
JRST 2,         PC<-E; フラグが復旧されます(テキスト参照);
JRST 10,        PC<-E; 現在の優先割り込みを無視;
JRST 12,        PC<-E; フラグを復旧し、現在の優先割り込みを無視;
もし、ACフィールドが0ならば、ジャンプのみが行なわれます。JRSTは、人々に好まれる無条件ジャ
ンプ命令です。
JRST 2,(JRSTのACフィールドを2にしたもの)は、ジャンプとフラグの復旧を意味します。
(アセンブラはJRST 2,の代わりとしてJRSTFも認識します。)もし、JRSTFで間接参照が使
われたのなら、フラグは、アドレス計算によって最後に読み込まれたワードから読み込まれます。もし、間
接参照を使わないでインデックスを使ったならば、フラグは、指定されたインデックス・レジスタの左半分
から復旧されます。もし、間接参照とインデックスの両方とも使われていないならば、フラグは、JRST
Fそれ自身の左半分から復旧されます!ユーザー・モードのプログラムでは、JRSTFはUSERフラグ
をクリアしたりIOT Userフラグをセットできません。(IOT Userをクリアはできます。)
以下の事は、ユーザーモードでは違反であるとして、UUOsとして捕らえられます:
JRST 4,(HALTの代わり)がEからPCをセットしてプロセッサを停止させた場合。
JRST 10,は現在の優先割り込みを無視するのに使われます。たいてい、JRST 12,は、JR
ST 10,がフラグの復旧に失敗した場合に使われます。
JRST 12,(JEN(Jump and Enable priority iNterrupts)の代わり)は、JRST 10,とJRS
T 2,の機能を合わせたものです。JFCL(Jump on Flag and CLear)は、ACフィールドが命令を修飾
するのに使われる別の例です。ACフィールドは、PCのビット0から3までの4つのフラグを選択するの
に使われます。PCのビット0から3は、JFCLのビット9から12に対応します。JFCLは、ACフ
ィールドで指定されたいづれかのフラグが1であるならば、ジャンプします。ACフィールドによって選択
されている全てのフラグは0にセットされます。
JFCL 0,は、PCのビットを選択しないために命令ではありません。
JFCL 17,は、全てのフラグをクリアします。そして、AROV,CRY0,CRY1,FOVのい
づれかがセットされている場合にジャンプします。
JFCL 1,(JFOV)は、FOVがセットされている場合にジャンプして、FOVをクリアします。
JFCL 10,(JOV)は、AROVがセットされている場合にジャンプして、AROVをクリアしま
す。
XCT(the eXeCuTe)命令は、その有効アドレスで示されるワードを読み込んで、そのワードを命令として
実行します。もし、PCを保存する命令をXCTで実行した場合、保存されるPCは、XCT命令の次の命
令を指すものになります。もし、実行される命令がスキップ命令ならば、そのスキップはXCT命令に相対
的なものです。XCT命令のACフィールドは0でなくてはいけません。[管理者モードでは、XCT命令の
0でないACフィールドは意味のあるものです。]
■  もはや用いられなくて、推奨できないジャンプ命令群:JSR,JSP,JSA,JRA
 JSRとJSP命令は、スタックのないマシンには典型的な、スタックを使用しないサブルーチン・コー
ル命令です。JSPは古いPCをアーキュムレータに保存し、JSRはそれをサブルーチンの最初のワード
に保存します。JSPは時々、例えばスタックにいくつかのワードをプッシュ・ポップするのに役に立ちま
す。JSRはUUOハンドラのためだけに役に立ちます。PUSHJやPUPJは、普通のサブルーチン・
コールに使われます。
JSRとJSPは、特有のサブルーチン・コール命令で、PDP−6のフォートランのために作られたリタ
ーン命令に似合います。ほとんどのプログラムでは、それらは全く使われません。
JSR     C(E)<-<flags,,PC>; PC<-E+1;
JSR(Jump to SubRoutine)命令は、PCを有効アドレスで示されたワードに保存し、PCの保存された次
のワードにジャンプします。これは、PCの値をいづれのアーキュムレータの内容も変更しないで保存する
ことのできるPDP−10で唯一の命令です。しかし、この命令は再入不可能です。なので、ほとんどの場
合、PUSHJが好まれます。JSRによってコールされた命令の、通常のリターン命令はJRST(又は
JRST 2)で、PCのワードを通しての間接的なものです。(JRST参照)
JSP     C(AC)<-<flags,,PC>; PC<-E;
JSP(Jump and Save PC)命令は、PCとフラグを選択されたアーキュムレータに保存し、ジャンプしま
す。
JSA     C(E)<-C(AC); C(AC)<-<E,,PC>; PC<-E+1;
JSA(Jump and Save AC)命令は、有効アドレスで示されたワードにC(AC)を保存します。それから、
C(AC)の左半分が有効アドレスにセットされ、右半分はリターンPCにセットされます。それから、P
Cは有効アドレスの1つ上の位置にセットされます。JRA命令は、このコールを巻き戻しします。このコ
ールによる利益は、ルーチンが、複数のエントリー・ポイントを持つことができるという点です。(これはJ
SR命令では実現するのが難しいです。)そして、コール命令の後に続く引数を見つけたり、後からそれをス
キップするのが容易になります。(これは、PUSHJでも実現できますが、非常に不便です。)このコール
命令の不利な点は、再入が不可能だという点と、フラグを保存しないという点です。
JRA     C(AC)<-C(CL(AC)); PC<-E;
JRA(Jump and Restore AC)命令は、JSA命令からのリターン命令です。もし、サブルーチンがJSA 
AC,を使ってコールされている場合には、リターン命令は次のようになります。
        JRA AC,(AC).