2022-12-02 18:09 — asano
カテゴリー:
前回は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ですが、書き込みサイクルではないので有効な値ではありません。
やはり実行再開は考慮してはいません。
コメントを追加