PDPー11は入出力命令を持ちません。周辺機器は、全て、メモリーの特定番地にマップされているので、メモリに、書き込んだり、読み取ったりすることによって、入出力を行います。メモリも、周辺機器もUNIBUSという同一バスに接続されています。メモリに比べて、反応速度が遅い周辺機器とデータをやり取りする場合の速度差をどのように調整するかというと、割り込みを使う場合と、制御レジスタを介する場合があります。
オペレーティングシステムを介して入出力をする場合は割り込みを使っています。PDPー11は、初めて、UNIXを開発した時に使われた機械なので、割り込みは、もちろん可能ですが、今回はBare Metalで使うので、割り込みではなく、 制御レジスタを使って、入出力を行います。
入出力装置は、160000番地から177776番地に予約されています。この範囲のどこかに、入出力の制御レジスタとデータをやり取りするバッファが接続されています。
例えば、ターミナルとして使っているテレタイプと通信するためには、プリンター部には、
制御レジスタ:177564番地 出力バーファ:177566番地
を使います。Ballconの先輩たちは、イナナゴロシなどという、やや物騒に聞こえる語呂合わせで記憶していたようです。竹内郁雄さんは、LISPのハッカーでBalconも尊敬している方ですが、「イナナゴロシ」について、エッセーを書いてます。
流石に、Balconは、RT−11というOSを使っていたので、イナナゴロシとかは聞いたことはありませんが、先輩のプログラマにこの呪文を唱えると、色々な反応をする方がいるらしいです。
オールドハッカー風にいうと、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匹のカタツムリの巻に続く)