MSXのゲームをセガ・マスターシステムで動かしてみよう(設定ファイルの EXTBANK の書き方)

複雑でわかりにくく、説明も長くなるので、こちらに別ページとしてまとめました。

繰り返しになりますが、「どうしても自分でメガROMを変換してみたい」というような方以外は読まなくて構いません。

「わかりやすく説明する」ということも諦めているので、ところどころ、文章の意味がわかりづらいかもしれません。すみません。

メガROMにおけるバンク切り替えとは

このページを読んでいるようなマニアックな方はご存知かもしれませんが、簡単に書いておきます。

MSXのメガROMタイトルの多くは 8KB を1つの「バンク」として管理しており、それを切り替えることで大容量のデータにアクセスしています(「ハイドライドII」など、16KBバンクのMSXタイトルも存在しますが、一旦スルーで)。

しかし、SMSのメガROMは 16KB を1バンクとしているため、プログラムのコンバートだけでは動作させることができません。

そこで MSXtoSMS では、「MSX版の2つの8KBバンクを結合して新たな16KBバンク(EXTBANK)を作り、SMS版では”16KBバンクのメガROM”として動作させる」ということを行っています。

【書式1】 EXTBANK = 8KBバンク番号 + 8KBバンク番号

例えば、MSXのとあるメガROMタイトル実行時、タイトル画面からエンディングまでのバンクの状態が以下のように移り変わる場合、SMS版での動作はこうなります。

MSX実行時
前半8KBバンク
8000H-9FFFH
MSX実行時
後半8KBバンク
A000H-BFFFH
SMS実行時
16KBバンク
8000H-BFFFH
タイトル画面
表示中
BANK01 BANK02 BANK01+BANK02を結合した
EXTBANK01 に切り替える
ステージ1
プレイ中
BANK02 BANK03 BANK02+BANK03を結合した
EXTBANK02 に切り替える
ステージ2
プレイ中
BANK02 BANK04 BANK02+BANK04を結合した
EXTBANK03 に切り替える
エンディング BANK01 BANK05 BANK01+BANK05を結合した
EXTBANK04 に切り替える

EXTBANK01~EXTBANK04は事前に作成しておく必要があるため、このタイトル用の設定ファイルには以下のように記述します。

EXTBANK = 01+02 EXTBANK = 02+03 EXTBANK = 02+04 EXTBANK = 01+05

EXTBANK の番号については内部的に計算してくれるので記述する必要はありません。

これだけで良いなら簡単!…と思うかもしれませんが、そもそも、最も大変なのが「前半バンクと後半バンクがどういう状態なのか知る」ということなのです。

上の例でいえば「タイトル画面表示中は、前半がBANK01、後半がBANK02になっている」というようなことは、MSXのデバッガでバンクの状態を見るというようなことをしなければわかりません。

「MSXtoSMS でメガROMを動作させるための作業の99%は、バンク切り替えの情報を調べること」ともいえます。

地道で面倒で、苦労が報われないこともあるので、本当にオススメしません。

グラディウス用の設定ファイルを実際に作成してみる

「グラディウス」はコナミMSXタイトル初のメガROMでリリースされ、8KBバンク☓16個=128KB(1Mbit)のROMを使用しています。

まず、ROMTYPEだけを記述した、たった1行の設定ファイルを作成し、これを使用してMSXのROMイメージからSMS用ROMイメージに変換してみましょう。

ROMTYPE=1 ;MEGAROM KONAMI

変換作業の詳細は省略しますが、作成されたSMS用ROMイメージをエミュレーターで実行すると、以下のように表示されて動作が停止すると思います。

MSXtoSMSシステムプログラムは、未定義のバンクの組み合わせがリクエストされると、警告を表示して停止するようになっています。

「前半8KBがBANK02・後半8KBがBANK00という組み合わせが未定義」ということなので、設定ファイルに EXTBANK の定義を追加します。

ROMTYPE=1 ;MEGAROM KONAMI EXTBANK=02+00

この設定ファイルでもう一度変換作業を行い、作成されたSMS用ROMイメージをエミュレーターで実行すると、今度は以下のように表示されて動作が停止します。

先ほどの警告は出なくなったので、一歩前進です。

「前半8KBがBANK02・後半8KBがBANK03という組み合わせが未定義」ということなので、設定ファイルに以下のように追記し、再度変換&実行してみましょう。

