2022-12-04 21:46 — asano
カテゴリー:
アドレスエラー・バスエラーについて今度こそ終わりにするつもりです。
MC68040
MC68040からは大きな方向転換があったように感じます。
複雑度は増しているはずなのにスタックに積まれる情報は減っているのです。前にもMC68010の判別(補足)に書きましたが、命令の再開を諦めて頭からやり直す方針のようです。
まずはアドレスエラーの場合です。
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 | 0010 | Vector Offset | |||||||||||||||
SP+8 | Address (H) | ||||||||||||||||
Address (L) | |||||||||||||||||
たった6ワードです。アドレスエラーは命令フェッチのみなので通常これで十分なのでしょうか。
続いてバスエラー(とATC Fault)の場合です。
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 | 0111 | Vector Offset | |||||||||||||||
SP+8 | Effective Address(EA) | ||||||||||||||||
SP+10 | |||||||||||||||||
SP+12 | Special Status Word(SSW) | ||||||||||||||||
SP+14 | $00 | Write-Back 3 Status(WB3S) | |||||||||||||||
SP+16 | $00 | Write-Back 2 Status(WB2S) | |||||||||||||||
SP+18 | $00 | Write-Back 1 Status(WB1S) | |||||||||||||||
SP+20 | Fault Address(FA) | ||||||||||||||||
SP+22 | |||||||||||||||||
SP+24 | Write-Back 3 Address(WB3A) | ||||||||||||||||
SP+26 | |||||||||||||||||
SP+28 | Write-Back 3 Data(WB3D) | ||||||||||||||||
SP+30 | |||||||||||||||||
SP+32 | Write-Back 2 Address(WB2A) | ||||||||||||||||
SP+34 | |||||||||||||||||
SP+36 | Write-Back 2 Data(WB2D) | ||||||||||||||||
SP+38 | |||||||||||||||||
SP+40 | Write-Back 1 Address(WB1A) | ||||||||||||||||
SP+42 | |||||||||||||||||
SP+44 | Write-Back 1 Data / Push Data LW0(WB1D/PD0) | ||||||||||||||||
SP+46 | |||||||||||||||||
SP+48 | Push Data LW1(PD1) | ||||||||||||||||
SP+50 | |||||||||||||||||
SP+52 | Push Data LW2(PD2) | ||||||||||||||||
SP+54 | |||||||||||||||||
SP+56 | Push Data LW3(PD3) | ||||||||||||||||
SP+58 | |||||||||||||||||
こちらもMC68020/MC68030の46ワードから30ワードに減っている上に、内部状態の保存というよりもやり残しをソフトウェアに「あと宜しく」と丸投げしているように感じます。
MC68020/MC68030でも細部はよくわかりませんでしたが、これはさらにわからないですね。
モニタとしてはこれをそのまま表示して解釈はユーザーに任せることでお茶を濁す手はあります。
MC68060
MC68060ではさらに短くなっています。
アドレスエラー時はMC68040と同じようなので省略して、バスエラーの場合を見てみます。
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 | 0100 | Vector Offset | |||||||||||||||
SP+8 | Fault Address(FA) | ||||||||||||||||
SP+10 | |||||||||||||||||
SP+12 | Fault Status Longword(FSLW) | ||||||||||||||||
SP+14 | |||||||||||||||||
このフォーマットはFloating-Point Disabled例外でも使われるが、この図はバスエラーでの名称のみ表記している。 |
MC68040よりさらに短くなっています。これだけで本当に実行継続できるのか疑問なんですが...
一般的な使い方としては仮想記憶のページフォルト時にMMUを切り替えてから再開だからそれには十分ということなのでしょうか。
SCC68070
型番はMC68060の続きみたいですが、世代的にはMC68010に近いですね。MC68000に仮想記憶対応(MC68010とは非互換)と周辺デバイスを追加したような感じです。
アドレスエラー・バスエラー時のスタックには以下が積まれます。
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
SP | Status Register(SR) | ||||||||||||||||
SP+2 | Program Counter(PCH) | ||||||||||||||||
Program Counter(PCL) | |||||||||||||||||
SP+6 | 1111 | Vector Offset | |||||||||||||||
SP+8 | Special Status Word(SSW) | ||||||||||||||||
SP+10 | Current Move Multiple Mask(MM) | ||||||||||||||||
SP+12 | Internal Information | ||||||||||||||||
SP+14 | Internal Information | ||||||||||||||||
SP+16 | TPDH | ||||||||||||||||
SP+18 | TPDL | ||||||||||||||||
SP+20 | TPFH | ||||||||||||||||
SP+22 | TPFL | ||||||||||||||||
SP+24 | DBINH | ||||||||||||||||
SP+26 | DBINL | ||||||||||||||||
SP+28 | IR | ||||||||||||||||
SP+30 | IRC | ||||||||||||||||
SP+32 | Internal Information | ||||||||||||||||
SSWの詳細については省略しますが、MC68010によく似ています。
TPDH/TPDL(データシートではTDPH/TDPLと書かれている箇所も)に書き込み予定のデータが、TPFH/TPFLにアクセス先アドレスがあります。IRに実行中の命令が入っているあたりはMC68000っぽいですね。
以上、4回にわたってアドレスエラー・バスエラーを見てきました。普段のプログラミングではまず見ないところで、必要になるのは仮想記憶を実装しようとしているか、デバッグ用のエラー表示くらいでしょうか。
前者の機会はまずなさそうですが、Universal Monitorへの表示はMC68020, MC68030, SCC68070については順次追加していく予定です。これらは現物持っていますので、ボードも作るかもしれません。
コメントを追加