DEEP! P6!/MSX! へ戻る
2015.2.2 update
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にない機能」はあっさりと諦めました。
プログラムの流れは以下のようになります。
- (事前)MSX用のソフトをROMイメージファイル化しておく
- SCCカートリッジを初期化する
- 自前のSCC演奏ルーチンを、邪魔にならないどこかのRAMに置いておく
- MSX-DOS上で、ROMイメージファイルを、4000HからのRAMにロードする
- RAMに転送されたプログラムを解析し、0093Hをコールしているところを、3.で配置したSCC演奏ルーチンのアドレスに飛ぶよう書き換える
- 書き換えが終わった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の偽装というのはかなり大きな変更なので、「まともに動いたらラッキー」くらいの気持ちでやってみました。
流れとしてはこんな感じになります。
- (事前)MSXの電源を投入後、グラディウスを後差ししておく(自己責任)
- SCCカートリッジを初期化する
- 自前のSCC演奏ルーチンを、邪魔にならないどこかのRAMに置いておく
- MAIN-ROMのページ0(0000H-3FFFH)を、RAMのページ0にコピーする
- コピーしたRAMの0093Hを、自前のSCC演奏ルーチンのアドレスにジャンプするよう書き換える
- ページ0を、MAIN-ROMからコピーしたRAMのスロットに切り替え、MAIN-ROMの存在するスロットを示すワークEXPTBL(0FCC1H)も書き換えて、あたかも改造RAMがMAIN-ROMであるかのように偽装する
- 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を作る」ということです。
- (事前)対象となるMSX2のソフトを、ROMイメージファイル化しておく
- (事前)ROMイメージファイルの中を見て、0093Hを呼んでいる箇所をすべてSCC演奏ルーチンを呼ぶように書き換える
- (事前)改造したイメージを、似非RAMやMega Flash ROMに焼いておく(あるいはエミュレーターを使用する)
- SCCカートリッジを初期化する
- 自前のSCC演奏ルーチンを、邪魔にならないどこかのRAMに置いておく(2のアドレスと合わせる)
- 改造ROMに実行を移す
実機でやろうと思うとハードルは高いのですが、blueMSXなどのエミュレーターであれば、比較的簡単に遊ぶことができます。
動画
以上の方法を使って、片っ端からSCCで鳴らしてみました。
ツールとか
Nandemo SCC!

