FM-BIOS

I/Oポート

内蔵

I/Oアドレス Read/Write OPLLレジスタ名
7CH W アドレスレジスタ
7DH W データレジスタ

外付け(FMPAC)

I/Oアドレス メモリアドレス Read/Write OPLLレジスタ名
7CH 7FF4H W アドレスレジスタ
7DH 7FF5H W データレジスタ

外付けFMPACをI/Oポートに接続にする場合、07FF6Hの値を読みだしてbit0を1にして書き戻す。

ROMヘッダ

401CHに"OPLL" (4バイト)があったらFM-BIOS ROM。

4018Hに"PAC2OPLL" → FMPAC
4018Hに"APRLOPLL" → 内蔵MSX-MUSIC

FM-BIOS_ENTRY

エントリ WRTOPL (4110H)
機能 OPLLレジスタへデータを書き込みます。
入力 A=OPLLのレジスタ番号
E=書き込むデータ
出力 なし
レジスタ なし
解説 Aレジスタで指定した番号のOPLLレジスタに、Eレジスタの内容を書き込みます。
このエントリルーチン内では、割り込み禁止・解除をしていないので、必要に応じてDI、EIを行う必要があります。
エントリ INIOPL (4113H)
機能 FM BIOSの環境を整えます。
入力 HL=ワークエリアの先頭アドレス(偶数)
出力 なし
レジスタ すべて
解説 HLレジスタで指定されたアドレス(偶数)に、FM BIOSで使用するワークエリアを設定し、全てのFM BIOS用のワークエリアおよびOPLLレジスタを初期化します。
ワークエリアの先頭アドレス(偶数)は、【SLTWRK(0FD09H~)】に格納されます。
指定されたアドレスがRAMでない場合は動作保証しません。
FM BIOSをコールするときは、最初にINIOPLを呼び出さなくてはなりません。
このルーチンを1度も呼び出さずに、他のエントリルーチンを呼び出したときは、正常には動作しません。
EI状態で戻ります。
注意事項 INIOPLはENASLTを使用してページ1を他のスロットに切り替え、複数のFM-BIOSが存在するかどうか調べます。
そのため、拡張スロットの状態が呼び出し前と異なる状態で帰って来ることがあります。
I/Oポート(A8H)のページ1の基本スロットと、そのスロットの拡張スロットレジスタ(FFFFh)のうち、最低限、拡張スロット選択レジスタを元に戻す必要があります。
例)スロット0-0にBASIC、スロット1~3にFM BIOSがある場合などはUSR関数からINIOPLを呼び出すとBASICに戻れずに暴走します。
エントリ MSTART (4116H)
機能 演奏開始
入力 HL=ミュージックデータの先頭アドレス
A=演奏回数
0 = 無限
1~254=くり返し回数の指定
255=動作保証無し
出力 なし
レジスタ すべて
解説 HLレジスタで指定されたアドレスにあるミュージックデータを演奏開始します。
(OPLDRVを割り込みから呼ぶ様にしておかなければ演奏されません。)
EI状態で戻ります。
エントリ MSTOP (4119H)
機能 演奏停止
入力 なし
出力 なし
レジスタ すべて
解説 EI状態で戻ります。
エントリ RDDATA (411CH)
機能 ROM上の音色データを得る
入力 HL=データを格納するアドレス
A=音色番号(0~63)
出力 なし
レジスタ F
解説 HLレジスタで指定したアドレスから8バイトの空きエリアが必要です。
HLレジスタで指定したアドレスからOPLLレジスタの0~7の形で値が順に格納されます。
エントリ OPLDRV (411FH)
機能 OPLLドライバーエントリー
入力 なし
出力 なし
レジスタ なし
解説 INIOPLコール後 H.TIMIフックから呼び出します。
INIOPLコール前の動作は保証できません。
エントリ TSTBGM (4122H)
機能 演奏状態を得る
入力 なし
出力 A=0:演奏終了
0以外:演奏中
レジスタ AF

FM-BIOS_OPLDRV演奏データ形式

メロディ6音+リズム構成のヘッダ

adr. value size desc.
+00H rhythm オフセット 2バイト 000EH
+02H CH1 オフセット 2バイト
+04H CH2 オフセット 2バイト
+06H CH3 オフセット 2バイト
+08H CH4 オフセット 2バイト
+0AH CH5 オフセット 2バイト
+0CH CH6 オフセット 2バイト
+0EH データ本体

メロディ9音構成のヘッダ

adr. value size desc.
+00H CH1 オフセット 2バイト 0012H
+02H CH2 オフセット 2バイト
+04H CH3 オフセット 2バイト
+06H CH4 オフセット 2バイト
+08H CH5 オフセット 2バイト
+0AH CH6 オフセット 2バイト
+0CH CH7 オフセット 2バイト
+0EH CH8 オフセット 2バイト
+10H CH1 オフセット 2バイト
+14H データ本体

データ本体

メロディ部(FM部)

