MOS 6502

MOS 6502（モス・ロクゴーゼロニ）は、1975年にアメリカ合衆国のMOS Technology社から発表された8ビットマイクロプロセッサである。当時の競合製品、特にインテル8080やモトローラMC6800と比較して、極めて安価な価格設定と、高い処理効率を両立した革新的な設計思想により、パーソナルコンピュータおよびテレビゲーム機の黎明期における普及を決定づけた、歴史的に特に重要なCPUの一つとして位置づけられる。CMOS化とともに命令も強化され、そのアーキテクチャが現在も組み込みシステムで使われ続けている重要なマイクロプロセッサである。より正式にはMOS Technology 6502と表記される。

 概要 
開発背景と市場戦略
6502の開発チームは、モトローラ社のMC6800の開発に携わっていたエンジニア、特にチャック・ペドル（Chuck Peddle）とビル・メンチ（Bill Mensch）らを中心とするメンバーが、モトローラを退社し構成された。彼らは、当時の高価なCPU（約179ドル）が市場の拡大を阻害していると判断し、製品をホビイスト向けに25ドルという破格の低価格で販売するという、積極的な価格破壊戦略を採用した。この低価格戦略は、ホビー用コンピュータ・個人用コンピュータ市場を一気に開拓しApple、Commodore、Atariといった新興企業による革新的な製品への採用を促す決定的な要因となった。（#歴史）

主要な技術的特徴
6502の設計は、チップ面積の最小化と命令実行サイクルの短縮、すなわち高いコストパフォーマンスの実現に重点が置かれている。

シンプルなレジスタ構成
6502のレジスタセットは極めて簡素化されており、8ビットのアキュムレータ（A）が1つ、同じく8ビットのインデックスレジスタ（XとY）が2つ存在するのみである。このシンプルな構成は、競合製品よりもトランジスタ数を大幅に削減し、低コスト化と高速動作に貢献した。インデックスレジスタが8ビット幅であるため、プログラミングにおいては効率的なポインタ操作のためにゼロページ・アドレッシングを多用する手法が確立された。

高効率なパイプライン処理
6502は、命令のフェッチ（読み出し）とデコード（解釈）と実行をオーバーラップさせる洗練されたパイプライン機構を備えている。この機構により、同じクロック周波数で動作する同時期の他社のCPUよりも、実効的な処理速度が格段に速くなった。多くの命令がわずか数クロックサイクルで完了するため、リアルタイム処理が求められるゲーム機などのシステムにおいて特に有利であった。

多彩なアドレッシングモードとゼロページ
6502は、豊富なアドレッシングモードを有し、メモリアクセスの柔軟性と効率性を高めている。
ゼロページ・アドレッシング - メモリマップの最初の256バイト（$0000〜$00FF）を「ゼロページ」と定義し、アドレスを1バイトのオペランドで指定できる。これにより、命令コードを短縮し、かつ高速なメモリアクセスを可能にしたため、この領域は頻繁に利用される変数やポインタの格納に不可欠となった。
間接アドレッシング - 間接アドレッシングにおいては、インデックスト・インダイレクト（Indexed Indirect: (IM8, X)）とインダイレクト・インデックスト（Indirect Indexed: (IM8), Y）という、動作順序が異なる2種類のモードを備えている。これらは、特にデータ構造やテーブルへのアクセスを効率的に行うための強力な機能であった。

バス互換性とバイトオーダー
6502はMC6800と多くの点でバス互換性を持っていたが、データ格納のバイトオーダーはMC6800のビッグエンディアンとは異なり、リトルエンディアン（下位バイトが先にメモリに格納される）を採用している。

