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

●論理演算命令(AND、OR、XOR)のクロック毎の動作の写真です

今回は、前回232CでパソコンからLOADした論理演算命令のテストプログラムをマシンクロック毎にステップ動作させて、その写真を撮りました。
論理演算命令のテストプログラムは[第182回]にありますが、もう一度、プログラムリストをお見せします。



回路の説明([第179回])のところでも説明しましたように、AND、OR、XORの回路はほとんどが共通の回路を使います。最終段で、結果をAレジスタに書き込むときに、どの回路の74HC244ゲートを開くかが異なっているだけです。
ANDとORとXORとで演算の値を変えるよりも、同じ値で結果がどう異なるかを見る方がわかりやすいかと思います。
それにともなって、フラグがどのように変化するのかも見たいと思います。
演算の対象になる値があるのが、レジスタなのか、メモリなのか、それとも定数なのか、という違いはそれぞれテストしたいところです。
そこでプログラムリストを見ればわかるように、どの命令も、91とF0との間の演算を行うようにしてあります(最後のANA MとXRA Aは値が少し違います)。
91とF0にしたことには、それほど深い理由はありません。演算の結果が奇数になったり偶数になったり、あるいは正数になったり負数になったりすることが期待できるという理由でてきとうに選びました。

最初は0000番地のJMP命令のT0の写真です。
[第182回]に説明しましたように、0000番地からトグルスイッチをパチパチさせてメモリに書き込んだプログラムは終りがありません。いつまでも、受信データをひたすら待ちつづけて、同じところをグルグルと永久に回りつづけます。
こういうプログラムを「無限ループ」と言います。
で、HLレジスタのLED表示を見ていて、受信が完了して、HLのLED表示が停止したら、メモリ書き込みモードにして、0000番地の値としてC3を書き込みます。
C3はJMP命令の命令コードです。

0000〜0002には、210001という命令が書かれていました。
LXI H,0100
です。
その0000の値をC3に直すと、
JMP 0100
になります。

こうすることで、リセットすると、最初にこのJMP命令が実行されるため、0100からのメモリにロードされた、AND、OR、XORのテストプログラムが実行されることになります。



JMP命令は今までに何回もでてきていますから、ここはこの写真だけで、その次の命令に行くことにします。
JMP 0100の実行の結果、PC(プログラムカウンタ)には0100がセットされ、0100に書かれている、MVI A,91が実行されます。

MVI命令の写真も以前にお見せしています。
ですから、これも省略することにしましょう。
その次はいよいよANI命令です。
0102番地のE6F0(ANI F0)です。

ANI命令のT0の写真です。



ここまでに実行された、MVI A,91命令によって、Aレジスタには91が書き込まれています。
Aレジスタは上から3列目の右端にあります。写真ではちょうど中央あたりに写っています。
各命令のT0〜T3は同じですから、それも省略して、次は、いつものようにT4の写真からお見せすることにします。

ここからはタイミングチャートを見ながら確認する方がわかりやすいと思います。
タイミングチャートも回路図と同じ[第179回]にありますが、もう一度、お見せすることにします。


ANI F0命令の、T4の写真です。



Aレジスタから91が内部データバスに読み出され、ALUの”A”レジスタに書き込まれています。
Aレジスタの左にある、AregRD(黄LED)が点灯しています。
内部データバスは写真では一番下の真中あたりに見えます。
その少し右上にあるのはOPコードレジスタです。ANI命令のOPコードE6がラッチされています。
その列の右端にあるのは、Tクロックを表示する5ビットのLEDです。

ALUの”A”レジスタは上から2列目の左端にあります。
ALUの”A”レジスタの左にある、ALU”A”regWR(緑LED)が点灯しています。

このとき、ALUの”A”レジスタの右にある、”B”レジスタの値はまだ書き込まれていなくて、たまたま00になっています。
ALU演算回路は、クロックに関係なく、そのときのALU”A”レジスタとALU”B”レジスタとの間の演算を瞬時に行って、その結果を常に表示しています。
ALU”B”レジスタのさらに右側(やや右上)には、AND、OR、XOR、ADDの各演算の結果が表示されています。
91と00との間のANDは00です。ORとXORとADDはいずれも91になります。

ANI F0命令のT5の写真です。



ALU”A”regWR(緑LED)が消灯しました。

ANI F0命令のT6の写真です。



