山本ワールド
6502系と互換CPU
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 | |
PCH | PCL |
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系と同様に割込み許可がほかのフラグと同様にレジスタに統合されました。
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
N | V | 1 | B | D | I | Z | C |
ネガティブフラグ
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 演算結果、またはロード時の値が00 上記以外
C キャリーフラグ
インクリメントとデクリメントではCフラグは変化しません。1 加算命令実行時:演算結果が255を超えた(キャリーあり)
減算命令実行時(SBC, CMP, CPX, CPY ):演算結果が0を下回らない(ボローなし)
0 上記以外
加算命令実行時:演算結果が255を超えていない(キャリーなし)
減算命令実行時(SBC, CMP, CPX, CPY ):演算結果が0を下回る(ボローあり)
メモリー
$FFFE~$FFFF | BRK/IRQB |
$FFFC~$FFFD | PC(RESET) |
$FFFA~$FFFB | NMIB |
$0100~$1FFF | Stack |
$0000~$00FF | 0ページ |
アドレッシングモード
13種類のアドレッシングモードがあります。Indirectではポインターへのポインターが使える。
Accumulator A
AccumulatorImmediate #
#$00Absolute a
16bitアドレスを直接指定$0000
Zero Page zp
0ページの1byteで指定されるアドレスのメモリーを参照します。 $00Zero 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,XAbsolute Indexed with Y a,Y
16bitとYレジスタの値を加算したアドレスのメモリーを参照します。 $0000,YImplied 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),YAbsolute 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)
条件 | x86 | Z80 | 共通 | other | ||||||||||
x86 | flags | Z80 | flags | H8/3048 | 6800 | 6809 | 6502 | 68000 | PIC18 | flags | ||||
オーバーフローがある | JO | OF=1 | JP PE | V=1 | BVS | BVS | BVS | BVS | BVS | BOV | V=1 | overflow set | ||
オーバーフローがない | JNO | OF=0 | JP PO | V=0 | BVC | BVC | BVC | BVC | BVC | BNOV | V=0 | overflow clear | ||
キャリーがある | JC | CF=1 | JP C | C=1 | BCS | BCS | BCS | BCS | BCS | BC | C=1 | carry set | ||
unsigned | 上でなく等しくない | < | JNAE | CF=1 | Neither above nor equa | |||||||||
unsigned | 下 | < | JB | CF=1 | BLO | BLO | C=1 | Bellow/Lower | ||||||
unsigned | 下でない | JNC | CF=0 | BHS | BHS | C=0 | not carry Higher/Same | |||||||
キャリーがない | JNC | CF=0 | JP NC | C=0 | BCC | BCC | BCC | BCC | BCC | BNC | C=0 | not carry carry clear | ||
unsigned | 上か等しい | JAE | CF=0 | Above or equal | ||||||||||
等しい | = | JE | ZF=1 | BEQ | BEQ | BEQ | BEQ | BEQ | Z=1 | equal | ||||
ゼロの場合 | JZ | ZF=1 | JP Z | Z=1 | BZ | Z=1 | zero | |||||||
等しくない | ≠ | JNE | ZF=0 | BNE | BNE | BNE | BNE | BNE | Z=0 | not equal | ||||
ゼロでない | JNZ | ZF=0 | JP NZ | Z=0 | BNZ | not zero | ||||||||
unsigned | 上でない | < | JNAE | CF ∨ ZF=1 | BLS | BLS | BLS | BLS | C ∨ Z=1 | lower than or same | ||||
unsigned | 下か等しい | < | JBE | CF ∨ ZF=1 | Bellow or equal | |||||||||
unsigned | 下でなく等しくない | > | JNBE | CF ∨ ZF=0 | Neither bellow nor equal | |||||||||
unsigned | 上 | > | JA | CF ∨ ZF=0 | BHI | BHI | BHI | BHI | C ∨ Z=0 | Above/higher than | ||||
符号がある | <0 | JS | SF=1 | JP M | S=1 | BMI | BMI | BMI | BMI | BMI | BN | N=1 | minus | |
符号がない | ≧0 | JNS | SF=0 | JP P | S=0 | BPL | BPL | BPL | BPL | BPL | BNN | N=0 | plus | |
パリティがある | JP | PF=1 | Parity | |||||||||||
パリティが偶数 | JPE | PF=1 | JP PE | P=1 | parity even | |||||||||
パリティがない | JNP | PF=0 | no parity | |||||||||||
パリティが奇数 | JPO | PF=0 | JP PO | P=0 | parity odd | |||||||||
signed | 小さい | < | JL | SF ⊕ OF=1 | BLT | BLT | BLT | BLT | N ⊕ V=1 | less than | ||||
signed | 大きくなく等しくない | < | JNGE | SF ⊕ OF=1 | Neither greater nor equa | |||||||||
signed | 大きいか等しい | ≧ | JGE | SF ⊕ OF=0 | BGE | BGE | BGE | BGE | N ⊕ V=0 | greater than or equal | ||||
signed | 小さくない | ≧ | JNL | SF ⊕ OF=0 | Not less | |||||||||
signed | 小さいか等しい | ≦ | JLE | ZF ∨ (SF ⊕ OF)=1 | BLE | BLE | BLE | BLE | Z ∨ (N ⊕ V)=1 | less than or equal | ||||
signed | 大きくない | ≦ | JNG | ZF ∨ (SF ⊕ OF)=1 | Not greater | |||||||||
signed | 大きい | > | JG | ZF ∨ (SF ⊕ OF)=0 | BGT | BGT | BGT | BGT | Z ∨ (N ⊕ V)=0 | greater than | ||||
signed | 小さくなく等しくない | > | JNLE | ZF ∨(SF ⊕ OF)=0 | Not 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
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,STAAbsolute Indexed Indirectが追加された命令
JMPAccumulatorが追加された命令
DEC,INCImmediate,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
アドレッシングモードの追加。(6502の13から16へ追加)
アドレッシングモードのテキスト上の整理の仕方によりRockwellとは数が異なっています。
新命令の追加(6502の56個から70個)
新命令の追加
基本的にはRockwell R65C02の命令が追加されています。さらに2つの命令が追加されています。STP : 停止
WAI : 割込待ち
RP2A03
HuC6280A
独自に命令拡張
データーバス 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フラグが追加されています。7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
N | V | T | B | D | I | Z | C |
Tフラグ
TフラグがセットされているとAレジスタへのアクセスがXによる0ページアクセスに変化します。命令
CLA Clear AccumulatorCLX 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を指定する。
Immediate TAM #$ii アキュムレータの値をメモリーマッピングレジスター(MMU)に転送します。
TDD Transfer Decrement Decrement
TDD $ssss, $dddd, $llll
指定された16bitアドレス$ssssから$ddddへデータを指定された16bitの回数である$llll-1回転送する。
ssss,ddddは転送ごとにデクリメントする。
llllは転送ごとにデクリメントされる。
65536回を指定するには0を指定する。
TIA $ssss, $dddd, $llll
dddd ssss++
指定された16bitアドレス$ssssから$ddddへデータを指定された16bitの回数である$llll-1回転送する。
転送先アドレスはdddd+0とdddd+1が交互に入れ替わる。
llllは転送ごとにデクリメントされる。
65536回を指定するには0を指定する。
TII $ssss, $dddd, $llll
指定された16bitアドレス$ssssから$ddddへデータを指定された16bitの回数である$llll-1回転送する。
ssss,ddddは転送ごとにインクリメントする。
llllは転送ごとにデクリメントされる。
65536回を指定するには0を指定する。
TIN $ssss, $dddd, $llll
指定された16bitアドレス$ssssから$ddddへデータを指定された16bitの回数である$llll-1回転送する。
ssssは転送ごとにインクリメントする。
llllは転送ごとにデクリメントされる。
65536回を指定するには0を指定する。
TMA #$ii
MMUのメモリーマッピングレジスターの値をアキュムレータに転送します。
TST Test
65816 (W65C816)
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 B | Acc A | |
DBR | Y(YH) | Y(YL) |
X(XH) | X(XL) | |
PBR | PCH | PCL |
00 | S(SH) | S(SL) |
00 | D(DH) | D(DL) |
PSR |
PSR
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
N | V | M/1 | B/X | D | I | Z | C |
M(Memory Select)
1:8bit 0:16bitX(Index Register Select)
1:8bit 0:16bitメモリー
バンク0 | Emulation Mode | Native Mode |
---|---|---|
$FFFE~$FFFF | BRK/IRQ | IRQ |
$FFFC~$FFFD | PC(RESET) | |
$FFFA~$FFFB | NMI | NMI |
$FFF8~$FFF9 | ABORT | ABORT |
$FFF6~$FFF7 | BRK | |
$FFF4~$FFF5 | COP | COP |
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
ABlock 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
バンク $00Stack 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が変わってしまうので注意が必要。
以下の動作を繰り返します。
--C C≠0 ならば srcBank:X→dtcBank:Y メモリの値を転送します。X++,Y++
転送後、DBRが変わってしまうので注意が必要。
スタックに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の命令一覧
Huc6280で追加または変更された命令
R65C02からW65C02で追加された命令
W65C02からW65C816で追加された命令
INSTRUCTIONS | Addressing Mode | CONDITION CODES | |||||||||||||||||||||||||||||||
imm | a | Zp | A | 暗黙 | (Zp,X) | (Zp),Y | Zp,X | a,X | a,Y | (a) | r | Zp.Y | (Zp) | (a,X) | D,S | [d],Y | al | al,X | rl | [d] | (d,S),Y | xyc | src,dtc,len | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
N | V | M/T/1 | X/B | D | I | Z | C | ||||||||||||||||||||||||||
ADC | A+M+C→A | 69 | 6D | 65 | 61 | 71 | 75 | 7D | 79 | 72 | 63 | 77 | 6F | 7F | 67 | 73 | * | * | * | * | |||||||||||||
AND | A∧M→A | 29 | 2D | 25 | 21 | 31 | 35 | 3D | 39 | 32 | 23 | 37 | 2F | 3F | 27 | 33 | * | * | |||||||||||||||
ASL | C=bit7 MA<<1 bit0=0 | 0E | 06 | 0A | 16 | 1E | * | * | * | ||||||||||||||||||||||||
BBR[0~7] | Branch on Mi=0*W65C816で削除 | 0F~7F | |||||||||||||||||||||||||||||||
BBS[0~7] | Branch on Mi=1*W65C816で削除 | 8F~FF | |||||||||||||||||||||||||||||||
BCC | Branch on C=0 | 90 | |||||||||||||||||||||||||||||||
BCS | Branch on C=1 | B0 | |||||||||||||||||||||||||||||||
BEQ | Branch on Z=1 | F0 | |||||||||||||||||||||||||||||||
BIT | A∧M | 89 | 2C | 24 | 34 | 3C | M7 | M6 | * | ||||||||||||||||||||||||
BMI | Branch on N=1 | 30 | |||||||||||||||||||||||||||||||
BNE | Branch on Z=0 | D0 | |||||||||||||||||||||||||||||||
BPL | Branch on N=0 | 10 | |||||||||||||||||||||||||||||||
BRA | Branch Always | 80 | |||||||||||||||||||||||||||||||
BRK | Break instruction | 00 | 1 | ||||||||||||||||||||||||||||||
BRL | Branch Always Long | 82 | |||||||||||||||||||||||||||||||
BVC | Branch on V=0 | 50 | |||||||||||||||||||||||||||||||
BVS | Branch on V=1 | 70 | |||||||||||||||||||||||||||||||
CLA | 0→A | 62 | 0 | ||||||||||||||||||||||||||||||
CLC | 0→C | 18 | 0 | ||||||||||||||||||||||||||||||
CLD | 0→D | D8 | 0 | ||||||||||||||||||||||||||||||
CLI | 0→I | 58 | 0 | ||||||||||||||||||||||||||||||
CLV | 0→V | B8 | 0 | ||||||||||||||||||||||||||||||
CLX | 0→X | 82 | 0 | ||||||||||||||||||||||||||||||
CLY | 0→Y | C2 | 0 | ||||||||||||||||||||||||||||||
CMP | A-M | C9 | CD | C5 | C1 | D1 | D5 | DD | D9 | D2 | D7 | CF | DF | C7 | D3 | * | * | * | |||||||||||||||
COP | 02 | 0 | 1 | ||||||||||||||||||||||||||||||
CPX | X-M | E0 | EC | E4 | * | * | * | ||||||||||||||||||||||||||
CPY | Y-M | C0 | CC | C4 | * | * | * | ||||||||||||||||||||||||||
CSH | Change Speed High 7.16MHz | D4 | 0 | ||||||||||||||||||||||||||||||
CSL | Change Speed Low 1.78MHz | 54 | 0 | ||||||||||||||||||||||||||||||
DEC | MA-1→MA | CE | C6 | 3A | D6 | DE | * | * | |||||||||||||||||||||||||
DEX | X-1→X | CA | * | * | |||||||||||||||||||||||||||||
DEY | Y-1→Y | 88 | * | * | |||||||||||||||||||||||||||||
EOR | A ⊻M→A | 49 | 4D | 45 | 41 | 51 | 55 | 5D | 59 | 52 | 43 | 57 | 4F | 5F | 47 | 57 | * | * | |||||||||||||||
INC | MA+1→MA | EE | E6 | 1A | F6 | FE | * | * | |||||||||||||||||||||||||
INX | X+1→X | E8 | * | * | |||||||||||||||||||||||||||||
INY | Y+1→Y | C8 | * | * | |||||||||||||||||||||||||||||
JML | Jump Long | DC | |||||||||||||||||||||||||||||||
JMP | Jump to new Location | 4C | 6C | 7C | 5C | ||||||||||||||||||||||||||||
JSL | Jump Subroutine Long | 22 | |||||||||||||||||||||||||||||||
JSR | Jump to SubRoutine | 20 | FC | ||||||||||||||||||||||||||||||
LDA | M→A | A9 | AD | A5 | A1 | B1 | B5 | BD | B9 | B2 | A3 | B7 | AF | BF | A7 | * | * | ||||||||||||||||
LDX | M→X | A2 | AE | A6 | BE | B6 | * | * | |||||||||||||||||||||||||
LDY | M→Y | A0 | AC | A4 | B4 | BC | * | * | |||||||||||||||||||||||||
LSR | bit0→C MA>>1 0→bit7 | 4E | 46 | 4A | 56 | 5E | 0 | * | * | ||||||||||||||||||||||||
MVN | Block Move Negative | 54 | |||||||||||||||||||||||||||||||
MVP | Block Move Positive | 44 | |||||||||||||||||||||||||||||||
NOP | No Operation | EA | |||||||||||||||||||||||||||||||
ORA | A∨M→A | 09 | 0D | 05 | 01 | 11 | 15 | 1D | 19 | 1F | 12 | 03 | 17 | 0F | 07 | 13 | * | * | |||||||||||||||
PEA | Push Effective Absolute Address on Stack | F4 | |||||||||||||||||||||||||||||||
PEI | Push Effective Indirect Address on Stack | D4 | |||||||||||||||||||||||||||||||
PER | Push Effective Program Counter Relative Address on Stack | 62 | |||||||||||||||||||||||||||||||
PHA | A→MS S-1→S | 48 | |||||||||||||||||||||||||||||||
PHB | DBR→MS S-1→S | 8B | |||||||||||||||||||||||||||||||
PHD | D→MS S-1→S | 0B | |||||||||||||||||||||||||||||||
PHK | PBR→MS S-1→S | 4B | |||||||||||||||||||||||||||||||
PHP | P→MS S-1→S | 08 | |||||||||||||||||||||||||||||||
PHX | X→MS S-1→S | DA | |||||||||||||||||||||||||||||||
PHY | Y→MS S-1→S | 5A | |||||||||||||||||||||||||||||||
PLA | S+1→S MS→A | 68 | * | * | |||||||||||||||||||||||||||||
PLB | S+1→S MS→DBR | AB | * | * | |||||||||||||||||||||||||||||
PLD | S+1→S MS→D | 2B | * | * | |||||||||||||||||||||||||||||
PLP | S+1→S MS→P | 28 | * | * | * | * | * | * | * | * | |||||||||||||||||||||||
PLX | S+1→S MS→X | FA | |||||||||||||||||||||||||||||||
PLY | S+1→S MS→Y | 7A | |||||||||||||||||||||||||||||||
REP | Reset Status Bits | C2 | * | * | * | * | * | * | * | * | |||||||||||||||||||||||
RMB[0~7] | 0→Mi*W65C816で削除 | 07~77 | |||||||||||||||||||||||||||||||
ROL | bit7→C MA<<1 C→bit0 | 2E | 26 | 2A | 36 | 3E | * | * | * | ||||||||||||||||||||||||
ROR | bit0→C MA>>1 C→bit7 | 6E | 66 | 6A | 76 | 7E | * | * | * | ||||||||||||||||||||||||
RTI | Return from Interrupt | 40 | * | * | * | * | * | * | * | * | |||||||||||||||||||||||
RTL | Return from Subroutine Long | 6B | |||||||||||||||||||||||||||||||
RTS | Return from Subroutine | 60 | |||||||||||||||||||||||||||||||
SBC | A-M-(1-C)→A | E9 | ED | E5 | E1 | F1 | F5 | FD | F9 | F2 | E3 | F7 | FF | E7 | F3 | * | * | * | (3) | ||||||||||||||
SEC | 1→C | 38 | 1 | ||||||||||||||||||||||||||||||
SED | 1→D | F8 | 1 | ||||||||||||||||||||||||||||||
SEI | 1→I | 78 | 1 | ||||||||||||||||||||||||||||||
SEP | Set Processor Status Bits | E2 | * | * | * | * | * | * | * | * | |||||||||||||||||||||||
SMB[0~7] | 1→Mi*W65C816で削除 | 87~F7 | |||||||||||||||||||||||||||||||
SAX | A⇄X | 22 | 0 | ||||||||||||||||||||||||||||||
SAY | A⇄Y | 42 | 0 | ||||||||||||||||||||||||||||||
SET | 1→T | F4 | 1 | ||||||||||||||||||||||||||||||
SXY | X⇄Y | 02 | 0 | ||||||||||||||||||||||||||||||
ST0 | Store (HuC6270) VDC No. 0 | 03 | 0 | ||||||||||||||||||||||||||||||
ST1 | Store (HuC6270) VDC No. 1 | 13 | 0 | ||||||||||||||||||||||||||||||
ST2 | Store (HuC6270) VDC No. 2 | 23 | 0 | ||||||||||||||||||||||||||||||
STA | A→M | 8D | 85 | 81 | 91 | 95 | 9D | 99 | 92 | 83 | 97 | 8F | 9F | 87 | 93 | ||||||||||||||||||
STP | Stop the Clock | DB | |||||||||||||||||||||||||||||||
STX | X→M | 8E | 86 | 96 | |||||||||||||||||||||||||||||
STY | Y→M | 8C | 84 | 94 | |||||||||||||||||||||||||||||
STZ | 0→M | 9C | 64 | 74 | 9E | ||||||||||||||||||||||||||||
TAI | Transfer Alternate Increment | F3 | 0 | ||||||||||||||||||||||||||||||
TAM[0~7] | Transfer Accumulator to MPRs | 53 | 0 | ||||||||||||||||||||||||||||||
TAX | A→X | AA | * | * | |||||||||||||||||||||||||||||
TAY | A→Y | A8 | * | * | |||||||||||||||||||||||||||||
TCD | A→D | 5B | * | * | |||||||||||||||||||||||||||||
TCS | A→S | 1B | |||||||||||||||||||||||||||||||
TDC | D→A | 7B | * | * | |||||||||||||||||||||||||||||
TDD | Transfer Decrement Decrement | C3 | 0 | ||||||||||||||||||||||||||||||
TIA | Transfer Increment Alternate | E3 | 0 | ||||||||||||||||||||||||||||||
TII | Transfer Increment Increment | 73 | 0 | ||||||||||||||||||||||||||||||
TIN | Transfer Increment Alternate | D3 | 0 | ||||||||||||||||||||||||||||||
TMA[0~7] | TMA - Transfer MPR to Accumulator | 43 | 0 | ||||||||||||||||||||||||||||||
TRB | (¬A) ∧ M → M | 1C | 14 | * | |||||||||||||||||||||||||||||
TSB | A ∨ M →M | 0C | 04 | * | |||||||||||||||||||||||||||||
TSC | S→A | 3B | * | * | |||||||||||||||||||||||||||||
TST | M ∨ #i | 93 | 83 | A3 | B3 | * | * | 0 | * | ||||||||||||||||||||||||
TSX | S→X | BA | * | * | |||||||||||||||||||||||||||||
TXA | X→A | 8A | * | * | |||||||||||||||||||||||||||||
TXS | X→S | 9A | |||||||||||||||||||||||||||||||
TXY | X→Y | 9B | * | * | |||||||||||||||||||||||||||||
TYA | Y→A | 98 | * | * | |||||||||||||||||||||||||||||
TYX | Y→X | BB | * | * | |||||||||||||||||||||||||||||
WAI | Wait for Interrupt | CB | |||||||||||||||||||||||||||||||
WDM | Reserved for future use | 42 | |||||||||||||||||||||||||||||||
XBA | B⇄A | EB | * | * | |||||||||||||||||||||||||||||
XCE | C⇄E | FB | E |
∧ : AND
∨ : OR
¬ : NOT