MSX FMBIOS関連情報


FMBIOS関連情報のまとめ

※【訂正 2023/08/25】 ROMの検出について。"OPLL"は4018Hではなく401CHでした。

 

github.com

FMBIOS 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にして書き戻す。

FMBIOS ROMヘッダ

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

おまけ:
FMPACは4018Hに"PAC2OPLL"
内蔵MSX-MUSICは4018Hに"APRLOPLL"

FMBIOS 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

FMBIOS (OPLLDRV) MUSIC DATA

メロディ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の拡張音色番号。(拡張音色データは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
o1 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH
o2 0DH 0EH 0FH 10H 11H 12H 13H 14H 15H 16H 17H 18H
o3 19H 0AH 1BH 1CH 1DH 1EH 1FH 20H 21H 22H 23H 24H
o4 25H 26H 27H 28H 29H 2AH 2BH 2CH 2DH 2EH 2FH 30H
o5 31H 32H 33H 34H 35H 36H 37H 38H 39H 3AH 3BH 3CH
o6 3DH 3EH 3FH 40H 41H 42H 43H 44H 45H 46H 47H 48H
o7 49H 4AH 4BH 4CH 4DH 4EH 4FH 50H 51H 52H 53H 54H
o8 55H 56H 57H 58H 59H 5AH 5BH 5CH 5DH 5EH 5FH ---
リズム部
bit 7 6 5 4 3 2 1 0
V 0 1 B S T C H
ビット 意味
B,S,T,C,H 各ビットが1なら、そのビットに対応した楽器が選択される。
V 0 = リズム発声。続くデータが音長データ。
(読み出し方はメロディ部の音長の場合と同じ)
  1 = 音量を指定します。続く1バイトが音量データ(0~15)。
0FFH リズム部のデータの最終コード。
ユーザー音色
  bit 7 6 5 4 3 2 1 0 キャリー/モジュレータ
address +0 AM VIB EG KSR MULTIPLE (M)
+1 AM VIB EG KSR MULTIPLE (C)
+2 KSL(M) TOTAL LEVEL (MODULATOR) (M)
+3 KSL(C) -- DC DM FEEDPBACK/td> (C/M)
+4 Attack Rate Decay Rate (M)
+5 Attack Rate Decay Rate (C)
+6 Sustain Level Release Rate (M)
+7 Sustain Level Release Rate (C)

 

余談

ASCII MSXマガジンの音源ドライバMuSICAはこのFMBIOSの音源ドライバ(OPLLDRV)のデータ仕様を拡張する形になっています。(シーケンスブロック・繰り返し回数の追加、空いた命令番号への機能追加)

FMPACメモ

github.com

FMPACのバンク選択

http://bifi.msxnet.org/msxnet/utils/saverom

レジスタ: 7FF7h
SAVEROM FMPAC.ROM⏎
Select Type: Custom
Switch Address: 7FF7
Save Address: 4000
Block Size: 4000
First Block: 0
Last Block: 3

FMPACの曲データ

RAM 0CBF4H(環境による)へ転送して再生される

(ROMイメージ先頭から)
$8080 曲データアドレスリスト
(2byte*5)
$408A 1曲目
$478C 2曲目
$590E 3曲目
$5B90 4曲目
$6612 5曲目

$808A 1曲目 サイズ $0700 ($808A),データ($808C-$878B)
$878C 2曲目 サイズ $1180 ($878C),データ($878E-$990D)
$990E 3曲目 サイズ $0280 ($990E),データ($9910-$9B8F)
$9B90 4曲目 サイズ $0A80 ($9B90),データ($9B92-$A611)
$A612 5曲目 サイズ $0580 ($A612),データ($A614-$AB93)

曲再生呼び出し処理

(bank 0)
64e6	push	af		;a = BGM No.
	cp	#ff
	jp	z,#654c
	ld	hl,#0100
	push	af		;save af (a = BGM No.)
	call	#73d3
	inc	hl
	ld	a,l
	and	#fe
	ld	l,a
	ld	(#8323),hl	;#d2f8 ?

	pop	hl		;hl = saved af (h = BGM No.)
	ld	l,h
	ld	h,0
	add	hl,hl
	ld	bc,#4080	; data adr. list (2*5)
	add	hl,bc		;
	ld	e,2
	call	#402c		;read hl,(hl) #bank e
	ld	e,2
	ld	(#832b),hl	;src adr. #0408a
	call	#402c		;read hl,(hl) #bank e
	ld	(#832d),hl	;(src adr.) = size #0700
	call	#73d3
	ld	(#8325),hl	;dest adr. #cbf4

	ld	c,2
	push	bc
	ld	hl,(#832d)	;size #0700
	ld	c,l
	ld	b,h		;bc = size #0700
	ld	hl,(#832b)	;src #0408a
	inc	hl
	inc	hl
	ex	de,hl		;hl = src + 2 #0408c
	ld	hl,(#8325)	;dst #cbf4
652b	call	#4026
	....

4026	jp	#4048
	....

4048	ld	a,(#7ff7)	;a = current bank
	ex	af,af'
	exx
	push	hl
	pop	de
	push	de
	push	hl
	exx
4053	ld	(#7ff7),a	;(bank 1)
	ex	de,hl
4057	ldir
	ex	af,af'
	ld	(#7ff7),a	;(bank 0)
	ret

 

RTYPEメモ

github.com

RTYPEのBGMデータ

FMBIOS(OPLDRV)を使用する

BGMデータのアドレスリスト

$8010 (バンクレジスタ=9) (ROMイメージ $24010)

73 90 63 98 12 9E B2 A6-93 A9 4B AC 24 B2 49 B5
BB B5 A3 B7 C9 B7 37 B8-DB B8 21 BA 4F BC F9 BC

BGMデータの範囲は $9073- $BF5D
(ROMイメージ $25073 -$27F5D)

  1. $9073 (ROMイメージ $25073)
  2. $9863 (ROMイメージ $25863)
  3. $9E12 (ROMイメージ $25E12)
  4. $A6B2 (ROMイメージ $266B2)
  5. $A993 (ROMイメージ $26993)
  6. $AC4B (ROMイメージ $26C4B)
  7. $B224 (ROMイメージ $27224)
  8. $B549 (ROMイメージ $27549)
  9. $B5BB (ROMイメージ $275BB)
  10. $B7A3 (ROMイメージ $277A3)
  11. $B7C9 (ROMイメージ $277C9)
  12. $B837 (ROMイメージ $27837)
  13. $B8DB (ROMイメージ $278DB)
  14. $BA21 (ROMイメージ $27A21)
  15. $BC4F (ROMイメージ $27C4F)
  16. $BCF9 (ROMイメージ $27CF9)

ROMバンク

バンク アドレス バンクレジスタ
1 $4000-$7FFF $6000~$6800
2 $8000-$BFFF $7000~$7FFF
  • bank 1 は $0Fまたは$17固定
  • bank 2 切り替えで 実際に使用しているのは$7000h, $7800
  • $6000, $6800へのアクセスがコードには存在するが実行されない。
R-Typeの特殊ROMバンクを変更してASCII 16KBバンクに変更するツール

RType_MSXROM_To_Ascii16

MSXRTYPEは特殊バンクなので、特殊バンクに対応していない環境で動作させるためのもの。

その他

FMBIOS関連自作ツール

github.com

FMBIOS(OPLDRV)用BGMデータをROMからファイルに書き出すプログラムや、OPLLDRVデータを解析してMMLを出力する実験プログラムなど。