更新日: 2016 年 8 月 18 日
68060を斬る!!(第3回)
説明
MC68060 の解説記事です。月刊電脳倶楽部 117 号(1998 年 2 月号)から 139 号(1999 年 12 月号)にかけて読み物横町で不定期連載していました。転載にあたって内容の再考証は行っていません。ご了承下さい。
68060_03.txt
──────────────────────────────────── 68060を斬る!! 第3回 鎌田誠 ──────────────────────────────────── 今回から、本連載開始前から要望のあった例外処理の解説を始めたいと思いま す。本当は 1 回分で書き上げるつもりだったのですが、予想以上に長くなって しまったので、数回に分けることにしました。 内容は、特に断りがある部分を除いて、68060 の場合の話です。 ━─────────────────────────────────── ●例外処理 68060 の内部または外部からの要求によって通常のプログラムの実行を中断し て行われる特別な動作を例外(exception)と呼び、例外に起因する処理全般を 例外処理(exception processing)と言います。 例外処理は 68000〜68040 にも存在しますが、同じ 68000 ファミリでも CPU の種類によってその内訳がかなり異なります。68060 の例外処理は 68030 や 68040 と比べれば比較的単純なほうです。 MOVEP などの未実装命令(unimplemented instruction)のソフトウェアエミ ュレーション(software emulation)も、例外処理によって実現されています。 ━─────────────────────────────────── ●割り込み 例外の中で、外部からの要求によるものを割り込み(interrupt)と呼びます。 一般に割り込みルーチンなどと言うときの割り込みです。 割り込みには、その発生源によって 7 段階の割り込み優先レベル(interrupt priority level)があり、複数の割り込みが同時に発生した場合には最も優先順 位の高いものから優先して例外処理を開始することになっています。また、SR (Status Register)の割り込み優先マスク(interrupt priority mask)によっ て、割り込み優先レベルが低い割り込みを受け付けないようにすることができま す。 68060 が受け付ける割り込みの中で優先順位が最も高いものが、リセット割り 込み(reset interrupt)です。コンピュータが暴走したときにリセットボタン を押すと再起動するのは、68060 がどんな状態になっていてもリセット割り込み が効くからです。リセットボタンすら効かないのは周辺回路が正常に動作してい ない場合で、それは暴走状態とは異なります。 余談ですが、Human68k はユーザがスーパーバイザモードのプログラムを自由 に記述できて、しかもそれが暴走してもリセット割り込みを使わずに強制的に停 止して復帰できる確率が高い OS であることが、アセンブラでプログラムを書き やすい理由の 1 つではないかと思います。 ━─────────────────────────────────── ●例外ハンドラ 例外によって始動されるプログラムを例外ハンドラ(exception handler)と 言います。割り込みの場合は割り込みルーチンと呼ばれることがあります。 例外ハンドラは常にメモリ上に存在して例外の発生に待機していて、例外が発 生すると 68060 によって自動的に呼び出されます。 例外の種類によって、例外ハンドラから例外が発生する直前に実行していたプ ログラムに復帰できる場合とできない場合があります。復帰できる場合は RTE 命令で復帰します。ただし、復帰できる場合でも、必ず復帰しなければならない というわけではありません。例えば、Human68k の _EXIT という DOS コールは れっきとした例外処理ですが、例外を発生させたプログラムには復帰せず、親プ ロセスに戻るようになっています。 ━─────────────────────────────────── ●例外処理の流れ 例外処理を理解する上で特に重要なのが、例外の発生から例外ハンドラの実行 が開始されるまでの間に、68060 の中で何が行われているかです。ここは通常は 68060 が自動的に行う処理ですが、できるだけ詳しく書いておこうと思います。 なお、一部の例外処理はソフトウェアエミュレーションによって生成されます。 例外が発生したとき、命令実行パイプラインの実行段階に至っていなかった命 令は中止され、例外処理を終了してから再実行することになっています。ただし、 キャッシュ禁止の領域をアクセスする命令の実行中などは動作が完了するまで割 り込みを受け付けられないので、その命令の処理が完了するまで待ってから例外 処理が開始されます。 例外の発生から例外ハンドラが始動されるまでには、大雑把に言って 4 つの 段階があります。先にフローチャートで見ておきましょう。 ┌─────┐ │例外の発生│ └──┬──┘ 第1段階 ↓ ┌─────────┐ │ SRのコピーを作る │ └────┬────┘ ↓ ┌─────────────┐ │スーパーバイザモードに移行│ │してトレースを解除する │ └──────┬──────┘ ↓ ┌─────────────┐ │割り込みによる例外ならば割│ │り込みマスクを更新する │ └──────┬──────┘ 第2段階 ↓ ┌───────────┐ │ 例外ベクタ番号を決定 │ │ または取得する │ └─────┬─────┘ 第3段階 ↓ ┌─────────────┐バスエラー ┌────→│例外スタックフレームを作る├→────┐ │ └──────┬──────┘ │ ↑ 第4段階 ↓ │ ┌──┴──┐ ┌───────────┐ │ │ベクタ番号│ │例外ハンドラの先頭の命│ │ │を2に変更 │ │令のアドレスを計算する│ │ └─────┘ └─────┬─────┘ │ ↑ ↓ │ │バスエラーまたは┌───────┐バスエラーまたは│ │アドレスエラー │例外ハンドラの│アドレスエラー │ └───────←┤ 先頭の命令を ├→───────┤ アクセスエラー以│ フェッチする │アクセスエラー │ 外の処理中のとき└───┬───┘の処理中のとき │ ↓ ↓ ┌───────┐ ┌──────┐ │例外ハンドラの│ │ダブルバスフ│ │実行を開始する│ │ォルトで停止│ └───────┘ └──────┘ ━─────────────────────────────────── ▼例外処理の第 1 段階 まず、68060 の内部で、例外が発生する直前の SR(Status Register)の内容 がコピーされます(この値は第 3 段階で使います)。 続いて SR の S ビットをセットされてスーパーバイザモードになり、同時に T ビットがクリアされてトレースが解除されます。 割り込みによる例外の場合は SR の割り込み優先マスクが更新され、今受け付 けた割り込みよりも割り込み優先レベルが低い割り込みを受け付けないようにな ります。 ━─────────────────────────────────── ▼例外処理の第 2 段階 次に、例外のベクタ番号(vector number)を決定します。ベクタ番号は、発 生した例外の種類によってどの例外ハンドラを呼び出せばよいかを知るための重 要な値です。この値は第 4 段階で使用されます。 割り込み以外の例外のベクタ番号は、CPU の内部で決定されます。例えば、バ スエラーのベクタ番号は 2 番、というふうに決まっています。 割り込みの場合は、CPU がインタラプトアクノリッジバスサイクル (interrupt acknowledge bus cycle)を発行して割り込みの発生源(X68k の場 合は DMAC や MFP)にベクタ番号を問い合わせます。すると割り込みの発生源は、 ベクタ番号を返すか、オートベクタ(autovector)を使用するかのどちらかの反 応をします。ここでオートベクタというのは、その割り込みの割り込み優先レベ ル(1〜7)に $0018 を加えた $0019〜$001F をベクタ番号として使用するもの です。割り込みの発生源がインタラプトアクノリッジバスサイクルに対して何も 反応しなかった場合はスプリアス割り込み(spurious interrupt)としてベクタ 番号 $0018 が使用されます。 X68k で実際にオートベクタが使用されるのは NMI だけで、他の割り込みはす べて発生源がベクタ番号を返すことになっています。しかし、MFP まわりの不都 合で、稀にスプリアス割り込みが発生してしまうことがあるようです。060turbo の ROM では、起動時にスプリアス割り込みの例外ハンドラを RTE だけのルーチ ンに設定することでスプリアス割り込みを無視するようになっています。 ━─────────────────────────────────── ▼例外処理の第 3 段階 スーパーバイザスタックの先頭に例外スタックフレーム(exception stack frame)を作ります。ただし、リセットの場合を除きます。 例外スタックフレームには、発生した例外に関する情報や、例外処理を終了し て元のプログラムに復帰するときに必要な情報が書き込まれます。その構造につ いては後で説明します。 例外スタックフレームを作っている最中にバスエラーが発生した場合、つまり スーパーバイザスタックをアクセスできなかった場合、ダブルバスフォルト(後 述)になります。 ━─────────────────────────────────── ▼例外処理の第 4 段階 最後の第 4 段階では、発生した例外に対応した例外ハンドラの先頭アドレス を取得して例外ハンドラを呼び出します。 例外ハンドラの先頭アドレスを例外ベクタ(exception vector)と呼びます。 68060 では、例外のベクタ番号から例外ベクタを求めるための例外ベクタテーブ ル(exception vector table)をメモリ上に用意しておくことになっています。 例外ベクタテーブルは例外ベクタ(32 ビット幅)をベクタ番号順に 256 個並べ たテーブルで、その先頭アドレスは VBR(Vector Base Register)という 32 ビ ット幅のコントロールレジスタで与えられます。 VBR の値はリセット例外によって 0 に初期化され、060turbo では常に 0 に 固定して使用しています。理由は、68000 には VBR というレジスタが存在せず、 例外ベクタテーブルは必ずアドレス $00000000 から始まることになっているの で、X68k 用のプログラムはすべて例外ベクタテーブルがアドレス $00000000 か ら始まっていることを前提にして記述されているためです。VBR の内容は特権命 令の MOVEC で更新できますが、ユーザは絶対にいじってはいけません。X68k の 場合は、ROM のプログラムの一番最初で例外ベクタテーブルを作成しています。 前述の通り、例外ベクタテーブルは例外ベクタが 32 ビット幅でベクタ番号順 に並んでいるだけのテーブルなので、ベクタ番号を 4 倍すると VBR から例外ベ クタが入っているアドレスまでのオフセットが得られます。このオフセットをベ クタオフセット(vector offset)と呼びます。そして VBR の値にベクタオフセ ットを加えたアドレスから 32 ビットの値を取り出すと、例外ベクタ=例外ハン ドラの先頭アドレスが得られます。このとき、例外ベクタテーブルのアクセスは スーパーバイザデータアクセスであり、アドレス変換も有効です(リセットを除 く)。スーパーバイザデータアクセスなどのアクセスの種類については MMU の 回に解説します。 例外ベクタが得られたら、それが指す例外ハンドラの先頭の命令をフェッチし ます。つまり、PC をそのアドレスに移して先頭の命令を取り出します。以降、 例外ハンドラを実行します。 例外ベクタテーブルから例外ベクタを取り出すとき、あるいは、例外ハンドラ の先頭の命令をフェッチするときに、バスエラーやアドレスエラーが発生した場 合について書き加えておくと、処理中の例外の種類によって 2 通りのパターン が考えられます。1 つはアクセスエラーの例外処理中だった場合で、この場合は ダブルバスフォルト(後述)になります。アクセスエラー以外の例外処理中だっ た場合は、例外の種類をアクセスエラーに変更する、つまり、ベクタ番号を 2 番に変更してから、第 3 段階の例外スタックフレームの作成に戻ります。アク セスエラーの例外ハンドラも始動できなければ、ダブルバスフォルトになります。 例外ハンドラは通常 RTE 命令で終了します。RTE 命令は、例外処理から復帰 するための特別な命令です。この命令は、例外スタックフレームが正しい構造を しているかどうか調べてから、例外スタックフレームから SR と PC を取り出し ます。つまり、SR を例外発生前の状態に復元して、例外スタックフレームの PC のフィールドに書いてあるアドレスにジャンプします。同時に、SSP を例外発生 前の位置まで戻します。例えば割り込みならば、SR と PC と SSP を復元するこ とで、例外処理が始まったときに完了していた命令の直後に、まるで何事もなか ったかのように復帰するわけです。 なお、例外処理の開始後に発生した割り込みが初めて受け付けられるのは、例 外ハンドラの先頭の命令の実行が終了した直後です。これは、例外ハンドラの先 頭に割り込みをマスクする ORI to SR を書いておくことで例外発生後に発生し た割り込みを確実にマスクできるようにするためです。 ━─────────────────────────────────── ●ダブルバスフォルト 例外発生から例外ハンドラに処理が移るまでの間にバスエラーやアドレスエラ ーが発生して処理を続行できなくなった状態をダブルバスフォルト(double bus fault)と言います。ダブルバスフォルトが発生すると、68060 は完全に停止 (halt)してしまいます。ダブルバスフォルトから復帰する手段は、リセット以 外にありません。 ダブルバスフォルトが発生するのは次の 3 つの場合です。 ・例外スタックフレームの生成中にアクセスフォルトが発生したとき ・アクセスフォルト例外の例外ベクタの取得でアクセスフォルトが発生したとき ・アクセスフォルト例外の例外ハンドラの先頭の命令のフェッチで、アクセスフ ォルトまたはアドレスエラーが発生したとき ━─────────────────────────────────── ●例外スタックフレーム 68060 の例外スタックフレームの一般的な構造は次のようになっています。 例外ハンドラ から見た位置 下位 ↓ ↑ 15 1211 0 ←ビット番号 SSP→┏━━━━━━━━━━━━━━━┓ ┃15 SR(ステータスレジスタ) 0┃ SSP+2→┠───────────────┨ ┃31 16┃ ┠ PC(プログラムカウンタ) ┨ ┃15 0┃ SSP+6→┠───┬───────────┨ ┃フォー│ベクタオフセット ┃ ┃マット│ (ベクタ番号×4)┃ SSP+8→┠───┴───────────┨ ┃ ┃ ┠ 付加情報(0〜4ワード) ┨ ┃ ┃ 例外発生前のSSP→┣━━━━━━━━━━━━━━━┫ ┃例外発生前のSSPの先頭のデータ ┃ ┃ ┃ ↓ 上位 それぞれのフィールドの内訳は次の通りです。詳細はフォーマット毎に解説し ます。 ・SR(ステータスレジスタ) これは第 1 段階でコピーした例外発生前の SR の値です。例外処理から例外 発生前のプログラムに復帰するときに使います。 ・PC(プログラムカウンタ) 例外の種類によって、例外を発生させた命令を指している場合と、その次の命 令を指している場合があります。これは例外処理から例外発生前のプログラムに 復帰するときに必要です。例外の種類によっては、例外ハンドラが使用したり更 新したりすることがあります。例外ハンドラの最後で RTE 命令を実行したとき に、このフィールドに書いてあるアドレスにジャンプすることになっています。 ・フォーマット 例外スタックフレームの構造、つまり、付加情報の種類を 4 ビットの数値で 示しています。実際に使用されるのは、0、2、3、4 の 4 種類だけです。例えば、 割り込みの場合は 0 が入っています。 余談ですが、X68000 用の市販ゲームソフトが X68030 で動かない主な原因の 1 つに「X68000 には例外スタックフレームにフォーマットフィールドがない」 というのがありました。M68000 の場合は例外発生前の SSP と例外発生後の SSP の差が 6 だったものが、M68030 では 8 になっているためです。 ・ベクタオフセット ベクタオフセット、つまり、ベクタ番号×4 の値が入っています。 ・付加情報 フォーマットが 0 の場合はこのフィールドは存在しません。フォーマットが 2 または 3 の場合は 2 ワード(4 バイト)、フォーマットが 4 の場合は 4 ワ ード(8 バイト)の付加情報が書き込まれます。付加情報の詳細は、フォーマッ トや個々の例外ごとに解説します。 ━─────────────────────────────────── ●例外ベクタテーブル 例外ベクタテーブルには 256 個の例外ベクタを書くことができますが、68060 が実際に使用したりモトローラが予約しているのは先頭の 64 個だけで、残りの 192 個はユーザが定義できます。と言っても、060turbo の場合は X68k の割り 込みベクタ番号の割り当てに従わなければならないことは言うまでもありません。 68060 の例外ベクタテーブルは以下の表の通りです。 ┏━━┯━━━┯━━━━━━┯━━━━━━━━━━━━━━━━━━━━━┓ ┃ベク│ベクタ│スタックフレ│ 割り当て ┃ ┃タ番│オフセ│ームフォーマ│ ┃ ┃号 │ット │ット │ PC │ ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃ 0 │ $000 │ - │ - │リセット初期SSP ┃ ┃ 1 │ $004 │ - │ - │リセット初期PC ┃ ┃ 2 │ $008 │ 4 │ - │アクセスフォルト ┃ ┃ 3 │ $00C │ 2 │該当│アドレスエラー ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃ 4 │ $010 │ 0 │該当│不当命令 ┃ ┃ 5 │ $014 │ 2 │直後│0による除算(整数) ┃ ┃ 6 │ $018 │ 2 │直後│CHK,CHK2命令 ┃ ┃ 7 │ $01C │ 2 │直後│TRAPcc,TRAPV命令 ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃ 8 │ $020 │ 0 │該当│特権違反 ┃ ┃ 9 │ $024 │ 2 │直後│トレース ┃ ┃ 10 │ $028 │ 0 │該当│ライン1010エミュレータ(未実装A-Line命令) ┃ ┃ 11 │ $02C │ 0 │該当│ライン1111エミュレータ(未実装F-Line命令) ┃ ┃ 11 │ $02C │ 2 │直後│浮動小数点未実装命令 ┃ ┃ 11 │ $02C │ 4 │直後│浮動小数点無効 ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃ 12 │ $030 │ 0 │直後│エミュレータインタラプト ┃ ┃ 13 │ $034 │ - │ - │(68020と68030で使用,68060では未使用) ┃ ┃ 14 │ $038 │ 0 │該当│フォーマットエラー ┃ ┃ 15 │ $03C │ 0 │直後│未初期化割り込み ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃16〜│$040〜│ - │ - │(未定義,予約) ┃ ┃ 23│ $05C│ │ │ ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃ 24 │ $060 │ 0 │直後│スプリアス割り込み ┃ ┃ 25 │ $064 │ 0 │直後│レベル1割り込みオートベクタ ┃ ┃ 26 │ $068 │ 0 │直後│レベル2割り込みオートベクタ ┃ ┃ 27 │ $06C │ 0 │直後│レベル3割り込みオートベクタ ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃ 28 │ $070 │ 0 │直後│レベル4割り込みオートベクタ ┃ ┃ 29 │ $074 │ 0 │直後│レベル5割り込みオートベクタ ┃ ┃ 30 │ $078 │ 0 │直後│レベル6割り込みオートベクタ ┃ ┃ 31 │ $07C │ 0 │直後│レベル7割り込みオートベクタ ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃ 32 │ $080 │ 0 │直後│TRAP #0命令ベクタ ┃ ┃ 33 │ $084 │ 0 │直後│TRAP #1命令ベクタ ┃ ┃ 34 │ $088 │ 0 │直後│TRAP #2命令ベクタ ┃ ┃ 35 │ $08C │ 0 │直後│TRAP #3命令ベクタ ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃ 36 │ $090 │ 0 │直後│TRAP #4命令ベクタ ┃ ┃ 37 │ $094 │ 0 │直後│TRAP #5命令ベクタ ┃ ┃ 38 │ $098 │ 0 │直後│TRAP #6命令ベクタ ┃ ┃ 39 │ $09C │ 0 │直後│TRAP #7命令ベクタ ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃ 40 │ $0A0 │ 0 │直後│TRAP #8命令ベクタ ┃ ┃ 41 │ $0A4 │ 0 │直後│TRAP #9命令ベクタ ┃ ┃ 42 │ $0A8 │ 0 │直後│TRAP #10命令ベクタ ┃ ┃ 43 │ $0AC │ 0 │直後│TRAP #11命令ベクタ ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃ 44 │ $0B0 │ 0 │直後│TRAP #12命令ベクタ ┃ ┃ 45 │ $0B4 │ 0 │直後│TRAP #13命令ベクタ ┃ ┃ 46 │ $0B8 │ 0 │直後│TRAP #14命令ベクタ ┃ ┃ 47 │ $0BC │ 0 │直後│TRAP #15命令ベクタ ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃ 48 │ $0C0 │ 0 │該当│浮動小数点比較不能状態での分岐またはセット┃ ┃ 49 │ $0C4 │ 0,3 │直後│浮動小数点不正確な結果 ┃ ┃ 50 │ $0C8 │ 0 │直後│浮動小数点0による除算 ┃ ┃ 51 │ $0CC │ 0,3 │直後│浮動小数点アンダーフロー ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃ 52 │ $0D0 │ 0,3 │直後│浮動小数点オペランドエラー ┃ ┃ 53 │ $0D4 │ 0,3 │直後│浮動小数点オーバーフロー ┃ ┃ 54 │ $0D8 │ 0,3 │直後│浮動小数点SNAN ┃ ┃ 55 │ $0DC │ 0,2,3│直後│浮動小数点未実装データ型 ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃ 56 │ $0E0 │ - │ - │(68030と68851で使用,68060では未使用) ┃ ┃ 57 │ $0E4 │ - │ - │(68851で使用,68060では未使用) ┃ ┃ 58 │ $0E8 │ - │ - │(68851で使用,68060では未使用) ┃ ┃ 59 │ $0EC │ - │ - │(未定義,予約) ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃ 60 │ $0F0 │ 0 │該当│未実装実効アドレス ┃ ┃ 61 │ $0F4 │ 0 │該当│未実装整数命令 ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃62〜│$0F8〜│ - │ - │(未定義,予約) ┃ ┃ 63│ $0FC│ │ │ ┃ ┠──┼───┼───┼──┼─────────────────────┨ ┃64〜│$100〜│ 0 │直後│ユーザ定義ベクタ(192個) ┃ ┃ 255│ $3FC│ │ │ ┃ ┗━━┷━━━┷━━━┷━━┷━━━━━━━━━━━━━━━━━━━━━┛ ↑ 該当: 例外が発生した命令のアドレス 直後: 例外が発生した命令の直後の命令のアドレス ━─────────────────────────────────── 今回はここまで。肝心のアクセスフォルトの解説までたどり着かなかった…。 ━─────────────────────────────────── 質問箱 ──────────────────────────────────── このコーナーでは 060turbo や 68060 の関連の質問を受け付けています。な お、質問のタイトルはこちらで勝手に付けさせていただいています。 ●データキャッシュが効かない場合のメモリアクセスのクロック数 68060 のデータキャッシュが効かない場合のメモリアクセスは何クロックくら いかかりますか?(本体メモリ、SIMM、SIMM EDO について) ●データキャッシュの有効な利用方法 データキャッシュを有効に使うためにはメモリにどのようにデータを配置すれ ばいいのでしょうか? ▼データキャッシュが効かない場合のメモリアクセスのクロック数 メモリアクセスの所要クロック数については 060turbo のマニュアルに簡単な 表を掲載してあります。いずれまた命令のクロック数について書くつもりですの で、そのときにまとめて書きたいと思います。 なお、EDO モードは主にキャッシュが ON の場合に効果が発揮されるものです ので、キャッシュを OFF にした場合のクロック数は EDO モードかどうかでは変 わりません(MOVE16 命令を使用する場合は違ってきます)。 ▼データキャッシュの有効な利用方法ですが、データ領域をコンパクトにまとめ ることと、1 つのデータが 16 の倍数のアドレス(16 進数で書いたとき最後の 位が 0 となるアドレス)を跨がないようにデータ領域を配置することが重要で す。また、ワードサイズのデータやロングワードサイズのデータは、4 の倍数の アドレス(これをロングワード境界と呼びます)を跨がないように配置します。 アセンブラで記述するときは、HAS*.X の「.align 4」や「.align 16」を有効 に利用しましょう。プログラムを実行するとき、プログラムの先頭が 16 の倍数 のアドレスになるようにロードされるからです。ただし、ここで注意しなければ ならないのは、せっかく「.align 16」を書いても、LK.X で何も指定せずにリン クしてしまうと、1 番目のオブジェクトファイルの .text セクション以外のセ クションの先頭位置は必ずしも 16 で割り切れるオフセットに配置されていると は限らないということです。すべてのオブジェクトファイルのすべてのセクショ ンの先頭位置を 16 の倍数のオフセットに配置するためには、LK.X に -e16 と いうスイッチを指定してリンクするか、hlk を使う必要があります(HAS*.X が .align の情報をオブジェクトファイルに書き、それを hlk が解釈して自動的に アラインメントを合わせるようになっています)。 68060 のキャッシュの詳細については、近いうちに本編で解説したいと思いま す。 ━─────────────────────────────────── ● SharpenHimemPatch の副作用? SharpenHimemPatch のおかでシャーペンをハイメモリで動かすことができるよ うになりました。早速 SX-WINDOW をハイメモリで動作させたところ、終了時に ハングアップまたはバスエラーが発生するようになってしまいました。SXerror での表示は次の通りです。 ┌─────────────────┐ │IFM.X │ │バスエラーが発生しました │ │taskID=7 PC:$108d0304 SR:$2004 │ │Task Address = $1093e542-$1095e58a│ │SXCALL No = A501 │ │Stack = │ └─────────────────┘ シャーペン、パターンエディタ、書家万流等でアウトラインフォントを使わなけ ればエラーは発生しないようです。また、キャッシュをライトスルー、コピーバ ックに変えても関係ありませんでした。原因や回避策がわかれば教えて下さい。 よろしくお願いします。 ▼ SharpenHimemPatch の副作用? 確かにハングアップしてしまうことがあるようです。原因はまだよくわかりま せん。情報をお持ちの方はご連絡下さい。 ━─────────────────────────────────── 68060 関連の話題 ──────────────────────────────────── ● 060turbo.sys v0.54 060turbo.sys v0.54 をリリースしました。 128MB の SIMM に正式に対応し、32MB 以上の大きさの RAMDISK を確保できる ようにしました。 v0.53 で、__IUSING で d0-d1 が破壊されていた不具合、__RAND と __RND の 乱数系列を初期化していなかった不具合、__DSGN の結果が間違っていた不具合 をそれぞれ修正しました。 タイトルの文字のボールドをやめました。文字の色を黒にして文字が見えない ようにしている環境で、文字が出てきてしまわないようにするためです。 アクセスフォルトのベクタを乗っ取り、分岐予測エラーで白帯が出ないように した。 store/load bypass をデフォルトで無効にしました。これに伴って、 store/load bypass を有効にするためのスイッチ -sl を追加しました。 060loadhigh.x によるロードのモードを 5 から 1 に変更しました。上位の領 域よりも下位の領域のほうが広くても、060loadhigh.x を使うと上位にロードさ れます。 まだ FE ファンクションの __USING、__DTOS、__ECVT などで正しい結果が得 られないことがあります。引き続き、スイッチ -fe を指定せずに FLOAT4.X を 併用するようにして下さい。 ● 060turbo の ROM の不具合 060turbo の ROM(98-03-13 よりも前のバージョン)の不具合が 1 つ見つか りました。「060turbo の ROM のキー入力割り込みルーチンを使っているとき、 ソフトウェアキーボードが表示されている状態でハードウェアのキーを押すと、 エラーが出る」というものです。030 モードと 060 モードのいずれでも発生し ます。 ソフトウェアキーボードを表示している状態でハードウェアのキーを押さない ように注意して下さい。 ROM の改修は行いません。ソフトウェアキーボードはほとんど使用されていな いと思いますので、実害はないと思います。また、keywitch を常駐することで 回避することも可能です。 ━─────────────────────────────────── 目次 ──────────────────────────────────── 第1回(月刊 117 号) <本編> はじめに/パイプラインとは/パイプラインの利点/パイプラインの欠 点/分岐予測/分岐キャッシュを用いた分岐予測/68060 のパイプライ ン/68060 の命令フェッチパイプライン/68060 における分岐予測/ 68060 の命令実行パイプライン <68060 関連の話題> 060turbo における SIMM の効果/Motorola のホームページを覗いてみ よう/エラッタ/マスクセットの見分けかた/HAS060.X/060pcr5.x ━─────────────────────────────────── 第2回(月刊 119 号) <本編> スーパースカラ(superscalar)/ディスパッチテスト(1)/ディス パッチテスト(2)/ディスパッチテスト(3)/ディスパッチテスト (4)/ディスパッチテスト(5)/ディスパッチテスト(6) <68060 関連の話題> XL/Image/060turbo が少し速くなったゾ/mpeg2play.x <68060 の命令のスーパースカラ分類表> スーパースカラ分類の意味/整数命令/特権命令/浮動小数点命令/参 考文献 ──────────────────────────────────── (EOF)