6809でオリジナルモニタ(2) [6809]
前回は6801用モニタをニーモニック変換等でとりあえず動くようにしたが、その状態では起動はするがまともには動作しない。
1.変更点はモニタコマンドとしては以下の3つ。
(1)Rコマンド
レジスタ表示/編集コマンドは6809で追加されたレジスタも表示/編集できるように修正。
(2)Bコマンド
ブレークポイントコマンド、というよりブレーク後の動作はレジスタ追加にともないスタックが違うので対応。
(3)Gコマンド
実行コマンドはブレークポイントと関連があり、レジスタを全プッシュしてRTIでユーザプログラムへ分岐させているのでブレーク動作と同様に修正。
RTIはIRQとFIRQを判別するためCCRのEビットをチェックする。CCRをスタックにプッシュする前にEビットをたてておく。
2.その他変更点
USB-シリアル変換等に使っているPICは10ms間隔で短パルスをだしていて、6809ボードはそれをFIRQに受けている。したがってFIIRQをシステムタイマとして使用。実際の処理は他のタイマ対応ボードと同様に、内部カウンタをカウントアップするだけ。
FIRQを使用するにはコンディションコードレジスタのFビットをクリア。
3.簡単なテストプログラム。
各レジスタの値を変更して終了するだけのプログラムを作成。
Lで読み込んでGで実行し、モニタ復帰時に表示されるユーザプログラム終了時レジスタの値がセットした値と一致するか?
一致しているのでだいたい動作している模様。
その他、6809らしくプログラムを書き換えようかと思ったが、元々の6800用から6801用変更時にもそのままにしている部分も多く、面倒くさいのでとりあえずおいといて気が向いたら変更していこうかと思う。
一応、C言語でいうところのmemcpyとかstrcpyみたいな内部ルーチンがあって、そういうブロック転送的なところにはX以外にYレジスタを使うよう変更してみた。
1.変更点はモニタコマンドとしては以下の3つ。
(1)Rコマンド
レジスタ表示/編集コマンドは6809で追加されたレジスタも表示/編集できるように修正。
(2)Bコマンド
ブレークポイントコマンド、というよりブレーク後の動作はレジスタ追加にともないスタックが違うので対応。
(3)Gコマンド
実行コマンドはブレークポイントと関連があり、レジスタを全プッシュしてRTIでユーザプログラムへ分岐させているのでブレーク動作と同様に修正。
RTIはIRQとFIRQを判別するためCCRのEビットをチェックする。CCRをスタックにプッシュする前にEビットをたてておく。
2.その他変更点
USB-シリアル変換等に使っているPICは10ms間隔で短パルスをだしていて、6809ボードはそれをFIRQに受けている。したがってFIIRQをシステムタイマとして使用。実際の処理は他のタイマ対応ボードと同様に、内部カウンタをカウントアップするだけ。
FIRQを使用するにはコンディションコードレジスタのFビットをクリア。
3.簡単なテストプログラム。
各レジスタの値を変更して終了するだけのプログラムを作成。
Lで読み込んでGで実行し、モニタ復帰時に表示されるユーザプログラム終了時レジスタの値がセットした値と一致するか?
一致しているのでだいたい動作している模様。
その他、6809らしくプログラムを書き換えようかと思ったが、元々の6800用から6801用変更時にもそのままにしている部分も多く、面倒くさいのでとりあえずおいといて気が向いたら変更していこうかと思う。
一応、C言語でいうところのmemcpyとかstrcpyみたいな内部ルーチンがあって、そういうブロック転送的なところにはX以外にYレジスタを使うよう変更してみた。
コメント 0