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

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

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進数の大小で比較するとの違いで、主に、前者は、数学的な比較、後者は、番地の大小比較に使われます。

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

 

 


PiDP-11を使う その10 機械語命令の観光地図の巻

2023-12-31 21:14:30 | コンピュータ

今年(2023年)最後の更新になります。では、はじめます。

観光地に行くと、ホテルや、観光案内所で、観光地図を配っています。詳しいGoogleの地図よりもかえって、分かりやすかったりします。木村 泉先生のOHPからの引用ですが、PDPー11の機械語命令形このようになっていたんだと認識を新たにしました。Balconが、勝手に信号機の絵と色をつけています。信号機は通常、“青、黄、赤“の順で並んでいます。この表にある数字を、この順に並べると、機械語の命令になります。

例えばADD命令は青が0黄色が6のところにあるので、06が機械語命令の、オペレータ(オペコード)です。同様にSUBは、青が、1、黄色が6なので、16がオペコードになります。赤はどうなるかというと、オペランドを二つ取る命令は、8進二桁で済むので、赤は関係ありません。

JSRはサブルーチンにジャンプする命令ですが、青が0、黄色が0、赤が4なので、004で始まる機械語になります。

他の2オペランドを見ますと、1番多用する命令はMOV命令だと思います。この命令は第一オペランドのデータを第二オペランドにコピーして書き込みます。データを移すようにとれるねー明tぐですが、第一オペランドのデータは、変化しません。MOV命令は1語を移動するMOVと1バイトを移動するMOVBの2種がありますが、それぞれ01と11となります。他の2オペランド命令も0から始まる場合は、1語に作用し、1で始まる命令は1バイトの命令です。ADD、SUBは、byte演算はありません。CMPは比較で、結果によってPSW(フラグ)をセットします。比較の基準は第2オペランドなので、SUBと逆の関係なので注意が必要です。

BITはビットをテストする命令で、他のCPUだったら、AND命令、BISは、一般のCPUだったら、OR命令です。BICは、ビットをクリヤーする命令で、

d <-(〜s)^ d

を計算します。ここで〜はビット反転、^は排他的論理和を表します。図の灰色の部分の07、17で始まる機械語は、オプションで、下位のモデルでは実装されていません。驚くべきは、XORがオプションでした。XORは値を 0リセットするとか、パリティのチェックの時にに便利なんですが、PDP−11にはCLR命令があるので必要ないかもしれません。

オペランドを一つ取る命令や、オペランドを取らない命令(オレンジ色のところ)、分岐命令やなどの命令は別の機会にします。

16ビットCPUの完成形と言われたPDP-11 の機械語命令体系はいかがでしたでしょうか。来年も、続けますのでよろしくお願いします。では、良いお年を。

(アドレッシングモードと分岐命令の巻につづく)


PiDP-11を使う その9 引き算と負の整数の表現の巻

2023-12-12 09:14:12 | コンピュータ

前回、機械語で、足し算を紹介しました。今回は引き算の紹介です。引き算はニーモニックで SUB(struct)です。機械語では16****で、機械語命令の後の後の番地のデータから、機械語の後の番データを引き算して、機械語の後の後の番地にに格納しする場合は、163737と書きます。

前回出てきたオペランドという言葉をを使うと、destination <- destination - sourceの操作をします。 source は第一オペランド、destination は第二オペランドに当たります。

では実際に2−4の計算してみます。コンソールパネルで操作すると長くなるので、ターミナルで見てみます。

コンソール・パネルで見るとこんな感じに。

最上位の15ビットが1だと負の数です。引き算の結果が負の数になると、PDP-11では負の整数は、2の補数で表します。終わり。

これでは少し不親切なので補数について説明します。まず、私たち人類が1番親しんでいる10進数の10の補数から、説明します。今ここに10進数で計算する簡単な2桁の計算機があるとします。10の補数の定義は、この二桁の計算機の場合、加算して、3桁目に桁あふれを生じる数のうち最小の整数を補数とします。例えば、2に対する10の補数は、98となります。10であれば、90が10の補数です。この10の補数を元の数の負の表現とするのが補数表現で、-2を98で表すと、これに6を加える計算をすると、和の104のうち1の位は、2桁計算機の場合、桁あふれになるので、2桁表示の04が残り、これが、計算結果となります。この方式で、二桁で、表現できる正の整数は、49まで負の数は−50です。もっと桁数を増やせば、大きな数を表現できます。

