MSX Datapack wiki化計画

3.1 MSX-MUSIC ハードウェア

 3.1 ハードウェア

3.1.1 メモリの構成


図7.18 MSX-MUSICのメモリ構成

3.1.2 I/Oの構成

1.本体内蔵の場合

表7.19 MSX-MUSIC I/O構成(本体内蔵)

I/OアドレスRead/WriteOPLLレジスタ名
7CHWアドレスレジスタ
7DHWデータレジスタ

2.外付けの場合
 パナアミューズメントカートリッジ2準拠

表7.20 MSX-MUSIC I/O構成(外付け)

I/OアドレスメモリアドレスRead/WriteOPLLレジスタ名
7CH7FF4HWアドレスレジスタ
7DH7FF5HWデータレジスタ

3.1.3 内蔵・外付け判別データ

 

表7.21 内蔵・外付け判別データ

アドレスデータ(内蔵)データ(外付け)
4018H41H'A'50H'P'「PAC2」の文字列は、「パナアミューズメントカートリッジ2」の場合。
この4バイトの文字列は、メーカーごとに異なる任意の文字列でかまわない。
4019H50H'P'41H'A'
401AH52H'R'43H'C'
401BH4CH'L'32H'2'
401CH4FH'O'4FH'O'
401DH50H'P'50H'P'
401EH4CH'L'4CH'L'
401FH4CH'L'4CH'L'

 MSX-MUSICはオプション機能ですから、カートリッジを外付けすることにより、後からFM音源を追加することができます。しかし、MSX-MUSICを内蔵したシステムにFM音源カートリッジを外付けすると、ひとつのシステムに同一アドレスのFM音源LSIが2つ存在することになり、音量が通常の2倍の大きさになってしまいます。

 これを避けるために、外付けのカートリッジに内蔵されるソフトウェアは、そのカートリッジ内の音源LSIの動作を許可するかどうかを4018Hからの「APRLOPLL」文字列の存在の有無を調べ、文字列がなければカートリッジのFM音源をI/Oポートに接続します。

3.1.4 OPLLを直接アクセスする場合の注意

 この章で公開された内容を利用すれば、I/OポートからOPLLを直接アクセスして音を鳴らすことができます。しかし、OPLLのレジスタへデータを書き込む場合、タイミングによっては、正常に動作しなくなる可能性があります。したがって、商用のアプリケーションソフトウェアは直接OPLLをアクセスしてはいけません。OPLLにアクセスする場合は、必ず、FM BIOSを使用するようにして下さい。

1.ウエイト
 OPLLでは、内部レジスタにアドレスやデータを書き込むと、次の動作に移るまでにはウエイト時間が必要です。このウエイト時間は、レジスタのアドレスの指定とデータの書き込みで異なります。表7.22で指定された時間だけ、CPUはOPLLに対して、次の動作を待たなければなりません。

 このウエイト時間を無視した場合は、そのときに設定したデータは保証されません。

表7.22 OPLLのウエイト時間

モードウエイト時間
アドレス指定3.36μsec
データ書き込み23.52μsec

2.内蔵と外付けの両方の音源に対応する方法
 現在、市販されている外付けのMSX-MUSICカートリッジとしては、「パナアミューズメントカートリッジ2(以下、FM-PAC)」があります。FM-PACには、MSX-MUSIC内蔵マシンに装着されたときのことを考慮して、FM-PAC内の音源ICをON、OFFできるようになっています(「3.1.3 内蔵・外付け判別データ」参照)。

 MSXに電源が入ったときは、FM-PAC内蔵音源ICはOFFになっていて、BASICでCALL MUSIC命令が実行されたり、FM-BIOSの初期化ルーチンが呼ばれたりしたときに、もしMSX本体に音源ICが内蔵されていなければONされます。

 したがって、MSX-MUSICが内蔵されていない機種では、ユーザープログラムが直接OPLLをアクセスする場合、以下の方法でFM-PAC内蔵の音源ICをONしなければなりません。

  1. 04018H番地から0401FH番地に次の内容を持っているスロットを探します。

DB    "APRLOPLL"

  2. もしあれば、MSX本体に音源ICが内蔵されているので、そのままで音源ICは操作できます。
  3. ない場合には、0401CH番地から0401FH番地に次の内容を持っているスロットを探します。

DB    "OPLL"

  4. もしなければFM音源IC自体が装着されていませんので、使用出来ません。
  5. もしあればそのスロットの07FF6H番地のビット0を「1」にすることにより、FM音源ICをONにできます。このときには、07FF6H番地の内容を一度読み出して、ビット0のみ「1」にして書き込まなければならないことに注意して下さい。