<DSメモリー拡張カートリッジとは?>
DSでブラウザ(オペラ)をうごかすためのソフト「ニンテンドーDSブラウザー」(オンライン販売・\3800)に同梱されるDS用の拡張メモリーです。DS用の拡張メモリーですが、GBAスロットに挿入して使用しますので、GBAでも使用できるはずです。


当然GBAのゲームカートリッジと同一形状です。
(DS Lite用のDSブラウザーを購入すると、カートリッジの形状が異なるのでGBAには使用できません)


EM64と書かれたBGAパッケージのICがひとつだけ。
64と書かれているので64Mbitの大容量を期待、、。

<メモリーチップの解析>
DS用のカセットとは言え、アクセス方法は全くGBAと同じなので、メモリマッピングなどを調べる必要があります。
実際にDSでブラウザーを起動させ、どのような感じでメモリーアクセスしているか見てみます。
実際に解析するに当たってはこのHPで公開している「カメレオンUSB+ロジアナ」を使用します。100MHz、32チャンネルの解析が可能です。


メモリーカセットの端子全てをロジアナに接続して全ての信号を調べます。


ロジアナコントロールソフトの画面。DSから実際にアクセスされている様子が見れる。

また、ロジアナで解析した結果を検証するために、実際にGBAに接続します。そしてアクセス用のサンプルプログラムをブートケーブルを使用してGBAの内部RAMに転送して、実際に思った通りにアクセスできるか検証しました。

<EM64メモリー仕様>
解析の結果、嬉しいことに64MbitのSRAMであることが判明しました。消費電力もかなり少なく、待機時には1mA以下で、アクセス時も10mA程度でした。DS本体のメインメモリが32Mbitであることを考えると、64Mbitというのかなりの大容量です。

容量 SRAM64Mbit + ROM(ヘッダ情報)
RAMアドレス 0x9000000-0x97fffff (ARM7)
ROMアドレス 0x8000000- (ARM7)
RAM有効レジスタ 0x8240000 (ARM7)
0x0000を書き込むと無効
0x0001を書き込むと有効

表を見ていただくとわかりますが、通常のGBAゲームカセットと同様に0x8000000からのアドレスにROMが配置されています。このROMの中身は、GBAのゲームカセットなどが持っているヘッダ情報とは異なるヘッダが格納されています。このヘッダ情報を見てDSはDS専用のカセットがスロットに挿入されていると判断するようです。

<GBAで使用するには>
容量的は64Mbitありますので、市販ゲームも動作するはずです。(初期に発売されたFZEROなどは32Mbit、ポケモンルビーが64Mbit)
ですが通常のROMカセットは0x8000000番地から開始していますので、RAMアドレスが0x9000000から開始している問題を何とかする必要があります。

0x8000000と0x9000000を切り替えるのはアドレスのA23です。ですのでCPUからのアドレスA23がいかなる値(1 or 0)であっても、EM64側には'1'でアクセスされているように見せれば、0x8000000の空間にもRAMが現われます。つまりA23信号を切断して、EM64側のA23を常に'1'に保ってやればOKです。
ところが、この方法にはひとつの問題点があります。それは"RAM有効レジスタ”が0x8240000にあるため、"RAM有効レジスタ”にアクセス出来なくなってしまいます。

そこで外付け部品が必要になりますが、0x8000000〜の空間と0x9000000の空間を入れ替えてやることにします。この方法であれば、"RAM有効レジスタ”は0x9240000にありますのでRAMを有効にすることも可能です。具体的にはCPUからのA23信号をTTLで反転してRAM(EM64)に入力してやれば良いのです。

GBAで拡張メモリーを使用できるように改造するのは良いのですが、DSで使用できなくしてしまうのは残念です。そこで切り替えスイッチをつけて、A23信号を元に戻せるようにすることにします。DSで使用する場合はスイッチを切り替えればOKです。

実際に実験していて気づいたのですが、"RAM有効レジスタ”は一度書き込むと、電源を切っても20-30秒は内容が消えないようです。ですのでTTLを使用しなくても、"RAM有効レジスタ”に書き込む間はA23を直結して使用し、GBAのプログラムを書き込んで実行するときにA23を'1'に保つ改造でも使用することが出来ます。(スイッチ切り替えの手間が発生して不便ですけど)

あと気をつけなくてはならないのは、拡張メモリーカセットにはゲームのセーブデータを書き込むデバイスが内臓されていませんので、ゲームのセーブは正常に動作しません。また当然ですけど、RAMカセットですのでGBAの電源を切ると書き込んだ内容が消えてしまいます。
ですが、F2Aなどのフラッシュカセットと比べてメリットもあります。それはゲームの書き込み(転送)速度が高速なことです。例えば32Mbitのゲームをフラッシュカセットに書き込むと40秒近くかかりますが、RAMカセットでは半分の20秒以下で完了します。また、フラッシュカセットと比較して消費電力も少ないようです。ですので実機を使ったGBAプログラムの開発などには役に立つかもしれません。
(待機時の消費電力が少ないので、電池やキャパシタを内蔵させてバックアップさせることも可能なはずです)

<改造手順 〜TTL使用しない版〜>
まず基板のA23信号をカットします。カットする場所はエッジ(金メッキされている部分)の直上ぐらいが良いでしょう。
そしてカットした上のレジスト(緑色の塗料)部分をカッターの先端などで剥がして半田が乗りやすくします。


そしてセロテープ(熱で溶けるので別のもののほうが良いかも?)などで端子の一部を覆って、フラックスを縫って半田を盛ります。
テープで覆うのは半田が端子(金メッキ部分)全体に回らないようにするためです。


あとはこんな感じで配線すればOKです。(説明手抜きですね)
写真上に見えているのがスライドスイッチです。

<改造手順 〜TTL使用する版〜>
基板のパターン(A23)をカットして半田を盛るとこまでは上記の手順と同じです。

TTLは秋葉の入手性を考慮して6回路入りの74VHC04(74LCX04も可)を使用しました。
(秋葉原の千石電商で\40で購入)
(手持ちの74HC04も試しましたが、スピードが遅く使用できませんでした。)


不要なピン(2,4,8,10,12)はカットして、使用するピンは伸ばしておく。


インバータは6回路入りで、5回路未使用です。未使用の入力ピン(1,3,9,11,13)はGNDに接続しておきます。



これで完成です(説明手抜き)

<ツールの対応>
devman_usb_v36.exebtcons_usb_v36.exeの両方のツールで対応しています。

TTL使用の改造を行った場合は、スイッチをGBA側にセット。TTL未使用の改造を行った場合は、スイッチをDS側にセットします。
拡張メモリーをGBAに挿入します。ブートケーブルUSBでPCとGBAを接続してGBAの電源を入れます。
devman_usb_v36.exeを起動すると拡張メモリーを認識して下記の画面が表示されます。(RAM 64Mを確認)

TTL未使用の改造を行った場合は、この状態でスイッチをGBA側に入れます。
書き込みボタンを押して、書き込むGBAプログラムを指定すれば書き込みが開始されます。
書き込み完了後、書き込んだGBAプログラムが開始されます。
(マルチROMの指定は出来ません)

btcons_usb_v36.exeの使用方法は、引数に”em”を指定します。
(例 ”btcons_usb_v35 em fzero.gba”)