蒼天在眼 (そうてんまなこにあり)ーベランダで星を見る

昔、昔、天文少年でした。そして、今は、ベランダから、星を見ています。
いろいろの忘備録

PiDP-11 を使う その12 ターミナルテレタイプの入出力

2024-01-27 10:51:46 | コンピュータ

PDPー11は入出力命令を持ちません。周辺機器は、全て、メモリーの特定番地にマップされているので、メモリに、書き込んだり、読み取ったりすることによって、入出力を行います。メモリも、周辺機器もUNIBUSという同一バスに接続されています。メモリに比べて、反応速度が遅い周辺機器とデータをやり取りする場合の速度差をどのように調整するかというと、割り込みを使う場合と、制御レジスタを介する場合があります。

オペレーティングシステムを介して入出力をする場合は割り込みを使っています。PDPー11は、初めて、UNIXを開発した時に使われた機械なので、割り込みは、もちろん可能ですが、今回はBare Metalで使うので、割り込みではなく、 制御レジスタを使って、入出力を行います。

入出力装置は、160000番地から177776番地に予約されています。この範囲のどこかに、入出力の制御レジスタとデータをやり取りするバッファが接続されています。

例えば、ターミナルとして使っているテレタイプと通信するためには、プリンター部には、

   制御レジスタ:177564番地  出力バーファ:177566番地

を使います。Ballconの先輩たちは、イナナゴロシなどという、やや物騒に聞こえる語呂合わせで記憶していたようです。竹内郁雄さんは、LISPのハッカーでBalconも尊敬している方ですが、「イナナゴロシ」について、エッセーを書いてます。

 

ハッカーの遺言状──竹内郁雄の徒然苔第14回:プログラムで一句詠む | サイボウズ式

元祖ハッカー、竹内郁雄先生による書き下ろし連載(毎月下旬に掲載)の第14回。今回のお題は「プログラムで一句詠む」。

サイボウズ式

 

流石に、Balconは、RT−11というOSを使っていたので、イナナゴロシとかは聞いたことはありませんが、先輩のプログラマにこの呪文を唱えると、色々な反応をする方がいるらしいです。

DEC LSI-11/23 CPU

オールドハッカー風にいうと、TTYの制御レジスタの番地は「イナナゴロシ」、バッファの番地は「イナナゴロロ」とでも言うのでしょうか。テレタイプ印字の場合は、制御レジスタの7ビット目が1になると、転送可能になります。言い換えれば、テレタイプのプリンタ部に文字を打ち出す場合は、イナナゴロシの番地をアクセスして、ビット7が立ったら、イナナゴロロ番地に打ち出したいデータを書き込みます。

“A”をテレタイプに印字するプログラムは次のようになります。

 

機械語             説明

032737       BIT     ←   177564番地の7ビット目をテストする

000200      #200←イミーディエィート命令 データ 200八進で、7ビット目が1でそれ以外は全て0

177564       @#177564←TTYの制御レジスタの番地指定

001774       BEQ  <-  0ならば、先頭に戻る。

113737       MOVB ← 1バイトの転送命令

000101      #101   ← 8進でAのアスキーコード

177566       @#177566 ← TTYのデータバッファの番地指定

 

命令コードと分岐命令については、前々回、前回の記事を見てください。

 7語、3ステップで書けます。

 

キーボードからR0レジスタに入力する場合はこんな感じになります。

 

032737 BIT ← ビットテスト

000200 #200   ← 7ビット目が1

177560   @#177560  ← キーボードの制御レジスタの番地 イナナゴロレ

001774 ←BEQ 0ならば、先頭に戻る。

113700 ← 1バイト転送命令 

     ソースは 番地、 

     デスティネーションは レジスタの指定(0n)   nはレジスタの番号 R0なので、00

177602   @#177562  ← キーボードのデータバッファの番地 イナナゴロニ

次回は、テレタイプに5匹のカタツムリを出力するプログラムを書きます。

(5匹のカタツムリの巻に続く)


PiDP-11を使う その11 アドレッシングモードと分岐命令の巻

2024-01-01 22:57:52 | コンピュータ

あけまして、おめでとうございます。 天変地異の大地震や、飛行機などの事故があり、素直に喜べない年明けになってしまいましたが、今回は、PDP−11のアドレッシング・モードと分岐命令について記します。

PDP-11が、良いコンピュータだったと言われる一つの理由は、番地指定様式が、よく考えた設計になっていたということがあると思われます。PDP-11の番地指定方法は8種類あり、八つの内部レジスタと組合せで、64パターンの指定方法がありますが、いきなり、64パターンを理解するのは大変です。木村泉先生はとりあえず、3つの番地指定方式を覚えてくださいと書いています。

