NandemoSCC - MSXのゲームのサウンドをSCCで鳴らしてみよう


[in English]

ツール

NandemoSCC v3.00

ダウンロードはこちら

NandemoSCC_300.zip 2023/3/5 update!

v3.00

v2.51

起動方法

ROM版

ダウンロードしたアーカイブの中の forMSXフォルダ内にある SCCBOOT.ROM のみで動作します。なるべく若いスロットにセットして SHIFTキーを押しながら 本体を起動してください。

Mega Flash ROM SCC+SD に焼く場合は以下のように /K5オプションをつけることで SCC搭載ROMとして機能します。また、/Uオプションでスロットの内部拡張をOFFにしてください。

OPFXSD SCCBOOT.ROM /K5 /U

エミュレーターで動作させる場合は、ROMタイプを KonamiSCC にしてスロット1にセットしてください。

ディスク版(MSX-DOS版)

forMSXフォルダ内にある NANDEMOSCC.dsk がディスクイメージになります。

(手動でディスクを作成する場合は SCC.COMSCCBOOT.ROM の2つのファイルを MSX-DOSが入っているディスクにコピーしてください)

ドライブAにディスクを入れてMSX-DOSを起動した後、DOSコマンドラインで

SCC

と入力すると起動します。

また、指定したROMイメージファイル(32KB以内)をディスクからロードして(RAM上に配置した状態で)ツールを起動するには、コマンドに続けてROMイメージファイル名を書いてください。

例えば、SAMPLE.ROM というROMイメージファイルを実行する場合は以下のようになります。

SCC SAMPLE.ROM

動作環境

基本的な動作環境

理想的な動作環境

SCCカートリッジの代用について

フロントエンドツールについて

基本的な使い方

  1. カーソルキーの上下で項目を選択し、左右でパラメーターを変更します。
  2. [1]~[7]のキーを押すと、それぞれの環境に合ったプリセット設定が反映されます。
  3. キーボードの[Z][S][X][D][C][V][G][B][H][N][J][M][,]を押すと、指定された音色を視聴できます。[+][-]でオクターブも変更できます。
  4. パラメーターの設定が終了したら、スペースキーでROMあるいはDISKをブートします。
  5. [ESC]を押すと ROMのスロットを再スキャンします。SCC搭載カートリッジを後差しした場合などに使用してください。

各パラメーターの説明

※turboR専用機能については【tR】、RAMが16KBでも使用可能な機能については【16K】と記述してあります。

SCC chA~chC … SCCの各チャンネルの波形を選択します。

PSG … SCCを鳴らす際、PSGも同時に鳴らすかどうかの設定です。

※後述のBIOS設定が「COPY FROM PSG」になっている場合、この設定は強制的に ENABLE になります。

MSX-MUSIC … FM音源を使用するかどうかの設定です。

※「アレスタ」などをFM音源内蔵機種で実行する場合、内蔵FM音源を無効化することでBGMがPSGで演奏されるため、SCC出力が可能になります。

※FM音源が3つ以上接続されている場合の動作は保証されません。

※DISKブートの場合はFM音源を無効化できません。

BIOS … BIOSをどのようにカスタマイズするかの設定です。

SUBROM CALL … MSX2以降の機種では、偽装BIOSとSUB-ROMが同じ基本スロットにあるとスロット切り替えができずに暴走してしまうのですが、それを回避するためのオプションです。

BOOT … ブート時の設定です。

ROM SLOT … BOOT設定が「ROM」の場合に起動するスロットを指定します。設定する数字については以下を参照してください。

CPU … CPUの設定です。SCCとは関係ありませんが、おまけで付けました。

PRG ADDR … SCC演奏ルーチンを配置するアドレスを指定します。

SCC SLOT … SCCが搭載されたカートリッジが入っているROMのスロットを指定します(起動時に自動的に検索されます)。

PRESET SETTING

利用頻度が高い設定をプリセットとして準備しておきました。[1]~[6]までのキーを押すと、それぞれの設定に切り替わります。

※turboRのDRAMモードは完全にBIOSを乗っ取ることができるためかなり強いです。turboRをお持ちの方はぜひDRAMモード(4~6)を使用してください。

クイックスタートガイド

