訂正・NOP命令の誕生
先日「NOP命令が作られた日」について書いたのですが、早速訂正記事を書かねばなりません。
有難いことに、記事は多くの方に読んでいただけました。
元記事書いてからの1年よりも、先日1日の閲覧回数の方がはるかに多いのではないかな。
そして、多くの目にさらされたおかげで、情報提供がありました。
「TX-0 よりも先に、IBM 704 が NOP 搭載しているよ」という情報。
…調査したら本当でした。
2015.5.19追記 2015.6.19修正
さらに1年近くたって、自分で古いコンピューターの資料を調査中に、IBM SSEC (この記事で書いた、702 より古い機械。コンピューターですらない!)に No Op 命令があるのを発見しました。
当記事は既に発表したものですし、IBM 702 の説明としては面白いので、記録として残しておきます。
なお、記事最後の調査済みの歴史は更新しています。
目次
まずはお詫び
なんで、IBM のコンピューターという重要なものを見落としていたのか…完全に僕のミスです。
しかし、704 にある、と判ったらもっと古いマシンも調査しなくては…
すでに TX-0 の話題ではないのですが、TX-0 の話題から派生したため、便宜的に TX-0 の話題として追記しています。
IBM のマシンでは、704 の元となった 701 にもありました。発売時期は 701 より後ですが、開発は先に行われていた 702 と 650 にも。
しかし、朝鮮戦争が起き、兵器の開発のために 701 の完成が急がれます。
IBM では技術者を 701 に大幅に振り分け、このために 701 が先に完成します。
このことから、701 には「国防計算機」の異名もあります。
IBM に限らず、知りうる限りのコンピューを洗い出しましたが、この詳細は最後に書きます。
とにかく、現状では同時並行で開発されていた、701 / 702 / 650 が NOP 命令を初めて搭載したコンピューターのようです。
701/702/650 の NO OP 命令
さて、もう少し詳しく見ていきましょう。
一番最初に発売された 701 のマニュアルには、たしかに NO OP と書かれた命令が存在しています。(NOP ではありませんが、準じたものとして扱います)
動作も No Operation と書かれています。
しかし、少し不自然な点があります。
全部で 32 の命令があり、命令一覧には NO OP も書かれています。その一方、それぞれの命令の詳細解説ページでは、なぜか NO OP だけ完全無視なのです。
「何もしない」にしても、詳細解説で完全に無視するというのはちょっと不自然。
開発開始が 701 よりも古く、発売順は 701 の次だった、702 を調べます。やはり NO OP 命令があります。
そして、詳細解説に…すばらしい!
後で紹介しますが、「何もしない命令」であるにもかかわらず、解説が非常に細かいです。
「何もしない」ことの意味かから始まり、何もしない命令にどんなメリットがあるのか、サンプルのフローチャートやプログラムテクニックまで付けてあります。
次に、702 と同時期に開発が始まり、3機種の中では最後に発売され、一番売れた 650 を調べます。
やはり、マニュアルには NO OP があります。詳細解説もありますが、ここでは「何もしないで次の命令に進む」ということだけが書かれています。
NO OP を考え出したのがどの機種か…といえば、これは僕の勘にすぎませんが、702 のように思います。
長い解説を付けたのは、「何もしない」という命令が便利であると思いついた技術者たちが、なんとか意図を伝えようとしているように思うのです。
そして、701 と 650 の技術者は…その便利さが良くわからないながらも、社内で同時並行開発しているマシンが NO OP 命令を搭載したから、右へ倣えで搭載しておいた、という程度でしょう。
何もしない命令なんて役に立たない、という思いがどこかにあり、701 では詳細ページで完全無視、650 ではさらっと流した…というところではないかと思うのです。
IBM 702 の構造
では、IBM 702 の NO OP はどういう命令であったか…という話をするには、まず IBM 702 の詳細を知らなくてはなりませんね。
IBM 702 は、BCD コンピューターでした。BCD … Binaly Coded Decimal とは、日本語では「2進化10進」と訳されます。
3bit では、0~7 の数字が表現できます。これは、我々が普段使っている 10 進数の表現には少し足りません。
4bit あれば、0~15 の数字が表現できます。少し多いですが10進数を表現できます。
そこで、4bit を 10進数の「1桁」として、回路は 2進数だけど、10進数で計算を行う。これが BCD です。
実は、IBM 702 の BCD は、少し拡張されています。1桁を 6bit で表現するのです。BCD ですから、4bit と 2bit に分けて考えるようになっています。
数としての表現では、この 2bitは、計算中には符号を示すフラグとして働きます。00 なら正数で、11 なら負数。10 は「ゼロ」で 01 なら「ゼロ以外」でした。
6bit あるので、文字を表現することもできます。文字データとして見た時に、2bit が 00 だと「数字」を表現するようになっていました。
これにより、通常は「数」と「数字」は文字コード上で一致します。
2bit を 00 以外にすることで、アルファベットや記号も使うことができました。
上位 2bit には、このように特別な意味があるため、この 2bit を操作するための専用命令もありました。
さて、IBM 702 の命令は、1文字+数字4ケタで表されました。
先頭の文字は命令です。6bit で 64文字がありますが、32命令ありました。
数字4ケタはアドレスです。0000~9999 のアドレスが使えました。
IBM 702 は「10進」コンピューターなので、5はキリの良い数です。
命令は、必ずアドレスとセットになっています。アドレスの代わりにアドレスレジスタを、とか、直値を使って…とか、現代的なアドレッシング(命令にデータを与える方法)はありません。
たとえレジスタを 1 増やしたいだけでも、どこかのメモリに 1 を入れておいて、そのアドレスを指定して足し合わせる、という方式です。連続したアドレスを配列のようにアクセスしたいなら、自己書き換えでアドレスを変更します。
現代のコンピューターから見ると面倒くさく見えますが、当時としてはごく普通の方式です。
命令は必ずアドレスと組になっている。…それがたとえ「何もしない」命令であっても、です。