標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第95回]

●INX命令とDCX命令

INX、DCXは16ビットレジスタBC、DE、HL、およびSP(スタックポインタ)の値を+1または−1する命令です。
命令コードは次の通りです。

命令コード(16進数)  ニーモニック    
    03          INX B
    13          INX D      
    23          INX H
    33          INX SP
    0B          DCX B
    1B          DCX D      
    2B          DCX H
    3B          DCX SP

8ビットレジスタの値を+1、−1する命令、INR、DCR命令については[第58回]で説明しました。
INR、DCR命令では8ビットのINRレジスタ回路を利用しました。
今回のINX、DCX命令も8ビットのINRレジスタを利用します。
今回は16ビットですから、最初に下位レジスタ8ビットの計算を行い、次に上位8ビットを計算します。
INRレジスタは下位レジスタの計算と上位レジスタの計算の2回利用します。

●INX命令、DCX命令のタイミングチャートです



INXとDCRは+1(increment)つまりカウント”UP”するか、−1(decrement)、カウント”DOWN”するかの違いだけで、回路は全く同じになります。命令コードのビット3(OP3)が0なら”UP”、1なら”DOWN”になります。
前半の下位8ビットの計算が済んだところで、上位ビットへのキャリー(ボロー)がなければ、上位8ビットは変化しませんから、その場合にはマシンクロックをクリアして、処理を終了します。
キャリーがある場合には、上位8ビットをINRレジスタに読み込んで上位8ビットの計算をします。

ところでSP(スタックポインタ)はわざわざ8ビットのINRレジスタに読み込んで上位、下位に分けて計算しなくても、SP(スタックポインタ)自身でカウントUP、カウントDOWNできるはずです。
SP自身でUP、DOWNさせれば簡単なのに、なぜ他のレジスタHL、DE、BCと同じことをしているのでしょうか?

タイミングチャートをよく見ていただくとわかるように、SPと他のレジスタとの処理の違いは、レジスタ指定のためのd3−d1、s3−s1が異なっているだけなので、SPだけ別にするよりも、同じ回路を通したほうがかえって簡単に済んでしまうからです。

s3−s0、d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。

●INX命令、DCX命令の回路図です



この回路のポイントは、回路図下部で、T8のときにINRcy=HならMclrをアクティブにするというところです(INRcyは、下位8ビットの計算でCarryが発生したときにLになる)。
Carryが発生しなかったときにはMclrがアクティブになって、処理が終了します。

INRcyはINR、DCRの回路図([第58回])の上の方でRSフリップフロップからの出力になっています。
ここでフリップフロップになっているわけは、上位8ビットの計算の結果、発生した上位8ビットへのキャリーを、上位8ビットのデータをINRレジスタに読み込むまで(少なくともT8の期間)保持しておくためです。
INRcy信号はINX、DCX回路でT8のときにMclrを発生させるかどうかを決めるためだけに使われます。実際に上位8ビットの計算のためのクロックパルスとしての意味はありません。
T8で処理が終了しなかったときは、T9で機械的にカウントUP(またはDOWN)されます。
2008.10.13upload

前へ
次へ
ホームページトップへ戻る