2014.12.17

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

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第83回]


●レジスタモードとブレーク操作(2)

前回からの続きです。
前回はブレークしたあとのレジスタ名の表示にバグがありました。
今回はそのバグを直して再実行しました。
念のためアドレス8000から書いたプログラムを[RD+]で確認したあと[/][R]でレジスタモードにエントリしました。



前回と同様、[/][R][A]と入力してブレークアドレスレジスタを直接指定しました。
[8][0][0][C][Enter]と入力してブレークポイントを800Cに設定しました。
数値を入力して最後に[Enter]キーを押すと[WR+]と表示され、入力した数値が左側に表示されているレジスタバッファに入力され、レジスタの表示が進みます。
[/][0](ゼロ)と入力してレジスタモードを終了しました。

ここまで準備したあと、ユーザープログラムを実行します。
[8][0][0][0][.]([.]を入力すると[ADRSSET]に変換されます)と入力したあと、[R]でプログラムを実行しました。
ブレークポイントが800Cに設定されていますから、800Cでブレークしてそのときの値が表示されました。
今度はレジスタ名が正しく表示されました。

もう一度レジスタモードにエントリして、今度はブレークポイントを800Bに設定しました。



レジスタモードを終了したあと[N]を入力しました。
[N]は[CONT](Continue)の機能です。
TK−80の[RET](Return)と同じです。
ブレークして中断していたユーザープログラムの実行を、そのアドレスから再開します。
プログラムの実行が800Cから再開され、JMP $8009で8009に戻ったあと、新たに設定したブレークアドレス800Bでブレークしました。

ブレークしたあとブレークポイントを設定しないで、[N]キー([CONT])を入力すると、そのあとはブレークすることなく実行が続けられます。
このプログラム例ではエンドレス(無限ループ)になります。

800Cでブレークしたとき800Cの命令は未実行ですが、そこでまたブレークポイントに同じ800Cを指定すると、800Cの命令の実行前にブレークしてしまうため、先に進めません。
実行を再開したあと再びブレークさせるためには、今ブレーク中のアドレスの次の命令以降の命令の置かれているアドレスを指定します。
ブレークポイントは2バイト命令や3バイトの命令では第一バイトのアドレスにしか設定できません。
たとえば
800F C30980
の場合800Fにはブレークポイントが設定できますが、8010や8011に設定してはいけません(設定するとプログラムが正しく実行されません)。

●ソフトウェアブレーク

ここでブレークの仕組みについて簡単に説明をしておきましょう。
MYCPU80はディップスイッチを設定してハードウェアでステップ動作をさせることができます。
しかしリモートプログラムのブレーク操作ではハードウェアのステップ機能は使いません。
代わりにソフトウェアブレークのテクニックを使っています。
[brA]にアドレスを入力して[Enter]キーを押すと、そのアドレスに書かれている命令コードがワークエリアに保存され代わりにFFが書き込まれます。
FFはRST7命令です。
RST7はアドレスの0038をCALLする1バイトのCALL命令です。
0038にはブレーク処理プログラムへのJMP命令が書かれています。
ユーザープログラムが実行され、FFコードのところまで来るとRST7命令が実行される結果、ブレーク処理がおこなわれます。
そのようにソフトウェアブレークは指定したアドレスの命令をFFで書き換えることで機能しますから、RAMに書かれているプログラムにしか機能しません。

さてそれではブレーク操作の続きに戻ります。
ブレークしたあとのレジスタモードの利用の仕方です。
ブレークしたあと[/][R]でレジスタモードにエントリします。
今度もまた次のブレークポイントを設定しますが、さらにレジスタの値も書き換えてみます。



さきほどのようにブレークポイントだけを設定し直して[N]([CONT])で実行を再開した場合には、各レジスタの値はブレーク直前の値がそのまま使われます。
もしレジスタモードでレジスタの値を書き換えたあと[N]([CONT])でプログラムの実行を再開すると、そのレジスタには書き換えられた値が入れられて実行が再開されます。
その例として[BC]の値をブレーク前の90ACから1234に書き換えてみました。
ブレークアドレスは8009に設定しました。

実行が再開されたあと、8009でブレークしました。
実行が再開されてからブレークする前に800EのINX B(コード03)が実行されたため、BCレジスタの値は1235になっています。

下は上の画面のログです。

logfile mycpu80log\12162200.txt open
mzbdos2n2 2014.11.30 by Chunichidenko

MYCPU80に接続しました(9600bps)
0001 001A - 8000[ADRSSET]
8000 0021 - [RD+]
8001 2134 - [RD+]
8002 3412 - [RD+]
8003 1211 - [RD+]
8004 1178 - [RD+]
8005 7856 - [RD+]
8006 5601 - [RD+]
8007 01AB - [RD+]
8008 AB90 - [RD+]
8009 9079 - [RD+]
800A 7983 - [RD+]
800B 833C - [RD+]
800C 3C23 - [RD+]
800D 2313 - [RD+]
800E 1303 - [RD+]
800F 03C3 - [RD+]
8010 C309 - [RD+]
8011 0980 - /R
*** REGISTER mode entry ***
[ AF ] FFEA 2405 - /RA
[ brA] FFF0 0000 - 800C[WR+]
[ AF ] FFEA 2405 - /0

*** REGISTER mode end ***
FFEA 2405 - 8000[ADRSSET]
8000 0021 - R [RUN]
A F  B C  D E  H L   SP   PC  SZ H P C
2405 90AB 5678 1234 FF80 800C 00000101
800C 2405 - /R
*** REGISTER mode entry ***
[ AF ] FFEA 2405 - /RA
[ brA] FFF0 800C - 800B[WR+]
[ AF ] FFEA 2405 - /0

*** REGISTER mode end ***
FFEA 2405 - N [CONT]
A F  B C  D E  H L   SP   PC  SZ H P C
2511 90AC 5679 1235 FF80 800B 00010001
800B 2511 - /R
*** REGISTER mode entry ***
[ AF ] FFEA 2511 - [RD+]
[ BC ] FFE8 90AC - 1234[WR+]
[ DE ] FFE6 5679 - [RD-]
[ BC ] FFE8 1234 - [RD+]
[ DE ] FFE6 5679 - [RD+]
[ HL ] FFE4 1235 - [RD+]
[ SP ] FFE2 FF80 - [RD+]
[ PC ] FFE0 800B - [RD+]
[ brA] FFF0 800B - 8009[WR+]
[ AF ] FFEA 2511 - [RD-]
[ brA] FFF0 8009 - /0

*** REGISTER mode end ***
FFF0 8009 - N [CONT]
A F  B C  D E  H L   SP   PC  SZ H P C
2601 1235 567A 1236 FF80 8009 00000001
8009 2601 - ^E
0000 00C3 - 
リモート接続を終了しました
logfile closed at Tue Dec 16 22:13:38 2014

MYCPU80でCP/Mを![第83回]
2014.12.17upload

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