VM8600SP

VM8600SPはブイ・エム・テクノロジー社(以下VM technology社)が1988年に開発したマイクロプロセッサで、Intel社の8086やリアルモードの80286や一部386の拡張命令とも互換性のある命令体系と、オリジナルの32 bit命令の両面を持つ意欲的なプロセッサでした。オリジナルの32 bit命令体系では、32 bitリニアアドレスを扱え(外部に出力されているアドレス信号は512 MByte分)、32本の32 bitレジスタ(16 bitレジスタとして扱う場合は64本分)を自由に扱えるなど、かなり強力なプロセッサになっています。ただ8086の命令とバイナリ互換を取ったために、オリジナル命令のバイナリコードが8086で使用されないコードに割り振られてしまい、オブジェクトが長くなっています。386とは異なる形ですが、一種の仮想8086モードを実現できるような仕組みがあり、複数の8086プロセスを並行動作させることも可能です。
ハードウェア的には、29 bitのアドレスバスと16 bitのデータバスがマルチプレクスされずに個別の端子を割り当られていて、複数のバスタイミングモードを持ち386SXとバスタイミング互換にすることも可能です。浮動小数点演算は行えませんが、80287とのインターフェースを内蔵しています。
その他、プログラムデバッグ用のレジスタを内蔵していて、特定のアドレス領域を参照したときや特定の命令を実行したときにブレークをかけたりシングルステップ動作を行うことも可能であり、デバッグサポート機能もすぐれています。

とりあえず写真を。

VM8600SP-A16
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

追加命令
BRVM

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データ処理命令

追加命令
BR86

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