MSXturboRで実行する

  1. プリセット[4]を試してください。
  2. PSGのみ音が鳴る場合は、プリセット[5]を試してください。
  3. それでもSCCが鳴らない場合は、プリセット[7]を試してください。

MSX1/2/2+で実行する

通常ROM

  1. プリセット[1]を試してください。
  2. 起動しない場合は[2]を試してください。
  3. PSGのみ音が鳴る場合は、プリセット[3]を試してください。
  4. それでもSCCが鳴らない場合、あるいは起動しない場合は、プリセット[7]を試してください。

メガROM(MSX1用)

MSX1で実行する場合

  1. プリセット[2]を試してください。
  2. PSGのみ音が鳴る場合は、プリセット[3]を試してください。
  3. それでもSCCが鳴らない場合、あるいは起動しない場合は、プリセット[7]を試してください。

MSX2で実行する場合

  1. プリセット[2]を試してください。
  2. PSGのみ音が鳴る場合は、プリセット[3]を試してください。
  3. それでもSCCが鳴らない場合、あるいは起動しない場合は、プリセット[7]を試してください。
  4. すべて起動しない場合は、スロットに64KBの拡張RAMを差すことで起動する場合があります。

メガROM(MSX2用)

  1. プリセット[2]を試してください。
  2. PSGのみ音が鳴る場合は、プリセット[3]を試してください。
  3. 起動しない場合はプリセット[7]を試してください。
  4. すべて起動しない場合は、スロットに64KBの拡張RAMを差すことで起動する場合があります。

MSX2/2+での動作確率を上げる方法

組み合わせごとの例

1)[MSX2+までの実機]+[FDD]+[SCCカートリッジ]+[ROMイメージファイル(32KBROM)] の場合

2)[MSX2+までの実機]+[FDD]+[SCCカートリッジ]+[市販ゲームROMカートリッジ(32KBROM)] の場合

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

4)[MSX2+までの実機]+[FDD]+[SCCカートリッジ]+[市販ゲーム(ディスク)] の場合【おすすめ】

5)[MSX2+までの実機]+[FDD]+[SCCカートリッジ]+[メガROM] の場合【おすすめ】

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

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

7)blueMSXの場合

開発後記

開発のきっかけ

コナミのサウンドチップ「SCC」は、MSXユーザーだった人なら皆さんご存知だと思います。

グラディウス2で初めてSCCサウンドを聴いたときは、本当に感動しました。

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

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

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

そこで、以前作った MSX2版MAPPY を SCC音源対応に改造してみたのですが、本当に簡単に、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で鳴りました!

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

グラディウスを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で鳴りました!

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カートリッジに対応させよう

SCC制御部分もディスクの空き領域に組み込むことで、スタンドアローンで起動するようにしてみました。

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の後半を使うため、MSX2+以前のアプリケーションが使うオモテの64KBはまったくのフリーです。

また、改造BIOSは完全にROMのふりをして動作するため、アプリケーションからは改造されたことすらわかりません。

MSX2用タイトルでも、メガROMでも、もっというとディスク版タイトルでも、BIOSを使ってサウンド制御をしていれば何でもSCC化できるのです。

真の「なんでもSCC」が完成したのです!(実際はそんなことはないのですが、それは次の章で)

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

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

前章で「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対応ですが、色々と欲が出てきて、だんだん大げさなことになってしまいました。

結局、PSGの3チャンネルと全く同じデータを SCCの3チャンネルに出しているだけなので、SCC専用に作られたサウンドと比べたら当然クオリティー的には遠く及びませんが、古いタイトルがSCCで鳴ったりするのはちょっと感動しました。

特にナムコット系は相性が良いですね(^_^)

皆さんも、お手持ちの古いタイトルを、SCCで鳴らしてみてはいかがでしょうか。

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

ドラクエなんかは、かなりファミコンっぽくなったりして、面白かったです。

ちなみに、SCCBOOT.ROM の最後の320バイトは波形データで、MUSICAでエディットできるものと同じフォーマットです。

32バイトずつ、@0~@9まで並んでいるので、ここを書き換えればオリジナルの波形で鳴らすこともできます。

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


DEEP! P6!/MSX! へ戻る