ROMTYPE=1 ;MEGAROM KONAMI EXTBANK=02+00 EXTBANK=02+03

「前半8KBがBANK07・後半8KBがBANK03という組み合わせが未定義」だそうです。設定ファイルに行を追加しましょう。

これを繰り返して、警告が出なくなるまで設定ファイルに EXTBANK を定義していきます。

ROMTYPE=1 ;MEGAROM KONAMI EXTBANK=02+00 EXTBANK=02+03 EXTBANK=07+03 EXTBANK=07+08 EXTBANK=02+08

5行記述したところで、KONAMIロゴが出ました。

…が、すぐに警告が。

モードやステージなど、バンクは頻繁に切り替わるので、全ての組み合わせを把握するにはゲームを隅々までプレイする必要があります。

引き続き警告に対応して…

ROMTYPE=1 ;MEGAROM KONAMI EXTBANK=02+00 EXTBANK=02+03 EXTBANK=07+03 EXTBANK=07+08 EXTBANK=02+08 EXTBANK=09+03 EXTBANK=09+0A EXTBANK=07+0A EXTBANK=09+08 EXTBANK=02+0A

10行記述で、タイトル画面とデモ画面が表示され、サウンドも鳴りました。少し感動しますね。

さらに警告に対応していきます。

ROMTYPE=1 ;MEGAROM KONAMI EXTBANK=02+00 EXTBANK=02+03 EXTBANK=07+03 EXTBANK=07+08 EXTBANK=02+08 EXTBANK=09+03 EXTBANK=09+0A EXTBANK=07+0A EXTBANK=09+08 EXTBANK=02+0A EXTBANK=00+04 EXTBANK=05+03 EXTBANK=05+06 EXTBANK=07+06 EXTBANK=05+08 EXTBANK=02+06 EXTBANK=0B+03 EXTBANK=0B+0C EXTBANK=02+0C EXTBANK=07+0C EXTBANK=0B+08

21個の EXTBANK を定義したところで、ゲームをプレイすることができるようになりました。

あとはひたすらプレイして、バンクの組み合わせに漏れがないか潰すだけなのですが、その際に役立つのが チート「デバッグモード」です。

SMS本体のPAUSEボタン(エミュレータの場合はSPACEやENTERなどにアサインされていると思います)を押すと、「デバッグモード」に入ることができます。

ゲーム中、特定のアドレスに特定の値を書き込むことで、無敵や残機増加、ステージセレクトなどもできたりするので、これを駆使してゲームを隅々までプレイしてバンク警告表示を見つけ、潰していきましょう。

(どのアドレスにどのデータを書き込むと良いかということについては、「msx cheat」で検索したり、MSXエミュレーター「blueMsx」の「Trainer」を見るとわかりやすいと思います)

ちなみにMSX版グラディウスでは、E200Hに03Hを書き込むことで無敵状態が作れるので、これを使って全ステージクリアできるか確認しました。

以上でグラディウス用の設定ファイルの作成は終了です。

基本的には、グラディウス以外のMSXのメガROMタイトルについても、同様の作業を行うことで設定ファイルを作成することができるので、やる気のある方はぜひチャレンジしてみてください。

【注1】RAM8KBで動作するMSXのメガROMタイトルはかなり限られているので、チャレンジする前に必要スペックの確認を忘れずに。

【注2】EXTBANK は 4MbitのEP-ROMを使う場合でも31個までしか定義できません。31個で収まらない場合は、この後で説明する「EXTBANKの最適化」に挑戦するか、諦めましょう。

EXTBANKの最適化について

※ ここから先は、ごく一部のチャレンジャーの方以外は、全く読まなくて構いません ※

グラディウスでは、最終的に21個の EXTBANK を定義することで動作するようになりました。

16KBバンク☓21個=336KB。元のMSX版が1Mbit(128KB)なので、SMS版は3倍近いROM容量が必要ということになります。

今回は収まりましたが、組み合わせが多いタイトルによっては、EXTBANKの最大個数である31個を超えてしまうこともありそうです。

そのような場合に行うのが「EXTBANKの最適化」です。

実は、グラディウスで定義した21個の EXTBANK のうち、実際は必要のない(使われることのない)組み合わせが多数存在します。

例えば、MSX版グラディウスでは、以下のようにバンク切り替えを行っていたりします。