メモリアドレス0103からF0が内部アドレスバスに読み込まれています。
外部アドレスバスA15〜A8は、下の列の左端で、その右は同じくA7〜A0です。PC(プログラムカウンタ)の値の0103を表示しています。PC(プログラムカウンタ)はその上の列の右側にあります(左からWKHレジスタ、WKLレジスタ、PCH、PCL)。

外部アドレスバスの右は外部データバスD7〜D0です。メモリアドレス0103の値、F0が読み出されて表示されています。
内部データバスに読み込まれたF0は、ALU”B”レジスタに書き込まれていて、ALU”B”レジスタもF0になりました。
ALU”B”レジスタの左側にあるALU”B”regWR(緑LED)が点灯しています。

ALU”A”レジスタとALU”B”レジスタの演算結果はただちに表示されます。
91とF0のANDは90、ORはF1、XORは61になり、ADDは81になります。

ANI F0命令のT7の写真です。



ALU”B”regWR(緑LED)が消灯しました。

ANI F0命令のT8の写真です。



AND回路のLED表示の左側にある、AndRD(黄LED)が点灯して、ANDの結果(90)が内部データバスに出されています。
Aレジスタの右側にあるAregWR(緑LED)が点灯して、Aレジスタに内部データバスの値、90が書き込まれています。

フラグレジスタ(一番上の列の左から2番目)は、左端のS(サイン)フラグが点灯、その右のZ(ゼロ)フラグが消灯、その右のH(ハーフキャリー)フラグが消灯、その右のP(パリティ)フラグが点灯、右端のC(キャリー)フラグが消灯しました。

ANI F0命令のT9の写真です。



AregWR(緑LED)が消灯しました。
PC(プログラムカウンタ)の右側のPCclk(緑LED)が点灯しました。
PCはT9の終りのタイミングで+1されます。

ANI F0命令のT10(次の命令のT0)の写真です。



T10は一瞬で終了し、次の命令のT0になります。

PC(プログラムカウンタ)は+1されて0104になりました。
PCの値が外部アドレスバスに出力されています。
外部データバスにはメモリアドレス0104の値(次の命令コード3E)が出力されています。

次の命令のMVI A,91はさきほど実行した命令と同じなので、ここは省略することにします。
その次の命令は、MVI B,F0です。
これも同じ動作ですから、省略することにします。
次は、0108のORA B命令です。

ORA B命令のT0の写真です。



上から3列目、左からD、E、B、C、Aレジスタです。
BレジスタにはF0が、Aレジスタには91が入っています。

ORA B命令の実行によって、Aレジスタの値がALU”A”レジスタにセットされ、Bレジスタの値がALU”B”レジスタにセットされます。
先ほど実行したANI F0までの命令によって、ALU”A”レジスタには91が、ALU”B”レジスタにはF0がすでにセットされています。
セットされる値も同じなら、演算の様子も同じなので、途中は省略することにします。
念のために、BレジスタからALU”B”レジスタに値がセットされるところだけは、見てみることにします。

ORA B命令のT6の写真です。



Bレジスタの左側にあるBregRD(黄LED)が点灯しています。
内部データバスにはBレジスタの値F0が読み出されています。
またALU”B”レジスタの左にあるALU”B”regWR(緑LED)が点灯しています。
それらによって、Bレジスタの値がALU”B”レジスタに書き込まれていることがわかります。

ORA B命令のT8の写真です。



OR回路のLED表示の左側にある、OrRD(黄LED)が点灯して、ORの結果(F1)が内部データバスに出されています。
Aレジスタの右側にあるAregWR(緑LED)が点灯して、Aレジスタに内部データバスの値、F1が書き込まれています。
フラグレジスタは、左端のS(サイン)フラグが点灯、その他のZ(ゼロ)フラグ、H(ハーフキャリー)フラグ、P(パリティ)フラグ、C(キャリー)フラグが消灯しました。

ORA B命令のT9の写真です。



AregWR(緑LED)が消灯しました。

ORA B命令のT10(次の命令のT0)の写真です。



T10は一瞬で終了し、次の命令のT0になります。

PC(プログラムカウンタ)の値0109が外部アドレスバスに出力されています。
外部データバスにはメモリアドレス0109の値(次の命令コード3E)が出力されています。

次の命令のMVI A,91はさきほど実行した命令と同じなので、ここは省略することにします。
その次の命令は、XRA Bです。

XRA B命令のT0の写真です。



演算の過程はさきほどのORA B命令と同じですから、結果をAレジスタに格納するところの前までは、省略します。

XRA B命令のT8の写真です。



