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

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

PiDP-11を使う その21 小さな機械語ローダの巻

2024-03-04 13:56:09 | コンピュータ

 

今回は、機械語ローダについてです。機械語ローダとは、紙テープに打たれたプログラムをメモリに書き込むプログラムです。古いコンピュータは、搭載メモリが少ないため、OSなしのベアメタルで運用されていました。有名なところでは、  世界で最初のプログラム内蔵式コンピュータであるEDSACのイニシャル・プログラム・ローダや、東大のパラメトロん計算機のPC1の和田英一さんのプログラムなどがあります。

木村泉先生追悼文集 別冊 3 の最後尾のセクションは、小さなローダについてです。作者は、当時、木村先生の研究室に在籍した久野靖氏と思います、この文集には、久野さんが2名関係しているので、確定できません)

こんな感じでOHPが3枚掲載されています。

このプログラムは、前回紹介したローダ語で書かれているので、これをメモリに格納するには、メモリの中にローダ語をロードするローダ必要と堂々巡りが起こります。(ブートストラップ問題の一例)

ブートストラップ問題 (Bootstrap problem) は、コンパイラをコンパイル対象のプログラミング言語で作成した際に、そのコンパイラの最初のコンパイルをどうするかといった場合を典型的な例とする、いわゆる「鶏と卵」の形をしたセルフホスティング環境の問題を指す。これを解決するための方式をブートストラップ方式といい、この問題を何とかして最初の完備した環境を作ることをブートストラッピングという[1]。 (Wikipedia から)

今回は、ちょっとずるいですけれど、ローダ語を解読しながら、 PDP-11 のアッセブラに入力して、絶対ローダ形式に変換しました。お正月休みに入力していたら、大問題発生、冊子には、3枚のOHPが掲載されていましたが、本来、4枚目があったようで、名前表の検索をするサブルーチンと名前表のチェックをするサブルーチンが、失われてしまっていました。幸い名前表の構造は、名前の登録サブルーチンから判明したので、Balconが勝手に、足らないサブルーチンと紙テープ入力サブルーチンをつけ足して、完成させました。

全体で、 0.7  kByte 程度のサイズで、ごく小さなローダです。仕様は次のとおりです。

プログラムは紙テープで入力します。simhで、紙テープを作る方法は、普通の編集ソフトで、普通に入力して、ASCIIファイルを保存すれば、紙テープ・イメージとして使えます。ただし、Unix系の編集ソフトは改行がラインフィード( LF)なのですが、テレタイプの改行キャリージ・ラインフィード (CRLF)なので、紙テープ入力サブルーチンでCRを加えて、読み込んでいます。

機械語は、カンマ(、)または、セミコロン(;)で区切ります。1語、16ビットの8進数で、6桁で入力しますが、先頭から続く0は省略可能です。

名前は、$に続く8進数で定義して、最後にコロン(:)をおきます。名前が、出現した番地を名前で置き換えることが可能になります。

分岐命令にカンマなしで スラッシュ(/)名前で、名前の番地のオフセットを計算して、分岐命令を完成させて、メモリに格納します。

$記号なしの8進数がコロン(:)で終わると、メモリの開始番地指定になり、機械語はその番地から格納されます。 開始番地が、指定されていない場合は、60000番地からの格納になります。

エラーチェックはありません。

以上が、オリジナルのローダの仕様です。

 

 このコードはローダの仕組みを説明するのは、ちょうどいいのですが、実際に使ってみると、あったら良いなという点があります。Balconはオリジナルにいくつか、拡張をして、

mld-obj.ptap という絶対ローダで読み込める紙テープ・イメージをつくりました。

下のリンクからダウンロードできます。

 

GitHub - tokkagun/PDP-11: PDP-11 paper tape software

PDP-11 paper tape software. Contribute to tokkagun/PDP-11 development by creating an account on GitHub.

GitHub

 

Balconの拡張点は、三つです。

エラーメッセージ:

  未登録の名前

  名前の多重定義

  分岐命令の誤り

エラーを検出すると、検出した行を表示しますが、これは、エラーが判明した場所で、必ずしもエラーある場所ではないので、表示された行にエラーがないときはその前の行をチェックしてください。

実行番地指定:

  8進数の後にピリオード記号があると、その8進数を実行を開始する番地として、読み込みにエラーがなければ、その番地に飛びます。

