PDP-7の間接アドレッシングとAUTO-INDEXING

 PDP-7は18bit幅のアキュムレータマシン。最初のunix v0がこの計算機の上で動かされた。
https://github.com/DoctorWkt/pdp7-unix

これはPDP-1の命令セットで参考になる。
Inside Spacewar! (Supplement) DEC PDP-1 Instruction List

bitsaversにあるPDP-7のリファレンスマニュアル
PDP-7 reference manual

 リファレンスマニュアルの3章12に間接アドレッシングの説明がある。間接アドレッシング(indirect addressing)とはオペランドで指定したアドレスの内容を参照するアドレスとみなしてアクセスする。オペコードでは5bit目(MSBから0,1,2..と数える)が立っていれば間接アドレッシングで、アセンブラのニーモニックではiを付ける。
aaa番地の内容がbbb、bbb番地の内容がcccとする。lac命令はオペランドで指定したアドレスの内容をアキュムレータ(AC)にロードする命令。
lac aaa → ACにはbbbが入る。
lac i aaa → ACにはcccが入る。

間接アドレッシングであるlac i aaaは以下のような動作になる。MAR(Memory Address Register)、MDR(Memory Data Register)はメモリアクセスに使う作業用の内部レジスタ。
1. aaaをMARにセット
2.MDRにMARで参照したアドレスのデータをロード
3.MARにMDRの内容を転送
4.MDRにMARで参照したアドレスのデータをロード
5.ACにMDRの内容を転送

通常のアドレッシングモードは3,4のステップがない。

さてAUTO-INDEXING(またはauto increment memory cell)だが特定の番地に対して間接アドレッシングを行うと、そのメモリの内容が+1されるというもの。対象となる番地は10-17(8進数)の8箇所で、8Kワードごとに存在する。PDP-7のメモリ4Kワード搭載モデルでも存在する。
2進数では000_000_001_000~000_000_001_111のアドレスになる。ここに特別なメモリ素子が存在するわけではなく、間接アドレッシングで使うアドレスで動作を切り替えている。

 リファレンスマニュアルの例から。各番地には以下のデータが用意されているものとする。10番地はauto-indexingの対象。
address : data
10 : 100
40 : 50
100 : 40
101 : 41

lac i 10 実行後は10番地の内容が101になり、ACには41がセットされる。この動作は以下のとおり(想像)。
1. 10をMARにセット
2.MDRにMARで参照したアドレス10のデータ100をロード
3.MARがAUTO-INDEXINGの範囲内なのでMDRの内容を+1する(101)
4.MARがAUTO-INDEXINGの範囲内なのでMDRの内容101をMARが示す番地10にストア
5.MARにMDRの内容101を転送
6.MDRにMARで参照したアドレス101のデータ41をロード
7.ACにMDRの内容41を転送

これはpost-incrementの動作で、AUTO-INDEXINGの8箇所の領域をインデックスレジスタ的に使える。インクリメント動作も通常の間接アドレッシングが2ステップ増えただけで済む。(2と3のステップは1つにまとめられるかもしれませんね その場合は+1ステップ)


おしまい。

"PDP-7の間接アドレッシングとAUTO-INDEXING" へのコメントを書く

お名前
ホームページアドレス
コメント