MSXの同人ソフトは、FM音源(MSX-MUSIC)にまつわるトラブルを起こすものが意外と多いようです。
そこでこのたび、旧「FM音源あれこれ」をパワーアップし、報告された問題点を考慮し、新たに「FM音源あれこれポイ」を書くことにしました(たいして変わってないような気もするけど)。
自分の作ったソフトが少しでもたくさんの人に愛されるために、一つ参考にしてやって下さいな。
※タイトルと小見出しの元ネタが分かった人はこっちも見てね(^_^;)。
※松下製FM PACもMSX-MUSICの一種です。 本文ではことわりが無い限り、MSX-MUSICはFM PACのこともさします。
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バイトのみをチェックしましょう。
INIOPLコール時に必要なワークエリアのサイズは160バイトです。
ワークエリアの先頭アドレスは必ず偶数となるようにしてください。
また、20hバイトのスタックを使用します。
なお、INIOPLコール時には注意が必要です。 詳しくは「スロットに御用心」をご覧ください(超重要!!)。
要はウエイトの問題で、MSX1/2/2+/turbo R(標準モード)と turbo R(高速モード)で別々の書き込みプログラムを用意している例もあるようです。 ビーバーとしてはどうかと思いますけど。 アスキーも嫌がってたみたいだし。 しかしこれだと将来、より高速なMSXが出た時どうするのかと(え?)
繰り返しになりますが、WRTOPLの使用も、あらかじめINIOPLをコールしてからにしましょう。
なお、PSGレジスタは、I/O直で操作しても特に問題はないようです(MSX turbo R でも)。