コナミのサウンドチップ「SCC」は、MSXユーザーだった人なら皆さんご存知だと思います。
グラディウス2で初めてSCCサウンドを聴いたときは、本当に感動しました。
最近になり、ネットでSCCの仕様というものを調べてみたところ、
「PSGのサウンドレジスタに渡すデータと、SCCのレジスタに渡すデータは、かなり近い」
ということを知りました。
そこで、以前作ったMSX2版MAPPYを改造してみたのですが、本当に簡単に、SCCの音を鳴らすことができました。
その後も、いくつかの市販ゲームのSCC改造を行ったりして、一人で ニヤニヤ していたのですが、あることに気がつきました。
ほとんどのタイトルは、同じBIOSルーチンを使ってPSGにアクセスしている のです。
直接ポートを叩いたりしている(と思われる)ものはほんのわずかで、それ以外は全て "CALL 0093H" を使っていました。
ということは、これを自動的に検索・置換するようなツールを作れば、片っ端からSCC化できるのではないか?と。
そうすれば、みんなで ニヤニヤ できるのではないか?と。
以前、SG-1000のソフトをMSXで動かすための SG2MSX というツールを作ったのですが、
その時に使った方法を応用して、チャレンジしてみることにしました。
※技術的なことには興味ないという人は 「ツールとか」へジャンプ
まずは何でもよいので、MSXの市販ゲームをSCC対応してみることにしました。
BIOSを使用してPSGレジスタにデータを送る場合、WRTPSG(0093H)というBIOSルーチンを使います。
PSGレジスタ番号をAreg、出力データをEregに入れてこのアドレスをコールすれば、PSGにデータを出力してくれる、というものです。
そこで、 0093Hをコールしている箇所 を、全て 自前のSCC制御ルーチンをコールする ように書き換えてみました。
ちなみに、「自前のSCC制御ルーチン」といっても、本当に簡単なもので、
PSG3チャンネル分の「トーンデータ」と「ボリュームデータ」を、該当するSCCのレジスタに出力するだけのプログラムです。
SCCとPSGは、この部分のデータには互換性があるので、アプリケーションから渡ってきたデータを何も考えずにSCCに出力すれば、とりあえず、音は鳴るのです。
また、メモリに常駐させる都合上、プログラムサイズは限界まで小さくしたかったので、
ノイズ制御やハードウェアエンベロープのような「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の偽装というのはかなり大きな変更なので、「まともに動いたらラッキー」くらいの気持ちでやってみました。
流れとしてはこんな感じになります。
MSX2用のタイトルは、メガROMとなっているものがほとんどなので、そもそもRAM上で動かすことができないのですが、何よりも厳しいのは、
64KBのRAMがあることが前提となっている ということです。
つまり、アプリケーション側が64KBのRAMすべてを使う可能性が高いため、改造BIOSを裏RAMに置いておくようなことができないのです。
(ディスク版のタイトルも同様です)
メガROMなのでRAM上で動作させることもできず、BIOSを書き換えることもできないのでは、さすがにSCC対応は厳しいです。
もしやるとすれば、「プログラム自体を書き換えたROMを作る」ということです。
twitterでこのツールを発表したところ、とある方が、こんなツイートをしておりました。
「turboRのDRAMモードでは…(以下略)」
turboRについてはほとんど知らなかった私は、謎の単語「DRAMモード」について色々調べてみました。
どうやら、turboRのみにある、「BIOSをRAMにコピーして、あたかもそれがROMのように振る舞うモード」のようでした。
本来は、BIOSをROMよりも高速なRAMに置くことで、turboRをさらに高速動作させるために用意されたモードなのですが、
「RAMにコピーしたBIOSをこっそり書き換えることも可能」とのこと。
こんな魅力的なモードがあったとは。turboRは手にいれただけで満足してしまって、全然知りませんでした。不覚です。
というわけで、早速やってみました。
「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
SCC <ROMイメージファイル>
OPF SCCBOOT.ROM /K
実行するとウィンドウが開くので、各種設定をした後、ROMイメージファイルをドラッグ&ドロップしてください。 Replace code
Include SCC-Driver
chA,chB,chC … チャンネルごとのSCCの波形を選択してください。それらの波形データがROMに組み込まれます。 PSG off … PSGを鳴らすかどうかの指定です。これをチェックすると、SCCのみが鳴るようになります。 Original ROM type … 元になるROMの種類を選択してください。 BANK1 control … BANK1の切り替えをどのようにするかを指定してください。 |
SCCCONV.COM DRACULA.ROM -3