2022-12-01 22:21 — asano
カテゴリー:
Universal Monitor 68000は自分のボードで動かせるMC68000, MC68010まで対応し、MC68020以降は動かす人もいないだろうから後回し、と思っていたのですが...
なんとMC68030で動かした方がおられます(リンク参照)。
これは判別やら例外処理やら対応しなくてはと思いソースを見たところ、MC68010のアドレスエラー・バスエラーの表示を作りかけたままになっておりました。これを放置したまま他の変更を行なうのは混乱の元(一応 Subversion で管理してはいますが...)なのでまずこれを完了させることにしました。
MC68000系では割り込みの他、ゼロ除算や未定義命令の実行などが発生したときにあらかじめ用意したルーチンを実行する機能があります。これを例外処理といいます。
原則として(復帰できるように)発生時のPCとSRをスタックに積んでから実行するのですが、アドレスエラーとバスエラーの場合はさらに多くの情報がスタックに積まれます。
この中にはアクセスしようとしたアドレスやファンクションコード、読み書きの別などが含まれています。これは原因究明に有用なので表示しようというわけです。
MC68000 / MC68008
MC68010以降とフォーマットが異なるので、プロセッサの判別が出来ていることが前提になります。
これらのプロセッサでアドレスエラーまたはバスエラーが発生し例外ハンドラに制御が渡ったときスタックには以下の情報が積まれています。
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
SP | R/W | I/N | Function Code | ||||||||||||||
SP+2 | Access Address (H) | ||||||||||||||||
Access Address (L) | |||||||||||||||||
SP+6 | Instruction Register | ||||||||||||||||
SP+8 | Status Register | ||||||||||||||||
SP+10 | Program Counter (H) | ||||||||||||||||
Program Counter (L) | |||||||||||||||||
SPからのワードにはエラーの原因となったアクセスの情報が入っています。R/Wは書き込みなら0読み出しなら1、I/Nはフェッチなら0それ以外なら1が入ります。
SP+2からのロングワードにはアクセス先のアドレスが入ります。
SP+6にはエラー発生時に実行していた命令の第1ワードがが入ります。
SP+8以降には他の例外と同様にSRとPCの値が入っていますが、プリフェッチのためエラーを起こした命令から先行しているなどずれがあるので注意が必要です。
これだけの情報ではエラーになったところから再開することはできません。これらの情報を表示してからモニタに戻しています。
これは試しにD
コマンドでメモリの無い(バスエラーになる)アドレスをダンプしてみたものです。
スーパバイザ・データ空間(FC=5)の$00200001をリードしてバスエラーが発生したこと、その命令が$1019であったことがわかります。
このままG
コマンドを入力するとPCから実行しますが、エラーになった命令やプリフェッチした命令は未実行のままなので正常な実行継続ではありません。
ここまでの処理は去年書いていたのですが、MC68010用のコードが書きかけになっていたのでした。
次回、MC68010について書く予定です。
コメントを追加