現在地

アドレスエラー・バスエラー (その2)


カテゴリー:

前回はMC68000/MC68008について書いたので今回はMC68010/MC68012です。

MC68010 / MC68012

MC68000/MC68008ではアドレスエラー・バスエラーからのソフトウェアによる復帰はできませんでした。それを改善したのがMC68010(とメモリ空間を拡大したMC68012)です。

そのためには例外処理を行なっている間復帰に必要な内部状態を保存しておかなくてはなりません。内部にこっそり保存するという方法も考えられなくはありませんが、MC68010ではスタックに積むことで保存します。

アドレスエラー・バスエラー発生時のスタックには以下のように29ワードという大量の情報が積まれています。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
SP Status Register
SP+2 Program Counter (H)
Program Counter (L)
SP+6 1000 Vector Offset
SP+8 Special Status Word
SP+10 Fault Address (H)
Fault Address (L)
UNUSED, RESERVED
SP+16 Data Output Buffer
UNUSED, RESERVED
SP+20 Data Input Buffer
UNUSED, RESERVED
SP+24 Instruction Input Buffer
 
Internal Information, 16 Words
 

スタックトップの4ワードはすべての例外処理に共通の形式で、SP+6からのワードの上位4ビットで以降の形式がわかるようにフォーマットが入っています。MC68010ではこの1000以外に0000もあって、アドレスエラー・バスエラー以外の例外で使われます。詳しくはMC68010の判別(補足)を参照してください。

次のSpecial Status Word(以下SSW)は詳しくは次のようになっています。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
RR 0 IF DF RM HB BY RW 00000 FC2 - FC0

RRには0が入っています。そのままRTEで戻ればアクセスが再実行されます。仮想記憶を作る場合などMMUでメモリ配置を変更(とメモリ内容のロードを)行なってから再実行させるのが一般的です。仮想デバイスの場合はソフトウェアで必要な処理を行なってからこのビットを1にしてRTEします。

IFは命令フェッチだった場合に1になります。もしRR=1にする場合は、命令語をInstruction Input Bufferに入れておけばその値がフェッチされたものとして実行継続されます。

DFはデータリードの場合に1になります。もしRR=1にする場合は、データをData Input Bufferにいれておけばその値が読めたものとして実行継続されます。命令のオペランド部(2ワード目以降)のフェッチの場合、IF=DF=1になるようですがどうすればいいのでしょう? Instruction Input BufferとData Input Bufferに同じ値を入れておけばいいのかな。

RMはTAS命令のRead-Modify-Writeサイクルの場合に1になります。これをソフトウェアで処理(RR=1)するのはかなり面倒そうです。

HBとBYはバイトアクセスに関連しています。バイトアクセス時にはBY=1となり、通常アドレスが偶数でも奇数でもData Input BufferもしくはData Output Bufferの下位が使われますが、MOVEP命令の場合上位が使われることがありHB=BY=1になります。

RWはMC68000同様、読み出し時に1になります。

FC2-FC0はファンクションコード、MC68010にはMOVES命令があるので000のような未使用コードの可能性もあります。

SP+10からのロングワードはアクセス先が入っています。

SP+16のData Output Bufferには書き込もうとしたデータが入っています。

SP+26以降には実行継続に必要な内部情報が含まれていますが、その詳細は非公開になっています。

去年MC68000用の表示ルーチンを作った際にMC68010用の分岐までは作ってあったので、デバッグに有用そうな情報をデコードして表示するルーチンを追加しました。


この例は$00010000番地にJMP $00400000を書き込んで実行してみたところです。$00400000にメモリは無い(バスエラーが発生する)ので飛び先からの命令フェッチがエラーになっています。

これはまだ開発中のもので2102 00400000 0000とデバッグ用の表示が含まれています。2102がSSW、00400000がFault Addressです。最後の0000はData Output Bufferですが、書き込みサイクルではないので有効な値ではありません。

やはり実行再開は考慮してはいません。

参考文献・関連図書: 
『M68000マイクロプロセッサ ユーザーズ・マニュアル 4th edition』, CQ出版社.

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。