アーキテクチャ

特徴

65816は、6502との完全な下位互換性を保ちつつ16bit化されたCPUで、かなりの互換性を維持したまま一部のレジスタを16bit化、メモリアドレスの24bit化と言う拡張がなされたCPUです。多くの命令が6502とバイナリ互換がとられていますが、その代償として新しい命令は大して増えていません。実際積算や除算すらサポートされていないので、レジスタ数16bitのCPUとしてはかなり命令数が少ない部類だと思います。

このCPUは大きく2種類の動作モードがあり、ほぼ6502そのものとして動く「エミュレーションモード」と16bit拡張された「ネイティブモード」があります。電源投入直後はエミュレーションモードで起動されるので、16bit演算や24bitのアドレスをアクセスするにはネイティブモードに移行する必要があります。エミュレーションモードについては、ほぼ6502そのままなのでNES研究室6502のページを参照してください。ここではネイティブモードの説明のみを行います。

レジスタ一覧

アキュームレータは相変わらず1個だけ、インデックスレジスタも2個と6502と同じようになっています。6502のゼロページアクセスは廃止され、新たに追加された「ダイレクトポインタ」を使ってバンク0x00限定の64KBアドレス空間に対して高速アクセスを行う事ができるようになりました。スタックポインタは16bitとなっていますが、スタック領域はバンク0x00に配置されます。

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

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

ステータスレジスタPは8bitのレジスタで、次のようになっています。また、Eフラグに対してはXCE命令を使ってのみアクセスすることが出来ます。以降ステータスレジスタの任意のフラグを指定する時にはP[フラグ名]と表記します。

ステータスレジスタのP[M]とP[X]を変更することによりレジスタのサイズが変更されます。例えばAの下位8bitデータをメモリにストアする場合は、P[M]をセットしてSTA命令をすることになります。同様にXレジスタにメモリから16bitデータをロードしたい場合はP[X]をクリアしてLDXをします。さらに、Aについては8bitにしても上位8bitは残りますが、XとYについては8bitにした時点で上位8bitのデータはクリアされます。

位置 名称 詳細名 内容
bit7 N ネガティブ Aのbit7が1の時にセット
bit6 V オーバーフロー 演算結果がオーバーフローを起こした時にセット
bit5 M メモリモード Aとメモリの単位サイズ (0:16bit, 1:8bit)
bit4 X インデックスモード XとYの単位サイズ (0:16bit, 1:8bit)
bit3 D デシマルモード 0:デフォルト、1:BCDモード
bit2 I IRQ禁止 0:IRQ許可、1:IRQ禁止
bit1 Z ゼロ 演算結果が0の時にセット
bit0 C キャリー キャリー発生時にセット
--- E エミュレーションモード 0:ネイティブモード、1:エミュレーションモード

割り込み

65816の割り込みベクタと割り込み時の動きについては次のようになります。基本的にはエミュレーションモードとネイティブモードどちらの状態かによって、同じ割り込みでも別のベクタアドレスにジャンプすることになります。ちなみにリセット割り込み直後は必ずエミュレーションモードなので、ネイティブモード側のリセット割り込みベクタはありません。また、割り込みベクタも割り込みコール先ルーチンも全てバンク0x00に配置する必要があります。

ネイティブモード時

名称 ベクタ 発生条件 変化するレジスタ
COP 0xFFE4 コプロセッサ割り込み P[I]=1, P[D]=0
BRK 0xFFE6 BRK命令実行時 P[I]=1, P[D]=0
ABORT 0xFFE8 ハードウェア特殊信号 P[I]=1
NMI 0xFFEA ハードウェア特殊信号 P[I]=1
未使用 0xFFEC
IRQ 0xFFEE ハードウェア信号 P[I]=1

エミュレーションモード時

名称 ベクタ 発生条件 変化するレジスタ
COP 0xFFF4 コプロセッサ割り込み P[I]=1, P[D]=0
未使用 0xFFF6
ABORT 0xFFF8 ハードウェア特殊信号 P[I]=1
NMI 0xFFFA ハードウェア特殊信号 P[I]=1
RESET 0xFFFC 電源投入時、リセット時 P[I]=1, P[D]=0
IRQ/BRK 0xFFFE ハードウェア信号/BRK命令 P[I]=1, P[D]=0

アドレッシングモード

65816のアドレッシングモードを紹介します。IM8は8bit値、IM16は16bit値、IM24は24bit値、IMNはフラグによって変化する8bitまたは16bit値を意味します。【N】は「アドレスN」と言う意味になります。65816のアセンブラは、大抵16進数を表記する際に数字の頭に"$"を付けて"$2e"のように書きます。

