アーキテクチャ
特徴
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 |