メガドライブへ「ファンタジーゾーン」移植の記録 | Arcade Cabinet

Arcade Cabinet

自作したゲームコントローラを紹介します

 「メガドライブ版ファンタジーゾーン」やっと完成しました。約4年間かかりました。プログラミングは50歳超えてもやってみれば少しずつですができるようになるんですね。

 

 まずはプレイ動画です。メガドライブ2実機のRGB出力をOSSC(Open Source Scan Converter)でHDMIに変換して録画しました。

 

*写真はAmazonの「ダライアス エクストラバージョン MD」商品紹介より

 ところで、MD/MD互換機用「ダライアス エクストラバージョン」無事発売されました!メガドライブミニだけでなく「カートリッジ版の発売」まで、たくさんの方々に応援していただき、関係者の方々に暖かく支えられながら、世に出してもらう事ができました。本当に奇跡のような出来事です。

 皆さん有り難うございました。

 

 今回のWING☆さんによるダライアスサウンドは最高でした!

サウンド面はサウンドドライバを含めWING☆さんとエムツーさんのスタッフとの共同作業でしたが、多くのことを学ぶことができました。とにかく「移植(耳コピ)は限りなくオリジナルと同じものが良い!」ということです。1音1音きちんと音色パラメータを確認して音色だけでなくメロディの抑揚なども同じに、当然、各パートの音量バランスがずれてもダメです。耳だけでなくツールなどを駆使してオリジナルのFM音源のレジスタのパラメータなどをチェックしながら調整します。各パートをゆっくり再生して、リリースのタイミングもきちんと調べて打ち込む必要があります。ただし最終的には耳で聞いての微調整が最も大切と思われます。

 メガドラミニ版は、自分が打ち込んだデータですが、当時は技術不足でオリジナルの各種パラメータはに大まかにしかチェックできなかったので、音色パラメータ、音量バランスなどは自分好みの調整が入っています。サントラが発売されるので、その辺りを聴き比べていただけば楽しいかもしれません。

 

 話は戻りますが、「メガドライブ版ファンタジーゾーン」、ダライアスと並行して、プログラミングを継続していました。今回の経験をきっかけに、サウンド面の大改良を行いました。

 

 移植精度を上げるために、まずFM音源チップの勉強をしました。レジスタマップなどの仕様書を読んでみると、YM2151とYM2612は同じ4オペレータのFM音源で、音色データは一部共通ですが、レジスタレベルではデータの互換性はありません。音程も動作クロックに影響します。

 VGMデータを可視化して編集しやすくするように、専用ツールをプログラミングして、レジスタデータを操作して音を鳴らす仕組みを解析・理解しました。難しいと思っていたFM音源も落ち着いて勉強すれば意外と単純な仕組みでした。(仕組みを理解しても音色作成は超絶難しいですが…。)

 

 「移植はオリジナルと同じものが良い!」を突き詰めると、オリジナルのデータをコンバートするのが最も確実な方法と思われます。試しにYM2151からYM2612へのデータコンバーターを作って、源平討魔伝のBGMをYM2612で鳴らしてみました。何か変ではないですか?

 オリジナルのYM2151(FM8ch)からメガドライブのYM2612(FM6ch)への移植の際に、①FMが2ch足りない②DT2効果を使用できない、の2点が問題となります。メガドラへの移植のレベルを上げるためには、結局は耳コピでアレンジを加えて、打ち込む必要があります。

 

 そこで、足りないチャンネルはExt.CH3 ModeやAlgorithm4など駆使してFM6chで最大8種類の音を同時に鳴らしました(DCSGは未使用)。ブラス音の歪みなどにYM2151のDT2効果が使われていますが、YM2612ではDT2は使用できないので、音色編集で似た音を作りました。まだちょっと違和感があるかも…?

 

 メガドライブの名作「スーパーファンタジーゾーン」に初代ファンタジーゾーンのBGMが収録されてます。素晴らしい再現度で初めて聴いた時は「メガドライブでここまで再現ができるのか!」と感動しましたが、気になる箇所があります。足りない音をDCSGで補っているのですが、①カウベルとホイッスルの音が軽い②DCSGの仕様上、高音域が音痴になる(特にDreaming Tomorrowは音程が外れている)、③メガドラのバージョンによってFMとDCSGの音量比が異なる。この3点です。

 そのような理由から、今回はDCSGは使用せずFM6chのみにこだわりました。特に「Dreaming Tomorrow」は苦労しました。メロディはFMで鳴っているので、正しい音程で演奏されています。

 

 ゲームクリア後の感動のエンディング!

 ブラスの和音がとても美しい曲です。一つでも音が足りなければ音の雰囲気が変わってしまうので、可能なら全ての音を鳴らしたいです。メガドライブは2ch足りませんが、ほぼオリジナルと同じ構成で鳴らすことができました。

 

 なんとか打ち込みは終了、次はゲームに組み込むためのサウンドドライバの作成です。SGDK付属のXGMドライバは効果音にFMを使用できないので、FMで鳴っている特徴的なファンタジーゾーンの効果音はこのままでは再現できません。サウンドドライバ自作という未知の領域にチャレンジです!

 アセンブラは未経験なのと、YM2612のレジスタを操作するための勉強もかねて、最初はMC68000で動くサウンドドライバをC言語でプログラミングしました。

 チップの仕様を読んだところ、難しいと思っていたFM音源も、チップを操作すること自体は簡単なようです。(音色編集は相当難しいですが…)1週間ほどで、以下の仕様のサウンドドライバが完成しました。

 

 データフォーマットです。XGMからPCM機能を除いて、FMによる効果音再生機能、フェードアウト機能を追加したような仕様にしました。

