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

●ND80Zモニタのトレース機能

前回はZ80版TK80ボード(ND80ZH)のステップ機能とプリンタへのレジスタダンプ機能について説明をしました。
TK80モニタには通常のステップ動作だけではなくて、ブレイクアドレスとブレイクカウンタを設定して、指定したアドレスの命令を指定した回数実行したときに、そこではじめてブレイクして、それ以後ステップ動作をする、という機能があります。
ブレイク動作です。
もちろんND80Zモニタにも、TK80モニタと同じブレイク機能が備わっています。

ブレイク機能は、プログラムのはじめの部分はパスして、途中からステップ動作でプログラムの動きを知りたい、という場合に有効な機能です。
その一方で、途中のある範囲のプログラム動作を連続して確認したい、という場合も出てきます。
この場合にもその範囲を1ステップずつステップ動作で実行していく、という方法で確認する、ということも可能です。
実際TK80モニタの機能としては、そういう方法になります。

ND80Zモニタでは、前回説明したステップ動作でのプリンタ出力機能と同じように、ブレイク動作に対して、ブレイクするまでのプログラムが実行される様子をトレースして、プリンタにその間のレジスタダンプを連続して行うことができます。
トレース機能です。

この機能はZ80版TK80ボード(ND80ZH)にセントロニクスプリンタが接続されていることが前提になります。
そしてさらに、ブレイクアドレスとブレイクカウンタの設定も行われていることが条件になります。
そのうえで、前回のプリンタへのレジスタダンプ出力のON、OFFの設定と同じように、プリンタへのトレース出力のON、OFFの設定を行ってから、ディップスイッチのbSをONにして、ステップ動作モードにしておいてから、プログラムを実行させます。

今回のトレース機能も写真を使って説明をすることにします。
動作テストに使ったプログラムは前回のステップ動作のときと同じプログラムです。

8000 3E05    MVI A,05     …Aレジスタに05を入れる
8002 D640    SUI 40       …Aレジスタから40(=64)を引く
8004 C30280  JMP $8002   …8002にジャンプする

●トレースモードのON、OFF

プログラムの実行をトレースしながら、連続してプリンタにレジスタダンプ出力をさせるには、前回説明したステップ動作でのプリンタへのレジスタダンプと同じく、[第442回]で説明したI/Oモードを使います。
[*I/O]キーに続いてデータキーの[4]を押すと、トレース出力(ブレイクするまで連続してプリンタにレジスタダンプ出力を行う)をONにします。
キーのレイアウトはこちら([第442回])の写真を参照してください。
データキーの[4]は[*I/O]モードでは、[TRC]つまりトレース機能(トレースしながらプリンタへレジスタダンプ出力する)のON/OFF切り換えキーになります。

[*I/O]に続いて[4]([TRC])を押したところです。

FFD1はプリンタ制御用ワークレジスタアドレスです。
前回のステップ動作でのプリンタへのレジスタダンプ出力のONは、このアドレスのデータを01にすることでしたが、今回のトレース結果のプリンタ出力ONは、このアドレスのデータを81にすることで行われます。
7セグメントLEDのデータ表示部に81が表示されています。

なお、これも前回のトレースでのプリンタへのレジスタダンプ出力のON/OFFの切り換えと同じように、繰り返して、[*I/O]に続いて[4]([TRC])を押すと、トレース結果のプリンタ出力ON(データ表示部下位2桁が81)トレースOFF(データ表示部下位2桁が00)が交互に表示されます。

●ブレイクアドレスとブレイクカウンタのセット

ブレイクカウンタとブレイクアドレスをセットするには、[REG]キーを使います。
具体的な設定方法は[第444回]で説明をしました。
今回はブレイクアドレスとして8002を指定します。

[REG]に続いて[E]([BRA])を押すと、rAと表示され、ブレイクアドレスバッファが表示されます。
[8][0][0][2]と入力したところです。
このあと[WRITEINC]を押すとブレイクアドレスとして8002番地が設定され、ブレイクカウンタの設定に進みます。