派生CPU、CMOS化による組み込み用途の発展
6502は、その価格優位性と処理効率から、1970年代や1980年代は、多くのマイクロコンピュータ（ホームコンピュータ、パーソナルコンピュータ）のCPUとして採用された。Apple Computer社のApple IおよびApple II、Commodore社のPET 2001やVIC-20、Atari社のゲーム機Atari 2600などに広く採用された。 さらに、任天堂の家庭用ゲーム機ファミリーコンピュータ（NES）には、6502に音源回路を追加・統合し代わりに10進演算機能を削除した派生チップRP2A03（リコー製）が搭載され、世界的な普及に貢献した。#歴史、#採用例

オリジナルはNMOSのプロセッサであったが、1980年ころからWDC社により、省電力で発熱の少ないCMOS版の開発が進み、さらにオリジナルのNMOS版の命令セットのいくつかの欠点も改良され（ #CMOS化）、1983年からCMOS版65C02の出荷が開始され、組み込み用途のCPUとして採用されることが増え、寿命の長いCPUとなっていった。CMOS技術は1980年代以降の半導体の主流となり、CMOS版65C02は現代に至るまで生産が（主にWDCによって）継続されており、産業用システムの長期的な維持に不可欠なプロセッサであり続けている（#採用例）。　　

 6502のレジスタセット 
+ 6502のレジスタセット呼称説明PプロセッサステータスAアキュムレータXインデックスレジスタXYインデックスレジスタYPCプログラムカウンタ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の範囲の相対番地を指定する。ゼロページ・インデックストXnn,Xゼロページの番地にXレジスタの値を加算した番地を指定する。ゼロページ・インデックストYnn,Yゼロページの番地にYレジスタの値を加算した番地を指定する。アブソリュート・インデックストXnnnn,X絶対番地にXレジスタの値を加算した番地を指定する。アブソリュート・インデックストYnnnn,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割り込み名詳細優先順位$FFFANMI制御不能の強制割り込み。間隔はシステムに依存2$FFFCRESET開始時のみ発動1$FFFEIRQ/BRKBRK 命令 (0x00) 時に発動3

 周辺チップ 
としては、6502用のタイミングにあわせた6521（6821互換）PIAや6522、6551 (ACIA) などが用意されていた。

 CMOS化 
当初、6502はNMOSプロセスで生産されたが、オリジナルのNMOS版6502と比較して消費電力の低いCMOS (Complementary Metal-Oxide-Semiconductor) 版である65C02が、ウェスタンデザインセンター（WDC）によって開発・改良された。WDCは1980年代初頭にこの技術を導入し、1983年頃には製品の出荷を開始した。

CMOS版は下記の点でNMOS版に優り、6502という設計の寿命を組み込みシステムの世界で大幅に延ばすことになった。
NMOSはトランジスタがオフ状態でも電流が流れ続ける（静的消費電力が発生する）のに対し、CMOSはオフ状態のとき電流がほぼゼロになり、特に待機状態や低速動作時の電力消費が劇的に減少し、バッテリー駆動の機器も多い組み込みシステムへの採用で有利になった。
発熱が少ないことでヒートシンクが不要になり、システムの小型化や信頼性の向上に貢献した。
CMOS回路はNMOSよりも電源電圧変動に対するノイズ耐性が高く、特に産業用途やノイズの多い環境での信頼性が向上した。

