MOS 6502
MOS 6502はアメリカのモステクノロジーが1975年に発表した8ビット MPU (CPU) である。
1977年に発売されたApple II に搭載されて一躍有名になり、その後PET 2001、CBM3032、VIC-1001等、主にコモドール社の製品で採用されていた。日本ではパソコン用のCPUとしてはそれほど普及しなかったが、互換CPUがファミリーコンピュータやPCエンジンに採用されている。
概要
モトローラのMC6800をモデルに、レジスタセットの簡素化をはかり、多彩なアドレッシングモードと良く練られたパイプライン機構を持ち、同時期に設計された同一程度動作クロックの他CPU (MPU) 群に比べて格段に高速に演算処理を実行できた。レジスタを小さく、少なくし、ハードウェア規模を減らして高速化を図ったのではないかと見られる節がある一方で、以下のような特徴を持つ。
- 0から255番地までのメモリ(ゼロページ)を1バイト少ないコードでアクセスできる
- アドレッシングモードが豊富
- Xレジスタ側のインデックスXとインダイレクトXと、Yレジスタ側のインダイレクトYとインデックスYとでは、動作内容が違う
処理をアセンブリで記述していく事に向いているCPU (MPU) だが、高級言語やCで記述したコードのためのコンパイラも存在する。典型的なCISCとして分類されるが、特徴的なアーキテクチャは「RISCの原型」として挙げられることもある。
当時の競合製品と比較して破格の安値がつけられたことでアメリカのホビーストの間ではポピュラーな存在となった。設計はMC6800によく似ていて、バスが互換のほか、ピン配置も一部を除いて揃っている(完全ではないのは後述の訴訟の影響による)。68系と同様に「MPU」と呼称されることがあるが、MC6800シリーズと違ってバイトオーダはリトルエンディアンである。
訴訟
モステクノロジーはモトローラからスピンアウトしたチームで、当初に発表したMCS6501で起こったモトローラとの特許係争(ピン配列が完全互換だった問題)もあって、1976年に資金難から、コモドール傘下のコモドールSemiconductor Group (CSG) となっていたが、ICのマーキングにはMOSブランドがしばらく使用されていた。同社は1994年にコモドールごと倒産した(モステクノロジー社はMostek社とは別の会社である)。セカンドソースは多社にわたるが、ロックウェル (Rockwell international) 社やウェスタンデザインセンター(Western Design Center、1977年にモステクノロジーのメンバーがスピンアウトした会社)、Synertek、GTEなどがあり、モステクノロジーの後を引き継ぐ形になっている。
最初、NMOSプロセスで生産されたが、後にロックウェルとウエスタンデザインセンターからCMOS版の65C02が登場した。65C02では、STZ(値$00のストア)やBRA(無条件相対分岐)といった命令が追加され、6502にあったバグが修正されたが、両者の65C02は拡張命令のコードが違っていた。
周辺チップとしては、6502用のタイミングにあわせた6521(6821互換)PIAや6522、6551 (ACIA) などが用意されていた。
6502のレジスタセット
呼称 | 説明 |
---|---|
P | プロセッサステータス |
A | アキュムレータ |
X | インデックスレジスタX |
Y | インデックスレジスタY |
PC | プログラムカウンタ |
S | スタックポインタ |
- 6502のレジスタはPCが16ビットであることを除き、すべて8ビットである。
- スタックポインタも上位8ビットが$01に固定されており、スタック領域は1ページ ($0100 - $01FF) の256バイトのみが使用可能。
命令セット
- 命令はバイト単位で、1 - 3 バイトの可変長命令である。
- 主な命令内容は以下の通り
- メモリまたはイミディエイト値からレジスタへのロード
- レジスタからメモリへのストア
- レジスタ値を別のレジスタへ転送(コピー)
- Aレジスタを用いた次の処理
- 加算
- 減算
- ビット論理演算
- 比較演算
- 絶対番地による無条件分岐
- サブルーチン分岐・リターン
- Pレジスタ値による相対番地への条件分岐
- スタックへのプッシュ・プル
- Pレジスタへのセット・クリア
- 加減算命令は、必ずキャリーを伴って行われるため、単に2値の加減算を行う場合には、必ずCLCまたはSEC命令でキャリーを初期化する必要がある。
- リセット直後は$FFFC番地に格納されたアドレス(RSTベクタ)から増加する方向に実行が行われる。また、スタックポインタはアドレスが減少する方向に自動的に減算されるため、スタックはメモリ下位番地に向かって伸びる。
- アセンブリ言語において、ニーモニックは必ず3 文字で表記される。
- 豊富なアドレッシングモードを持つ。
- A,P以外のレジスタをスタックに直接プッシュ・プルする命令はない。
- インデックスレジスタの値は+1,-1できるが、算術・論理演算に使用する命令はない。
主なアドレッシングモード
呼称 | 記述 | 説明 |
---|---|---|
イミディエイト | #nn | 直接8 ビットの値を指定する。 |
アブソリュート | nnnn | 直接16 ビットの番地を指定する。 |
ゼロページ | nn | ゼロページの番地を下位8ビットで指定する。 |
リラティブ | nn | 命令直後から-128 - +127の範囲の相対番地を指定する。 |
ゼロページ・インデックストX | nn,X | ゼロページの番地にXレジスタの値を加算した番地を指定する。 |
ゼロページ・インデックストY | nn,Y | ゼロページの番地にYレジスタの値を加算した番地を指定する。 |
アブソリュート・インデックストX | nnnn,X | 絶対番地にXレジスタの値を加算した番地を指定する。 |
アブソリュート・インデックストY | nnnn,Y | 絶対番地にYレジスタの値を加算した番地を指定する。 |
インデックストX・インダイレクト | (nn,X) | ゼロページ・インデックストXで指定される番地に格納された16 ビット値を指定する。 |
インダイレクト・インデックストY | (nn),Y | ゼロページの指定番地に格納された16 ビット値に、Yレジスタの値を加算した番地を指定する。 |
ただし、nには16進1桁の数値を指定する。
- ゼロページではアブソリュートより命令のコード数が1バイト少なくなり、所要サイクル数も変化する。
- MC6800シリーズは「16 ビットインデックス値+8 ビット定数」になるのに対して、6502はインデックスレジスタが2 つで「16 ビット絶対番地+8 ビットインデックス値」になっているのが最大の違いとなっている。比較すると、インデックスレジスタの重要性が増す代わりに、ポインタを扱うのは難しくなっている。
割り込み
6502の割り込み処理は三種類ある。それぞれの割り込みにつき、所定のアドレスに割り込み処理ルーチンの先頭アドレスが記載されており、割り込みが入るとそこへ制御をうつす。割り込み処理ルーチンを終了して元のルーチンに復帰するにはRTI 命令 (0x40
) を使用する。
$XXXX | 割り込み名 | 詳細 | 優先順位 |
---|---|---|---|
$FFFA | NMI | 制御不能の強制割り込み。間隔はシステムに依存 | 2 |
$FFFC | RESET | 開始時のみ発動 | 1 |
$FFFE | IRQ/BRK | BRK 命令 (0x00 ) 時に発動
|
3 |
互換CPU
- 65C02 (Rockwell)
- CMOS版で、命令が拡張されている。
- W65C02 (Western Design Center)
- CMOS版で、Rockwellのものとは別の形で命令が拡張されている。Apple IIe, IIcなどに採用。
- 6507
- 6502のアドレスを13ビットに削減したもの。Atari 2600(アタリ)で使用。
- 6510
- 6502にクロック入力ピンとI/Oポートを追加。VIC-20 (VIC-1001) の後継機、コモドール64、マックスマシーンで使用。改良版の7501/8500/8501というバリエーションも存在する。
- 8502
- 6510を高速化、コモドール128で使用。
- RP65C02 (RICOH)
- CMOS版6502。Rockwell製NMOS版6502とピンコンパチブル、命令コンパチブルであり、さらに59の命令の追加、パワーダウン、スタンバイモードなどCMOSの特長を備える。
- RP2A03 (RICOH)
- 6502から10進演算関連の機能が削除され、サウンド機能が追加されているもの。ファミリーコンピュータで使用。CPUのIPコアも存在した。
- HuC6280
- ハドソンが開発。高クロック化がはかられ独自に命令拡張がなされたもの。PCエンジンで使用。
- 65816 (W65C816)
- Western Design Centerが開発。レジスタの16ビット化を含む多くの機能拡張がなされたもの。Apple IIGSやスーパーファミコンで採用。
- 740ファミリ
- ルネサス エレクトロニクス(旧三菱電機)社製の8ビットMCUコア。7200、740/7450/7470、7600、38000シリーズがある。8ビット定数を直接ゼロページに入れる命令、乗除算命令(一部のもの)を備える。ビット操作・ブランチ命令もあるが、両65C02のものとは互換性がない。スタックは1ページではなくゼロページに置くことも可能。ROM・RAMと周辺機能を内蔵し、ゼロページの下位はI/Oレジスタとなっている。
- 7700ファミリ
- ルネサス エレクトロニクス(旧三菱電機)社製の16ビットMCUコア。7700、7900シリーズがある。公式にはうたっていないが内容的には6502を拡張したもので、65816とはレジスタ構成と命令セットの多くが共通であり、さらに多バイト長コードの命令が増えている。6502エミュレーションモードはない。ビット操作・ブランチ命令は両65C02や740シリーズとは互換性がない。ROM・RAMと周辺機能を内蔵する。
- YM-2002 (YAMAHA)
- ヤマハ製の互換CPU。ゼロページが2ページあり、Z80の表レジスタ、裏レジスタのように切り替えられる。ホームコンピュータで使用した。
- SPU
- ソニー製のチップまたはCPUコアで、8ビットのアキュムレータの上下の4ビットの部分を交換するXCN (eXChange Nibble) と8ビット×8ビット=16ビットの乗算命令が追加されている。スーパーファミコンのDSP制御用としても使用された。
なお、ARM (Acorn RISC Machine) の設計は6502を参考に行われたとされることがあるが、ARMが6502を参考にしたのはアーキテクチャではなく、シンプルで扱い易いCPUというコンセプトであり、ARMと6502のアーキテクチャ自体は大きく異なっている。また、ARMの命令セットを設計したSophie Wilsonは、6502とARMにはほとんど共通点がないと述べている[1]。