レジスタ
65C816プロセッサの内部レジスタについて説明します。

レジスタの概要
レジスタとは、プロセッサに直結した、読書きを非常に高速に行うことのできるメモリの一種です。ここには、プロセッサでの演算結果やプロセッサ自身が動作するためのデータが保持されており、そのため容量は非常に少量です。
65C816には9つのレジスタが存在します。

レジスタ サイズ 用途
アキュムレータ
8bit/ 16bit
算術演算および演算結果の出力
インデクスレジスタ(X/Y)
8bit/ 16bit
インデクスアドレッシング時に使用するポインタの保持
ダイレクトページレジスタ
16bit
ダイレクトページの先頭アドレス指定
スタックポインタ
16bit
空きスタック領域の開始位置の指定
プログラムバンクレジスタ
8bit
アセンブリの実行位置の保持
データバンクレジスタ
8bit
メモリアクセス時に対象とするバンクの選択
プログラムカウンタ
16bit
アセンブリの実行位置の保持
プロセッサステータスレジスタ
8bit
プロセッサの内部状態の保持

アキュムレータ
アキュムレータは16ビット幅のレジスタで、主に算術演算および演算結果の出力に使用されます。
ステータスレジスタのメモリモードフラグがセットされている場合は8ビット幅となり、下位バイトのみを使用します。また、エミュレーションモード時も8ビット幅となります。
アキュムレータの下位8ビットをA、上位8ビットをB、16ビット全体をCとあらわすことがあります。AおよびBの値はXBA命令を使用することで交換することができます。
インデクスレジスタ
インデクスレジスタは16ビット幅のレジスタで、主にインデクスアドレッシングで使用するためのインデクスポインタを保持するために使用します。
ステータスレジスタのインデクスフラグがセットされている場合、およびエミュレーションモード時には8ビット幅となり、下位バイトのみを使用します。
インデクスレジスタは2本あり、それぞれX, Yと呼ばれますが、それぞれの幅を変えることはできず、どちらも16ビットまたは8ビットとなります。
2つのインデクスレジスタはアドレッシングモードにおいて明確に用途が区別されています。

ダイレクトページレジスタ
6502のゼロページを発展させたもので、バンク0の64KB空間を高速にアクセスするダイレクトアドレッシングのためのレジスタです。
バンク0のうち、このレジスタが指定したアドレスから始まる256バイトの空間をダイレクトページと呼びます。
ダイレクトページレジスタには直接アクセスすることはできず、ダイレクトページを変更する場合にはスタックを通して値をセットします。

スタックポインタ
スタック領域の最初の空き番地を指定するためのレジスタです。スタックポインタのバンクは0とされ、したがってスタック領域は常にバンク0に存在します。
エミュレーションモード時は、6502のスタック領域が1ページに置かれることから、スタックポインタの上位バイトは1固定となり、スタック領域も256バイトに制限されます。

プログラムバンクレジスタ
現在実行しているアセンブリの命令アドレスのうち、上位8ビット(バンク)を保持するためのレジスタです。
JSL命令およびJML命令によってフルアドレス指定を行った場合にはこのレジスタは変更されますが、通常の相対分岐命令やプログラムカウンタのインクリメントではこのレジスタは変更されず、現在のバンク内でラップされます。

データバンクレジスタ
データアクセスの際、アクセスするメモリバンクを指定するためのレジスタです。
インデクスアドレッシングの場合は、インデクス追加時にページ境界を超えるときに一時的にインクリメントされ、データアクセス完了後にもとの値に戻されます。
このレジスタは直接操作することはできず、スタックを通してバンク選択を行います。

プロセッサステータスレジスタ
プロセッサの内部状態を保持するためのレジスタで、異なる8つのフラグのセットです。
また、これとは別にエミュレーションフラグ(E)およびブレークモードフラグ(B)が存在します。
 
ビット フラグ 記号 内容
7
ネガティブフラグ
N
演算結果が負の場合にセット。ゼロ以上の場合クリア。
6
オーバーフローフラグ
V
算術オーバーフローが発生した場合にセット
5
メモリモードフラグ
M
アキュムレータのサイズ切り替え。クリア時16ビット、セット時8ビット
エミュレーションモード時は1固定でアクセス不可能。
4
インデクスフラグ
X
インデクスレジスタ(X/Y)のサイズ切り替え。クリア時16ビット、セット時8ビット
エミュレーションモード時は1固定でアクセス不可能。
3
デシマルフラグ
D
二進化十進数の切り替え。クリア時バイナリ、セット時二進化十進数モード。
十進演算が可能なのはADCおよびSBC命令のみ。
2
割込禁止フラグ
I
IRQ許可の可否。セット時IRQ禁止。
1
ゼロフラグ
Z
演算結果がゼロの場合セット。
0
キャリーフラグ
C
算術演算で繰上りがあった場合、もしくは繰り下がりがなかった場合にセット。
エミュレーションフラグ
E
CPU動作モードの切り替え。クリア時ネイティブモード、セット時エミュレーションモード。
ブレークモードフラグ
B
エミュレーションモード専用。6502のBフラグに相当する。
IRQ/BRKの識別。セット時BRK、クリア時IRQ。