6502

レジスタ

名前サイズ説明
A 8bit アキュムレータ
X 8bit インデックスX
Y 8bit インデックスY
S 8bit スタックポインタ※1
P 8bit ステータス
PC 16bit プログラムカウンタ
※1スタック領域 0x0100 - 0x01ff のポインタ

1. ステータスレジスタ

76543210
NV1BDIZC
Nネガティブフラグ
1演算結果の最上位ビットが1
0上記以外
Vオーバーフローフラグ
1演算結果が符号ありの最大範囲(-128 - 127)を超えた
0上記以外
11固定
Bブレークモードフラグ
1BRK命令実行
0上記以外
Dデシマルモードフラグ※1
1加算・減算をBCDで行う
0上記以外
I割り込み禁止フラグ
1割り込み禁止
0割り込み許可
Zゼロフラグ
1演算結果、またはロード時の値が0
0上記以外
Cキャリーフラグ
1加算命令実行時:演算結果が255を超えた(キャリーあり)
減算命令実行時:演算結果が0を下回らない(ボローなし)
0上記以外

※1 RP2A03はBCDモードが存在しないため、Dフラグを無視する(セット・クリアは可能)



命令一覧表

記号の説明

1. サイズ欄

Bオペランドサイズが8ビット

2. ニーモニック欄

