上に戻る
1.ROM拡張と、その問題について
概要
 ロックマン4はMMC3というメモリコントローラーが入っており、プログラムサイズは512Kバイト、キャラクタROMは無しです。
 512KバイトのROMは、当然、製品の段階でその大部分が使い果たされており、好きにコーディングすることは出来ません。
 ですが、もし、拡張できたら、ガリガリいろんなコードを書いていけます。
 そんな甘い誘惑に乗せられROM拡張を企むわけです。
やり方
 実は、以前カービィで拡張をやったことがあったのでした。ウェブ上では公開していませんが。
 それと同じやり方が通用するはずです。カービィもMMC3ですので。
 では、具体的なやり方を書いていきます。
 ロックマン4は、プログラムバンク00〜3Fまで存在します。
 00 01 ……(略)……3D 3E 3F
 さて、単純に拡張を考えます。すなわち、後ろに空のバンク**を付け足します。
 00 01 ……(略)……3D 3E 3F ** ** ** ……(略)…… ** ** **
 **は40個あります……さて、こうして、エミュで実行してみましょう……動きません^^
 これでは不十分でして、実はMMC3は、プログラムROMの末端を、メモリマップ上の指定位置に常にマップします。
 要は、後ろのほうは崩しちゃダメなのです。つーことで、こうします。
 00 01 ……(略)……3D 3E 3F ** ** ** ……(略)…… ** 3E 3F
 3E 3Fを後ろに複製するわけですが、中ほどにも残しておいた方が無難です。
 これで、いくらかのエミュでは無事に動作するはずです。
 **の分……都合3E個のバンクが拡張されました。
拡張スペースはどうつかう?
 せっかく拡張しても使わなければ意味がありません。
 こうして拡張したスペースを使う方法はいくつか考えられます。
 非常にラッキーなケースとしては、バンクとアドレスで、24ビットのアドレスが指定されるデータの格納に利用することです。
 24ビットのアドレスを、拡張したスペースに向けるだけで使えます。

 拡張したスペースにプログラムをガリガリ打っていくにはどうしたらいいでしょうか。
 実行位置を、拡張したスペースに移さないといけません。
 その為に、バンクをまたいだジャンプやコールのルーチンが元からあればそれを利用して拡張スペースに制御を渡せます。
 ……が、ロックマン4にはそういうのは無いようですので……
 しょうがないので、システム部であるバンク3E-3Fをいくらか潰して、ロングジャンプルーチンを作成します。
 私のハックでは、レインフラッシュのスプライト処理ルーチンを潰しました。
 コレで、任意バンクにジャンプすることが出来るサブルーチンを書けます。
 そして、自作ルーチンをガンガン実行させることが出来ます。
問題点
 さて、こういう風に、非常に「有用」に思えるROM拡張ですが、いくつか問題点があります。
 まず、逃れられない問題として、そのままではIPSが作れないということです。
 理由は簡単で、元のROMから、拡張したROMにIPSを作ると、例えば、上のロックマンの場合ですと、3E-3Fが丸ごとIPSに含まれてしまいます。
 実は、これはまだマシなほうで(それでもダメですけど)他のソフトの場合はより深刻な問題が起こります。
 VROM搭載ソフトの場合、プログラムを拡張するとき、必然的にVROMのデータは後ろにずれ込みます。
 その状態でIPSを作ると……?
 当然、3E-3Fのような部分だけならず、グラフィックデータ丸ごとIPSに含んでしまいます。
 こんなものを公開したりできるわけないので、何か代案を考える必要があります。
 そのためには、独自のパッチソフトを作って、それでパッチを当てるようにすればOKです。
 独自形式なら、「後ろにずらす」といったコマンドで対応できますし。

 まだ問題があります。それは、拡張という倫理(?)的な問題です。
 ハックロムの一つの醍醐味が、拾捨選択にあると思います。
 ROM拡張を使うと、多くのものを捨てることなく、継ぎ足すことが出来ます。
 こういうスタイルを「汚い」という考え方もあるのではないでしょうか。
 自分も少し悩んだのですが、コレもハックロムのタイプの一つだと考えることにしました。
 まぁ、別枠としてみる分には問題ないであろう……と。RTAとTASみたいに。

 ……ココまでは、まぁよかったのですが……もう一つまだ問題がありまして……
破綻?
 長らくこの拡張の方法は問題が無いと思っていました。
 しかし、某エミュレータ……具体的にはNestopiaというエミュレータにおいて、このようにして拡張したROMが正しく動きませんでした。
 Nestopiaは、割と新出の高い再現性のエミュレータですので、Nestopiaを疑うのはずいぶんとアレな発想です。
 恐らく、私が何かおかしなことをしてしまったために動かないのでしょう。
 で、MMC3について調べなおしました。
ttp://www.tripoint.org/kevtris/mappers/mmc3/index.html
 このURLに書いてあるのですが……
 どうやら、存在するMMC3が載ったボードは、プログラムサイズが512Kバイトが限界のようなのです。
 私には、コレが、MMC3の限界であるのか、採算などの都合で偶然512Kを限界としたのかはわかりません。
(レジスタ8001の6・7ビット目は、実際に機能するのでしょうか……?)
 しかし、1024Kに拡張することは「間違い」であったことは確かなようです。
 まぁ多くのエミュレータで動くには動くので、どうなのかは良くわかっていないのですが、実機では決して動かないような類の物なのかとも思っています。

 ……なのですが、悲しいことに、拡張してロックマン4のハックロムを作ってきてしまったのです(涙)
 いまさら元の容量に収めるなんて事は困難です。
 つーことで、1024Kに拡張したハックロムとして続行しようと思っています。
(70)2008年9月8日 プレさ兵衛
inserted by FC2 system