「ROMの拡張」の編集履歴(バックアップ)一覧に戻る

ROMの拡張 - (2014/06/13 (金) 23:17:11) のソース

<p>ROMの拡張方法<br /><br />
SDKシリーズはHiROM・4MB(32Mbit)のROMが使用されておりますが、これを拡張する方法についてまとめました。<br /><br />
○用意<br />
ROM構造に関する知識(といってもムズカシイことは知らなくていい)<br />
バイナリエディタ<br />
 </p>
<p>○ROM構造に関する知識<br />
SDKシリーズは、HiROMというマッピング構造をとっているのですが(HiROMとLoROMではメモリへのマッピング方法が異なる)、HiROMでは0x10000バイトを1つのまとまりと考えます。これをバンクと呼んでいます。バンクナンバーは、6桁アドレスの上2桁です。そこで、このページでは0xXXYYYYをバンクXX、アドレスYYYYと呼んだり、XX;YYYYと書いたりします。これ以上の知識はほとんどいりません。<br /><br />
○拡張手順(4MB→6MB)<br />
①40;0000にシークして、そこから同バンク7FFFまでとりあえず00で埋めます。ここは後でデータ用として使えます。<br />
②00;FFD5を31から35に変更(フォーマット変更)<br />
③00;FFD7を0Cから0Dに変更(サイズ変更)<br />
④40;8000~40;FFFFに00;8000~00;FFFFの情報をコピーする。<br />
⑤41;0000~5F;FFFFを00で埋めて完成。ここはデータ用に使えます。<br /><br />
○拡張手順(4MB→8MB)<br />
基本的に上と同じです。違うのは⑤で7F;FFFFまで使えるところだけです。<br /><br />
○拡張領域に置くことができるデータ<br />
いまのところ、アドレス参照プログラムを変えることはできないので、シーケンスやマップデータなど、バンクとアドレスの6桁で指定しているデータのみ移動できます。スプライトやスプライト配置データなどは、参照先バンクが固定されてしまっているのでプログラムを変えないと移動できません。</p>
<p> </p>
<p>データ移動の際、ほぼ100%アドレス指定をすることになるでしょうから、ROMとRAMのアドレスの対応を示しておきます。</p>
<p>
ROMはRAMのいくつかの場所に分散してミラーリングされますが、このうちROMの最初の48Mbit(4MB)はRAM:C0;0000~FF;FFFFにミラーされます。次の16Mbit(BANK40~5Fの2MB)はRAM:40;0000~5F;0000にミラーされます。拡張領域はROMとRAMのアドレスが同じなので分かりやすいですね。8M拡張の場合、残り2MBのミラーも必要ですがどこにミラーリングされているのか分かりません。もしかしたらマトモに読めないかもしれません。そもそも公式が出している最大容量が6MBなので、それにあわせたマッピングになっている可能性があります。</p>
<p>
なお、RAMのバンク00~2Fの下0x8000バイトには、RAMのバンクC0~EFのデータが分散的にミラーされていて、また、RAMのバンク30~3Fの下0x8000バイトにはRAMのバンクF0~FFのデータが分散的にミラーリングされていて、データアクセスの高速化が図られています。この影響で、拡張領域にあるデータは、RAMの複数の箇所にミラーされていないので読み出し速度が遅くなります。このことを念頭に拡張領域にデータを設置するよう心がけてください。</p>
<p>
なお、現行のDK2,3のエディタはROMサイズが0x400000で無いROMを通すとエラーを吐いて読み込まないので、一通りの改造が終わった後に拡張領域にデータをおくようにしてください。</p>
目安箱バナー