flash memory cartridge - software 編

コマンドアドレス

コマンドを送るには flash memory の 0x2aaa と 0x5555 (共にA0-A14) と書き込むアドレスの3要素を同時に書き込む必要があります。

例1: MMC3

MMC3 の CPU memory bank は下記に設定します。

 cpu address|rom address    |page|task
 $8000-$9fff|0x02000-0x03fff|1   |write 0x2aaa
 $a000-$bfff|n * 0x2000     |n   |write area
 $c000-$ffff|0x7c000-0x7ffff|fix |write 0x5555, boot area
0x2aaa は cpu address $8000-$9fff を page1 に設定すると、 cpu address $8aaa にでてきます。0x5555 は固定領域の $d555 に出てきます。$a000-$bfff は書き込むアドレスとして、バンク切り替えをしながらすべての ROM イメージを転送する領域にします。

あとは、erase command, program command, polling wait などを繰り返しデータを書き込みます。このように 3 bank あると割と素直に書き込むことができます。

 ppu address|rom address    |page|task
 $0000-$07ff|0x02800-0x02fff|0x0a|write 0x2aaa
 $0800-$0fff|0x05000-0x057ff|0x14|write 0x5555
 $1000-$1fff|n * 0x1000     |n   |write area
PPU 領域に関しては CPU 領域に比べて bank の size が小さいので page 番号をうまく計算してコマンドアドレスを出します。

例2: MMC1 SLROM

MMC1 にはプログラムバンクが 2 つあります。しかし、固定領域を移動できるという特殊な機能を利用することでコマンドアドレスと書き込み領域を確保します。

 cpu address|rom address    |page|task
 $8000-$bfff|n * 0x4000     |even|write 0x2aaa + write area
 $c000-$ffff|0x3c000-0x3ffff|fix |write 0x5555
まず偶数ページ。これを書いた後に固定領域を変更します。

 cpu address|rom address    |page|task
 $8000-$bfff|0x00000-0x03fff|fix |write 0x2aaa
 $c000-$ffff|n * 0x4000     |odd |write 0x5555 + write area

次に奇数ページ。こんな感じに MMC1 の機能をフル活用して、辻褄を合わせます。

PPU 領域は 0x1000 byte の bank が2つ。結論から言うと 0x2aaa, 0x5555 を同時に出せるページ数がありません。よって command address A0-A14 タイプは書き込めません。 command address A0-A10 タイプも存在しており、これの場合は面倒くさい設定がいりません。

 ppu address|rom address    |page|task
 $0000-$0fff|0x01000 * n    |n   |write area + 0x2aa + 0x555
 $0000-$1fff|0x01000 *(n+1) |n+1 |write area

いままで command address A0-A14 タイプで説明してきましたが、 A0-A10 タイプでも互換性があるので書き込むことが出来ます。

面倒くさい A0-A14 タイプで説明した理由は DIP type の flash memory の有効活用を重視しています。SOP, QFP type の flash memory は入手が非常に容易ですが、現在の産業で需要がない DIP type は入手困難です。限られた flash memory を使い切るには古い PC マザーボードから外すなどの苦労が必要です。そういったデバイスを使うために書いています。

仮に大量の dip type の flash memory を売っているところを見つけたとしても買い占めることなく必要な人が使えるようにしてあげてください。これは筆者からの願いです。

ここまで書いて気づいたのですが、コマンド書き込みの途中にバンク切り替えをすると辻褄は合わせられるでしょう。ただ、スクリプト言語としての実装が困難なので現実的ではないと考えています。