Z80GALの構想(その9)簡易モニタの製作(その2)ブレーク機能の実装 [Z80]
「Z80GALの構想(その4)簡易モニタの製作」の記事で書いたように今回はZ80GALに移植したGAME言語を使って作成した簡易モニタを使ってプログラムをダウンロードしディバッグを行いました。
始めからブレーク機能を実装してディバッグに使えば良かったようなものですが、ブレーク機能無しでも今回の開発作業は問題ないと考えていました。
今回のプログラム開発で残りはIPLくらいしかありませんが、実装方法を考えるのが面白そうだったのでブレーク機能を追加してみました。
まずはモニタにおけるテスト対象プログラム実行時に期待する機能として、RET命令でモニタに戻ってきた際のレジスタの値などを確認する使い方と、ブレークポイントを設定して実行プログラムがブレークポイントに到達した時点でのレジスタ内容などを確認したい場合の二通りあるのではないかと思います。
また、いずれの場合もプログラム実行前にはレジスタの値を事前に設定したいものです。
今回は上記の2つの使い方に対応できるようにしました。それぞれの機能について以下に概要を説明します。
下記のサンプルプログラムを用いて、今回追加した機能についての概要を書いてみます。
文字でいろいろ書くよりも操作例を示した方が判り易いと思います。
ブレークを設定後に最初だけ「Gxxxx」コマンドで対象プログラムを実行し、ブレーク後は「G」コマンドで継続して実行しています。
最後にRET命令によりモニタに戻ってきますが、この場合、PCの値が不明(ステップ動作すれば判るようになるがそのためには命令長情報が必要になる)なのでPCの表示値は実行開始のアドレス値を表示するようにしました。
また、今回追加したレジスタ管理機能とブレーク設定/解除機能はいずれもマルチステートメント対応にしているで複数命令を一度に(場合によってはコピペで)実行可能です。
★変更 2011/11/22 操作例をアップデート
このような機能はGAME言語だけでは記述できないので上記の二通りの実行機能(GO:がブレーク用、GOxx:がRET時レジスタ確認用の実行開始モジュール)とモニタへリターン時のレジスタ格納処理(RSTENT:)をアセンブラで記述しました。
先頭のジャンプ命令とワークメモリアドレスはGAME言語とのインターフェース用です。
下のリストが今回機能追加したGAME言語のモニタ(Gamon)のソースです。GAME言語を移植できる環境があるのであれば、モニタの移植も容易だと思います。
★変更 2011/11/19
Ver0.03a "Gxxxx"と"G"の混在使用を可能にしました。
★追記 2024/02/28
GAMON の最新版は「GAME言語で作った簡易モニタ(Gamon)」の記事からダウンロードできます。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
始めからブレーク機能を実装してディバッグに使えば良かったようなものですが、ブレーク機能無しでも今回の開発作業は問題ないと考えていました。
今回のプログラム開発で残りはIPLくらいしかありませんが、実装方法を考えるのが面白そうだったのでブレーク機能を追加してみました。
まずはモニタにおけるテスト対象プログラム実行時に期待する機能として、RET命令でモニタに戻ってきた際のレジスタの値などを確認する使い方と、ブレークポイントを設定して実行プログラムがブレークポイントに到達した時点でのレジスタ内容などを確認したい場合の二通りあるのではないかと思います。
また、いずれの場合もプログラム実行前にはレジスタの値を事前に設定したいものです。
今回は上記の2つの使い方に対応できるようにしました。それぞれの機能について以下に概要を説明します。
- 実行プログラムリターン時のレジスタ確認機能
事前に任意のレジスタの値を設定して指定した番地からプログラムを実行し、RET命令でモニタに戻ってくる。
この場合にスタック上にはモニタへの戻り値を積んだうえで対象プログラムを実行します。
対象プログラムから戻ってきたら、その時点のレジスタを保存し、確認できるようにします。この戻り時の処理は次に述べるブレーク機能と同じ処理になります。
試験プログラムの実行方法としては「Gaaaa」になります(aaaaは開始アドレス)。
- ブレーク機能
試験対象プログラムの複数個所にブレークポイント(今回はRST 30H(F7H)を使用)を設定後、プログラムを実行し、ブレークポイントに達した時点でモニタに戻し、レジスタ内容の確認などができるようにする。
今回はブレークポイントを5個まで設定可能で、ブレークした時点で置き換えたF7Hのコードを元のコードに戻す(ブレークポイントを自動的にクリアする)ことで継続して試験プログラムを実行できるようにしました。
試験プログラムの実行方法はPC(プログラムカウンタ)に実行アドレスを設定後、「G」コマンドで試験対象プログラムを実行します。
下記のサンプルプログラムを用いて、今回追加した機能についての概要を書いてみます。
使用したサンプルプログラム |
---|
8000 32 800F LD (800FH),A 8003 3E 55 LD A,55H 8005 06 11 LD B,11H 8007 CD 8010 CALL 8010H 800A D9 EXX 800B C9 RET 800C 00 NOP 800D 00 NOP 800E 00 NOP 800F 00 NOP 8010 0E 22 LD C,22H 8012 21 1234 LD HL,1234H 8015 C9 RET |
文字でいろいろ書くよりも操作例を示した方が判り易いと思います。
ブレークを設定後に最初だけ「Gxxxx」コマンドで対象プログラムを実行し、ブレーク後は「G」コマンドで継続して実行しています。
最後にRET命令によりモニタに戻ってきますが、この場合、PCの値が不明(ステップ動作すれば判るようになるがそのためには命令長情報が必要になる)なのでPCの表示値は実行開始のアドレス値を表示するようにしました。
また、今回追加したレジスタ管理機能とブレーク設定/解除機能はいずれもマルチステートメント対応にしているで複数命令を一度に(場合によってはコピペで)実行可能です。
モニタでのブレーク操作例(水色:入力部) |
|
★変更 2011/11/22 操作例をアップデート
このような機能はGAME言語だけでは記述できないので上記の二通りの実行機能(GO:がブレーク用、GOxx:がRET時レジスタ確認用の実行開始モジュール)とモニタへリターン時のレジスタ格納処理(RSTENT:)をアセンブラで記述しました。
先頭のジャンプ命令とワークメモリアドレスはGAME言語とのインターフェース用です。
ブレーク処理用のアセンブラ記述部分(Z80アセンブラ) |
|
下のリストが今回機能追加したGAME言語のモニタ(Gamon)のソースです。GAME言語を移植できる環境があるのであれば、モニタの移植も容易だと思います。
Gamon(Game Monitor)ソース(GAME言語) |
|
★変更 2011/11/19
Ver0.03a "Gxxxx"と"G"の混在使用を可能にしました。
★追記 2024/02/28
GAMON の最新版は「GAME言語で作った簡易モニタ(Gamon)」の記事からダウンロードできます。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
コメント 0