2015.03.05 19:41

BIOS의 PSG 관련 루틴을 패치하여, SCC 사운드를 출력하는 프로그램입니다.

 

출처 : http://www.tiny-yarou.com/sccplay.html

 

NandemoSCC_230.zip

 

MSXのサウンドをSCCで鳴らしてみよう


    コナミのサウンドチップ「SCC」は、MSXユーザーだった人なら皆さんご存知だと思います。
    グラディウス2で初めてSCCサウンドを聴いたときは、本当に感動しました。

    最近になり、ネットでSCCの仕様というものを調べてみたところ、

    「PSGのサウンドレジスタに渡すデータと、SCCのレジスタに渡すデータは、かなり近い」

    ということを知りました。

    そこで、以前作ったMSX2版MAPPYを改造してみたのですが、本当に簡単に、SCCの音を鳴らすことができました。



    その後も、いくつかの市販ゲームのSCC改造を行ったりして、一人で ニヤニヤ していたのですが、あることに気がつきました。

    ほとんどのタイトルは、同じBIOSルーチンを使ってPSGにアクセスしている のです。

    直接ポートを叩いたりしている(と思われる)ものはほんのわずかで、それ以外は全て "CALL 0093H" を使っていました。
    ということは、これを自動的に検索・置換するようなツールを作れば、片っ端からSCC化できるのではないか?と。

    そうすれば、みんなで ニヤニヤ できるのではないか?と。

    以前、SG-1000のソフトをMSXで動かすための SG2MSX というツールを作ったのですが、その時に使った方法を応用して、チャレンジしてみることにしました。


    ※技術的なことには興味ないという人は 「ツールとか」へジャンプ