文字列;

   “…“で囲まれた範囲は、文字列として1バイトづつ格納されます。最後の番地に000が格納されますが、その番地が、偶数であれば、さらに000を追加して、次の命令が、偶数番地になるように自動的に追加が行われます。これによって、文字列を扱うときに、0をチェックすれば、終端がわかるようになります。

文字列中に、 \(バックスラッシュ)はエスケープ文字として、認識されます。\の後に3桁の8進数字があれば、その数字を1バイトとして扱います。「\」自体を入力する場合は、\\と2回バックするラッシュを打ちます。また、「“」を入力するには、\“で、可能です。\e はエスケープ記号として認識します。

 

メインプログラムは 150000番地から実行します。

140000から147776番地までは、プログラムのデータ領域として使用します。スタックは140000番地から、小さい方に使っています。

機械語ローダの使い方

snails-mld.ptapの内容を機械語としてロードする場合を説明します。

 go 150000(絶対ローダで、機械語ローダを読み込むと、自動で機械語ローダが立ち上がるので、 入力は不要)

で起動します。すぐに一時停止しますから、

attatch ptr snails-mld.ptap

で、紙テープ・イメージを高速テープリーダに取り付けます。

次に、c↩️でプログラムを続行すると、紙テープ・イメージの内容が、メモリに格納されます。

 

155000番地には、隠しコマンドがあります。 これは、メモリーの内容を紙テープに出力するコマンドで、前もって、紙テープパンチに空のファイルをattachしておくと、メモリの任意の範囲を絶対ローダ形式で打ち出します。隠しコマンドは、エラーチェックなど一切しないので、注意して使ってください。入力ミスがあったら、コントロール eで simh を止めて、最初から、スタートしてください。

始める前に、空のファイルを高速紙テープパンチ装置に、取り付けます。

例えば、 ml-obj.ptapが空のファイルとします。下のコマンドを打つと、もし、同じ名前が、存在しなければ、自動的に、新しいファイルが作られます。

 attach ptp ml-obj.ptap

以下コマンドで、ml-boj.ptap に絶対ローダでロードできる2進データを作ることができます。

go 155000で実行すると、隠しコマンドが開始します。

B、E、Sの三つのパラメータ入れます。8進数で入れてください。Bは開始番地、Eは終了番地、Sは、実行番地、絶対ローダでロードすると、Sで指定した番地から、プログラムを開始します。隠しコマンドなので、エラー処理はありません。打ち間違えをしたら、コントロール e で一旦止めて、も一度最初から 、go 155000 で始めてください。

実行を自動的に開始したくなければ、Sに0を入れると、絶対ローダは、データをメモリにロードした後、停止します。

プログラムが終了したら、

 detach ptp

で、紙テープ装置から、イメージを外します。

これで、絶対ローダでロードし、自動実行する(しない)テープ・イメージが、 ml-obj.ptapに書き込まれます。

 

 


PiDP-11を使う その20 一世風靡した BASICの巻

2024-02-22 09:14:24 | コンピュータ

記念すべき20回目になりました。今回は、Beginner's All-purpose Symbolic Instruction Code (BASIC)をに挑戦します。

BASICとは、1964年に(第1回目の東京オリンピックの年)アメリカのダートマス大学(アイビー・リーグのメンバーで名門大学)でケメニーとカーツが開発したプログラミング言語です。1975年にマイクロソフトのビル・ゲーツとポール・アレンがインテルの8080マイクロプロセッサ(ALTAIR 8800)用に移植してから、一世を風靡したのです。日本でも、多くのパーソナル・コンピュータに移植されて、1970年代後半から、1980年代前半の当時のBASICは、現在のOSの役割も担っていて、ファイルの管理、周辺機器の管理、プログラムのロード、保存なども、全てBASICの中からコマンドで操作していました。BASICのプログラムの中から、機械語プログラムを呼び出したり、メモリの特定番地も読み書きできたりと、今のOSではできないこともできたりしました。

このBASICをベアメタルでPiDP-11で使ってみます。前回、ブートストラップと絶対ローダを導入したので、これらを使って、紙テープベースのBASICをメモリにロードしてみます。 

