MOS6502

特徴

MOS Technology社(Mostekではありません。)が1975年に発表した8bitCPUです。
3500トランジスター NMOS 8 µm
8bitデーター、16bitアドレス空間
MC6800をシンプルにしかも高速化した。
80系やx86系と同じリトル・エンディアン
0~255番地を高速にアクセス可能。(0ページ)
強力なアドレッシングモードを搭載。
特にインダイレクトを含むモードはメモリ上に置かれたポインタのアドレスを用いてアクセスする。
いわゆるポインタへのポインタである。このようなアドレッシングは68000でも備えておらず68020で登場している。
(メモリのアドレスを示してそのアドレスのデータを取り出してそれをアドレスとしてデータをアクセスする。)
命令のニーモニックはすべて3文字
56種類の命令
13種類のアドレッシングモードを備える。
Z80はいくつ? ( n nn reg8 reg16 (nn) (reg16) (IX or IY+d) PC+e,HL++,HL--,((HL++)→(DE++)),((HL--)→(DE--)))意外と多いかもしれません。
6800と類似の同期バスが採用されている。

割込み

外部要因が、RESETとノンマスカブル割込みであるNMI(エッジ(立下り))とマスカブル割込みであるIRQ(Lowレベル)の計3本です。
内部要因としてBRK命令があります。
割込みが発生すると固定されたアドレス(ベクター)に格納されているジャンプ先アドレスを読み込んで割込み処理ルーチンへ移動します。
BRK/IRQBはベクターを共用しているのでPSRのBフラグがセットされているとき、BRK命令が要因になります。

レジスタ

6502

PC以外がすべて8bitに簡素化されています。
Aがアキュムレータで演算命令の中心となります。
XとYはインデックスレジスタで8bitアドレスを示します。
Sはスタックポインタです。上位は1と決まっております。
Pはフラグを集めたレジスタです。
A
Y
X
PCHPCL
S
P

6800

Acc A、ACC Bの2本のアキュムレータで演算命令の中心となります。
IXはインデックスレジスタで16bitアドレスを示します。
CCRはフラグを集めたレジスタです。
Acc A
ACC B
IX
PC
S
CCR

PSR

6502ではフラグを集めたレジスタをPSRと呼んでいます。
6800にあったH(ハーフキャリー)がなくなっています。
x86系と同様に割込み許可がほかのフラグと同様にレジスタに統合されました。
76543210
NV1BDIZC
ネガティブフラグ
1 演算結果の最上位ビットが1 0 上記以外
V オーバーフローフラグ
1 演算結果が符号ありの最大範囲(-128 - 127)を超えた
0 上記以外
1 1固定
B ブレークモードフラグ
1 BRK命令実行
0 上記以外
D デシマルモードフラグ
1 加算・減算をBCDで行う
0 上記以外
※1 RP2A03はBCDモードが削除されているため、Dフラグを無視する(セット・クリアは可能)
I 割り込み禁止フラグ
1 割り込み禁止
0 割り込み許可
Z ゼロフラグ
1 演算結果、またはロード時の値が0
0 上記以外
C キャリーフラグ
インクリメントとデクリメントではCフラグは変化しません。
1 加算命令実行時:演算結果が255を超えた(キャリーあり)
減算命令実行時(SBC, CMP, CPX, CPY ):演算結果が0を下回らない(ボローなし)
0 上記以外
加算命令実行時:演算結果が255を超えていない(キャリーなし)
減算命令実行時(SBC, CMP, CPX, CPY ):演算結果が0を下回る(ボローあり)

メモリー

$FFFE~$FFFFBRK/IRQB
$FFFC~$FFFDPC(RESET)
$FFFA~$FFFBNMIB
$0100~$1FFFStack
$0000~$00FF0ページ

アドレッシングモード

13種類のアドレッシングモードがあります。
Indirectではポインターへのポインターが使える。

Accumulator A

Accumulator

Immediate #

#$00

Absolute a

16bitアドレスを直接指定
$0000

Zero Page zp

0ページの1byteで指定されるアドレスのメモリーを参照します。 $00

Zero Page Indexed with X zp,X

0ページの1byteとXレジスタを加算したアドレスのメモリを参照。
下位8bitのみ加算される。
$00,X

Zero Page Indexed with Y zp,Y

0ページの1byteとYレジスタを加算したアドレスのメモリを参照。
下位8bitのみ加算される。
$00,Y

