第二次改善策として,低性能プロセッサと小容量ROMメモリーを使い,高いコストパフォ-マンスの達成を目的として,ホフとメイザーと交渉した。システムとしての性能向上,プログラム・ステップ数の減少,プログラムを使った入出力機器のリアルタイム制御などを達成するために,命令セットと機能の変更と追加と応用への最適化などを議論した。

 さんざん議論をして納得したと思われたが,命令の定義の違いが判明し,ROM容量を削減する命令セットや外部メモリー容量の拡張案がなかなか理解されなかった。議論の結果をメモに走り書きしただけだったのが原因だった。また,具体的な設計を担当するインテル側が書類化するものだと勝手に解釈した。第二次改善策からの具体的な作業と書類化はすべてビジコン側が行った。

 4004の命令セットの進化を見ると,アイデアの創出後,紆余曲折を経て最終製品案が決定したことがわかる。アイデアをアイデアのまま採用すると失敗する可能性があることの具体的な例である。

 命令セットを決めるにあたっては,例えば,条件分岐命令の条件,シフト命令またはローテート命令のどちらか一つの選択,データ転送命令の種類,サブルーチンからの分岐時の戻り値,応用に特化した命令の種類などなどがある。したがって,応用技術者が命令セットの最適化に関する指導権を握ることになる。応用を広く深く知れば知るほど開発における成功の度合いが高くなる。役に立つかどうかわからないような技術と経験の蓄積が,後になって,役に立つことが多い。

 ホフが提案した基本命令は,コンピュータの基本命令に,電卓向け命令をほんの少し追加した命令セットだった。電卓向け命令として,加算後の10進補正(DAA: Decimal Adjust Accumulator),キーボード入力読み込み(RDKB),データ用レジスタの符号の読み書き(RDSGN,WRSGN)と小数点情報の読み書き(RDDP,WRDP),プロセッサを一時停止させタイミング回路との同期(HALT),表示出力のイネーブルとディスエイブル(DSPON,DSPOFF)などの命令があった。最終的に採用されたのは加算後の10進補正命令だけだった(表1)。

表1 4004命令セットの進化(クリックすると拡大表示します)

 2番目の問題点であった2進化10進データの演算結果である16進データを2進化10進データに変換する命令の内で,加算用の10進補正命令DAAだけが基本命令に入っていた。減算も重要であるので,減算前に使う減算用の10進補正命令TCS(Subtract Carry from Accumulator)を追加した。10進補正命令の特許だけでも取っておけばよかった。しかし,その頃は,その価値がわからなかった。

 10進データの減算は,減算式 a - b を 10 or 9 - b + a に変換して行う。前の桁からのBorrowがなければ10を,Borrowがあれば9を使用する。それを実現するために,TCS命令を新設した。TCS命令を実行すると,Borrowの内容によってアキュムレータに定数10または9をロードすることができる。

 3番目と4番目の問題点であった電卓用マクロ命令の実行方法と入出力機器のリアルタイム制御に関しては総合的な解決方法を考案した。電卓用言語であるマクロ命令をネイティブ命令に翻訳し実行するためと,応用プログラム用に使うROMメモリーの使用量を半減させるために,マクロ命令のインタープリタ機能とそれをサポートする命令を考案した。電卓用応用プログラムとしてROMに格納した電卓用マクロ命令(各マクロ命令を実現する各サブルーチンのスタートアドレス情報)を読み込み,そのマクロ命令をインタープリト(サブルーチンへ分岐)すれば,電卓用マクロ命令をエミュレートでき,サブルーチンへの分岐を1バイトで実現できる。

 基本命令として,8ビットのペアレジスタRRn内のデータをアドレス情報として使い,そのアドレスで指定した番地に分岐するレジスタ間接分岐命令「JIN RRn」があった。新命令として,ペアレジスタRR0をROMへのアドレスポインタとして使い,ROMに格納したマクロ命令のスタートアドレス情報をペアレジスタRRnに格納するレジスタ間接ロード命令「FIN RRn」を追加した。また,マクロ命令には条件分岐命令もあるので,マクロ命令終了時の結果を戻り値として渡すために,サブルーチンからの復帰命令の仕様を命令で指定する任意の戻り値をアキュムレータにロードする復帰命令「BBL d」に変更した。

 コストの掛かる割り込み処理制御方式を採用する代わりに,プリンタからの同期用入力信号をTEST入力端子に入力させ,その入力信号を条件付き分岐命令の条件の一つとして追加した。

 それらの新規命令の追加により,常時動作しているインタープリタ・ルーチン内で条件付き分岐命令を使い,マクロ命令の最長実行時間である1ミリ秒の間隔で,TEST入力端子を介して外界の状態(プリンタ付き電卓ではプリンタからの同期用入力信号:PB)を調べることが可能となった。すなはち,インタープリタ機能に外界をモニターする機能を持たせた。これが4004成功への鍵となった。

 プリンタからの同期用入力信号(図2のPAとPB)を基準タイミング信号として使い,キーボードとプリンタと演算を時分割して制御する方法を編み出した。すなはち,キーボード制御と演算,またはキーボード制御とプリンタ制御を組にして,常にキーボード制御を行える方式を考案した。

