[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ガゼルの塔」でディスクキャッシュとして使われているとか)。
なので、マッパー対応なソフトは、市販ソフトよりも、フリーソフトの方が多いと思います。
私のその他の改造とあわせた最新デザインソースは、上に戻ってダウンロードしてください。
[▲上へ]