名称 表記例 動作
Implied PHA Aをスタックへ退避
Accumulator LSR A Aを左に1bitシフト
Immediate LDA #IMN 即値IMXをAにロード
Direct LDA IM8 【D + IM8】の8or16bit値をAにロード
Direct, X LDA IM8, X 【D + IM8 + X】の8or16bit値をAにロード
Direct, Y LDA IM8, Y 【D + IM8 + Y】の8or16bit値をAにロード
Relative BEQ IM8 P[Z]がセットの時【PC + IM8】へジャンプ
Absolute LDA IM16 【DB * 0x10000 + IM16】の8or16bit値をAにロード
Absolute, X LDA IM16, X 【DB * 0x10000 + IM16 + X】の8or16bit値をAにロード
Absolute, Y LDA IM16, Y 【DB * 0x10000 + IM16 + Y】の8or16bit値をAにロード
Absolute Long LDA IM24 【IM24】の8or16bit値をAにロード
Absolute Long, X LDA IM24, X 【IM24 + X】の8or16bit値をAにロード
(Indirect, X) LDA IM8, X 【DB * 0x10000 + 【IM8 + X】の16bit値】の8or16bit値をAにロード
(Indirect), Y LDA (IM8), Y 【DB * 0x10000 + 【IM8】の16bit値 + Y】の8or16bit値をAにロード
[Indirect Long] LDA [IM8] 【【IM8】の24bit値】の8or16bit値をAにロード
[Indirect Long], Y LDA [IM8], Y 【【IM8】の24bit値 + Y】の8or16bit値をAにロード
(Indirect Address) JMP (IM16) 【IM16】の24bit値へジャンプ
(Indirect Address, X) JMP (IM16, X) 【IM16 + X】の24bit値へジャンプ
[Indirect Long Address] JMP [IM24] 【IM24】の24bit値へジャンプ

コピー命令

LDA

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

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

* P[M]=0 の時サイクル+1

LDX

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

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

* P[X]=0 の時サイクル+1

LDY

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

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

* P[X]=0 の時サイクル+1

STA

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

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

* P[M]=0 の時サイクル+1

STX

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

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

* P[X]=0 の時サイクル+1

STY

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

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

* P[X]=0 の時サイクル+1

STZ

メモリに0をストアします。[0:0:0:0:0:0:0:0]

アドレッシングモード コード バイト数 サイクル
Direct 0x64 2 3
Direct, X 0x74 2 4
Absolute 0x9C 3 4
Absolute, X 0x9E 3 5

* P[M]=0 の時サイクル+1

TAX

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

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

TAY

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

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

TSX

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

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

TXA

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

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

TXS

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

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

演算命令

ADC

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

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

* P[M]=0 の時サイクル+1

AND

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

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

* P[M]=0 の時サイクル+1

ASL

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

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

* P[M]=0 の時サイクル+2 (Implied は除く)

BIT

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

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

* P[M]=0 の時サイクル+1

CMP

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

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

* P[M]=0 の時サイクル+1

CPX

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

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

* P[X]=0 の時サイクル+1

CPY

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

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

* P[X]=0 の時サイクル+1

DEC

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

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

* P[M]=0 の時サイクル+2 (Implied は除く)

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
Direct 0x45 2 3
Direct, X 0x55 2 4
Absolute 0x4D 3 4
Absolute, X 0x5D 3 4
Absolute, Y 0x59 3 4
Absolute Long 0x4F 4 5
Absolute Long, X 0x5F 4 5
(Indirect, X) 0x41 2 6
(Indirect), Y 0x51 2 5
[Indirect Long] 0x47 2 6
[Indirect Long], Y 0x57 2 6

* P[M]=0 の時サイクル+1

INC

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

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

* P[M]=0 の時サイクル+2 (Implied は除く)

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]

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

* P[M]=0 の時サイクル+2 (Implied は除く)

ORA

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

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

* P[M]=0 の時サイクル+1

ROL

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

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

* P[M]=0 の時サイクル+2 (Implied は除く)

ROR

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

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

* P[M]=0 の時サイクル+2 (Implied は除く)

SBC

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

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

* P[M]=0 の時サイクル+1


スタック命令

PHA

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

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

* P[M]=0 の時サイクル+1

PHB

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

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

PHD

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

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

PHK

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

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

PHP

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

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

PHX

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

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

* P[X]=0 の時サイクル+1

PHY

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

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

* P[X]=0 の時サイクル+1

PLA

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

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

* P[M]=0 の時サイクル+1

PLB

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

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

PLD

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

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

PLP

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

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

PLX

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

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

* P[X]=0 の時サイクル+1

PLY

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

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

* P[X]=0 の時サイクル+1


ジャンプ命令

JMP

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

アドレッシングモード コード バイト数 サイクル
Absolute 0x4C 3 3
Absolute Long 0x5C 4 4
(Indirect Address) 0x6C 3 5
(Indirect Address, X) 0xDC 3 6
[Indirect Long Address] 0x7C 4 6