HuC6280 命令HEXテーブル
...上位4bit
0x1x2x3x 4x5x6x7x 8x9xAxBx CxDxExFx
特記事項:「---」は未定義
下位4bit x0 00:BRK 10:BPL $rr 20:JSR $aabb 30:BMI $rr 40:RTI 50:BVC $rr 60:RTS 70:BVS $rr 80:BRA $rr 90:BCC $rr A0:LDY #$nn B0:BCS $rr C0:CPY #$nn D0:BNE $rr E0:CPX #$nn F0:BEQ $rr
x1 01:ORA ($zz,X) 11:ORA ($zz),Y 21:AND ($zz,X) 31:AND ($zz),Y 41:EOR ($zz,X) 51:EOR ($zz),Y 61:ADC ($zz,X) 71:ADC ($zz),Y 81:STA ($zz,X) 91:STA ($zz),Y A1:LDA ($zz,X) B1:LDA ($zz),Y C1:CMP ($zz,X) D1:CMP ($zz),Y E1:SBC ($zz,X) F1:SBC ($zz),Y
x2 02:SXY 12:ORA ($zz) 22:SAX 32:AND ($zz) 42:SAY 52:EOR ($zz) 62:CLA 72:ADC ($zz) 82:CLX 92:STA ($zz) A2:LDX #$nn B2:LDA ($zz) C2:CLY D2:CMP ($zz) E2:--- F2:SBC ($zz)
x3 03:ST0 #$nn 13:ST1 #$nn 23:ST2 #$nn 33:--- 43:TMA #$nn 53:TAM #$nn 63:--- 73:TII $SSss, $DDdd, $LLll 83:TST #$nn, $zz 93:TST #$nn, $aabb A3:TST #$nn, $zz, X B3:TST #$nn, $aabb, X C3:TDD $SSss, $DDdd, $LLll D3:TIN $SSss, $DDdd, $LLll E3:TIA $SSss, $DDdd, $LLll F3:TAI $SSss, $DDdd, $LLll
x4 04:TSB $zz 14:TRB $zz 24:BIT $zz 34:BIT $zz,X 44:BSR $rr 54:CSL 64:STZ $zz 74:STZ $zz,X 84:STY $zz 94:STY $zz,X A4:LDY $zz B4:LDY $zz,X C4:CPY $zz D4:CSH E4:CPX $zz F4:SET
x5 05:ORA $zz 15:ORA $zz,X 25:AND $zz 35:AND $zz,X 45:EOR $zz 55:EOR $zz,X 65:ADC $zz 75:ADC $zz,X 85:STA $zz 95:STA $zz,X A5:LDA $zz B5:LDA $zz,X C5:CMP $zz D5:CMP $zz,X E5:SBC $zz F5:SBC $zz,X
x6 06:ASL $zz 16:ASL $zz,X 26:ROL $zz 36:ROL $zz,X 46:LSR $zz 56:LSR $zz,X 66:ROR $zz 76:ROR $zz,X 86:STX $zz 96:STX $zz,Y A6:LDX $zz B6:LDX $zz,Y C6:DEC $zz D6:DEC $zz,X E6:INC $zz F6:INC $zz,X
x7 07:RMB0 $zz 17:RMB1 $zz 27:RMB2 $zz 37:RMB3 $zz 47:RMB4 $zz 57:RMB5 $zz 67:RMB6 $zz 77:RMB7 $zz 87:SMB0 $zz 97:SMB1 $zz A7:SMB2 $zz B7:SMB3 $zz C7:SMB4 $zz D7:SMB5 $zz E7:SMB6 $zz F7:SMB7 $zz
x8 08:PHP 18:CLC 28:PLP 38:SEC 48:PHA 58:CLI 68:PLA 78:SEI 88:DEY 98:TYA A8:TAY B8:CLV C8:INY D8:CLD E8:INX F8:SED
x9 09:ORA #$nn 19:ORA $aabb,Y 29:AND #$nn 39:AND $aabb,Y 49:EOR #$nn 59:EOR $aabb,Y 69:ADC #$nn 79:ADC $aabb,Y 89:BIT #$nn 99:STA $aabb,Y A9:LDA #$nn B9:LDA $aabb,Y C9:CMP #$nn D9:CMP $aabb,Y E9:SBC #$nn F9:SBC $aabb,Y
xA 0A:ASL A 1A:INC A 2A:ROL A 3A:--- 4A:LSR A 5A:PHY 6A:ROR A 7A:PLY 8A:TXA 9A:TXS AA:TAX BA:TSX CA:DEX DA:PHX EA:NOP FA:PLX
xB 0B:--- 1B:--- 2B:--- 3B:--- 4B:--- 5B:--- 6B:--- 7B:--- 8B:--- 9B:--- AB:--- BB:--- CB:--- DB:--- EB:--- FB:---
xC 0C:TSB $aabb 1C:TRB $aabb 2C:BIT $aabb 3C:BIT $aabb,X 4C:JMP $aabb 5C:--- 6C:JMP ($aabb) 7C:JMP ($aabb,X) 8C:STY $aabb 9C:STZ $aabb AC:LDY $aabb BC:LDY $aabb,X CC:CPY $aabb DC:--- EC:CPX $aabb FC:---
xD 0D:ORA $aabb 1D:ORA $aabb,X 2D:AND $aabb 3D:AND $aabb,X 4D:EOR $aabb 5D:EOR $aabb,X 6D:ADC $aabb 7D:ADC $aabb,X 8D:STA $aabb 9D:STA $aabb,X AD:LDA $aabb BD:LDA $aabb,X CD:CMP $aabb DD:CMP $aabb,X ED:SBC $aabb FD:SBC $aabb,X
xE 0E:ASL $aabb 1E:ASL $aabb,X 2E:ROL $aabb 3E:ROL $aabb,X 4E:LSR $aabb 5E:LSR $aabb,X 6E:ROR $aabb 7E:ROR $aabb,X 8E:STX $aabb 9E:STZ $aabb,X AE:LDX $aabb BE:LDX $aabb,Y CE:DEC $aabb DE:DEC $aabb,X EE:INC $aabb FE:INC $aabb,X
xF 0F:BBR0 $zz, $rr 1F:BBR1 $zz, $rr 2F:BBR2 $zz, $rr 3F:BBR3 $zz, $rr 4F:BBR4 $zz, $rr 5F:BBR5 $zz, $rr 6F:BBR6 $zz, $rr 7F:BBR7 $zz, $rr 8F:BBS0 $zz, $rr 9F:BBS1 $zz, $rr AF:BBS2 $zz, $rr BF:BBS3 $zz, $rr CF:BBS4 $zz, $rr DF:BBS5 $zz, $rr EF:BBS6 $zz, $rr FF:BBS7 $zz, $rr

アドレスについて

論理アドレス:CPU内部で直接扱えるアドレスの範囲は16bit分(H'0000 - H'FFFF)で、これを論理アドレスと呼びます。