★プログラムA 4076: LD HL,0F0F1H 4079: LD A,01H 407B: LD (6000H),A ; 6000H-7FFFHに BANK01 407E: LD (HL),A 407F: INC A ; Aを1増やす 4080: LD (8000H),A ; 8000H-9FFFHに BANK02 4083: INC HL 4084: LD (HL),A 4085: INC A ; Aを1増やす 4086: LD (0A000H),A ; A000H-BFFFHに BANK03

コナミのメガROMでは 4000H-5FFFH は必ずBANK00に固定されるので、この部分が呼ばれると、4000H-7FFFHの16KBは 「BANK00+BANK01」、8000H-BFFFHの16KBは 「BANK02+BANK03」になります。

また、以下のようにバンク切り替えを行っている箇所もあります。

★プログラムB 422F: LD HL,0F0F1H 4232: LD A,04H 4234: LD (6000H),A ; 6000H-7FFFHに BANK04 4237: LD (HL),A 4238: INC A ; Aを1増やす 4239: LD (8000H),A ; 8000H-9FFFHに BANK05 423C: INC HL 423D: LD (HL),A 423E: INC A ; Aを1増やす 423F: LD (0A000H),A ; A000H-BFFFHに BANK06

この部分が呼ばれると、4000H-7FFFHの16KBは 「BANK00+BANK04」、8000H-BFFFHの16KBは 「BANK05+BANK06」になります。

この2箇所のプログラムを見る限り、EXTBANKは以下の4パターンで良いはずです。

EXTBANK=00+01    ; プログラムA実行後 EXTBANK=02+03    ; プログラムA実行後 EXTBANK=00+04    ; プログラムB実行後 EXTBANK=05+06    ; プログラムB実行後

しかし、プログラムAの後にプログラムBが呼ばれた場合、4239番地実行後の一瞬だけ「BANK05+BANK03」のタイミングが存在するため、警告表示が出てしまいます。

同様に、プログラムBの後にプログラムAが呼ばれた場合、4080番地実行後の一瞬だけ「BANK02+BANK06」のタイミングが存在するため、警告表示が出てしまいます。

これらの警告表示を素直にEXTBANKに追加すると以下のようになります。

EXTBANK=00+01    ; プログラムA実行後 EXTBANK=02+03    ; プログラムA実行後 EXTBANK=00+04    ; プログラムB実行後 EXTBANK=05+06    ; プログラムB実行後 EXTBANK=05+03    ; プログラムA実行後にプログラムB実行中 EXTBANK=02+06    ; プログラムB実行後にプログラムA実行中

もちろん、これでも正しく動作するのですが、無駄なEXTBANKを定義することになってしまうので、以下のような書式が用意されています。

【書式2】 EXTBANK = 8KBバンク番号 + 8KBバンク番号 : 8KBバンク番号 + 8KBバンク番号 , 8KBバンク番号 + 8KBバンク番号 , ...

「:」の後に記述したバンクの組み合わせがリクエストされた場合、先頭のバンクの組み合わせと同様に扱います。

先ほどの例でいうと、「BANK05+BANK03」は「BANK05+BANK06」に変更する前の一時的な状態、「BANK02+BANK06」は「BANK02+BANK03」に変更する前の一時的な状態とみなすことで、以下のように記述することができます。

EXTBANK=00+01            ; プログラムA実行後 EXTBANK=02+03 : 02+06    ; プログラムA実行後・またはプログラムB実行後にプログラムA実行中 EXTBANK=00+04            ; プログラムB実行後 EXTBANK=05+06 : 05+03    ; プログラムB実行後・またはプログラムA実行後にプログラムB実行中

このように最適化を行うことで、ROMの容量を削減したり、EXTBANKの個数を減らすことができます。

最後に

最適化について色々と書いてきましたが、グラディウスのように複数のバンク切り替えをキレイに行っているタイトルばかりではありませんし、不必要な組み合わせだと思って最適化したら動かなくなりドツボにハマる、というようなことも多いです。

(「ザナドゥ」「ドラスレIV」などはチャレンジしたのですが挫折しました…)

MSXtoSMS に同梱されている各タイトル専用設定ファイルも、私が試行錯誤した結果「なんとなく動いている」という時のものになるので、まだまだ最適化できるかもしれませんし、逆に特定の条件で動かなくなるかもしれません。

完全に動作させることを目標にするよりは、「MSXのソフトがマスターシステムで動いているところを見て楽しむ」 というくらいの気持ちで挑戦していただければと思います。


「MSXのゲームをセガ・マスターシステムで動かしてみよう」に戻る