ブートストラップですが、当時のPDP-11は、メインメモリにコア・メモリというものを使っていました。このメモリ素子は、電源を切っても内容を保持する特性があったので、PDP-11に電源を入れるたびに、ブートストラップを入力する必要はありませんでした。現代のコンピュータのメモリは、起動するたびに初期化されてしまうので、毎回、ブートストラップを入力しなければなりません。手入力で、ブートストラップを書き込むのは面倒なので、boot.iniというブートストラップの入力と、絶対ローダの読み込みをするスクリプトを作ったので、これを使うことにします。

DEC謹製のBASICのインタプリタは、DEC-11-AJPB-PB.ptap というテープに入っています。

simhをコントールEで一旦停止して、sim>というプロンプトに対して do boot.iniと打ち込むと、スクリプトが実行されます。 ブートストラップを入力して、絶対ローダを紙テープにセットして、15744番地から実行して、17476番地で一旦実行停止します。ここで、手動でBASICインタープリタの紙テープ DEC-11-AJPB-PB.ptap を読み取り装置にセットして、go 157500で絶対ローダを起動します。                             

sim> do boot.ini
Searching realcons controller "11/70" ...
Connecting to host localhost ...

HALT instruction, PC: 157500 (MOV PC,SP)
ABSOLUTE LOADER is READY.

attach paper tape to load.
then start at 157500.

BASICが起動すると

PDP-11BASIC VERSION 007A 

*Oと打ち出して、入力待ちになります。これはオプションの指定待ちです。オプションは次のようなものがあります。