Absolute Indexed with X a,X

16bitとXレジスタの値を加算したアドレスのメモリーを参照します。 $0000,X

Absolute Indexed with Y a,Y

16bitとYレジスタの値を加算したアドレスのメモリーを参照します。 $0000,Y

Implied i

暗黙

Program Counter Relative r

PCに8bitの符号付整数を加算したアドレスを参照します。

Zero Page Indexed Indirect (zp,X)

0ページの1byteとXレジスタを加算したアドレスで示される2byteの値をアドレスとして使用し参照します。 ($00,X)

Zero Page Indirect Indexed with Y (zp),Y

0ページの1byteのアドレスで示される2byteの値にYレジスタを加算してアドレスとして使用し参照します。 ($00),Y

Absolute Indirect (a)

2byteのアドレスで示される2byteの値をアドレスとして参照します。 ($0000)

命令

演算命令は基本的にAレジスタを基本としています。
演算命令は8bitだけです。
XとYレジスタの演算はインクリメントとデクリメントと比較のみです。
反対にAレジスタにインクリメントとデクリメントは存在しません。
アセンブラでは2つのオペランドを並べて記述することはありません。2つのオペランドを含む命令はニーモニックに1つのオペランドが含まれています。

加算がキャリー付き・減算がボロー付きしか存在しない

タイトルの通りですので、1byteの演算しかしないときはあらかじめフラグを設定しておきます。
Cフラグで説明しましたが、加算と減算ではフラグの立ち方が異なります。
ADCの前でキャリーなしにするにはCフラグをクリアする命令しておきます。CLC
SBCの前でボローなしにするにはキャリーフラグをセットする命令を実行しておきます。SEC

ロード・トランスファー命令

すべてが8bitデータを扱う。
XとYのロード・トランスファー命令は、アドレッシングが限られる。
SレジスタはXレジスタ経由で設定する。
XとY間で直接ロードできる命令はない。
80系やx86系と異なり、レジスタに値をロードするだけでNとZフラグが変化する。

スタック関係

80系やx86系では命令名がPUSH/POPであるが、68系などではPUSH/PULLを略した命令名である。
AレジスタとPレジスタの保存と復帰しかできない。

シフト・ローテート

ASL(Arithmetic Shift Left) 算術左シフト
何の変哲もない論理的な左シフトです。0bit目には0が追い出された7bitはCフラグに反映されます。
最上位ビットは保存されませんので符号が変わる場合もあります。
Z80やx86も同様である。
LSR 論理右シフト
論理右シフトである。最上位ビットには0がCフラグには追い出されたシフト前の0bit目の値が反映されます。
ROL 左ローテート
左ローテートである。Cフラグにはローテート前の7bit目の値が反映されます。
0bit目にはローテート前のCフラグの値が反映されます。
ROR 右ローテート
右ローテートである。Cフラグにはローテート前の0bit目の値が反映されます。
7bit目にはローテート前のCフラグの値が反映されます。

論理演算

AND・EOR・ORがサポートされているがNOTはない。EOR A,#$FFで各ビットが反転される。
ANDは2つのビットの値が1のときのみ1になります。
ORは2つのビットの値のいずれかが1であれば1になります。逆に言うと2つのビットの値が0のときのみ0になります。
EORは2つのビットの値が同じときは0、違うときは1になります。

BCD(10進数)の加算・引き算

BCDの加算・引き算がサポートされています。
一般的なCPUでは普通に2進数で演算してから、1桁目の桁上がり時にセットされるフラグによって補正を加える方法ですが、6502ではDフラグにあらかじめ2進数で演算するか(CLD命令)10進数で演算するか(SED命令)セットしておく方法でサポートされています。
フラグが有効になるのはADC,SBC命令です。

条件分岐

