上に戻る
3.BGMを任意バンクに配置
概要
 ロックマン3〜6のオーディオデータは、3つのプログラムバンク(説明上A,B,Cとしておく)にドライバごと詰められています。
 Aにはドライバが存在し、またデータの一部も存在。B,Cは丸ごと譜面データとなっております。
 もしドライバをあちこち弄れば、A,B,C以外バンクに置かれたBGMデータも再生することが可能になります。
 ROM拡張と併用して、拡張したスペースのBGMデータを再生するようにすれば、容量を気にせずに、ガンガンBGMを追加できますね。
BGMのアドレス指定
 いろいろな事情があるのでしょうが、3つのバンクは、8000-9FFF、A000-BFFFの2箇所にセットされます。
 うち、8000-の方は、ドライバの入った「A」で固定されます。
 A000からのほうに、アドレスにあわせて、BやCがセットされます。
 BGMのアドレス自体は、16ビットで表されており……

・アドレスが0000-BFFFまでのとき
 A000-に「B」がセットされます。
・それ以外のとき
 A000-に「C」がセットされます。さらに、読み込む瞬間に2000引いたアドレスから読み出します。
(これで正しく「C」から読み出せる)

 後者ですが、例えば、C012であれば、A000-に「C」をセットして、さらに、2000引いたA012からデータを読み出します。
 確かに、A000-BFFFにセットされた「C」から読み出していますね。
BGMのアドレス指定のスキを突く
 アドレスE000-FFFFを指定するとどうなるでしょうか。
 このときはA000-BFFFに「C」がセットされますが、2000引いた位置からアクセスしても、C000-DFFFにアクセスすることになり、「C」からは読み出せません。
(ちなみに、MMC3の都合上固定される、あるプログラムバンク上のデータを読んでしまう)
 こういったアドレスは、ロックマンのサウンドドライバでは未使用です。
 逆に、この未使用アドレス指定を用いれば、元からあるサウンドを保持したまま、任意のバンクからデータが読み出せそうな気がします。
方針
 サウンドドライバをガリガリ弄るわけですが、プログラムを追加したりするスペースが欲しいものです。
 ということで、「A」に存在する、曲番号00と01のBGMデータを潰します。(名曲なんですけどねw)
 これで、プログラムをするのに十分なスペースが開いたはずです。
 あとはガリガリアセンブルします……
 一例のアセンブリのソースを以下に示します。一応ちゃんと動いているように思えますが……
   これです
 えーと、アセンブリ公開したことがない上に、複数のアセンブラなんて使ったことがないので、公開するときコレでいいのか良くわかっていないです。
 たぶん、アセンブラ毎に命令の違いとかあると思いますが、その辺はアドリブでカバーしてください。
 ちなみに、このソースでは、任意バンク配置はBGMのみのサポートとなっており、効果音は無理です。
 代わりに、曲数がたぶん127曲くらいまで可能になっています。
問題点
 またまたですが、倫理(?)的な問題があります。
 コレまでと同様に、とりあえず、それは許すことにします。

 他の問題点は、曲00と01は潰してしまったので、かならずその2曲は新たな場所にデータを作る必要があります。
 例えば、ROM拡張はしないが、この仕組みだけ使うとなると、どこに曲を確保するのかという難題に取り組む必要が出てきます。
 ということで、やはりMMC3の限界を超えずにこの方法を使うのは、難しいですね。
(72)2008年9月15日 プレさ兵衛
inserted by FC2 system