また、NMOS版から以下の命令が追加されている。
 アキュムレータ（Aレジスタ）を操作する命令（INC, DEC）を追加 - NMOS版6502にはAレジスタのインクリメント・デクリメントが存在しなかった。公式のニモニックはパラメータ無しのINC, DECだが、アセンブラによってはINAやINC Aなど書式のバリエーションがある。
 STZ命令（STore Zero、値$00のストア）を追加 - Aレジスタを変更せずに、直接メモリに $00 をストアできるようになり、Aレジスタの状態を保存・復元する手間が省け、コードが簡潔になった。
 インデックスレジスタをスタックに出し入れする命令（PHX, PLX, PHY, PLY）を追加 - NMOS6502版では、一度インデックスレジスタをAレジスタに転送してからPHA命令でスタックに入れ、スタックから出す際にはPLA命令でAレジスタに取り出してからインデックスレジスタに転送する必要があった。この命令の追加で、インデックスレジスタとスタック間の転送が、より柔軟に行えるようになった。
 BRA命令（BRanch Always、無条件相対分岐）を追加 - 無条件で相対分岐を実行する。NMOS版6502は無条件分岐に絶対アドレス指定の JMP命令しか持たず、相対アドレス指定による短いコードを実現できなかった。BRA命令の追加により、リロケータブルなコードの作成が容易になり、コードサイズが削減された。
 ビット操作命令（SMB, RMB）およびビット判定命令（BBR, BBS）の追加 - ゼロページメモリ上の特定のビットを直接セット（Set Memory Bit）またはリセット（Reset Memory Bit）する命令（SMB, RMB）や、特定のビットを判定して分岐する命令（BBR, BBS）が追加された。制御機器やI/Oポート操作を行う組み込みシステムにおいて、これらの命令は処理速度を大幅に向上させ、コードを劇的に簡素化した。
NMOS版で存在した以下の問題点についても修正されている。

 リセット時のDフラグの挙動 - 6502では、リセット時や割り込み発生時にDフラグの値が未定義であり、リセットや割り込みの処理で必ず初期化が必要であった。65C02では、リセットや割り込み発生時には常にDレジスタが0にリセットされるようになり、初期化コードの削減とともに原因の分かりづらいバグを減らせることになった。

 間接アドレスジャンプの不具合の修正 - NMOS版6502のJMP ($xxxx) 命令（間接ジャンプ）は、アドレスの下位バイトが$FFの場合、上位バイトの取得時にアドレスが正しくインクリメントされないという致命的な不具合があった。65C02ではこれが修正され、信頼性の高い間接分岐が可能になった。
 インデックスドアドレッシングの際の不正なアクセスの修正 - 6502では、インデックスレジスタを使用して256バイトのページをまたぐメモリアクセスの際、不正なメモリへのアクセスが行われていた。この挙動はメモリにマッピングされたI/Oポートへのアクセスの場合に解明しづらいバグの原因になりうる。65C02では、正しいアドレスが準備できてからメモリアクセスが行われるように改良され、このような問題は起きない。
 未定義オペコードの挙動の確定 - NMOS版6502では、命令セットにないオペコードを与えると予測不能な動作をしたり、意図しない二つの命令を実行したりする「非公式命令」の挙動が問題となった。65C02では、これらすべての未定義オペコードはNOP（No OPeration）として処理されるようになり、システムの安定性が向上した。
 リードモディファイライト（RMW）の内部動作の改良 - INC $xxxxなどの、メモリに対する変更をメモリに書き戻す命令の場合、6502では書き込み動作が2回発生していた（読み込んだ値をそのまま書き込み、次に変更後の値を書き込む）。これはメモリにマッピングされたI/Oポートのアクセスに影響を与え、解明が難しいバグの原因となる可能性があった。65C02では書き込み動作は1回となり（ロジックの変更で、読み込みは2回されるるが書き込みは1回となった）、書き込み時の影響を抑えた。
 BRK命令とハードウェア割り込みが重なった際の挙動の修正 - 6502では、BRK（ソフトウェア割り込み）と同時にハードウェアの割り込みが発生した場合、BRKは処理されずに無視されていた。65C02では割り込み処理のタイミングが変更され、ハードウェア割り込みの後にBRKが実行されるようになった。

なお、CMOS版65C02 は基本的に一つの標準として設計されたが、ウェスタンデザインセンター（WDC）、ロックウェル・インターナショナル、リコー、、など複数のメーカーが製造し、異なるメーカーの 65C02では、一部の拡張命令や未定義オペコードの挙動にわずかな違いが生じ、あるいはWDCの 65C02 のように WAI (割込待ち) / STP (停止) 命令が追加されていたりするなど、拡張命令のセットにバリエーションが生じたことに若干の注意を要する。

