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のピン配列
| Vss | 1 | 40 | RES | |
| RDY | 2 | 39 | VDA | |
| ABORT | 3 | 38 | MX | |
| IRQ | 4 | 37 | φ0 | |
| N.C. | 5 | 36 | N.C. | |
| NMI | 6 | 35 | N.C. | |
| SYNC | 7 | 34 | R/W | |
| Vcc | 8 | 33 | D0 | |
| A0 | 9 | 32 | D1 | |
| A1 | 10 | 31 | D2 | |
| A2 | 11 | 30 | D3 | |
| A3 | 12 | 29 | D4 | |
| A4 | 13 | 28 | D5 | |
| A5 | 14 | 27 | D6 | |
| A6 | 15 | 26 | D7 | |
| A7 | 16 | 25 | A15 | |
| A8 | 17 | 24 | A14 | |
| A9 | 18 | 23 | A13 | |
| A10 | 19 | 22 | A12 | |
| A11 | 20 | 21 | Vss |
●65C816の特徴
基本的には「6502」の拡張である。
| レジスタ名 | Bit幅 | 構成 | 説明 |
|---|---|---|---|
| Acc C | 16bit | Acc A(A)/Acc B (8bit) | →Accumulator |
| Index X | 16bit | XL(X)/XH (8bit) | →Index Register |
| Index Y | 16bit | YL(Y)/YH (8bit) | →Index Register |
| PC | 16bit | →Program Counter | |
| SP | 16bit | SL(SP)/SH | →Stack Pointer |
| Direct | 16bit | DL/DH | →Direct Register |
| PSR | 8bit | C/Z/I/D/B,X/M/V/N (1bit) | →Processor Status Register |
| E | 1bit | →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」より更に複雑になっている。
| アドレッシングモード | 略号 | 説明 |
|---|---|---|
| イミディエート | # | 即値 |
| アブソリュート | a | 16bit絶対アドレス参照 |
| アブソリュートロング | al | 24bit絶対アドレス参照 |
| ダイレクト | d | ダイレクトレジスタと8bitオフセット値を加算したバンク0のアドレスを参照 (「6502」のゼロページに相当) |
| アキュムレータ | A | ニーモニック自体に対象(アキュムレータ)が内包されている |
| インプライド | i | ニーモニック自体に対象が内包されている |
| スタック | s | スタックポインタが示すバンク0のアドレスを参照 |
| ダイレクトインデックスX | d,x | ダイレクトアドレッシングにダイレクトインデックスXを加算したバンク0のアドレスを参照 (「6502」のゼロページX間接に相当) |
| ダイレクトインデックスY | d,y | ダイレクトインデックスアドレッシングのダイレクトインデックスY版(「6502」のゼロページY間接に相当) |
| アブソリュートインデックスX | a,x | ダイレクトインデックスXとバンク番号「DBR」に16bit指定アドレスを加算したアドレスを参照 |
| アブソリュートインデックスY | d,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」に変化なし) |
| XYC | xyc | ブロック転送 |
ダイレクトインデックスの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」フラグを伴わない算術演算命令はない。
●ローテート・シフト・その他演算命令
| ニーモニック | # | a | d | A | d,x | a,x | 動作 |
|---|---|---|---|---|---|---|---|
| BIT | O | O | O | X | O | O | アキュムレータとデータの論理積 (アキュムレータは変化しない=Bit単位の比較) |
| ROR | X | O | O | O | O | O | 右ローテートを行う (「C」フラグの値をMSB、LSBの値を「C」フラグに転送) |
| LSR | X | O | O | O | O | O | 論理右シフトを行う (0をMSB、LSBの値を「C」フラグに転送) |
| ROL | X | O | O | O | O | O | 左ローテートを行う (MSBの値を「C」フラグ、「C」フラグの値をLSBに転送) |
| ASL | X | O | O | O | O | O | 算術左シフトを行う (MSBの値を「C」フラグ、0をLSBに転送) |
| INC | X | O | O | O | O | O | データをインクリメント |
| REP | O | X | X | X | X | X | 8bitイミディエイト値と「PSR」を論理積 (リセット) |
| SEP | O | X | X | X | X | X | 8bitイミディエイト値と「PSR」を論理和 (セット) |
| TRB | X | O | O | X | X | X | データと16bit指定アドレスの値を論理積 |
| TSB | X | O | O | X | X | X | データと16bit指定アドレスの値を論理和 |
●インデックスレジスタ関連命令
| ニーモニック | # | a | d | d,x | d,y | a,x | a,y | 動作 |
|---|---|---|---|---|---|---|---|---|
| LDX | O | O | O | X | O | X | O | インデックスレジスタXにデータをロード |
| LDY | O | O | X | O | X | O | O | インデックスレジスタYにデータをロード |
| STX | X | O | O | X | O | X | X | インデックスレジスタXからデータにストア |
| STY | X | O | O | O | X | X | X | インデックスレジスタYからデータにストア |
| STZ | X | O | O | O | X | O | X | 0をデータにストア |
| CPX | O | O | O | X | X | X | X | インデックスレジスタXからデータを減算 (インデックスレジスタXは変化しない=比較) |
| CPY | O | O | O | X | X | X | X | インデックスレジスタ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に転送 |
| CLC | 0を「C」フラグに転送 (クリア) |
| SEC | 1を「C」フラグに転送 (セット) |
| CLD | 0を「D」フラグに転送 |
| SED | 1を「D」フラグに転送 |
| CLI | 0を「I」フラグに転送 |
| SEI | 1を「I」フラグに転送 |
| CLV | 0を「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へポップ | |
| PEA | a | 16bit絶対アドレスをスタックへプッシュ (PC+2,SP-2) |
| PEI | d | ダイレクト間接アドレッシングで求めたアドレス(16bit)をスタックへプッシュ |
| PER | rl | プログラムカウンタ相対ロングアドレッシングで求めたアドレスをスタックへプッシュ (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相対ロング) |
●ジャンプ命令
| ニーモニック | a | al | (a) | (a,x) | 動作 |
|---|---|---|---|---|---|
| JMP | O | O | O | O | 指定アドレスにジャンプ |
| JML | X | X | O | X | 指定アドレスにロング形式ジャンプ |
| JSR | O | X | X | O | 指定アドレスをサブルーチンコール(「PC」をスタックへプッシュ) |
| JSL | X | O | X | X | 指定アドレスをロング形式サブルーチンコール(「PC」「PBR」をスタックへプッシュ) |
| RTS | X | X | X | X | サブルーチンコールから復帰 |
| RTL | X | X | X | X | ロング形式サブルーチンコールから復帰 |
●ブロック転送命令 (xycアドレッシング)
| ニーモニック | 動作 |
|---|---|
| MVP | ブロック転送 (インデックスレジスタX,Yをインクリメント) |
| MVN | ブロック転送 (インデックスレジスタX,Yをデクリメント) |
●その他命令
| ニーモニック | 動作 |
|---|---|
| BRK | ソフトウェア割込処理 |
| RTI | 割込処理から復帰 |
| WAI | 割込待機 |
| COP | コプロセッサ処理 |
| STP | プロセッサの動作停止 (処理終了) |
| WDM | 拡張用未使用命令 (2byte:何もしない) |
| NOP | 何もしない |