主に、オペランドのところに、出てきますが、初めての機械語で出てきた37以外に、27、0nの方式を使えるようにしましょう。

27ですが、イミーディエイト(immediate)命令ともいい、機械語の直後にデータがあるよという意味になります。 

1000  062737

1002  0010

1004  1010

1000 番地に ADD 命令に続いて、 2737を書き込み、 1002番地に 0010、1004番地に 1010と置いて、1000番地の命令を実行すると、 1010番地の値と0010(十進の 8)を加えて、結果を 1010番地に書き込みます。

0nですが、 nは0から7までの八つのレジスタが指定できます。例えば、値をコピーする命令(MOV命令)である 01に続いて、012701という機械語は、次にある16ビットのデータをレジスタの1(r0)に書き込みます。この命令は、レジスタの初期化によく使われます。

次に、分岐命令(Branch命令)について述べます。通常、プログラムカウンタは、2づつ増加して、次に実行すべき命令の番地を指します。コレだけたと、同じ命令を100回繰り返す場合、同じ命令を100個並べることになります。途中で、実行の流れを変える命令があると、このようなループは、短く描けるようになります。このような目的で次に実行すべき番地を変更するのに、使われる命令が、分岐命令です。PDPー11の分岐命令は、今までの命令と異なったフォーマットを持っています。オペレータが8ビット、オフセット8ビットの構造を持っています。オフセット部分で、プログラムカウンターの値をどのように変化させるかを指定しています。

例えば、 

1010    000410

という命令があったとすると、

0004は、BR命令と言って無条件で、分岐(飛ぶ)命令です。飛び先は 1032番地になります。番地の計算は、次の通りです。1010番地の機械語命令を取り込んだ直後は、プログラムカウンタ(PC)は1012番地を指しています。これにオフセット10に2をかけた20を加えて、新しい番地1032がPC に入り、1032番地の命令が実行されます。注意すべきは、分岐命令の起点は、命令の番地ではなく、次に実行するはずの番地であることです。オフセットを2倍する理由は、PDP-11の命令は偶数番地にしかないので、そのまま使うと奇数のオフセットは無駄になってしまいます。オフセットを2倍すれば、奇数のオフセットも命令のある番地を指すことになるので、無駄が出ないということでしょう。8ビットのオフセットで、±256番地の前後の飛び先を指定することができます。8進数で8ビットは3桁で表すと正の整数は、0から200まで、負の整数は300から377まで、3桁目の400から777までは、オペレータの種類によって、3桁目が変わってしまします。アッセンブラでプログラムする場合は、アッセンブラが、計算してくれるので、問題ないのですが、機械語を手で書く(ハンドアッセンブル)場合は、計算が厄介です。

そこで木村先生は、8ビットのオフセットのうち最上位の2ビットを諦めて、6ビットのXX(8進2桁でオフセットを表し、前方へ飛ぶときは2進11の8進法では、3をオペレータに加えて、2の補数でXXを表現する工夫をしています。こうすると、飛べる範囲は、64の2倍の128番地に狭くなってしまいますが、紙と鉛筆で機械語を組み立てる時に、計算が、うんと楽になります。

分岐(BRANCH)命令には、必ず分岐するBR命令と、フラグの状態で分岐する命令があります。参照するフラグはZ(演算の結果が0の時立つ)、N(結果が負の時に立つ)、V(オーバフローの時に立つ)、C(くり上がりがある時にたつ)どの条件で分岐(飛ぶ)かは、表の通りです。

C(キャリーは)V(オーバーフロー)どちらも、桁あふれを表しますが、Cの方は、符号を考えない場合に16ビットの収まらない結果出た場合で、Vは、符号がついている16ビットの演算で、桁あふれが出た場合にセットされます。符号付きの整数で、16ビットで表せる最大の値は、77777(7が五つ、十進で、32,767これに1を加えると、10000(0が五つで、2の補数で解釈すると十進変換で、-32768になります。 このような場合、Vフラグがセット(立ちます)されます。Cは単に16ビットに演算結果が収まらなくなった時にセットされます。

ちなみに、オーバーフローがなぜVなのかというと、Oにすると、0と紛らわしいので、避けたんじゃないかと思われます。

ちなみに、符号ありの分岐命令は、大小の比較を、2の補数(負の数あり)で比較するのに対して、符号なしの分岐命令は、単に2進数の大小で比較するとの違いで、主に、前者は、数学的な比較、後者は、番地の大小比較に使われます。

最後まで、読まれた方はお疲れ様でした。次は、(ターミナルテレタイプの入出力の巻につづく)

 

 


PVバーナー

PVアクセスランキング にほんブログ村