countersince January 6, 2001X68000 LIBRARYEnglish
更新日: 2016 年 8 月 18 日
X68000 LIBRARY > ソフトウェアライブラリ > 特定のハードウェア用のソフトウェア > 060turbo 関連 > 060turbo.sys > 060turbo の世界

060turbo の世界

説明

これは、060turbo の発売(発送開始)が間近に迫った 1997 年 5 月頃、少しでも多くの X680x0 ユーザに 060turbo や MC68060 のことを知っていただくために、060turbo に関するまとまった読み物として書いた文章です。月刊電脳倶楽部 109 号(1997 年 6 月号)の読み物横町のコーナーに収録されました。転載にあたって内容の再考証は行っていません。ご了承下さい。

060turbo.txt
────────────────────────────────────

                            060turbo の世界

────────────────────────────────────


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        68060 の概要

────────────────────────────────────

  68060 は Motorola の 68000 ファミリの中で最上位に位置するマイクロプロ

セッサです。68060 は 68000 ファミリの命令セットを継承しながら、RISC アー

キテクチャに匹敵するパフォーマンスを発揮します。というのも、68060 では命

令コードをマイクロコードではなく、4段から成る命令フェッチパイプラインに

よって固定長の命令に読み代えて内部の RISC エンジンに送り込むことで実行し

ているのです。

  68060 は FPU(浮動小数点ユニット)および MMU(メモリ管理ユニット)を内

蔵しています。キャッシュサイズは 68000 ファミリの中で最大で、命令、デー

タ共に 8KB ずつあります(68040 は 4KB ずつ)。さらに、多段パイプライン、

デュアルスーパースカラ、分岐キャッシュなどの働きで、68060 は2つの整数命

令(または整数命令と浮動小数点命令)と1つの分岐命令の合計3つの命令をま

とめて1クロックで処理することができます。



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        スーパースカラ

────────────────────────────────────

  68060 には pOEP と sOEP と呼ばれる2本の命令実行パイプラインがあります。

スーパースカラが無効になっているときは pOEP だけが使われます。スーパース

カラを有効にすると、連続する2つの命令が以下のような条件を満たしていると

き、2番目の命令を sOEP に入れることで2つの命令を同時に実行します。

        条件1  1番目の命令の結果を2番目の命令が必要としないこと

        条件2  命令の種類と組み合わせの条件

  条件1は当然の条件です。この条件を踏まえて命令の順序を考えながらコーデ

ィングすることで、スーパースカラが、より効率よく働くようになります。

  条件2は命令毎に定められています。スーパースカラに関して、各命令は以下

のような4種類に分類されます。

        1      pOEP|sOEP
                        pOEP と sOEP のいずれでも動作し、pOEP で動作する
                        場合には sOEP に pOEP|sOEP の命令が入ることが許
                        されている命令。
                        単純な転送と整数演算、論理演算、シフト・ローテー
                        トなどはこれに分類される。

        2      pOEP-only
                        pOEP だけで動作し、この命令の動作中は sOEP が使
                        えなくなる命令。
                        その他の命令はこれに分類される。

        3      pOEP-until-last
                        pOEP だけで動作する複数クロックの命令で、この命
                        令の最後1クロックに限って sOEP に pOEP|sOEP の
                        命令が入ることが許されている命令。
                        メモリ-メモリ転送、イミディエイト、ビット操作命
                        令などはこれに分類される。

        4      pOEP-but allows-sOEP
                        pOEP だけで動作するが、同時に sOEP に pOEP|sOEP
                        の命令が入ることが許されている命令。
                        浮動小数点命令はこれに分類される。

  スーパースカラが効いて2番目の命令が sOEP に入るのは、次のような組み合

わせの場合です。

        1番目の命令            2番目の命令

        pOEP|sOEP               pOEP|sOEP

        pOEP-until-last         pOEP|sOEP

        pOEP-but allows-sOEP    pOEP|sOEP

  マニュアルには明記されていませんでしたが、pOEP|sOEP 同士の組み合わせで

上の条件を満たしていても同時に実行されない組み合わせがあるようです。



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        分岐キャッシュ

────────────────────────────────────

  68060 では、分岐命令によるパイプラインの乱れを抑制するために分岐キャッ

シュが使われています。以前実行した分岐命令を再度実行するとき、命令のフェ

ッチを前回進んだ方向に向けてパイプラインを充填してしまって、後から分岐条

件を確かめるのです。分岐キャッシュがヒットすれば条件分岐命令も直前の命令

と同時に処理できるようになるので、実質0クロックになります。勿論、進む方

向を間違えたときはパイプラインを再充填しなければならなくなるので遅くなり

ますが、全体としては分岐条件が求まるまで待つよりもずっと速く動きます。

  分岐キャッシュは全部で 256 エントリで、命令キャッシュが無効化されると該

当するアドレスの分岐キャッシュも一緒に無効化されます。また、分岐キャッシ

ュだけを無効化することも可能です。



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        ストアバッファ

────────────────────────────────────

  連続するアドレスへのロングワードに満たない書き込みをまとめて1回で済ま

せるために、書き込みを遅延させる機能です。ライトスルーおよびキャッシュ禁

止ストアバッファ許可(ノンシリアライズド)の領域に対して有効です。



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        キャッシュ

────────────────────────────────────

●キャッシュの概要

  メモリのアクセスは MPU 内部の動作と比較して非常に遅いため、それをなる

べく減らすために設けられている仕掛けがキャッシュです。1度データを読み出

したアドレスはその内容を MPU 内部のキャッシュに保存しておいて、次に読み

出すときは実際にメモリにアクセスせずにキャッシュからデータを取り出すこと

で済ませてしまうことができます。キャッシュモードによっては、書き込みすら

も省略してしまうことがあります。

  68060 のキャッシュは命令とデータで独立しており、それぞれ 8KB ずつ用意

されています。MMU と密接に関係しており、物理アドレス空間をページ単位に区

切ってキャッシュモードを設定できます。キャッシュの構造は 4-way set

associative という方式で、16 バイトから成る“ライン”を 128 個まとめた固

まりを4セット持つことで柔軟性の高い構造になっています。



●キャッシュモード

  68060 のキャッシュモードは4種類あって、0〜3 の番号が付けられています。

        0       キャッシュ許可,ライトスルー
                読み出し時にキャッシュが有効です。書き込みは実際にメモリ
                に書き込むと同時にキャッシュも更新します。デフォルトのモ
                ードです。なお、ストアバッファも有効です。

        1       キャッシュ許可,コピーバック
                書き込みも遅延します。メモリとのやりとりは 16 バイトのラ
                イン単位で行われ、不要な書き込みは一切行いません。

        2       キャッシュ禁止,ストアバッファ禁止
                68040 ではシリアライズドと呼ばれ、キャッシュは無効で、連
                続する書き込みを命令の順序で正確に行います。
                I/O ポートは原則としてこのモードにする必要があります。

        3       キャッシュ禁止,ストアバッファ許可
                68040 ではノンシリアライズドと呼ばれ、キャッシュは無効で
                すが、ストアバッファが効くために、書き込みが命令の順序で
                行われないことがあります。
                060turbo では VRAM をこのモードに設定しています。



●コピーバックモードでの注意

  コピーバックモードに設定されたページについては、CPUSH 命令によって明示

的にプッシュ(キャッシュの内容をメモリに書き出すこと)を行う必要が出てき

ます。特に自己書き換えを行うプログラムは、データと命令のキャッシュが独立

しているためにコピーバックモードでは正常に動作しません。書き換えたライン

のデータキャッシュをプッシュしてから命令キャッシュをクリアするという手順

を踏まなければなりません。



● CACR(キャッシュコントロールレジスタ)

  CACR の内容は 68030 とまったく異なります。内訳は以下の通りで、いずれの

ビットもセットすると有効、クリアすると無効です。

        bit31   EDC     Enable Data Cache
                        データキャッシュ有効

        bit30   NAD     No Allocate Mode (Data Cache)
                        データキャッシュを凍結する

        bit29   ESB     Enable Store Buffer
                        ストアバッファ有効
                        (CM=%00,%10 の領域への書き込みを遅延して高速化する)

        bit28   DPI     Disable CPUSH Invalidation
                        CPUSH でキャッシュを無効化しない

        bit27   FOC     1/2 Cache Operation Mode Enable (Data Cache)
                        データキャッシュを半分にする

        bit23   EBC     Enable Branch Cache
                        ブランチキャッシュ有効(分岐予測)

        bit22   CABC    Clear All Entries in the Branch Cache
                        すべてのブランチキャッシュをフラッシュ

        bit21   CUBC    Clear All User Entries in the Branch Cache
                        ユーザモードのブランチキャッシュだけフラッシュ

        bit15   EIC     Enable Instruction Cache
                        命令キャッシュ有効

        bit14   NAI     No Allocate Mode (Instruction Cache)
                        命令キャッシュを凍結する

        bit13   FIC     1/2 Cache Operation Mode Enable (Instruction Cache)
                        命令キャッシュを半分にする

        上記以外のビットは予約済み。



