FMBIOS関連情報のまとめ
※【訂正 2023/08/25】 ROMの検出について。"OPLL"は4018Hではなく401CHでした。
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メモ
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メモ
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)
- $9073 (ROMイメージ $25073)
- $9863 (ROMイメージ $25863)
- $9E12 (ROMイメージ $25E12)
- $A6B2 (ROMイメージ $266B2)
- $A993 (ROMイメージ $26993)
- $AC4B (ROMイメージ $26C4B)
- $B224 (ROMイメージ $27224)
- $B549 (ROMイメージ $27549)
- $B5BB (ROMイメージ $275BB)
- $B7A3 (ROMイメージ $277A3)
- $B7C9 (ROMイメージ $277C9)
- $B837 (ROMイメージ $27837)
- $B8DB (ROMイメージ $278DB)
- $BA21 (ROMイメージ $27A21)
- $BC4F (ROMイメージ $27C4F)
- $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バンクに変更するツール
MSX版RTYPEは特殊バンクなので、特殊バンクに対応していない環境で動作させるためのもの。
その他
FMBIOS関連自作ツール
FMBIOS(OPLDRV)用BGMデータをROMからファイルに書き出すプログラムや、OPLLDRVデータを解析してMMLを出力する実験プログラムなど。