条件分岐はフラグが4個に対して各1個のフラグにSetとClearの2個の命令があるので計8個です。
モデルの6800では最大3個のフラグの状態を条件に分岐ができて16bit CPUであるx86系並みに便利ですが、6502では簡素化されています。
80系やx86系と異なりパリティフラグがありませんのでそのような条件の分岐命令は存在しません。
また、80系と異なり条件付きコールや条件付きリターンがありません。
80系と違い相対ジャンプが使えます。
各CPUの条件分岐命令を一覧にしてみました。
Z80の相対ジャンプでは使えるコンディションが限られます。(C,NC,Z,NZ)
条件x86Z80共通other
x86flagsZ80flagsH8/304868006809650268000PIC18flags
オーバーフローがあるJOOF=1JP PEV=1BVSBVSBVSBVSBVSBOVV=1overflow set
オーバーフローがないJNOOF=0JP POV=0BVCBVCBVCBVCBVCBNOVV=0overflow clear
キャリーがあるJCCF=1JP CC=1BCSBCSBCSBCSBCSBCC=1carry set
unsigned上でなく等しくないJNAECF=1Neither above nor equa
unsignedJBCF=1BLOBLOC=1Bellow/Lower
unsigned下でないJNCCF=0BHSBHSC=0not carry
Higher/Same
キャリーがないJNCCF=0JP NCC=0BCCBCCBCCBCCBCCBNCC=0not carry
carry clear
unsigned上か等しいJAECF=0Above or equal
等しい=JEZF=1BEQBEQBEQBEQBEQZ=1equal
ゼロの場合JZZF=1JP ZZ=1BZZ=1zero
等しくないJNEZF=0BNEBNEBNEBNEBNEZ=0not equal
ゼロでないJNZZF=0JP NZZ=0BNZnot zero
unsigned上でないJNAECF ∨ ZF=1BLSBLSBLSBLSC ∨ Z=1lower than or same
unsigned下か等しいJBECF ∨ ZF=1Bellow or equal
unsigned下でなく等しくないJNBECF ∨ ZF=0Neither bellow nor equal
unsignedJACF ∨ ZF=0BHIBHIBHIBHIC ∨ Z=0Above/higher than
符号がある<0JSSF=1JP MS=1BMIBMIBMIBMIBMIBNN=1minus
符号がない≧0JNSSF=0JP PS=0BPLBPLBPLBPLBPLBNNN=0plus
パリティがあるJPPF=1Parity
パリティが偶数JPEPF=1JP PEP=1parity even
パリティがないJNPPF=0no parity
パリティが奇数JPOPF=0JP POP=0parity odd
signed小さいJLSF ⊕ OF=1BLTBLTBLTBLTN ⊕ V=1less than
signed大きくなく等しくないJNGESF ⊕ OF=1Neither greater nor equa
signed大きいか等しいJGESF ⊕ OF=0BGEBGEBGEBGEN ⊕ V=0greater than or equal
signed小さくないJNLSF ⊕ OF=0Not less
signed小さいか等しいJLEZF ∨ (SF ⊕ OF)=1BLEBLEBLEBLEZ ∨ (N ⊕ V)=1less than or equal
signed大きくないJNGZF ∨ (SF ⊕ OF)=1 Not greater
signed大きいJGZF ∨ (SF ⊕ OF)=0BGTBGTBGTBGTZ ∨ (N ⊕ V)=0greater than
signed小さくなく等しくないJNLEZF ∨(SF ⊕ OF)=0Not less nor equal
≠ 等しくない
∨ Boolean OR
⊕ Boolean exclusive OR
基本的には各CPU似たような命令となっておりフラグの条件も同一です。
6502とPIC18では減算後や比較命令後のCフラグの意味が0の時、ボローが発生したという意味となり、他のCPUとは逆ですので注意が必要です。

JSR

サブルーチンを読み出します。
絶対アドレスしか指定できないので3バイト命令です。
スタックに保存する次の命令アドレスが、-1となっているので注意が必要です。
JSRとRTSを対で使っている分には問題はありません。

RTS

80系では呼び出す命令ですが、68系ではサブルーチンから戻る命令になっています。
JSR命令と対で使います。
仕様上は、スタックに保存されているPCのアドレスを取り出し1を加えてPCにセットします。

RTI

割込みから復帰する命令です。
割込み時にPSRとPCがスタックに保存されているので、先にPCをスタックからpullしのちにPSRをpullします。

BRK

1byteの命令でソフトウェア割り込みを発生させます。
Bフラグをセットした後、スタックにPSRとPCをpushし、割り込みベクターに分岐します。
1byte命令ですが、次の命令までPCが進んでからPCがスタックにpushされます。
BRK命令の後にNOP命令を挿入しておくと安心です。

R65C02

RockwellがCMOS化したものです。
6502に対してアドレッシングモードが2種類追加、命令が68種類あります。

アドレッシングモード

Zero Page Indirect