モステクノロジーによる製造はもう行われていない。

 互換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で使用。
 G65SC02
 による互換CPU。他の65C02で追加されている無条件相対ジャンプ命令などの一部命令も追加されているが、ビット操作やビット判定、WDC版で追加されている割り込み待ち（WAI）や停止（STP）などの命令は含まれていない。
 RP65C02 (RICOH)
 CMOS版で、Rockwell製NMOS版6502とピンコンパチブルであり、パワーダウン、スタンバイモードなどCMOSの特長を備える。
 RP2A03 (RICOH)
 6502から10進演算関連の機能が削除され、サウンド機能が追加されているもの。命令はNMOS版の6502準拠で、65C02準拠ではない。ファミリーコンピュータで使用された。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の表レジスタ、裏レジスタのように切り替えられる。YIS（ワイズ, Yamaha Integrated System）はコンピュータを中心としたトータルシステムのホームコンピュータで使用した。
 SPU
 ソニー製のチップまたはCPUコアで、8ビットのアキュムレータの上下の4ビットの部分を交換するXCN (eXChange Nibble) と8ビット×8ビット=16ビットの乗算命令が追加されている。スーパーファミコンのDSP制御用としても使用された。

 採用例 
オリジナルの6502だけでなく、互換CPUも挙げる。

 トレーニングキット、ホームコンピュータ、ゲーム機 
 KIM-1 - 開発元によるワンボード型の開発キット（トレーニングキット）。オリジナルの6502を搭載。
 Apple I - オリジナルの6502。スティーブ・ウォズニアックが、当時Motorola 6800の半額ほどで済むという理由でCPUに採用した（Mos technology側の意図通り、低価格に反応した）。Apple I自体の製造は170~200台程度だったが、後継機のApple IIにも採用される理由となったので、その意味で重要。
 Apple II - 1977年5月リリース。大ヒット商品、ロングセラーとなり、Apple IIのおかげで6502に親しむ人が急増した。Apple II Plus, IIeでも採用。Apple IIシリーズの累計販売台数は、（正確な数は不明だが）13年間の販売期間の累計で500万台から600万台ほどだとされる。
 Commodore PET（PET 2001）- 1977年1月発表、10月発売。
 CBM3032
 Atari 400/Atari 800 - 1979年発売
 VIC-20 （日本国内名:VIC-1001）- 1980年ころ発売
 :en:Acorn Atom - 1980年
 Commodore 64 - 1982年発売。改良版のMOS 6510を採用
 任天堂ファミリーコンピュータ（海外版: Nintendo Entertainment System (NES)) - 互換CPU。1983年ころ発売
 Atari 5200 - ゲーム機、1982年
 Commodore 128 - ホームコンピュータ
 NEC PCエンジン (TurboGrafx-16) - ゲーム機、1987年

 制御用、組み込み用 

 2000年代の主な用途 
産業用・組み込み用制御機器:
エレベーター制御システム
医療機器
自動販売機
セキュリティシステム
計測機器
通信機器
ATMや決済端末の一部制御部
産業用ロボットのサブコントローラ
一部のMIDIシーケンサーやエフェクターの制御部
コンピュータの原理を教育するプラットフォーム（例: 6502系の"開発キット"や"トレーニングキット"や"Trainer"やと名付けられたキット）
趣味、レトロコンピューティング (英語版)、自作コンピュータ (例: 6502ベースのホームブリューコンピュータ)

 歴史 
きっかけ
モトローラの技術者としてMC6800の設計とマーケティングに携わっていたチャック・ペドル（Chuck Peddle）は、当時の高価なマイクロプロセッサがホビーや個人用途の市場開拓を妨げているという強い信念を持っていた。ペドルは、モトローラで6800の廉価版を提案したが受け入れられず、1974年に設計者であるビル・メンチ（Bill Mensch）らと共に退社し、MOS Technology社に移籍した。

