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

●CALL、RETを使ったテストプログラムです

前回、PUSH、POPを使ったテストプログラムによって、スタック操作に問題がないことは確認できましたので、もう少しましなテストプログラムを作ってみることにしました。
今度は、CALL命令とRET命令のテストをしてみます。
CALL命令とRET命令を使って、サブルーチンが使えるようになると、いかにもプログラムという感じになってきます。

0000 310000   LXI SP,0000
0003 3E00     MVI A,00
0005 210000   LXI H,0000
0008 110000   LXI D,0000
000B 3C       INR A    (4)
000C CC2000   CZ 0020  (4 or 9)
000F C30B00   JMP 000B (6)

0020 2C       INR L   (4)
0021 C0       RNZ    (2 or 4)
0022 24       INR H   (4)
0023 C0       RNZ    (2 or 4)
0024 1C       INR E   (4)
0025 C0       RNZ    (2 or 4)
0026 14       INR D   (4)
0027 C9       RET    (4)

CZは条件CALL命令です。それ以前の命令の実行の結果、Zフラグが立っているときに、サブルーチンをCALLします。Zフラグが立っていなければ、何もしないで、次の命令の実行に移ります。
RNZは条件RETURN命令です。Zフラグが立っていなければ、メインプログラムに戻ります(returnします)。Zフラグが立っていれば、何もしないで、次の命令の実行に移ります。
RETは無条件でメインプログラムに戻ります。

CALL命令(条件CALL命令も同じ)は、この命令の次のアドレスをスタックに格納してから、サブルーチンにジャンプします。
RET命令(条件RET命令も同じ)は、スタックからメインプログラムの戻り先のアドレスを取り出して、PC(プログラムカウンタ)にセットします。その結果、サブルーチンからメインプログラムに実行が移されます。

このテストプログラムは、Aレジスタを00〜FFまでincrement(インクリメント、+1)します。結果が00でないときは、CZ命令は実行されませんから、次のJMP命令によって、また000Bに戻ってINR Aが実行され、それを繰り返します。
結果が00のときは、0020のサブルーチンがCALLされます。

0020のサブルーチンではINR Lによって、Lレジスタが00〜FFまでインクリメント(+1)されます。結果が00でないときは、RNZが実行され、そのままメインルーチンに戻ります。
結果が00のときは、次のINR Hが実行され、Hレジスタがインクリメント(+1)されます。その結果が00でないときは、そこでRNZが実行され、メインルーチンに戻ります。
結果が00のときは、さらにその次のINR Eが実行されます。
そのようにして、順次、A、L、H、E、Dレジスタがインクリメントされていきます。
これは基本的に[第148回]で使ったテストプログラムと同じ動作を、サブルーチンを使って実行するようにちょいと変形したものです。
Aが最下位8ビットでDが最上位8ビットになるように、8ビツトのバイナリカウンタを5個、直列につないだのと同じ動作となります。

プログラムリストの命令の後ろに( )で示した数字は、その命令の実行時間です(単位μs)。
INR命令とJMP命令については、[第148回]で説明をしました(そこではJNZ命令でしたが、条件成立時の実行時間がJMP命令と同じになります)。
CZ、RNZ、RET命令の実行時間を確認するために、それぞれのタイミングチャートを見てみることにします。

●CZ命令の実行時間

CZ命令のタイミングチャートは[第97回]にありますが、かなり時間が経ってしまいましたから、再掲することにいたします。



CLOCKが4MHzになっていますが、現在はその半分の2MHzです。
CZ命令は、条件が成立したときは、T0〜T17の18クロックです。
1クロックは0.5μsですから、実行時間は0.5×18=9μsになります。
条件が不成立のときは、T0〜T7の8クロックになります。
このときの実行時間は、0.5×8=4μsです。

ちなみに8080の場合、条件CALL命令のクロック数は、条件が成立したときは17クロックで、条件が不成立のときは11クロックです。

●RZ命令、RET命令の実行時間

RZ命令、RET命令のタイミングチャートは[第98回]にありますが、かなり時間が経ってしまいましたから、再掲することにいたします。



CLOCKが4MHzになっていますが、現在はその半分の2MHzです。
RET命令および条件が成立したときのRX命令は、T0〜T7の8クロックです。
1クロックは0.5μsですから、実行時間は0.5×8=4μsになります。
条件が不成立のときは、T0〜T4の4クロックになります。
このときの実行時間は、0.5×4=2μsです。

ちなみに8080の場合、条件RET命令のクロック数は、条件が成立したときは11クロックで、条件が不成立のときは5クロックです。

●テストプログラムの実行時間

最初にAレジスタが00〜FFまで256カウントされるまでの時間を計算してみます。
000B〜0011の、INR、CZ、JMP命令が256回繰り返されます。CZ命令は、255回は条件が不成立ですから4μsですが、1回は条件が成立しますから、9μs(つまり+5μs)になります。
これを計算すると
(4+4+6)×256+5=3589μs
になります。

A=00になって、CZが実行されると、それによって0020からのサブルーチンが1回実行されます。
このサブルーチンではINR Lが実行されて、Lレジスタが+1されます。
Lレジスタが00〜FFまで256カウントされる間、INR L命令とRNZ命令も256回実行されます。
さきほどの、Aレジスタが256回実行されるたびに、INR LとRNZが1回実行されますから、その時間もさきほどの計算結果に加算します。
3589+4+4=3597μsです。

この計算結果をもとにして、Lが00〜FFまで256カウントされるまでの時間を計算してみます。
RNZについては255回は4μsですが、1回は条件が不成立なので2μsになります(つまり、このときだけ、−2μs)。
これを計算すると、
3597×256−2=920830μs
になります。

上の計算で求めた、920830μsごとに、その次の命令、INR HとRNZが1回実行されます。
したがって、Hレジスタが+1されるための実行時間は、
920830+4+4=920838μs
になります。

このHレジスタや、それより上位の、Eレジスタも256カウントのうち1回だけは2μsだけ、実行時間が短くなりますが、もうそのあたりになると、誤差の範囲になりますから、無視してしまっても、計算結果にほとんど影響はありません。

次回はいよいよこのテストプログラムを実行して、計算結果と照合してみることにいたします。
2009.2.5upload

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