● CPUSH (Push and Invalidate Cache Lines) 命令

  キャッシュを明示的にプッシュする命令です。つまり、コピーバックモードで

キャッシュだけ更新されている領域をメモリにも書き出して、キャッシュとメモ

リの整合を取ります。この命令はキャッシュの無効化も伴うので、キャッシュの

無効化にも CPUSH を使います。

  CPUSH には以下のようなバリエーションがあります。

        CPUSHL <caches>,(An)    ライン単位のプッシュ

        CPUSHP <caches>,(An)    ページ単位のプッシュ

        CPUSHA <caches>         すべての領域のプッシュ

  <caches> では次のような文字でキャッシュの種類を指示します。

        DC      データキャッシュだけプッシュする

        IC      命令キャッシュだけプッシュする

        BC      データキャッシュと命令キャッシュの両方ともプッシュする

        NC      データキャッシュと命令キャッシュの両方ともプッシュしない

  CACR を操作してデータキャッシュを停止した直後には必ず、CPUSHA DC でデ

ータキャッシュをプッシュしなければなりません。更に、キャッシュ停止とキャ

ッシュプッシュの間に割り込みが入らないように、これらの間は割り込みも止め

ておくべきです。

  CPUSH は特権命令です。



● CINV (Invalidate Cache Lines) 命令

  キャッシュを明示的に無効化します。命令キャッシュだけ無効化したい場合な

どに使います。

  CINV には以下のようなバリエーションがあります。

        CINVL <caches>,(An)     ライン単位の無効化

        CINVP <caches>,(An)     ページ単位の無効化

        CINVA <caches>          すべての領域の無効化

  <caches> では次のような文字でキャッシュの種類を指示します。

        dc      データキャッシュだけ無効化する

        ic      命令キャッシュだけ無効化する

        bc      データキャッシュと命令キャッシュの両方とも無効化する

        nc      データキャッシュと命令キャッシュの両方とも無効化しない

  データキャッシュをプッシュせずに無効化してはいけません。

  CINV は特権命令です。



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        MMU(メモリ管理ユニット)

────────────────────────────────────

● MMU の概要

  PC や MOVE 命令など、ユーザモードで動作するプログラムが普通に使用する

アドレスは“論理アドレス”と呼ばれます。それに対して、実際のメモリに振ら

れたアドレスは“物理アドレス”と呼びます。68000 では常に論理アドレスと物

理アドレスが一致していますが、MMU を装備している MPU では必ずしも一致し

ているとは限りません。

  060turbo でもほとんどの論理アドレスは物理アドレスに一致していますが、

部分的に異なることがあります。例えば、ROM($00F00000〜$00FFFFFF)の内容

を SIMM にコピーして $00F00000 → SIMM 上のアドレスという変換を行うこと

で、ROM のアクセスを高速化させることが可能です。この場合は ROM から読み

出したように見せ掛けて実は SIMM から読み出しているというわけです。



●アドレス変換テーブル

  68060 では、メモリ上に“アドレス変換テーブル”を用意しておいて、その先

頭の物理アドレスをルートポインタと呼ばれる制御レジスタに設定しておくこと

で、どの論理アドレスをどの物理アドレスに変換するか指示します。アドレス変

換テーブルはスーパーバイザモード用とユーザモード用とを独立して構築でき、

それぞれのルートポインタも SRP と URP に別々に設定します。060turbo では

スーパーバイザモードとユーザモードのアドレス変換は常に一致しているので、

SRP と URP には同じ物理アドレスを設定しています。

  当然のことですが、アドレス変換テーブルの検索はすべて物理アドレスで行わ

れるのでアドレス変換は伴いません。また、アドレス変換テーブルの検索はデー

タキャッシュも通らないので、アドレス変換テーブルをコピーバックの領域に置

いてはいけません。

  ところで、物理アドレスを求めるたびにアドレス変換テーブルを読みに行くの

ではメモリを読み出す手間が2倍に増えてしまいます。そこで、スーパーバイザ

モードとユーザモードでそれぞれ 64 エントリ分の“アドレス変換キャッシュ”

(ATC)が用意されています。アドレス変換テーブルを変更したときは、該当す

る ATC をクリアする必要があります。



●論理ページと物理ページ

  すべての論理アドレスと物理アドレスは 4KB または 8KB ずつに区切られて、

そのそれぞれを論理ページおよび物理ページと呼びます。アドレス変換はこのペ

ージ単位で行われます。



●論理アドレスのフォーマット

  論理アドレスは以下のようなフォーマットで解釈され、アドレス変換テーブル

によって物理アドレスに変換されます。

  ページサイズが 4KB のとき

        bit31-25(7bit)  ルートインデックス

        bit24-18(7bit)  ポインタインデックス

        bit17-12(6bit)  ページインデックス

        bit11-0(12bit)  ページオフセット

  ページサイズが 8KB のとき

        bit31-25(7bit)  ルートインデックス

        bit24-18(7bit)  ポインタインデックス

        bit17-13(5bit)  ページインデックス

        bit12-0(13bit)  ページオフセット



● SRP (Supervisor Root Pointer) レジスタ
● URP (User Root Pointer) レジスタ

  それぞれ、スーパーバイザモード用とユーザモード用のアドレス変換テーブル

のルートポインタ、すなわち、ルートテーブルの先頭の物理アドレスを格納する

制御レジスタです。MOVEC 命令で参照および変更できます。下位 9 ビットは常

に 0 でなければなりません。つまり、ルートテーブルは必ず 512 で割り切れる

アドレスから始まります。060turbo では SRP と URP に同じアドレスを設定し

ています。



●アドレス変換テーブルの構造

        ルートポインタ→┌───────ルートテーブル─────────┐
                        │                      ルートデスクリプタ0     │
                        │                              :              │
                        │ルートインデックス            :              │
                        │        │                    :              │
                        │        └─────→ルートデスクリプタn     │
                        │                              :              │
                        │                              :              │
                        │                              :              │
                        │                      ルートデスクリプタ127   │
                        └───────────────────────┘

        ルートデスクリプタ→┌──────ポインタテーブル───────┐
                            │                  ポインタデスクリプタ0   │
                            │                           :             │
                            │ポインタインデックス       :             │
                            │        │                 :             │
                            │        └───→ポインタデスクリプタn   │
                            │                           :             │
                            │                           :             │
                            │                           :             │
                            │                  ポインタデスクリプタ127 │
                            └─────────────────────┘

        ポインタデスクリプタ→┌──────ページテーブル───────┐
                              │                ページデスクリプタ0     │
                              │                        :              │
                              │ページインデックス      :              │
                              │        │              :              │
                              │        └──→ページデスクリプタn     │
                              │                        :              │
                              │                        :              │
                              │                ページデスクリプタ31/64 │
                              └────────────────────┘



