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にロード |
メモリから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 |
メモリから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 |
メモリから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 |
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 |
Xからメモリにストアします。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Zeropage | 0x86 | 2 | 3 |
| Zeropage, Y | 0x96 | 2 | 4 |
| Absolute | 0x8E | 3 | 4 |
Yからメモリにストアします。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Zeropage | 0x84 | 2 | 3 |
| Zeropage, X | 0x94 | 2 | 4 |
| Absolute | 0x8C | 3 | 4 |
AをXへコピーします。[N:0:0:0:0:0:Z:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0xAA | 1 | 2 |
AをYへコピーします。[N:0:0:0:0:0:Z:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0xA8 | 1 | 2 |
SをXへコピーします。[N:0:0:0:0:0:Z:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0xBA | 1 | 2 |
XをAへコピーします。[N:0:0:0:0:0:Z:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0x8A | 1 | 2 |
XをSへコピーします。[N:0:0:0:0:0:Z:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0x9A | 1 | 2 |
YをAへコピーします。[N:0:0:0:0:0:Z:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0x98 | 1 | 2 |
(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 |
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 |
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 |
Aとメモリをビット比較演算します。[N:V:0:0:0:0:Z:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Zeropage | 0x24 | 2 | 3 |
| Absolute | 0x2C | 3 | 4 |
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 |
Xとメモリを比較演算します。[N:0:0:0:0:0:Z:C]
| アドレッシングモード | コード | バイト数 | サイクル |
| Immediate | 0xE0 | 2 | 2 |
| Zeropage | 0xE4 | 2 | 3 |
| Absolute | 0xEC | 3 | 4 |
Yとメモリを比較演算します。[N:0:0:0:0:0:Z:C]
| アドレッシングモード | コード | バイト数 | サイクル |
| Immediate | 0xC0 | 2 | 2 |
| Zeropage | 0xC4 | 2 | 3 |
| Absolute | 0xCC | 3 | 4 |
メモリをデクリメントします。[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 |
Xをデクリメントします。[N:0:0:0:0:0:Z:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0xCA | 1 | 2 |
Yをデクリメントします。[N:0:0:0:0:0:Z:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0x88 | 1 | 2 |
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 |
メモリをインクリメントします。[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 |
Xをインクリメントします。[N:0:0:0:0:0:Z:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0xE8 | 1 | 2 |
Yをインクリメントします。[N:0:0:0:0:0:Z:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0xC8 | 1 | 2 |
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 |
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 |
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 |
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 |
(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 |
Aをスタックにプッシュダウンします。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0x48 | 1 | 3 |
Pをスタックにプッシュダウンします。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0x08 | 1 | 3 |
スタックからAにポップアップします。[N:0:0:0:0:0:Z:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0x68 | 1 | 4 |
スタックからPにポップアップします。[N:V:R:B:D:I:Z:C]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0x28 | 1 | 4 |
アドレスへジャンプします。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Absolute | 0x4C | 3 | 3 |
| (Indirect Address) | 0x6C | 3 | 5 |
サブルーチンを呼び出します。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Absolute | 0x20 | 3 | 6 |
サブルーチンから復帰します。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0x60 | 1 | 6 |
割り込みルーチンから復帰します。[N:V:R:B:D:I:Z:C]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0x40 | 1 | 6 |
キャリーフラグがクリアされている時にブランチします。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Relative | 0x90 | 2 | 2 |
キャリーフラグがセットされている時にブランチします。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Relative | 0xB0 | 2 | 2 |
ゼロフラグがセットされている時にブランチします。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Relative | 0xF0 | 2 | 2 |
ネガティブフラグがセットされている時にブランチします。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Relative | 0x30 | 2 | 2 |
ゼロフラグがクリアされている時にブランチします。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Relative | 0xD0 | 2 | 2 |
ネガティブフラグがクリアされている時にブランチします。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Relative | 0x10 | 2 | 2 |
オーバーフローフラグがクリアされている時にブランチします。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Relative | 0x50 | 2 | 2 |
オーバーフローフラグがセットされている時にブランチします。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Relative | 0x70 | 2 | 2 |
キャリーフラグをクリアします。[0:0:0:0:0:0:0:C]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0x18 | 1 | 2 |
BCDモードから通常モードに戻ります。ファミコンでは実装されていません。[0:0:0:0:D:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0xD8 | 1 | 2 |
IRQ割り込みを許可します。[0:0:0:0:0:I:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0x58 | 1 | 2 |
オーバーフローフラグをクリアします。[0:V:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0xB8 | 1 | 2 |
キャリーフラグをセットします。[0:0:0:0:0:0:0:C]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0x38 | 1 | 2 |
BCDモードに設定します。ファミコンでは実装されていません。[0:0:0:0:D:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0xF8 | 1 | 2 |
IRQ割り込みを禁止します。[0:0:0:0:0:I:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0x78 | 1 | 2 |
ソフトウェア割り込みを起こします。[0:0:0:B:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0x00 | 1 | 7 |
空の命令を実行します。[0:0:0:0:0:0:0:0]
| アドレッシングモード | コード | バイト数 | サイクル |
| Implied | 0xEA | 1 | 2 |