ブレイクカウンタはrCの表示に対して入力を行います。
ここでは05(5回)を設定します。
[0][5]と入力したところです。
ブレイクカウンタは01〜FFの間の回数を設定できます。
このあと[WRITEINC]を押すとブレイクカウンタの値が確定されます。

[WRITEINC]を押して、表示順の次のAFレジスタが表示されたところです。
レジスタモードを終了するために、[REG]に続いて[0]を入力します。

ディップスイッチのbSがONになっていることを確認してから、プログラムの開始アドレスをセットします。

[8][0][0][0][ADRSSET]と入力したところです。

このあと[RUN]を押すと、プログラムが8000番地から実行開始され、8002番地の命令が5回実行されると、そこでブレイクします。


ブレイクするまでの途中の実行結果のレジスタダンプ出力がプリンタに対して行われます。

リストの右端の数値はブレイクカウンタの値です。

[追記]
リストの一番上の行は、[RUN]キーによってユーザープログラムの8000番地の命令、3E05(MVI A,05)が実行された直後の状態が印字されています。
[RUN]や[CONT]([RET])は、このときまでにレジスタバッファに退避されていた値を各レジスタに戻したあとユーザプログラムにジャンプする機能ですから、ここで印字されたレジスタの値は、今実行された命令の結果が印字されていますが、その命令によって変化しなかったレジスタの値は、レジスタバッファに退避されていた、それ以前のユーザープログラムの実行結果のレジスタの値がそのまま印字されます。
Aレジスタの値は、8000番地の命令、3E05(MVI A,05)が実行された結果、05になりますが、MVI命令はフラグを変化させないので、フラグの値は、前回行ったステップ動作の最後の結果がそのまま残っているので、それが印字されています。

Aレジスタの値は、8002番地のD640(SUI 40)が実行される度に、40(十進数では64)が引かれるので、05→C5→85→45→05と変化していきます。
それに伴って、フラグレジスタが変化していく様子もリストから確認することができます。

トレース機能の動作は、ステップ動作を自動で行うものです。
ステップ動作はブレイクアドレスとブレイクカウンタを設定しないときは[RUN]キーでスタートしたあと、最初の命令を実行すると、そこでブレイクしてモニタプログラムに戻ります。
[CONT]([RET])キーを押すと、ユーザープログラムに戻りますが、そこで次の1命令を実行すると、またブレイクしてモニタプログラムに戻ります。
ステップ動作で、ブレイクアドレスとブレイクカウンタが設定してあるときは、そのブレイクアドレスの命令を実行するたびにブレイクカウンタの値を−1していき、ブレイクカウンタが0になると、そこではじめてブレイクして、そのあとは通常のステップ動作になります。
ブレイクするまでは、普通に実行されているようですが、じつはそのときも1命令ごとにブレイクしてモニタプログラムに戻ってきているのです。
そのとき、ブレイクカウンタが設定してあると、そこでブレイクアドレスとPC(プログラムカウンタ)との比較が行われ、一致したときはブレイクカウンタの値を−1します。
もともとブレイクカウンタが0である場合(ブレイクカウンタが設定されていない場合)や−1した結果ブレイクカウンタの値が0になった場合には、そこでブレイクしたままモニタプログラムの通常のキー入力モードになります。
それ以外(つまりブレイクカウンタの値が0ではなかった場合)は、ここで自動的に[CONT]([RET])キーが押されたときと同じルーチンが実行されて、ユーザープログラムに戻ります。
この動作がブレイクカウンタが0になるまで、1命令実行するごとに繰り返し行われますから、見た目には、ブレイクするまでは普通に実行されたように見えますが、その間もブレイクしてレジスタをメモリバッファに退避したあと、ブレイクアドレスの比較などの処理を毎回行っていますから、その間の実行速度は通常の実行速度に比べて遅くなります(実行時間が数十倍かかります)。
トレース機能は、この毎回行われているブレイクのときに、プリンタに対してレジスタダンプ出力を行うようにしたものです。
2010.3.3upload
2010.3.4追記

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