アーキテクチャ

特徴

65816は、6502との完全な下位互換性を保ちつつ16bit化されたCPUで、かなりの互換性を維持したまま一部のレジスタを16bit化、メモリアドレスの24bit化と言う拡張がなされたCPUです。

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

レジスタ一覧

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

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

ネイティブモード時

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

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

名称 ベクタ 発生条件 変化するレジスタ
COP $FFF4 コプロセッサ割り込み P[I]=1, P[D]=0
未使用 $FFF6
ABORT $FFF8 ハードウェア特殊信号 P[I]=1
NMI $FFFA ハードウェア特殊信号 P[I]=1
RESET $FFFC 電源投入時、リセット時 P[I]=1, P[D]=0
IRQ/BRK $FFFE ハードウェア信号/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 * $10000 + IM16】の8or16bit値をAにロード
Absolute, X LDA IM16, X 【DB * $10000 + IM16 + X】の8or16bit値をAにロード
Absolute, Y LDA IM16, Y 【DB * $10000 + 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 * $10000 + 【IM8 + X】の16bit値】の8or16bit値をAにロード
(Indirect), Y LDA (IM8), Y 【DB * $10000 + 【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 $A9 2(3) 2
Direct $A5 2 3
Direct, X $B5 2 4
Absolute $AD 3 4
Absolute, X $BD 3 4
Absolute, Y $B9 3 4
Absolute Long $AF 4 5
Absolute Long, X $BF 4 5
(Indirect, X) $A1 2 6
(Indirect), Y $B1 2 5
[Indirect Long] $A7 2 6
[Indirect Long], Y $B7 2 6

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

LDX

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

アドレッシングモード コード バイト数 サイクル
Immediate $A2 2(3) 2
Direct $A6 2 3
Direct, Y $B6 2 4
Absolute $AE 3 4
Absolute, Y $BE 3 4

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

LDY

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

アドレッシングモード コード バイト数 サイクル
Immediate $A0 2(3) 2
Direct $A4 2 3
Direct, X $B4 2 4
Absolute $AC 3 4
Absolute, X $BC 3 4

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

STA

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

アドレッシングモード コード バイト数 サイクル
Direct $85 2 3
Direct, X $95 2 4
Absolute $8D 3 4
Absolute, X $9D 3 5
Absolute, Y $99 3 5
Absolute Long $8F 4 5
Absolute Long, X $9F 4 5
(Indirect, X) $81 2 6
(Indirect), Y $91 2 6
[Indirect Long] $87 2 6
[Indirect Long], Y $97 2 6

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

STX

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

アドレッシングモード コード バイト数 サイクル
Direct $86 2 3
Direct, Y $96 2 4
Absolute $8E 3 4

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

STY

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

アドレッシングモード コード バイト数 サイクル
Direct $84 2 3
Direct, X $94 2 4
Absolute $8C 3 4

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

STZ

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

アドレッシングモード コード バイト数 サイクル
Direct $64 2 3
Direct, X $74 2 4
Absolute $9C 3 4
Absolute, X $9E 3 5

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

TAX

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

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

TAY

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

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

TSX

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

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

TXA

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

アドレッシングモード コード バイト数 サイクル
Implied $8A 2 2

TXS

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

アドレッシングモード コード バイト数 サイクル
Implied $9A 2 2

演算命令

ADC

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

アドレッシングモード コード バイト数 サイクル
Immediate $69 2(3) 2
Direct $65 2 3
Direct, X $75 2 4
Absolute $6D 3 4
Absolute, X $7D 3 4
Absolute, Y $79 3 4
Absolute Long $6F 4 5
Absolute Long, X $7F 4 5
(Indirect, X) $61 2 6
(Indirect), Y $71 2 5
[Indirect Long] $67 2 6
[Indirect Long], Y $77 2 6

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

AND

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

アドレッシングモード コード バイト数 サイクル
Immediate $29 2(3) 2
Direct $25 2 3
Direct, X $35 2 4
Absolute $2D 3 4
Absolute, X $3D 3 4
Absolute, Y $39 3 4
Absolute Long $2F 4 5
Absolute Long, X $3F 4 5
(Indirect, X) $21 2 6
(Indirect), Y $31 2 5
[Indirect Long] $27 2 6
[Indirect Long], Y $37 2 6

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

ASL

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

