戻る

WDC W65C816

WDC W65C816
Data 8/16bit / Address Bus 24bit
Cycle 1MHz〜14MHz
(1983)

「MOS 6502」を開発したMOS社が1976年にCommodore社に買収された後、開発者の1人であるBill Menschが1978年に設立したのがWDC社(Western Design Center)である。

前期型:「65C802」
WDC社設立後販売された「6502」と完全ピン互換を持つ8bit CPUである。
アドレスバスは内部16bitである。

日本ではハドソンが当モデルをベースとした「HuC6280」を開発している。
これはPCエンジンやPC-FXなどに採用された。

海外PCのAcorn CommunicatorやApple ][GSなどに採用された。
任天堂スーパーファミコンに搭載されているのはライセンス生産のリコー「5A22」である。
「5A22」にはDMAや乗除算レジスタなどサポート回路が追加されている。

●65C816のピン配列

Vss1 40RES
RDY2 39VDA
ABORT3 38MX
IRQ4 37φ0
N.C.5 36N.C.
NMI6 35N.C.
SYNC7 34R/W
Vcc8 33D0
A09 32D1
A110 31D2
A211 30D3
A312 29D4
A413 28D5
A514 27D6
A615 26D7
A716 25A15
A817 24A14
A918 23A13
A1019 22A12
A1120 21Vss

●65C816の特徴

基本的には「6502」の拡張である。

レジスタ名Bit幅構成説明
Acc C16bitAcc A(A)/Acc B (8bit)→Accumulator
Index X16bitXL(X)/XH (8bit)→Index Register
Index Y16bitYL(Y)/YH (8bit)→Index Register
PC16bit →Program Counter
SP16bitSL(SP)/SH→Stack Pointer
Direct16bitDL/DH→Direct Register
PSR8bitC/Z/I/D/B,X/M/V/N (1bit)→Processor Status Register
E1bit →Emulation Mode Flag

各レジスタが16bitに拡張されているが、内部の下位8bitを独立して使用することで「6502」との互換性を持っている。
24bitアドレスに対応するため、インデックスレジスタに8bit幅の「DBR」(Data Bank Register)、プログラムカウンタに8bit幅の「PBR」(Program Bank Register)が追加されている。
ただし、PCをインクリメントしてもPBRには影響されないなど、あくまでも24bitに対応した拡張仕様である。
また、ゼロページ領域拡張のため「6502」にはなかったダイレクトレジスタが追加されている。
1bitのエミュレーションモードは0ならNative(65C816)、1ならEmulation(6502 Compatible)で動作する。

「PSR」は以下のような構成である。

フラグ名説明(Emulation)/ 説明(Native)
bit7「N」 最上位bit(MSB)が「1」の場合、成立(負数)
bit6「V」 オーバーフローの場合、成立
bit5「M」 常に1/ Memory Select Bit (0:8bit/1:16bit)
bit4「B/X」ブレイクフラグ (1でBRK割込発生)/ Index Register Select Bit (0:16bit/1:8bit)
bit3「D」 デシマルフラグ (1でBCDモード)
bit2「I」 割込フラグ (1で割込禁止)
bit1「Z」 0になった場合、成立
bit0「C」 Carryがあった場合、もしくはBorrowがない場合、成立

bit5「M」が追加されたフラグで、Emulationモード時は常に1、Nativeモード時に演算モードを指定する。
bit4「B/X」が変更されたフラグで、Emulationモード時はブレイクフラグ、Nativeモード時にインデックスレジスタのレジスタ長切替を指定する。

●アドレス空間

24bitのアドレス空間を持ち、I/OもメモリマップドI/Oとして使用される。
「6502」と同様、256byteで区切られた単位を「ページ」と呼び、その中でも特別な用途で使われる「ゼロページ」とスタック領域として使用される第1ページが特に重要な意味を持つ。

「65C816」では更に64kByte単位で区切られた「バンク」という境界がある。
バンクは256個あるが、その中でも0番バンクはスタック領域に利用されたり、対象が限定される操作が存在するなどの特別な役割を持つ。

●アドレッシングモード

「65C816」のアドレッシングモードはバンクの追加などがあるため「6502」より更に複雑になっている。

アドレッシングモード略号説明
イミディエート#即値
アブソリュートa16bit絶対アドレス参照
アブソリュートロングal24bit絶対アドレス参照
ダイレクトdダイレクトレジスタと8bitオフセット値を加算したバンク0のアドレスを参照 (「6502」のゼロページに相当)
アキュムレータAニーモニック自体に対象(アキュムレータ)が内包されている
インプライドiニーモニック自体に対象が内包されている
スタックsスタックポインタが示すバンク0のアドレスを参照
ダイレクトインデックスXd,xダイレクトアドレッシングにダイレクトインデックスXを加算したバンク0のアドレスを参照 (「6502」のゼロページX間接に相当)
ダイレクトインデックスYd,yダイレクトインデックスアドレッシングのダイレクトインデックスY版(「6502」のゼロページY間接に相当)
アブソリュートインデックスXa,xダイレクトインデックスXとバンク番号「DBR」に16bit指定アドレスを加算したアドレスを参照
アブソリュートインデックスYd,yアブソリュートインデックスアドレッシングのダイレクトインデックスY版
スタック相対d,sスタックポインタと8bitオフセット値を加算したバンク0のアドレスを参照
ダイレクトX間接(d,x)ダイレクトインデックスXアドレッシングの計算を行った後、「DBR」と16bit指定アドレスを組み合わせたアドレスを参照
ダイレクト間接Y(d),yダイレクトアドレッシングの計算を行った後、「DBR」と16bit指定アドレスを組み合わせたアドレスを参照
ダイレクト間接ロングY[d],yダイレクトアドレッシングの計算を行った後、24bit指定アドレスを組み合わせたアドレスを参照
スタック相対間接Y(d,s),yスタック相対アドレッシングの計算を行った後、バンク0から読みだした16bitアドレス値に「DBR」を組み合わせて24bit指定アドレスを参照
ダイレクト間接(d)ダイレクトレジスタと8bitオフセット値を加算した16bitアドレスから読みだした値に「DBR」を組み合わせて16bit指定アドレスを参照
ダイレクト間接ロング[d]ダイレクトレジスタと8bitオフセット値を加算した24bitアドレスを参照
プログラムカウンタ相対rプログラムカウンタと符号付き8bitオフセット値を加算した「PBR」付きアドレスを参照(「PBR」に変化なし)
プログラムカウンタ相対ロングrlプログラムカウンタと符号付き16bitオフセット値を加算した「PBR」付きアドレスを参照(「PBR」に変化なし)
アブソリュート間接(a)JMP命令ではバンク0の16bitアドレス参照、JML命令ではバンク0の24bitアドレス参照
アブソリュートインデックス間接(a,x)16bitオフセット値にダイレクトインデックスXを加算し、バンク0のアドレスを参照したものをプログラムカウンタに反映(「PBR」に変化なし)
XYCxycブロック転送

ダイレクトインデックスのbit幅は「PSR」のbit4「X」によって切り替わる。
XYCアドレッシングはブロック転送命令のみに利用されるもので、ダイレクトインデックスXとYにアキュムレータCを組み合わせる。

●65C816の命令

命令(ニーモニック)は以下の構成となっている。

  ニーモニック [SRC[,DEST1[,DEST2]]]

データの流れは「SRC」→「DEST」となる。

●アキュムレータ関連命令 (転送、演算など)

以下のアドレッシングモードが使用される。
#/a/al/d/d,x/a,x/a,y/al,x/d,s/(d,x)/(d),y/[d],y/(d,s),y/(d)/[d]

STAは「#」がない。

ニーモニック動作
LDAアキュムレータにデータをロード(読込)
STAアキュムレータからデータにストア(格納)
ADCアキュムレータにデータと「C」フラグの値を加算
SBCアキュムレータからデータと「C」フラグの否定値を減算
CMPアキュムレータからデータを減算 (アキュムレータは変化しない=比較)
ANDアキュムレータとデータの論理積
ORAアキュムレータとデータの論理和
EORアキュムレータとデータの排他的論理和

「C」フラグを伴わない算術演算命令はない。

●ローテート・シフト・その他演算命令

ニーモニック#adAd,xa,x動作
BITOOOXOOアキュムレータとデータの論理積 (アキュムレータは変化しない=Bit単位の比較)
RORXOOOOO右ローテートを行う (「C」フラグの値をMSB、LSBの値を「C」フラグに転送)
LSRXOOOOO論理右シフトを行う (0をMSB、LSBの値を「C」フラグに転送)
ROLXOOOOO左ローテートを行う (MSBの値を「C」フラグ、「C」フラグの値をLSBに転送)
ASLXOOOOO算術左シフトを行う (MSBの値を「C」フラグ、0をLSBに転送)
INCXOOOOOデータをインクリメント
REPOXXXXX8bitイミディエイト値と「PSR」を論理積 (リセット)
SEPOXXXXX8bitイミディエイト値と「PSR」を論理和 (セット)
TRBXOOXXXデータと16bit指定アドレスの値を論理積
TSBXOOXXXデータと16bit指定アドレスの値を論理和

●インデックスレジスタ関連命令

ニーモニック#add,xd,ya,xa,y動作
LDXOOOXOXOインデックスレジスタXにデータをロード
LDYOOXOXOOインデックスレジスタYにデータをロード
STXXOOXOXXインデックスレジスタXからデータにストア
STYXOOOXXXインデックスレジスタYからデータにストア
STZXOOOXOX0をデータにストア
CPXOOOXXXXインデックスレジスタXからデータを減算 (インデックスレジスタXは変化しない=比較)
CPYOOOXXXXインデックスレジスタYからデータを減算 (インデックスレジスタYは変化しない=比較)

●インプライドアドレッシング命令

ニーモニック動作
INXインデックスレジスタXをインクリメント
INYインデックスレジスタYをインクリメント
DEXインデックスレジスタXをデクリメント
DEYインデックスレジスタYをデクリメント
TAXアキュムレータからインデックスレジスタXに転送
TAYアキュムレータからインデックスレジスタYに転送
TXAインデックスレジスタXからアキュムレータに転送
TYAインデックスレジスタYからアキュムレータに転送
TXYインデックスレジスタXからインデックスレジスタYに転送
TYXインデックスレジスタYからインデックスレジスタXに転送
TXSインデックスレジスタXからスタックポインタに転送
TSXスタックポインタからインデックスレジスタXに転送
CLC0を「C」フラグに転送 (クリア)
SEC1を「C」フラグに転送 (セット)
CLD0を「D」フラグに転送
SED1を「D」フラグに転送
CLI0を「I」フラグに転送
SEI1を「I」フラグに転送
CLV0を「V」フラグに転送
TCD「C」フラグの値を「D」フラグに転送
TDC「D」フラグの値を「C」フラグに転送
TCS「C」フラグの値を「S」フラグに転送
TSC「S」フラグの値を「C」フラグに転送
XBAアキュムレータA,Bの値を交換
XCE「C」フラグの値と「E」フラグの値を交換

●スタックアドレッシング命令

ニーモニックオペランド動作
PHA アキュムレータをスタックへプッシュ
PHB 「DBR]をスタックへプッシュ
PHD ダイレクトレジスタをスタックへプッシュ
PHK 「PBR]をスタックへプッシュ
PHP 「PSR]をスタックへプッシュ
PHX インデックスレジスタXをスタックへプッシュ
PHY インデックスレジスタYをスタックへプッシュ
PLA スタックからアキュムレータへポップ
PLB スタックから「DBR]へポップ
PLD スタックからダイレクトレジスタへポップ
PLP スタックから「PSR]へポップ
PLX スタックからインデックスレジスタXへポップ
PLY スタックからインデックスレジスタYへポップ
PEAa 16bit絶対アドレスをスタックへプッシュ (PC+2,SP-2)
PEId ダイレクト間接アドレッシングで求めたアドレス(16bit)をスタックへプッシュ
PERrlプログラムカウンタ相対ロングアドレッシングで求めたアドレスをスタックへプッシュ (PC+2,SP-2)

