2018年3月24日土曜日

PDP8のプログラム技法

今から50年程前にDEC(Digital Equipment Corporation)が発売していたPDP8というミニコンがあった. 思うにこれはMITのTX-0を源とする似たようなアーキテクチャの計算機である.

簡単に概要を示すと, 1語は12ビット, 記憶装置は12ビットの4096語. 1ページが128語の32ページで構成される.

演算装置の中心は12ビットのアキュムレータで, 2の補数(4096の補数)で演算される. アキュムレータの左に1ビットのリンクがあり, 加算の結果繰上がりがあると, リンクのビットは反転される. アキュムレータのシフトは回転シフトであり, リンクを経由する. アキュムレータのクリアはリンクに影響しない.


図の2段目は記憶装置参照命令で12ビット. 下の図のような構成である.

左端の3ビットが命令コード. 右端の7ビットがページ内アドレスである. ビット4が0の時は第0ページの番地を示し, 1の時はその命令のあるページ内でのアドレスを示す.

ビット3が1の時は, その語の内容を番地とする.

記憶場所の八進法で0010から0017までの場所を間接番地で参照すると, この番地の内容を1増やしてから使われるから要注意である.
 
記憶場所参照命令は, 命令コードの0から5が次のようである.
0 AND
1 TAD  
2 ISZ
3 DCA
4 JMS
5 JMP

ANDは番地の指す記憶場所の内容とアキュムレータのビット毎のANDをとり, 結果をキュムレータに置く.
 
TADは番地の指す記憶場所の内容をアキュムレータに加える. 繰上がりはリンクを反転する.

ISZは番地の指す記憶場所の内容を1増やし, その結果が0になれば, 次の命令をスキップする.

DCAはアキュムレータの内容を番地の指す記憶場所に入れ, アキュムレータをクリアする.

JMSはこの命令の次ぎの番地を番地の指す記憶場所に入れ, その次の命令に進む. つまりサブルーチンジャンプする.

JMPは番地の指す記憶場所の命令に進む.

命令コード6は入出力命令で, テレタイプのキーボードから読んだり, プリンタに印字したり, 紙テープリーダから読み込んだりする. この話しは省略する.

命令コード7はマイクロプログラム命令で, 図に示すようにビット3の0, 1に従って, グループ1とグループ2とがある.

グループ1はビットの4,5,6,7が1だと, アキュムレータをクリア(CLA), リンクをクリア(CLL), アキュムレータの各ビットを反転(CMA), リンクを反転(CML)する.

ビット8, 9はアキュムレータとリンクを繋げた左(RAL)または右(RAR)回転で, ビット10の0/1に従って1ビットか2ビット(RTL, RTR)になる. ビット11が1だと, アキュムレータを1増やす(IAC).

マイクロプログラムでは実行順が重要である. 最初がクリア, 次が反転, 次がIAC, 最後が回転となる.

グループ2は, ビット4が1の時アキュムレータのクリア(CLA), ビット5,8が1,0の時アキュムレータの負(ビット0が1)でスキップ(SMA), 1,1の時アキュムレータの正でスキップ(SPA). ビット6,8が1,0の時アキュムレータの=0でスキップ(SZA), 1,1の時アキュムレーの≠0でスキップ(SNA). ビット7,8が1,0の時リンクの≠0でスキップ(SNL), 1,1の時リンの=0でスキップ(SNL)である.

ビット9が1の時, コンソールの12ビットのスイッチをアキュムレータとビットごとORする. ビット10が1の時計算機を停止する(HLT).

実行順はまずスキップ, クリア, スイッチ読込みと停止である.

プログラムでは, CMA IACのように書くだけである. こう書くとアキュムレータがビット反転され, 1足されるので, アキュムレータの値を負にする. PDP8には減算命令はなく, A-BはBをアキュムレータに置き, CMAで1の歩数を取ってからIACで1を足す.

ところでPDP8ではプログラムは原則八進法で書く. 格納開始番地は星印(*)を使い
*200
のように書く. 記号アドレスの定義は
start,
のようにコンマ(,)を使う. 命令のアドレス部には記号アドレスや, この命令の番地を示すピリオド(.)や, プラス, マイナス(+, -)に数を続ける.

斜線(/)はコメントの開始を示す. プログラムの最後には($)を書く.

例えばアキュムレータにある正を数を十進法の10で割り, 商をq, 剰余をrに置くサブルーチンdiv10を八進の100番地からに入れるには

*100
div10,0  /サブルーチンの入口. 帰り番地が入る
dca r    /披除数をrに入れる
dca q    /商の場所qをクリアする
tad r    /部分剰余をアキュムレータに置く
tad m10  /10を引く
spa      /剰余が正ならスキップ      
jmp .+3  /負になったので後始末へ
isz q    /剰余を1増やす
jmp .-4  /4命令前へ戻る
tad p10  /引き過ぎた剰余を戻す
dca r    /剰余をrに入れる
jmp i div10 /主プログラムへ戻る
m10,-12  /定数 -10
p10,12   /定数 10
r,0      /剰余の場所
q,0      /商の場所
のように書く.

PDP8はこの程度の計算機だから, シミュレータやアセンブラを書くのも簡単だ. 今回PDP8を説明したのは, 私がいろいろなプログラミング言語で書いている例題, 与えられた年のカレンダーを出力するcalをPDP8でも書くためである.

それはまた次回に.