現在地

MC68010の判別(補足)


今回はブレーク処理についての予定でしたが、MC68010の判別で書き足らなかったことがいくつかありますのでそちらを書くことにします。

MC68008の判別

MC68008の判別もできないか考えたのですが...

  1. ソフトウェア的にはMC68000からの命令等の追加・変更はありません
  2. 最初MC68008は8ビットバスなので奇数番地からのワードアクセスで判別できるのではないかと思ったのですが、データシートによると奇数アドレスからのワード・ロングワードアクセスはアドレスエラー例外を発生するとあるのでこれで判別はできません。
  3. プリフェッチキューあたりに相違があるかもしれませんがデータシートからはよくわかりませんでした。実機が試せるようになったら見てみたいところではあります。

MC68010の判別は例外処理に必要なのに対し、MC68008の判別はどうしても必要というわけではありません。3.を試すにしても優先度はかなり低いですね。

MC68020以降の判別

前回のコードではMC68020以降についてはMC68010として判定されるはずです。それ以上の判別が必要なら(アドレスエラー・バスエラー例外をハンドリングするには必要です)以下のような方法で判定できるはずです。

  1. MC68020は奇数番地からのワードアクセスが可能になっているのでアドレスエラー例外が発生するかどうか
  2. 追加された命令で不当命令例外が発生するかどうか
  3. ステータスレジスタなどの追加されたビットが書き換えられるかどうか
  4. 例外を発生させスタックフレームのフォーマット・コード・フィールドを参照

1.で得られる情報では足りないので他と組み合わせる必要がありますが、2.,4.を使うなら1.は要らないように思います。これはあまり現実的ではないでしょう。

2.はMC68010の判別に用いた方法です。プロセッサの判別方法としては一般的なものでしょう。逆にCALLMのように途中で削除された命令をチェックすることも有効です。

3.はMC68020からT0ビット, Mビットが追加されているので、これを1に書き換えられるか確認します。あるいはT0を立ててトレース例外が発生するか確認しても良いかもしれません。MC68020以降がわかってからキャッシュ制御レジスタで同様のチェックを行なえばもう少し絞り込めるでしょう。

4.はMC68000ファミリらしい方法です。MC68010以降では例外発生時にスタックに積まれるスタックフレームの形式がプロセッサの種類・例外の種類・発生の状況によって異なります。これを正しくハンドリングするためにどの形式が使われたか識別するため4ビットのフォーマット・コード・フィールドが含まれています。

Format Length Processor Note
0000 4 words MC68010
MC68020
MC68030
MC68040
MC68060
0001 4 words MC68020
MC68030
MC68040
割り込み
0010 6 words MC68020
MC68030
MC68040
MC68060
CHK, TRAP, トレース, ゼロ除算など
MC68040,MC68060ではアドレスエラーも
0011 6 words MC68040
MC68060
浮動小数点関係?
0100 8 words MC68060 アドレス変換エラー, バスエラーなど
0111 30 words MC68040 アドレス変換エラー, バスエラー
1000 29 words MC68010 アドレスエラー, バスエラー
1001 10 words MC68020
MC68030
コプロセッサ命令の実行中?
1010 16 words MC68020
MC68030
アドレスエラー, バスエラー(命令境界)
1011 46 words MC68020
MC68030
アドレスエラー, バスエラー(命令実行中)

この表からアドレスエラーを起こせば(バスエラーでも良いのですがハードウェア依存なので)良さそうなのがわかります。あれっ、1.で奇数番地のワードアクセスできるとあるからアドレスエラー発生できないのではと思うかもしれませんが、命令フェッチは偶数アドレスでないといけないので大丈夫です。これでMC68020とMC68030を区別できない以外は判別できます。

バージョンの判別

実はマニュアルにちょっと面白い記述があります。

  1. 『M68000マイクロプロセッサ ユーザーズ・マニュアル 4th edition』(MC68010についての記述から)

    (2) データの妥当性の判定 ロング・スタック・フォーマットでは,MC68010は残りのスタック・データの読み込みを開始し,データの妥当性をチェックします.妥当性は図4.8に示す16の内部情報ワードの最初のワードについてのみチェックします.このワードには固有の内部情報の他にそのデータを読み込もうとしているMC68010のバージョン番号に合致するプロセッサのバージョン番号があります.

  2. "MC68020 32-Bit Microprocessor User's Manual"

    In addition to the format value, one word in the frame is checked for value that indicates whether or not this frame can be used by this processor.

  3. "MC68030 Enhanced 32-Bit Microprocessor User's Manual third edition"

    In addition, for the long stack frame, the processor compares the version number in the stack with its own version number. The version number is located in the most significant nibble (bits 15-12) of the word at location SP+$36 in the stack frame.

これ本来はマルチプロセッサシステムで異なるバージョンが混在した時の対策のようですが、このバージョンを調べてみるのも面白いかもしれません。私は残念ながら調べるほど数を持っていないですが...

マニュアル流し読みした範囲ではMC68040以降は命令の再開を諦めたように読めます。命令の準備段階でのエラーなら最初からやり直し、結果の書き込み段階なら例外ハンドラに書き込みを委ねると。これなら内部状態の復帰の必要はなくバージョンを確認する必要もないでしょう。

参考文献・関連図書: 
MC68008データシート, Motorola.
Motorola『M68000マイクロプロセッサ ユーザーズ・マニュアル 4th edition』, CQ出版社.
"MC68020 32-Bit Microprocessor User's Manual", Motorola.
"MC68030 Enhanced 32-Bit Microprocessor User's Manual third edition", Motorola.
"MC68040 32-Bit Microprocessor User's Manual", Motorola.
"MC68060, MC68LC060, MC68EC060 Microprocessors User's Manual", Motorola.

コメントを追加

Plain text

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