value 意味 補足
00H 休符 続く1バイトが音長。
音長が0FFHのときはさらに続く1バイトも音長に加算。
(0FFH以外の値が来るまで繰り返し)
01H~ 5FH 音程 続く1バイトが音長。
音長が0FFHのときはさらに続く1バイトも音長に加算。
(0FFH以外の値が来るまで繰り返し)
60H~ 6FH 音量 この値から60Hを引いた値が、音量として使用される。
70H~ 7FH 音色 この値から70Hを引いた値が、音色番号として使用される。
80H, 81H サスティン 80HでサスティンOFF。81HでサスティンON。
82H 拡張音色 続く1バイトの値(0~63)がROMの拡張音色番号。
(MSX-MUSIC拡張音色データは4C00H)
83H ユーザー音色 続く2バイトの値が音色データ先頭アドレス。
(指定は絶対アドレスなので非リロケータブル)
84H レガートオフ 音を音符毎に切る。
85H レガートオン 音を切らずにつなぐ。
86H Q指定 続く1バイト(1~8)で指定。
(レガートオン時は、Q指定を無視)
87H~0FEH 未使用
0FFH 終了 チャンネル毎のデータの終了コード。

音程データ表

00H~5FHが音程コマンドだが、00HHは休符となる為、
使用できる音程はo1cから08a#まで。
o8bは使用できない。

C C# D D# E F F# G G# A A# B
1 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH
2 0DH 0EH 0FH 10H 11H 12H 13H 14H 15H 16H 17H 18H
3 19H 0AH 1BH 1CH 1DH 1EH 1FH 20H 21H 22H 23H 24H
4 25H 26H 27H 28H 29H 2AH 2BH 2CH 2DH 2EH 2FH 30H
5 31H 32H 33H 34H 35H 36H 37H 38H 39H 3AH 3BH 3CH
6 3DH 3EH 3FH 40H 41H 42H 43H 44H 45H 46H 47H 48H
7 49H 4AH 4BH 4CH 4DH 4EH 4FH 50H 51H 52H 53H 54H
8 55H 56H 57H 58H 59H 5AH 5BH 5CH 5DH 5EH 5FH ---

リズム部

ビット 7 6 5 4 3 2 1 0
意味 V 0 1 B S T C H
ビット 意味
B 1 = バスドラムを指定。
S 1 = スネアドラムを指定。
T 1 = タムタムを指定。
C 1 = シンバルを指定。
H 1 = ハイハットを指定。
V 0 = リズム発声。続くデータが音長データ。
(読み出し方はメロディ部の音長の場合と同じ)
1 = 音量を指定します。続く1バイトが音量データ(0~15)。
0FFH リズム部のデータの最終コード。

ユーザー音色データ

ofs. C/M bit76543210
+0 (M) AMVIBEGKSRMULtiple
+1 (C) AMVIBEGKSRMULtiple
+2 (M) KSLTotal Level
+3 (C) KSL0DCDMFeedBack(M)
+4 (M) Attack RateDecay Rate
+5 (C) Attack RateDecay Rate
+6 (M) Sustain LevelRelease Rate
+7 (C) Sustain LevelRelease Rate
  • (M): Modulator

  • (C): Carrier

  • Multiple値と周波数倍率の関係について、
    特殊なものは、0(半分)、10と11(10倍)、12と13(12倍)、14と15(15倍)。
    それ以外は指定値通りの倍率。

ofs size bit name long name 補足
+0 1 7 AM (M) Amplitude Modulation (M) 音量ビブラート
1 6 VB (M) Vibrato (M) 音程ビブラート
1 5 EG (M) EG Type (M) 1なら減衰音
1 4 KSR(M) Key Scale Rate (M) 音程が高いほど変化が速い
4 3-0 MUL(M) Multiple (M) 周波数倍率
+1 1 7 AM (C) Amplitude Modulation (C) 音量ビブラート
1 6 VB (C) Vibrato (C) 音程ビブラート
1 5 EG (C) EG Type (C) 1なら減衰音
1 4 KSR(C) Key Scale Rate (C) 音程が高いほど変化が速い
3 3-0 MUL(C) Multiple (C) 周波数倍率
+2 2 7-6 KSL(M) Key Scale Level (M) 音程が高いほど出力が減衰
6 5-0 TL (M) Total Level (M) 出力を減衰
+3 2 7-6 KSL(C) Key Scale Level (C) 音程が高いほど出力が減衰
1 5 0 --- (-) 常に0
1 4 DC (C) Distortion (C) (C) 半波整流
1 3 DM (M) Distortion (M) (M) 半波整流
3 2-0 FB (M) FeedBack (M) フィードバック
+4 4 7-4 AR (M) Attack Rate (M) アタックレート
4 3-0 DR (M) Decay Rate (M) ディケィレート
+5 4 7-4 AR (C) Attack Rate (C) アタックレート
4 3-0 DR (C) Decay Rate (C) ディケィレート
+6 4 7-4 SL (M) Sustain Level (M) サスティンレベル
4 3-0 RR (M) Release Rate (M) リリースレート
+7 4 7-4 SL (C) Sustain Leve (C) サスティンレベル
4 3-0 RR (C) Release Rate (C) リリースレート