図2 プリンタのタイミングとキーボード制御/演算/プリンタ制御の関係(クリックすると拡大表示します)

 また,キーボード制御を,少ないメモリー容量と少ない汎用レジスタを使って,かつ高速に実行するために,マトリックスで組んだキーボードの入力情報をキー番号に容易にコード変換するキーボード用コード変換命令「KBP」を追加した。

 キーボードは,図3で示すように,マトリックス状に構成され,プログラムを使って右端の列から左方向へスキャンされる。スキャンしている列のキー情報はROMの入力ポートを介してアキュムレータに読み込まれる。次に,KBP命令を実行することにより,キー情報は1,2,3,または4に変換される。二つ以上のキーが同時に押されていると15に変換される。列の番号と行の番号を使ってキー番号が生成される。何でもない命令だが,プログラムで対処しようとすると,汎用レジスタの退避や復帰に思った以上にメモリーが必要となる。

図3 キーボード・ブロック図(クリックすると拡大表示します)

 キーボードのスキャン用と,プリンタ出力のバッファ用に,第4のLSIとなったシリアルデータをパラレルデータに変換する10ビットのスタティック型シフトレジスタである拡張出力ポート用LSI(SR)をファミリーLSIとして追加した。キーボードのキーロールオーバー機能を実現するためにシフトレジスタの出力が3~4個までORがとれるように仕様を決定した。もっともらしいシナリオを作って,ノイス博士と直接価格交渉し,価格は2ドル50セントとなった。その光景が今でも懐かしく鮮明に脳裏に浮かんでくる。

 5番目の問題点であった命令セットと性能とROM容量とプロセッサのトランジスタ数に関しては,まず,作成した各種プログラムに対して静的評価と動的評価を行うことにより,命令セットを決めた。

 ビット単位の情報を処理するには,ローテート命令が使いやすいので,シフト命令の代わりにローテート命令を採用した。さらに,キャリーの補数をとる命令を追加した。基本命令として,データ転送命令にはアキュムレータの内容を汎用レジスタにストアする命令しかなかった。データを汎用レジスタからアキュムレータへ読み込むには,まず,アキュムレータとキャリーをクリアし,次に,汎用レジスタの内容をアキュムレータに加算する,といった面倒な処理を要求された。

 そのため,ストア命令の代わりに,汎用レジスタからアキュムレータへ読み込む命令(LD)と交換する命令(XCH)を採用した。シフト命令とストア命令を使ってもプログラムは組めるが,プログラム容量を増大させ性能も低下させるような命令セットは受け入れられなかった。アキュムレータとキャリーに関する命令にアキュムレータとキャリーの両方をクリアする命令を追加した。条件分岐命令で使用できる条件は,アキュムレータの内容がゼロ,キャリーの内容がゼロ,外界の状態を調べるTEST入力信号のみとした。

 1969年10月14日に,マーケティングマネジャーのグラハムからビジコンの丹波技術部長にインテル案を採用する催促の手紙が送られた。手紙では,プリンタ付き電卓を実現するためには,ビジコン案では12個のLSIと46~58週間の開発期間と168,000ドルの開発費用,一方,インテル案では11個のLSIと32~42週間の開発期間と90,000ドルの開発費用,と両プロジェクトを比較していた。しかし,ビジコン案では無断で2個のROMが追加されており,インテル案ではデータ用RAMが1個分抜けて,タイミングLSIが残っていた。余程あせって手紙を書いたのだろう。

 一方,ビジコンは,第二次改善策の見通しが付いた10月21日に,パンチカードを使って応用プログラムが使える浮動小数点演算機能付き科学技術計算用電卓の仕様と4004を使ったシステム・ブロック図を添付し,インテル案の採用を正式に文書でインテルに通知した。

 手紙の日付を見ると,両社とも決断する時期に入っていた。渡米後4カ月を経過した。4004システム仕様の最終検討と,英文による製品の機能仕様書の作成を開始した。

 ミーティングは1969年12月16日まで継続的に行われた。インテルは最後まで,減算用の10進補正命令TCSとキーボード用コード変換命令KBPには懐疑的であった(次回につづく)。