●デスクリプタ

  ルートデスクリプタおよびポインタデスクリプタの内容は以下の通りです。

        bit31-9         ポインタテーブルのアドレス

        bit8-4          無効

        bit3    U       Used
                        このアドレス変換が使用されたとき MPU がセットし
                        ます。

        bit2    W       Write Protected
                        書き込み禁止のときセット

        bit1-0  UDT     Upper Level Descriptor Type
                        00 or 01        無効
                        10 or 11        有効
                                UDTが無効のときポインタテーブルは存在せ
                                ず、該当する論理アドレスのアクセスはエラ
                                ーになります。

  ページデスクリプタの内容は以下の通りです。

  ページサイズが 4KB のとき

        bit31-12        PHYSICAL ADDRESS
                        物理ページアドレス

        bit11   UR      User Reserved
                        ユーザ用に予約されています

        bit10   G       Global
                        PFLUSH 命令で使用する属性ビットです。

        bit9-8  U1,U0   User Page Attributes
                        UPA1,UPA0 信号に使われます。MPU は無視します。

        bit7    S       Supervisor Protected
                        ユーザモードでのアクセスを禁止します。

        bit6-5  CM      Cache Mode      キャッシュモード
                        00      キャッシュ許可,ライトスルー
                        01      キャッシュ許可,コピーバック
                        10      キャッシュ禁止,ストアバッファ禁止
                        10      キャッシュ禁止,ストアバッファ許可

        bit4    M       Modified
                        書き込みがあったかどうかを示すビットです。MPU が
                        セットしますが、MPU はクリアしません。

        bit3    U       Used
                        使用されたかどうかを示すビットです。MPU がセット
                        しますが、MPU はクリアしません。

        bit2    W       Write Protected
                        書き込み禁止のときセット

        bit1-0  PDT     Page Descriptor Type
                        00              無効
                        01 or 11        有効
                        10              間接
                                PDT が無効のとき、このページに対するアク
                                セスはエラーになります。
                                PDT が間接のとき、bit31-2 は他のページデ
                                スクリプタのアドレスを示し、間接的なアド
                                レス変換が行われます。間接ページデスクリ
                                プタの変換は1段が限度です。



● TC (Translation Control) レジスタ

  アドレス変換の可否やページサイズを設定する制御レジスタです。MOVEC 命令

で参照および変更できます。

        bit15   E       Enable
                        アドレス変換有効

        bit14   P       Page Size
                        ページサイズ

        bit13   NAD     No Allocate Mode (Data ATC)
                        データのアドレス変換キャッシュを凍結する

        bit12   NAI     No Allocate Mode (Instruction ATC)
                        命令のアドレス変換キャッシュを凍結する

        bit11   FOTC    1/2-Cache Mode (Data ATC)
                        データのアドレス変換キャッシュを半分にする

        bit10   FITC    1/2-Cache Mode (Instruction ATC)
                        命令のアドレス変換キャッシュを半分にする

        bit9-8  DCO     Default Cache Mode (Data Cache)
                        アドレス変換無効のときのデータキャッシュモード

        bit7-6  DUO     Default UPA bits (Data Cache)
                        アドレス変換無効のときのデータのユーザページ属性

        bit5    DWO     Default Write Portect (Data Cache)
                        アドレス変換無効のときライトプロテクト

        bit4-3  DCI     Default Cache Mode (Instruction Cache)
                        アドレス変換無効のときの命令キャッシュモード

        bit2-1  DUI     Default UPA bits (Instruction Cache)
                        アドレス変換無効のときの命令のユーザページ属性

        上記以外のビットは予約済み。



●トランスペアレント変換

  68060 では、論理アドレス空間の一部についてアドレス変換テーブルを使わず

そのまま物理アドレスとする“トランスペアレント変換”が使えます。トランス

ペアレント変換は論理アドレスの上位8ビットがマスクになるので、X68030 の

メインメモリについては意味がありません。060turbo では SIMM を $10000000

以降に割り当ててあるのでトランスペアレント変換を利用することができますが、

現在は使っていません。



● DTTR0 (Data Transparent Translation Register 0) レジスタ
● DTTR1 (Data Transparent Translation Register 1) レジスタ
● ITTR0 (Instruction Transparent Translation Register 1) レジスタ
● ITTR1 (Instruction Transparent Translation Register 1) レジスタ

  これら4つのレジスタはトランスペアレント変換を設定するための制御レジス

タです。MOVEC 命令によって参照および変更することができます。DTTR0 と

DTTR1 はデータアクセス用、ITTR0 と ITTR1 は命令アクセス用で、0 と 1 の違

いはありません(2箇所設定できるというだけです)。内容は以下の通りです。

        bit31-24        Logical Address Base
                        論理アドレスベース
                        論理アドレスの上位8ビットが一致すれば有効

        bit23-16        Logical Address Mask
                        論理アドレスマスク
                        論理アドレスベースの比較で無視するビットをセット

        bit15   E       Enable  有効
                        トランスペアレント変換有効

        bit14-13        S       Supervisor Mode スーパーバイザモード
                        00      ユーザモードのみ
                        01      スーパーバイザモードのみ
                        1x      どちらでも可

        bit9-8  U1,U0   User Page Attributes    ユーザ属性
                        ページデスクリプタの UPA1,UPA0 に相当

        bit6-5  CM      Cache Mode      キャッシュモード
                        00      キャッシュ許可,ライトスルー
                        01      キャッシュ許可,コピーバック
                        10      キャッシュ禁止,ストアバッファ禁止
                        11      キャッシュ禁止,ストアバッファ許可

        bit2    W       Write Protect   ライトプロテクト
                        ライトプロテクトするときセット



● PLPA (Load Physical Address) 命令

  PLPA は、DFC に従って論理アドレス→物理アドレス変換を行う命令です。

read か write かによって次の2つの表記があります。いずれも An が指す論理

アドレスを物理アドレスに変換して An に格納します。

        PLPAR (An)  … read
        PLPAW (An)  … write

  指定されたアドレスを実際にアクセスするわけではありませんが、非常駐のペ

ージだったり、DFC=1 でスーパーバイザエリアを指定したり、PLPAW でライトプ

ロテクトされているページを指定したりするとアクセスエラー(バスエラー)が

発生します。なお、トランスペアレントなアドレスはそのまま返します。

  PLPA は特権命令です。



● PFLUSH (Flush ATC Entries) 命令

  DFC に従って、該当する ATC をクリアする命令です。68030 にも同名の命令

が存在しますが、文法も命令コードもまったく異なりますので注意して下さい。

  PFLUSH 命令には以下のような4つの表記があります。

        PFLUSH (An)     Anで示された論理ページのATCをクリアする

        PFLUSHN (An)    Anで示された論理ページのATCのGビットがセットされ
                        ていなければクリアする

        PFLUSHA         すべてのATCをクリアする

        PFLUSHAN        GビットがセットされていないすべてのATCをクリアす
                        る

  アドレス変換テーブルを書き換えたときは、必ず ATC をクリアしなければな

りません。

  PFLUSH は特権命令です。



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        上記以外の制御レジスタ

────────────────────────────────────

● SFC (Source Function Code) レジスタ
● DFC (Source Function Code) レジスタ

  PLPA、PFLUSH、MOVES などでアクセスするアドレス空間を指示するための制御

レジスタです。SFC はソースオペランド、DFC はデスティネーションオペランド

のアドレス空間を示します。それぞれ 0〜7 の値を取り、以下のような意味があ

ります。

        0       キャッシュプッシュのアクセス
        1       データのユーザモードでのアクセス
        2       命令のユーザモードでのアクセス
        3       データのアドレス変換テーブルへのアクセス
        4       命令のアドレス変換テーブルへのアクセス
        5       データのスーパーバイザモードでのアクセス
        6       命令のスーパーバイザモードでのアクセス
        7       CPU 空間(コプロセッサなど)のアクセス



● PCR (Processor Configuration Register)

  スーパースカラを有効にするときに使う制御レジスタです。MOVEC 命令で参照

および変更できます。ESS 以外はいじってはいけません。

        bit31-16        Identification

        bit15-8         Revision Number

        bit7    EDEBUG  Enable Debug Features
                        アイドルバスサイクル中に内部制御情報をアドレスバ
                        スとデータバスに出力する、と書かれている

        bit1    DFP     Disable Floating-Point Unit
                        FPU 無効。060SP が操作します

        bit0    ESS     Enable Superscalar Dispatch
                        スーパースカラ有効

        上記以外のビットは予約済み。



● BUSCR (Bus Control Register)

  命令のソフトウェアエミュレーションでバスをロックする必要があるときに使

う制御レジスタです。ユーザはいじってはいけません。



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        未実装命令

────────────────────────────────────

  68060 にはハード的に以下の命令が実装されていません。これらの命令は例外

処理でソフトウェアエミュレーションによって処理されます。060turbo では専

用のドライバの中に Motorola のサブルーチンパッケージを内蔵していますので、

