目次


アーキテクチャ

レジスタ一覧

6502のレジスタはほとんどが8bitとなっています。6502のアドレス空間は16bitですが、インデックスレジスタは8bitとなっています。これは気楽に連続アクセス出来るテーブルのサイズは256バイトと言う意味になり、実際256バイト以上の大きな配列を扱うのは少々コーディングが面倒になります。

また、スタックポインタについても8bitとなっていて、実際に参照されるスタックアドレスは【0x0100 + S】となっています。つまり、0x0100~0x01FFが無条件でスタック領域となります。スタックが256byteしかないと言うのはちょっと怖い気もするのですが…。

名称 サイズ 解説
A 8bit アキュームレータ
X 8bit インデックスレジスタ
Y 8bit インデックスレジスタ
S 8bit スタックポインタ
P 8bit ステータスレジスタ
PC 16bit プログラムカウンタ

ステータスレジスタの詳細

ステータスレジスタは8bitのレジスタで、次のようになっています。また、以降ステータスレジスタの任意のフラグを指定する時にはP[フラグ名]と表記します。例えばゼロフラグを表現する時はP[Z]となります。

位置 名称 詳細名 内容
bit7 N ネガティブ Aのbit7が1の時にセット
bit6 V オーバーフロー 演算結果がオーバーフローを起こした時にセット
bit5 R 予約済み 常にセットされている
bit4 B ブレークモード BRK発生時にセット、IRQ発生時にクリア
bit3 D デシマルモード 0:デフォルト、1:BCDモード (ファミコンでは未実装)
bit2 I IRQ禁止 0:IRQ許可、1:IRQ禁止
bit1 Z ゼロ 演算結果が0の時にセット
bit0 C キャリー キャリー発生時にセット

割り込み

6502の割り込みはRESET・NMI・IRQ・BRKの4種類ですが、そのうちIRQとBRKについては同じ割り込みベクタを共有しています。その為この2種類の割り込みに関しては、割り込みルーチン内でIRQかBRKかをP[B]がセットされているかどうかをチェックしなければなりません。P[B]の値がは、IRQ割り込みの場合はクリアされBRK割り込みの場合はセットされます。

割り込みベクタと割り込み時の動きについては次のようになります。

名称 ベクタ 発生条件 変化するレジスタ
NMI 0xFFFA ハードウェア特殊信号 P[I]=1, P[B]=0
RESET 0xFFFC 電源投入時、リセット時 P[I]=1
IRQ/BRK 0xFFFE ハードウェア信号/BRK命令 P[I]=1, P[B]=0/1

アドレッシングモード

6502のアドレッシングモードを紹介します。IM8は8bit値、IM16は16bit値を意味します。【N】は「アドレスN」と言う意味になります。6502アセンブラは、大抵16進数を表記する際に数字の頭に"$"を付けて"$2e"のように書く事が多いです。また、ゼロページ用の記号等も多くの場合"<"等の記号が必要なことが多いですが、処理系によって異なるので詳細はアセンブラのマニュアルを参照してください。

名称 表記例 動作
Implied TAX AをXにコピー
Accumulator LSR A Aを左に1bitシフト
Immediate LDA #IM8 即値IM8をAにロード
Zeropage LDA IM8 【IM8】の8bit値をAにロード
Zeropage, X LDA IM8, X 【IM8 + X】の8bit値をAにロード
Zeropage, Y LDA IM8, Y 【IM8 + Y】の8bit値をAにロード
Relative BEQ IM8 P[Z]がセットの時【PC + IM8】へジャンプ
Absolute LDA IM16 【IM16】の8bit値をAにロード
Absolute, X LDA IM16, X 【IM16 + X】の8bit値をAにロード
Absolute, Y LDA IM16, Y 【IM16 + Y】の8bit値をAにロード
Indirect JMP (IM16) 【【IM16】の16bit値】へジャンプ
(Indirect, X) LDA (IM8, X) 【【IM8 + X】の16bit値】の8bit値をAにロード
(Indirect), Y LDA (IM8), Y 【【IM8】の16bit値 + Y】の8bit値をAにロード

コピー命令

LDA

メモリからAにロードします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Immediate 0xA9 2 2
Zeropage 0xA5 2 3
Zeropage, X 0xB5 2 4
Absolute 0xAD 3 4
Absolute, X 0xBD 3 4
Absolute, Y 0xB9 3 4
(Indirect, X) 0xA1 2 6
(Indirect), Y 0xB1 2 5

LDX

メモリからXにロードします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Immediate 0xA2 2 2
Zeropage 0xA6 2 3
Zeropage, Y 0xB6 2 4
Absolute 0xAE 3 4
Absolute, Y 0xBE 3 4

LDY

