上に戻る
2.まずはプログラムが正しく走らないとね……
なんか自分の環境だと「とね……」が改行されてるなぁwまぁいいか
概要
 まずは、プログラムだけでもMMC3で走っていたのと同じようにMMC5にしても走らせる必要があります。
 画像系の調整は、二の次となります。
 プログラムを正確に走らせる上で大事なのは、
・最初に実行されるプログラム付近
・プログラムバンクの切り替え
 でしょうか。
リセット位置
 ファミコンは、メモリアドレスFFFA-FFFF当たりに書かれたデータを割り込み先に利用します。
 また、最初に8000-FFFFにどうプログラムROMがマップされるかは、MMC次第です。
 しょっぱなから外していたら話にならないので、まずはココを調整します。
 実は、今回は特に何もする必要はないのですが……

 MMC3においては、どうも、電源投入時はC000-FFFFまでに、プログラムROMの最後の4000がマップされるようです。(未確認ですけどね)
 一方、MMC5においては、手持ちの資料によりますと、「全てのROMバンクは、ROMカートリッジの最後の8Kバンクがセットされる」そうです。
 つまり、40個のプログラムROMを持つ場合、MMC3では……
 ??-??-3E-3F
 MMC5では
 3F-3F-3F-3F
 となるのでしょうか?まぁ、こうなるとしておきます。

 さて、ロックマン4のリセット割り込み位置は、FE00ですので、上手いこと、MMC3であろうがMMC5であろうが、同じプログラムがセットされる位置から開始されます。
 その付近で、3番目のプログラムバンク(C000-DFFF)を、(上の場合は)3Eにセットすれば良いですね。
 実際には、MMC5では、プログラムバンクの「切り方」を指定したりする必要があるようです。
 とりあえず、コレで、プログラム開始位置は正しくなりそうです。
プログラムバンク切り替え
 MMC3においては、$8000にコマンドを書き込み、$8001に値を書き込むと、その値を利用してコマンドを実行するらしいです。
 $8000に6を書き込んでから$8001に値を書き込むと「最初の」プログラムROM切り替え、
 $8000に7を書き込んでから$8001に値を書き込むと「2番目の」プログラムROM切り替え
 をするそうです。
 「最初の」「2番目の」……実はMMC3においては、2000毎のプログラムバンクの区切りのうち、2箇所は固定しないとダメで、残りの2箇所に対して「最初の」「2番目の」という風になっています。
 固定の仕方も2通りくらいあるらしいですが、省略。

 一方、MMC5においては、かなりわかりやすい方法でプログラムバンク切り替えができ、
 $5114-$5117に値を書き込むだけで、それぞれ8000,A000,C000,E000のプログラムバンク切り替えが出来るらしいです。($5117→E000の切り替え は違うかも?)
 ただし、書き込む値の最上位ビットは1にする必要があります。

 ロックマン4においては、それほど多くの場所でプログラムバンクを切り替えているわけではありません。
 ほとんどのルーチンが、バンク切り替え用のサブルーチンを通してバンク切り替えを行なっているので、そのバンク切り替え用のサブルーチンを書き換えればほとんど問題解決です。
 実は、サウンドドライバ内でもバンク切り替えしているので、それも必要ですけど。
結局どう弄ったのよ?
 BANKORG_Dってのは、バンクと書き込み位置を指定しています。
 BANKORG_D $7FFE39なら、バンク7FのアドレスFE39という意味。

 リセット時の処理
BANKORG_D $7FFE39
lda #$03
sta $5100
lda #($7E|$80)
sta $5116
(この後に、リセット用のルーチンに飛ばす。
 そこでMMC5の初期化をする。(次回の話))
 5100で、プログラムバンクの「切り方」を調整?たぶん必要だと思う。

 汎用バンク切り替え用ルーチン
BANKORG_D $7FFF39
lda <$f5
sta <$f3
ora #$80
sta $5114
lda <$f6
sta <$f4
ora #$80
sta $5115
jmp $FF55
 普通はここまでを通るのだが、サウンド処理中かなにかだと次のほうに行く??
BANKORG_D $7FFF60
nop
nop
nop
nop
nop
lda #($1E|$80)
sta $5114
nop
nop
nop
nop
nop
lda #($1F|$80)
sta $5115

 サウンドドライバ内での切り替え
BANKORG_D $1E804C
nop
nop
nop
nop
nop
lda #($1D|$80)
sta $5115

BANKORG_D $1E8059
nop
nop
nop
nop
nop
lda #($1F|$80)
sta $5115
 MMC5の方が、シンプルな指定方法なので、ラクにコードを変更できました。
(コードが短くなった分nopで調整している箇所があり)
 逆だったらと思うと恐ろしくてしょうがない……
(77)2008年9月20日 プレさ兵衛
inserted by FC2 system