これらの命令も問題なく実行できます。

  未実装整数命令

        CAS Dc,Du,<ea>   misaligned <ea>
        CAS2 Dc1:Dc2,Du1:Du2,(Rn1):(Rn2)
        CHK2 <ea>,Rn
        CMP2 <ea>,Rn
        DIVS.L <ea>,Dr:Dq
        DIVU.L <ea>,Dr:Dq
        MOVEP Dx,(d,Ay)
        MOVEP (d,Ay),Dx
        MULS.L <ea>,Dh:Dl
        MULU.L <ea>,Dh:Dl

  未実装浮動小数点単項演算命令
        FACOS
        FASIN
        FATAN
        FATANH
        FCOS
        FCOSH
        FETOX
        FETOXM1
        FGETEXP
        FGETMAN
        FLOG10
        FLOG2
        FLOGN
        FLOGNP1
        FSIN
        FSINCOS
        FSINH
        FTAN
        FTANH
        FTENTOX
        FTWOTOX

  未実装浮動小数点2項演算命令
        FMOD
        FREM
        FSCALE

  条件付き未実装浮動小数点命令
        FDBcc
        FScc
        FTRAPcc

  その他の未実装浮動小数点命令
        FMOVECR

  未実装浮動小数点実効アドレス
        FMOVEM.X Dn,<ea>
        FMOVEM.X <ea>,Dn
        FMOVEM.L #imm,#imm,FPcr/FPcr
        FMOVEM.L #imm,#imm,#imm,FPCR/FPSR/FPIAR
        F<op>.X #imm,FPn
        F<op>.P #imm,FPn

  未実装浮動小数点データ型
        F<op>.P



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        ROM

────────────────────────────────────

● ROM を変更しなければならない理由

  X68030 の起動用 ROM では起動デバイスの認識を開始する以前に 68060 で削

除された命令が使用されています。そのため、040turbo と違ってそのままでは

68060 モードを起動することができません。060turbo ではブート後に 68030 モ

ードから 68060 モードに移行することができませんので、68060 モードを使用

するためには ROM の変更が必要です。

  幸いなことに、X68030 には新しい ROM を装着するためのソケットとその ROM

を使用するように設定するためのジャンパスイッチがマザーボード上に用意され

ています。060turbo を装着するときはこのソケットとジャンパスイッチを利用

して新しい ROM を使用します。



● 新しい ROM の内容

  ROM の内容のうち、従来と異なるのは次の範囲です。

        $00FC0000〜$00FC0023    SCSI起動ハンドル
        $00FF0000〜$00FFF3FF    IPL/IOCS/SCSI

上記以外の部分、すなわち、ROM FONT、ROM HUMAN、ROM FLOAT、ROM DEBUGGER、

ROM DISK の各領域は一切変更していません。68060 モードでは、ROM HUMAN は

RAM にコピーしてからパッチをあてているので動作しますが、ROM DEBUGGER は

動作しませんので注意して下さい。

  060turbo では、68030 モードでも新しい ROM を使用します。そのため、新し

い ROM は 68030 と 68060 の両方で正常に動作するようになっています。また、

従来の ROM は 68000〜68030 で動作するようになっていましたが、新しい ROM

では 68000 への対応を省くことで 68030 の場合にも若干効率がよくなっていま

す。

  68060 モードでは MMU を正しく設定しなければデータキャッシュを使うこと

ができません。そのため、ROM HUMAN で起動した場合は常にデータキャッシュは

無効です。

  新しい ROM では、従来の ROM にあった幾つかの不具合が修正されています。

      ・[$00ED0091].b に $00 以外を設定されているとき起動時にチャイムを
        鳴らすときの LFO リセットの不具合の修正

      ・メッセージのスペルミスの修正
                Memory Managiment Unit(MMU) : On-Chip MMU
                            ^

      ・_B_KEYINP、_B_KEYSNS、_DENSNS で電卓を使うと d3 レジスタが破壊さ
        れる不具合の修正

      ・テキスト最下行にカーソルがあるときの電卓の表示位置の修正

      ・マウスカーソルの移動範囲の制限の修正

      ・_DRAWMOD の不具合の修正

なお、無意味なコードは削除しました。

  060turbo の SIMM 対策のため、未定義の例外や IOCS コールのベクタの最上

位バイトにベクタ番号が入らないことがあります。68060 モードではベクタ番号

のビット 4 が 1 となるベクタにはベクタ番号が入りません。A-line($0x)、

TRAP 命令($2x)、MFP($4x)、FD/DMAC/SCSI($6x)の各割り込みはこれに該

当しませんので、未定義の場合はベクタ番号が付いています。



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        060turbo.sys

────────────────────────────────────

● 060turbo.sys の概要

  Human68k の環境において 68060 の能力を十分に引き出すためのドライバが

060turbo.sys です。

  060turbo.sys は 68060 モード専用です。68030 モードのときは組み込まれま

せん。また、Human68k version 3.02 専用です。これ以外のバージョンや、改造

されているものは使用しないで下さい。

  ローカルメモリを含めたアドレス変換テーブルを構築し、MMU の機能を有効に

します。この時点でデータキャッシュが有効に機能するようになります。メイン

メモリはデフォルトでコピーバックモードになります。メインメモリのキャッシ

ュモードは指定可能です。

  システム制御のための IOCS コール _SYS_STAT を拡張します。040SYSpatch.x

および JUPITER.X と一部互換性があり、スーパースカラ、ブランチキャッシュ、

ストアバッファの設定が可能です。

  Motorola の M68060 Software Package(060SP)を内蔵しています。これによ

り、68060 に実装されていない命令やアドレッシングのソフトウェアエミュレー

ションをサポートします。なお、MOVEP 命令は X680x0 では特に使用頻度が高い

ため、特別扱いにして 060SP よりも速いルーチンを使用して処理するようにな

っています。

  キャッシュ操作およびローカルメモリのアドレスの都合で、Human68k の一部

にパッチをあてています。

  ローカルメモリに対応した RAM ディスクドライバを内蔵しています。RAM デ

ィスク領域はキャッシュ禁止、バースト転送にしてキャッシュ効率を向上してい

ます。TIMER LED をアクセスランプにする機能がついています。

  デバイスコールの転送データが DMA 転送できない領域にあるとき、バッファ

を媒介することで正常に転送できるように対処します。

  SCSI コールの転送データが DMA 転送できない領域にあるとき、一時的にソフ

トウェア転送に切り替えることで正常に転送できるように対処します。この機能

は X68030 内蔵 SCSI および MACH-2 で動作確認しています。

  ツクモのハイメモリのサービスコールとほぼ互換の IOCS コールを提供し、ロ

ーカルメモリからのメモリ確保が容易にできるようになっています。

  LZXLOADER.SYS 相当の圧縮ファイル展開機能を内蔵しています。

  Human68k のメモリ管理を拡張してローカルメモリ上に実行ファイルをロード

できる環境を提供する予定です。既に、XC のライブラリを使用している実行フ

ァイルをローカルメモリ上にロードし、実行前にライブラリ部分にパッチをあて

てから実行することができるようになっています。

  060SP の内部のルーチンを直接呼び出す形式の FE ファンクションコールを内

蔵しています。FLOATn.X は未実装浮動小数点命令の関係で 68060 モードでは正

常に動作しないことがあります。

  PCM 対策は何ら施されていません。PCM データがローカルメモリ上にあると正

常に鳴りませんので、PCM8A.X を使用して下さい。



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        メモリ管理の拡張について

────────────────────────────────────

●概要

  060turbo.sys では、Human のメモリ管理をローカルメモリまで延長すること

ができます。メモリ管理ポインタのリストをローカルメモリ上のメモリブロック

に繋ぐことで、Human の管理下で 16MB 以上のメモリ空間を使えるようになりま

す。

  メモリ管理を拡張するために、メモリ管理関連の DOS コールを差し換えてい

ます。

  XC のライブラリはアドレスの最上位バイトをフラグに使っているため、これ

を使用している実行ファイルはそのままではローカルメモリ上で動作しません。

そこで、XC のライブラリを使用している実行ファイルかどうかを実行直前に自

動的に判断し、もしそうならば実行前にパッチをあてるようになっています。こ

の機能によって、LK.X などもローカルメモリ上で問題なく動作します。

  現在、SXWIN.X v3.10 に対するパッチが暫定的に入っています。SX-Window

version 3.10 がローカルメモリ上で起動できます。このとき、プロセス情報で

空領域の表示が 30MB 程度になります。SXCON.X も使えます。

  他にも主要なフリーソフトなどでも拡張モードのローカルメモリ上では正常に

動作しなくなるものが多々あります。それらはロード領域制限やパッチあてなど

で解決していく予定です。



● 標準モード