設計
新チームは、6800のアーキテクチャを参考にしつつ、チップ面積を最小化するためにレジスタ数を徹底的に削減し、代わりにアドレッシングモードとパイプライン処理を洗練させた6502を設計した。これは、当時最も成功していたインテル8080やMC6800の価格（約179ドル）を大きく下回ることを目的としていた。

発表
6502は、1975年9月にサンフランシスコで開催されたウェスコン（WESCON）という見本市で正式に発表された。この際、チャック・ペドルは競合他社のブースで自社の6502を25ドルという破格の価格で販売し、大きな話題を呼んだ。ペドルの狙い通り、この価格設定は当時の業界に大きな衝撃を与え「パーソナルコンピュータ革命」の引き金の一つとなった。

採用
6502は、その低コストと性能のバランスから、電子ホビイストらや初期のコンピュータメーカーに急速に採用された。初期段階で特に重要だったのは下記の採用である。
KIM-1 - MOS Technology自身がホビイスト向けに開発・販売したシングルボードコンピュータに搭載。安価な学習・開発用プラットフォームとして普及した。（KIMはKeyboard Input M'onitorの略）。
Apple II: 1977年に発売されたApple ComputerのApple IIに搭載され、この機種の世界的な成功により6502の地位は決定的なものとなった。
Commodore PET - 1977年にCommodore International（MOS Technologyを1976年に買収）から発売された一体型パーソナルコンピュータCommodore PET 2001にも採用された。
ゲーム機 - Atari社の家庭用ゲーム機Atari 2600（1977年）や、後に続くAtari 5200などにも搭載され、ゲーム業界の中核CPUとしても広く利用された。

初期ロットの不具合と実務的対処
6502は設計段階で高い完成度を誇ったものの、初期に出荷されたNMOS版チップにはいくつかのマイナーな技術的欠陥が確認されていた。その中でも、ROR命令（右回転命令）は、特定の条件下で誤動作する不具合があった。この問題に関しMOS Technology社は、設計の修正を行うまでの間のユーザーの混乱と誤用を避ける、という実務的で賢い判断を行い、初期の公式ドキュメント（データシート）ではROR命令を意図的に非掲載とする対応を取った。そしてこの不具合は、1976年5月以降に出荷されたチップにおいて速やかに修正され、ROR命令は正常に動作するようになったので、公式ドキュメントの命令セットに正しく掲載されることになり、当時の市場に広く普及した大半の6502チップにはこの問題は存在しない。 人気のKIM-1に搭載されているMOS 6502も、ほとんどの場合基板に直接はんだ付けされておらずDIPソケット（Dual In-line Package socket）に差し込まれており、正常動作する6502チップに差し替え可能となった。

派生CPU、16ビット化による長期的な展開 (1980年代以降)
6502の成功を受け、多くのメーカーがライセンス生産や互換チップの開発を行った。1980年代初頭には、低消費電力化を図ったCMOS版の65C02が登場し、オリジナル版のバグも解消された。任天堂のファミリーコンピュータ（NES）には、音源回路を統合した6502のカスタム派生チップRP2A03が搭載され、世界的な普及に貢献した。さらに16ビットに拡張されたW65C816は、Apple社のApple IIGSや任天堂のスーパーファミコン（SNES）に採用され、そのアーキテクチャは現在に至るまで利用され続けている。

 他 
なお、ARM (Acorn RISC Machine) の設計は6502を参考に行われたとされることがあるが、設計者らは6502を参考に設計を行ったわけではない。ARMの命令セットを設計したソフィー・ウィルソンは、6502とARMにはほとんど共通点がないと述べている。別のインタビューでは、（メインメモリをVRAMとしても使っている当時のパソコンの設計では）メモリアクセスが比較的に高性能であり、6502はそれを利用するバランスがすぐれていた、という事のみ言及している。

 脚注 
 注釈 

 出典 

 参考文献 








 関連項目 
 KIM-1、SYM-1、AIM-65

 外部リンク 
 6502.org
 6502 Web Ring

Category:マイクロプロセッサ