XOR回路のLED表示の左側にある、XorRD(黄LED)が点灯して、XORの結果(61)が内部データバスに出されています。
Aレジスタの右側にあるAregWR(緑LED)が点灯して、Aレジスタに内部データバスの値、61が書き込まれています。
フラグレジスタは、全部消灯しました。

XRA B命令のT9の写真です。



AregWR(緑LED)が消灯しました。

XRA B命令のT10(次の命令のT0)の写真です。



T10は一瞬で終了し、次の命令のT0になります。

PC(プログラムカウンタ)の値010Cが外部アドレスバスに出力されています。
外部データバスにはメモリアドレス010Cの値(次の命令コード21)が出力されています。

次の命令はLXI H,$0200です。
LXI命令も、その動作の写真はすでに紹介していますから、ここは省略することにします。
その次の命令は、MVI M,F0です。
MVI M命令も紹介済みですから、ここも省略します。
次の命令は0111のANA Mです。

ANA M命令のT0の写真です。



演算の過程はさきほどまでとは少し変わります。
Aレジスタの値は、さきほどのXRA B命令の実行の結果、61になりました。
この61と、MVI M命令によって、メモリアドレス0200に書き込まれたF0との間の演算が行われます。
ALU”A”レジスタには61が書き込まれ、ALU”B”レジスタには現在と同じF0が、メモリの0200からの値として書かれます。

ANA M命令のT6の写真です。



メモリアドレス0200から、その値のF0が内部アドレスバスに読み込まれています。
外部アドレスバスA15〜A8、A7〜A0には、HLレジスタの値の0200を表示しています。HLレジスタは下から3列目の左側にあります(左からHレジスタ、Lレジスタ)。
外部データバスD7〜D0には、メモリアドレス0200の値、F0が読み出されて表示されています。

内部データバスに読み込まれたF0は、ALU”B”レジスタに書き込まれています。
ALU”B”レジスタの左側にあるALU”B”regWR(緑LED)が点灯しています。
ALU”A”レジスタとALU”B”レジスタの演算結果はただちに表示されます。
61とF0のANDは60、ORはF1、XORは91になり、ADDは51になります。

ANA M命令のT7の写真です。



ALU”B”regWR(緑LED)が消灯しました。

ANA M命令のT8の写真です。



AND回路のLED表示の左側にある、AndRD(黄LED)が点灯して、ANDの結果(60)が内部データバスに出されています。
Aレジスタの右側にあるAregWR(緑LED)が点灯して、Aレジスタに内部データバスの値、60が書き込まれています。
フラグレジスタは、右から2番目のP(パリティ)フラグだけが点灯、その他のフラグは消灯しました。

ANA M命令のT9の写真です。



AregWR(緑LED)が消灯しました。

ANA M命令のT10(次の命令のT0)の写真です。



T10は一瞬で終了し、次の命令のT0になります。

PC(プログラムカウンタ)の値0112が外部アドレスバスに出力されています。
外部データバスにはメモリアドレス0112の値(次の命令コードAF)が出力されています。
次の命令はXRA Aです。

XRA命令はさきほどXRA B命令のところで、動作を確認しました。
今回はALU”A”レジスタだけではなくて、ALU”B”レジスタにもAレジスタの値が入るところだけが異なっています。

XRA Aは、Aレジスタをクリアし、さらにC(キャリー)フラグもクリアしたいときに、よく用いられます。
なおAレジスタはそのままの値を維持したままで、C(キャリー)フラグだけをクリアしたいときには、ORA Aを使います。

Aレジスタの値は、さきほどのANA M命令の実行の結果、60になりました。
この60が、ALU”A”レジスタとALU”B”レジスタにセットされる結果、同じ60同士の演算が行われます。
演算の過程はXRA Bのときと同じですから、今回は結果をAレジスタに格納するところの前までは省略することにします。

XRA A命令のT8の写真です。



60同士の演算の結果、ANDは60、ORも60、XORは00になり、ADDはC0になっています。
XOR回路のLED表示の左側にある、XorRD(黄LED)が点灯して、XORの結果(00)が内部データバスに出されています(00ですから全消灯です)。
Aレジスタの右側にあるAregWR(緑LED)が点灯して、Aレジスタに内部データバスの値、00が書き込まれています。
フラグレジスタは、左から2番目のZ(ゼロ)フラグと、右から2番目のP(パリティ)フラグが点灯し、その他のフラグは消灯しました。

XRA A命令のT9の写真です。



AregWR(緑LED)が消灯しました。

XRA A命令のT10(次の命令のT0)の写真です。



T10は一瞬で終了し、次の命令のT0になります。
2009.3.15upload

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