物理アドレス                     論理アドレス
$00000000┏━━━━━━━━━━┓$00000000┏━━━━━━━━━━┓
         ┃ベクタ              ┃         ┃ベクタ              ┃
         ┃各種ワーク等        ┃         ┃各種ワーク等        ┃
         ┃Human起動部         ┃         ┃Human起動部         ┃
         ┠──────────┨         ┠──────────┨
         ┃Human常駐部         ┃  [$1C04]┃┌Human常駐部 ──┐┃
 スーパー┃060turbo.sys        ┃ スーパー┃│060turbo.sys    │┃
         ┃デバイスドライバ    ┃         ┃│デバイスドライバ│┃
         ┠──────────┨         ┠┴────────┴┨
         ┃                    ┃         ┃                    ┃
         ┃シェル              ┃         ┃シェル              ┃
   ユーザ┃ユーザ領域          ┃   ユーザ┃ユーザ領域          ┃
         ┃                    ┃         ┃                    ┃
         ┃                    ┃         ┃                    ┃
         ┠──────────┨  [$1C00]┠──────────┨
   ユーザ┃RAMDISK等           ┃   ユーザ┃RAMDISK等           ┃
$00C00000┣━━━━━━━━━━┫$00C00000┣━━━━━━━━━━┫
 スーパー┃I/O等               ┃ スーパー┃I/O等               ┃
$00F00000┣━━━━━━━━━━┫$00F00000┣━━━━━━━━━━┫
         ┃ROM                 ┃         ┃ROM                 ┃
$00FFFFFF┗━━━━━━━━━━┛$00FFFFFF┗━━━━━━━━━━┛
$10000000┏━━━━━━━━━━┓$10000000┏━━━━━━━━━━┓
   ユーザ┃RAMDISK             ┃ スーパー┃RAMDISK             ┃
         ┠──────────┨         ┠──────────┨
         ┃                    ┃         ┃                    ┃
         ┃                    ┃         ┃                    ┃
   ユーザ┃ハイメモリ          ┃   ユーザ┃ハイメモリ          ┃
         ┃                    ┃         ┃                    ┃
         ┃                    ┃         ┃                    ┃
         ┠──────────┨         ┗━━━━━━━━━━┛
   ユーザ┃アドレス変換テーブル┃
         ┠──────────┨
   ユーザ┃ROM領域の実体       ┃
         ┗━━━━━━━━━━┛



●拡張モード

物理アドレス                     論理アドレス
$00000000┏━━━━━━━━━━┓$00000000┏━━━━━━━━━━┓
         ┃ベクタ              ┃         ┃ベクタ              ┃
         ┃各種ワーク等        ┃         ┃各種ワーク等        ┃
         ┃Human起動部         ┃         ┃Human起動部         ┃
         ┠──────────┨         ┠──────────┨
         ┃Human常駐部         ┃  [$1C04]┃┌Human常駐部 ──┐┃
 スーパー┃060turbo.sys        ┃ スーパー┃│060turbo.sys    │┃
         ┃デバイスドライバ    ┃         ┃│デバイスドライバ│┃
         ┠──────────┨         ┗┿━━━━━━━━┿┛
         ┃                    ┃           │                │
         ┃                    ┃           │                │
   ユーザ┃ユーザ領域の実体    ┃           │                │
         ┃                    ┃           │                │
         ┃                    ┃           │                │
         ┠──────────┨         ┏┿━━━━━━━━┿┓
   ユーザ┃RAMDISK等           ┃   ユーザ┃│RAMDISK等       │┃
$00C00000┣━━━━━━━━━━┫$00C00000┣┿━━━━━━━━┿┫
 スーパー┃I/O等               ┃ スーパー┃│I/O等           │┃
$00F00000┣━━━━━━━━━━┫$00F00000┣┿━━━━━━━━┿┫
 スーパー┃ROM                 ┃ スーパー┃│ROM             │┃
$00FFFFFF┗━━━━━━━━━━┛$00FFFFFF┗┿━━━━━━━━┿┛
                                            │                │
$10000000┏━━━━━━━━━━┓$10000000┏┿━━━━━━━━┿┓
   ユーザ┃RAMDISK             ┃ スーパー┃│RAMDISK         │┃
         ┠──────────┨         ┠┴────────┴┨
         ┃シェル              ┃         ┃シェル              ┃
         ┃ユーザ領域          ┃         ┃ユーザ領域          ┃
   ユーザ┃                    ┃   ユーザ┃                    ┃
         ┃                    ┃         ┃                    ┃
         ┃                    ┃         ┃                    ┃
         ┠──────────┨         ┠─    ─    ─    ─┨
   ユーザ┃アドレス変換テーブル┃         ┃                    ┃
         ┠──────────┨         ┃                    ┃
   ユーザ┃ROM領域の実体       ┃   ユーザ┃ユーザ領域          ┃
         ┗━━━━━━━━━━┛         ┃                    ┃
                                          ┃                    ┃
                                   [$1C00]┗━━━━━━━━━━┛



●結合モード

物理アドレス                     論理アドレス
$00000000┏━━━━━━━━━━┓$00000000┏━━━━━━━━━━┓
         ┃ベクタ              ┃         ┃ベクタ              ┃
         ┃各種ワーク等        ┃         ┃各種ワーク等        ┃
         ┃Human起動部         ┃         ┃Human起動部         ┃
         ┠──────────┨         ┠──────────┨
         ┃Human常駐部         ┃  [$1C04]┃┌Human常駐部 ──┐┃
 スーパー┃060turbo.sys        ┃ スーパー┃│060turbo.sys    │┃
         ┃デバイスドライバ    ┃         ┃│デバイスドライバ│┃
         ┠──────────┨         ┠┴────────┴┨
         ┃                    ┃         ┃                    ┃
         ┃シェル              ┃         ┃シェル              ┃
   ユーザ┃ユーザ領域          ┃   ユーザ┃ユーザ領域          ┃
         ┃                    ┃         ┃                    ┃
         ┃                    ┃         ┃┌結合ブロック──┐┃
         ┠──────────┨         ┠┼────────┼┨
   ユーザ┃RAMDISK等           ┃   ユーザ┃│RAMDISK等       │┃
$00C00000┣━━━━━━━━━━┫$00C00000┣┿━━━━━━━━┿┫
 スーパー┃I/O等               ┃ スーパー┃│I/O等           │┃
$00F00000┣━━━━━━━━━━┫$00F00000┣┿━━━━━━━━┿┫
         ┃ROM                 ┃         ┃│ROM             │┃
$00FFFFFF┗━━━━━━━━━━┛$00FFFFFF┗┿━━━━━━━━┿┛
                                            │                │
$10000000┏━━━━━━━━━━┓$10000000┏┿━━━━━━━━┿┓
   ユーザ┃RAMDISK             ┃ スーパー┃│RAMDISK         │┃
         ┠──────────┨         ┠┴────────┴┨
         ┃                    ┃         ┃                    ┃
         ┃                    ┃         ┃シェル              ┃
   ユーザ┃ハイメモリ          ┃   ユーザ┃ユーザ領域          ┃
         ┃                    ┃         ┃                    ┃
         ┃                    ┃         ┃                    ┃
         ┠──────────┨  [$1C00]┗━━━━━━━━━━┛
   ユーザ┃アドレス変換テーブル┃
         ┠──────────┨
   ユーザ┃ROM領域の実体       ┃
         ┗━━━━━━━━━━┛



●拡張結合モード

物理アドレス                     論理アドレス
$00000000┏━━━━━━━━━━┓$00000000┏━━━━━━━━━━┓
         ┃ベクタ              ┃         ┃ベクタ              ┃
         ┃各種ワーク等        ┃         ┃各種ワーク等        ┃
         ┃Human起動部         ┃         ┃Human起動部         ┃
         ┠──────────┨         ┠──────────┨
         ┃Human常駐部         ┃  [$1C04]┃┌Human常駐部 ──┐┃
 スーパー┃060turbo.sys        ┃ スーパー┃│060turbo.sys    │┃
         ┃デバイスドライバ    ┃         ┃│デバイスドライバ│┃
         ┠──────────┨         ┠┴────────┴┨
         ┃                    ┃         ┃                    ┃
         ┃シェル              ┃         ┃シェル              ┃
   ユーザ┃ユーザ領域          ┃   ユーザ┃ユーザ領域          ┃
         ┃                    ┃         ┃                    ┃
         ┃                    ┃         ┃┌結合ブロック──┐┃
         ┠──────────┨         ┗┿━━━━━━━━┿┛
         ┃                    ┃           │                │
         ┃                    ┃           │                │
   ユーザ┃ユーザ領域の実体    ┃           │                │
         ┃                    ┃           │                │
         ┃                    ┃           │                │
         ┠──────────┨         ┏┿━━━━━━━━┿┓
   ユーザ┃RAMDISK等           ┃   ユーザ┃│RAMDISK等       │┃