①YM2612はFMのみでPCMは使用しない。

②フェードアウト可能

③効果音はFM4-6chの任意のchを使用して、3音同時再生

④ホイッスル音の再現のため分解能は1/120秒以下

 

 ここで問題発生です。

 メガドライブはYM2612のタイマー割り込み機能がないので、VSync駆動に再生テンポが制限されます。しかしファンタジーゾーンの音符の最小単位を1/60秒の長さに当てはめることができませんでした。(*VSync駆動でも任意のテンポで再生すことはできるが、ジャストのタイミング音を鳴らすことがでず、リズムがよれる)分解能を上げるために、水平割り込みを使って1/120秒駆動で動かすことはできましたが、リズムのよれは完全には解決できませんでした。

 

 YM2612はTimer-A、Timer-Bの2種類のタイマーが内蔵されているのでこれを利用すれば任意のテンポで再生出来そうですが、メガドライブにはこのタイマーの割り込み機能はなく、使用したい場合は、CPUがフラグを常に監視する必要があります。(ポーリングって言うんですね。)メインCPU(MC68000)をポーリング専用に動かすことはできないので、Z80をサウンド専用でドライバを組む必要がありそうです。

 神の領域と思っていたアセンブラに挑戦することにしました。この「図解 Z80マイコン応用システム入門(ソフト編) 」を参考になりました。この本1冊だけです。素晴らしくわかりやすい内容でした。

 

  テキストエディタ「Notepad++」を使ってアセンブリ言語でソソースプログラムを作成。SGDKで使用されていたアセンブラ「SjASM Z80 Assembler v0.39g6」でアセンブルし、実行ファイルを作成しました。

 プログラムの実行時はMC68000側から、ROMに置いた実行ファイルをZ80側のRAMへ転送しRESETすれば0x0000から実行されます。

 

 BGMはYM2612はTimer-Aをポーリングで監視してテンポ調節して再生しています。SEが鳴っている間はBGM用のデータはチップに送らずにワークエリアに記録。SE再生終了直後に、ワークエリアに保存している音色データをレジスタに書きこんでBGM用のデータに戻しています。ファンタジーゾーンでは使用していませんが、再生中でも任意のテンポに変更可能です。

 サウンドドライバをTimer-Aで駆動させると、効果音もBGMのテンポに引きずられます。そこで、効果音はTimer-Bで駆動させ一定のテンポで再生できるようにしました。

 残る課題は、BGMと効果音の競合です。効果音をBGMより優先しているので、効果音再生中はBGMの音が鳴らなくなります。SEが鳴った時にBGMに違和感を感じないように、何度も調整しました。

 

 試行錯誤しながら、なんとかZ80のみでサウンドコントロール可能になりました。これでMC68000はゲームに専念できるようになりました。動画はサントラモードです。Genesis Triple Bypass(audio/video mod board)を組み込んだメガドラ2実機からの録音です。

 

 サウンドが一段落したら、次は気になっていた処理落ちの改善です。ゲーム中で最も処理の重たい場面はボスのクラブンガー戦でした。ボス本体+(爪+腕10個)x2 = 23個のオブジェクト対3Way 21個+Bomb 2個 = 23個で最大23x23回と、ボスショット25個 対 自機で、当たり判定だけで最大554回の処理が必要です。さらにくねくね動く関節も全ての関節の位置をフレーム毎に計算する必要があります。テーブル化した三角関数を使って固定小数点で計算しています。

 とにかく最小限必要な部分のみ処理をするように工夫し、処理落ちだいぶ改善しました。

 

 意外と苦労したのが、画面上部のスコア表示部分のサイズです。オリジナルは36ドットですが、メガドライブのウィンドウ機能を使うと8ドット単位でしか使えないので、32もしくは40ドットになります。対処法として、メガドライブの水平割り込みを使って、走査開始時にウィンドウを縦40ドットに設定し、36ライン目の水平割り込み時に32ドットに書き換えたら、ウィンドウのサイズを縦36ドットで設定できます。ただ、別の処理でVBlank以外のタイミングで割り込み禁止状態にしてVRAM操作を行うこともあったため、場面によってはきちんと表示できませんでした。プログラムの全構造を見直し、処理をきちんと分割して、割り込み禁止処理をなくしました。

 

 ゲームのシステムが完了してからは、ひたすらバランス調整です。何度も何度も遊んでは修正の繰り返しです。何発撃ったら破壊できるかも調べましたが、ゲームしながら数えるって至難の業ですね。目コピでは完璧移植はどう考えても無理です!

 

 自宅ゲーセンルームの駄菓子屋筐体にファンタジーゾーンの基板を常設していていつでもオリジナルで遊べる環境を整えています。目コピなので雰囲気移植で完全一致は無理ですが、ゲームバランスも最終的には実機で遊んでプレイ感覚を調整するようにしています。何回遊んでも飽きない素晴らしいゲームですね。1周15分ほどで終了するので、気軽に遊べます。ちなみにダライアスはZONE道中が長くエンディングまで30分ぐらいかかります。遊ぶ時にはちょっとした気合が必要です。

 

 ファンタジーゾーンの基板とメガドライブ1の基板を並べてみました。MC68000とZ80は共通ですが、基板のサイズとチップ数は全然違いますね。さらにファンタジーゾーンの基板は2層です。基板だけみたらメガドライブで完全移植なんて到底無理と思ってしまいます。

 

 自分にとって、ゲームをする上で最も重要と考えているのが、プレイ環境です。当時高校生で学校帰りにゲームセンターで遊んでいたのはテーブル筐体でしたが、流行りの「アストシティ筐体」をイメージした10インチ液晶を搭載した自作ミニ筐体を作りました。スピーカーは高音用と低音用の2Way方式で結構良い音がします。これを作るためだけに、3DCADや3Dプリンターで遊びました。

 

 こんな感じでテストプレイしています。雰囲気は大事なので、カートリッジもラベルを自作してオリジナルカートリッジでのプレイです。今まではブラウン管モニタでテストプレイしていましたが、最近購入したOSSC(Open Source Scan Converter : RGB→HDMI)が遅延が気にならず非常に綺麗な画質で、液晶でも納得の状態でプレイできるようになりました。

 

 以上、ファンタジーゾーン移植の記録でした。長文にお付き合いいただき、有り難うございました。

 

 ところで、最近「源平討魔伝」で遊んでいます。当時は全くクリアできませんでしたが再挑戦です。サウンド・世界観などこれも最高なゲームですね!