PDP-11の場合、基本は、2進16桁で計算しますから、2の補数表現で、-2を表現すると、

177776(8進)が2の補数表現になります。これに、000006を加えると2000

04となり、1番左端の2は桁あふれを起こして無くなるので、000004と、10進の時と同じ結果が得られます。負の数を補数で表現する時のメリットは、加算、減算の計算命令に特別な変更を加えなくても、正の数、負の数が混在する計算ができることにあります。

木村泉先生の講義OHPでは、こんな感じに説明されています。

負の数の表現方法には2の補数以外に、1の補数、符号+絶対値などが考えられます。私の知る限り、1の補数表現は、DECの最初のコンピュータであったPDP-1、UNIVAC 1100/2200のような太古のコンピュータ以外にはないようです。参考までにぞれぞれの例を2進3桁表現で、木村泉先生のOHPを見ますと、なかなか味わい深いものがあります。

(機械語命令の観光地図の巻につづく)

 


PiDP-11 を使う その8 初めての機械語の巻

2023-12-10 11:08:00 | コンピュータ

初めにお話すると、Balconは、PDP-11のFORTRANとアッセンブラのプログラミングはしたことありますが、機械語は使ったことはありません。ではなぜ機械語なのかというと、よく言及されるPDP-11のアーキテクチャは16ビットマシンの完成形だとか、命令の直交性だとかを味わえるのは、やはり機械語で見ていくのが、一番じゃないかと思われるからです。

当時は、実験で一杯、一杯だったので、プログラミングにしても、PDP-11の凄さを味わう余裕はありませんでした。世界で初めてのデータを取るということで、測定機器の設計、制作、PDP-11との接続、プログラムの開発と、ハンダ付け、配線のラッピング、プログラムのデバック、実験データの取り込み全てに関わっていました。

ラッピングとは、裸にみむいた、テフロン線を、生花の剣山ように長く伸びた端子に巻きつけて配線していく方法で、当時は一般的でした。

PDP-11の後ろから見た写真です。21世紀の今なら、バスラインはプリント基板でしょうが、こんな感じで配線されていました。

配線の変更・追加が巻き付いた線の巻き戻し、巻きつけで簡単できてしまいます。

 

では、機械語の話に入ります。

前回、例に使ったまず足し算は、063737でしたが、8進で、06の部分は、演算子(oprator)と言って、演算の種類を指定します。足し算の機械語は、データのありかを指定する被演算子(oprand)を二つ取る命令なので、被演算子37 が二つ続きます。37は、命令の番地の次の番地に書かれているデータがオペランドのアドレス(番地)だよと指示しています。

番地   命令

1000        063737

1002         1010

1004         1012

これで一つの完成した機械語命令になり、1010番地のデータと1012番地のデータを足して、1012番地に書き込みます。 PDP-11には、オペランドを 二つ取る命令が、12個あり、第一オペランドをソース(source)、第二オペランドを、デスティネーション(destination)と呼んでいます。演算の結果はデスティネーションに入ることが多いですが、例外的に、デスティネーションが変化しない命令もあります。

オペレータには、記憶しやすいようにニックネームが付いています。06にはADDというニックネームがついています。このニックネームのことをニーモニック(mnemonic)と言います。

ADD命令は、オペランドを2個取りますが、オペランドを1個取る命令やオペランドを取らない命令もあります。前回の例の1006番地の000000は、ニーモニックはHALTで、プログラムの停止を命令しますが、オペランドは取りません。 

木村先生のOHP原稿を見ると、次のように纏めらています。図中RSTはRTSの誤りですが、Balconも同じ間違いをよくやらかして、アセンブラに怒られました。

なお、二つオペランドを取る命令の代表的ものは、MOV(01)命令で、データのコピー・ペイントをします。SWAB(0003)命令は、1語のハイバイトとローバイトを入れ替えます。

分岐命令は以下は、また後ほど説明します。(命令の観光地図の巻につづく)

 


PiDP-11を使う その7 ターミナルを繋ぐの巻

