YMF262

Sound Blaster Pro II など に搭載されているFM音源ICです。
たぶん互換性があるであろう Sound Blaster 16 やそのエミュレータなどでも使用できる可能性があります。
残念ながらqemuでは4オペレータや18チャネルステレオ対応の音源としては使えないようです。
DOSや自作系OS用のアプリを作成するための資料として自分用に整理中。

(以下書きかけです。間違っていたり誤記がある可能性があります)

スペック

  • 同時発音数の例
    • 2オペレータ18チャネル
      すべて2オペレータで使用する場合。
    • 2オペレータ15チャネル+リズム5チャネル
      7~9チャネルをリズムで使用。
    • 4オペレータ6チャネル+2オペレータ6チャネル
      7~9チャネルと16~18チャネルは4オペレータにできない。
    • 4オペレータ6チャネル+2オペレータ3チャネル+リズム5チャネル
      7~9チャネルをリズムで利用。
      16~18チャネルは4オペレータにできない。
    • 4オペレータ2チャネル+2オペレータ14チャネル
      仕様を見る限りこういう利用も可能のようだ。しかし、対応したライブラリが無いとチャネルの管理が大変そう。
  • wikipediaのFM音源ページのOPL3のところにはリズム10chとあるが、詳細不明。セカンダリの16~18チャネルも実はリズムとして利用できるのだろうか。

I/Oアドレスマップ

サウンドカードベースポート
Sound Blaster Pro II220h または 240h など(選択可)
AdLib Gold388h

※Sound Blaster Pro I など は YMF262では無く FM1812 が2つ使用されているそうです。
  その場合、ベース+0~+1とベース+2~+3は両方ともFM1812のレジスタマップとなり2オペレータ18チャネル(ステレオだが左右独立で左9チャネル+右9チャネル)のみ利用可能と思われます。

I/Oポート番号アクセスポートの意味
ベース+0Rステータスレジスタ
Wプライマリ インデックスレジスタ
ベース+1Wプライマリ データレジスタ
ベース+2Wセカンダリ インデックスレジスタ
ベース+3Wセカンダリ データレジスタ

※Sound Blaster では ベース+8~+9(228h~229hなど) でプライマリのレジスタがアクセスできるが、ベース+10~+11(22Ah~22Bh)からセカンダリのレジスタにはアクセスできない(らしい)。
  その場合、ベース+8〜+9がモノラル出力用、ベース+0〜+1が左音声用、ベース+2〜+3が右音声用となるようです(なんでこんな仕様になっているんだろう)。

レジスタマップ

  • ステータスレジスタ (ベース+0)
    b7b6b5b4b3b2b1b0
    IRQTF1TF2-0-

  • データレジスタ (プライマリはベース+1,セカンダリはベース+3)
    アドレス
    (hex)
    プライマリセカンダリ
    b7b6b5b4b3b2b1b0b7b6b5b4b3b2b1b0
    01hLSI TEST-LSI TEST
    -WM-
    02hTIMER 1-
    03hTIMER 2-
    04hRSTMT1MT2-ST2ST1-4 OPERATOR MODE
    121110321
    05h--OPL3
    08h-NTS--
    20-35AMVBEGTKSRMULTIAMVBEGTKSRMULTI
    40-55KSLTLKSLTL
    60-75ARDRARDR
    80-95SLRRSLRR
    A0-A8Freq Number(L)Freq Number(L)
    B0-B8-KONBLOCKFNum(H)-KONBLOCKFNum(H)
    BDTDVDPMBDSDTOMTCHH-
    C0-C8CH OUTFeedBackCNTCH OUTFeedBackCNT
    --RL--RL
    E0-F5-WS-WS
    アドレス
    (hex)
    b7b6b5b4b3b2b1b0b7b6b5b4b3b2b1b0
    プライマリセカンダリ

スロットの配置

  • 2オペレータモード
    チャネルコントロールポートスロットスロットポート
    1,10A0 B0 C01,1920 40 60 80 E0
    4,2223 43 63 83 E3
    2,11A1 B1 C12,2021 41 61 81 E1
    5,2324 44 64 84 E4
    3,12A2 B2 C23,2122 42 62 82 E2
    6,2425 45 65 85 E5
    4,13A3 B3 C37,2528 48 68 88 E8
    10,282B 4B 6B 8B EB
    5,14A4 B4 C48,2629 49 69 89 E9
    11,292C 4C 6C 8C EC
    6,15A5 B5 C59,272A 4A 6A 8A EA
    12,302D 4D 6D 8D ED
    7,16A6 B6 C613,3130 50 70 90 F0
    16,3433 53 73 93 F3
    8,17A7 B7 C714,3231 51 71 91 F1
    17,3534 54 74 94 F4
    9,18A8 B8 C815,3332 52 72 92 F2
    18,3635 55 75 95 F5

  • 4オペレータモード
    チャネルコントロールポートスロットスロットポート
    1,10A0 B0 C0 C31,1920 40 60 80 E0
    4,2223 43 63 83 E3
    7,2528 48 68 88 E8
    10,282B 4B 6B 8B EB
    2,11A1 B1 C1 C42,2021 41 61 81 E1
    5,2324 44 64 84 E4
    8,2629 49 69 89 E9
    11,292C 4C 6C 8C EC
    3,12A2 B2 C2 C53,2122 42 62 82 E2
    6,2425 45 65 85 E5
    9,272A 4A 6A 8A EA
    12,302D 4D 6D 8D ED

  • パーカッションモード
    プライマリデータレジスタBDhのビット5を立てると7~9チャネル(13~18スロット)をパーカッションモードで使用する。
    パーカッションの発音はBDhを使用し、チャネル7~9には適切な音色データを書き込み常に消音状態にしておく。
    チャネルスロット楽器
    713バスドラム
    16
    814ハイハット
    17スネアドラム
    915タムタム
    18シンバル

    ※4オペレータモードと2オペレータモードとパーカッションモードは混在可