●分岐命令 (「BRA」以外は「r」、「BRA」は「rl」)

ニーモニック動作
BCC「C」フラグが0のとき分岐(≧:Unsigned)
BCS「C」フラグが1のとき分岐(<:Unsigned)
BVC「V」フラグが0のとき分岐
BVS「V」フラグが1のとき分岐
BNE「Z」フラグが0のとき分岐(≠)
BEQ「Z」フラグが1のとき分岐(=)
BPL「N」フラグが0のとき分岐(>0)
BMI「N」フラグが1のとき分岐(<0)
BRA常に分岐 (PC相対)
BRL常に分岐 (PC相対ロング)

●ジャンプ命令

ニーモニックaal(a)(a,x)動作
JMPOOOO指定アドレスにジャンプ
JMLXXOX指定アドレスにロング形式ジャンプ
JSROXXO指定アドレスをサブルーチンコール(「PC」をスタックへプッシュ)
JSLXOXX指定アドレスをロング形式サブルーチンコール(「PC」「PBR」をスタックへプッシュ)
RTSXXXXサブルーチンコールから復帰
RTLXXXXロング形式サブルーチンコールから復帰

●ブロック転送命令 (xycアドレッシング)

ニーモニック動作
MVPブロック転送 (インデックスレジスタX,Yをインクリメント)
MVNブロック転送 (インデックスレジスタX,Yをデクリメント)

●その他命令

ニーモニック動作
BRKソフトウェア割込処理
RTI割込処理から復帰
WAI割込待機
COPコプロセッサ処理
STPプロセッサの動作停止 (処理終了)
WDM拡張用未使用命令 (2byte:何もしない)
NOP何もしない

[TOPに戻る]