FPGAでMSX-MUSICもどきを作る

 1988年、ホビー向けパソコンにはFM音源を標準で搭載する機種が多く販売されていました。 ただMSXはMSX2規格になりグラフィックが強化されたもののサウンドは従来のPSGのみでした。

 MSXでFM音源を使えるようにする規格としてはMSX-AUDIOなるものもありましたが高価なこともあり普及していませんでした。 MSXユーザとしてはもっと安価でFM音源が使いたいという要望が高まっていたと思います。そんななかで登場したのがパナソニックのFM PAC。 FM音源搭載+ゲームデータのセーブができるFM PACはゲームカートリッジとだいたい同じ価格帯だったこともありかなり普及しました。 結局、これのFM音源部がMSX-MUSICとして規格化され、その後MSX2+規格のパソコンにはMSX-MUSICがほぼ標準で搭載されるようになりました。

 今回は、このMSX-MUSICの機能をFPGAに実装して、MSX実機から演奏できるようにしていきたいと思います。


FM PACの広告(当時の雑誌より)

MSX-MUSICの構成を調べる

 ネットの情報によれば、FM音源チップはヤマハのYM2413(OPLL)、また拡張BASICを含むFM BIOSを16KBのROMに入れて、と構成は単純のようです。

 使用しているアドレスは、YM2413がI/Oポート7Ch,7Dh、ROMはアドレス4000h-7FEFh、MSX-MUSICを有効にするレジスタがアドレス7FF6h、となっているようです。

 と、一通り分かったところでFPGAの内部構成を設計していきましょう。

設計

 とりあえずブロック図にしてみました。

MSX-MUSICもどき ブロック図

 FPGA内部のクロックは仮想FDDのときと同じPLLで逓倍して64MHzで動かします。

 図にある各モジュールについていくつか説明していきたいと思います。

●VM2413
 FM音源をFPGAに実装するにはFM音源の動作原理を理解しなければどうにもなりませんが、 一から理解していくにはかなり時間がかかる、どこかにIPモジュールはないものかとネットを検索するとあっさり見つかりました。
 GitHubにあるVM2413。 これは、どうやら1chip MSXで採用されているモジュールのようですね。このモジュールのIN/OUTを見てみると、YM2413と合わせているようですが、音声だけは10ビットのデジタルデータで出力されるようです。
 このモジュールで実現できそうですが、VHDLで記述されているのでVHDLの勉強もしなければならないですね。
●PWM
 VM2413から出力されるサウンドデータはサンプリング周波数がMSXのクロック(3.579545MHz)、量子化ビット数が10=1024階調なので、 これを1024分割して1ビットにするために必要な周波数は3.579545 * 1024 = 約3.67GHzとなります、ってとてもFPGAではできない。 音質を犠牲にして上位8ビットだけにすると256階調になるので3.579545 * 256 = 約916.4MHzと、これも無理ですね。
 そこで、16サンプルごとの平均をとることに。 これだと、サンプリング周波数が3.579545 / 16 = 約223.722KHzとなり、これを256分割すれば約57.3MHz。 これならFPGA内のクロック64MHzで分割できそう。
 音質がどうなるかわからないですが、とりあえず、この方針で実装してみます。
●ROM
 FM BIOSの容量が16KBなので、FPGA内部のフラッシュメモリに入れます。仮想FDDと同じ実装です。
 ROMの内容は、MSX2+パソコンに搭載されているMSX-MUSICのFM BIOSを利用することにします。
●MEMIO
 MSX-MUSICを有効にするレジスタ(7FF6h)を実装します。
●アドレスデコーダ
 IORQが"L"かつアドレスが7Chや7DhになればVM2413へのアクセスをONにします。このときBUSDIRはRDが"L"の場合に"L"にします。I/Oポートは基本的にスロットの位置(SLTSL信号)に関係なく応答する必要があります。
 SLTSLとMEMRQが"L"になればアドレスに応じてROMまたはMEMIOへのアクセスをONにします。
●アンプ
 PWMで1ビットにした音声データをFPGA外部に出し、ローパスフィルタ(CR回路)に通した後、±12Vのオペアンプで増幅してMSXのSOUND INに入れます。

実装

 VM2413はModelSim上でコンパイルエラーが出ました。どうやら配列の型宣言で制限があるようです。これらを修正したところコンパイルできました。ロジック自体は変更していないので動作自体に影響は出ないでしょう。そのほかのモジュールはほぼ過去に作成したものの使いまわしです。

 周辺回路も実装します。まずは回路図。基本は仮想FDDのものと同じですが、LCD部分ははずして、新たにアンプ部分を追加しています。


MSX-MUSICもどき 回路図 (クリックで拡大)

 今回は、今後の実験でも使いまわせるようにMSXとMAX10-FBをつなぐ部分をユニバーサル基板で実装しました。アンプ部分は別途ブレッドボードに実装しました。


ユニバーサル基板に実装

MAX10-FB,アンプ,コネクタを接続

 これをMSXに接続します。あとFDDユニットも接続して準備完了。


MSXと接続したところ

実機でテスト

 それでは電源ON。毎度のことながらすぐには動かないのでロジックアナライザを組み込んでデバッグします。いくつかバグがあったので修正したところ、無事MSX BASICが起動するようになりました。

 ここで、FM音源用の拡張BASICを有効にします。CALL MUSICと打ち込むとOkとプロンプトが返ってきましたので拡張BASICが有効になった模様。PLAY #2を実行するとPSGとは異なる音色が出てきました。FM音源部も無事に動作したようです。


拡張BASICでPLAY文実行

 音声ですが、少しノイズがのっているようです、が私的には気にならないレベルでした。ノイズはPWMなどデジタル部分ではなく、アナログ回路が起因しているようです。

 最後は、ディスクステーションを起動してオープニング曲を演奏させてみました。


ディスクステーションのOP曲を演奏

 上記の様子を動画にしましたので興味のある方はどうぞ。

【動画】MSX-MUSICもどきを作る 動作検証 (YouTube)

まとめ

 VM2413はシミュレーション時に少しつまづいたものの、全体としてはおおむね順調にできました。アンプ部分のアナログ回路は、デジタル回路から離す、配線は短くするなどしてもう少しノイズを減らすように調整したほうがよさそうです。

 前回の仮想FDDと合わせたいところですがFPGAの容量(LE数)が足りないので、MAX10-FBでは一体型のカートリッジとするのは難しそうです。別途LE数の多いFPGAを探さねばなりませんね。

おまけ

 前回、故障していたFDDユニット(HBD-F1)ですが、調査したところ、基板のスルーホールのハンダクラックが原因で断線していたことが分かりました。改めてハンダを入れなおしたところ無事動作するようになりました。FDDやICが壊れてなくてよかった。(おわり)

参考文献

  1. MSX2テクニカルハンドブック - アスキー出版局
  2. MSX Datapack wiki化計画 (http://ngs.no.coocan.jp/doc/wiki.cgi/datapack?page=FrontPage)
  3. FMPAC SW-M004 回路図 - 電子機器 Junker (https://green.ap.teacup.com/junker/160.html)

関連ページ

MSX用の仮想FDDを作る

 

TOP PAGE