物理アドレス:HuC6280はCPU自体が扱えるアドレスの範囲として21bit分(H'000000 - H'1FFFFF)持っています。これを物理アドレスと呼びます。

CPU内部では、常に論理アドレスから物理アドレスへの変換を行っております。論理アドレスから物理アドレスへの変換式は、「物理アドレス= MPR[論理アドレス上位3bit] * 8192 + 論理アドレス下位13bit」で、物理アドレスの21bit分の内訳は、論理アドレスの下位13ビットとMPRの8ビットです。どのMPRがどのアドレスにアサインされているのかは下記を参照してください。例えば、MPR1=H'F8の時に論理アドレスH'218D を指定すると、物理アドレスは H'F8 * 8192 + H'18D = H'1F018D となります。

レジスタについて

名称説明
PC16bitプログラムカウンタ:現在命令実行中の論理アドレスです。
S8bitスタックレジスタ:レジスタの内容を一時保存する「スタック」エリアでの、現在のアドレスです。スタックエリアは物理アドレス h'1F0100 から256bytes固定です。
P8bitステータスレジスタ:現在のCPUの状態を示すフラグが入ります。中身については後述。
A8bitアキュムレートレジスタ:主に計算で使用する汎用レジスタです。
X8bitXインデックスレジスタ:主にアドレスのオフセットとして使用する汎用インデックスレジスタです。
Y8bitYインデックスレジスタ:主にアドレスのオフセットとして使用する汎用インデックスレジスタです。Xレジスタとの違いは、一部アドレッシングで扱いが異なります。
SH8bit(L側をXとすることで16bit)ソースハイレジスタ:Xレジスタをペアとして使い、ブロック転送命令(TAITDDTIATIITIN)でソースアドレスとして使います。ブロック転送命令は転送実行前にA,X,Yレジスタを保存し、転送実行後に復帰するので、レジスタがペアで使われているかどうかを気にする必要はありません。本レジスタへ直接アクセスする仕組みはありません。
DH8bit(L側をYとすることで16bit)デスティネーションハイレジスタ:Yレジスタをペアとして使い、ブロック転送命令(TAITDDTIATIITIN)でデスティネーションアドレスとして使います。ブロック転送命令は転送実行前にA,X,Yレジスタを保存し、転送実行後に復帰するので、レジスタがペアで使われているかどうかを気にする必要はありません。本レジスタへ直接アクセスする仕組みはありません。
LH8bit(L側をAとすることで16bit)レングスハイレジスタ:Aレジスタをペアとして使い、ブロック転送命令(TAITDDTIATIITIN)で転送する長さのカウンタとして使います。ブロック転送命令は転送実行前にA,X,Yレジスタを保存し、転送実行後に復帰するので、レジスタがペアで使われているかどうかを気にする必要はありません。本レジスタへ直接アクセスする仕組みはありません。
MPR0
MPR1
MPR2
MPR3
MPR4
MPR5
MPR6
MPR7
8bit x 8論理アドレスから物理アドレスへ変換する時に使うマッピングレジスタです。MPRレジスタは8個あり、各レジスタは固有範囲内の論理アドレスを物理アドレスへ変換する時に参照されます。レジスタと論理アドレスの対応関係は下表を参照してください。
Pレジスタにアサインされている各フラグの説明とビットアサイン
bit名称説明
bit7Nネガティブ(Negative)フラグ:演算結果、およびAレジスタ、Xレジスタ、Yレジスタへの代入結果のbit7(符号フラグ)が入ります。つまり、演算・代入結果が H'00-H'7F であれば 0 、H'80-H'FF であれば 1 となります。
bit6Vオーバーフロー(oVerflow)フラグ:演算結果が2の補数(-128 ~ +127)の範囲に収まらない場合に 1 となります。例えば、A=H'60(=96) の時、ADC #$22(=34) という命令を実行した場合、結果は A=H'82 となります。2の補数での結果は 96+34 = 130 となりますが、H'82の2の補数表現では -126 となり矛盾が生じます。こういう時にVフラグは 1 となります。
bit5Tメモリ演算(”T"の由来が思いつかず…Transfer?)フラグ:このフラグが1になっているときに算術・論理演算系命令(ADC, AND, EOR, ORA, SBC)を実行すると、ソースの値がAレジスタではなく、Xレジスタが示すゼロページアドレスの値が使われ、演算結果もXレジスタが示すゼロページアドレスに格納されます。このフラグは、SET 命令以外の命令実行後には 0 となります。
bit4Bブレイク(Break)命令フラグ:BRK命令実行により 1 となります。IRQ2割り込みとBRK命令による割り込みは共通の割り込みベクターを使っているため、本フラグにて判別する必要があります。
bit3Dデシマル(Decimal)フラグ:本ビットが1の時に算術加減算命令(ADC, SBC)を実行すると、BCD(Binary Coded Decimal:2進化10進数)演算補正が機能して命令実行サイクルが+1されて補正されます。
bit2Iインタラプトディスエーブル(Interrupt disable)フラグ:このフラグが1の時は、IRQ1とIRQ2の割り込みおよびBRK命令、タイマーによる割り込みが禁止されます。
bit1Zゼロ(Zero)フラグ:演算結果、およびAレジスタ、Xレジスタ、Yレジスタへの代入結果が0となる場合に 1 となります。演算・代入結果が 0 でなければ 0 がセットされます。
bit0Cキャリー(Carry)フラグ:演算結果で桁上がり・桁下がりが起きた時に 1 となります。起きなければ 0 となります。また、特定シフト命令(ASLROLROR、)によっても変化します。
MPRと論理アドレスの関係
MPR論理アドレス範囲TMAi, TAMi命令での指定セレクタビット
MPR0h'0000 - h'1FFFb'00000001
MPR1h'2000 - h'3FFFb'00000010
MPR2h'4000 - h'5FFFb'00000100
MPR3h'6000 - h'7FFFb'00001000
MPR4h'8000 - h'9FFFb'00010000
MPR5h'A000 - h'BFFFb'00100000
MPR6h'C000 - h'DFFFb'01000000
MPR7h'E000 - h'FFFFb'10000000

Addressing Mode について

名称説明動き
Implied単独命令でメモリへのアクセスなし。---
Immediate即値val = #$nn;
Absolute絶対アドレス(16bit)val = read_mem($aabb);
Absolute with X絶対アドレス(16bit) + X indexedval = read_mem($aabb + Xreg);
Absolute with Y絶対アドレス(16bit) + Y indexedval = read_mem($aabb + Yreg);
ZeroPageゼロページアドレス(8bit)val = read_zerop($zz);
ZeroPage with Xゼロページアドレス(8bit) + X indexedval = read_zerop($zz + Xreg);
ZeroPage with Yゼロページアドレス(8bit) + Y indexedval = read_zerop($zz + Yreg);
Indirect ZeroPage間接ゼロページアドレス(8bit)val = read_mem(read_zerop($zz) + read_zerop($zz + 1)*256);
Indirect with pre-indexed X間接ゼロページアドレス(8bit) + pre-X indexedval = read_mem(read_zerop($zz + Xreg) + read_zerop($zz + Xreg + 1)*256);
Indirect with post-indexed Y間接ゼロページアドレス(8bit) + post-Y indexedval = read_mem(read_zerop($zz) + read_zerop($zz + 1)*256 + Yreg);
Relative相対アドレス(8bit)addr = 次の命令のアドレス + $rr ( -128 ≦ $rr ≦ +127 );
Indirect間接絶対アドレス(16bit)addr = read_mem($aabb) + read_mem($aabb + 1) * 256;
Indexed Indirect間接絶対アドレス(16bit) + X indexedaddr = read_mem($aabb + Xreg) + read_mem($aabb + Xreg + 1) * 256;

Tflagが1の時の動きについて

Tflagは、以下の5つの命令(ADC命令AND命令EOR命令ORA命令SBC命令)の動作を拡張するためのフラグです。6280オリジナルの仕様です。

Tflagが0の時は、上記5命令のソースはAレジスタそのものです。つまり、" A ← A 演算子 dst " という動作になります。Tflagが1の時は、ソースが「Xレジスタがアドレスとなるゼロページメモリ」になります。

例として、Xreg=$4A の時の

004A: a9
SET
AND #$33

という命令は、

m = read_zerop(reg.X); : m=$a9
m = m and $33; : m = $a9 and $33 = $21
write_zerop(reg.X, m); : 004A: 21

という動作になります(例では各種フラグの動きを無視しています)。


ADC ( ADd with Carry )

OperationTflagが0の時A ← A + dst + Carry
Tflagが1の時($zz:X) ← ($zz:X) + dst + Carry

加算命令です。6280(6502)にはCarryが付かない加算命令はありません。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
ADC #$nnImmediate$69, $nn226502
ADC $zzZeroPage$65, $zz246502
ADC $zz,XZeroPage with X$75, $zz246502
ADC $aabbAbsolute$6D, $bb, $aa356502
ADC $aabb,XAbsolute with X$7D, $bb, $aa356502
ADC $aabb,YAbsolute with Y$79, $bb, $aa356502
ADC ($zz)Indirect ZeroPage$72, $zz2765C02
ADC ($zz,X)Indirect with pre-indexed X$61, $zz276502
ADC ($zz),YIndirect with post-indexed Y$71, $zz276502
特記事項:Tflagが1の時、実行サイクルは+3される
Flags
フラグ名変化
N演算結果のbit7
VDflagが1であれば0固定。Dflagが0であれば、演算結果が2の補数としての範囲を超えたら1、そうじゃなければ0
T0
D---
I---
Z演算結果の8bit分が0なら1、そうじゃなければ0
C演算結果、桁あふれが起きた場合は1、そうじゃなければ0

AND ( logical AND )

OperationTflagが0の時A ← A and dst
Tflagが1の時($zz:X) ← ($zz:X) and dst

論理積命令です。各ビットごと、どちらも1の時に1、そのほかは0となります。

各ビットの結果
入力1入力2出力
000
010
100
111
命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
AND #$nnImmediate$29, $nn226502
AND $zzZeroPage$25, $zz246502
AND $zz,XZeroPage with X$35, $zz246502
AND $aabbAbsolute$2D, $bb, $aa356502
AND $aabb,XAbsolute with X$3D, $bb, $aa356502
AND $aabb,YAbsolute with Y$39, $bb, $aa356502
AND ($zz)Indirect ZeroPage$32, $zz2765C02
AND ($zz,X)Indirect with pre-indexed X$21, $zz276502
AND ($zz),YIndirect with post-indexed Y$31, $zz276502
特記事項:Tflagが1の時、実行サイクルは+3される
Flags
フラグ名変化
N演算結果のbit7
V---
T0
D---
I---
Z演算結果全て0なら1、そうじゃなければ0
C---

ASL ( Arithmetic Shift Left )

OperationCarry, dst ← dst << 1

算術左シフト命令です。1bit分、左へシフトします。結果的に、値を2倍するのと同じです。0bit目には0が入ります。演算前の7bit目はCarryフラグに入ります。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
ASL AImmediate$0a126502
ASL $zzZeroPage$06, $zz266502
ASL $zz,XZeroPage with X$16, $zz266502
ASL $aabbAbsolute$0E, $bb, $aa376502
ASL $aabb,XAbsolute with X$1E, $bb, $aa376502
Flags
フラグ名変化
N演算結果のbit7
V---
T0
D---
I---
Z演算結果全て0なら1、そうじゃなければ0
C演算前のbit7が入る

BBRn ( Branch on Bit Reset n )

OperationPC ← ($zz).bit(n) == 0 ? PC+3+rr(-128≦rr≦+127) : PC+3

指定されたZeroPageの中身のビットが0の場合に相対分岐します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
BBR0, $zz, $rrZeroPage, Relative$0F, $zz, $rr3665C02
BBR1, $zz, $rrZeroPage, Relative$1F, $zz, $rr3665C02
BBR2, $zz, $rrZeroPage, Relative$2F, $zz, $rr3665C02
BBR3, $zz, $rrZeroPage, Relative$3F, $zz, $rr3665C02
BBR4, $zz, $rrZeroPage, Relative$4F, $zz, $rr3665C02
BBR5, $zz, $rrZeroPage, Relative$5F, $zz, $rr3665C02
BBR6, $zz, $rrZeroPage, Relative$6F, $zz, $rr3665C02
BBR7, $zz, $rrZeroPage, Relative$7F, $zz, $rr3665C02
特記事項:分岐が発生する場合、実行サイクルは+2される
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

BBSn ( Branch on Bit Set n )

OperationPC ← ($zz).bit(n) == 1 ? PC+3+rr(-128≦rr≦+127) : PC+3

指定されたZeroPageの中身のビットが1の場合に相対分岐します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
BBS0, $zz, $rrZeroPage, Relative$8F, $zz, $rr3665C02
BBS1, $zz, $rrZeroPage, Relative$9F, $zz, $rr3665C02
BBS2, $zz, $rrZeroPage, Relative$AF, $zz, $rr3665C02
BBS3, $zz, $rrZeroPage, Relative$BF, $zz, $rr3665C02
BBS4, $zz, $rrZeroPage, Relative$CF, $zz, $rr3665C02
BBS5, $zz, $rrZeroPage, Relative$DF, $zz, $rr3665C02
BBS6, $zz, $rrZeroPage, Relative$EF, $zz, $rr3665C02
BBS7, $zz, $rrZeroPage, Relative$FF, $zz, $rr3665C02
特記事項:分岐が発生する場合、実行サイクルは+2される
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

BCC ( Branch on Carry Clear )

OperationPC ← Carry == 0 ? PC+2+rr(-128≦rr≦+127) : PC+2

Carryフラグが0の場合に相対分岐します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
BCC $rrRelative$90, $rr226502
特記事項:分岐が発生する場合、実行サイクルは+2される
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

BCS ( Branch on Carry Set )

OperationPC ← Carry == 1 ? PC+2+rr(-128≦rr≦+127) : PC+2

Carryフラグが1の場合に相対分岐します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
BCS $rrRelative$B0, $rr226502
特記事項:分岐が発生する場合、実行サイクルは+2される
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

BEQ ( Branch on EQual )

OperationPC ← Zero == 1 ? PC+2+rr(-128≦rr≦+127) : PC+2

Zeroフラグが1の場合に相対分岐します。比較命令で値が同じである場合はZeroフラグが1になります(内部動作は被比較値と比較対象値を引き算していると考えられるためこういう動作になります)。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
BEQ $rrRelative$F0, $rr226502
特記事項:分岐が発生する場合、実行サイクルは+2される
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

BIT ( BIt Test )

OperationN ← dst.bit7, V ← dst.bit6, Z ← A and dst == 0

Aレジスタとdstの値の論理積を取り、結果0になるならZeroフラグをセットします。Aレジスタの内容は変化しません。dst の bit7 が Negative フラグに、dst の bit6 oVerflow フラグにそれぞれ反映されます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
BIT #$nnImmediate$89, $nn2265C02
BIT $zzZeroPage$24, $zz246502
BIT $zz,XZeroPage with X$34, $zz2465C02
BIT $aabbAbsolute$2c, $bb, $aa356502
BIT $aabb,XAbsolute with X$3c, $bb, $aa3565C02
Flags
フラグ名変化
Ndst.bit7
Vdst.bit6
T0
D---
I---
ZA and dst == 0 ? 1 : 0
C---

BMI ( Branch on Minus )

OperationPC ← Negative == 1 ? PC+2+rr(-128≦rr≦+127) : PC+2

Negativeフラグが1の場合に相対分岐します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
BMI $rrRelative$30, $rr226502
特記事項:分岐が発生する場合、実行サイクルは+2される
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

BNE ( Branch on Not Equal )

OperationPC ← Zero == 0 ? PC+2+rr(-128≦rr≦+127) : PC+2

Zeroフラグが0の場合に相対分岐します。比較命令で値が違う場合はZeroフラグが0になります(内部動作は被比較値と比較対象値を引き算していると考えられるためこういう動作になります)。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
BNE $rrRelative$D0, $rr226502
特記事項:分岐が発生する場合、実行サイクルは+2される
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

BPL ( Branch on Plus )

OperationPC ← Negative == 0 ? PC+2+rr(-128≦rr≦+127) : PC+2

Negativeフラグが0の場合に相対分岐します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
BPL $rrRelative$10, $rr226502
特記事項:分岐が発生する場合、実行サイクルは+2される
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

BRA ( BRAnch )

OperationPC ← PC+2+rr(-128≦rr≦+127)

無条件に相対ジャンプします。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
BRA $rrRelative$80, $rr2465C02
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

BRK ( BReaK interrupt )

Operation(Stack) ← PC+1, Stack+=2, (Stack) ← P, Stack+=1, PC ← VECTOR($FFF6)

IRQ2に登録されているアドレスを割り込みと同じ動作でコールします。スタックにはステータスレジスタの内容も積まれますが、bit4が1になっています。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
BRKImplied$00186502
特記事項:動作は割り込みと同じなので、BRK命令呼び出しから戻る時はRTI命令を使います。
Flags
フラグ名変化
N---
V---
T0
D0
I1
Z---
C---
特記事項:bit4 に相当する"B"フラグが1になります。

BSR ( Branch to SubRoutine )

Operation(Stack-1,+0) ← PC+1, Stack-=2, PC ← PC+2+rr(-128≦rr≦+127)

相対番地指定なサブルーチンコール命令です。戻ってくるときはJSR命令と同じくRTS命令です。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
BSRRelative$44, $rr286280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

BVC ( Branch on oVerflow Clear )

OperationPC ← oVerflow == 0 ? PC+2+rr(-128≦rr≦+127) : PC+2

Overflowフラグが0の場合に相対分岐します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
BVC $rrRelative$50, $rr226502
特記事項:分岐が発生する場合、実行サイクルは+2される
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

BVS ( Branch on oVerflow Set )

OperationPC ← oVerflow == 1 ? PC+2+rr(-128≦rr≦+127) : PC+2

Overflowフラグが1の場合に相対分岐します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
BVS $rrRelative$70, $rr226502
特記事項:分岐が発生する場合、実行サイクルは+2される
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

CLA ( CLear A reg )

OperationA ← 0

Aレジスタに0を入れます。LDA #$00と違い1byteで済みますし、フラグが動きません。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
CLAImplied$62126280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

CLC ( CLear Carry flag )

OperationCarry ← 0

Carryフラグを0にします。加減算の前でよく登場すると思います。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
CLCImplied$18126502
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C0

CLD ( CLear Decimal flag )

OperationDecimal ← 0

Decimalフラグを0にします。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
CLDImplied$D8126502
Flags
フラグ名変化
N---
V---
T0
D0
I---
Z---
C---

CLI ( CLear Interrupt flag )

OperationInterrupt ← 0

Interruptフラグを0にして、CPUがNMI以外の割り込みを受け付けられるようにします。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
CLIImplied$58126502
Flags
フラグ名変化
N---
V---
T0
D---
I0
Z---
C---

CLV ( CLear oVerflow flag )

OperationoVerflow ← 0

oVerflowフラグを0にします。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
CLVImplied$B8126502
Flags
フラグ名変化
N---
V0
T0
D---
I---
Z---
C---

CLX ( CLear X reg )

OperationX ← 0

Xレジスタを0にします。LDX #$00と違い1byteで済みますし、フラグが動きません。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
CLXImplied$82126280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

CLY ( CLear Y reg )

OperationY ← 0

Yレジスタを0にします。LDY #$00と違い1byteで済みますし、フラグが動きません。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
CLYImplied$C2126280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

CMP ( CoMPare )

OperationA - dst

Aレジスタとdstの内容を比較して結果をフラグレジスタに反映させます。フラグの動きは Carryが0の時のSBC命令と基本的には同じで、oVerflowフラグは動かず、結果が残りません(=Aレジスタの内容は変更されません)。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
CMP #$nnImmediate$C9, $nn226502
CMP $zzZeroPage$C5, $zz246502
CMP $zz,XZeroPage with X$D5, $zz246502
CMP $aabbAbsolute$CD, $bb, $aa356502
CMP $aabb,XAbsolute with X$DD, $bb, $aa356502
CMP $aabb,YAbsolute with Y$D9, $bb, $aa356502
CMP ($zz)Indirect ZeroPage$D2, $zz2765C02
CMP ($zz,X)Indirect with pre-indexed X$C1, $zz276502
CMP ($zz),YIndirect with post-indexed Y$D1, $zz276502
Flags
フラグ名変化
N演算結果のbit7
V---
T0
D---
I---
Z演算結果全て0なら1、そうじゃなければ0
CA≧dstなら 1、A<dstなら 0

CPX ( ComPare X with dst )

OperationX - dst

Xレジスタとdstの内容を比較して結果をフラグレジスタに反映させます。CMP命令のソースがXレジスタになった命令です。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
CPX #$nnImmediate$E0, $nn226502
CPX $zzZeroPage$E4, $zz246502
CPX $aabbAbsolute$EC, $bb, $aa356502
Flags
フラグ名変化
N演算結果のbit7
V---
T0
D---
I---
Z演算結果全て0なら1、そうじゃなければ0
CX≧dstなら 1、X<dstなら 0

CPY ( ComPare Y with dst )

OperationY - dst

Yレジスタとdstの内容を比較して結果をフラグレジスタに反映させます。CMP命令のソースがYレジスタになった命令です。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
CPY #$nnImmediate$C0, $nn226502
CPY $zzZeroPage$C4, $zz246502
CPY $aabbAbsolute$CC, $bb, $aa356502
Flags
フラグ名変化
N演算結果のbit7
V---
T0
D---
I---
Z演算結果全て0なら1、そうじゃなければ0
CY≧dstなら 1、Y<dstなら 0

CSH ( Change Speed to High )

OperationCPUクロックを投入クロックの1/3へ変更

CPUの動作クロックを変更し、CPUに供給されているクロックを3分周したクロックで動作するようにします。特殊なI/Oとかを操作するケースを除き、通常はCPUのリセット後にこの命令を使って高速な動作へ切り替えます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
CSHImplied$D4136280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

CSL ( Change Speed to Low )

OperationCPUクロックを投入クロックの1/12へ変更

CPUの動作クロックを変更し、CPUに供給されているクロックを12分周したクロックで動作するようにします。特殊なI/O(確か天の声とか)とかを操作するケース等で本命令を用いて動作クロックを落とす必要があります。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
CSLImplied$54136280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

DEC ( DECrement dst )

Operationdst ← dst - 1

dst の内容を1引いて dst に格納します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
DEC AAccmulator$3A1265C02
DEC $zzZeroPage$C6, $zz266502
DEC $zz,XZeroPage with X$D6, $zz266502
DEC $aabbAbsolute$CE, $bb, $aa376502
DEC $aabb,XAbsolute with X$DE, $bb, $aa376502
Flags
フラグ名変化
N演算結果のbit7
V---
T0
D---
I---
Z演算結果が0なら1、そうじゃなければ0
C---

DEX ( DEcrement X )

OperationX ← X - 1

X レジスタの内容を1引きます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
DEXImplied$CA126502
Flags
フラグ名変化
N演算結果のbit7
V---
T0
D---
I---
Z演算結果が0なら1、そうじゃなければ0
C---

DEY ( DEcrement Y )

OperationY ← Y - 1

Y レジスタの内容を1引きます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
DEYImplied$88126502
Flags
フラグ名変化
N演算結果のbit7
V---
T0
D---
I---
Z演算結果が0なら1、そうじゃなければ0
C---

EOR ( Exclusive OR )

OperationTflagが0の時A ← A xor dst
Tflagが1の時($zz:X) ← ($zz:X) xor dst

排他的論理和命令です。各ビットごと、同じであれば0、違えば1となります。ですので、同じ値で排他的論理和を取ると0になります。

各ビットの結果
入力1入力2出力
000
011
101
110
命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
EOR #$nnImmediate$49, $nn226502
EOR $zzZeroPage$45, $zz246502
EOR $zz,XZeroPage with X$55, $zz246502
EOR $aabbAbsolute$4D, $bb, $aa356502
EOR $aabb,XAbsolute with X$5D, $bb, $aa356502
EOR $aabb,YAbsolute with Y$59, $bb, $aa356502
EOR ($zz)Indirect ZeroPage$52, $zz2765C02
EOR ($zz,X)Indirect with pre-indexed X$41, $zz276502
EOR ($zz),YIndirect with post-indexed Y$51, $zz276502
特記事項:Tflagが1の時、実行サイクルは+3される
Flags
フラグ名変化
N演算結果のbit7
V---
T0
D---
I---
Z演算結果全て0なら1、そうじゃなければ0
C---

INC ( INCrement dst )

Operationdst ← dst + 1

dst の内容を1足して dst に格納します。65C02で無事Aレジスタがdstになりました。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
INC AImplied$1A1265C02
INC $zzZeroPage$E6, $zz266502
INC $zz,XZeroPage with X$F6, $zz266502
INC $aabbAbsolute$EE, $bb, $aa376502
INC $aabb,XAbsolute with X$FE, $bb, $aa376502
Flags
フラグ名変化
N演算結果のbit7
V---
T0
D---
I---
Z演算結果が0なら1、そうじゃなければ0
C---

INX ( INcrement X )

OperationX ← X + 1

X レジスタの内容を1足します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
INXImplied$E8126502
Flags
フラグ名変化
N演算結果のbit7
V---
T0
D---
I---
Z演算結果が0なら1、そうじゃなければ0
C---

INY ( INcrement Y )

OperationY ← Y + 1

Y レジスタの内容を1足します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
INYImplied$C8126502
Flags
フラグ名変化
N演算結果のbit7
V---
T0
D---
I---
Z演算結果が0なら1、そうじゃなければ0
C---

JMP ( JuMP )

OperationPC ← dst

無条件に実行アドレスを指定されたアドレスへ変更します。65C02で増えた JMP ($aabb,X) は珠玉のジャンプテーブル命令です(自動でXを*2してくれるとよかったのに)。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
JMP $aabbAbsolute$4C, $bb, $aa346502
JMP ($aabb)Indirect$6C, $bb, $aa376502
JMP ($aabb,X)Indexed Indirect$7C, $bb, $aa3765C02
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

JSR ( Jump to SubRoutine )

Operation(Stack-1,+0) ← PC+2, Stack ← Stack - 2, PC ← dst

戻り番地-1(要注意:本命令のアドレス+"2"です。3ではありません。)をスタックに積んで指定したアドレスへジャンプします。ちなみに、割り込み発生時に積まれる戻りアドレスは-1されませんので、挙動が異なります。間違っても JSR で呼び出した先から戻る時、PHP/RTI で戻れると思わない方がよいです。…わざわざやる人もいないか。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
JSR $aabbAbsolute$20, $bb, $aa376502
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

LDA ( Load to A )

OperationA ← dst

dst を A レジスタに入れます。NegativeフラグとZeroフラグが動きますのでお気をつけください。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
LDA #$nnImmediate$A9, $nn226502
LDA $zzZeroPage$A5, $zz246502
LDA $zz,XZeroPage with X$B5, $zz246502
LDA $aabbAbsolute$AD, $bb, $aa356502
LDA $aabb,XAbsolute with X$BD, $bb, $aa356502
LDA $aabb,YAbsolute with Y$B9, $bb, $aa356502
LDA ($zz)Indirect ZeroPage$B2, $zz2765C02
LDA ($zz,X)Indirect with pre-indexed X$A1, $zz276502
LDA ($zz),YIndirect with post-indexed Y$B1, $zz276502
Flags
フラグ名変化
Ndstのbit7
V---
T0
D---
I---
Zdstが0なら1、そうじゃなければ0
C---

LDX ( Load to X )

OperationX ← dst

dst を X レジスタに入れます。NegativeフラグとZeroフラグが動きますのでお気をつけください。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
LDX #$nnImmediate$A2, $nn226502
LDX $zzZeroPage$A6, $zz246502
LDX $zz,YZeroPage with Y$B6, $zz246502
LDX $aabbAbsolute$AE, $bb, $aa356502
LDX $aabb,YAbsolute with Y$BE, $bb, $aa356502
Flags
フラグ名変化
Ndstのbit7
V---
T0
D---
I---
Zdstが0なら1、そうじゃなければ0
C---

LDY ( Load to Y )

OperationY ← dst

dst を Y レジスタに入れます。NegativeフラグとZeroフラグが動きますのでお気をつけください。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
LDY #$nnImmediate$A0, $nn226502
LDY $zzZeroPage$A4, $zz246502
LDY $zz,XZeroPage with X$B4, $zz246502
LDY $aabbAbsolute$AC, $bb, $aa356502
LDY $aabb,XAbsolute with X$BC, $bb, $aa356502
Flags
フラグ名変化
Ndstのbit7
V---
T0
D---
I---
Zdstが0なら1、そうじゃなければ0
C---

LSR ( Logical Shift to Right )

Operationdst ← dst >> 1

dst を 右へ1bit シフト(ex. bit7 → bit6)します。演算後のbit7には0が入ります。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
LSR AAccumulator$4A126502
LSR $zzZeroPage$46, $zz266502
LSR $zz,XZeroPage with X$56, $zz266502
LSR $aabbAbsolute$4E, $bb, $aa376502
LSR $aabb,XAbsolute with X$5E, $bb, $aa376502
Flags
フラグ名変化
N0
V---
T0
D---
I---
Zdstが0なら1、そうじゃなければ0
C0

NOP ( No OPeration )

Operation---

何もしません。…と言いたいところですが、実際にはTflagを0にします。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
NOPImplied$EA126502
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

ORA ( OR A )

OperationTflagが0の時A ← A or dst
Tflagが1の時($zz:X) ← ($zz:X) or dst

論理和命令です。各ビットごと、どちらも0の時に0、そのほかは1となります。

各ビットの結果
入力1入力2出力
000
011
101
111
命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
ORA #$nnImmediate$09, $nn226502
ORA $zzZeroPage$05, $zz246502
ORA $zz,XZeroPage with X$15, $zz246502
ORA $aabbAbsolute$0D, $bb, $aa356502
ORA $aabb,XAbsolute with X$1D, $bb, $aa356502
ORA $aabb,YAbsolute with Y$19, $bb, $aa356502
ORA ($zz)Indirect ZeroPage$12, $zz2765C02
ORA ($zz,X)Indirect with pre-indexed X$01, $zz276502
ORA ($zz),YIndirect with post-indexed Y$11, $zz276502
特記事項:Tflagが1の時、実行サイクルは+3される
Flags
フラグ名変化
N演算結果のbit7
V---
T0
D---
I---
Z演算結果全て0なら1、そうじゃなければ0
C---

PHA ( PusH A )

Operation(Stack) ← A, Stack ← Stack - 1

A レジスタの中身をスタックに積み上げます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
PHAImplied$48136502
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

PHP ( PusH P )

Operation(Stack) ← P, Stack ← Stack - 1

P レジスタ(フラグレジスタ/ステータスレジスタ)の中身をスタックに積み上げます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
PHPImplied$08136502
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

PHX ( PusH X )

Operation(Stack) ← X, Stack ← Stack - 1

X レジスタの中身をスタックに積み上げます。6502にはない命令ですのでご注意を。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
PHXImplied$DA1365C02
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

PHY ( PusH Y )

Operation(Stack) ← Y, Stack ← Stack - 1

Y レジスタの中身をスタックに積み上げます。6502にはない命令ですのでご注意を。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
PHYImplied$5A1365C02
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

PLA ( PulL A )

OperationStack ← Stack + 1, A ← (Stack)

スタックから A レジスタの中身を引き上げます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
PLAImplied$68146502
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

PLP ( PulL P )

OperationStack ← Stack + 1, P ← (Stack)

スタックから P レジスタ(フラグレジスタ/ステータスレジスタ)の中身を引き上げます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
PLPImplied$28146502
Flags
フラグ名変化
Ndst
Vdst
Tdst
Ddst
Idst
Zdst
Cdst

PLX ( PulL X )

OperationStack ← Stack + 1, X ← (Stack)

スタックから X レジスタの中身を引き上げます。6502にはない命令ですのでご注意を。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
PLXImplied$FA1465C02
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

PLY ( PulL Y )

OperationStack ← Stack + 1, Y ← (Stack)

スタックから Y レジスタの中身を引き上げます。6502にはない命令ですのでご注意を。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
PLYImplied$7A1465C02
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

RMBn ( Reset Memory Bit n )

Operation($zz).bit(n) ← 0

指定されたZeroPageの中身のビットを0にします。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
RMB0 $zzZeroPage$07, $zz2765C02
RMB1 $zzZeroPage$17, $zz2765C02
RMB2 $zzZeroPage$27, $zz2765C02
RMB3 $zzZeroPage$37, $zz2765C02
RMB4 $zzZeroPage$47, $zz2765C02
RMB5 $zzZeroPage$57, $zz2765C02
RMB6 $zzZeroPage$67, $zz2765C02
RMB7 $zzZeroPage$77, $zz2765C02
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

ROL ( ROtate to Left )

OperationCarry ← dst.bit7, dst ← dst << 1, dst.bit0 ← Carry

dst を Carryフラグを含めて左へ1bit シフトします。

rotate to left description.
命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
ROL AAccumulator$2A126502
ROL $zzZeroPage$26, $zz266502
ROL $zz,XZeroPage with X$36, $zz266502
ROL $aabbAbsolute$2E, $bb, $aa376502
ROL $aabb,XAbsolute with X$3E, $bb, $aa376502
Flags
フラグ名変化
N演算結果のbit7
V---
T0
D---
I---
Z演算結果が0なら1、そうじゃなければ0
Cdst.bit7

ROR ( ROtate to Right )

OperationCarry ← dst.bit0, dst ← dst >> 1, dst.bit7 ← Carry

dst を Carryフラグを含めて右へ1bit シフトします。

rotate to right description.
命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
ROR AAccumulator$6A126502
ROR $zzZeroPage$66, $zz266502
ROR $zz,XZeroPage with X$76, $zz266502
ROR $aabbAbsolute$6E, $bb, $aa376502
ROR $aabb,XAbsolute with X$7E, $bb, $aa376502
Flags
フラグ名変化
N演算結果のbit7
V---
T0
D---
I---
Z演算結果が0なら1、そうじゃなければ0
Cdst.bit0

RTI ( ReTurn from Interrupt )

OperationStack ← Stack + 1, P ← (Stack), Stack ← Stack + 2, PC ← (Stack-1,+0)

割り込み処理から通常処理へと復帰します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
RTIImplied$40176502
Flags
フラグ名変化
NStackから
VStackから
TStackから
DStackから
IStackから
ZStackから
CStackから

RTS ( ReTurn from Subroutine )

OperationStack ← Stack + 2, PC ← (Stack-1,+0)+1

JSR命令BSR命令で呼び出されたサブルーチンから復帰します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
RTSImplied$60176502
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

SAX ( Swap A and X )

OperationA ←→ X

AレジスタとXレジスタの内容を交換します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
SAXImplied$22136280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

SAY ( Swap A and Y )

OperationA ←→ Y

AレジスタとYレジスタの内容を交換します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
SAYImplied$42136280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

SBC ( SuBtract with Carry )

OperationTflagが0の時A ← A - dst - Carry
Tflagが1の時($zz:X) ← ($zz:X) - dst - Carry

減算命令です。6280(6502)にはCarryが付かない減算命令はありません。Carryフラグの動きに注意してください。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
SBC #$nnImmediate$E9, $nn226502
SBC $zzZeroPage$E5, $zz246502
SBC $zz,XZeroPage with X$F5, $zz246502
SBC $aabbAbsolute$ED, $bb, $aa356502
SBC $aabb,XAbsolute with X$FD, $bb, $aa356502
SBC $aabb,YAbsolute with Y$F9, $bb, $aa356502
SBC ($zz)Indirect ZeroPage$F2, $zz2765C02
SBC ($zz,X)Indirect with pre-indexed X$E1, $zz276502
SBC ($zz),YIndirect with post-indexed Y$F1, $zz276502
特記事項:Tflagが1の時、実行サイクルは+3される
Flags
フラグ名変化
N演算結果のbit7
VDflagが1であれば0固定。Dflagが0であれば、演算結果が2の補数としての範囲を超えたら1、そうじゃなければ0
T0
D---
I---
Z演算結果の8bit分が0なら1、そうじゃなければ0
C演算前の状態が、src≧(dst+Carry)であれば1、src<(dst+Carry)であれば0

SEC ( SEt Carry )

OperationCarry ← 1

Carryフラグを1にします。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
SECImplied$38126502
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C1

SED ( SEt Decimal )

OperationDecimal ← 1

Decimalフラグを1にします。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
SEDImplied$F8126502
Flags
フラグ名変化
N---
V---
T0
D1
I---
Z---
C---

SEI ( SEt Intruupt )

OperationInterrupt ← 1

Interrptフラグを1にして、この次の命令フェッチからNMI以外の割り込みを禁止します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
SEIImplied$78126502
Flags
フラグ名変化
N---
V---
T0
D---
I0
Z---
C---

SET ( SEt Tflag )

OperationT flag ← 1

T flagを1にします。実質的には、この命令はプレフィックス命令的な動作となります(大半の命令でT=0にしているため)。この命令の直後で動作が変化する命令は、ADC命令AND命令EOR命令ORA命令SBC命令の5つです。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
SETImplied$F4126280
Flags
フラグ名変化
N---
V---
T1
D---
I---
Z---
C---

SMBn ( Set Memory Bit n )

Operation($zz).bit(n) ← 1

指定されたZeroPageの中身のビットを1にします。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
SMB0 $zzZeroPage$87, $zz2765C02
SMB1 $zzZeroPage$97, $zz2765C02
SMB2 $zzZeroPage$A7, $zz2765C02
SMB3 $zzZeroPage$B7, $zz2765C02
SMB4 $zzZeroPage$C7, $zz2765C02
SMB5 $zzZeroPage$D7, $zz2765C02
SMB6 $zzZeroPage$E7, $zz2765C02
SMB7 $zzZeroPage$F7, $zz2765C02
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

ST0 ( STore vdp no.0 )

Operation($1FE000) ← $nn

VDP(HuC6270)のアドレスレジスタ(=物理アドレスの$1FE000)に値をセットします。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
ST0 #$nnImmediate$03, $nn256280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

ST1 ( STore vdp no.1 )

Operation($1FE002) ← $nn

VDP(HuC6270)のデータレジスタ下位8bit(=物理アドレスの$1FE002)に値をセットします。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
ST1 #$nnImmediate$13, $nn256280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

ST2 ( STore vdp no.2 )

Operation($1FE003) ← $nn

VDP(HuC6270)のデータレジスタ上位8bit(=物理アドレスの$1FE003)に値をセットします。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
ST2 #$nnImmediate$23, $nn256280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

STA ( STore to A )

Operationdst ← A

Aレジスタの内容をdstへ入れます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
STA $zzZeroPage$85, $zz246502
STA $zz,XZeroPage with X$95, $zz246502
STA $aabbAbsolute$8D, $bb, $aa356502
STA $aabb,XAbsolute with X$9D, $bb, $aa356502
STA $aabb,YAbsolute with Y$99, $bb, $aa356502
STA ($zz)Indirect ZeroPage$92, $zz2765C02
STA ($zz,X)Indirect with pre-indexed X$81, $zz276502
STA ($zz),YIndirect with post-indexed Y$91, $zz276502
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

STX ( STore to X )

Operationdst ← X

Xレジスタの内容をdstへ入れます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
STX $zzZeroPage$86, $zz246502
STX $zz,YZeroPage with Y$96, $zz246502
STX $aabbAbsolute$8E, $bb, $aa356502
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

STY ( STore to Y )

Operationdst ← Y

Yレジスタの内容をdstへ入れます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
STY $zzZeroPage$84, $zz246502
STY $zz,XZeroPage with X$94, $zz246502
STY $aabbAbsolute$8C, $bb, $aa356502
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

STZ ( STore Zero )

Operationdst ← 0

0をdstへ入れます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
STZ $zzZeroPage$64, $zz2465C02
STZ $zz,XZeroPage with X$74, $zz2465C02
STZ $aabbAbsolute$9C, $bb, $aa3565C02
STZ $aabb,XAbsolute with X$9E, $bb, $aa3565C02
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

SXY ( Swap X and Y )

OperationX ←→ Y

XレジスタとYレジスタの内容を交換します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
SXYImplied$02136280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

TAI ( Transfer Alternate Increment )

Operation

alt←0;
do {
v←($ssSS+alt);
($ddDD)←v;
$llLL←$llLL-1;
$ddDD←$ddDD+1;
alt←alt^1;
} while($llLL != 0);

ブロック転送命令です。ソース側がLow/Highの順に、ディスティネーション側が +1 しながら指定された$llLLバイト長分転送します。VDP(HuC6270)およびVCE(HuC6260)からの転送を想定したものです。また、メモリ内をある一定値で埋めるというケースでも大活躍です。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TAI $ssSS, $ddDD, $llLLBlock Transfer$F3, $SS, $ss, $DD, $dd, $LL, $ll717 + 6*$llLL6280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

TAM ( Transfer Accmulator to Mprs )

Operation

_b←0;
do {
if (#$nn & (1<<_b) != 0) MPR[_b]←A;
_b←_b+1;
} while(_b!=8);

MPRレジスタにAレジスタの内容を送ります。指定された値の各ビットに対応するレジスタに値がセットされます。

ビット対応レジスタ
bit0MPR0
bit1MPR1
bit2MPR2
bit3MPR3
bit4MPR4
bit5MPR5
bit6MPR6
bit7MPR7
命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TAM #$nnImmediate$53, $nn256280
特記事項:$nnが0であっても5cycle消費します。
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

TAX ( Transfer Accmulator to X )

OperationX←A

Aレジスタの内容をXレジスタに入れます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TAXImplied$AA126502
Flags
フラグ名変化
NAレジスタのbit7
V---
T0
D---
I---
ZAレジスタが0なら1、それ以外なら0
C---

TAY ( Transfer Accmulator to Y )

OperationY←A

Aレジスタの内容をYレジスタに入れます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TAYImplied$A8126502
Flags
フラグ名変化
NAレジスタのbit7
V---
T0
D---
I---
ZAレジスタが0なら1、それ以外なら0
C---

TDD ( Transfer Decrement Decrement )

Operation

do {
v←($ssSS);
($ddDD)←v;
$llLL←$llLL-1;
$ssSS←$ssSS-1;
$ddDD←$ddDD-1;
} while($llLL != 0);

ブロック転送命令です。ソース側、ディスティネーション側ともに -1 しながら指定された$llLLバイト長分転送します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TDD $ssSS, $ddDD, $llLLBlock Transfer$C3, $SS, $ss, $DD, $dd, $LL, $ll717 + 6*$llLL6280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

TIA ( Transfer Increment Alternate Increment )

Operation

alt←0;
do {
v←($ssSS);
($ddDD+alt)←v;
$llLL←$llLL-1;
$ssSS←$ssSS+1;
alt←alt^1;
} while($llLL != 0);

ブロック転送命令です。ソース側が +1 しながら、ディスティネーション側がLow/Highの順に、指定された$llLLバイト長分転送します。VDP(HuC6270)およびVCE(HuC6260)への転送を想定したものです。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TIA $ssSS, $ddDD, $llLLBlock Transfer$E3, $SS, $ss, $DD, $dd, $LL, $ll717 + 6*$llLL6280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

TII ( Transfer Increment Increment )

Operation

do {
v←($ssSS);
($ddDD)←v;
$llLL←$llLL-1;
$ssSS←$ssSS+1;
$ddDD←$ddDD+1;
} while($llLL != 0);

ブロック転送命令です。ソース側、ディスティネーション側ともに +1 しながら指定された$llLLバイト長分転送します。TDDを使うかTIIを使うかは、転送領域の重なり方で決めます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TII $ssSS, $ddDD, $llLLBlock Transfer$73, $SS, $ss, $DD, $dd, $LL, $ll717 + 6*$llLL6280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

TIN ( Transfer Increment None )

Operation

do {
v←($ssSS);
($ddDD)←v;
$llLL←$llLL-1;
$ssSS←$ssSS+1;
} while($llLL != 0);

ブロック転送命令です。ソース側は+1しながら、ディスティネーション側は変化せず指定された$llLLバイト長分転送します。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TIN $ssSS, $ddDD, $llLLBlock Transfer$D3, $SS, $ss, $DD, $dd, $LL, $ll717 + 6*$llLL6280
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

TMA ( Transfer Mprs to Accmulator )

Operation

_b←0;
do {
if (#$nn & (1<<_b) != 0) A←MPR[_b];
_b←_b+1;
} while(_b!=8);

AレジスタにMPRレジスタの内容を送ります。指定された値の各ビットに対応するレジスタに値がセットされます。複数のビットが1である場合は動作は未定義になるそうです。

ビット対応レジスタ
bit0MPR0
bit1MPR1
bit2MPR2
bit3MPR3
bit4MPR4
bit5MPR5
bit6MPR6
bit7MPR7
命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TMA #$nnImmediate$43, $nn246280
特記事項:$nnが0であっても4cycle消費します。
Flags
フラグ名変化
N---
V---
T0
D---
I---
Z---
C---

TRB ( Test and Reset Bit )

Operationdst←dst and not(A)

Aレジスタの反転値とdstをandしてdstに保存します。要するに、Aレジスタの立っているビットに対応するdstのビットを0にします。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TRB $zzZeroPage$14, $zz2665C02
TRB $aabbAbsolute$1C, $bb, $aa3765C02
Flags
フラグ名変化
Ndst.bit7
Vdst.bit6
T0
D---
I---
Zdstが0なら1、それ以外なら0
C---

TSB ( Test and Set Bit )

Operationdst←dst or A

Aレジスタとdstをorしてdstに保存します。要するに、Aレジスタの立っているビットに対応するdstのビットを1にします。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TSB $zzZeroPage$04, $zz2665C02
TSB $aabbAbsolute$0C, $bb, $aa3765C02
Flags
フラグ名変化
Ndst.bit7
Vdst.bit6
T0
D---
I---
Zdstが0なら1、それ以外なら0
C---

TST ( Test )

OperationNegative, oVerflow←$nn and dst

$nn と dst の論理積をとり、結果のbit7がNegativeフラグへ、bit6がoVerflowフラグにセットされます。演算結果は保存されません。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TST #$nn, $zzImmediate, ZeroPage$83, $nn, $zz376280
TST #$nn, $zz, XImmediate, ZeroPage with X$A3, $nn, $zz376280
TST #$nn, $aabbImmediate, Absolute$93, $nn, $bb, $aa486280
TST #$nn, $aabb, XImmediate, Absolute with X$B3, $nn, $bb, $aa486280
Flags
フラグ名変化
Ndst.bit7
Vdst.bit6
T0
D---
I---
Zdstが0なら1、それ以外なら0
C---

TSX ( Transfer Stack to X )

OperationX←S

スタックレジスタの内容をXレジスタに入れます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TSXImplied$BA126502
Flags
フラグ名変化
Ndst.bit7
V---
T0
D---
I---
Zdstが0なら1、それ以外なら0
C---

TXA ( Transfer X to A )

OperationA←X

Xレジスタの内容をAレジスタに入れます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TXAImplied$8A126502
Flags
フラグ名変化
Ndst.bit7
V---
T0
D---
I---
Zdstが0なら1、それ以外なら0
C---

TXS ( Transfer X to Stack )

OperationS←X

Xレジスタの内容をスタックレジスタに入れます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TXSImplied$9A126502
Flags
フラグ名変化
Ndst.bit7
V---
T0
D---
I---
Zdstが0なら1、それ以外なら0
C---

TYA ( Transfer Y to A )

OperationA←Y

Yレジスタの内容をAレジスタに入れます。

命令一覧
SyntaxAddressingModeOpcodebyte lengthcyclesどのCPUから?
TYAImplied$98126502
Flags
フラグ名変化
Ndst.bit7
V---
T0
D---
I---
Zdstが0なら1、それ以外なら0
C---