Intel 80286

概要

1982年2月1日に発表、1984年から6MHz版と8MHz版が出荷された。134,000個のトランジスタを集積した1.5μmのNMOSプロセス（インテルの呼称だとHMOS-III）で製造され、性能を大幅に増加させるパイプラインを構成する4つの独立したユニット（アドレスユニット、バスユニット、命令ユニットと実行ユニット）を持っていた。クロック周波数は6、8、10、12MHz があった。パッケージには68ピンPLCC、LCC、PGAがあった。
8086とソフトウェアの上位互換性を持ち、より高速に命令実行可能（同クロック8086比で約2.5倍）。また、物理メモリ空間が16MBに拡張され、1GBの仮想記憶やマルチタスク処理に対応している。
また、インテルはこのモデルまではセカンドソース推進戦略を採用したため、AMD、富士通、シーメンス、ハリス・コーポレーション（以降、ハリスと表記）からもセカンドソース品が供給された。特にAMDとハリスは、ライセンスが受けられない80386に対抗するため、16、20MHz、ハリスは25MHz、といった、より高クロックの80286を市場に投入した。後述するようにDOSで動作させる限り、同一クロックの80386よりも高い実行速度が得られたからである。
インテル社のiAPX 286 Programmer's Reference Manualでは、CPUの80286と後述の周辺LSIの組み合わせがiAPX 286であるとしている。

HMAの活用

上記の通り80286はリアルモードとプロテクトモードを備えており、起動直後やMS-DOSでは基本的に8086や80186と互換性の高いリアルモードで動作する。
8086では1MiB(000000H - 0FFFFFH)のメモリ空間を持つが、本来16ビットのレジスタでは64KBまでのアドレス(00000H - 0FFFFH)しか表現できない。そこで16ビットレジスタを2つ用意し、まず1MB中のメモリ空間からアドレスの「原点」を10Hバイト単位で大雑把に指定し、もう１つのレジスタでそこから上位の64KBまでをアクセスできるようにしていた。したがって「原点」を示すセグメントレジスタを最大の0FFFFHに設定すれば、0FFFF0Hからさらに上位の64KBすなわち1MBを超える10FFEFHまでアドレスを表現できることになる。しかし8086ではアドレス線がA0 - A19の20本しか用意されていないため100000H - 10FFEFHのアドレスにはアクセスできず、桁あふれした部分は000000H - 0FFEFHにラップアラウンドしてアクセスすることになる。
80286ではこのようなラップアラウンドは起こらないため、インテル社のiAPX 286 Programmer's Reference Manualでは「もしリアルモードのプログラムがアドレス空間のラップアラウンドに依存している場合（例えばFFF0:0400 = 0000:0300）、上位アドレス4ビットをゼロにするために外部ハードウェアを使用すべきである」としている。
アドレス線を24本持つ80286を採用したシステム(PC/ATなど)では、ラップアラウンドを前提で作られたソフトウェアとの互換性を維持しつつ100000H以上のメモリにもアクセスできるように、21本目のアドレス線 (A20) の無効／有効を切り替えるハードウェアを持っていた。特定のI/Oポート（PC/ATではキーボードコントローラ）からA20を有効にするとリアルモードのままでも64Kバイト程度の上位メモリを参照することが可能になり、HMAと呼ばれた。
HMAは64Kバイト程度であるが640Kバイトの約10%にも相当し、メモリ枯渇に苦しむDOSユーザーにわずかな救いとなった。80386以降のプロセッサでもHMAは使用できる。
キャッシュを内蔵した80486以降のCPUではA20を無効にする機能を内蔵し、CPUにA20M#というピンを追加した。これは外部ハードウェアでA20を無効にしても80486がキャッシュに保存されたHMAにアクセスしてしまうためである。このA20M#を制御するのは、PC/ATではキーボードコントローラで変化していない。

80286の判別

80286にはCPUID命令は無く、インテルはフラグレジスタを使ったCPUの判別方法を紹介している。
PUSHF/POPF命令で読み書きできる16ビット分のフラグのうち、上位4ビットは8086世代（V30、80186などを含む）では使われていない予約ビットとなっていた。実際はその部分が1111bとして読み出せたものの、変更はできなかった。80286ではこの部分がプロテクトモードで使われるようになったため、リアルモードではゼロクリアされた状態になった。さらに仮想86モードを持つ80386からはリアルモードにおいてもこのビットが変更可能な仕様になっている。すなわちリアルモードの時点 (BIOSやMS-DOS) において、フラグレジスタのbit15-12が1111bから変更できなければ8086世代、0000bから変更できなければ80286、そのどちらでもない、つまり一部でも変更可能であれば80386以降と判断できる。

追加命令一覧

8086から使用できる基本命令セットに加え、以下の命令セットが追加された。

一般命令

80286で新たに追加された命令のうち11個の拡張命令セットは、後に発表された80186にも採用され、共通で使用できた。このほか既存の命令ではIMULとPUSHに即値（イミディエイト）が指定できるようになり、シフト・ローテイト命令ではCLレジスタを介さずに 1 以外の値を直接指定できるようになった。これらは80186でも同様である。
80286はリアルモードにおいて8086や80186と高い互換性を持つものの、完全に等価というわけではない。異なる点としては、80286以降ではPUSH SP命令の挙動が変更されている。また既存命令の組み合わせであっても、プロテクトモード上では挙動の異なる場合がある。

システム命令

80286で追加されたシステム制御/プロセッサ制御の命令はいずれもプロテクトモードないしは80287関連の命令である。このほか既存命令としてはI/O（入出力）命令の類もシステム制御に使われる命令であり、プロテクトモードでは特権命令の扱いになった。HLTも特権レベルに依存するシステム命令となった。
SGDT, SIDT, SLDT, STR, SMSWは特権命令ではなく、アプリケーションプログラムからも実行可能である。このことは30年以上続いている。インテルは、CPUIDでUMIP(User-Mode Instruction Prevention)ビットがセットされているCPUではこれらの命令を特権命令にする機能を持つとしている。
LGDT … Load Global Descriptor Table Register
SGDT … Store Global Descriptor Table Register
LIDT … Load Interrupt Descriptor Table Register
SIDT … Store Interrupt Descriptor Table Register
LLDT … Load Local Descriptor Table Register
SLDT … Store Local Descriptor Table Register
LAR … Load Access Right
LSL … Load Segment Limit
ARPL … Adjust Requested Privilege Level
VERR … Verify Read Access
VERW … Verify Write Access
LTR … Load Task Register
STR … Store Task Register
CLTS … Clear Task Switched Flag
LMSW … Load Machine Status Word
SMSW … Store Machine Status Word

廃止された命令

80286ではPOP CS命令(オペコード 0F)は廃止された。このオペコードは、80286以降、拡張命令のプリフィックスとして使用された。

非公開命令

80286の非公開命令であるLOADALLを使用するとリアルモードのままで、プロテクトメモリを含む16Mバイトのメモリにアクセス可能となる。