W65C816S(65C816、65816)は、ウェスタンデザインセンター(WDC)が開発・販売した16ビットマイクロプロセッサ(MPU)。1985年にリリースされたW65C816Sは、WDC 65C02 8ビット MPUの強化版であり、その前のモステクノロジー 6502 NMOS MPUのCMOS強化版。65C816はApple IIGSのCPUとして採用され、カスタマイズ版がスーパーファミコンのCPUとして使用された。

65816の65は65C02互換モードに由来し、816はMPUが8ビットと16ビットのレジスタサイズを選択可能であることを示している。16ビットレジスタの利用に加え、W65C816Sはメモリアドレス空間を24ビットに拡張し、最大16メガバイト(64kバイト×256バンク)のランダムアクセスメモリをサポートする。また、強化された命令セット、16ビットのスタックポインタ、およびシステムハードウェア管理を改善するいくつかの新しい電気信号を備えている。

リセット時には、W65C816Sは「エミュレーションモード」で起動し、65C02としてほぼ動作する。その後、2命令のシーケンスによって「ネイティブモード」に切り替えることができ、これによりすべての強化機能を有効にしつつ、多くの65C02ソフトウェアと高い後方互換性を維持する。しかし、65C02のPDIP40バージョンが先代NMOS版のピン互換品であるのに対し、PDIP40 W65C816Sは6502ファミリーの他のどのMPUともピン互換性がない。

W65C802または65802は、65C816と完全なソフトウェア互換性を持ちながら、6502および65C02と電気的互換性がある。そのため、65C802は6502または65C02を搭載したほとんどのシステムで代替品として使用できた。ただし、65C802は24ビットアドレスを出力することができず、アドレス空間が64KBに制限される。65C802は現在製造されていない。

## 歴史

1981年、WDCの創設者でありCEOであるビル・メンシュは、主にロックウェルセミコンダクタとシナーテックの生産パートナーとともに、65C02の開発を開始した。65C02の主な目標は、オリジナルの6502のNMOSプロセスからCMOSプロセスへの移行であり、これにより、クロックスピードに関係なく消費電力を1⁄10から1⁄20に抑えることが可能となった。また、最大サポートクロックスピードを向上させる能力も求められた。65C02の設計では、NMOS 6502に存在したチップエラッタ(例:悪名高い`JMP (<addr>)`バグ)を解消し、新しい命令や既存命令用の新しいアドレッシングモードを導入した。

1982年、メンシュはアップルコンピュータと協議し、グラフィックスや音響機能が改善されたApple IIシリーズの新しいバージョンのためにW65C816Sの開発を開始した。Appleは、Apple IIで使用されていた6502とソフトウェア互換性があり、より多くのメモリにアクセスし、16ビットのデータワードをロードおよび保存できるMPUを求めていた。65C816は1984年3月に完成し、その年の後半にサンプルがAppleとAtariに提供され、1985年に正式リリースされた。メンシュの設計プロセスには、妹のキャサリンも加わり、デバイスのレイアウトの一部を担当した。

同じプロセスで65C802も開発された。65C802は65C816と内部的に同一であり、両者は同じ製造ラインで生産され、最後のメタル化段階で外部ピンに接続される際の工程が異なった。65C802はピンがオリジナルの6502と同じレイアウトになっており、これにより代替品として使用可能でありながら、CPUの16ビット処理を利用できた。ただし、オリジナルのピン配置を使用していたため、16本のアドレスピンしか持たず、外部メモリは64KBしかアクセスできなかった。通常、ハードウェアメーカーはゼロからプロジェクトを設計する際に65C816を使用したため、65C802は生産が中止された。

Appleはその後、65C816をApple IIGSコンピュータに採用した。65C816の基本設計は、1980年代中期から1990年代初頭にかけてVLSIテクノロジー、GTE、三洋電機などによってセカンドソースで供給された。

ルネサスエレクトロニクスのマイクロコンピュータ・7700ファミリは65816と共通した設計だが、完全な互換性はない。

