レジスタ

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バイトの空間をダイレクトページと呼びます。
ダイレクトページレジスタの値は、TCD命令でアキュムレータ(C)から、またはPLD命令でスタックから設定します。TDC命令やPHD命令で値を取り出すこともできます。

スタックポインタ

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

プログラムバンクレジスタ

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

データバンクレジスタ

データアクセスの際、アクセスするメモリバンクを指定するためのレジスタです。
インデクスアドレッシングでインデクスを加算した結果がバンク境界を超える場合は、次のバンクのデータにアクセスします。このときデータバンクレジスタの値自体は変化しません。
このレジスタを直接設定する命令はなく、通常はPLB命令でスタックを通して値をセットします。なお、MVN命令およびMVP命令を実行すると、転送先のバンクがセットされます。

プロセッサステータスレジスタ

プロセッサの内部状態を保持するためのレジスタで、異なる8つのフラグのセットです。
また、これとは別にエミュレーションフラグ(E)およびブレークモードフラグ(B)が存在します。

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