$00C00000┣━━━━━━━━━━┫$00C00000┣┿━━━━━━━━┿┫
 スーパー┃I/O等               ┃ スーパー┃│I/O等           │┃
$00F00000┣━━━━━━━━━━┫$00F00000┣┿━━━━━━━━┿┫
         ┃ROM                 ┃         ┃│ROM             │┃
$00FFFFFF┗━━━━━━━━━━┛$00FFFFFF┗┿━━━━━━━━┿┛
                                            │                │
$10000000┏━━━━━━━━━━┓$10000000┏┿━━━━━━━━┿┓
   ユーザ┃RAMDISK             ┃ スーパー┃│RAMDISK         │┃
         ┠──────────┨         ┠┴────────┴┨
         ┃                    ┃         ┃                    ┃
         ┃                    ┃         ┃シェル              ┃
   ユーザ┃ハイメモリ          ┃   ユーザ┃ユーザ領域          ┃
         ┃                    ┃         ┃                    ┃
         ┃                    ┃         ┃                    ┃
         ┠──────────┨         ┠─    ─    ─    ─┨
   ユーザ┃アドレス変換テーブル┃         ┃                    ┃
         ┠──────────┨         ┃                    ┃
   ユーザ┃ROM領域の実体       ┃   ユーザ┃ユーザ領域          ┃
         ┗━━━━━━━━━━┛         ┃                    ┃
                                          ┃                    ┃
                                   [$1C00]┗━━━━━━━━━━┛



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        060turbo.sys のパラメータ

────────────────────────────────────

  必ず CONFIG.SYS の先頭で登録して下さい。

        device = 060turbo.sys [スイッチ …]

  現在機能するスイッチは以下の通りです。

────────────────────────────────────
文法:   -bg

説明:   スレッド間の排他制御を行います。
        -bgを指定すると、スレッドが切り替わる度に、FPUの内部状態と各レジ
        スタ、標準ハンドラ、標準ハンドラの変換状態、各ドライブのカレント
        ディレクトリ、カレントドライブが切り替わります。
        CONFIG.SYSのFILESの値は最低でも30以上を指定して下さい。
────────────────────────────────────
文法:   -bs<size>
        <size>  テンポラリバッファのサイズ(単位は KB)

説明:   -dv 指定時に使用するテンポラリバッファのサイズを指定します。
        デフォルトは 64KB です。
        テンポラリバッファは常にメインメモリ上に確保されます。
────────────────────────────────────
文法:   -cm<mode>
        <mode>  キャッシュモード
                0       キャッシュ許可,ライトスルー
                1       キャッシュ許可,コピーバック
                2       キャッシュ禁止,ストアバッファ禁止
                3       キャッシュ禁止,ストアバッファ許可

説明:   メモリのキャッシュモードを指定します。デフォルトはライトスルーで
        す。
────────────────────────────────────
文法:   -dv

機能:   デバイスドライバのアクセスでテンポラリバッファを使う

説明:   デバイスドライバのアクセスでローカルメモリとのやりとりを可能にし
        ます。
        指定されたバッファの論理アドレスが物理アドレスと異なっていたり、
        実体がローカルメモリにあるとき、テンポラリバッファを媒介してデー
        タをやりとりします。
────────────────────────────────────
文法:   -fe

説明:   060turbo.sysの内部のFEファンクションを使用することを明示します。
        後からFLOATn.Xを組み込むことができなくなります。
────────────────────────────────────
文法:   -hi

機能:   IOCS コール番号 $F8 の組み込み

説明:   IOCS コール番号 $F8 を組み込みます。
        ツクモのハイメモリ TS-6BE16 に付属している HIMEM.SYS とほぼ上位
        互換のメモリ管理機能が使えます。
        IOCS コール番号 $F8 でアクセスできるのは、ローカルメモリ上のアド
        レス変換のための領域、ROM をコピーした領域、RAMDISK を除く部分で
        す。
────────────────────────────────────
文法:   -ld<size>{[K]|M}[a][i]
        <size>  RAMDISK のサイズ
        K       <size> の単位は KB
        M       <size> の単位は MB
        a       TIMER-LED をアクセスランプにする
        i       SHIFT キーが押されていないとき初期化する

機能:   ローカルメモリ上の RAMDISK の設定

説明:   RAMDISK ドライバを組み込みます。RAMDISK の領域はローカルメモリの
        下位側から確保されます。
        <size> の範囲は 16KB から 32767KB までです。ただし、ローカルメモ
        リの容量によって制限されます。
        i を指定しなければ SHIFT キーが押されているとき初期化します。
        ただし、RAMDISK の先頭が壊れているときは無条件に初期化します。
        -ld と -md は合わせて 16 個まで指定できます。
        RAMDISK の領域はスーパーバイザプロテクトされます。
        また、キャッシュモードをノンキャッシャブル・インプリサイズドシリ
        アライゼーションにすることで、キャッシュを無駄遣いしないようにし
        ます。
例:     -ld16Mai
                ローカルメモリ上に 16MB の RAMDISK を確保します。
                TIMER-LED をアクセスランプにします。
                SHIFT キーが押されていないとき初期化します。
────────────────────────────────────
文法:   -lr

説明:   ローカルメモリがあるとき、ROM をローカルメモリにコピーして使いま
        す。
────────────────────────────────────
文法:   -lt

説明:   ローカルメモリがあるとき、アドレス変換テーブルをローカルメモリに
        置きます。
────────────────────────────────────
文法:   -md<size>{[K]|M}[a][i]
        <size>  RAMDISK のサイズ
        K       サイズの単位は KB
        M       サイズの単位は MB
        a       TIMER-LED をアクセスランプにする
        i       SHIFT キーが押されていないとき初期化する

機能:   メインメモリ上の RAMDISK の設定

説明:   RAMDISK ドライバを組み込みます。RAMDISK の領域はメインメモリの上
        位側から確保されます。
        <size> の範囲は 16KB から 32767KB までです。
        ただし、メインメモリの容量によって制限されます。
        i を指定しなければ SHIFT キーが押されているとき初期化します。
        ただし、RAMDISK の先頭が壊れているときは無条件に初期化します。
        -ld と -md は合わせて 16 個まで指定できます。
        RAMDISK の領域はスーパーバイザプロテクトされます。
        また、キャッシュモードをノンキャッシャブル・インプリサイズドシリ
        アライゼーションにすることで、キャッシュを無駄遣いしないようにし
        ます。

例:     -md512Ka
                メインメモリ上に 512KB の RAMDISK を確保します。
                TIMER-LED をアクセスランプにします。
                SHIFT キーが押されているとき初期化します。
────────────────────────────────────
文法:   -sd
説明:   IOCSによるDMA転送をソフト転送にします。
────────────────────────────────────
文法:   -ss

機能:   SCSI のアクセスでソフト転送を使う

説明:   IOCS $F5 による SCSI のアクセスでローカルメモリとのやりとりを可
        能にします。
        指定されたバッファの論理アドレスが物理アドレスと異なっていたり、
        実体がローカルメモリにあるとき、一時的にソフト転送に切り替えます。
────────────────────────────────────
文法:   -ts<size>
        <size>  アドレス変換のための領域のサイズ(単位は KB)

機能:   アドレス変換のための領域のサイズの設定

説明:   アドレス変換のための領域のサイズを指定します。
        ページサイズが 8KB のとき、ローカルメモリの容量に応じた最低サイ
        ズとデフォルトサイズは以下の通りです。
                                        最低    デフォルト
                本体16MBのみ            10KB    16KB
                本体16MB+ローカル16MB   19KB    24KB
                本体16MB+ローカル32MB   27KB    32KB
                本体16MB+ローカル64MB   44KB    48KB
                本体16MB+ローカル128MB  78KB    80KB
        1MB 以上は指定できません。
────────────────────────────────────
文法:   -xm

機能:   拡張モードの設定

説明:   拡張モードにしてからシェルを起動します。
        Human のメモリ管理をローカルメモリまで拡張します。
        -dv および -ss の指定が必要です。
        メモリ管理関係の DOS コールを拡張します。
        XC のライブラリを使用しているプログラムをロードしたとき、自動的
        にパッチをあてます。



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        IOCS _SYS_STAT($AC)