1990年代には、65C816と65C02の両方が完全なスタティックコアに変換され、プロセッサのØ2クロックを完全に停止してもレジスタ内容を失わないようになった。この機能とSRAMの使用により、待機状態で最小限の電力を使用する設計が可能となった。

2024年4月年現在、W65C816SはWDCから40ピンのPDIP、PLCC44、または44ピンのTQFPパッケージとして入手可能であり、W65C265を介してMCUとして、およびASIC統合用のIPコアとして提供されている(例:WinbondのW55V9xシリーズのテレビエデュテインメント用IC)。

## 機能

WDC 65c816の特徴:

- 完全にスタティックなCMOS設計により、低消費電力(1MHzで300 マイクロアンペア)と高い耐ノイズ性を実現。
- 広範な動作電圧範囲: 1.8 V ~ 5.0 V ± 5%。
- 広いクロック周波数範囲。公式には5Vで最大14MHz(SuperCPUでは20MHz)に対応し、単一フェーズクロックソースを使用。
- エミュレーションモードにより、NMOS 6502およびCMOS 65C02と大部分でソフトウェア互換性を保持(未記載のオペコードを除く)。65C816の256オペコードはどちらの動作モードでも機能する。
- 24ビットメモリアドレッシングで16 MBのアドレス空間にアクセス可能。
- 16ビットのALU、アキュムレータ (`C`)、スタックポインタ (`SP`)、およびインデックスレジスタ (`X` と `Y`)。
- 16ビットの直接ページ(ゼロページ)レジスタ (`DP`)。
- 8ビットのデータバンク (`DB`) およびプログラムバンク (`PB`) レジスタは、24ビットアドレスのビット16–23を生成。プログラムとデータバンクレジスタを分離することで、プログラムのセグメント化と16MBのリニアデータアドレッシングを実現。
- メモリ判定用の有効データアドレス (`VDA`) および有効プログラムアドレス (`VPA`) 制御出力。
- 割り込みベクタ取得時を示すベクタプル (`VPB`) 制御出力。
- バスエラー(例:ページフォルトやメモリアクセス違反)修正用のアボート (`ABORTB`) 入力と関連ベクタ。
- 24のアドレッシングモード(元の6502モード13種、新命令セット92種を含む)。
- RAM間のデータ構造を効率的にコピーするブロックコピー命令(`MVN` と `MVP`)。
- 電力消費をさらに削減するウェイトフォーインタラプト (`WAI`) およびストップザクロック (`STP`) 命令。
- コプロセッサ命令 (`COP`) により、浮動小数点演算ユニットなどのコプロセッサ構成をサポート。
- 将来の設計へのリンクとして、予約済み「エスケープ」(`WDM`)命令(WDMは設計者ビル・メンシュのイニシャルに由来)。

## 以前のモデルとの比較

### 2つの動作モード

65C816には「エミュレーションモード」と「ネイティブモード」の2つの動作モードがある。「エミュレーションモード」では、16ビット操作が無効化され、インデックスレジスタが8ビットに制限されるため、6502に非常に近い動作をする。このモードではオペコードのサイクルタイミングも6502と同じである。一方、「ネイティブモード」ではすべての新機能が利用可能になる。CPUは電源投入時またはリセット時に自動的にエミュレーションモードに入り、65(C)02の代替品として動作するが、異なるピン配置に対応するために回路変更が必要。

### 16ビットレジスタ

ネイティブモードで動作する65C816の最も顕著な変更点は、さまざまなレジスタが8ビットから16ビットに拡張されることである。この変更は、アキュムレータ(`A`)、`X`および`Y`のインデックスレジスタ、およびスタックポインタ(`SP`)に影響を与える。ただし、プログラムカウンタ(`PC`)はもともと16ビットなので影響を受けない。