ダウンロードはこちら
NandemoSCC.zip ver.1.1
「Nandemo SCC!」は、今までつらつらと書いてきたことを自動的に行うためのツールです。
ディスク版とROM版がありますが、ディスク版はROM版のプログラムをRAMに転送して実行するだけなので、中身は一緒です。
起動方法
ディスク版(MSX-DOS版)
ダウンロードファイルの中の forMSXフォルダにある、「SCCBOOT.ROM」と「SCC.COM」の2つのファイルを、MSXDOS.SYSとCOMMAND.COMが入ったディスクにコピーしておいてください。
DOSプロンプトで
SCC
と入力すると起動します。
また、
SCC <ROMイメージファイル>
で、指定したROMイメージファイルをディスクからロードし、RAM上に配置した状態で、ツールを起動することもできます。
ROM版
「SCCBOOT.ROM」のみで動作します。エミュレーターでは、このイメージをスロット1にセットして起動してください。
実機で動作させる場合、Mega Flash ROM SCC などに /K オプションで焼いて、スロット1に入れておいてください。
ちなみに、エミュレーター「blueMSX」では、公式に Mega Flash ROM SCC がサポートされているので、
Mega Flash ROM のサイトから OPF.COM というツールをダウンロードしてくれば、
「SCCBOOT.ROM が焼かれたMega Flash ROM SCC」をエミュレートすることができます。
SCCカートリッジについて
SCCカートリッジはツール側で探すので、たぶん、どこのスロットに入れておいても構いません。
また、Mega Flash ROM SCC+で動作を確認しましたが、スナッチャーのSCCカートリッジでも動作すると思います。
SCCカートリッジを認識できない場合、すべてのサウンドは通常通りPSGで鳴ります。
各項目について
ROMイメージの改造
前述した通り、MSX2用のタイトルのほとんどは、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 」になります。
一度に複数のファイルをコンバートできるので、手持ちのイメージファイルを全部まとめてドラッグ&ドロップとかもできます。
クイックスタートガイド
1)実機+ディスク+SCCカートリッジ+ROMイメージ(MSX1用・メガROM以外)の場合
- RAM64KB以上で、ディスクが使えるMSXを用意します。
- あらかじめ、MSX-DOSの入ったディスクに、SCC.COMとSCCBOOT.ROM、さらにROMイメージファイル(MSX1用・メガROM以外)を入れておきます。
- スロット1にSCCカートリッジを入れます。
- MSX本体を起動します。
- MSX-DOSのコマンドラインで "SCC ROMイメージファイル" と入力します。
- NandemoSCCが起動するので(BOOTオプションが自動的に「RAM」に設定されるはずです)、そのままスペースを押してゲームをスタートします。
- うまく動かない場合、PRG ADDRをF780かF87Fに変えて、もう一度試してみてください。
2)実機+ディスク+SCCカートリッジ+市販ゲームROMカートリッジ(MSX1用・メガROM可)の場合
- RAM64KB以上で、ディスクが使える2スロット以上のMSXを用意します。
- あらかじめ、MSX-DOSの入ったディスクに、SCC.COMとSCCBOOT.ROMを入れておきます。
- スロット1にSCCカートリッジ、ドライブAに↑のディスクを入れて、MSX本体を起動します。
- 電源を入れたまま、スロット2に市販ゲームのROMを入れます。自己責任で行ってください。
- MSX-DOSのコマンドラインで "SCC" と入力します。
- NandemoSCCが起動するので、BOOTオプションを「ROM」に、BIOSオプションを「CUSTOM」にしてください。(非メガROMの場合は「RAM(COPY FROM ROM)」「NORMAL」でも動くことが多いです)
- PRG ADDRなどは、「設定例」を参考に、色々と試してください。
- スペースを押してゲームを起動してください。
- 電源を入れたままROMの抜き差しは危険です。同じことがエミュレーターでもできますので、そちらをおすすめします。
3)実機+Mega Flash ROM SCC(MFRSCC)+市販ゲームROMカートリッジ(MSX1用・メガROM可)の場合
- RAM64KB以上で、2スロット以上のMSXを用意します。
- あらかじめ、SCCBOOT.ROMをMFRSCCに焼いておきます(MFRSCCの場合は"OPF SCCBOOT.ROM /K"、MFRSCC+の場合は"OPFXSD SCCBOOT.ROM /K5" で焼けると思います)。これで準備は終了です。
- スロット1にMFRSCC、スロット2に市販ゲームのROMを入れます。
- MSX本体を起動します。
- 自動的にNandemoSCCが立ち上がるので、BOOTオプションを「ROM」に、BIOSオプションを「CUSTOM」にしてください。(非メガROMの場合は「RAM(COPY FROM ROM)」「NORMAL」でも動くことが多いです)
- PRG ADDRなどは、「設定例」を参考に、色々と試してください。
- スペースを押してゲームを起動してください。
4)blueMSX+市販ゲームROMイメージ(MSX1用・メガROM可)の場合
- あらかじめ、OPF.COM というツールを MFRのサイトからダウンロードしておき、MSXDOS.SYS、COMMAND.COM、SCCBOOT.ROM、OPF.COM を同じディスクイメージに入れておきます。
- blueMSXのスロット1に「特殊カートリッジ」→「Mega Flash ROM SCC」をセットし、ドライブAに↑のディスクイメージをセットして、blueMSXを起動します。
- MSX-DOSのコマンドラインから、"OPF SCCBOOT.ROM /K" で MFRSCC に SCCBOOT.ROMを焼きます。これで準備は終了です。
- スロット1にMFRSCC、スロット2にROMイメージをセットして、blueMSXを起動します。
- 自動的にNandemoSCCが立ち上がるので、BOOTオプションを「ROM」に、BIOSオプションを「CUSTOM」にしてください。(非メガROMの場合は「RAM(COPY FROM ROM)」「NORMAL」でも動くことが多いです)
- PRG ADDRなどは、「設定例」を参考に、色々と試してください。
- スペースを押してゲームを起動してください。
5)blueMSX+SCC化改造済みROMイメージ(MSX2用でもメガROMでもなんでも可)の場合
- 4)を参考に、MFRSCCに SCCBOOT.ROMを焼いておいてください。
- また、SCCCONV.exe などを利用して、「SCC化改造したROMイメージ」を作成しておいてください。
- スロット1にMFRSCC、スロット2にSCC化改造済みROMイメージをセットして、blueMSXを起動します。
- 自動的にNandemoSCCが立ち上がるので、BOOTオプションを「ROM」に、BIOSオプションを「NORMAL」にしてください。
- PRG ADDRなどは、「設定例」を参考に、色々と試してください。
- スペースを押してゲームを起動してください。
よく分からなければ、遠慮なく twitterで聞いてください。ID: @tiny_yarou
環境さえ揃っているのであれば、3)が楽しいと思います。スロット1にSCCBOOTの入ったMFRSCCを入れておけば、あとはスロット2の市販ゲームを入れかえるだけで何でも(MSX1限定ですが)SCC化してくれるので、ワクワクします。
最後に
ノリで初めたSCC対応ですが、色々と欲が出てきて、だんだん大げさなことになってしまいました。
結局、PSGの3チャンネルと全く同じデータを SCCの3チャンネルに出しているだけなので、SCC専用に作られたサウンドと比べたら当然クオリティー的には遠く及びませんが、
古いタイトルがSCCで鳴ったりするのはちょっと感動しました。
特にナムコット系は相性が良いですね(^_^)
皆さんも、お手持ちの古いタイトルを、SCCで鳴らしてみてはいかがでしょうか。
「片っ端から再生した動画」では、波形はすべてノコギリ波を使っていますが( @1, @1, @1 )、チャンネルごとにきちんと変えて鳴らすと、もっと良くなります。
ドラクエなんかは、かなりファミコンっぽくなったりして、面白かったです。
ちなみに、SCCBOOT.ROM の最後の320バイトは波形データです。
MUSICAでエディットできるものと同じフォーマットです。
32バイトずつ、@0~@9まで並んでいるので、ここを書き換えればオリジナルの波形で鳴らすこともできます。
あと、Mega Flash ROM SCC+ は、持ってると色々遊べるので、とても楽しいですよ!
DEEP! P6!/MSX! へ戻る