[1chipMSX]

RAM 2MB化

※情報の正確さは保証できません。

1chipMSX には、32MB もの SD-RAM が搭載されています。
しかし、その 1/4 である 8MB のバンク1つしか使っておらず、しかもその全てを使用しているわけではありません。
かなりの空きがあります。

MSX のマッパーRAM は、16KB の RAM をセグメントとして、全てのセグメントに連番を振って管理しています。
64KB ある RAMスロットは、16KB が 4ページある空間として Z80 に接続されており、その4つのページごとに
マッパーレジスタを持っており、マッパーレジスタにセグメント番号を書き込むことで、該ページに該セグメントが
出現するという仕掛けです。

1MB の場合、64セグメントあります( 1MB = 16KB * 64 )。
マッパーレジスタは、8bit のレジスタなので、最大で 256通り(0〜255) の値を指定できます。
つまり、16KB * 256 = 4MB が最大容量となります。

1chipMSX のマッパーレジスタは、mapper.vhd にありますが、なんとこれ自身は既に 4MB 対応してあります。

マッパーが管理するアドレスは、MapAdr( 21 downto 0 ) ですが、MapAdr( 21 downto 20 ) が未接続なため、
下位 20bit である MapAdr( 19 downto 0 ) しか使われず、結果として 2^20 = 1MB の空間しか割り当てられていません。

これを MapAdr( 21 downto 0 ) の全て使うようにしてやれば 4MB に増えるし、MapAdr(20 downto 0) だけ使うようにすれば
2MB になります。

SD-RAM のアドレスバスに接続している場所は、ソース中の下記の場所です。

 CpuAdr(22 downto 20) <= "010"         when iSltMap = '1' else
             "110";
 CpuAdr(19 downto 0) <=  MapAdr(19 downto 0) when iSltMap = '1' else
          '0'   & SccAdr(18 downto 0) when iSltScc = '1' else
          "10"   & ErmAdr(17 downto 0) when iSltErm = '1' else
          "101"  & KanAdr(16 downto 0) when rom_kanj = '1' else
          "10010" & adr(14 downto 0) when rom_main = '1' else
          "100110" & adr(13 downto 0) when rom_extr = '1' else
          "100111" & adr(13 downto 0); --when rom_opll = '1'

注意すべきは、CpuAdr は、CPUからアクセスしようとしているアドレスを示すモノであって、VDPからのアクセスは含まれていない点です。
VDP は、bit22〜20 を "111" の固定値で扱ってるので、bit22〜20 が "000"〜"110" の空間は CPU 用のメモリになります。
マッパーRAM へのアクセスの際には、iSltMap = '1' になります。その他は、MAIN-ROM 等の ROM のフリをしてるところです。
ROM などは、bit22〜20 が "110" のところに割り当てられているため、マッパーRAM として使えるのは "000"〜"101" の 5MB の空間になります。

※SD-RAM は4バンクに別れていて、1chipMSX ではバンク0 の 8MB空間しか使ってません。



4MB化改造方法

bit22〜20 の指定部分だけ変更すれば対応できます。

 CpuAdr(22 downto 20) <= "010"         when iSltMap = '1' else
             "110";
↓修正
 CpuAdr(22 downto 20) <= '0' & MapAdr(21 downto 20)  when iSltMap = '1' else
             "110";

ただし、実際のところ、4MB 搭載されたMSXは市販されなかった(たぶん (^^; )ためか、対応できていないアプリが多いです。
特にセグメント数を数えたときに 256 個(8bit を溢れる値)になるため、4MB を考慮していないアプリでは、不都合が出ます。

SCMD も例外ではなく、セグメント数を 0 と誤認して動きませんでした。
DOS2 は正常に認識するようで、4MB の RAMDISK 作成に成功します。
私自身は、SCMD を動かしたいのと、RAMDISK は使わない(SDカードが十分速い)ので、4MB化は諦めました。


2MB化改造方法

改造は上と同様です。

 CpuAdr(22 downto 20) <= "00" & MapAdr(20)  when iSltMap = '1' else
             "110";

これで 2MB になります。セグメント数も 128 なので、普通に作られたアプリなら不都合は出にくいでしょう。
しかし、「1chipMSX を作った人は、不都合のあるソフトがあるので 1MB にした」という噂もちらほらと見かけた
ので、もしかすると有名なフリーソフトなどで不都合が出るアプリがあるのかもしれません。
私のところで使ってるソフトでは、不都合は出ていないので、2MB化に落ち着きました。


余談ですが、海外では 128KB 等が普通だったようですが、日本では MSX2+ まで 64KB (マッパーRAM無し) が一般的
でした。なので、国内で市販されていたソフトは、ほとんどマッパーRAMに対応していません。
turboR から 256KB以上が標準になったので、turboR 発売後に発売された一部のゲームソフトでは、マッパーRAMに
対応しているモノもありました(「Xakガゼルの塔」でディスクキャッシュとして使われているとか)。
なので、マッパー対応なソフトは、市販ソフトよりも、フリーソフトの方が多いと思います。


私のその他の改造とあわせた最新デザインソースは、上に戻ってダウンロードしてください。


[▲上へ]