($00)
ゼロページの指定した番地の2バイトのデータをアドレスとして扱いその示すメモリを対象にします。

Absolute Indexed Indirect

($0000,x)
2バイトアドレスにXレジスタを加算したアドレスで示されるメモリーの2バイトデータをアドレスとして使用します

新命令及び変更された命令

Zero Page Indirectが追加された命令

ADC,AND,CMP,EOR,LDA,ORA,SBC,STA

Absolute Indexed Indirectが追加された命令

JMP

Accumulatorが追加された命令

DEC,INC

Immediate,Zero Page Index X,ABS Xが追加された命令

BIT
新設された命令
ビット操作関係の命令が追加されています。
特定のビットの値に応じでフラグに影響を与えるだけでなくブランチまでできる命令が追加されています。
スタックにX,Yレジスタをpush,pullできるようになりました。
BBR[0~7] r: Branch on Bit Reset
BBS[0~7] r: Branch on Bit Set
BRA r :Branch Always 無条件ブランチ
PHX : Push X Register
PHY : Push Y Register
PLX : Pull X Register
PLY : Pull Y Register
RMB[0~7] :Reset Memory Bit
SMB[0~7] :Set Memory Bit
STZ :Store Zero
TRB : Test and Reset Bits (¬A) ∧ M -> M
TSB : Test and Set Bits A ∨ M -> M

¬:Not ∧:And ∨:Or

6502のバクフィクス

リセット時と割り込み発生時にDフラグをクリア
間接ジャンプ命令でページ境界をまたぐアドレスを参照するときにアドレス上位バイトに桁上がりを行うように修正。
BRK命令実行中に割り込みが発生した場合にBRK命令が無視されていたのをBRK命令実行後に割り込み処理を行うように修正
アドレス計算途中のアドレスから無効な読み出しを行っていたのを、命令の最終アドレスを出力して命令を再読み込みする
リードモデファイ形式の命令のとき、データを1回読み込んでから書き込みを2回行っていたのを読み込み2回に書き込み1回とした
未定義命令時の動作がNOPとして定義されている

W65C02

1978年にWestern Design Center(Western Digital Corporationとは違います。)がCMOS化したもので、命令が拡張されている。RockwellのR65C02の命令と互換性があり、さらに2つの命令が拡張されている。
アドレッシングモードの追加。(6502の13から16へ追加)
アドレッシングモードのテキスト上の整理の仕方によりRockwellとは数が異なっています。
新命令の追加(6502の56個から70個)

新命令の追加

基本的にはRockwell R65C02の命令が追加されています。さらに2つの命令が追加されています。
STP : 停止
WAI : 割込待ち

RP2A03

MOS Techonology社からRICOHがライセンスを受けた6502から10進演算関連の機能が削除され、サウンド機能、DMAを追加
ファミリーコンピュータで使用

HuC6280A

NEC's PC Engine用にHudson SoftがW65C02をカスタマイズ。 高クロック化
独自に命令拡張
データーバス 8bit/アドレスバス 21bit
8bit Input Port
8bit Output Port
Timer(10bit)
製造プロセス CMOS
電源電圧 +5V
80ピンQFP

Programmable Sound Generator

メロディ6チャンネルまたはメロディ4チャンネル+ノイズ2音
音量設定 5ビット対数変換方式
メイン音量制御レジスタ内蔵
1周期32アドレス波形メモリ方式

MMU

16bit論理アドレスを21bit物理アドレスに変換
論理アドレスの上位3bitを物理アドレス8bitに変換(1セグメント8kbyte)
各セグメントごとにメモリーマッピングレジスターを搭載。MPR[0~7]
TAM/TMA 専用命令

レジスタ

PSR

Tフラグが追加されています。
76543210
NVTBDIZC
Tフラグ
TフラグがセットされているとAレジスタへのアクセスがXによる0ページアクセスに変化します。

命令