値の意味

  • ステータスレジスタ
    ビット仮名称仮名称意味
    b7IRQ割り込み要因フラグ割り込み要因が発生しているとフラグが立つ
    レジスタ4に80hを書き込むとこのフラグがリセットされる
    (PCの場合、割り込み要因が発生することがあっても実際の割り込みが発生することはない)
    b6TF1タイマー1フラグタイマーカウンタに書き込んだ時間が経つとこのフラグが毎回立つ
    レジスタ4に0x40や0x20を書き込むとマスク(リセット?)できる
    b5TF2タイマー2フラグ
  • データレジスタ
    アドレス
    (hex)
    レジスタ名
    ビット仮名称仮名称意味
    01テストレジスタ/波形選択モード
    b5WM波形選択モードフラグを立てるとスロット毎に波形を変更できる
    02タイマー1カウントレジスタ
    b7-0TIMER1タイマー1カウント80μ秒単位のカウント値
    03タイマー2カウントレジスタ
    b7-0TIMER2タイマー2カウント320μ秒単位のカウント値
    04割り込み/タイマーマスクレジスタ(プライマリ)
    b7RSTIRQリセットフラグを立てて書き込むと割り込み要因をクリアする
    ※このフラグを立てると他のフラグは無効となる
    b6MT1タイマー1マスクフラグを立てるとタイマー1をマスクする
    b5MT2タイマー2マスクフラグを立てるとタイマー2をマスクする
    b1ST2タイマー2スタートフラグを立てるとタイマー2がカウントする
    b0ST1タイマー1スタートフラグを立てるとタイマー1がカウントする
    044オペレータモードチャネル設定(セカンダリ)
    b54 OPERATOR MODEチャネル12を4オペレータモードにする
    b4チャネル11を4オペレータモードにする
    b3チャネル10を4オペレータモードにする
    b2チャネル3を4オペレータモードにする
    b1チャネル2を4オペレータモードにする
    b0チャネル1を4オペレータモードにする
    05OPL3モードフラグ(セカンダリ)
    b0OPL3OPL3フラグを立てるとOPL3モードになり以下が有効になる
    ・10~18チャネル
    ・4オペレータモード
    ・波形選択のモード4~7
    ・各チャネル独立のステレオ出力設定
    08音声合成モード/キーボードスプリットレジスタ
    b7CSW-フラグを立てるとサイン波合成モードになる(詳細不明)
    b6NTSセレクトキーボードスプリット選択ビットの設定
    =0:Freq Number の ビット8
    =1:Freq Number の ビット9(MSB)
    20~35スロットレジスタ1
    b7AMトレモロのOn/Off
    b6VBビブラートのOn/Off
    b5EGT発音モード
    =0: 減退音
    =1: 持続音
    b4KSRキースケールレート
    b3-b0MULTIマルチプル
    40~55スロットレジスタ2
    b7-b6KSLキースケールレベル
    b5-b0TLトータルレベル(減衰量)
    60~75スロットレジスタ3
    b7-b4ARアタックレート
    b3-b0DRデュケイレート
    80~95スロットレジスタ4
    b7-b4SLサスティンレベル
    b3-b0RRリリースレート
    A0-A8チャネルレジスタ1
    b7-b0F-NumFreq Numberの下位8ビット
    B0-B8チャネルレジスタ2
    b5KON発音のOn/Off
    b4-b2BLOCKBLOCK(オクターブ指定)
    b1-b0F-NumFreq Numberの上位2ビット
    BD変調度とパーカッション(プライマリ)
    b7TDトレモロの深さ
    =0:1dB
    =1:4.8dB
    b6VDビブラートの深さ
    =0:7セント
    =1:14セント
    b5PMパーカッションモード
    b4BDバスドラム
    b3SDスネアドラム
    b2TOMタムタム
    b1TCトップシンバル
    b0HHハイハット
    C0-C8チャネルレジスタ3
    b7-b4CH OUTチャネル出力先の設定
    b4=1:左音声に出力
    b5=1:右音声に出力
    b3-b1FeedBackフィードバックの設定
    b0CNTコネクション(アルゴリズム)の設定
    E0-F5スロットレジスタ5
    b2-b0WS波形番号

    • 減衰音と持続音
      egtp0.png
      egtp1.png
      減衰音持続音

    • マルチプルの変化
      MULTI0123456789101112131415
      実際の値1/2123456789101012121515

    • キースケールレートの変化
      KSRキースケール番号
      0123456789101112131415
      00123456789101112131415
      10000111122223333

    • フィードバックの変調度
      FeedBack01234567
      実際の値01/16π1/8π1/4π1/2ππ

    • 標準的な Freq Number の値の例 (オクターブ4)
      音程C#DD#EFF#GG#AA#BC
      周波数(Hz)277.2293.7311.1329.6349.2370.0392.0415.3440.0466.2493.9523.4
      F-Num363385408432458485514544577611647686

    • パーカッションの推奨設定値
      チャネルオペレータ音色名方式設定値
      AMVBEGTKSRMULTIKSLTLARDRSLRRWSBLOCKF-Num
      71バスドラムFM00001001356902577
      20000100158620
      81ハイハットノイズ00001001280802672
      2スネアドラムノイズ0000100138480
      91タムタムサイン波00005001585700896
      2トップシンバルノイズ0000100100540