────────────────────────────────────

  システム環境の取得および設定を行うための IOCS コールです。040turbo の

040SYSpatch.x と共通のコマンドや JUPITER.X と共通のコマンドが幾つか追加

されています。今後も機能が追加される可能性があります。

<d1.w:モード
        $0000   MPUステータスの取得
                >d0.l:MPUステータス
                        bit0〜7         MPUの種類(6=68060)
                        bit14           MMUの有無(0=なし,1=あり)
                        bit15           FPUの有無(0=なし,1=あり)
                        bit16〜31       クロックスピード*10

        $0001   キャッシュ状態の取得
                >d0.l:現在のキャッシュ状態
                        bit0    命令キャッシュの状態(0=OFF,1=ON)
                        bit1    データキャッシュの状態(0=OFF,1=ON)

        $0002   キャッシュの状態をSRAM設定値にする
                >d0.l:設定後のキャッシュ状態
                        bit0    命令キャッシュの状態(0=OFF,1=ON)
                        bit1    データキャッシュの状態(0=OFF,1=ON)

        $0003   キャッシュのプッシュおよび無効化

        $0004   キャッシュ設定
                <d2.b:キャッシュの設定
                        bit0    命令キャッシュの状態(0=OFF,1=ON)
                                OFFにすると無効化されます
                        bit1    データキャッシュの状態(0=OFF,1=ON)
                                OFFにするとプッシュおよび無効化されます
                >d0.l:設定前のキャッシュ状態
                        bit0    命令キャッシュの状態(0=OFF,1=ON)
                        bit1    データキャッシュの状態(0=OFF,1=ON)

        $8000   バージョン取得
                >d0.l:バージョン番号
                >a1.l:'060T'

        $8001   指定論理アドレスのキャッシュモードの取得
                <a1.l:論理アドレス
                >d0.l:キャッシュモード
                        0       キャッシュ許可,ライトスルー
                        1       キャッシュ許可,コピーバック
                        2       キャッシュ禁止,ストアバッファ禁止
                        3       キャッシュ禁止,ストアバッファ許可
                        -1      エラー(ページデスクリプタがない,非常駐)

        $8004   指定論理アドレスのキャッシュモードの設定(ページ単位)
                <d2.l:キャッシュモード
                        0       キャッシュ許可,ライトスルー
                        1       キャッシュ許可,コピーバック
                        2       キャッシュ禁止,ストアバッファ禁止
                        3       キャッシュ禁止,ストアバッファ許可
                <a1.l:論理アドレス
                >d0.l:変更前のキャッシュモード
                        -1      エラー(ページデスクリプタがない,非常駐)

        $C001   拡張モード
                >d0.l:
                        0       正常終了
                        -1      既に拡張モードになっている

        $C006   キャッシュとスーパースカラの状態の取得
                >d0.l:キャッシュとスーパースカラの状態
                        bit0    データキャッシュの状態(0=OFF,1=ON)
                        bit1    命令キャッシュの状態(0=OFF,1=ON)
                        bit2    ストアバッファの状態(0=OFF,1=ON)
                        bit3    ブランチキャッシュの状態(0=OFF,1=ON)
                        bit4    スーパースカラの状態(0=OFF,1=ON)

        $C007   キャッシュとスーパースカラの状態の設定
                <d2.l:キャッシュとスーパースカラの状態
                        bit0    データキャッシュの状態(0=OFF,1=ON)
                        bit1    命令キャッシュの状態(0=OFF,1=ON)
                        bit2    ストアバッファの状態(0=OFF,1=ON)
                        bit3    ブランチキャッシュの状態(0=OFF,1=ON)
                        bit4    スーパースカラの状態(0=OFF,1=ON)
                >d0.l:変更前のキャッシュとスーパースカラの状態

        $F000   論理アドレスから物理アドレスを求める
                <a1.l:論理アドレス
                >d0.l:物理アドレス
                        $00000000〜$1FFFFFFF    物理アドレス
                        -1      エラー(ページデスクリプタがない,非常駐)

        $F001   アドレス変換の設定(ページ単位)
                <d2.l:物理ページアドレス
                <a1.l:論理ページアドレス
                >d0.l:ページ属性
                        -1      エラー(ページデスクリプタがない,非常駐,
                                デスクリプタの領域が不足している)

        $F002   論理ページの属性の取得と設定
                <d2.l:ページ属性
                        -1      取得のみ
                <a1.l:論理ページアドレス
                >d0.l:変更前のページ属性
                        -1      エラー



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        IOCS _HIMEM($F8)

────────────────────────────────────

  ローカルメモリ上のメモリブロックを操作するための IOCS コールです。ツク

モの拡張メモリ TS-6BE16 の添付ディスクに入っている HIMEM.SYS v1.0 とほぼ

互換で、realloc などの機能が追加されています。拡張メモリ TS-6BE16 管理ド

ライバ(TS16DRV.X)とほぼ互換です。

<d1.w:コマンドコード
        1       HIMEM_MALLOC
                ブロックの確保
                        下位アドレスから確保する
                        <d2.l:確保するブロックのサイズ
                        >d0.l:0=成功,-1=失敗
                        >a1.l:0=失敗,0以外=確保したブロックのユーザ領域の先頭

        2       HIMEM_FREE
                ブロックの開放
                        <d2.l:開放するブロックのユーザ領域の先頭
                                0=実行中のプロセスが確保したブロックをすべて開放
                        >d0.l:0=成功,-1=失敗

        3       HIMEM_GETSIZE
                確保できるサイズの取得
                        >d0.l:確保できるサイズの合計
                        >d1.l:一度に確保できる最大のサイズ

        4       HIMEM_RESIZE
                ブロックのサイズ変更
                        ブロックは移動しない
                        新しいサイズが0ならばブロックを開放する
                        <d2.l:サイズを変更するブロックのユーザ領域の先頭
                        <d3.l:新しいサイズ(0=ブロックを開放する)
                        >d0.l:0=成功,-1=失敗

        以降のコールはHIMEM.SYS v1.0にはない

        5       HIMEM_VERSION
                _HIMEMのバージョンの取得
                        >d0.l:'060T'
                        >d1.l:バージョン

        6       HIMEM_CALLOC
                配列のためのブロックの確保
                        下位アドレスから確保する
                        確保したブロックは0で初期化される
                        <d2.l:配列要素数
                        <d3.l:配列要素サイズ
                        >d0.l:0=成功,-1=失敗
                        >a1.l:0=失敗,0以外=確保したブロックのユーザ領域の先頭

        7       HIMEM_REALLOC
                ブロックのサイズ変更
                        ブロックが移動することがある
                        移動するとき新しいブロックは下位から確保する
                        移動してもブロックを確保したプロセスは変化しない
                        新しいサイズが0ならばブロックを開放する
                        <d2.l:サイズを変更するブロックのユーザ領域の先頭
                        <d3.l:新しいサイズ(0=ブロックを開放する)
                        >d0.l:0=成功,-1=失敗
                        >a1.l:0=失敗,0以外=移動後のブロックのユーザ領域の先頭

        8       HIMEM_MALLOC2
                ブロックの確保
                        <d2.l:確保するサイズ
                        <d3.w:bit15=プロセス指定フラグ
                                        0       実行中のプロセス
                                        1       d4.lを親プロセスとして使用する
                                下位8bit=モード
                                        0       下位から
                                        1       必要最小ブロックから
                                        2       上位から
                                        3       最大ブロックから
                        <d4.l:(d3.wのbit15が1のとき)親プロセスのメモリ管理テーブル
                        >d0.l:0=成功,$81xxxxxx=確保できる最大のサイズ,$82000000=まったく確保できない
                        >a1.l:0=失敗,0以外=確保したブロックのユーザ領域の先頭

        9       HIMEM_PSFREE
                特定のプロセスが確保したブロックの開放
                        子プロセスが確保したブロックも開放する
                        <d2.l:開放するブロックを確保したプロセスのメモリ管理テーブル
                        >d0.l:0=成功,-1=失敗

        10      HIMEM_GETAREA
                _HIMEMでアクセスできるメモリ空間の取得
                        >d0.l:メモリ空間の先頭(先頭のブロックのヘッダ),-1=失敗
                        >d1.l:メモリ空間の末尾+1,-1=失敗

?d0,d1-d7/a0-a6は返却に使われるものを除いて破壊されない



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        DOS コール

────────────────────────────────────

  060turbo.sys で提供される DOS コールです。主な変更点はローカルメモリ対

