PCE ハードウェア研究資料 - メモリマッピングレジスタ

概要

HuC6280 の CPU コア(以下 6280)は、メモリマッピングレジスタという、 メモリ管理用の 8 ビットレジスタを 8 つ持っています。このレジスタを使用して、 6280 が本来アクセス可能な 64kB のメモリ空間を 8 分割した 8kB 単位で バンク切り替えを行うことが可能です。メモリマッピングレジスタはそれぞれ 8 ビットのため、 0〜255 の値を設定できます。つまり 8kB * 256 = 2MB の物理アドレス空間の中から任意の 8kB を選択し、6280 の 64kB メモリ空間内に配置することができます。

メモリマッピングレジスタは 6280 がアクセスできる物理アドレス空間を 2MB に拡張しますが、そのアクセスにはバンク切り替えが伴うため、 少々話がややこしくなります。大きなアドレス空間にアクセスする 8 ビット CPU の宿命と言えるのかもしれません。

目次へ戻る


メモリマッピングレジスタ (MPR0 〜 MPR7)

メモリマッピングレジスタは MPR または MMR と略されます。ここでは MPR で統一します。個々のレジスタは MPR の文字の後ろに 0 〜 7 の番号を付け区別します。


ちなみにファミコンではこの機能をもつレジスタが本体に搭載されなかったために、 俗に「マッパー」と呼ばれるメーカー独自のアドレス拡張 IC が ROM カセット内に搭載され、 そのアクセス方法も統一されていませんでした。


6280 のアドレス線自体は 16 本なので、2^16 = 65536 バイト (64kB) のメモリしか 扱えません。つまり 6280 からは、アドレス空間は常に ($0000-$FFFF) の 64kB しか見ることができません。 この 6280 からみた 64kB の空間を論理アドレス空間と呼ぶことにします。

64kB のメモリというのは、 PCE のゲームを作る上では少なすぎるので、もっと多くのメモリを使えるように 拡張する必要がありました。そこで採用されたのが MPR によるバンク切替え方式です。PCE では、6280 の 論理アドレス空間を 8 つの区間(セグメント)に分割し、それぞれの区間に対応する 8 つの MPR の値を 変更することで、該当の区間のメモリをとっかえひっかえすることができるようになっています。

MPR0 〜 MPR7 は、8 ビットのレジスタで、それぞれに 0〜255 の値を書き込むことができます。 MPR に書き込まれる値は「バンク番号」で、この値によって、該当のアドレス区間にメモリが切り替わります。 それぞれの MPR がどの 6280 アドレス区間に対応するのかを示します。

MPR0: $0000-$1FFF
MPR1: $2000-$3FFF
MPR2: $4000-$5FFF
MPR3: $6000-$7FFF
MPR4: $8000-$9FFF
MPR5: $A000-$BFFF
MPR6: $C000-$DFFF
MPR7: $E000-$FFFF

MPR0〜MPR7 によって、6280 の 16 本のアドレス線が、21 本に拡張されます(図1参照)。 よって、2^21 = 2097152 バイト (2MB) のメモリ空間にアクセスすることができます。6280 のアドレス A13〜A15 の 3 ビットが MPR0 〜 MPR7 のセレクタになります。A13〜A15 が 000 の場合は MPR0 の 8 ビット値が A13〜A20 として出力されます。A13〜A15 が 111 の場合は MPR7 の 8 ビット値が A13〜A20 として出力されます。

6280 が持っているアドレス線はあくまでも 16 本なので、6280 が直接見ることができるのは、 全 2MB のメモリ空間のうち 64kB 分だけです。見えない部分は、必要時に MPR の値を変更して (バンク切替えをして)アクセスします。6280 が直接見ることができる 64kB の空間を 論理アドレス空間と呼んだのに対して、MPR によって 2MB に拡張されたメモリ空間を物理アドレス空間 と呼ぶことにします。イメージとしては、6280 を動かすソフトから直接見ることができるのが論理アドレスで、 ソフトから見えない、ハードウェアの部分でコッソリ拡張されているのが物理アドレスです。


図1 MPR0-MPR7 によるアドレス線の拡張(クリックで拡大表示)

論理アドレスのそれぞれの区間には、(MPR に書き込まれた値 × $2000)の物理アドレスのメモリが現れます。 たとえば MPR0 に $00 を書き込むと、論理アドレス $0000-$1FFF には、物理アドレス $000000-$001FFF が割り当てられます。MPR1 に $1A を書き込むと、論理アドレス $2000-$3FFF には、物理アドレス $034000-$035FFF が割り当てられます。ただし 6280 は $2000-$20FF をゼロページ、 $2100-$21FF をスタックとして使用するので、通常 MPR1 の区間にはワーク RAM を割り当てます。


図2 MPR0-MPR7 を介した物理アドレスのアクセス(クリックで拡大表示)

通常、MPR0 には $FF (I/O)、MPR1 には $F8 (ワーク RAM) を設定します。 PCE のハードウェアにアクセスするためには、たとえば VDC は $0000-$0003 などと書かれていますが、 これは MPR0 に $FF が設定されていることが前提です。ハードウェアや RAM のアクセスは 初期化などのために通常リセットしてすぐに行なわれるため、MPR0=$FF と MPR1=$F8 の設定はリセット直後に行ないます。

リセット時、6280 はリセットベクタ(論理アドレス $FFFE-$FFFF の 2 バイト)を読み出します。 このため、MPR7 はリセットで固定値に初期化される必要があります。具体的には、MPR7 はリセットで $00 に初期化されます。このため、物理アドレス $001FFE-$001FFF にリセットベクタを配置する 必要があります。MPR0-MPR6 はリセット前後で変化しません。電源 ON 時の MPR0-MPR6 の値は通常 $FF です。

MPR に値を書き込むには、TAMi 命令を使います。これは A レジスタの値を MPR に書き込むための命令です。 たとえば MPR0 に $FF、MPR1 に $F8 を書き込む場合は

LDA #$FF
TAM #0    ; MPR0 に $FF を設定 

LDA #$F8
TAM #1    ; MPR1 に $F8 を設定
とします。アセンブラによっては、 TAM #0 〜 TAM #7 ではなく TAM0 〜 TAM7 と個別の命令のように記述 する必要があるかもしれません。

目次へ戻る


(C) Ki 2010

inserted by FC2 system