何でもよいからSCCで鳴らしたい

    まずは何でもよいので、MSXの市販ゲームをSCC対応してみることにしました。

    BIOSを使用してPSGレジスタにデータを送る場合、WRTPSG(0093H)というBIOSルーチンを使います。
    PSGレジスタ番号をAreg、出力データをEregに入れてこのアドレスをコールすれば、PSGにデータを出力してくれる、というものです。

    そこで、 0093Hをコールしている箇所 を、全て 自前のSCC制御ルーチンをコールする ように書き換えてみました。

    ちなみに、「自前のSCC制御ルーチン」といっても、本当に簡単なもので、 PSG3チャンネル分の「トーンデータ」と「ボリュームデータ」を、該当するSCCのレジスタに出力するだけのプログラムです。
    SCCとPSGは、この部分のデータには互換性があるので、アプリケーションから渡ってきたデータを何も考えずにSCCに出力すれば、とりあえず、音は鳴るのです。
    また、メモリに常駐させる都合上、プログラムサイズは限界まで小さくしたかったので、ノイズ制御やハードウェアエンベロープのような「SCCにない機能」はあっさりと諦めました。

    プログラムの流れは以下のようになります。

    1. (事前)MSX用のソフトをROMイメージファイル化しておく
    2. SCCカートリッジを初期化する
    3. 自前のSCC演奏ルーチンを、邪魔にならないどこかのRAMに置いておく
    4. MSX-DOS上で、ROMイメージファイルを、4000HからのRAMにロードする
    5. RAMに転送されたプログラムを解析し、0093Hをコールしているところを、3.で配置したSCC演奏ルーチンのアドレスに飛ぶよう書き換える
    6. 書き換えが終わったRAM上にあるプログラムを実行する

    2.については、MAPPYのときに作ったものをそのまま流用しました。SCCの仕様については、ひろゆきさんのページを大いに参考にさせていただきました。ありがとうございました。
    3.については、コナミ作品のようにRAM8KBで動くソフトであれば C000H-DFFFHは空いているので、デフォルトではSCC演奏ルーチンはD000Hに置くようにしました(変更可)。
    4.については、最大で2ページ分、4000H-BFFFHまでの32KBしか使えないので、32KBを超えたり、バンク切り替えを行っているROMには非対応です。
    5.については、CALL命令とJP命令、その他ZフラグやCフラグを見てのブランチ命令などを探して、置換するようにしました。

    これを自動的に行う簡単なツールを作り、手持ちのROMをコンバートしてみた結果…

    かなりのタイトルがSCCで鳴りました!

    • BIOSを使わずにPSG制御をしている「けっきょく南極大冒険」や、ハードウェアエンベロープを使いまくりの「フラッピー」なんかは、今回のSCC制御ルーチンでは鳴りません。
    • ROMじゃないと動作しなかったり、自己書き換えをチェックするようなプロテクトがかかっているタイトルも、起動しません。
    • 32KBまでしかRAMには載らないので、メガROMタイトルは全く起動しません。

    色々条件はありますが、ナムコット系や初期のコナミのタイトルなどは結構動作するので、これでも十分楽しめました(^_^)


    グラディウスをSCCで鳴らしたい

      ここまでは比較的あっさりとSCC対応ができたこともあって、ちょっとだけ欲が出てきました。

      「グラディウスをSCCで鳴らしたい!」

      SCCが初めて搭載されたのは「グラディウス2」だったと思いますが、元祖「グラディウス」もSCCで鳴らしてみたいと。
      コナミゲームコレクションのSCC対応版グラディウスはありますが、それはそれとして(^_^;)

      グラディウスは、1メガROM(128KB)のカートリッジなので、前の例のようにRAM上にロードして書き換える、というようなことができません。
      また、仮にRAMにデータを置くことができたとしても、メガROMのバンク切り替えの処理などをソフトウェアで対応することは難しいです。

      つまり、「ソフト側を書き換えずに、なんとかSCCへデータを出力したい」ということになります。

      ソフト側が修正不可なら、BIOSを修正してしまえば良いではありませんか。

      実は、以前、MSX2のドラスピを作ったときに、0038Hの割り込みフックをどうしても書き換えたくて、

      「プログラム起動直後にBIOSを裏RAMに全コピーし、必要な部分を書き換えて、その裏RAMをMAIN-ROMのように偽装する」

      という禁断の技(?)を使いました。

      そのときの方法を利用して、PSG制御のBIOS(0093H)からの処理を書き換えて、SCC演奏ルーチンに飛ぶようにしてしまおうというわけです。
      ゲーム側のプログラムは一切改造しなくても良いですし、そもそも、オリジナルのROMを差した状態で動かすので、1メガROMでも100メガROMでも関係ありません。

      ただ、MAIN-ROMの偽装というのはかなり大きな変更なので、「まともに動いたらラッキー」くらいの気持ちでやってみました。

      流れとしてはこんな感じになります。

      1. (事前)MSXの電源を投入後、グラディウスを後差ししておく(自己責任)
      2. SCCカートリッジを初期化する
      3. 自前のSCC演奏ルーチンを、邪魔にならないどこかのRAMに置いておく
      4. MAIN-ROMのページ0(0000H-3FFFH)を、RAMのページ0にコピーする
      5. コピーしたRAMの0093Hを、自前のSCC演奏ルーチンのアドレスにジャンプするよう書き換える
      6. ページ0を、MAIN-ROMからコピーしたRAMのスロットに切り替え、MAIN-ROMの存在するスロットを示すワークEXPTBL(0FCC1H)も書き換えて、あたかも改造RAMがMAIN-ROMであるかのように偽装する
      7. ROM上のグラディウスを普通に実行する

      すると…

      グラディウスのサウンドがSCCで鳴りました!

      • メガROMを使っている「夢大陸アドベンチャー」「ガリウスの迷宮」や、RAM上では動かなかった「魔城伝説」「ツインビー」なども動きました。
      • BIOSを使わずにPSG制御をしている「ハイドライド3」は、今回のSCC制御ルーチンでは鳴りませんでした。
      • スロット偽装に引っかからないタイトルもかなりあります。MAIN-ROMがスロット0-0にあることを決め打ちしていたりするとお手上げです。
      • SCC演奏ルーチンが置かれている場所を、そのソフトがワークエリアとして使われているとダメです。途中で動かなくなったりすることもあります。


    MSX2用タイトルもSCCで鳴らしたい

      MSX2用のタイトルは、メガROMとなっているものがほとんどなので、そもそもRAM上で動かすことができないのですが、何よりも厳しいのは、

      64KBのRAMがあることが前提となっている ということです。

      つまり、アプリケーション側が64KBのRAMすべてを使う可能性が高いため、改造BIOSを裏RAMに置いておくようなことができないのです。
      (ディスク版のタイトルも同様です)

      メガROMなのでRAM上で動作させることもできず、BIOSを書き換えることもできないのでは、さすがにSCC対応は厳しいです。

      もしやるとすれば、「プログラム自体を書き換えたROMを作る」ということです。

      1. (事前)対象となるMSX2のソフトを、ROMイメージファイル化しておく
      2. (事前)ROMイメージファイルの中を見て、0093Hを呼んでいる箇所をすべてSCC演奏ルーチンを呼ぶように書き換える
      3. (事前)改造したイメージを、似非RAMやMega Flash ROMに焼いておく(あるいはエミュレーターを使用する)
      4. SCCカートリッジを初期化する
      5. 自前のSCC演奏ルーチンを、邪魔にならないどこかのRAMに置いておく(2のアドレスと合わせる)
      6. 改造ROMに実行を移す

      実機でやろうと思うとハードルは高いのですが、blueMSXなどのエミュレーターであれば、比較的簡単に遊ぶことができます。

      後ほど、自動的にSCC用改造をするツール「SCCCONV」を載せておきますが、すべてが自動的にうまくいくわけでもないので、あくまでも参考程度だと思ってください。

      また、ディスクイメージの改造についてですが、SCCCONV一発でというわけにはなかなかいきませんが、その気になればこんなこともできます。
      ■イースシリーズをSCCカートリッジに対応させよう
      Ys1,Ys2,Ys3をSCC対応にするパッチを作ってみました。SCC制御部分もディスクの空き領域に組み込むことで、スタンドアローンで起動するようにしてみました。(2015/2/11)


    MSXturboRは無敵

      twitterでこのツールを発表したところ、とある方が、こんなツイートをしておりました。

      「turboRのDRAMモードでは…(以下略)」

      turboRについてはほとんど知らなかった私は、謎の単語「DRAMモード」について色々調べてみました。

      どうやら、turboRのみにある、「BIOSをRAMにコピーして、あたかもそれがROMのように振る舞うモード」のようでした。

      本来は、BIOSをROMよりも高速なRAMに置くことで、turboRをさらに高速動作させるために用意されたモードなのですが、
      「RAMにコピーしたBIOSをこっそり書き換えることも可能」とのこと。

      こんな魅力的なモードがあったとは。turboRは手にいれただけで満足してしまって、全然知りませんでした。不覚です。

      というわけで、早速やってみました。

      1. (事前)MSXturboRの電源を投入後、なんらかのROMを後差ししておく(自己責任)
      2. SCCカートリッジを初期化する
      3. 自前のSCC演奏ルーチンを、邪魔にならないどこかのRAMに置いておく
      4. MAIN-ROMのページ0(0000H-3FFFH)を、マッパーRAMのDRAMモード用のセグメントにコピーする
      5. コピーしたRAMの0093Hを、自前のSCC演奏ルーチンのアドレスにジャンプするよう書き換える
      6. DRAMモードに切り替える
      7. ROMを普通に実行する

      これは… これはヤバイです!どんなタイトルも動きまくりです!

      まず、改造BIOSは、turboRのマッパーRAMの後半を使うため、アプリケーションが使うオモテの64KBはまったくの無傷です。
      また、改造BIOSは完全にROMとして動作するため、アプリケーションからは改造されたことすらわかりません。

      MSX2用タイトルでも、メガROMでも、もっというとディスク版タイトルでも、BIOSさえ使っていれば何でもSCC化できるのです。

      真の「なんでもSCC」が完成したのです!(…大げさ。そんなに「なんでも」ってわけじゃないです)

      turboR、今ならオクでそれなりに見かけます。専用ソフトは少ないですが、ぜひ一台お手元に。


    BIOSを使わないタイトルもSCCで鳴らしたい

    2015/2/17 update!

      「MSXturboRは無敵」などと言ったものの、結局、PSG制御用BIOSを乗っ取っているだけなので、BIOSを使っていないタイトルはSCC化することができません。

      I/Oポートに直接アクセスしているような、けっきょく南極大冒険はダメです。スーパーレイドックもハイドライド3もダメです。

      「無敵」といいながら、実際は敵だらけなのです。

      もちろん、プログラム自体を改造すれば鳴らすことはできますが、ディスク版ならすぐに試せても、ROM版のタイトルとなると、ハードルは大幅に上がります。

      一番最初の出発点が「みんなで ニヤニヤしたい」ということですし、できるだけ簡単に、誰でもできる方法でSCCを鳴らしたい。

      プログラムを改造せずに、なんとかならないものか。

      ということで、若干強引ではありますが、「PSGのレジスタを監視し、データをSCCへコピーするルーチン」を作成し、それを割り込みで呼ぶようにしてみました。

      すると、

      「けっきょく南極大冒険」がSCCで鳴りました!

      VBLANKのたびに無駄な処理が走ることになるので、若干重くなっているとは思うのですが、SCC自体はしっかりと鳴ってくれました。遅延もほとんど気になりません。


      方針が決まったので、あとはツール側の対応です。BIOS書き換えを使って0038Hの割り込みフックを書き換えてから、ROMを起動するようにしました。

      今までは対応できなかったタイトルを試してみたところ、ついに、

      「ハイドライド3(MSX2)」がSCCで鳴りました!

      ハイドライド3は感動です。turboRのDRAMモード専用ですが、turboRとSCCカートリッジとハイドライド3をお持ちの方はぜひお試しください。


      ※ページ0をRAMとして使い、自前で0038Hを書き換えているものについては、残念ながら鳴らないです。(ディスク版は多いかも…)



    動画

      以上の方法を使って、片っ端からSCCで鳴らしてみました。


    ツールとか

      NandemoSCC v2.3

         

         




        ダウンロードはこちら
        NandemoSCC_230.zip 2015/3/3 update!

        「NandemoSCC v2.3」は、今までつらつらと書いてきたことを自動的に行うためのツールです。

        ・ディスク版とROM版がありますが、ディスク版はROM版のプログラムをRAMに転送して実行するだけなので、中身は一緒です。
        ・turboR用にいくつかの機能が拡張されました。MSX2+までだと旧バージョンとほとんど変わりません。
        ・設定がわかりづらいので、代表的な設定をプリセットで用意し、ワンキーで設定できるようにしました。
        ・PSGのレジスタ7を見て、チャンネルごとのON/OFFに対応しました。(v2.1)
        ・リアルタイムにPSGのレジスタを見て、同じデータをSCCに送るモードを用意しました。BIOS不使用のタイトルも、これである程度鳴るようになりました。(v2.2)
        ・メニュー制御にバグがあったのを修正しました。(v2.3)
        ・SCCカートリッジのスロットをユーザーが指定できるようにしました。(v2.3)
        ・SCCカートリッジの初期化時にノイズが発生することがあったバグを修正しました。(v2.3)



    ROMイメージ・ディスクイメージの改造

      前述した通り、MSX2+以前のマシンでMSX2用のタイトルのSCC化をさせようとすると、ほとんどの場合、ROMイメージを改造しなければなりません。

      バイナリーエディタで置換しても良いのですが、簡単に変換できるツールを用意しました。

      MSX-DOSから

        ダウンロードファイルの中の forMSXフォルダに、SCCCONV.COM というMSX-DOS用ツールがあるので、これを使ってください。

        例えば、DOS上で

        SCCCONV.COM DRACULA.ROM -3

        を実行すると、DRACULA.ROM の内容を解析し、 0093H をコールしている部分を F750H をコールするように書き換えて、新たに DRACULA.SCC というファイルで保存します。
        (拡張子は必ず .SCC になるので注意してください)

        最後の「-3」がアドレス指定オプションで、-0 はD000H、-1 はE000H、-2はF000H、-3はF750H、-4はF87FHになります。指定しない場合は D000H になります。

      PCから

        ダウンロードファイルの中の forPCフォルダにある SCCCONV.exe というツールを使ってください。

        実行するとウィンドウが開くので、そこにROMイメージファイルをドラッグ&ドロップするだけです。
        ファイル名は、例えば「 DRACULA.ROM 」は、「 DRACULA_SCC.ROM 」になります。
        一度に複数のファイルをコンバートできるので、手持ちのイメージファイルを全部まとめてドラッグ&ドロップとかもできます。

        バイナリーを置換しているだけなので、ディスクイメージの変換にも対応していますが、なかなか上手くいかないようで(^_^;)




      クイックスタートガイド

        0)まずは動画を

          最も簡単で、かつ、皆さんが使えそうな方法を動画にしてみました。
          MegaFlashROMSCCやスナッチャーのSCCカートリッジがなくても、SCC搭載のタイトルを1本でも持っていれば遊べます。



        1)MSX2+までの実機+ディスク+SCCカートリッジ+ROMイメージファイル(MSX1用・メガROM以外)の場合


        2)MSX2+までの実機+ディスク+SCCカートリッジ+市販ゲームROMカートリッジ(MSX1用・メガROM可)の場合

        • RAM64KB以上で、ディスクが使える2スロット以上のMSXを用意します。
        • あらかじめ NANDEMOSCC.dsk をディスク化しておきます。
        • スロット1にSCCカートリッジ、ドライブAに↑のディスクを入れて、MSX本体を起動します。
        • 電源を入れたまま、スロット2に市販ゲームのROMを入れます。自己責任で行ってください。
        • MSX-DOSのコマンドラインで "SCC" と入力します。
        • NandemoSCCが起動するので、[1]を押して、プリセット1を反映させてください。
        • スペースを押してゲームを起動してください。
        • うまく動かない場合、プリセット2で動く場合もあります。また、PRG ADDRを変えながら、色々と試してください。

        3)MSX2+までの実機+Mega Flash ROM SCC(MFRSCC)+市販ゲームROMカートリッジ(MSX1用・メガROM可)の場合

        • RAM64KB以上で、2スロット以上のMSXを用意します。
        • あらかじめ、SCCBOOT.ROMをMFRSCCに焼いておきます(MFRSCCの場合は"OPF SCCBOOT.ROM /K"、MFRSCC+SDの場合は"OPFXSD SCCBOOT.ROM /K5" で焼けると思います)。これで準備は終了です。
        • スロット1にMFRSCC、スロット2に市販ゲームのROMを入れて、SHIFTを押しながら MSX本体を起動します。
        • 自動的にNandemoSCCが立ち上がるので、[3]を押して、プリセット3を反映させてください。
        • スペースを押してゲームを起動してください。
        • うまく動かない場合、PRG ADDRを変えながら、色々と試してください。

        4)blueMSXの場合

        • あらかじめ、OPF.COM というツールを MFRのサイトからダウンロードしておき、MSXDOS.SYS、COMMAND.COM、SCCBOOT.ROM、OPF.COM を同じディスクイメージに入れておきます。
        • blueMSXのスロット1に「特殊カートリッジ」→「Mega Flash ROM SCC」をセットし、ドライブAに↑のディスクイメージをセットして、blueMSXを起動します。
        • blueMSX上で、MSX-DOSのコマンドラインから、"OPF SCCBOOT.ROM /K" で MFRSCC に SCCBOOT.ROMを焼きます。これで準備は終了です。
        • あとは3)を参考にしてください。

        5)blueMSX+SCC化改造済みROMイメージ(MSX2用でもメガROMでもなんでも可)の場合

        • 4)を参考に、MFRSCCに SCCBOOT.ROMを焼いておいてください。
        • また、SCCCONV.exe などを利用して、「SCC化改造したROMイメージ」を作成しておいてください。この時、指定したアドレスを覚えておいてください。
        • スロット1にMFRSCC、スロット2にSCC化改造済みROMイメージをセットして、SHIFTを押しながら blueMSXを起動します。
        • 自動的にNandemoSCCが立ち上がるので、BIOSオプションを「NORMAL」、BOOTオプションを「ROM」、PRG ADDR を「改造時に指定したアドレス」に設定してください。
        • スペースを押してゲームを起動してください。
        • うまく動かない場合、PRG ADDRを変えながら、色々と試してください。

        6)MSXturboR実機+ディスク+SCCカートリッジ+市販ゲーム(ROMカートリッジまたはディスク)の場合

        • あらかじめ NANDEMOSCC.dsk をディスク化しておきます。
        • スロット1にSCCカートリッジ、ドライブAに↑のディスクを入れて、MSXturboR本体を起動します。
        • ROM版のゲームをSCC化したい場合、電源を入れたまま、スロット2にROMを入れます。自己責任で行ってください。
        • MSX-DOSのコマンドラインで "SCC" と入力します。
        • NandemoSCCが起動するので、ROMカートリッジの場合は[4]か[5]、ディスク版ゲームの場合は[6]を押してください。
        • スペースを押してゲームを起動してください。ディスク版の場合は、ここでディスクを入れ替えて、再度スペースを押してください。
        • うまく動かない場合、PRG ADDRを変えながら、色々と試してください。

        7)MSXturboR実機+Mega Flash ROM SCC(MFRSCC)+市販ゲーム(ROMカートリッジまたはディスク)の場合

        • 4)を参考に、MFRSCCに SCCBOOT.ROMを焼いておいてください。
        • 【ROM版をSCC化】スロット1にMFRSCC、スロット2に市販ゲームのROMを入れて、SHIFTを押しながら MSXturboR本体を起動します。
        • 【ディスク版をSCC化】スロット1にMFRSCCを入れて、MSXturboR本体を起動します。
        • NandemoSCCが起動するので、ROMカートリッジの場合は[4]か[5]、ディスク版ゲームの場合は[6]を押してください。
        • スペースを押してゲームを起動してください。ディスク版の場合は、ここでディスクを入れ替えて、再度スペースを押してください。
        • うまく動かない場合、PRG ADDRを変えながら、色々と試してください。



        環境さえ揃っているのであれば、7)は無敵です。後差しリスクを抜きにすれば、6)も無敵です。とにかくturboRは無敵です。
        スロット1にSCCBOOTの入ったMFRSCCを入れておけば、ROM版のゲームもDISK版のゲームも、とにかく片っ端からSCC化してくれます。
        また、強制的にR800モードで遊べるのも楽しいです。イースなどは超快適になります。

        よく分からなければ、遠慮なく twitterで聞いてください。ID: @tiny_yarou




      最後に

        ノリで初めたSCC対応ですが、色々と欲が出てきて、だんだん大げさなことになってしまいました。

        結局、PSGの3チャンネルと全く同じデータを SCCの3チャンネルに出しているだけなので、SCC専用に作られたサウンドと比べたら当然クオリティー的には遠く及びませんが、古いタイトルがSCCで鳴ったりするのはちょっと感動しました。
        特にナムコット系は相性が良いですね(^_^)
        皆さんも、お手持ちの古いタイトルを、SCCで鳴らしてみてはいかがでしょうか。

        「片っ端から再生した動画」では、波形はすべてノコギリ波を使っていますが( @1, @1, @1 )、チャンネルごとにきちんと変えて鳴らすと、もっと良くなります。
        ドラクエなんかは、かなりファミコンっぽくなったりして、面白かったです。

        ちなみに、SCCBOOT.ROM の最後の320バイトは波形データです。
        MUSICAでエディットできるものと同じフォーマットです。
        32バイトずつ、@0~@9まで並んでいるので、ここを書き換えればオリジナルの波形で鳴らすこともできます。

        あと、Mega Flash ROM SCC+ は、持ってると色々遊べるので、とても楽しいですよ!

        【2/9 追記】
        turboRのDRAMモードを使ってみました。turboRをお持ちの方は、ぜひお試しください。マジで無敵です。
      저작자 표시
      신고
      Posted by MSX HWADO