策に関連するものです。連続メモリ型のサブメモリ管理も整備中です。

────────────────────────────────────
$FF48   _MALLOC         ブロックの確保(下位から)
<(a6).l:確保するブロックのサイズ
>d0.l:確保したブロックのユーザ領域の先頭
        $81xxxxxx=確保できる最大のサイズ,$82000000=まったく確保できない
────────────────────────────────────
新設
$FF90   _MALLOC3        ブロックの確保(下位から)
<(a6).l:確保するブロックのサイズ
>d0.l:確保したブロックのユーザ領域の先頭
        $8xxxxxxx=確保できる最大のサイズ
────────────────────────────────────
$FF49   _MFREE          ブロックの開放
(a6).l:開放するブロックのユーザ領域の先頭
        0=実行中のプロセスが確保したブロックをすべて開放する
>d0.l:エラーコード
────────────────────────────────────
$FF4A   _SETBLOCK       ブロックのサイズ変更
        ブロックは移動しない
<(a6).l:サイズを変更するブロックのユーザ領域の先頭
<(4,a6).l:新しいサイズ
>d0.l:エラーコード
        $81xxxxxx=確保できる最大のサイズ
────────────────────────────────────
新設
$FF91   _SETBLOCK2      ブロックのサイズ変更
        ブロックは移動しない
<(a6).l:サイズを変更するブロックのユーザ領域の先頭
<(4,a6).l:新しいサイズ
>d0.l:エラーコード
        $8xxxxxxx=確保できる最大のサイズ
────────────────────────────────────
$FF88   _MALLOC2        ブロックの確保(モード指定あり)
<(a6).w:bit15=プロセス指定フラグ(0=実行中のプロセス,1=(6,a6).lを親プロセスとして使用する)
        下位8bit=モード(0=下位から,1=必要最小ブロックから,2=上位から,3=最大ブロックから)
<(2,a6).l:確保するサイズ
<(6,a6).l:((a6).wのbit15が1のとき)親プロセスのメモリ管理テーブル
>d0.l:確保したブロックのユーザ領域の先頭
        $81xxxxxx=確保できる最大のサイズ,$82000000=まったく確保できない
────────────────────────────────────
新設
$FF92   _MALLOC4        ブロックの確保(モード指定あり)
<(a6).w:bit15=プロセス指定フラグ(0=実行中のプロセス,1=(6,a6).lを親プロセスとして使用する)
        下位8bit=モード(0=下位から,1=必要最小ブロックから,2=上位から,3=最大ブロックから)
<(2,a6).l:確保するサイズ
<(6,a6).l:((a6).wのbit15が1のとき)親プロセスのメモリ管理テーブル
>d0.l:確保したブロックのユーザ領域の先頭
        $8xxxxxxx=確保できる最大のサイズ
────────────────────────────────────
$FF4B   _EXEC           子プロセスの実行
<(a6).b:モジュール番号
<1(a6).b:モード
        0       プログラムのロードおよび実行
                        <2(a6).l:実行ファイル名
                                最上位バイトは実行ファイルのタイプ(0=拡張子,1=r,2=z,3=x)
                        <6(a6).l:コマンドライン
                        <10(a6).l:環境のアドレス(0ならば実行中のプロセスの環境)
                        >d0.l:終了コード(常駐したとき上位ワード=1)
        1       プログラムのロード
                        <2(a6).l:実行ファイル名
                                最上位バイトは実行ファイルのタイプ(0=拡張子,1=r,2=z,3=x)
                        <6(a6).l:コマンドライン
                        <10(a6).l:環境のアドレス(0ならば実行中のプロセスの環境)
                        >d0.l:実行開始アドレス
                        >a0.l:メモリ管理テーブル
                        >a1.l:プログラムの末尾+1
                        >a2.l:コマンドライン
                        >a3.l:環境
                        >a4.l:実行開始アドレス
        2       実行ファイル名のpath検索
                        <2(a6).l:実行ファイル名とコマンドライン
                                最上位バイトは実行ファイルのタイプ(0=拡張子,1=r,2=z,3=x)
                        <6(a6).l:コマンドラインのバッファ
                        <10(a6).l:環境のアドレス(0ならば実行中のプロセスの環境)
                        >d0.l:エラーコード
        3       実行ファイルのアドレス指定ロード
                        <2(a6).l:実行ファイル名
                                最上位バイトは実行ファイルのタイプ(0=拡張子,1=r,2=z,3=x)
                        <6(a6).l:ロードアドレス
                        <10(a6).l:リミットアドレス
                        >d0.l:text+data+bss+comm+stackのサイズ
        4       ロード済みのプログラムの実行
                        <2(a6).l:実行開始アドレス
                        >d0.l:終了コード(常駐したとき上位ワード=1)
        5       モジュール番号の検索(最後に見つかったモジュール番号を返す)
                        <2(a6).l:実行ファイル名
                        <6(a6).l:モジュール名
                        >d0.l:モジュール番号*$100

  ロード時、LZX の展開および XC のライブラリに対するパッチあてを行います。
────────────────────────────────────
$FFAD   _S_MALLOC       メインスレッドのメモリ空間からのブロックの確保
<(a6).w:bit15=プロセス指定フラグ(0=実行中のプロセス,1=(6,a6).lを親プロセスとして使用する)
        下位8bit=モード(0=下位から,1=必要最小ブロックから,2=上位から,3=最大ブロックから)
<(2,a6).l:確保するサイズ
<(6,a6).l:((a6).wのbit15が1のとき)親プロセスのメモリ管理テーブル
>d0.l:確保したブロックのユーザ領域の先頭
        $81xxxxxx=確保できる最大のサイズ,$82000000=まったく確保できない
────────────────────────────────────
新設
$FF93   _S_MALLOC2      メインスレッドのメモリ空間からのブロックの確保
<(a6).w:bit15=プロセス指定フラグ(0=実行中のプロセス,1=(6,a6).lを親プロセスとして使用する)
        下位8bit=モード(0=下位から,1=必要最小ブロックから,2=上位から,3=最大ブロックから)
<(2,a6).l:確保するサイズ
<(6,a6).l:((a6).wのbit15が1のとき)親プロセスのメモリ管理テーブル
>d0.l:確保したブロックのユーザ領域の先頭
        $8xxxxxxx=確保できる最大のサイズ
────────────────────────────────────
$FFAE   _S_MFREE        メインスレッドのメモリ空間からのブロックの開放
        現在のスレッドのメモリ空間の先頭(先頭のブロックのヘッダ)ならばスレッドを破棄する
        それ以外はメインスレッドのメモリ管理でロックを行わずに_MFREEを行う
<(a6).l:開放するブロックのユーザ領域の先頭
>d0.l:エラーコード
────────────────────────────────────
$FFAF   _S_PROCESS      サブスレッドのメモリ空間の設定
        サブメモリ型サブスレッドのときサブスレッドのメモリ空間の先頭のブロックのヘッダを作る
        連続メモリ型サブスレッドのときサブスレッドのメモリ空間の直後にダミーのヘッダを作る
        排他制御情報を作成する
<(a6).w:スレッド番号
<2(a6).l:ブロックの先頭アドレス
<6(a6).l:サブのメモリ管理のサイズ
<10(a6).l:先頭のブロックのサイズ
>d0.l:先頭のブロックのユーザ領域の先頭
        $FFFFxxxx=最大スレッド番号,$FFFFFFF2=ブロックの指定が違う
────────────────────────────────────
$FFF8   _OPEN_PR追加処理
        スレッドが作成された直後に呼ばれる
        排他制御情報を作成する
<d0.w:作成されたスレッド番号
────────────────────────────────────
$FFF9   _KILL_PR追加処理
        スレッドが削除された直後に呼ばれる
        排他制御情報を破棄する
<d0.w:削除されたスレッド番号-1
────────────────────────────────────
$FFFF   _CHANGE_PR追加処理
        スレッドが切り替わった直後に呼ばれる
        排他制御情報を切り替える
<d0.w:次のスレッド番号



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

        あとがき

────────────────────────────────────

  060turbo に関するまとまった読み物が欲しいということで、書いてみました。

しかし、時間がなくてとても駆け足になってしまいました。まだ書きたいこと、

書かなければならないこと、更新しなければならない部分が多々あるのですが、

それらは次の機会に。1人でも多く 060turbo の世界に足を踏み入れていただけ

れば幸いです。

                                                          文責:鎌田  誠



(EOF)