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

●ND80Zモニタのステップ動作とプリンタ出力

今回もZ80版TK80ボード(ND80ZH)のモニタ機能の説明です。
ND80Zモニタのステップ機能はTK80のステップ機能と同じ動作をします。
しかしND80Zモニタのステップ機能には、さらにプリンタ出力の機能が付け加えられています。

ND80ZHのプリンタコネクタに、セントロニクスプリンタ(MSDOS時代のプリンタ)を接続して、「プリンタへのレジスタ出力可」の設定にしたうえで、ステップ操作をすると、命令を1ステップずつ実行するたびに、7セグメントLEDにアドレスやAFレジスタの値を表示するとともに、プリンタにそのときの全CPUレジスタの値がプリントアウトされます。

また写真で説明をすることにしましょう。
ステップ動作の様子を確認するために簡単なプログラムをメモリに書きました。

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

たったこれだけの簡単なプログラムです。
フラグが変化する様子も見たいのでSUI命令を使ってみました。

●プリンタへのレジスタダンプON

プリンタへのレジスタダンプ出力をONにするには、[第442回]で説明したI/Oモードを使います。
[*I/O]キーに続いてデータキーの[0]を押すと、プリンタへのレジスタダンプ出力がONになります。
キーのレイアウトはこちら([第442回])の写真を参照してください。
データキーの[0]は[*I/O]モードでは、[PR(REG)]つまりレジスタのプリンタ出力のON/OFF切り換えキーになります。

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

FFD1はプリンタ制御用ワークレジスタアドレスです。
7セグメントLEDのデータ表示部に表示された01は、プリンタ出力ONの表示です。

繰り返して、[*I/O]に続いて[0]([PR(REG)])を押すと、プリンタON(データ表示部下位2桁が01)とプリンタOFF(データ表示部下位2桁が00)が交互に表示されます。
もう一度[*I/O]に続いて[0]([PR(REG)])を押したところです。

データ表示部下位2桁が00になりました。
このときはプリンタを接続していても、プリンタにレジスタダンプ出力は行われません。
リセット直後はこの状態になります。

今回はレジスタダンプがプリンタに出力される様子を見たいので、もう一度[*I/O]に続いて[0]([PR(REG)])を押して、レジスタダンプのプリンタ出力ONにします。


●ステップ動作開始

ディップスイッチのbSをONにすると、ステップ機能がONになります。
ディップスイッチの写真はこちら([第444回])にあります。

ステップ機能をONにしたら準備完了です。
[8][0][0][0][ADRSSET]と入力してプログラムの開始アドレスをセットします。

この状態で[RUN]キーを押すと、8000番地からのユーザプログラムが実行されます。
ステップ機能がOFFのときはそのままユーザプログラムが実行され続けられますから、今回のテストプログラムの場合には「無限ループ」なのでリセットされるまで実行を続けます。
今回はディップスイッチのbSをONにしてステップ機能がONになっていますから、8000番地の命令を実行するとすぐにブレイクしてモニタに戻ってきます。

8000番地の3E05(MVI A,05)を実行した直後にブレイクしてモニタに戻ったところです。

7セグメントLEDのアドレス表示部には次の命令の実行アドレス8002が表示され、データ表示部の上位2桁にはAレジスタの値05が表示され、下位2桁にはF(フラグレジスタ)の値が表示されています。
ここまではTK80の場合と同じなのですが、このとき、プリンタにはCPUの全レジスタの値が下のように出力されます。



[CONT]キーを押しました。

[CONT]キーはTK80の[RET]キーと同じです。
[CONT]キーを押すと、ブレイクしたアドレスからユーザープログラムの実行が再開されます。
ステップ機能がONになっていますから、8002の命令D640(SUI 40)を実行すると、直後にブレイクしてモニタに戻ります。
7セグメントLEDのアドレス表示部には次の実行アドレス8004が表示されています。
Aレジスタの値05に対してSUI 40が実行された結果、05−40=C5なので、データ表示部の上位2桁にはC5が表示され、下位2桁にはF(フラグ)レジスタの値83が表示されています。

フラグレジスタが83と表示されても、そのままでは何のことだかわかりませんが、同時にプリンタ出力されるレジスタダンプリストには、右端にフラグレジスタの各ビットが出力されていますから、それを見るとフラグの状態を簡単に知ることができます。



S(サイン)フラグとC(キャリー)フラグがONになっていることがわかります。

続いて[CONT]を押しました。

アドレス8002に戻りました。JMP命令が実行されただけなのでまだレジスタの値は変化していません。
下はプリンタ出力です。


[CONT]を押しました。

また8002番地の命令D640(SUI 40)が実行されて、Aレジスタの値は、C5−40=85になりました。
今回の計算ではC(キャリー)フラグはOFFになります。
85は負数なので、まだS(サイン)フラグはONになっています。


[CONT]を押しました。

またアドレス8002に戻りました。JMP命令が実行されただけなのでまだレジスタの値は変化していません。


[CONT]を押しました。

8002番地の命令D640(SUI 40)が実行されて、Aレジスタの値は、85−40=45になりました。
今回の計算ではS(サイン)フラグもC(キャリー)フラグもOFFになります。


今回はPフラグがONになっています。
Z80では、ADD、SUBなどの算術演算の結果のフラグでは、Pフラグはパリティフラグではなくてオーバーフローフラグです。
負数である85から正数の40を引いたのに結果が正数の45になってしまうので、オーバフローフラグがONになるのです。
8ビットの符号付数の最小値は80(十進数の−128)なので、85(−123)からは40(64)は引けません。
ですからオーバフローフラグがONになります。
この連載記事を途中から読み始められた方で、今説明した2進数(16進数)の正数と負数についてのところが、どうもよくわからないなあ、と感じられた方はこちら([第14回])にその説明がありますので、参考になさってください。
2010.3.2upload

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