# 8/16/32ビットの即値データ
#8 ゼロページアドレス(0x00-0xff)
#8,X ゼロページアドレス(0x00-0xff + X)
#8,Y ゼロページアドレス(0x00-0xff + Y)
#16 絶対アドレス(0x0000-0xffff)
#16,X 絶対アドレス(0x0000-0xffff + X)※1
#16,Y 絶対アドレス(0x0000-0xffff + Y)※1
(#8,X)間接アドレス(ゼロページ(0x00-0xff + X)の指すアドレス)
(#8),Y間接アドレス(ゼロページ(0x00-0xff)の指すアドレス + Y)※1
$ その命令が置かれている先頭アドレス
※1命令により、ページ(256バイト)をまたぐアドレスを指定した場合、+1ステート

3. フラグ欄(NVRBDIZC)

-変化なし
*命令の実行により変化
00にクリア
11をセット

4. ステート欄

1ステート1クロック
(+1) 1ページをまたぐ時に+1ステート

命令

(1) 転送
命令群サイズニーモニック機能 NVRBDIZC命令長ステート補足
LDA B LDA # A ← # *-----*-2 2
B LDA #8 A ← (#8) *-----*-2 3
B LDA #8,X A ← (#8+X) *-----*-2 4
B LDA #16 A ← (#16) *-----*-3 4
B LDA #16,X A ← (#16+X) *-----*-3 4(+1)
B LDA #16,Y A ← (#16+Y) *-----*-3 4(+1)
B LDA (#8,X) A ← ((#8+X)) *-----*-2 6
B LDA (#8),Y A ← ((#8)+Y) *-----*-2 5(+1)
LDX B LDX # X ← # *-----*-2 2
B LDX #8 X ← (#8) *-----*-2 3
B LDX #8,Y X ← (#8+Y) *-----*-2 4
B LDX #16 X ← (#16) *-----*-3 4
B LDX #16,Y X ← (#16+Y) *-----*-3 4(+1)
LDY B LDY # Y ← # *-----*-2 2
B LDY #8 Y ← (#8) *-----*-2 3
B LDY #8,X Y ← (#8+X) *-----*-2 4
B LDY #16 Y ← (#16) *-----*-3 4
B LDY #16,X Y ← (#16+X) *-----*-3 4(+1)
STA B STA #8 (#8) ← A --------2 3
B STA #8,X (#8+X) ← A --------2 4
B STA #16 (#16) ← A --------3 4
B STA #16,X (#16+X) ← A --------3 5
B STA #16,Y (#16+Y) ← A --------3 5
B STA (#8,X) ((#8+X)) ← A --------2 6
B STA (#8),Y ((#8)+Y) ← A --------2 6
STX B STX #8 (#8) ← X --------2 3
B STX #8,Y (#8+Y) ← X --------2 4
B STX #16 (#16) ← X --------3 4
STY B STY #8 (#8) ← Y --------2 3
B STY #8,X (#8+X) ← Y --------2 4
B STY #16 (#16) ← Y --------3 4
TAX B TAX X ← A *-----*-1 2
TXA B TXA A ← X *-----*-1 2
TAY B TAY Y ← A *-----*-1 2
TYA B TYA A ← Y *-----*-1 2
TSX B TSX X ← S *-----*-1 2
TXS B TXS S ← X *-----*-1 2
PHA B PHA (SP) ← A
SP ← SP - 1
--------1 3
PHP B PHP (SP) ← P
SP ← SP - 1
--------1 3
PLA B PLA SP ← SP + 1
A ← (SP)
*-----*-1 4
PLP B PLP SP ← SP + 1
P ← (SP)
********1 4

(2) 算術演算
命令群サイズニーモニック機能 NVRBDIZC命令長ステート補足
ADC B ADC # A ← A + # + C **----**2 2
B ADC #8 A ← A + (#8) + C **----**2 3
B ADC #8,X A ← A + (#8+X) + C **----**2 4
B ADC #16 A ← A + (#16) + C **----**3 4
B ADC #16,X A ← A + (#16+X) + C **----**3 4(+1)
B ADC #16,Y A ← A + (#16+Y) + C **----**3 4(+1)
B ADC (#8,X) A ← A + ((#8+X)) + C **----**2 6
B ADC (#8),Y A ← A + ((#8)+Y) + C **----**2 5(+1)
SBC B SBC # A ← A - # - (1-C) **----**2 2
B SBC #8 A ← A - (#8) - (1-C) **----**2 3
B SBC #8,X A ← A - (#8+X) - (1-C) **----**2 4
B SBC #16 A ← A - (#16) - (1-C) **----**3 4
B SBC #16,X A ← A - (#16+X) - (1-C) **----**3 4(+1)
B SBC #16,Y A ← A - (#16+Y) - (1-C) **----**3 4(+1)
B SBC (#8,X) A ← A - ((#8+X)) - (1-C) **----**2 6
B SBC (#8),Y A ← A - ((#8)+Y) - (1-C) **----**2 5(+1)
CMP B CMP # A - # *-----**2 2
B CMP #8 A - (#8) *-----**2 3
B CMP #8,X A - (#8+X) *-----**2 4
B CMP #16 A - (#16) *-----**3 4
B CMP #16,X A - (#16+X) *-----**3 4(+1)
B CMP #16,Y A - (#16+Y) *-----**3 4(+1)
B CMP (#8,X) A - ((#8+X)) *-----**2 6
B CMP (#8),Y A - ((#8)+Y) *-----**2 5(+1)
CPX B CPX # X - # *-----**2 2
B CPX #8 X - (#8) *-----**2 3
B CPX #16 X - (#16) *-----**3 4
CPY B CPY # Y - # *-----**2 2
B CPY #8 Y - (#8) *-----**2 3
B CPY #16 Y - (#16) *-----**3 4
INC B INC #8 (#8) ← (#8) + 1 *-----*-2 5
B INC #8,X (#8+X) ← (#8+X) + 1 *-----*-2 6
B INC #16 (#16) ← (#16) + 1 *-----*-3 6
B INC #16,X (#16+X) ← (#16+X) + 1 *-----*-3 7
INX B INX X ← X + 1 *-----*-1 2
INY B INY Y ← Y + 1 *-----*-1 2
DEC B DEC #8 (#8) ← (#8) - 1 *-----*-2 5
B DEC #8,X (#8+X) ← (#8+X) - 1 *-----*-2 6
B DEC #16 (#16) ← (#16) -+ 1 *-----*-3 6
B DEC #16,X (#16+X) ← (#16+X) - 1 *-----*-3 7
DEX B DEX X ← X - 1 *-----*-1 2
DEY B DEY Y ← Y - 1 *-----*-1 2

(3) 論理演算
命令群サイズニーモニック機能 NVRBDIZC命令長ステート補足
AND B AND # A ← A and # *-----*-2 2
B AND #8 A ← A and (#8) *-----*-2 3
B AND #8,X A ← A and (#8+X) *-----*-2 4
B AND #16 A ← A and (#16) *-----*-3 4
B AND #16,X A ← A and (#16+X) *-----*-3 4(+1)
B AND #16,Y A ← A and (#16+Y) *-----*-3 4(+1)
B AND (#8,X) A ← A and ((#8+X)) *-----*-2 6
B AND (#8),Y A ← A and ((#8)+Y) *-----*-2 5(+1)
ORA B ORA # A ← A or # *-----*-2 2
B ORA #8 A ← A or (#8) *-----*-2 3
B ORA #8,X A ← A or (#8+X) *-----*-2 4
B ORA #16 A ← A or (#16) *-----*-3 4
B ORA #16,X A ← A or (#16+X) *-----*-3 4(+1)
B ORA #16,Y A ← A or (#16+Y) *-----*-3 4(+1)
B ORA (#8,X) A ← A or ((#8+X)) *-----*-2 6
B ORA (#8),Y A ← A or ((#8)+Y) *-----*-2 5(+1)
EOR B EOR # A ← A or # *-----*-2 2
B EOR #8 A ← A xor (#8) *-----*-2 3
B EOR #8,X A ← A xor (#8+X) *-----*-2 4
B EOR #16 A ← A xor (#16) *-----*-3 4
B EOR #16,X A ← A xor (#16+X) *-----*-3 4(+1)
B EOR #16,Y A ← A xor (#16+Y) *-----*-3 4(+1)
B EOR (#8,X) A ← A xor ((#8+X)) *-----*-2 6
B EOR (#8),Y A ← A xor ((#8)+Y) *-----*-2 5(+1)
AAX B AAX #8 (#8) ← X and A *-----*-2 3
B AAX #8,Y (#8,Y) ← X and A *-----*-2 4
B AAX #16 (#16) ← X and A *-----*-3 4
B AAX (#8,X) ((#8+X)) ← X and A *-----*-2 6
SXA B SXA #16,Y (#16,X) ← Y and [#16,X/256+1] --------3 5
SYA B SYA #16,X (#16,Y) ← X and [#16,Y/256+1] --------3 5

(4) ジャンプ・コール・リターン
命令群サイズニーモニック機能 NVRBDIZC命令長ステート補足
JMP - JMP #16 PC ← #16 --------3 3
- JMP (#16) PC ← (#16) --------3 5
BEQ - BEQ $+2+d if Z=1 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
BNE - BNE $+2+d if Z=0 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
BCS - BCS $+2+d if C=1 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
BCC - BCC $+2+d if C=0 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
BMI - BMI $+2+d if M=1 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
BPL - BPL $+2+d if M=0 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
BVS - BVS $+2+d if V=1 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
BVC - BVC $+2+d if V=0 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
JSR - JSR #16 PUSH $+2
PC ← #16
--------3 6
RTS - RTS PC ← POP + 1 --------1 6
RTI - RTI PSR ← POP
PC ← POP
********1 6
BRK - BRK PUSH $+1
PUSH PSR
PSR ← PSR or B
PC ← (0xfffe)
---1----1 7

(5) ローテイト・シフト
命令群サイズニーモニック機能 NVRBDIZC命令長ステート補足
ASL B ASL A asl *-----**1 2
B ASL #8 *-----**2 5
B ASL #8,X *-----**2 6
B ASL #16 *-----**3 6
B ASL #16,X *-----**3 7
LSR B LSR A lsr *-----**1 2
B LSR #8 *-----**2 5
B LSR #8,X *-----**2 6
B LSR #16 *-----**3 6
B LSR #16,X *-----**3 7
ROL B ROL A rol *-----**1 2
B ROL #8 *-----**2 5
B ROL #8,X *-----**2 6
B ROL #16 *-----**3 6
B ROL #16,X *-----**3 7
ROR B ROR A ror *-----**1 2
B ROR #8 *-----**2 5
B ROR #8,X *-----**2 6
B ROR #16 *-----**3 6
B ROR #16,X *-----**3 7
RLA B RLA #8 *-----**2 5
B RLA #8,X *-----**2 6
B RLA #16 *-----**3 6
B RLA #16,X *-----**3 7
B RLA #16,Y *-----**3 7
B RLA (#8,X) *-----**2 8
B RLA (#8),Y *-----**2 8
SLO B SLO #8 **----**2 5
B SLO #8,X **----**2 6
B SLO #16 **----**3 6
B SLO #16,X **----**3 7
B SLO #16,Y **----**3 7
B SLO (#8,X) **----**2 8
B SLO (#8),Y **----**2 8

(6) ビット操作
命令群サイズニーモニック機能 NVRBDIZC命令長ステート補足
BIT B BIT #8 if [A and (#8)]=0 then Z ← 1
else Z ← 0
**----*-2 3
B BIT #16 if [A and (#16)]=0 then Z ← 1
else Z ← 0
**----*-3 4
SEC - SEC C ← 1 -------11 2
CLC - CLC C ← 0 -------01 2
SEI - SEI I ← 1 -----1--1 2
CLI - CLI I ← 0 -----0--1 2
SED - SED D ← 1 ----1---1 2
CLD - CLD D ← 0 ----0---1 2
SEV - SEV V ← 1 -1------1 2
CLV - CLV V ← 0 -0------1 2

(7) 特殊演算・CPU制御
命令群サイズニーモニック機能 NVRBDIZC命令長ステート補足
NOP - NOP 何もしない --------1 2
DOP - DOP # 何もしない --------2 2
- DOP #8 --------2 3
- DOP #8,X --------2 4
TOP - TOP #16 何もしない --------3 4
- TOP #16,X --------3 4(+1)
KIL B KILL --------1 -
AAC B AAC # *-----**2 2
ARR B ARR # **----**2 2
ASR B ASR # *-----**2 2
ATX B ATX # *-----*-2 2
AXA B AXA #16,Y --------3 5
B AXA (#8),Y --------2 6
AXS B AXS # *-----**2 2
LAR B LAR #16,Y *-----*-3 4
XAA B XAA # --------2 2
XAS B XAS #16,Y --------3 5
DCP B DCP #8 -------*2 5
B DCP #8,X -------*2 6
B DCP #16 -------*3 6
B DCP #16,X -------*3 7
B DCP #16,Y -------*3 7
B DCP (#8,X) -------*2 8
B DCP (#8),Y -------*2 8
ISC B ISC #8 **----**2 5
B ISC #8,X **----**2 6
B ISC #16 **----**3 6
B ISC #16,X (#16,X) ← (#16,X) + 1
A ← A - (#16,X) - (1-C)
**----**3 7
B ISC #16,Y **----**3 7
B ISC (#8,X) **----**2 8
B ISC (#8),Y **----**2 8
LAX B LAX #8 A ← X ← (#8) *-----*-2 3
B LAX #8,Y A ← X ← (#8+Y) *-----*-2 4
B LAX #16 A ← X ← (#16) *-----*-3 4
B LAX #16,Y A ← X ← (#16+Y)< *-----*-3 4 (+1)
B LAX (#8,X) A ← X ← ((#8+X)) *-----*-2 6
B LAX (#8),Y A ← X ← ((#8)+Y) *-----*-2 5 (+1)
RRA B RRA #8 **----**2 5
B RRA #8,X **----**2 6
B RRA #16 **----**3 6
B RRA #16,X **----**3 7
B RRA #16,Y **----**3 7
B RRA (#8,X) **----**2 8
B RRA (#8),Y **----**2 8
SRE B SRE #8 *-----**2 5
B SRE #8,X *-----**2 6
B SRE #16 *-----**3 6
B SRE #16,X *-----**3 7
B SRE #16,Y *-----**3 7
B SRE (#8,X) *-----**2 8
B SRE (#8),Y *-----**2 8


命令コードマップ

色の説明

1. 文字・背景色

実装済み
未実装
未定義命令
未定義命令・未定義

命令コード

H/L 0 1 2 3 4 5 6 7 8 9 A B C D E F
0 BRK ORA
(#8,X)
KIL SLO
(#8,X)
DOP
#8
ORA
#8
ASL
#8
SLO
#8
PHP ORA
#
ASL
A
AAC
#
TOP
#16
ORA
#16
ASL
#16
SLO
#16
1 BPL
$+2+d
ORA
(#8),Y
KIL SLO
(#8),Y
DOP
#8,X
ORA
#8,X
ASL
#8,X
SLO
#8,X
CLC ORA
#16,Y
NOP SLO
#16,Y
TOP
#16,X
ORA
#16,X
ASL
#16,X
SLO
#16,X
2 JSR
#16
AND
(#8,X)
KIL RLA
(#8,X)
BIT
#8
AND
#8
ROL
#8
RLA
#8
PLP AND
#
ROL
A
AAC
#
BIT
#16
AND
#16
ROL
#16
RLA
#16
3 BMI
$+2+d
AND
(#8),Y
KIL RLA
(#8),Y
DOP
#8,X
AND
#8,X
ROL
#8,X
RLA
#8,X
SEC AND
#16,Y
NOP RLA
#16,Y
TOP
#16,X
AND
#16,X
ROL
#16,X
RLA
#16,X
4 RTI EOR
(#8,X)
KIL SRE
(#8,X)
DCP
#8
EOR
#8
LSR
#8
SRE
#8
PHA EOR
#
LSR
A
ASR
#
JMP
#16
EOR
#16
LSR
#16
SRE
#16
5 BVC
$+2+d
EOR
(#8),Y
KIL SRE
(#8),Y
DOP
#8,X
EOR
#8,X
LSR
#8,X
SRE
#8,X
CLI EOR
#16,Y
NOP SRE
#16,Y
TOP
#16,X
EOR
#16,X
LSR
#16,X
SRE
#16,X
6 RTS ADC
(#8,X)
KIL RRA
(#8,X)
DOP
#8
ADC
#8
ROR
#8
RRA
#8
PLA ADC
#
ROR
A
ARR
#
JMP
(#16)
ADC
#16
ROR
#16
RRA
#16
7 BVS
$+2+d
ADC
(#8),Y
KIL RRA
(#8),Y
DOP
#8,X
ADC
#8,X
ROR
#8,X
RRA
#8,X
SEI ADC
#16,Y
NOP RRA
#16,Y
TOP
#16,X
ADC
#16,X
ROR
#16,X
RRA
#16,X
8 DOP
#
STA
(#8,X)
DOP
#
AAX
(#8,X)
STY
#8
STA
#8
STX
#8
AAX
#8
DEY DOP
#
TXA XAA
#
STY
#16
STA
#16
STX
#16
AAX
#16
9 BCC
$+2+d
STA
(#8),Y
KIL AXA
(#8),Y
STY
#8,X
STA
#8,X
STX
#8,Y
AAX
#8,Y
TYA STA
#16,Y
TXS XAS
#16,Y
SYA
#16,X
STA
#16,X
SXA
#16,X
AXA
#16,Y
A LDY
#
LDA
(#8,X)
LDX
#
LAX
(#8,X)
LDY
#8
LDA
#8
LDX
#8
LAX
#8
TAY LDA
#
TAX ATX
#
LDY
#16
LDA
#16
LDX
#16
LAX
#16
B BCS
$+2+d
LDA
(#8),Y
KIL LAX
(#8),Y
LDY
#8,X
LDA
#8,X
LDX
#8,Y
LAX
#8,Y
CLV LDA
#16,Y
TSX LAR
#16,Y
LDY
#16,X
LDA
#16,X
LDX
#16,Y
LAX
#16,Y
C CPY
#
CMP
(#8,X)
DOP
#
DCP
(#8,X)
CPY
#8
CMP
#8
DEC
#
DCP
#8
INY CMP
#
DEX AXS
#
CPY
#16
CMP
#16
DEC
#16
DCP
#16
D BNE
$+2+d
CMP
(#8),Y
KIL DCP
(#8),Y
DOP
#8,X
CMP
#8,X
DEC
#8,X
DCP
#8,X
CLD CMP
#16,Y
NOP DCP
#16,Y
TOP
#16,X
CMP
#16,X
DEC
#16,X
DCP
#16,X
E CPX
#
SBC
(#8,X)
DOP
#
ISC
(#8,X)
CPX
#8
SBC
#8
INC
#8
ISC
#8
INX SBC
#
NOP SBC
#
CPX
#16
SBC
#16
INC
#16
ISC
#16
F BEQ
$+2+d
SBC
(#8),Y
KIL ISC
(#8),Y
DOP
#8,X
SBC
#8,X
INC
#8,X
ISC
#8,X
SED SBC
#16,Y
NOP ISC
#16,Y
TOP
#16,X
SBC
#16,X
INC
#16,X
ISC
#16,X


アセンブラ仕様

HVC-001モジュールに、NESASMと互換性(一部疑似命令が未対応)のあるアセンブラを内蔵しています。
ソースファイル(ASM)を読み込むことで、デバッガからソースレベルのデバッグが可能になります。

以下の機能をサポートします。




アドレッシングモードの指定方法

ゼロページアドレス<
絶対アドレス
間接アドレス

疑似命令

疑似命令 引数説明
.EQU =と同じ
.INESPRG バンク数 プログラムROMのバンク数
.INESCHR バンク数 キャラクターROMのバンク数
.INESMIR フラグ ミラーフラグ
.INESMAP 番号 マッパー番号
.INESF6 ファイルヘッダーの6バイト目を指定
.FILE .nesファイルを出力する
.NOFILE .nesファイルを出力しない
.BANK バンク番号,[バンク跨ぎフラグ] 開始バンク番号
.ORG アドレス 開始アドレス
.ALIGN 2-256 アラインメントを揃える
.MACRO マクロ定義
.ENDM マクロ定義終了
.FUNC 関数内容
.FAIL
.ZP ゼロページセクション
.BSS BSSセクション
.CODE コードセクション
.DATA データセクション
.DB 定義データの配列 1バイトデータを定義
.DW 定義データの配列 2バイトデータを定義
.BYTE .DBと同じ
.WORD .DWと同じ
.DS 確保数 指定バイト数の領域を確保
.RSSET
.RS 確保数
.INCBIN "ファイル名" バイナリファイルをインクルード
.INCLUDE "ファイル名" 別ソースファイルをインクルード
.INCBMP"ファイル名", [8/16]ビットマップファイルをCHRへ変換して読み込む。
引数を指定しない、または8を指定した時は8x8、引数に16を指定した時は8x16
.IF 条件式
.IFDEF シンボル名
.IFNDEF シンボル名
.ELSE
.ELIF 条件式
.ENDIF
※1赤字の疑似命令は、NESASMには存在しない

定義済みシンボル名

シンボル名 説明
__VDMOD_VER__()バージョン
ARG_NONE
ARG_REG
ARG_IMMEDIATE
ARG_ABSOLUTE
ARG_INDIRECT
ARG_STRING
ARG_LABEL

関数

関数名 引数 説明
HIGH() 値の上位8ビットを取得
LOW() 値の下位8ビットを取得
BANK() シンボル指定シンボルのあるバンク番号を取得
PAGE() シンボル指定シンボルのあるページ番号を取得
DEFINED()シンボルシンボルが定義されている時は1、未定義時は0を返す

特殊ラベル

名前 説明
@@ファイル内でのみ有効なローカルラベル
@F1つ前のローカルラベル
@B1つ先のローカルラベル
$ 命令のあるアドレス

現在サポートしていない疑似命令

疑似命令 補足
.LIST
.NOLIST
.MLIST
.NOMLIST
.DEFCHR
.INCCHR .INCBMPをサポートしたのでサポートしない

例).ZP/.BSSで宣言したラベルを、デバッガ上のローカルへ表示する方法

.ZP/.BSSセクションで定義したラベル名の後に、':'を付けていないものが対象となります。

        .ZP                     ; ゼロページ
A       .DS     1
B       .DS     2
C:      .DS     1               ; ラベルの後に':'が付いているので表示されない

        .BSS                    ; RAM
D       .DS     1
E:      .DS     1               ; ラベルの後に':'が付いているので表示されない
F       .DS     1

例)バックアップを有効にする

        .IFDEF	__VDMOD_VER__           ; NESASM からアセンブルした時は無視するよう、IF/ENDIFで囲む
                .INESF6 %00000010       ; バックアップ有効
        .ENDIF