ネイティブモードでは、ステータスレジスタ内の2ビット(ビット4と5)の意味が変わる。オリジナルの6502ではビット4は未使用だったが、「ブレイク」(`b`)フラグとして参照され、ビット5は未使用だった。ネイティブモードでは、ビット4は`x`フラグ、ビット5は`m`フラグに変わり、インデックスレジスタ(`x`)およびアキュムレータ/メモリ(`m`)が8ビットまたは16ビットのサイズになるかを制御する。これらのビットは、プロセッサの電源投入時またはリセット時には1に固定されているが、ネイティブモードに切り替えると変更可能になる。

ネイティブモードでは、`REP`および`SEP`命令を使用して`m`および`x`ステータスビットを操作することで、プログラマがレジスタサイズを16ビットまたは8ビットに設定できる。アキュムレータとインデックスレジスタのサイズを個別に設定できるため、たとえば、アキュムレータを8ビット、インデックスレジスタを16ビットに設定することで、64KB範囲内の個々のバイトを操作する際にポインタ演算を省くことができる。

レジスタサイズが16ビットに設定されている場合、メモリアクセスでは隣接する2バイトを1クロックサイクルごとにフェッチまたはストアする。そのため、`ROR <addr>`のような読み取り-修正-書き込み命令を使用すると、アキュムレータが16ビットの場合は隣接する2バイトに影響を与え、クロックサイクルも8ビットの場合より多く消費する。同様に、すべての算術および論理操作は16ビット演算となる。

### 24ビットアドレッシング

ネイティブモードでのもう1つの重要な変更点は、メモリモデルが元の6502の16ビットフォーマットから24ビットフォーマットに拡張されたことである。65C816は8ビットのデータバンクレジスタ(`DB`)およびプログラムバンクレジスタ(`PB`)を使用してアドレスのビット16–23を設定し、24ビットアドレスを生成する。これにより、64KBの連続したメモリセグメント(例: `$xx0000-$xxFFFF`)がバンクアドレス`xx`で定義される。両方のレジスタは電源投入時またはリセット時に`$00`に初期化される。

命令やオペランドのフェッチサイクルでは、`PB`がプログラムカウンタ(`PC`)に前置されて24ビットの有効アドレスが形成される。ただし、`PC`がオーバーフローしてゼロに戻っても`PB`はインクリメントされない。そのため、プログラムは実行中のバンクの範囲内に制限される。バンクをまたぐジャンプやサブルーチン呼び出しには「ロング」ジャンプやサブルーチン呼び出しを使用する必要がある。プログラムから直接`PB`を変更する手段はない。

データのフェッチやストアサイクルでは、`DB`が16ビットデータアドレスに前置されて24ビットの有効アドレスが形成され、これによりデータがアクセスされる。この特性により、16ビットアドレスを使用する6502または65C02コードが正常に動作する。`PB`とは異なり、`DB`はプログラム制御で変更可能で、16ビットアドレッシングの範囲を超えるデータにアクセスするために使用されることがある。また、`DB`は、インデックス付きアドレスが現在の`DB`のバンクの範囲を超えた場合、一時的にインクリメントされる。

さらに、16ビットの直接ページレジスタ(`DP`)が追加された。このレジスタは、かつて「ゼロページ」と呼ばれていた領域の基準アドレスを設定する。直接ページアドレッシングでは8ビットアドレスを使用するため、16ビットまたは24ビットアドレスを使用する場合よりも高速。また、間接参照を提供する一部のアドレッシングモードは直接ページでのみ可能。65(c)02では直接ページは常にメモリの最初の256バイト(ゼロページ)に固定されているが、65C816のネイティブモードでは直接(ゼロ)ページをバンク`$00`内の任意の位置に再配置できる。ただし、`DP`がページ境界(例: `$xx00`)に設定されていない場合、1サイクルのアクセスペナルティが発生する。

### モードの切り替え

