では実際に、紙テープパンチ装置を使うプログラムを解説します。紙テープ・リーダ/パンチ装置(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に置いて置きます。ダウンロードに問題があれば、コメントで教えてください。ローダ語のテープを実際にメモリ書き込むプログラムも同じ場所に置いてありますが。こちらは、今後の連載で解説します。
(紙テープを読むの巻へつづく)
※コメント投稿者のブログIDはブログ作成者のみに通知されます