レジスタ
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 | 割込禁止フラグ | I | IRQ許可の可否。セット時IRQ禁止。 |
| 1 | ゼロフラグ | Z | 演算結果がゼロの場合セット。 |
| 0 | キャリーフラグ | C | 算術演算で繰り上がりがあった場合、もしくは繰り下がりがなかった場合にセット。 |
| エミュレーションフラグ | E | CPU動作モードの切り替え。クリア時ネイティブモード、セット時エミュレーションモード。 | |
| ブレークモードフラグ | B | エミュレーションモード専用。6502のBフラグに相当する。 IRQ/BRKの識別。セット時BRK、クリア時IRQ。 |