CPUの引き算命令では、ボローフラグが使用されており、大概、キャリーフラグで代用されます。6800では、「ボロー有り」の時にキャリーフラグが1になります。ところが、6502の場合には、「ボロー有り」の時にキャリーフラグが0になります。この違いは、どこから来たのでしょうか。

ボローの存在

小学校の算数で筆算により引き算を行う時、被減数(引かれる数:minuend)が減数(引く数:subtrahend)よりも大きいときには、上の桁から10借りてきます。CPUでも同じように上の桁に借りを作ることがあり、「ボロー」(借り:borrow)と呼んでいます。

ボローは、上の桁に「借りた・借りていない」という二者択一の1ビットの情報で表現することができます。そこで、多くの場合、足し算において「上の桁への繰り上がり」を表現するためのキャリーフラグで代用されます。

Motoloraの6800やIntelの8080の場合、「借りた」場合には、キャリーが1に設定されます。一方、MOS Technologyの6502の場合、「借りた」場合には、キャリーが0に設定されます。この違いは、なぜ、現れるのでしょうか。その理由は、ALU(算術論理演算ユニット:Arithmetic Logic Unit)の設計に関わってきます。

ALUを作ってみよう

一般的なCPUの場合、足し算を行う命令と引き算を行う命令が装備されています。そこで、ここでは、足し算と引き算だけを行う簡単なALUの設計を例に取り上げて、具体的に理由を探っていきます。ここで設計するALUは、2つの8ビット入力(x[7:0]、 y[7:0])の和と差を計算する装置です。

和と差を計算するALU

和と差の結果は、8ビットの出力(s[7:0])となります。他にキャリー入出力(Cin、 Cout)とボロー入出力(Bin、 Bout)を追加して、もっとビット数の大きな計算にも対応します。また、「和を計算するか、差を計算するか」という計算内容を指示するための入力(f)もあります。

安易な実装

入力"f"に従って、計算内容を切り替えるように作ればよいのだから、以下のような実装にすると解決できそうです。

安易な実装によるALU

2つの入力を持つ足し算回路と引き算回路を用意し、入力"f"によって出力を切り替えます。確かに簡単です。論理合成も通ることでしょう。ところが、この回路の場合、足し算回路と引き算回路が同時に使われることがありません。そのため、実装した回路のうち、半分しか使用されないという、実にもったいない構成になってしまいます。

なぜ、この構成ではもったいないのか。それは、引き算回路の実現方法に原因があります。