2023-12-07 19:33:41 | コンピュータ

では、 PiDP-11に、ターミナルを接続しましょう。オペレータ・コーンソールを持っていない方も、ターミナル接続で、ラズペリーパイにインストールしたPiDP-11を試すことができるので、マニュアルの通りインストールして、繋いでみてください。

ターミナルについての小歴史

PDP-11の時代の初期のミニコンピュータの入出力装置といえば、テレタイプという時代がありました。テレタイプと言っても、見たこともない人がほとんどでしょう。これです。ドン。

これがテレタイプの代表、その名もテレタイプ社製 ASR-33です。電動タイプライタに紙テープ読み取り装置と、紙テープ鑽孔装置(紙テープに穴を開ける装置)がついたものです。21世紀の現在でも、端末をttyと略すのは、テレタイプ時代の名残です。

紙テープとは、こんな感じのもので、穴の位置で、データを記録するものでした。

流石の前世紀の遺物などと呼ばれているBalconも、ASR-33は研究室の隅に、薄く埃をかぶって、廃棄処分を待っているものしか見たことはございません。

私がPDP−11を使っていた頃は、VT102というブラウン管表示装置とキーボードがついたものをターミナルとして使っていました。このVT102の前身であるVT100というモデルは、現在でもVT100互換ターミナルソフトとして、名残をとどめています。

21世紀の時代にこれらの装置は、もう入手困難になってしまいました。

実際には、21世紀のターミナルをPiDP-11に繋いで、操作してみます。

PiDP-11には、Windows PC、 Mac、 タブレットで接続することになります。装置はなんでもいいのですが、SSHプロトコールが使えるVT100互換ターミナルエミュレータが必要になります。代表的なものは、Windows では、Teraterm、puTTY,  Macでは、純正のターミナルを使って、SSHでPort 22に接続します。 ユーザは、pi 、パスワードは類推困難なものにしてください。

Balconは、PiDP−11の走っているラズベリーパイに、puTTYをインストールして使っています。

sudo apt-get install puttyで簡単にインストールできます。

設定をお好みにいじって、localhostにユーザ名piでログインします。

ユーザ piで、PiDPに接続すると、こんな画面になります。(再起動した時点で、simhは、サーバとして既に走っています。)

現在、idled というデモプログラムが動いている状態です。この画面にインストールされているOSのリストも表示されています。これらのOSは、コンソールパネルがなくても問題なく使えるので試してみられるといいかもしれません。Balconは、Bare  Metal で運用するので先に進みます。

コントロールキーとEキーを同時に押すと、ENABLE/HALTキーをHALT側に倒したのと同じ状態になります。(コンソールパネルがなくても使えます。)sim>は入力を即すプロンプトです。ここでコマンドを入力すると、パネルでの操作と同じように、キーボードから操作できます。

例えば、メモリに書き込んだり、メモリの内容を確認したり、プログラムを実行することができます。

簡単に、コマンドを説明します。

d 1000 063737 ↩️  ←は 1000番地 063737 を書き込む (deposit)

e 1010 ↩️ ←は 1010番地のデータを読み出す。 (examine)

e 1000-1012 ↩️ ←は1000番地から1012番地までのデータを読み出す。

g 1000 ↩️ ← 1000番地から、プログラムを開始する。 (go)

s↩️ ← 現在のプログラム・カウンターの命令を一つ実行する(single step)

c↩️← 現在のプログラム・カウンターの命令から、プログラムを実行する。(continue)

br 1006 ↩️ ← ブレーク・ポイントを1000番地に設定する。 (break point)

nob 1006 ↩️ ←ブレーク・ポイントを解除する。

show b ↩️ ←設定されたブレーク・ポイントを表示する。

などです。他にも色々な機能がありますが、simhのマニュアルをチェックしてください。

http://simh.trailing-edge.com/pdf/simh_doc.pdf

では、早速、前回の足し算のプログラムを入力してみましょう。

ざっとこんな感じです。depositでメモリーに書き込んで、examineでメモリ内容を確認しています。

実行はこんな感じ。

前回のコンソール・パネルのオペレーションと同じことができます。

(初めての機械語の巻につづく)


PVバーナー

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