あなたCPUなんか創ってどうするのかしら?! 第2章 第8節

~あんたCPUなんか創ってどうするのよ?! Vol.4~

2019/4/14
技術書典6
池袋サンシャインシティ 文化会館ビル2F 展示ホールD「う11」

第2章 第8節 キャリーフラグの変更抑制

最後にキャリーフラグの変更抑制について説明します。

表1に示す通り、TD4EX4では加算命令または減算命令を実行した時だけキャリーフラグが変化し、それ以外の命令では変化しません。これは一般的なCPUと同じ動作です。

キャリーフラグの目的は、加算の場合は桁あふれ(オーバーフロー)、減算の場合は上の桁からの借り(ボロー)が発生したことを知らせることです。従ってキャリーフラグが意味を持つのは加算命令や減算命令を実行した時だけなので、それ以外の命令を実行した時はキャリーフラグが変化するべきではありません。

TD4の場合、キャリーフラグは全ての命令で変化してしまいます。そのためオーバーフローが発生したかどうかは加算命令の直後でないと調べることができません。ADD命令の直後にJNC命令を実行する必要がある訳です。

TD4EX4では演算命令以外ではキャリーフラグは変化しませんので、プログラムを書く上での自由度が増しています。例えば加算を実行した時に、結果をRAMに格納してから条件ジャンプ命令を実行することができます。多少なりとも効率の良いプログラムを書くことができます。

以下の例は電卓プログラムからの抜粋です。Aレジスタを使って加算を行った後、結果をRAMに格納し、さらに繰り上げの有無をBレジスタに保存するために、Bレジスタの初期化を行った後で条件ジャンプ命令を実行しています。

数式12 加算時の繰り上げの判別の例

ADD2:MOVA[7]; 符号なし2桁加算
 ADDA[4] 
 MOV[7]A 
 MOVB0; 繰り上げ無
 JNCADD2A  
 MOVB1; 繰り上げ有
ADD2A:    

一般的なCPUの場合、キャリーを含めた加減算命令(ADC命令やSBC命令)をサポートしていることが多いため、不必要な場合にはキャリーを変更しないことが非常に重要です。
キャリーフラグの変更抑制は、フリップフロップに供給されるクロックを停止することで行っています。

表3をご覧いただくと、設計初期のTD4EX4ではbit6が0の時に加算命令や減算命令を実行します。従ってキャリーフラグはbit6が0の時だけ変更すれば良く、簡単に実現できる筈でした。ところがRAMへの書き込み命令を命令コードの1010と1011に割り当てる事になったため、bit6だけでは制御できなくなり、以下に示す論理式が必要になりました。

数式13 キャリーフラグの変更許可
キャリーフラグ変更許可 = bit7 AND (NOT bit6) AND bit5

この信号とCLOCKとの論理積(AND)をとり、キャリーフラグ用フリップフロップである74HC74に供給すれば出来上がりです。

写真5 ドッグフードを食え!
写真5 ドッグフードを食え!