CLA Clear Accumulator
CLX Clear X
CLY Clear Y
CSH Change Speed High 7.16MHz
CSL Change Speed Low 1.78MHz
ST0 Store (HuC6270) VDC No. 0
 接続されたVCD((Video Display controller)のアドレスレジスター($1FE000)に値を転送します。
ST1 Store (HuC6270) VDC No. 1
 接続されたVCD((Video Display controller)のLowデーターレジスター($1FE002)に値を転送します。
ST2 Store (HuC6270) VDC No. 2
 接続されたVCD((Video Display controller)のUpperデーターレジスター($1FE003)に値を転送します。
SAX Swap A and X
SAY Swap A and Y
SXY Swap X and Y
SET Set T Flag
TAI Transfer Alternate Increment

TAI $ssss, $dddd, $llll 指定された16bitアドレス$ssssから$ddddへデータを指定された16bitの回数である$llll-1回転送する。
転送元アドレスはssss+0とssss+1が交互に入れ替わる。
ddddは転送ごとにインクリメント
llllは転送ごとにデクリメントされる。
65536回を指定するには0を指定する。

TAM[0~7] - Transfer Accumulator to MPRs
  Immediate TAM #$ii   アキュムレータの値をメモリーマッピングレジスター(MMU)に転送します。
TDD Transfer Decrement Decrement

TDD $ssss, $dddd, $llll
指定された16bitアドレス$ssssから$ddddへデータを指定された16bitの回数である$llll-1回転送する。
ssss,ddddは転送ごとにデクリメントする。
llllは転送ごとにデクリメントされる。
65536回を指定するには0を指定する。

TIA Transfer Increment Alternate

TIA $ssss, $dddd, $llll dddd ssss++
指定された16bitアドレス$ssssから$ddddへデータを指定された16bitの回数である$llll-1回転送する。
転送先アドレスはdddd+0とdddd+1が交互に入れ替わる。
llllは転送ごとにデクリメントされる。
65536回を指定するには0を指定する。

TII Transfer Increment Increment

TII $ssss, $dddd, $llll 指定された16bitアドレス$ssssから$ddddへデータを指定された16bitの回数である$llll-1回転送する。
ssss,ddddは転送ごとにインクリメントする。
llllは転送ごとにデクリメントされる。
65536回を指定するには0を指定する。

TIN Transfer Increment

TIN $ssss, $dddd, $llll
指定された16bitアドレス$ssssから$ddddへデータを指定された16bitの回数である$llll-1回転送する。
ssssは転送ごとにインクリメントする。
llllは転送ごとにデクリメントされる。
65536回を指定するには0を指定する。

TMA[0~7] - Transfer MPR to Accumulator
  TMA #$ii
  MMUのメモリーマッピングレジスターの値をアキュムレータに転送します。
TST Test

65816 (W65C816)

1983年にWestern Design Centerが開発。
Apple IIGSやスーパーファミコンで採用。
8bitデーターバス/24bitアドレス
ネイティブモードと6502互換のエミュレーションモードを備える。
レジスタが16bitに拡張。16bitより上位8bitにはバンクレジスタを追加
65C816SのSはスタティックコア
24のアドレッシングモード-(MOS6502は13、W65C02は16)
92の命令セット(MOS6502は56,W65C02は70)
COP (Co-Processor) 命令とそのベクタはコプロセッサの構成(例えば浮動小数点プロセッサ)をサポートする。
ピン配置はほぼ6502と互換。
追加されたメモリー空間のうちバンクレジスタの値はデーターバスとマルチプレックスで出力される。

レジスタ

AとBを合わせて16bitのアキュムレータとして使用できます。
Bを明示的に使用することはできません。
XとYはインデックスレジスタ
Sはスタックポインタ
PSR(P)はフラグを集めたレジスタ
DはDirectレジスタで0ページがDに加算されるアクセスに代わっています。
ACC BAcc A
DBRY(YH)Y(YL)
X(XH)X(XL)
PBRPCHPCL
00S(SH)S(SL)
00D(DH)D(DL)
PSR
E flag(0:ネイティブ 1:エミュレーション)

PSR

76543210
NVM/1B/XDIZC
M(Memory Select)
1:8bit 0:16bit
X(Index Register Select)
1:8bit 0:16bit

メモリー

バンク0Emulation ModeNative Mode
$FFFE~$FFFFBRK/IRQIRQ
$FFFC~$FFFDPC(RESET)
$FFFA~$FFFBNMINMI
$FFF8~$FFF9ABORTABORT
$FFF6~$FFF7BRK
$FFF4~$FFF5COPCOP
Direct 0バンク
Stack 0バンク

アドレッシングモード

0ページアクセスがDirectレジスタによるアクセスに代わります。
この時のバンクの値は$00固定となります。
全アドレス空間(24bit)を指定するlongが追加されました。
indirectに[]を使うとlongアドレスになります。
DLレジスタが0以外の場合は下位に加算処理が加算されるため1サイクル増えます。
インデックスレジスタを16bitで使うと加算処理のため1サイクル増えます。
インデックスレジスタを8bitで使う場合のインデックスレジスタの上位8bitは0と見なします。

Absolute a

記述例 $1234
実効アドレス DBR:$1234
16bitアドレスを直接指定。バンクはDBRが使用される。

Absolute Indexed Indirect (a,X)

記述例 ($1234,X)
ポインターへのアドレス $00:$1234+X
ポインタに格納されているアドレス $5678
実効アドレス PBR:$5678
絶対アドレス2バイトにXレジスタを加算してそのアドレス(バンクは$00)が示す2byteデータをアドレスとして使用。

Absolute Indirect (a)

記述例 ($1234)
ポインターへのアドレス $00:$1234 ポインタに格納されているアドレス $5678
実効アドレス PBR:$5678
絶対アドレス2バイトが示すアドレス(バンクは$00)から2byteのデータを取得しアドレスとして使用。

Absolute Long al

W65C816から追加
記述例 $123456
バンクと下位16bitを直接指定

Absolute Long, X al,X

W65C816から追加
記述例 $123456,X
実効アドレス $12:$3456+X
絶対アドレス24bitにXレジスタを加算したアドレスを使用。

Absolute, X a,X

記述例 $1234,X
実効アドレス DBR:$1234+X
絶対アドレス2バイトにXレジスタを加算したアドレス(バンクはDBR)を使用。

Absolute, Y a,Y

記述例 $1234,Y
実効アドレス DBR:$1234+Y
絶対アドレス2バイトにYレジスタを加算したアドレス(バンクはDBR)を使用。

Accumulator A

A

Block Move xyc

W65C186から追加
記述例 $1234 #5678
ブロック転送用のアドレッシング
MVN,MVP命令で使用。
ソースアドレスは指定されたソースバンクとXレジスタ
ディスティネーションアドレスは指定されたディスティネーションバンクとYレジスタ

Direct d

記述例 $12
実効アドレス $00:D+$12
指定された1byteのアドレスとDレジスタの値を加算したアドレス(バンクは$00)を使用。

Direct Indexed Indirect (d,x)

記述例 ($12,X)
ポインターへのアクセス $00:D+$12+X
ポインターのデーター $5678
実効アドレス $00:$5678
指定された1byteのアドレスとDレジスタの値とXレジスタの加算したアドレス(バンクは$00)から2byteを取得しアドレス(バンクは#00)として使用。

Direct Indirect (d)

W65C02から追加(Zero Page Indirect)
記述例 ($12)
ポインターへのアクセス $00:D+$12
ポインターのデーター $5678
実効アドレス $00:$5678
指定された1byteのアドレスとDレジスタの値を加算したアドレス(バンクは$00)から2byteを取得しアドレス(バンクは#00)として使用。

Direct Indirect Indexed (d),y

記述例 ($12),Y
ポインターのアドレス $00:D+$12
ポインターのデーター $3456
実効アドレス $00:D+$3456+Y
指定された1byteのアドレスとDレジスタの値を加算したアドレス(バンクは$00)から2byteを取得しYレジスタの値を加算してアドレス(バンクは#00)として使用。

Direct Indirect Indexed Long [d],y

W65C816から追加
記述例 [$12],Y
ポインターへのアドレス $00:D+$12
ポインターのデーター $5678AB
実効アドレス $56:$78AB+Y
指定された1byteのアドレスとDレジスタの値を加算したアドレス(バンクは$00)から3byteを取得しYレジスタの値を加算してアドレスとして使用。

Direct Indirect Long [d]

W65C816から追加
記述例 [$12]
ポインターへのアドレス $00:D+$12
ポインターのデーター $345678
実効アドレス $34:#5678
指定された1byteのアドレスとDレジスタの値を加算したアドレス(バンクは$00)から3byteを取得しアドレスとして使用。

Direct, X d,X

記述例 $12,X
実効アドレス #00:D+$12+X
指定された1byteのアドレスとDレジスタの値とXレジスタを加算したアドレス(バンクは$00)を使用。

Direct, Y d,Y

記述例 $12,Y
実効アドレス #00:D+$12+Y
指定された1byteのアドレスとDレジスタの値とYレジスタを加算したアドレス(バンクは$00)を使用。

Immediate imm

定数オペランドを直接指定
データ幅により1byte、2byteが切り替わる。

Implied

暗黙

Relative r

PC+8bit(符号付)

Relative Long rl

W65C816から追加
PC+2byte(符号付)

Stack

バンク $00

Stack Relative D,S

W65C816から追加
バンク $00
記述例 $12,S
符号無し

Stack Relative Indirect Indexed (d,S),Y

W65C816から追加
($00,S),Y
バンク $00 offset+S->(16bit値) DBR:16bit値+Y

命令

16bit化にあたり、専用のオペコードを設けず、フラグによりデータ幅を8bitか16bitを設定するような仕様になっています。
MOS6502から以下の命令が追加されています。
BRA Branch Always 無条件ブランチ(W65C02で追加)
BRL Branch Always Long 16bitで範囲を指定する無条件ブランチ
COP Coprocessor COプロセッサ ソフトウェア割り込み
JML Jump Long 24bitで指定する絶対ジャンプ
JSL Jump Subroutine Long 24bitで指定するサブルーチンコール
MVN Block Move Negative

以下の動作を繰り返します。
--C C≠0 ならば srcBank:X→dtcBank:Y メモリの値を転送します。X--,Y--
転送後、DBRが変わってしまうので注意が必要。

MVP Block Move Positive

以下の動作を繰り返します。
--C C≠0 ならば srcBank:X→dtcBank:Y メモリの値を転送します。X++,Y++
転送後、DBRが変わってしまうので注意が必要。

PEA Push Effective Absolute Address on Stack
  スタックに2byte定数をpushします。
PEI Push Effective Indirect Address on Stack
 指定された1byteのアドレスとDレジスタの加算したアドレスから2byteを取得しスタックへpush
PER Push Effective Program Counter Relative Address on Stack
 指定した2byte(符号付)+PCで示されるアドレス値2byteをスタックへpushします。
PHB Push Data Bank Register on Stack
PHD Push Direct Register on Stack
PHK Push Program Bank Register on Stack
PHX Push Index X on Stack (W65C02で追加)
PHY Push index Y on Stack(W65C02で追加)
PLB Pull Data Bank Register from Stack
PLD Pull Direct Register from Stack
PLP Pull Processor Status from Stack
PLX Pull Index X from Stack(W65C02で追加)
PLY Pull Index Y form Stack(W65C02で追加)
REP Reset Status Bits
 PSRの特定のビットを0にします。
 M ∧ PSR -> PSR
RTL Return from Subroutine Long
SEP Set Processor Status Bits
PSRの特定のビットを1にします。
 M ∨ PSR -> PSR
STP Stop the Clock(W65C02で追加)
 ハードウェアリセットされるまでCPUが止まる。
STZ Store Zero in Memory(W65C02で追加)
TCD Transfer Accumulator to Direct Register
TCS Transfer Accumulator to Stack Pointer Register
TDC Transfer Direct Register to Accumulator
TRB Test and Reset Bit (¬A) ∧ M -> M(W65C02で追加)
TSB Test and Set Bit A ∨ M -> M(W65C02で追加)
TSC Transfer Stack Pointer Register to Accumulator
TXY Transfer Index X to Index Y
TYX Transfer Index Y to Index X
WAI Wait for Interrupt(W65C02で追加)
 割込発生まで待機
WDM Reserved for future use
 将来の拡張用に確保
XBA Exchange the B and A accumulators
XCE Exchange Carry and Emulation Bits

¬:Not ∧:And ∨:Or

各CPUの命令一覧

R65C02で追加された命令
Huc6280で追加または変更された命令
R65C02からW65C02で追加された命令
W65C02からW65C816で追加された命令
INSTRUCTIONSAddressing ModeCONDITION CODES
immaZpA暗黙(Zp,X)(Zp),YZp,Xa,Xa,Y(a)rZp.Y(Zp)(a,X)D,S[d],Yalal,Xrl[d](d,S),Yxycsrc,dtc,len76543210
NVM/T/1X/BDIZC
ADC A+M+C→A696D656171757D797263776F7F6773****
AND A∧M→A292D252131353D393223372F3F2733**
ASL C=bit7 MA<<1 bit0=00E060A161E***
BBR[0~7]Branch on Mi=0*W65C816で削除0F~7F
BBS[0~7]Branch on Mi=1*W65C816で削除8F~FF
BCC Branch on C=090
BCS Branch on C=1B0
BEQ Branch on Z=1F0
BIT A∧M892C24343CM7M6*
BMI Branch on N=130
BNE Branch on Z=0D0
BPL Branch on N=010
BRABranch Always80
BRK Break instruction 001
BRLBranch Always Long 82
BVC Branch on V=050
BVS Branch on V=170
CLA0→A620
CLC 0→C180
CLD 0→DD80
CLI 0→I580
CLV 0→VB80
CLX0→X820
CLY0→YC20
CMP A-MC9CDC5C1D1D5DDD9D2D7CFDFC7D3***
COP0201
CPX X-ME0ECE4***
CPY Y-MC0CCC4***
CSHChange Speed High 7.16MHzD40
CSLChange Speed Low 1.78MHz540
DEC MA-1→MACEC63AD6DE**
DEX X-1→XCA**
DEY Y-1→Y88**
EOR A ⊻M→A494D454151555D595243574F5F4757**
INC MA+1→MAEEE61AF6FE**
INX X+1→XE8**
INY Y+1→YC8**
JMLJump LongDC
JMP Jump to new Location 4C6C7C5C
JSLJump Subroutine Long22
JSR Jump to SubRoutine20FC
LDA M→AA9ADA5A1B1B5BDB9B2A3B7AFBFA7**
LDX M→XA2AEA6BEB6**
LDY M→YA0ACA4B4BC**
LSR bit0→C MA>>1 0→bit74E464A565E0**
MVNBlock Move Negative54
MVPBlock Move Positive44
NOP No Operation EA
ORA A∨M→A090D050111151D191F1203170F0713**
PEAPush Effective Absolute Address on StackF4
PEIPush Effective Indirect Address on StackD4
PERPush Effective Program Counter Relative Address on Stack62
PHA A→MS S-1→S48
PHBDBR→MS S-1→S8B
PHDD→MS S-1→S0B
PHKPBR→MS S-1→S4B
PHP P→MS S-1→S08
PHXX→MS S-1→SDA
PHYY→MS S-1→S5A
PLA S+1→S MS→A68**
PLBS+1→S MS→DBRAB**
PLDS+1→S MS→D2B**
PLP S+1→S MS→P28********
PLXS+1→S MS→XFA
PLYS+1→S MS→Y7A
REPReset Status BitsC2********
RMB[0~7]0→Mi*W65C816で削除07~77
ROL bit7→C MA<<1 C→bit02E262A363E***
ROR bit0→C MA>>1 C→bit76E666A767E***
RTI Return from Interrupt 40********
RTLReturn from Subroutine Long6B
RTS Return from Subroutine 60
SBC A-M-(1-C)→AE9EDE5E1F1F5FDF9F2E3F7FFE7F3***(3)
SEC 1→C381
SED 1→DF81
SEI 1→I781
SEPSet Processor Status BitsE2********
SMB[0~7]1→Mi*W65C816で削除87~F7
SAXA⇄X220
SAYA⇄Y420
SET1→TF41
SXYX⇄Y020
ST0Store (HuC6270) VDC No. 0030
ST1Store (HuC6270) VDC No. 1130
ST2Store (HuC6270) VDC No. 2230
STA A→M8D858191959D999283978F9F8793
STPStop the ClockDB
STX X→M8E8696
STY Y→M8C8494
STZ0→M9C64749E
TAITransfer Alternate IncrementF30
TAM[0~7]Transfer Accumulator to MPRs530
TAX A→XAA**
TAY A→YA8**
TCDA→D5B**
TCSA→S1B
TDCD→A7B**
TDDTransfer Decrement DecrementC30
TIATransfer Increment AlternateE30
TIITransfer Increment Increment730
TINTransfer Increment AlternateD30
TMA[0~7]TMA - Transfer MPR to Accumulator430
TRB(¬A) ∧ M → M1C14*
TSBA ∨ M →M0C04*
TSCS→A3B**
TSTM ∨ #i9383A3B3**0*
TSX S→XBA**
TXA X→A8A**
TXS X→S9A
TXYX→Y9B**
TYA Y→A98**
TYXY→XBB**
WAIWait for InterruptCB
WDMReserved for future use42
XBAB⇄AEB**
XCEC⇄EFBE
⊻ : EOR
∧ : AND
∨ : OR
¬ : NOT