とりあえず写真を。
84ピンPLCCパッケージです。
VM8600SPの命令体系には、8086命令と、さらにそれに追加された命令セットがあります。追加された命令セットにはタイプA命令群と名づけられた386データ処理命令に分類されるグループと、タイプB命令群と呼ばれる独自に拡張されたVMZ命令体系のグループに分けられます。
さらにVM8600SPの動作モードには、86モード、86ユーザモード、VMZスーパバイザモード、VMZユーザモードの4種類があります。86モードと86ユーザモードでは、特権命令とされる命令の実行に関して制限が異なるにしろ、基本的に8086と同じ命令だけを実行できます。VMZスーパバイザモードとVMZユーザモードでは、やはり特権命令の扱いが異なりますが、全命令を実行できるようになっています。ただし、86モードと86ユーザモードは物理アドレス計算の方法が異なるとか、命令実行条件が異なる点がいくつかあります。
表にして整理してみると、命令体系は次のように分類されることになります。
命令体系 | 8086命令 | 386データ処理命令 | VMZ命令 |
実行可能モード | 全モード | VMZスーパバイザモード
VMZユーザモード |
VMZスーパバイザモード
VMZユーザモード |
データ長(bit) | 8/16 | 8/16/32 | 8/16/32 |
実効アドレスサイズ(bit) | 16 | 16/32 | 16/32 |
論理アドレスサイズ(bit) | - | 32 | 32 |
物理アドレスサイズ(bit) | 20 | 29 | 29 |
汎用レジスタ数 | バイト幅8本
ワード幅8本 |
バイト幅8本
ワード幅8本 ダブルワード幅8本 |
バイト幅32本
ワード幅64本 ダブルワード幅32本 |
セグメントレジスタ数 | ワード幅4本 | ダブルワード幅6本 | ダブルワード幅8本 |
別の視点から、動作モードを軸にして整理するとこのようになります。参考に、純正の8086の動作も入れてあります。
モード | 8086(参考) | 86 | 86ユーザ | VMZスーパバイザ | VMZユーザ |
命令数 | 253 | 254 | 242 | 520 | 501 |
命令セット | 8086命令 | 8086命令
・以下は使用不可 LD PS, opr 追加命令
|
86モードの命令
・以下は使用不可 HALT DI EI IN A, imB IN ZA, imB IN A, DE IN ZA, DE OUT imB, A OUT imB, ZA OUT DE, A OUT DE, ZA BRVM |
8086命令
・以下は使用不可 POP PS LD PS, opr 286データ処理命令 追加命令
386データ処理命令 VMZ命令 |
VMZスーパバイザ命令
・以下は使用不可 86特権命令 HALT DI EI IN A, imB IN ZA, imB IN A, DE IN ZA, DE OUT imB, A OUT imB, ZA OUT DE, A OUT DE, ZA BRVM VMZ特権命令 INM/INMB INMW/INMD OUTM/OUTMB OUTMW/OUTMD IN GR, imW OUT GR, imW LD CR, GR LD GR, CR BR86 BRVM EISアクセス命令 |
プリフィックス | 7種類 | 7種類 | 7種類 | 11種類 | 11種類 |
ポストフィックス | なし | なし | なし | 8種類 | 8種類 |
割り込み予約ベクタ | 5種
0: 除算エラー 1: シングルステップ 2: NMI 3: BRK3 4: BRKV |
8種
8086に以下追加 7: コプロセッサ不在 16: コプロセッサエラー 30: シリコンエミュレーションブレーク |
9種
86モードに以下追加 13: 特権違反 |
10種
86モードに以下追加 5: BRKOOR 6: 命令長 |
11種
VMZスーパバイザに以下追加 13: 特権違反 |
アドレス計算
64 KByte境界 |
ラップアラウンド | ラップアラウンド | ラップアラウンド | 16 bitアドレスのとき
ラップアラウンドなし |
16 bitアドレスのとき
ラップアラウンドなし |
アドレス計算
1 MByte境界 |
ラップアラウンド | ラップアラウンド | ラップアラウンド | 境界なし | 境界なし |
アドレス21ビット目以上 | 存在せず | 特定数値に固定 | VMZスーパバイザでセグメントレジスタ上位に設定された値を使用
86ユーザ内部では変更不可 |
任意に利用可能 | 任意に利用可能 |
割り込みによる状態遷移 | - | 86モード内で処理 | VMZスーパバイザに遷移 | VMZスーパバイザ内で処理 | VMZスーパバイザに遷移 |
この表で、命令数とはオペコードの種類数と考えてください。
このほか、8086への互換性をとるか80286以降との互換性を取るかで、86モード、86ユーザモードとVMZスーパバイザモード、VMZユーザモード間での細かい違いとかも存在しますし、VMZスーパバイザモードとVMZユーザモードにはデフォルトの実効アドレス計算方式を16
bitで行うか32 bitで行うか選択可能になっていてアドレス計算がさらにこみいっているとか、複雑で面倒な差異がありますが、大まかにはこんなものでしょうか。
86モードはVM8600SPを単なる高速の8086互換マイクロプロセッサとして利用するためのモードで、このモードだけを利用するかぎりはVM8600SPの拡張機能をほとんど利用できません。ただし、8086との互換性は一番高いので、8086用に開発されたソフトウェアをオペレーティングシステムごと移植するのはもっとも容易でしょう。
他のモードは、基本的にVMZスーパバイザモードで動作するオペレーティングシステムを利用してプログラムを実行するためのモードですが、VMZスーパバイザモードは些細な差異を除いて8086の機能をすべて含んでいますから、8086用のオペレーティングシステムの移植も一部書き換えるだけで可能でしょう。86ユーザモードをうまく利用すれば、VMZスーパバイザモードで動作するオペレーティングシステム下で8086互換コードによる複数のプロセスを互いにメモリ保護された環境下で並行動作させることが可能です。VMZユーザモードでも複数プロセスを並行動作させられますが、各プロセスから全メモリ空間を操作できるため、メモリ保護の観点からは注意が必要となります。
では次はレジスタについて。
VM8600SPのアーキテクチャで考慮されているレジスタセットはすべて32 bit幅で、33本の汎用レジスタ、9本のセグメントレジスタ、プログラムカウンタ、プログラムステータスワード、256本のスーパバイザ制御レジスタ、同じく256本のユーザ制御レジスタの6種類があります。ただし、ユーザ制御レジスタはVM8600SPに1本も実装されていませんし、スーパバイザ制御レジスタも11本実装されているだけです。
汎用レジスタは次のように名前が付けられています。
レジスタ番号 | 32 bit全体 | 上位16 bit | 下位16 bit | 下位8 bit |
0 | GR0 | GH0 | GL0 | GB0 |
1 | GR1 | GH1 | GL1 | GB1 |
2 | GR2 | GH2 | GL2 | GB2 |
3 | GR3 | GH3 | GL3 | GB3 |
4 | GR4 | GH4 | GL4 | GB4 |
4' | GR4' | - | - | - |
5 | GR5 | GH5 | GL5 | GB5 |
... | ... | ... | ... | ... |
31 | GR31 | GH31 | GL31 | GB31 |
GR4だけGR4'という裏レジスタがあるのに注意してください。これは、実はGR4がスタックポインタであり、スーパバイザモード用とユーザモード用の2種類のスタックポインタが用意されているためです。
さて、GR0からGR7までの汎用レジスタには別名が付けられていて、8086系の命令で使用できるようになっています。
レジスタ名 | 32 bit全体 | 下位16 bit | 上位8 bit | 下位8 bit | 8086の対応レジスタ名 |
GR0 | EZA | ZA | Z | A | AX |
GR1 | EBC | BC | B | C | CX |
GR2 | EDE | DE | D | E | DX |
GR3 | EHL | HL | H | L | BX |
GR4 | ESSP | SSP | - | - | SP |
GR4' | EUSSP | USP | - | - | - |
GR5 | EFP | FP | - | - | BP |
GR6 | EIX | IX | - | - | SI |
GR7 | EIY | IY | - | - | DI |
この表で上位8 bitというのは32 bitレジスタの下位16 bitの中をさらに8 bit幅ふたつに分割したときの上位8
bitです。VM8600SPで拡張されたレジスタセットの部分には、この上位8 bitの部分を直接指定する名前が付いていないことに注意してください。8086のコードを実行するためにGR0からGR3までが特別扱いされている部分です。たとえば8086命令でAHに相当する部分を変更したら、GR0のビット15からビット8までが書き換えられるようになっているわけですね。
VM8600SPの8086モードからは、上の表の(GR4'を除く)8種類の汎用レジスタしか扱えなくなっています。すべての汎用レジスタを操作するためにはVMZモードでなくてはなりません。
セグメントレジスタには次の9本があります。
レジスタ番号 | レジスタ名 | 役割 | 別名 | 16 bit別名 |
0 | SR0 | 補助データセグメント | EES | ES |
1 | SR1 | プログラムセグメント | EPS | PS |
2 | SR2 | スーパバイザスタックセグメント | ESSS | SSS |
2' | SR2' | ユーザスタックセグメント | EUSS | USS |
3 | SR3 | データセグメント | EDS | DS |
4 | SR4 | 予備データセグメント | EFS | - |
5 | SR5 | 予備データセグメント | EGS | - |
6 | SR6 | 予備データセグメント | EHS | - |
7 | SR7 | 割り込みセグメント | EIS | - |
ここでもスタック関係はスーパバイザ用とユーザ用の2種類のセグメントレジスタが用意されています。
特徴的なのは、86モードや86ユーザモード用に用意されている16 bit分の別名ですが、32
bit幅のセグメントレジスタの下位16 bitに対応していません。32 bit幅のセグメントレジスタの第19ビットから第4ビットまでに対応しています。たとえば86ユーザモードでESを書き換えたものをVMZスーパバイザモードで調べると下位4
bitは変化せずに、その上の16 bitの場所だけが書き換わっていることがわかるはずです。こうすることで、LSI内部のアドレス生成部では常に32
bitセグメントレジスタ全体を論理アドレスにシフトせずにそのまま加算して物理アドレスに変換しているのでしょう。
その16 bit別名ですが、86モードではES, PS, SSS, DSだけが使用されます。また、86ユーザモードではES,
PS, USS, DSだけが利用可能です。
EISだけは見慣れないセグメントですが、割り込みベクタ参照用のセグメントレジスタです。
プログラムカウンタは全32 bit幅をEPCと呼び、下位16 bitをPCと呼びます。8086のIPに相当するのがPCで、386でいうEIPに相当するのがEPCです。
プログラムステータスワードも32 bitに拡張されていて、下位16 bitをPSW、全体をEPSWと呼んでいます。それぞれ8086のFLAGSと386のEFLAGSに対応しますが、EPSWの上位16
bitに定義されているフラグ類は386のEFLAGSに含まれるものと互換性はありません。PSWとFLAGSの互換性については、VM8600SPを86モードか86ユーザモードで動作させるかぎり未定義ビットの値にいたるまで考慮されています。
EPSWに含まれるフラグについて、具体的に表で示します。
bit | 名称 | 意味 |
31 | US/SV* | ユーザモードフラグ
0ならば86モードかVMZスーパバイザモードを示す。 1ならば86ユーザモードかVMZユーザモードを示す。 ユーザモードからは変更できない。 |
30 | 予約 0 | - |
29 | D | デフォルトサイズフラグ
86命令体系のオペランドサイズやアドレスサイズのデフォルト値を決定する。 |
28 - 16 | 未使用 0 | - |
15 | VM* | VMZモードフラグ
0ならばVMZスーパバイザモードかVMZユーザモードを示す。 1ならば86モードか86ユーザモードであることを示す。 ユーザモードからは変更できない。 |
14 - 12 | 未使用 0/1 | 未使用であるがVM*フラグと同じ値となる。 |
11 | OF | オーバーフローフラグ
符号付き2進数に関する演算のオーバーフローを示す。 |
10 | DF | ディレクションフラグ
ストリング操作命令のポインタ増減方向を決定する。 |
9 | IF | 割り込み許可フラグ |
8 | TF | トラップフラグ
コードのシングルステップ実行用。 |
7 | SF | サインフラグ
演算結果の最上位ビットがコピーされる。 |
6 | ZF | ゼロフラグ
演算結果が0ならセットされる。 |
5 | 0 | - |
4 | AF | 補助キャリーフラグ
BCD演算補正用に使われる。 |
3 | 0 | - |
2 | PF | パリティフラグ
演算結果の下位8 bitに偶数個の1が含まれているならセットされる。 |
1 | 1 | - |
0 | CF | キャリーフラグ
演算結果の桁上げなどでセットされる。 |
この表からわかるように、86モードか86ユーザモードのときPSW部分は未使用ビットも含めて8086と完全互換になります。それ以外のモードのときは80286や386のユーザモードでのFLAGSと互換になるようにされています。
US/SV*フラグとVM*フラグを組み合わせて4種類の動作モードを設定できます。
スーパバイザ制御レジスタには次の11種類が実装されています。
レジスタ番号 | 略称 | 名称 |
00H | MCW | マシンコントロールワード |
20H | SCR01 | ブレークポインタ0, 1制御レジスタ |
24H | SCR2 | ブレークポインタ2制御レジスタ |
26H | EMUCR | エミュレーション主制御レジスタ |
28H | SDT2 | ブレークポインタ2データ |
30H | SPA0 | ブレークポインタ0実アドレス |
32H | SAM0 | ブレークポインタ0アドレスマスク |
34H | SPA1 | ブレークポインタ1実アドレス |
36H | SAM1 | ブレークポインタ1アドレスマスク |
38H | SPA2 | ブレークポインタ2実アドレス |
3AH | SLEJ | ラストエグゼキュートジャンプアドレス |
MCWは80286などの制御レジスタであるマシンステータスワードMSWに相当するもので、両者に共通する制御ビットも存在します。数値演算プロセッサ関係の設定などに利用されます。
残りのレジスタはシリコンエミュレーションコントロールレジスタ群に属するもので、ソフトウェアのデバッグに利用されます。3種類のブレークポイントを設定できるのですが、そのブレークポイントというのが実は領域を指定できて、特定の領域をアクセスしたり、逆に特定の領域以外をアクセスしたときにブレークすることもできます。ブレークポインタ2を利用すると、特定のアドレスを参照したときのデータがあらかじめ設定してあったものと一致する場合に限りブレークすることもできます。せいぜいトレース実行程度の8086と比べると非常に強力ですね。もっとも8086開発時より10年も経っている頃のプロセッサですけど。
さてVMZモードで拡張された命令ですが、モード遷移用のBR86命令なんかを別にすれば、アセンブリ言語レベルでは既存の命令のアドレッシングモードが拡張されただけのように見えます。
つまり、ADD命令とかLD命令で任意の8, 16, 32 bitレジスタを利用できるとか、32
bitレジスタのポストインクリメント間接やプリデクリメント間接アドレッシングなども利用できます。詳細は書きませんが、もっとも複雑なアドレッシングモードでは、任意の32
bit汎用レジスタのひとつをベースレジスタに、もうひとつをインデックスレジスタとして扱い、インデックスレジスタに1,
2, 4, 8のいずれかのスケーリングファクタを乗算したものをベースレジスタに加算し、さらに32
bitの定数をディスプレースメントとして加算したものが実効アドレスになります。実際には、さらに条件に応じて32
bitセグメントレジスタのどれかの値と加算されたものが32 bit論理アドレスであり、MV8600SPの場合には論理アドレスの下位29
bitが物理アドレスとして出力されます。VMZモードでは32 bit汎用レジスタなどを利用して32
bit実効アドレスを生成して利用できるため、アドレス拡張のためのセグメントレジスタが不要となり、通常はすべてのセグメントレジスタに0が設定されて、実効アドレスと論理アドレスが等しくなるようにして使われるでしょうけれど。
8086系のプログラムをアセンブリ言語で作成していて、もっと内部レジスタがあれば効率が上がるのにとか悩んだことのある人からみると、実にありがたい拡張と言えるでしょうね。
Return to IC Collection