FM音源あれこれポイ

(New:1996/8/23)
(Update:1997/5/26)

MSXの同人ソフトは、FM音源(MSX-MUSIC)にまつわるトラブルを起こすものが意外と多いようです。
そこでこのたび、旧「FM音源あれこれ」をパワーアップし、報告された問題点を考慮し、新たに「FM音源あれこれポイ」を書くことにしました(たいして変わってないような気もするけど)。 自分の作ったソフトが少しでもたくさんの人に愛されるために、一つ参考にしてやって下さいな。

※タイトルと小見出しの元ネタが分かった人はこっちも見てね(^_^;)。

※松下製FM PACもMSX-MUSICの一種です。 本文ではことわりが無い限り、MSX-MUSICはFM PACのこともさします。


ROUND 1「えーとぉ、んーとぉ、どこだっけ…?」

まずはMSX-MUSICのありか(スロット)を探さなければなりません。 MSX-MUSICの有無ではなく(それもだけど)、ありかを「探す!」のです。
そう、MSX-MUSICは本来特定のスロットにあるものではなく、どこのスロットにも存在し得るものなのです。 したがって、MSX-MUSICがある特定のスロットにあると決め付けていると、音源内蔵型の機種(FS-A1WXなど)では音が出なかったり暴走することがあります。 逆に、内蔵型ではオーケィなのに外付け型(FM PAC)では鳴らなかったり、特定のスロットに挿していないと駄目といった事態も起きます。
ある市販ソフトでは、FM PACがスロット2にないとFMが無いものとされてしまいます。 多分、スロット2に対してのみ、MSX-MUSICの有無をチェックしているのでしょう。

MSX-MUSICが存在するスロットの探し方ですが、401Ch番地からの4バイトが「OPLL」になっているスロットを探しましょう。 それがMSX-MUSICの存在するスロットです。
基本スロット4つを順に調べていきましょう。 拡張スロットがある(FCC1h + n (n:基本スロット番号 0〜3)の最上位ビットが1である)場合は、それら4つを調べましょう。 つまり、調べるスロットの数は最大、基本スロット4個×拡張スロット4個 = 16個となります。 面倒臭がらずに組みましょう(^_^)。
アセンブリのソースに、

CHKDAT:  DB      ”OPLL”
とか書いておき、これと調べるスロットの401Ch番地からの4バイトを比較するようにすればいいでしょう。

当然ですが、401Ch番地からの4バイトが「OPLL」になっているスロット(拡張スロット含む)が1つも存在しなかった場合、そのMSXにはMSX-MUSICが存在しないことになります。 このような場合は音楽処理を省くか、PSGで代用するようにプログラムしておきましょう。個人的にはPSG版があるとうれしいなと。 それがさらにFMがあっても聴けるともっとうれしいな。 ああ、矩形波(PSG)のエクスタシーよ......

ちなみに、4018hからの4バイトには、製品名を表わす文字が入っています。 FM PACの場合は「PAC2」、内蔵型の場合は「APRL」となっています。 「4018hからの8バイトが『PAC2OPLL』ならそこがMSX-MUSICのあるスロットだろう」としているソフトがあるようですが、これでは内蔵型音源は認識されません(^_^;)。 MSX-MUSICの存在を確認する場合は、製品名は無視し、上記の通り401Ch番地からの4バイトのみをチェックしましょう。

ROUND 2「あのう 初期化してくれなきゃ こまりますぅ」

MSX-MUSICの使用にあたっては、電源を入れてから少なくとも1回は、INIOPL(FM BIOS)をコールしなければなりません。 内蔵音源の場合はINIOPLをコールしなくても使えてしまう場合があるので安心していると、外付け型(FM PAC)ではまったく使えず、暴走してしまうことがあります。
MSX-FAN誌には、WRTOPL(FM BIOS)はINIOPLをコールしなくても使えるらしいという内容の文が載っていましたが、FM音源を内蔵していないMSXにFM PACを差している場合、INIOPLをコールしないとI/Oがつながらない(デバイス競合を防ぐため)ので、INIOPLをコールせずにWRTOPLをコールするのはまずいというわけです。

INIOPLコール時に必要なワークエリアのサイズは160バイトです。 ワークエリアの先頭アドレスは必ず偶数となるようにしてください。
また、20hバイトのスタックを使用します。

なお、INIOPLコール時には注意が必要です。 詳しくは「スロットに御用心」をご覧ください(超重要!!)。

FINAL ROUND「I/Oいじっちゃ だめですよ?」

FMレジスタの書き込みをI/O直で行っているソフトがあるようですが、これは素直にWRTOPL(FM BIOS)を使うべきでしょう。 I/O直でFMレジスタの書き込みを行うと、MSX turbo R(高速モード)で正常に動作しないなど、トラブルの原因となります。

要はウエイトの問題で、MSX1/2/2+/turbo R(標準モード)と turbo R(高速モード)で別々の書き込みプログラムを用意している例もあるようです。 ビーバーとしてはどうかと思いますけど。 アスキーも嫌がってたみたいだし。 しかしこれだと将来、より高速なMSXが出た時どうするのかと(え?)

繰り返しになりますが、WRTOPLの使用も、あらかじめINIOPLをコールしてからにしましょう。

なお、PSGレジスタは、I/O直で操作しても特に問題はないようです(MSX turbo R でも)。


参考文献
MSXの適当手帳 MSX駅 西山駅