現在の動作モードはエミュレーションビット(`e`)に格納されている。ステータスレジスタ(`SR`)の既存の6つのフラグセットに新しい`x`および`m`ビットを追加したため、新しいモードビットを保持するためのビットが不足した。その代わりに、新しいモードビットは「不可視」とされ、直接アクセスすることができないユニークな解決策が採用された。`XCE`(eXchange Carry with Emulation)命令を使用して、エミュレーションビットの値とキャリービット(`c`、`SR`のビット0)を交換する。たとえば、プロセッサの起動後にネイティブモードに入る場合、`CLC`でキャリービットをクリアし、次に`XCE`を使用してキャリービットをエミュレーションビットに書き込む。 65C02エミュレーションモードに戻るには、`SEC`の後に`XCE`を実行する。

内部的には、65C816は完全な16ビット設計である。`SR`内の`m`および`x`ビットは、ユーザーレジスタがシステムにどのように見えるかを決定する。リセット時には、65C816は6502エミュレーションモードで起動し、`m`および`x`は`1`にロックされている。このため、レジスタは8ビットサイズに固定される。アキュムレータの最上位バイト(`B`-アキュムレータ)は直接アクセスできないが、`XBA`命令を使用して最下位バイト(`A`-アキュムレータ)と交換することができる。インデックスレジスタ(`X`および`Y`)には対応する操作はなく、それらの最上位バイトは`$00`にロックされている。

ネイティブモードに切り替えると、`X`および`Y`の最上位バイトはゼロになり、`B`-アキュムレータの値は変更されない。`SR`内の`m`ビットがクリアされると、`B`-アキュムレータは`A`-アキュムレータと結合して16ビットレジスタ(`C`-アキュムレータ)を形成する。アキュムレータまたはメモリを含むロード/ストア操作や算術/論理操作は16ビット操作になり、16ビット値をフェッチ/ストアするために2バスサイクルが必要である。

`SR`内の`x`ビットがクリアされると、両方のインデックスレジスタが16ビットに設定される。アドレスをインデックス化するために使用される場合(例: `LDA SOMEWHERE,X`)、インデックスレジスタ内の16ビット値が基準アドレスに加算されて有効アドレスが形成される。

`SR`内の`m`ビットがセットされると、アキュムレータは再び8ビットレジスタに戻り、アキュムレータに対する操作は一部の例外を除いて8ビット操作になる。アキュムレータが16ビットに設定されている間に保持していた`B`-アキュムレータの値はそのまま保持される。例外は、直接ページレジスタ(`DP`)およびスタックポインタ(`SP`)をアキュムレータに転送する命令であり、ネイティブモードでは`SR`内の`m`ビットの状態に関係なく、常に16ビット幅で実行される。

`SR`内の`x`ビットがセットされると、インデックスレジスタは8ビットに戻り、それらが16ビット幅であった間に保持していた最上位バイトの値は失われる。アセンブラで記述する場合は要注意である。

## 主な採用ハード

- エイコーン Acorn Communicator
- Apple IIGS
  - 6502互換ということで、Apple II GSのCPUとして採用されている。
- C-One および コモドール64 用の SuperCPU 拡張
- スーパーファミコン (Ricoh 5A22というカスタム版CPU)
  - 同様にファミリーコンピュータのCPUである6502の上位互換であることからスーパーファミコンにも搭載された(スーパーファミコン自体は公式的にはファミリーコンピュータと互換ではないが、上位互換性を持たせるように設計はされており、ファミコンのカセットを挿せるファミコンアダプタなるものも案としては存在した)。
  - 一部のスーパーファミコン用ゲームソフトは65816上位互換の任天堂SA-1を搭載していた。

- Foenix Retro Systems C256 U/U+ モデル および F256K モデル

## 参考資料

- 65C816 Datasheet; Western Design Center; 55ページ; 2018年。
- Eyes, David および Ron Lichty; Programming the 65816: Including the 6502, 65C02, and 65802; Brady Publishing; 636ページ; 2015年。
- Fischer, Michael; 65816/65802 assembly language programming; Osborne/McGraw-Hill; 686ページ; 1986年。