アルゴリズムの種類

  • 2オペレータモード
    CNTモードアルゴリズム (→出力)
    0FMOp.1 → Op.2 →
    1AMOp.1 →
    Op.2 →

  • 4オペレータモード
    CNTモードアルゴリズム (→出力)
    +0+3
    00FM-FMOp.1 → Op.2 → Op.3 → Op.4 →
    10AM-FMOp.1 →
    Op.2 → Op.3 → Op.4 →
    01FM-AMOp.1 → Op.2 →
    Op.3 → Op.4 →
    11AM-AMOp.1 →
    Op.2 → Op.3 →
    Op.4 →

    ※両モードともOp.1のみセルフフィードバック可

テストモードと波形

WMに1を書き込むと使用可。


w0.png
w1.png
w2.png
w3.png
WS0123

w4.png
w5.png
w6.png
w7.png
WS4567


FM1812の存在チェック方法

AdLib公式のOPL2存在チェック方法:

  1. タイマ1とタイマ2をリセット
    レジスタ4に60hを書き込む
  2. IRQをリセット
    レジスタ4に80hを書き込む
    注: IRQとタイマを同時にリセットすることは出来ない
  3. ステータスレジスタを読む
    ベース+0のポートを読み込んでその値を取っておく
  4. タイマ1をFFhにセット
    レジスタ2にFFhを書き込む
  5. マスクを解除してタイマのカウントをスタート
    レジスタ4に21hを書き込む
  6. ウェイト
    デュレイルーチンなどで最低でも80μ秒の間待機
  7. ステータスレジスタを再度読む
    ベース+0のポートを読み込み、その値を取っておく
  8. タイマ1とタイマ2、そしてIRQを1.や2.と同じようにリセット
  9. 読み込んだ2つのステータスレジスタの値のテスト
    1つ目の値は「0」で2つ目の値は「C0h」で無ければ、OPL2は存在しません。

※1: ステータスレジスタの値をE0hでANDして未使用のビットをマスクした方が良いかも知れません。
※2: いくつかのSound Blaster互換のカードでは動作しないかも知れません。

YMF-262の存在チェック方法

  • リザーブビット(?)で判別する方法
  1. OPL2が存在することを確認
  2. ステータスレジスタを読む
    ベース+0のポートを読み込む。
  3. その値を06hでマスク(AND)する
  4. マスクした値が「0」ならばOPL3、そうでなければOPL2です。


※Sound Blaster互換のカードでは動作しないかも知れません。


  • セカンダリレジスタで判別する方法
  1. プライマリレジスタが存在することを確認
  2. セカンダリレジスタにも同じチェックをする
    プライマリのステータスレジスタでは無くセカンダリのステータスレジスタを読み込んでみる
  3. 2つのセカンダリ ステータスレジスタの値をチェックする
    FM1812を2個搭載している場合、タイマーがプライマリとセカンダリの両方に存在するため、同じ結果になりますなるそうです。
    同じ結果になった場合、4オペレータでは使用できないことになります。

4オペレータモードへの切り替え方法

OPL3に1を書き込み4 OPERATER MODEに対応するチャネルのビットを立てて書き込みます。
チャネル1~3,10~12を4オペレータモードにするとチャネル4~6,13~15がチャネル1~3,10~12のオペレータの一部になり、チャネル4~6,13~15は使用できなくなります。


コメント欄

ご意見やご批判などお待ちしております。
また、スパムなどは無条件で対処させていただきます。



コメントお名前NameLink

[Reload]   [New] [Edit] [Unfreeze] [Diff] [Upload]   [Front page] [List of pages] [Search] [Recent changes] [Backup]   [RSS of recent changes]
Last-modified: 2008/11/18 (Tue) 00:23:18 (5871d)