* YMF262 [#top] Sound Blaster Pro II (と互換品?)に搭載されている汎用ICです。~ DOSや自作系OS用のアプリを作成するための資料として自分用に整理中。~ ~ ''(以下書きかけです。間違っていたり誤記がある可能性があります)'' ** スペック [#spec] -同時発音数の例 --''2オペレータ18チャネル''&br;すべて2オペレータで使用する場合。 --''2オペレータ15チャネル+リズム5チャネル''&br;7~9チャネルをリズムで使用。 --''4オペレータ6チャネル+2オペレータ6チャネル''&br;7~9チャネルと16~18チャネルは4オペレータにできない。 --''4オペレータ6チャネル+2オペレータ3チャネル+リズム5チャネル''&br;7~9チャネルをリズムで利用。&br;16~18チャネルは4オペレータにできない。 --''4オペレータ2チャネル+2オペレータ14チャネル''&br;仕様を見る限りこういう利用も可能のようだ。しかし、対応したライブラリが無いとチャネルの管理が大変そう。 ~ ** I/Oアドレスマップ [#ioadddressmap] |サウンドカード|ベースポート| |LEFT:Sound Blaster Pro II |LEFT:220h または 240h など(選択可)| |LEFT:AdLib Gold |LEFT:388h| ~ |I/Oポート番号|アクセス|ポートの意味| |ベース+0|R|LEFT:ステータスレジスタ| |~|W|LEFT:プライマリ インデックスレジスタ| |ベース+1|W|LEFT:プライマリ データレジスタ| |ベース+2|W|LEFT:セカンダリ インデックスレジスタ| |ベース+3|W|LEFT:セカンダリ データレジスタ| ~ ** レジスタマップ [#registermap] -ステータスレジスタ (ベース+0) |b7|b6|b5|b4|b3|b2|b1|b0| |IRQ|TF1|TF2|>|-|>|0|-| ~ -データレジスタ (プライマリはベース+1,セカンダリはベース+3) |アドレス&br;(hex)|>|>|>|>|>|>|>|プライマリ||>|>|>|>|>|>|>|セカンダリ| |~|b7|b6|b5|b4|b3|b2|b1|b0||b7|b6|b5|b4|b3|b2|b1|b0| |01h|>|>|>|>|>|>|>|LSI TEST||>|-|>|>|>|>|>|LSI TEST| |~|>|-|WM|>|>|>|>|-||>|~|>|>|>|>|>|~| |02h|>|>|>|>|>|>|>|TIMER 1||>|>|>|>|>|>|>|-| |03h|>|>|>|>|>|>|>|TIMER 2||>|>|>|>|>|>|>|-| |04h|RST|MT1|MT2|>|>|-|ST2|ST1||>|-|>|>|>|>|>|4 OPERATOR MODE| |~|~|~|~|~|~|~|~|~|~|~|~|12|11|10|3|2|1| |05h|>|>|>|>|>|>|>|-||>|>|>|>|>|>|-|NEW| |08h|-|NTS|>|>|>|>|>|-||>|>|>|>|>|>|>|-| |20-35|AM|VB|EGT|KSR|>|>|>|MULTI||AM|VB|EGT|KSR|>|>|>|MULTI| |40-55|>|KSL|>|>|>|>|>|TL||>|KSL|>|>|>|>|>|TL| |60-75|>|>|>|AR|>|>|>|DR||>|>|>|AR|>|>|>|DR| |80-95|>|>|>|SL|>|>|>|RR||>|>|>|SL|>|>|>|RR| |A0-A8|>|>|>|>|>|>|>|Freq Number(L)||>|>|>|>|>|>|>|Freq Number(L)| |B0-B8|>|-|KON|>|>|BLOCK|>|FNum(H)||>|-|KON|>|>|BLOCK|>|FNum(H)| |BD|DAM|DVB|RYT|BD|SD|TOM|TC|HH||>|>|>|>|>|>|>|-| |C0-C8|>|>|>|CH|>|>|FB|CNT||>|>|>|CH|>|>|FB|CNT| |~|D|C|B|A|~|~|~|~||D|C|B|A|~|~|~|~| |E0-F5|>|>|>|>|-|>|>|WS||>|>|>|>|-|>|>|WS| |~|b7|b6|b5|b4|b3|b2|b1|b0||b7|b6|b5|b4|b3|b2|b1|b0| ~ ** スロットの配置 [#signalmap] -2オペレータモード |チャネル|コントロールポート|スロット|スロットポート| |1|A0 B0 C0|1|20 40 60 80 E0| |~|~|4|23 43 63 83 E3| |2|A1 B1 C1|2|21 41 61 81 E1| |~|~|5|24 44 64 84 E4| |3|A2 B2 C2|3|22 42 62 82 E2| |~|~|6|25 45 65 85 E5| |4|A3 B3 C3|7|28 48 68 88 E8| |~|~|10|2B 4B 6B 8B EB| |5|A4 B4 C4|8|29 49 69 89 E9| |~|~|11|2C 4C 6C 8C EC| |6|A5 B5 C5|9|2A 4A 6A 8A EA| |~|~|12|2D 4D 6D 8D ED| |7|A6 B6 C6|13|30 50 70 90 F0| |~|~|16|33 53 73 93 F3| |8|A7 B7 C7|14|31 51 71 91 F1| |~|~|17|34 54 74 94 F4| |9|A8 B8 C8|15|32 52 72 92 F2| |~|~|18|35 55 75 95 F5| ~ -4オペレータモード |チャネル|コントロールポート|スロット|スロットポート| |1|A0 B0 C0 C3|1|20 40 60 80 E0| |~|~|4|23 43 63 83 E3| |~|~|7|28 48 68 88 E8| |~|~|10|2B 4B 6B 8B EB| |2|A1 B1 C1 C4|2|21 41 61 81 E1| |~|~|5|24 44 64 84 E4| |~|~|8|29 49 69 89 E9| |~|~|11|2C 4C 6C 8C EC| |3|A2 B2 C2 C5|3|22 42 62 82 E2| |~|~|6|25 45 65 85 E5| |~|~|9|2A 4A 6A 8A EA| |~|~|12|2D 4D 6D 8D ED| ~ -パーカッションモード~ プライマリデータレジスタBDhのビット5を立てると7~9チャネル(13~18スロット)をパーカッションモードとして使用する。~ パーカッションの発音はBDhを使用し、チャネル7~9は常にオフにしておく。~ |チャネル|スロット|楽器| |7|13|LEFT:スネアドラム| |~|16|~| |8|14|LEFT:ハイハット| |~|17|LEFT:スネアドラム| |9|15|LEFT:タムタム| |~|18|LEFT:シンバル| ~ ※4オペレータモードと2オペレータモードとパーカッションモードは混在可~ ~ ** アルゴリズムの種類 [#connectmode] -2オペレータモード |CNT|アルゴリズム (→出力)|図| |0|RIGHT:Op.1 → Op.2 →|| |1|RIGHT:Op.1 →&br;Op.2 →|| ~ -4オペレータモード |>|CNT|アルゴリズム (→出力)|図| |+0|+3|~|~| |0|0|RIGHT:Op.1 → Op.2 → Op.3 → Op.4 →|| |0|1|RIGHT:Op.1 → Op.2 →&br;Op.3 → Op.4 →|| |1|0|RIGHT:Op.1 →&br;Op.2 → Op.3 → Op.4 →|| |1|1|RIGHT:Op.1 →&br;Op.2 → Op.3 →&br;Op.4 →|| ~ ※両モードともOp.1のみセルフフィードバック可~ ~ ** テストモードと波形 [#waveselect] WMに1を書き込むと使用可。 //|WS|波形|WS|波形| //|0|#ref(w0.png)|4|#ref(w4.png)| //|1|#ref(w1.png)|5|#ref(w5.png)| //|2|#ref(w2.png)|6|#ref(w6.png)| //|3|#ref(w3.png)|7|#ref(w7.png)| |波&br;形|#ref(w0.png)|#ref(w1.png)|#ref(w2.png)|#ref(w3.png)| |WS|0|1|2|3| |波&br;形|#ref(w4.png)|#ref(w5.png)|#ref(w6.png)|#ref(w7.png)| |WS|4|5|6|7| ~ ** FM1812の存在チェック方法 AdLib公式のOPL2存在チェック方法: +''タイマ1とタイマ2をリセット''&br; レジスタ4に60hを書き込む +''IRQをリセット''&br; レジスタ4に80hを書き込む&br; 注: IRQとタイマを同時にリセットすることは出来ない +''ステータスレジスタを読む''&br; ベース+0のポートを読み込んでその値を取っておく +''タイマ1をFFhにセット''&br; レジスタ2にFFhを書き込む +''マスクを解除してタイマのカウントをスタート''&br; レジスタ4に21hを書き込む +''ウェイト''&br; デュレイルーチンなどで最低でも80μ秒の間待機 +''ステータスレジスタを再度読む''&br; ベース+0のポートを読み込み、その値を取っておく +''タイマ1とタイマ2、そしてIRQを1.や2.と同じようにリセット'' +''読み込んだ2つのステータスレジスタの値のテスト''&br; 1つ目の値は「0」で2つ目の値は「C0h」で無ければ、OPL2は存在しません。 ※1: ステータスレジスタの値をE0hでANDして未使用のビットをマスクした方が良いかも知れません。~ ※2: いくつかのSound Blaster互換のカードでは動作しないかも知れません。~ ~ ** YMF-262の存在チェック方法 +''OPL2が存在することを確認'' +''ステータスレジスタを読む''&br; ベース+0のポートを読み込む。 +''その値を06hでマスク(AND)する'' +''マスクした値が「0」ならばOPL3、そうでなければOPL2です。'' ** 4オペレータモードへの切り替え方法 NEWに1を書き込み4 OPERATER MODEに対応するチャネルのビットを立てて書き込みます。~ チャネル1~3,10~12を4オペレータモードにするとチャネル4~6,13~15がチャネル1~3,10~12のオペレータの一部になり、チャネル4~6,13~15は使用できなくなります。~ ~ ** コメント欄 [#commentarea] ご意見やご批判などお待ちしております。~ また、スパムなどは無条件で対処させていただきます。 ---- #comment