2022-12-03 23:14 — asano
カテゴリー:
3回目は残りですが書ききれるかなぁ。さらに1回増えてしまうかもしれません。
ここからは自分の手で動かしたことはないのでマニュアルを元にざっくり書いていきます。
MC68020 / MC68030
この両者はソフトウェアから見た例外処理はほぼ共通のようなのでまとめて書きます。
これらではエラー発生時の状況によってスタックに積まれる情報量に違いがあるようです。キリの悪いところで発生すると保存しないといけない項目が増えるということなのかな。
どちらが使われたかはSP+6の上位4ビットでわかります。
Universal MonitorではこれまでMC68010までの対応だったので0000なら4ワード、それ以外なら29ワードとしていました。それをMC68020以降で実行するとスタックがおかしなことになります。今回MC68010, MC68020, MC68030, MC68040, MC68060, SCC68070で使われているフォーマットとその長さをテーブルにして引くようにしました。
まずは少ない場合から。
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 | 1010 | Vector Offset | |||||||||||||||
Internal Register | |||||||||||||||||
SP+10 | Special Status Word | ||||||||||||||||
SP+12 | Instruction Pipe Stage C | ||||||||||||||||
SP+14 | Instruction Pipe Stage B | ||||||||||||||||
SP+16 | Data Cycle Fault Address (H) | ||||||||||||||||
Data Cycle Fault Address (L) | |||||||||||||||||
Internal Register | |||||||||||||||||
Internal Register | |||||||||||||||||
SP+24 | Data Output Buffer (H) | ||||||||||||||||
Data Output Buffer (L) | |||||||||||||||||
Internal Register | |||||||||||||||||
Internal Register | |||||||||||||||||
この短いフォーマットになる条件として"Execution Unit at Instruction Boundary"とあるので、実行が終わって結果の書き込みに失敗したか、フェッチに失敗して実行開始前のいずれかではないかと思います。Data Output Bufferしかないのもそのためかと。
次は多い場合です。
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 | 1011 | Vector Offset | |||||||||||||||
Internal Register | |||||||||||||||||
SP+10 | Special Status Register | ||||||||||||||||
SP+12 | Instruction Pipe Stage C | ||||||||||||||||
SP+14 | Instruction Pipe Stage B | ||||||||||||||||
SP+16 | Data Cycle Fault Address (H) | ||||||||||||||||
Data Cycle Fault Address (L) | |||||||||||||||||
Internal Register | |||||||||||||||||
Internal Register | |||||||||||||||||
SP+24 | Data Output Buffer (H) | ||||||||||||||||
Data Output Buffer (L) | |||||||||||||||||
Internal Register, 4 Words |
|||||||||||||||||
SP+36 | Stage B Address (H) | ||||||||||||||||
Stage B Address (L) | |||||||||||||||||
Internal Register, 2 Words |
|||||||||||||||||
SP+44 | Data Input Buffer (H) | ||||||||||||||||
Data Input Buffer (L) | |||||||||||||||||
Internal Register, 3 Words |
|||||||||||||||||
SP+54 | Version # | Internal Information | |||||||||||||||
Internal Register, 18 Words |
|||||||||||||||||
こちらは何と46ワード(92バイト)もあります。実はM68000ファミリの中でこれが最大です。
Special Status Word(以下SSW)もMC68010とは全くの別物です。
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
FC | FB | RC | RB | 0 | 0 | 0 | DF | RM | RW | SIZE | 0 | FC2 - FC0 | |||||
どうやら複数のエラーが同時に発生することもあるようです。
FC,FBはそれぞれ命令パイプのStage C, Stage Bでエラーが発生したこと、RC,RBはそれを再実行する必要があるかどうか、DFデータエラーが発生したこと(と再実行が必要か)を示します。ソフトウェアで処理した(ハードウェアでの再実行は不要)時は対応するRC,RB,DFを0にします。
命令フェッチは失敗しても(分岐によって使わない可能性もあるので)実際に必要になるまでは保留されています。命令フェッチのアドレスなどはどこにも無いけれどどうやって知るのでしょう? PCから逆算するのかな。
ビット8~0はデータアクセスに関連するもので、RM,RW,FC2-FC0はMC68010と一緒ですね。バス幅が広くなったのでサイズ情報は2ビットになりました。
とユーザーズ・マニュアルを元に書いてきましたが、細部がよくわからないですね。例外処理の章だけを摘み読みしたためで全体を読み込めばわかるのかな。実際に現物を動かしてみるのが早そうですが、このクラスともなるとたとえEMILY Boardを使うにしても大変そうです。
仮にUniversal Monitorで表示するとしたら、命令フェッチについてはStage B, Stage Cでエラーがあったこと(FC, FB)だけ表示することになるでしょう。データについてはMC68010と同程度の表示はできると思います。いずれにしてもボードを作らないことには手が出せません。
案の定長くなってきてしまいました。次回に続きます。
2022-12-06 追記:
日本語版の『MC68020 ユーザーズ・マニュアル 2nd Edition』を確認したらショートフォーマットの場合はStage BのアドレスはPC+4、Stage CはPC+2、ロングフォーマットの場合はStage BはSP+36のStage B Address、Stage CはStage B Address -2だそうです。
日本語版は省略されていることがあるので英語版メインで読んでいたのですが...
さらにMC68020の2nd EditionよりMC68020,MC68EC020のFirst Editionの方が新しいのでややこしい。
コメントを追加