メモリからYにロードします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Immediate 0xA0 2 2
Zeropage 0xA4 2 3
Zeropage, X 0xB4 2 4
Absolute 0xAC 3 4
Absolute, X 0xBC 3 4

STA

Aからメモリにストアします。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Zeropage 0x85 2 3
Zeropage, X 0x95 2 4
Absolute 0x8D 3 4
Absolute, X 0x9D 3 5
Absolute, Y 0x99 3 5
(Indirect, X) 0x81 2 6
(Indirect), Y 0x91 2 6

STX

Xからメモリにストアします。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Zeropage 0x86 2 3
Zeropage, Y 0x96 2 4
Absolute 0x8E 3 4

STY

Yからメモリにストアします。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Zeropage 0x84 2 3
Zeropage, X 0x94 2 4
Absolute 0x8C 3 4

TAX

AをXへコピーします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Implied 0xAA 1 2

TAY

AをYへコピーします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Implied 0xA8 1 2

TSX

SをXへコピーします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Implied 0xBA 1 2

TXA

XをAへコピーします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Implied 0x8A 1 2

TXS

XをSへコピーします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Implied 0x9A 1 2

TYA

YをAへコピーします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Implied 0x98 1 2

演算命令

ADC

(A + メモリ + キャリーフラグ) を演算して結果をAへ返します。[N:V:0:0:0:0:Z:C]

アドレッシングモード コード バイト数 サイクル
Immediate 0x69 2 2
Zeropage 0x65 2 3
Zeropage, X 0x75 2 4
Absolute 0x6D 3 4
Absolute, X 0x7D 3 4
Absolute, Y 0x79 3 4
(Indirect, X) 0x61 2 6
(Indirect), Y 0x71 2 5

AND

Aとメモリを論理AND演算して結果をAへ返します。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Immediate 0x29 2 2
Zeropage 0x25 2 3
Zeropage, X 0x35 2 4
Absolute 0x2D 3 4
Absolute, X 0x3D 3 4
Absolute, Y 0x39 3 4
(Indirect, X) 0x21 2 6
(Indirect), Y 0x31 2 5

ASL

Aまたはメモリを左へシフトします。[N:0:0:0:0:0:Z:C]

アドレッシングモード コード バイト数 サイクル
Accumulator 0x0A 1 2
Zeropage 0x06 2 5
Zeropage, X 0x16 2 6
Absolute 0x0E 3 6
Absolute, X 0x1E 3 7

BIT