アドレッシングモード コード バイト数 サイクル
Implied $0A 1 2
Direct $06 2 5
Direct, X $16 2 6
Absolute $0E 3 6
Absolute, X $1E 3 7

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

BIT

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

アドレッシングモード コード バイト数 サイクル
Direct $24 2 3
Absolute $2C 3 4

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

CMP

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

アドレッシングモード コード バイト数 サイクル
Immediate $C9 2 2
Direct $C5 2 3
Direct, X $D5 2 4
Absolute $CD 3 4
Absolute, X $DD 3 4
Absolute, Y $D9 3 4
Absolute Long $CF 4 5
Absolute Long, X $DF 4 5
(Indirect, X) $C1 2 6
(Indirect), Y $D1 2 5
[Indirect Long] $C7 2 6
[Indirect Long], Y $D7 2 6

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

CPX

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

アドレッシングモード コード バイト数 サイクル
Immediate $E0 2 2
Direct $E4 2 3
Absolute $EC 3 4

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

CPY

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

アドレッシングモード コード バイト数 サイクル
Immediate $C0 2 2
Direct $C4 2 3
Absolute $CC 3 4

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

DEC

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

アドレッシングモード コード バイト数 サイクル
Implied $3A 1 2
Direct $C6 2 5
Direct, X $D6 2 6
Absolute $CE 3 6
Absolute, X $DE 3 7

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

DEX

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

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

DEY

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

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

EOR

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

アドレッシングモード コード バイト数 サイクル
Immediate $49 2 2
Direct $45 2 3
Direct, X $55 2 4
Absolute $4D 3 4
Absolute, X $5D 3 4
Absolute, Y $59 3 4
Absolute Long $4F 4 5
Absolute Long, X $5F 4 5
(Indirect, X) $41 2 6
(Indirect), Y $51 2 5
[Indirect Long] $47 2 6
[Indirect Long], Y $57 2 6

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

INC

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

アドレッシングモード コード バイト数 サイクル
Implied $1A 1 2
Direct $E6 2 5
Direct, X $F6 2 6
Absolute $EE 3 6
Absolute, X $FE 3 7

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

INX

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

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

INY

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

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

LSR

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

アドレッシングモード コード バイト数 サイクル
Implied $4A 1 2
Direct $46 2 5
Direct, X $56 2 6
Absolute $4E 3 6
Absolute, X $5E 3 7

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

ORA

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

アドレッシングモード コード バイト数 サイクル
Immediate $09 2(3) 2
Direct $05 2 3
Direct, X $15 2 4
Absolute $0D 3 4
Absolute, X $1D 3 4
Absolute, Y $19 3 4
Absolute Long $0F 4 5
Absolute Long, X $1D 4 4
(Indirect, X) $01 2 6
(Indirect), Y $11 2 5
[Indirect Long] $07 3 6
[Indirect Long], Y $17 3 6

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

ROL

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

アドレッシングモード コード バイト数 サイクル
Implied $2A 1 2
Direct $26 2 5
Direct, X $36 2 6
Absolute $2E 3 6
Absolute, X $3E 3 7

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

ROR

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

アドレッシングモード コード バイト数 サイクル
Implied $6A 1 2
Direct $66 2 5
Direct, X $76 2 6
Absolute $6E 3 6
Absolute, X $7E 3 7

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

SBC

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

アドレッシングモード コード バイト数 サイクル
Immediate $E9 2(3) 2
Direct $E5 2 3
Direct, X $F5 2 4
Absolute $ED 3 4
Absolute, X $FD 3 4
Absolute, Y $F9 3 4
Absolute Long $EF 4 5
Absolute Long, X $FF 4 5
(Indirect, X) $E1 2 6
(Indirect), Y $F1 2 5
[Indirect Long] $E7 2 6
[Indirect Long], Y $F7 2 6

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

スタック命令

PHA

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

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

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

PHB

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

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

PHD

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

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

PHK

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

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

PHP

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

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

PHX

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

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

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

PHY

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

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

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

PLA

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

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

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

PLB

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

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

PLD

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

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

PLP

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

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

PLX

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

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

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

PLY

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

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

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

ジャンプ命令

JMP

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

アドレッシングモード コード バイト数 サイクル
Absolute $4C 3 3
Absolute Long $5C 4 4
(Indirect Address) $6C 3 5
(Indirect Address, X) $DC 3 6
[Indirect Long Address] $7C 4 6