RAMとレジスタ

RAMはRandom Acsess Memoryの略で、自由に値の書き換えが出来るメモリです。これに対し、ROMはRead Only Memoryと呼ばれ、読み取り専用のメモリです。RAMもROMもSNESアドレスは$B5:8006のように6桁となります。この上位2桁をバンク(Bank)といい、下4桁をアドレス(Address)といいます。

SNESでは$7E:0000~$7F:FFFFがRAMとなっており、また$7E:0000~$7E:1FFFはバンク$00~3Fの$0000~1FFFと共用になっています。すなわち、$7E:0000~$7E:1FFFにアクセスすることと、バンク$00~3Fの$0000~1FFFにアクセスすることは同じことを意味します

RAMと似たようなものにレジスタ(Register)というものがあります。レジスタは値を記憶すること・自由に書き換えできる点ではRAMと同じですが、容量はRAMよりもはるかに小さいです(数バイト)。その代わり、RAMよりも高速に読み書きできるため、より頻繁にアクセスすることが出来ます。SNESには全部で9つのレジスタがあります。

アキュムレータ(Accumulator)
CPUでの演算結果や値を保持しておくレジスタです。65C816にはアキュムレータが1つ存在します。
アキュムレータの大きさは8bitと16bitを切り替えることができ、必要に応じて使い分けます。自作コード等でアキュムレータの大きさを変えた場合、元に戻さないとバグの原因となります。
コード内では頭文字を取ってAと表記します。また、以後Aレジスタといった場合、アキュムレータを指します。

インデックスレジスタ(Index Register)
基準値からの増減幅を記録しておくレジスタです。65C816にはインデックスレジスタが2つ存在し、それぞれインデックスレジスタX、インデックスレジスタYと呼びます。
Aレジスタと同じく大きさを8bitと16bitを切り替えることができ、必要に応じて使い分けます。自作コード等で大きさを変えた場合、元に戻さないとこちらも同じくバグの原因となります。
コード内ではそれぞれX、Yと表記します。また、以後X(Y)レジスタといった場合、インデックスレジスタX(Y)を指します。

プロセッサステータスレジスタ(Processor Status Register)
さまざまなフラグを格納しているレジスタです。このレジスタに格納されているフラグは直前に実行した処理の結果に応じてリアルタイムに更新されます。レジスタの大きさは8bitです。

Bit7:ネガティブフラグ(N)
アキュムレータやインデックスレジスタの値が負数であった場合に1が立ちます。

Bit6:オーバーフローフラグ(V)
演算結果がオーバーフローした場合に1が立ちます。たとえば8bit幅で演算を行ったときに+$7Fを越えるあるいは-$80を下回る場合に1がセットされます。

Bit5:メモリモードフラグ(M)
アキュムレータのサイズを指定します。このフラグを立てると8bit幅に、逆にこのフラグをクリアすると16bit幅になります。16bitモード時にはRAMに対しても2バイト分の値を読み書きします。

Bit4:インデクスモードフラグ(X)
インデックスレジスタのサイズを指定します。このフラグを立てると8bit幅に、逆にこのフラグをクリアすると16bit幅になります。16bitモード時にはRAMに対しても2バイト分の値を読み書きします。

Bit3:デシマルモードフラグ(D)
このフラグを立てると値を二進化十進数として扱います。たとえば$12は通常、十進数で言うところの18として計算しますが、このフラグが立っている場合は$12を十進数の12として扱います。なお、このモードが正常に機能するのはADC命令とSBC命令においてのみです。

Bit2:インタラプトフラグ(I)
このフラグを立てると割り込み不許可になります。

Bit1:ゼロフラグ(Z)
レジスタに0を書き込んだとき、あるいは演算結果が0であった場合に1が立ちます。

Bit0:キャリーフラグ(C)
加算結果に繰上りがある場合と減算結果に繰り下がりが無い場合に1が立ちます。繰上りが無かった場合や、繰り下がりがあった場合はゼロクリアされます。

Bit0:エミュレーションフラグ(E)
このフラグを立てるとエミュレーションモードに移行し、65C816の前世代である6502をエミュレートします。このフラグだけは直接アクセスできず、キャリーフラグに1を立て、XCE命令によってキャリーフラグと交換することでフラグを立てます。
SNES起動時はエミュレーションモードです。
なお、エミュレーションモード時はA,X,Yレジスタは8bit固定となります。

プログラムカウンタレジスタ(Program Counter Register)
次に実行する命令が格納されているメモリのアドレスを格納しているレジスタです。以後PCといった場合、プログラムカウンタを指します。リセット時にはゼロクリアされます。

プログラムバンクレジスタ(Program Bank Register)
次に実行する命令が格納されているメモリのバンクを格納しているレジスタです。以後PBレジスタといった場合、プログラムバンクレジスタを指します。リセット時にはゼロクリアされます。

ダイレクトページレジスタ(Direct Page Register)
実行アドレスが8bitで指定された場合に、その値と加算して16bitアドレスを与えるためのオフセットを表します。この場合、24bitフルアドレスの上位2桁はゼロクリアされます。以後Dレジスタといった場合、ダイレクトページレジスタを指します。リセット時にはゼロクリアされます。

データバンクレジスタ(Data Bank Register)
実行アドレスが16bitで指定された場合に、バンクを指定するためのレジスタです。以後DBレジスタといった場合、データバンクレジスタを指します。リセット時にはゼロクリアされます。

スタックポインタ(Stack Pointer)

スタック操作のときに次のスタックの空き領域を指定するレジスタです。16bit幅で、バンクは$00とみなします。