Aとメモリをビット比較演算します。[N:V:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Zeropage 0x24 2 3
Absolute 0x2C 3 4

CMP

Aとメモリを比較演算します。[N:0:0:0:0:0:Z:C]

アドレッシングモード コード バイト数 サイクル
Immediate 0xC9 2 2
Zeropage 0xC5 2 3
Zeropage, X 0xD5 2 4
Absolute 0xCD 3 4
Absolute, X 0xDD 3 4
Absolute, Y 0xD9 3 4
(Indirect, X) 0xC1 2 6
(Indirect), Y 0xD1 2 5

CPX

Xとメモリを比較演算します。[N:0:0:0:0:0:Z:C]

アドレッシングモード コード バイト数 サイクル
Immediate 0xE0 2 2
Zeropage 0xE4 2 3
Absolute 0xEC 3 4

CPY

Yとメモリを比較演算します。[N:0:0:0:0:0:Z:C]

アドレッシングモード コード バイト数 サイクル
Immediate 0xC0 2 2
Zeropage 0xC4 2 3
Absolute 0xCC 3 4

DEC

メモリをデクリメントします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Zeropage 0xC6 2 5
Zeropage, X 0xD6 2 6
Absolute 0xCE 3 6
Absolute, X 0xDE 3 7

DEX

Xをデクリメントします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Implied 0xCA 1 2

DEY

Yをデクリメントします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Implied 0x88 1 2

EOR

Aとメモリを論理XOR演算して結果をAへ返します。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Immediate 0x49 2 2
Zeropage 0x45 2 3
Zeropage, X 0x55 2 4
Absolute 0x4D 3 4
Absolute, X 0x5D 3 4
Absolute, Y 0x59 3 4
(Indirect, X) 0x41 2 6
(Indirect), Y 0x51 2 5

INC

メモリをインクリメントします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Zeropage 0xE6 2 5
Zeropage, X 0xF6 2 6
Absolute 0xEE 3 6
Absolute, X 0xFE 3 7

INX

Xをインクリメントします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Implied 0xE8 1 2

INY

Yをインクリメントします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Implied 0xC8 1 2

LSR

Aまたはメモリを右へシフトします。[N:0:0:0:0:0:Z:C]

アドレッシングモード コード バイト数 サイクル
Accumulator 0x4A 1 2
Zeropage 0x46 2 5
Zeropage, X 0x56 2 6
Absolute 0x4E 3 6
Absolute, X 0x5E 3 7

ORA

Aとメモリを論理OR演算して結果をAへ返します。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Immediate 0x09 2 2
Zeropage 0x05 2 3
Zeropage, X 0x15 2 4
Absolute 0x0D 3 4
Absolute, X 0x1D 3 4
Absolute, Y 0x19 3 4
(Indirect, X) 0x01 2 6
(Indirect), Y 0x11 2 5

ROL

Aまたはメモリを左へローテートします。[N:0:0:0:0:0:Z:C]

アドレッシングモード コード バイト数 サイクル
Accumulator 0x2A 1 2
Zeropage 0x26 2 5
Zeropage, X 0x36 2 6
Absolute 0x2E 3 6
Absolute, X 0x3E 3 7

ROR

Aまたはメモリを右へローテートします。[N:0:0:0:0:0:Z:C]

アドレッシングモード コード バイト数 サイクル
Accumulator 0x6A 1 2
Zeropage 0x66 2 5
Zeropage, X 0x76 2 6
Absolute 0x6E 3 6
Absolute, X 0x7E 3 7

SBC

(A - メモリ - キャリーフラグの反転) を演算して結果をAへ返します。[N:V:0:0:0:0:Z:C]

アドレッシングモード コード バイト数 サイクル
Immediate 0xE9 2 2
Zeropage 0xE5 2 3
Zeropage, X 0xF5 2 4
Absolute 0xED 3 4
Absolute, X 0xFD 3 4
Absolute, Y 0xF9 3 4
(Indirect, X) 0xE1 2 6
(Indirect), Y 0xF1 2 5

スタック命令

PHA

Aをスタックにプッシュダウンします。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Implied 0x48 1 3

PHP

Pをスタックにプッシュダウンします。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Implied 0x08 1 3

PLA

スタックからAにポップアップします。[N:0:0:0:0:0:Z:0]

アドレッシングモード コード バイト数 サイクル
Implied 0x68 1 4

PLP

スタックからPにポップアップします。[N:V:R:B:D:I:Z:C]

アドレッシングモード コード バイト数 サイクル
Implied 0x28 1 4

ジャンプ命令

JMP

アドレスへジャンプします。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Absolute 0x4C 3 3
(Indirect Address) 0x6C 3 5

JSR

サブルーチンを呼び出します。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Absolute 0x20 3 6

RTS

サブルーチンから復帰します。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Implied 0x60 1 6

RTI

割り込みルーチンから復帰します。[N:V:R:B:D:I:Z:C]

アドレッシングモード コード バイト数 サイクル
Implied 0x40 1 6

ブランチ命令

BCC

キャリーフラグがクリアされている時にブランチします。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Relative 0x90 2 2

BCS

キャリーフラグがセットされている時にブランチします。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Relative 0xB0 2 2

BEQ

ゼロフラグがセットされている時にブランチします。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Relative 0xF0 2 2

BMI

ネガティブフラグがセットされている時にブランチします。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Relative 0x30 2 2

BNE

ゼロフラグがクリアされている時にブランチします。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Relative 0xD0 2 2

BPL

ネガティブフラグがクリアされている時にブランチします。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Relative 0x10 2 2

BVC

オーバーフローフラグがクリアされている時にブランチします。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Relative 0x50 2 2

BVS

オーバーフローフラグがセットされている時にブランチします。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Relative 0x70 2 2

フラグ変更命令

CLC

キャリーフラグをクリアします。[0:0:0:0:0:0:0:C]

アドレッシングモード コード バイト数 サイクル
Implied 0x18 1 2

CLD

BCDモードから通常モードに戻ります。ファミコンでは実装されていません。[0:0:0:0:D:0:0:0]

アドレッシングモード コード バイト数 サイクル
Implied 0xD8 1 2

CLI

IRQ割り込みを許可します。[0:0:0:0:0:I:0:0]

アドレッシングモード コード バイト数 サイクル
Implied 0x58 1 2

CLV

オーバーフローフラグをクリアします。[0:V:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Implied 0xB8 1 2

SEC

キャリーフラグをセットします。[0:0:0:0:0:0:0:C]

アドレッシングモード コード バイト数 サイクル
Implied 0x38 1 2

SED

BCDモードに設定します。ファミコンでは実装されていません。[0:0:0:0:D:0:0:0]

アドレッシングモード コード バイト数 サイクル
Implied 0xF8 1 2

SEI

IRQ割り込みを禁止します。[0:0:0:0:0:I:0:0]

アドレッシングモード コード バイト数 サイクル
Implied 0x78 1 2

その他の命令

BRK

ソフトウェア割り込みを起こします。[0:0:0:B:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Implied 0x00 1 7

NOP

空の命令を実行します。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Implied 0xEA 1 2