(マニュアルは、こちらから、http://bitsavers.trailing-edge.com/pdf/dec/pdp11/lang/basic/basic_pts/DEC-11-AJPB-D_PDP-11_BASIC_Programming_Manual_Dec70.pdf

L: 紙テープの入力・出力にテレタイプの低速装置を使う。

D: 数学関数 SIN、 COS , ATAN、 SQRを使わない。

E: EXP、LOG を使わない。

H: BASICを開始する前に一旦停止する。このあと機械語の関数を紙テープからロードする。

4から28の数字: メモリの使用量を指定する。

*Oに続いて、リターンを打つと、デフォールトモードになります。この場合は、紙テープは、高速テープ装置を使う、数学関数はすべて利用可能、実装されている全メモリをBASICで使う、BASIC開始前の一旦停止はしないとなります。READYは、入力を促するプロンプトです。

 

PDP-11 BASIC, VERSION 007A
*O 
READY

ここで、コントールEで、simhを止めて、プログラムテープを取り付けると、以前保存したプログラムを読み込めます。 OLD コマンドで読み込みます。

Simulation stopped, PC: 000706 (TST (R2))
sim> att ptr sum-bas.ptap 
sim> c
OLD
READY

読み込んだプログラムを表示します。

LIST


5 PRINT
10 LET S = 0
15 PRINT"NUMBER";:INPUT Z
20 FOR I=1 TO Z
30 LET S = S + I
40 NEXT I
50 PRINT "SUM OF 1 TO";Z;"IS";S
70 END
READY

 

1から入力された数までの整数の和を求めるプログラムです。実行してみます。

READY
RUN 

NUMBER?10
SUM OF 1 TO 10 IS 55 

STOP AT LINE   70 
READY

1から10までの整数の和なので、55となります。

プログラムを紙テープに打ち出すには、新しい紙テープのイメージファイルを、紙テープパンチ装置にセットして、BASICの入力待ち状態でSAVEと打ちます。DELETEコマンドはメモリ内のプログラムすべて消去します。

今回使用したファイルは、以下のURLからダウンロード可能です。

 

 

GitHub - tokkagun/PDP-11: PDP-11 paper tape software

PDP-11 paper tape software. Contribute to tokkagun/PDP-11 development by creating an account on GitHub.

GitHub

 

 

 


PiDP-11を使う その19 ブートストラップ・ローダの巻

2024-02-18 19:48:51 | コンピュータ

今回は、PDP-11のブートストラップについて解説します。そもそも、ブートストラップってなんでしょう。

これです。ブーツの履き口についているリボン状のぶつです。ウエスタンスタイルのブーツでは、こんなのもあります。

ブーツを履くとき、まず掴んで、履き口が動かないようにするものですね。

Wikipediaによれば、

「自分でブートストラップを引っ張って自分を引っ張り上げる(pull oneself up by one's bootstraps)」という表現は19世紀に、不可能な動作の喩えとして存在した。」とのことでした。これが可能ならば、キリスト様のように、水の上も歩けますね。

「コンピュータ、ソフトなければ、ただの箱」という言葉がありますが、コンピュータにソフトウエア(プログラム)ロードするには、悩ましい問題があります。電源を入れて、最初のプログラムをどのようにロードするかという問題です。現在のPCはROMに入っているBIOSの一部のプログラムをまず読み込み、それがハードディスクやSSDの特定のセクターのブートプログラムを読み込み、ブートプログラムがオペレーティング・システムを読み込んでいます。

PDP-11が作られた1970年代には、ROMのICは、まだ存在しませんでした。では、どうしていたかというと、手入力で、イニシャル・プログラム・ローダ(Initial Program Loader: IPL)という短いプログラムを入れて、IPLは、紙テープにかかれた、絶対ローダをメモリにロードしました。絶対ローダは、色々なソフトウエアの紙テープを指定された番地にロードしていました。紙テープ・システムといいます。IPLはこの頃まで、当たり前に使われていて、いろいろな伝説が生まれました。

伝説の1つを、ご紹介しましょう。1958年3月26日に東京大学で、パラメトロン計算機PC-1が産声を上げました。パラメトロンとは、聞き慣れない言葉だとは思いますが、Balconの高校の大先輩の後藤英一先生が、開発した素子で、多数決原理を採用した日本独特の論理回路でした。現在では、主流から外れて、忘れ去られた形になってしまいましたが、最近では、超電導量子パラメトロンとして、量子コンピュータの量子状態を検出する素子として復活するかもしれません。そのPC1のIPLは初期のハッカーの一人の和田英一さんが作りました。わずか、68ステップで、現在のアセンブラの機能を併せ持つローダとして、今でも語りぐさになっています。PC1は512語のメインメモリで、大学の行列の計算に使われていたようで、メモリの逼迫のなか、小さなIPLが必要とされていたようです。

DEC純正のPDP-11のIPLは16語でしたが、ただ、絶対ローダの紙テープを読むだけで、PC-1のIPLのような機能は持っていないのでPC1のIPLと単純には比較できません。DECでは、IPLのことをブートストラップ・ローダと呼んでいました。これが、コンピュータを起動する意味でのブートの語源になったんじゃないかとBalconは思っています。

上がDECのブートストラップです。ブートストラップは、メモリの最上位に書き込まれましたので、メモリの構成によって、格納番地の最上位3桁が異なります。simhのPDP-11エミュレータは4メガバイト実装済みなので、157744番地から格納します。Balconの先輩たちは、IPLを小さな紙に書いて、コンソールに貼って、コンソールパネルから、スイッチをバチバチやって入れていたようです。Balconの頃には、PDP-11は、IPLのROMが実装されていたので、電源スイッチを入れると、OSが読み込まれるようになっていました。したがって、Balconは、コンソール・スイッチを使うことはありませんでしたが、CPUを起動する前に、指定の電源投入順序に従って、磁気ディスクや、ターミナルなどの電源を入れて置く必要がありました。

PiDP-11では、先輩たちのようにコンソール・スイッチをバチバチして、入れることもできますが、simhでは、ブートストラップ・ローダをキーボードから入力します。1577776番地には、高速紙テープ・リーダのCSRアドレスの 177550を書込みます。その後、高速紙テープリーダに絶対ローダの入った紙テープをセットして、157744番地からブートストラップ・ローダをスタートする手順になります。モニタから見るとこんな感じ。

DECの絶対ローダは、以下のURLからダウンロード可能です。

 

http://www.vaxhaven.com/Paper_Tape_Archive

http://iamvirtual.ca/PDP-11/PTS-11/PTS-11.htm

https://github.com/tokkagun/PDP-11/blob/main/DEC-11-L2PC-PO.ptap

 

次回は、ブートストラップ・ローダと絶対ローダを使って、DEC謹製BASCIインタプリタをメモリにロードしてみます。

(一世風靡したBASICの巻に続く)


PiDP-11を使う その18 紙テープを読むの巻

2024-02-16 09:58:25 | コンピュータ

紙テープを読むと言っても、アニメに出てくる鼻の大きな博士のことではありません。今回は、高速紙テープ・リーダ/パンチ装置の読み込みプログラムについて解説いたします。コントロール装置であるPC11のマニュアルに(http://www.bitsavers.org/pdf/dec/unibus/PC11_Reader-Punch_Manual.pdf)よれば、読み取りプログラムは以下の通りです。ー

ほぼ流れは、前回ご紹介したパンチのときと同じですが、リーダを起動する信号を送るINC命令を始めに発行してから、CSRを読みに行くところが異なっています。

2では、紙テープを読むプログラムを書いてみましょう。紙テープの1フレームを読み込んで、8進数で、書き出して、対応するアスキーコードを打った後、改行するプログラムです。前回と同様ローダ語で、書いてみます。

2000 番地から、プログラムを収納していきます。

2000:
$10:        012706,2000;                             # MOV #2000,SP
$20:       004737,$1000;                           # JSR PC,$1000:READ A FRAME
                005701;                                          # TST R1
                0010/$50;                                      # IF ERROR STOP
                004737,$2000;                           # JSR PC,@#TYPE A VALUE
                120027,040;                                 # CMPB R0,#' '
                1034/$30;                                     # BLO $30
                010001;                                          # MOV R0,R1 
                112700,040;                                 # MOVB #' ,R0
                004737,$500;                             # JSR PC,@#TYPE A LETTER
                112700,074;                                 # MOVB #'<,R0
                004737,$500;                             # JSR PC,@#TYPE A LETTER
                010100;                                          # MOV R1,R0
                004737,$500;                             # JSR  PC,@#TYPE A LETTER
                112700,076;                                  # MOVB #'>,R0
                004737,$500;                              # JSR PC,@#TYPE A LETTER
$30:      004737,$600;                              # JSR PC,@#CR-LF
                0004/$20;                                     # BR $20
                $50: 000000;  # HALT
#TYPE A LETTER
$500:    032737,200,177564;                 # BIT #200,@#177564
                0014/$500;                                  #   BEQ $500
                110037,177566;                          #   MOVB R0,@#177566
                000207;                                         #   RTS PC
#CR-LF
$600:     112700,015;                                  # MOVB #15,R0
                004737,$500;                             # JSR $500
                112700,012;                                  # MOV #15,R0
                004737,$500;                             # JSR $500
                000207;                                         # RTS PC

#READ A FRAME
$1000:   005237,177550;                        # INC @#177550
$1010:    032737,100200,177550;       # BIT #100200,@#177550
                 0014/$1010;                               # BEQ  $1010
                 1004/$1020;                              # BMI $1020: ERROR
                 113700,177552;                        # MOVB @#177552,R0
                 012701,0;                                    # MOV #0,R1
                 000207;                                      # RTS PC
$1020:   012701,1;                                     # MOV #1,R1: ERROR HANDLING
                 000207;                                      # RTS PC
#TYPE A VALUE
$2000:    010046;                                    # MOV R0,-(SP):PUSH R0
                  012702,3;                                 # MOV #3,R2  
$2010:     010001;                                    # MOV R0,R1
                  042701,177770;                     # BIC #177770,R1
                  010146;                                     # MOV R1 -(SP):PUSH R1
                  006200;                                    # ASR R0
                  006200;                                    # ASR R0
                  006200;                                    # ASR R0
                  005302;                                    # DEC R2
                  0010/$2010;                            # BNE $2010
                  012702,3;                                 # MOV #3,R2
$2020:    012600;`                                  # MOV (SP)+,R0 :POP R0
                  062700,60;                             # ADD #60,R0
                  004737,$500;                        # JSR PC,@#TYPE A LETTER
                  005302;                                   # DEC R2
                  0010/$2020;                           # BNE $2020
                  012600;                                    # mov (sp)+,R0
                  000207;                                    # RTS PC

gooブログはプログラムソースコードには対応していないようで、不揃いで申し訳ありません。

MAIN PROGRAM では、はじめにスタックポインタをセットして、サブルーチンを呼ぶ準備をします。$20:のところからループに入ります。1フレームを読み込むサブルーチン($1000)を呼びます。R0に読み込んだ1バイトのデータ、R1には、返り値が入ります。R1が0のときは、正常終了、1のときはエラーです。エラーはテープの終了のことがほとんどなので、$50のHALT命令に飛んで、プログラムを終了します。

あとメインルーチンは、$2000 のR0の下位1バイトをアスキー数字3文字でテレタイプに出力するサブルーチンを呼びます。

その後,R0の内容のコードが30(八進)以上で印字可能ならば、 <ASCII CODE>を印字して、復帰改行して、次の1フレームをよぶループをくりかえします。無限ループになりそうですが、かならず、テープが終了して、エラーになるので、このループは終了します。

つぎにサブルーチン群です。$500からは、テレタイプに1文字出力するサブルーチン、

$600からは、テレタイプを復帰、改行するサブルーチンですが、これらの説明は省略します。

$1000からは、高速リーダ/パンチから、1フレーム読み込むサブルーチンです。ほぼ、マニュアルのとおりの、コーディングですが、R0に読み込んだ値、R1にエラーの有無を入れて戻ります。正常終了はR1が0、エラー終了は R1が1になって、戻ります。

$2000からは、3桁の8進数で、R0の下位1バイトをテレタイプに打ち出すサブルーチンです。 下位から、3ビットづつ、1度スタックに積んでから、上位3ビットづつ順序を入れ替えて、八進60を加え、ASCIIの数字コードに変換して、テレタイプに打ち出しています。なお、R0の下位3ビットを一時的に保管するのにR1を、3桁を数えるカウンターにR2を使っています。また次の桁に進めるのに算術右シフトを3回使っています。(8で割る操作と同じ)ざっとこんなところです。

では、実際にM-LOADERを起動してプログラムを実行してみましょう。プログラムはM-LOADERを起動すると、一旦停止して、紙テープを装置に装填するするように行ってきます。紙テープ・リーダに、プログラムを打ち込んだ、readTape-mld.ptapという紙テープのイメージファイルをatt ptr readTape-mld.ptapというコマンドで装填します。コンティニューコマンドのcを入力すると、プログラムが読み込まれて、名前表が出力されます。名前表には、名前と対応する番地が出力されます。

 

sim> c

PAPER TAPE LOADED.
PASS 1
PASS 2

FIRST LOADED ADDRESS: 2000
LAST LOADED ADDRESS : 2250
********** NAME TABLE **************
$10:2000
$20:2004
$30:2066
$50:2074
$500:2076
$600:2114
$1000:2136
$1010:2142
$1020:2166
$2000:2174
$2010:2202
$2020:2230
******** END OF NAME TABLE *********

NORMAL TERMINATION


HALT instruction, PC: 150370 (JSR R0,@#153716)

エラーなければ、NORMAL TERMINATION と出力されて、準備完了です。テスト用に準備したtest.ptapというテープ・イメージ・ファイルをセットしてします。

プログラムの開始番地は、$10の2000番地なのでgo 2000でプログラムを実行します。

テープを読み込み8進数での内容とASCIIコード出力して停止しました。

次回は、イニシャル・プログラム・ローダ(ブートストラップ)と絶対ローダの解説をいたします。

今回のソースコードも以下のリンクからご覧いただけます。

https://github.com/tokkagun/PDP-11/blob/main/readTape-mld.ptap

(ブートストラップの巻に続く)


PiDP-11を使う その17 紙テープに穴を開けるの巻

2024-02-15 16:20:56 | コンピュータ

では実際に、紙テープパンチ装置を使うプログラムを解説します。紙テープ・リーダ/パンチ装置(PC05)は、やはり、UNIBUSに接続されていて、メモリと同じようにアクセスします。PC05とUNIBUSを繋ぐにはPC11というコントロール装置が必要で、ソフトウェア的にはPC11を操作して、テープの読み書きをします。チューリング・マシンみたいでカッコいいですね。

まず、パンチ装置の方ですが、CSRの番地は、177554番地、バッファは177556番地です。DECのマニュアル(http://www.bitsavers.org/pdf/dec/unibus/PC11_Reader-Punch_Manual.pdf)から引用します。

 

制御用レジスタ(CSR)の番地は177554番地、バッファは、177556番地です。テレタイプのCSRのように、7ビット目にREADYビットがあり、更に、15ビット目にエラービットが追加されています。エラービットは、テープがリーダ/パンチ装置に装填されていないとか、途中で、テープが引っかかって、切れてしまったとかのときに1にセットされます。

マニュアルには、テープに穴を開けるプログラムの1例が記載されています。簡単に説明すると、打ち出すデータは、R0レジスタに入っていると仮定します。

BIT #100200, @#177554で、CSRの状態をチェックします。

つぎのBEQで READY,でもエラーでもなければ、チェックを続けます。

エラービットが経てば、負の数となるので、BMIでエーラハンドリングへ分岐します。

エラーが、なければ、バッファの177556番地に、R0のデータを、バッファ(177556番地)に移します。

実際に、キーボードから、打ったASCIIコードを紙テープに打ち出して見ます。プログラムはエスケープキーを打つと終了します。プログラムはこんな感じになります。写真の解像度が低くて申し訳ありません。リンクを長押して、別のタブにでも出すと、鮮明なソースコードがご覧いただけます。

https://github.com/tokkagun/PDP-11/blob/main/typePunch-mld.ptap

 

このあたりになると、プログラムが長くなって、読んだり、入力するのが大変になってきますので、ローダ語なるプログラム言語を導入します。ローダ語といっても、基本的には機械語なのですが、面倒な番地計算だけ、機械に任せるという感じです。

 

ローダ語は、木村泉先生追悼文集 別冊3の一番最後に紹介されています。作者は、当時、木村研究室に在籍していた久野靖さん(筑波大学名誉教授、現、電通大教授)と思われますが、この冊子には、2名の久野さんが、登場するので、特定できませんでした。

次にローダ語の仕様を述べます。

数値は16ビット(1語)を8進数で表します。

$記号の後に数値を書くと番地を指定する名前になります。

名前を定義する場合は、名前のあとに:(コロン)を置きます。こうすると、名前の直後の機械語の番地を名前で、参照出来るようになります。

$記号なしの数字の後の:(コロン)は、メモリの番地指定となり、その番地から、機械語は、メモリに格納されます。省略すると、無難な60000番地から、収納されます。

語と語の区切りは、、(カンマ)か、;(セミコロン)で区切ります。 

#記号以後はコメントとして、改行まで、無視されます。

分岐機械語命令の直後に/と名前を書くとその名前に対するオフセットを計算して、分岐命令を完成させます。

基本ルールはこれだけです。

では このプログラムのメインルーチンをローダ語で書いてみます。

 

 

1000:                                 #プログラムを1000番地から、格納します。

#    MAIN PROGRAM

$10:   012706, 1000;    #スタックポインターを設定します。1000をセットします。

$20:   004737,$500    #JSR PC でキーボードから、入力するサブルーチン($500)へ飛びます。

            120027,033;        #CMPB R0、#033 で入力した文字がエスケープか調べます。

            0014/$30;           #BEQ でエスケープなら$30に分岐します。

           004737,$510;      #JSR PCで、 TTYにR0に読み込んだ文字を書き出します。($510)

           004737,$600;     #JSR PCで、 R0を1文字パンチします。($600)

           0004/$20;             #$20へ無条件分岐します。(ループ)

$30:  000000;                #プログラムを停止します。

テレタイプの入出力のサプルーチン、$500(1文字入力)と$510(1文字出力)の内容は以前に解説しているので、今回は$600の紙テープパンチのサブルーチンを解説します。

 

$600:032737,100200,177554;    #パンチ装置のCSRをチェック

                 0014/$600;                              #BEQ $600 READYかERRORがセットされるまでループ

                  1004/$700;                             #BMI $700 ERRORならば、 $700 エラー・ハンドリングへ飛びます。

                  110037,177556                       #MOVB R0,@#177556 パンチ装置のバッファへ出力

                  207;                                             #RTS PC で戻る。

$700のエラー・ハンドリングは テレタイプにERRと出力して停止します。

今回のソースコード(typePunch-mld.ptap)は以下のURLに置いて置きます。ダウンロードに問題があれば、コメントで教えてください。ローダ語のテープを実際にメモリ書き込むプログラムも同じ場所に置いてありますが。こちらは、今後の連載で解説します。

 

 

GitHub - tokkagun/PDP-11: PDP-11 paper tape software

PDP-11 paper tape software. Contribute to tokkagun/PDP-11 development by creating an account on GitHub.

GitHub

 

(紙テープを読むの巻へつづく)


PVバーナー

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