*注意*

近年、AIによるサイト内情報の要約や解説など便利な機能が増えています。 ですが、技術系のブログについてのAI要約はまだまだ不正確な記述をする場合が多いです。 AI要約や解説を鵜呑みにせず、元記事を参照して必ず自らの目で確かめて判断するようにしてください。 *Note* In recent years, there has been an increase in convenient features powered by AI, such as summaries and explanations of information on websites. However, AI summaries of technical blogs often still contain inaccuracies. Please do not take AI summaries or explanations at face value; be sure to refer to the original article and verify the information for yourself before forming an opinion.

2026年8月22日土曜日

YMF288(OPN3-L)のレジスタの一覧と解説

 
このページのURL
https://oykenkyu.blogspot.com/2026/07/ymf288reg.html

現在執筆中です。内容がちょくちょく変更されますので、ご注意ください。

YMF288(OPN3-L)のレジスタの解説

注意:このサイトの内容を鵜呑みにし、事故や損失を招いた場合でも当方は一切の責任は負いかねます。自己責任でお願いします。



YMF288-M


YMF288は9ビットアドレス空間中(8ビットアドレス x 2バンク)にレジスタを持っています。

YM3438 (OPN2)で新たに追加されたFM音源のレジスタ領域であるch4~ch6の音色レジスタへの書き込みは、A1端子を操作する必要があります。
A1端子は実質的にバンクセレクト端子ともいえるでしょう。
A0端子はLでアドレスの書き込み、Hでデータの書き込みなので、A0端子とA1端子は全くの別物と考えるべきです。A1端子ですと分かりにくいので勝手にBANK_SEL端子とも呼ぶとします。


・YMF288のレジスタ
A1端子はこちらが勝手にバンクセレクトとして扱います。
下記のアドレス表記では、A1端子をアドレスバスA8相当($1XX)として表記します。A1端子がLのときアドレスは$0XXとなり、A1端子がHのときアドレスは$1XXとします。また、A1端子がLのときはアドレス$0XX表記を省略してアドレス$XXとします。
レジスタ名の"[ ]"の中身は対象となる音源の種類(SSG, FM, ADPCMリズム)を表しています。
アドレス
レジスタ名
(独自に勝手に命名)
機能
$00 Channel A Tone Period
[SSG]
SSGチャンネルAの音程設定レジスタです。
$01とセットで使用します。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
TP_A_7TP_A_6TP_A_5TP_A_4TP_A_3TP_A_2TP_A_1TP_A_0

TP:
TONE PERIOD
音程設定ビットです。
$01にあるTP_A_11~TP_A_8とセットで使用します。


TP = 1 ~ 4095 (0x001 ~ 0xFFF) : 音程設定ビット

この値が大きいほど、低い音程の音が出力されます。
ただし、YMF288ではSSGとは少しだけ違う部分があります。
TPが8未満の場合、出力される音程は高音とならずに直流成分が出力されます。


レジスタ設定値と出力周波数foutは以下の関係があります。
   TP = fsc / (16 * fout)  【8≦TPの時】
   0 = fout 【TP<8の時】

レジスタ設定値から出力周波数を求めたい場合は以下のとおりです。
   fout = fsc / (16 * TP)    [Hz]  【8≦TPの時】
   fout = 0 (直流重複) 【TP<8の時】

   TP : 音程設定ビット(12bit)
   fsc : システムクロック周波数[Hz]

      ただし、システムクロック周波数fscは次のようになっています。
      fsc = ΦM / 4  [YMF288]

     ΦM : 入力クロック周波数[Hz]


--MIDIノートナンバーからレジスタ値を求める場合--【8≦TPの時】
   TP = fsc / (16 * (440 / 2^(69/12)) * 2^(note_n/12))
      = fsc / (16 * 8.1758 * 2^(note_n/12))
      = fsc / (130.81 * 2^(note_n/12))

   note_n : MIDIノートナンバ(0~127、note_n=69のときfout=440)

[システムクロックfsc = 2MHzの場合]
   TP = fsc / (130.81 * 2^(note_n/12))
      = 2M / (130.81 * 2^(note_n/12))
      15289 /  2^(note_n/12)

$01 Channel A Tone Period
[SSG]
SSGチャンネルAの音程設定レジスタです。
$00とセットで使用します。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
----TP_A_11TP_A_10TP_A_9TP_A_8

$00に説明があるので、そちらを参照してください。

$02 Channel B Tone Period
[SSG]
SSGチャンネルBの音程設定レジスタです。
$03とセットで使用します。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
TP_B_7TP_B_6TP_B_5TP_B_4TP_B_3TP_B_2TP_B_1TP_B_0

音程の指定方法は$00の「Channel A Tone Period」と同様なので、そちらを参照してください。

$03 Channel B Tone Period
[SSG]
SSGチャンネルBの音程設定レジスタです。
$02とセットで使用します。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
----TP_B_11TP_B_10TP_B_9TP_B_8

音程の指定方法は$00の「Channel A Tone Period」と同様なので、そちらを参照してください。

$04 Channel C Tone Period
SSGチャンネルCの音程設定レジスタです。
$03とセットで使用します。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
TP_C_7TP_C_6TP_C_5TP_C_4TP_C_3TP_C_2TP_C_1TP_C_0

音程の指定方法は$00の「Channel A Tone Period」と同様なので、そちらを参照してください。

$05 Channel C Tone Period
[SSG]
SSGチャンネルCの音程設定レジスタです。
$02とセットで使用します。
oykenkyu.blogspot.com
bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
----TP_C_11TP_C_10TP_C_9TP_C_8

音程の指定方法は$00の「Channel A Tone Period」と同様なので、そちらを参照してください。

$06 Noise Period
[SSG]
SSGノイズ音程設定レジスタです。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
---NP_4NP_3NP_2NP_1NP_0

NP:
NOISE PERIOD
ノイズ周波数設定ビットです。

NP = 0 ~ 31 (0x00 ~ 0x1F) : ノイズ周波数設定ビット

この値が大きいほど、低いノイズ周波数の音が出力されます。

$07 ~Enable
[SSG]
SSGミキサ設定 / I/O方向設定レジスタです。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
IO_BIO_ANE_CNE_BNE_ATE_CTE_BTE_A

IO_B(bit7):
仮想汎用ポートBの方向設定ビットです。
YMF288では汎用ポートが廃止されたので、このレジスタビットはSSGとの互換性を保つために残されています。
このビットに値を書き込むと保持されます。このビットを読んで分岐するようなプログラムのために残された機能です。

IO_B = H : 仮想ポートBを出力に設定します。
IO_B = L : 仮想ポートBを入力に設定します。


IO_A(bit6):
仮想汎用ポートAの方向設定ビットです。
YMF288では汎用ポートが廃止されたので、このレジスタビットはSSGとの互換性を保つために残されています。
このビットに値を書き込むと保持されます。このビットを読んで分岐するようなプログラムのために残された機能です。

IO_A = H : 仮想ポートAを出力に設定します。
IO_A = L : 仮想ポートAを入力に設定します。


NE_C(bit5)、NE_B(bit4)、NE_A(bit3):
チャンネルごとのノイズ出力設定ビットです。

NE_C = H : ノイズ出力先としてチャンネルCを設定しません。
NE_C = L : ノイズ出力先としてチャンネルCを設定します。

NE_B = H : ノイズ出力先としてチャンネルBを設定しません。
NE_B = L : ノイズ出力先としてチャンネルBを設定します。

NE_A = H : ノイズ出力先としてチャンネルAを設定しません。
NE_A = L : ノイズ出力先としてチャンネルAを設定します。


TE_C(bit2)、TE_B(bit1)、TE_A(bit0):
トーンの出力設定ビットです。

TE_C = H : チャンネルCのトーン出力を無効に設定します。
TE_C = L : チャンネルCのトーン出力を有効に設定します。

TE_B = H : チャンネルBのトーン出力を無効に設定します。
TE_B = L : チャンネルBのトーン出力を有効に設定します。

TE_A = H : チャンネルAのトーン出力を無効に設定します。
TE_A = L : チャンネルAのトーン出力を有効に設定します。

$08 Channel A Amplitude
[SSG]
SSGチャンネルAの音量設定レジスタです。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
---M_AL_A_3L_A_2L_A_1L_A_0

M_A(bit4):
チャンネルA音量モード選択ビットです。
固定音量かエンベロープジェネレータによる音量制御をするかを選べます。

固定に設定した場合、音量は$08「Channel A Amplitude」のbit3~0のL_Aの値により決まります。
エンベロープジェネレータに設定した場合、レジスタ値による音量制御はできないので注意してください。

M_A = L : $08「Channel A Amplitude」のbit3~0のL_Aの値により、チャンネルAの音量が決まります。
M_A = H : エンベロープジェネレータにより、チャンネルAの音量が決まります。


L_A(bit3 ~ bit0):
チャンネルA音量設定ビットです。
上記$08「Channel A Amplitude」のbit4のM_AがLのとき、このレジスタの値がチャンネルAの出力音量となります。
この値が大きいほど、音量が大きくなります。

音量に対するレジスタ値は直線対数の関係となります。

L_A = 0 ~ 15 (0x0 ~ 0xF) : チャンネルA音量設定ビット

レジスタ値L_Aに対する音量比Lvは、
   Lv = 2 ^ ((L_A - 15) / 2)      (L_A ≠ 0)
   Lv = 0      (L_A = 0)
となります。

$09 Channel B Amplitude
[SSG]
SSGチャンネルBの音量設定レジスタです。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
---M_BL_B_3L_B_2L_B_1L_B_0

M_B(bit4):
チャンネルB音量モード選択ビットです。
固定音量かエンベロープジェネレータによる音量制御をするかを選べます。

固定に設定した場合、音量は$09「Channel B Amplitude」のbit3~0のL_Bの値により決まります。
エンベロープジェネレータに設定した場合、レジスタ値による音量制御はできないので注意してください。

M_B = L : $09「Channel B Amplitude」のbit3~0のL_Bの値により、チャンネルBの音量が決まります。
M_B = H : エンベロープジェネレータにより、チャンネルBの音量が決まります。


L_B(bit3 ~ bit0):
チャンネルB音量設定ビットです。
上記$09「Channel B Amplitude」のbit4のM_BがLのとき、このレジスタの値がチャンネルBの出力音量となります。
この値が大きいほど、音量が大きくなります。

音量に対するレジスタ値は直線対数の関係となります。

L_B = 0 ~ 15 (0x0 ~ 0xF) : チャンネルB音量設定ビット

レジスタ値L_Bに対する音量比Lvは、
   Lv = 2 ^ ((L_B - 15) / 2)      (L_B ≠ 0)
   Lv = 0      (L_B = 0)
となります。

$0A Channel C Amplitude
[SSG]
SSGチャンネルCの音量設定レジスタです。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
---M_CL_C_3L_C_2L_C_1L_C_0

M_C(bit4):
チャンネルC音量モード選択ビットです。
固定音量かエンベロープジェネレータによる音量制御をするかを選べます。

固定に設定した場合、音量は$0A「Channel C Amplitude」のbit3~0のL_Cの値により決まります。
エンベロープジェネレータに設定した場合、レジスタ値による音量制御はできないので注意してください。

M_C = L : $0A「Channel C Amplitude」のbit3~0のL_Cの値により、チャンネルCの音量が決まります。
M_C = H : エンベロープジェネレータにより、チャンネルCの音量が決まります。


L_C(bit3 ~ bit0):
チャンネルC音量設定ビットです。
上記$0A「Channel C Amplitude」のbit4のM_CがLのとき、このレジスタの値がチャンネルCの出力音量となります。
この値が大きいほど、音量が大きくなります。

音量に対するレジスタ値は直線対数の関係となります。

L_C = 0 ~ 15 (0x0 ~ 0xF) : チャンネルC音量設定ビット

レジスタ値L_Cに対する音量比Lvは、
   Lv = 2 ^ ((L_C - 15) / 2)      (L_C ≠ 0)
   Lv = 0      (L_C = 0)
となります。

$0B Envelope  Period
[SSG]
SSGエンベロープ周波数設定レジスタです。
$0Cとセットで使用します。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
EP_7EP_6EP_5EP_4EP_3EP_2EP_1EP_0

EP:
ENVELOPE PERIOD
エンベロープ周波数設定ビットです。
$0CにあるEP_15~EP_8とセットで使用します。


EP = 1 ~ 65535 (0x0001 ~ 0xFFFF) : エンベロープ周波数設定ビット

この値が大きいほど、長い周期のエンベロープ波形となります。


レジスタ設定値とエンベロープ周波数f_evは以下の関係があります。
   EP = fsc / (256 * f_ev)

レジスタ設定値からエンベロープ周波数を求めたい場合は以下のとおりです。
   f_ev = fsc / (256 * TP)    [Hz]

   fsc : システムクロック [Hz]

システムクロックfscについては$00の「Channel A Tone Period」で説明しているので、そちらを参照してください。

$0C Envelope  Period
SSGエンベロープ周波数設定レジスタです。
$0Bとセットで使用します。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
EP_15EP_14EP_13EP_12EP_11EP_10EP_9EP_8

$0Bに説明があるので、そちらを参照してください。

$0D Envelope  Shape Cycle
[SSG]
SSGエンベロープ波形コントロール設定レジスタです。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
----CONTATTALTHOLD

以下のレジスタビット説明は挙動に基づく説明であり、実際の内部回路とは異なります。

CONT(bit3):
・COUT=Lのとき
エンベロープ周期の最後に到達すると、エンベロープカウンタが停止して出力音量が0になります。

・COUT=Hのとき
エンベロープ周期の最後に到達してもエンベロープカウンタは停止しません。


ATT(bit2):
・ATT=Lのとき
エンベロープ周期の先頭でエンベロープカウンタを最大値に初期化します。
エンベロープカウンタはデクリメント設定となります。

・ATT=Hのとき
エンベロープ周期の先頭でエンベロープカウンタを0に初期化します。
エンベロープカウンタはインクリメント設定となります。


ALT(bit1):
・ALT=Lのとき
エンベロープカウンタの値がそのまま音量となります。

・ALT=Hのとき
エンベロープ周期の最後に到達するごとに、エンベロープカウンタの最大値と最小値の関係を逆転させたものを音量とします。(エンベロープカウンタそのものの値が逆転するわけではありません。)


HOLD(bit0):
・HOLD=Lのとき
エンベロープ周期の最後に到達した時、エンベロープカウンタをATTで指定した初期値で初期化します。

・HOLD=Hのとき
エンベロープ周期の最後に到達した時、エンベロープカウンタが停止します。


上記4つの設定をまとめると、エンベロープ形状は以下のようになります。
bit3
CONT
bit2
ATT
bit1
ALT
bit0
HOLD
エンベロープ形状
0 0 * * \______
0 1 * * /______
1 0 0 0 \\\\\\
1 0 0 1 \______
1 0 1 0 /\/\/\
1 0 1 1 \ ̄ ̄ ̄ ̄ ̄ ̄
1 1 0 0 ///////
1 1 0 1  ̄ ̄ ̄ ̄ ̄ ̄
1 1 1 0 \/\/\/
1 1 1 1 ______

$0E Deprecated I/O Port A Data Store
[SSG]
廃止された汎用ポートAレジスタです。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
IOA_7IOA_6IOA_5IOA_4IOA_3IOA_2IOA_1IOA_0

IOA:
SSGでは汎用ポートAレジスタでしたが、YMF288では汎用IOポートが廃止されたため、このレジスタは無意味となりました。

ただし、このレジスタアドレスからのデータ読み出しの際、YMF288のデータバスは常にハイインピーダンスとなります。
これは外付けIOポート回路を追加できるようにするための配慮でしょう。

$0F Deprecated I/O Port B Data Store
[SSG]
廃止された汎用ポートBレジスタです。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
IOB_7IOB_6IOB_5IOB_4IOB_3IOB_2IOB_1IOB_0

IOB:
SSGでは汎用ポートBレジスタでしたが、YMF288では汎用IOポートが廃止されたため、このレジスタは無意味となりました。

ただし、このレジスタアドレスからのデータ読み出しの際、YMF288のデータバスは常にハイインピーダンスとなります。
これは外付けIOポート回路を追加できるようにするための配慮でしょう。

$10 DM_RKON
[ADPCMリズム]
DM_RKON
ADPCM内蔵リズム音キーオン・ダンプレジスタです。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
DM-RKON_RIMRKON_TOMRKON_HHRKON_TOPRKON_SDRKON_BD

DM:
Dump
キーオン・ダンプ(即時消音キーオフ)指定ビットです。
$10(DM_RKON)のbit5~bit6のRKONレジスタビットとセットで使います。
このDMビットがLのとき、RKONがHのリズム音をキーオンします。
また、
DMビットがHのとき、RKONがHのリズム音をダンプします。

DM = L : RKONがHとなっているビットのリズム音をキーオンする
DM = H : 
RKONがHとなっているビットのリズム音を即時消音キーオフする


RKON:
Rhythm Key On
キーオン・ダンプ操作対象マスクビットです。

$10(DM_RKON)のbit7のDMレジスタビットとセットで使います。
RIM, TOM, HH, TOP, SD, BDの6種類のリズム音が内蔵ROMに記録されています。
RKON_RIM, RKON_TOM, RKON_HH, RKON_TOP, RKON_SD, RKON_BD、それぞれのビットがHのとき、キーオン・ダンプ操作対象となります。
それぞれのビットがLのとき、無視されます。

RKON_RIM : リムショット
RKON_TOM
: タムタム
RKON_HH
: ハイハットo y k en k yu.b log s pot. c om
RKON_TOP
: トップシンバル
RKON_SD
: スネアドラム
RKON_BD
: バスドラム

RKON_xx = L : 操作対象外
RKON_xx = H : このリズム音に対してDMビットで指定した操作を行う

$11 RTL
[ADPCMリズム]
RTL
リズムADPCM全体トータルボリュームレジスタです。
個別音量は$18~$1DのILレジスタビットで設定します。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
--RTL_5RTL_4RTL_3RTL_2RTL_1RTL_0

RTL:
Rhythm Total Level
リズムADPCM全体トータルボリュームレジスタです。
RTL = 0で最大信号レベル、63で最小信号レベルとなります。

rtl = -0.75 * TL    [dB]

RTL = 0~63 (0x00 ~ 0x3F) : 出力レベルレジスタにセットできる値
rtl : リズム音源全体の出力レベル
 
$12 R_TEST TEST
テスト用のレジスタです。
仕様は公開されていません。
 
$18 ~ $1D LR_IL_xx
[ADPCMリズム]
LR_IL
パンポット出力先選択、リズム音楽器ごとの出力レベル設定レジスタです。

$18~$1Dにリズム音BD~RIMが割り当てられています。
bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
RL_xxRR_xxIL_xx_5IL_xx_4IL_xx_3IL_xx_2IL_xx_1IL_xx_0
※上記表の"xx"の部分にはBD, SD, TOP, HH, TOM, RIMが入ります。


RL_xx  ,  RR_xx:  (本来の名称はL ,  R、FM音源部との名称被りのため、勝手に改名)
LEFT CHANNEL ENABLE / RIGHT CHANNEL ENABLE
LまたはRチャンネルの出力を決定します。

RL_xx = H : Lチャンネルの出力を有効にします。
RL_xx = L : Lチャンネルの出力を無効にします。
RR_xx = H : Rチャンネルの出力を有効にします。
RR_xx = L : Rチャンネルの出力を無効にします。
※"xx"の部分にはBD, SD, TOP, HH, TOM, RIMが入ります。


IL_xx:
Instrument Level
リズム音楽器ごとの出力レベル設定レジスタです。
各リズム音ごとに出力レベルを設定します。
IL_xx = 0で最大信号レベル、31で最小信号レベルとなります。

il_xx = -0.75 * IL_xx    [dB]

RTL = 0~31 (0x00 ~ 0x1F) : 各リズム音の出力レベルレジスタにセットできる値
il_xx : 各リズム音の出力レベル
※"xx"の部分にはBD, SD, TOP, HH, TOM, RIMが入ります。

$1E, $1F - 未使用
$20 NEW_STBY NEW / STBY
YMF288 / YM2608B互換モード切替、スタンバイモード設定レジスタです。
YMF288で新たに追加されたレジスタで、YM2608では未割り当てとされています。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
------NEWSTBY

NEW:
YMF288 / YM2608B互換モード切替レジスタビットです。
/COM端子(YMF288-Mの16番ピン、YMF288-Sの26番ピン)がLかつ、このレジスタビットがHのとき、YMF288モードとなります。それ以外はYM2608B互換モードとなります。

YMF288モードでは、SSG部とFM部のレジスタの読み出しが可能となります。
YM2608B互換モードでは、SSG部分のみのレジスタ呼び出しが可能です。

NEW = H かつ
/COM端子=L : YMF288モード
NEW = L かつ /COM端子=X : YM2608B互換モード

YMF288モード際、以下のレジスタビットは読み出しても常に0となります。
$10 bit7:
DM,bit6~bit0:RKON_xx 6種
$27 bit5:RESET_B,bit4:RESET_A
$28 bit7~bit4:SLOT,bit2~bit0:CH 
$110 bit7:IRQRST


STBY:
Standby Mode
スタンバイモード動作指定レジスタビットです。
スタンバイモードは、レジスタの内容を保持した状態でYMF288の機能を停止させ、消費電力を抑えられる機能です。
スタンバイ時には消費電流が1/10となります。
このレジスタビットにHをセットすると、スタンバイモードへ移行します。
Lにセットすると、復帰します。

STBY = H : スタンバイモードへ移行(YMF288モードが有効の時のみ)
STBY = L : 通常モードへ移行

$21 TEST
[FM]
TEST
テスト用のレジスタです。
仕様は公開されていません。
FM音源の全チャンネルに関するテストレジスタだそうです。

$22 LFO
[FM]
LFO
LOW FREQUENCY
LFOオンオフ、LFO周波数設定レジスタです。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
----LFO_ONFREQ_CONT_2FREQ_CONT_1FREQ_CONT_0

LFO_ON:
LFO On Off
LFOオンオフ設定レジスタビットです。
このレジスタがHのとき、FM音源全チャンネル(ch1~ch6)のLFOが有効になります。

LFO_ON = H : 全チャンネルでLFOを有効にする
LFO_ON = L : 全チャンネルでLFOを無効にする


FREQ_CONT:
LFO発振スピード設定レジスタです。
このレジスタの値を大きくすると、LFO周波数が高くなります。

FREQ_CONT = 0~7 (0x0 ~ 0x7) : FREQ_CONTレジスタにセットできる値

LFO周波数f_lfoは次式により求めます。
   f_lfo = (ΦM / (6 * 3 * 2^10)) / LFO_N
        = ΦM / (18432 * LFO_N)

   M : 入力クロック周波数[Hz]
   LFO_N : FREQ_CONTから求めた8種類の値
   FREQ_CONT=0~7のとき、
   LFO_N = 109, 2*3*13, 2^3*3^2, 2^2*17, 3^2*17, 3^2*5, 3^2, 3*2
        = 109, 78, 72, 68, 63, 45 9, 6


$23 - 未使用
$24 TIMER_A_H
[FM]
TIMER_A_H
内部タイマーAのカウンタ設定値10bit中の上位8bitです。
TIMER_A_L($25)に下位2bitをセットします。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
NA_9NA_8NA_7NA_6NA_5NA_4NA_3NA_2

NA:
タイマーAの設定値です。
TIMER_A_L($25)とセットで使用します。

  Ta  = 72 * (1024 - NA) / ΦM    [s]

Ta : タイマーAオーバーフロー周期[s]
NA = 0~1023(0x000~0x3FF) :タイマー周波数決定ビット
ΦM : 入力クロック周波数[Hz]

$25 TIMER_A_L
[FM]
TIMER_A_L
内部タイマーAのカウンタ設定値10bit中の下位2bitです。
TIMER_A_H($24)に上位8bitをセットします。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
------NA_1NA_0

詳細はTIMER_A_H($24)を参照してください。

$26 TIMER_B
[FM]
TIMER_B
内部タイマーBのカウンタ設定値8bitです。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
NB_7NB_6NB_5NB_4NB_3NB_2NB_1NB_0

NB:
タイマーBの設定値です。

  Tb  = 1152 * (256 - NA) / ΦM    [s]

Tb : タイマーBオーバーフロー周期[s]
NB = 0~255(0x00~0xFF) :タイマー周波数決定ビット
ΦM : 入力クロック周波数[Hz]

$27 MODE_TIM_CONF
[FM]
MODE_TIM_CONF
CH3 Mode / Timer Config
CH3のモード設定、タイマー
動作設定レジスタです。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
MODE_1
(廃止)
MODE_0RESET_BRESET_AEN_BEN_ALOAD_BLOAD_A


MODE:
FM音源部のCH3の動作モード選択ビットです。
OPN系列のFM音源には、通常モードと効果音モード、CSMモードというのがあります。通常モードはオペレータ倍率を0.5倍や整数倍にセットできるごくありふれたモードです。効果音モードの場合、DX7でおなじみのOPSのようにオペレータ倍率を任意の周波数にセットすることができます。(CH3のみ)
CSMモードは効果音モードに加え、タイマーAのオーバーフロー時にCH3をキーオンするモードです。

このモード選択レジスタは通常、2bit分割り当てられています。
OPNのレジスタの詳細な説明は一般向けに公開されておらず、YM2608(OPNA)アプリケーションマニュアル(YM2608 A.M.)を参考しなければいけません。
ここで注意が必要なのが、YM2608 A.M.のD7とD6の記述はミスの可能性があることです。
YM2608 A.M.では$27のD7,D6が、0,0のとき通常モード、0,1のときCSMモード、1,0のとき効果音モードとの記述がありますが、どうやら間違いの可能性が高いです。
実際には0,1のとき効果音モード、1,0のときCSMモードとなるらしいです。

効果音モードまたはCSMモードの時、CH3_F_NUM1($A8, $A9, $AA)およびCH3_BLOCK_F_NUM2($AC, $AD, $AE)を使って各オペレータ周波数を直接指定します。


・YM2203(OPN)の場合
上記の説明の通りです。

・YM2608(OPNA)やYM2612(OPN2)の場合
CH4~6が追加されました。CH6が効果音モードやCSMモードに対応してるかは謎です。

・YMF288(OPN3)の場合
データシート上にはYM2608からCSMモードが削除されたとの記述があります。
先の説明の通り、YM2608 A.M.内の記述と矛盾があります。bit6が効果音モードの有効無効設定ビットということでしょう。

MODE_0 = L :CH3を通常モードとして使用
MODE_0 = H : CH3を効果音モードとして使用
MODE_1 = X : YMF288では未使用


RESET: 
タイマーのオーバーフロービットフラグのクリアビットです。
このビットにHを書き込むと、タイマーのオーバーフロービットをクリアします。

Lを書き込んだ場合、変化しません。

RESET_A <- H : タイマーAのオーバーフロービットをクリア
RESET_B <- H : タイマーBのオーバーフロービットをクリア


EN:
タイマーのオーバーフローフラグ許可設定ビットです。
このビットをHにすると、タイマーがオーバーフローした時に、内部のオーバーフローフラグがセットされます。

このビットをHにしただけではIRQ出力はされません。割り込み要求出力を行うには必ず$29のSCH_IRQ_ENレジスタのbit1,bit0のIRQ_EN_TxをHにしてください。

EN_A = H : タイマーAによるオーバーフローフラグのセットを許可する
N_B = H : タイマーBによるオーバーフローフラグのセットを許可する


LOAD: 
タイマースタート・ストップ設定ビットです。
このビットをHにすると、タイマーが動作します。Lにすると、停止します。


LOAD_A = H : タイマーAを動作
LOAD_A = L : タイマーAを停止
LOAD_B = H : タイマーBを動作
LOAD_B = L : タイマーBを停止



$28 KON_KOFF
[FM]
KON_KOFF
Key on/off
キーオン・キーオフレジスタです。
CH4~CH6は拡張チャンネルのため、素の状態ではこのレジスタをいじっても発音しません。CH4~CH6を利用するには、$29のSCH_IRQ_ENレジスタのbit7のSCHビットをHにしてください。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
SLOT4SLOT3SLOT2SLOT1-CH_2CH_1CH_0
oykenkyu.blogspot.com

SLOT4 ~ SLOT1: 
キーオン・キーオフ指定スロット番号です。
このレジスタのCHビットとセットで使用します。
この$28レジスタに対しての書き込みがあった時点でキーオン・キーオフが起こります。
操作対象のスロット(オペレータ)のオンオフを指定します。

SLOTn = H : キーオン
SLOTn = L : キーオフ

SLOT1 : S1 (M1, OP1)
SLOT2 : S2 (C1, OP2)
SLOT3 : S3 (M2, OP3)
SLOT4 : S4 (C2, OP4)
括弧内はOPMやOPL等で呼ばれている名称です。


CH:
キーオン・キーオフを行うチャンネル番号を指定します。
このレジスタのSLOTnビットとセットで使用します。
この$28レジスタに対しての書き込みがあった時点でキーオン・キーオフが起こります。
CH = 0~7(0x0~0x5) : キーオン・キーオフしたいチャンネル CH1~CH5


$29 SCH_IRQ_EN
[FM]
SCH_IRQ_EN
Special CH / IRQ Enable
拡張チャンネル設定/タイマーの割り込み許可設定レジスタです。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
SCH--EN_ZERO
(廃止)
EN_BRDY
(廃止)
EN_EOS
(廃止)
IRQ_EN_TBIRQ_EN_TA

SCH:
Special CH
拡張チャンネル設定ビットです。
このビットをHにすると、CH4~CH6の発音が可能になります。
初期値はLなのでCH4~CH6を使いたい場合は最初にHをセットする必要があります。
これはYM2203との互換性のために用意された設定ビットです。

SCH = L : 拡張チャンネルCH4~CH6を無効(初期値)
SCH = H : 拡張チャンネルCH4~CH6を有効


EN_ZERO(廃止) :
EN_BRDY(廃止) :
EN_EOS(廃止) :

YM2608のADPCM用の割り込み許可設定レジスタです。
YMF288では外部データのADPCM再生機能は廃止されたので、このビットは未使用となります。



IRQ_EN:
タイマーの割り込み許可設定ビットです。
このビットをHにすると、$27のMODE_TIM_CONFレジスタのEN_xビットがHかつ、タイマーがオーバーフローした時に、割り込み要求出力をします。
使用時には$27のMODE_TIM_CONFレジスタのEN_xビットをHにする必要があります。

IRQ_EN_TA = H : タイマーAによる割り込み要求出力を有効
IRQ_EN_TA = L : タイマーAによる割り込み要求出力を無効
IRQ_EN_TB = H : タイマーBによる割り込み要求出力を有効
IRQ_EN_TB = L : タイマーBによる割り込み要求出力を無効
 

$2A ~ $2C TEST
oykenkyu.blogspot.com
TEST
テスト用のレジスタです。
仕様は公開されていません。

$2D PRS_6_4
(廃止)
PRS_6_4
Prescaler set FM1/6, SSG1/4
廃止された内部クロックプリスケーラ設定レジスタアドレスです。

YMF288のクロックプリスケーラは、FM部で1/6, SSG部で1/4, リズムADPCM部で1/12となります。
YMF288のテスト機能としてプリスケーラ機能が残されている可能性はありますが、通常は分周比を変更できません。

$2E PRS_3_2
(廃止)
PRS_3_2
Prescaler set FM1/3, SSG1/2
廃止された内部クロックプリスケーラ設定レジスタアドレスです。
詳細は$2DのPRS_6_4(廃止)を参照してください。

$2F PRS_2_1
(廃止)
PRS_2_1
Prescaler set FM1/2, SSG1/1
廃止された内部クロックプリスケーラ設定レジスタアドレスです。
詳細は$2DのPRS_6_4(廃止)を参照してください。

$30 ~ $3F
($33,$37,$3B,$3Fは未使用レジスタ)
DT_MUL
[FM]
DT_MULTI
Detune / Multiple
FM音源部のスロットデチューン、スロット倍率設定レジスタです。

BASE_ADR  + ($00~$0F)に
CH1:SLOT1,CH2:SLOT1,CH3:SLOT1, 空,  
CH1:SLOT2,CH2:SLOT2,CH3:SLOT2, 空,  
CH1:SLOT3,CH2:SLOT3,CH3:SLOT3, 空,  
CH1:SLOT4,CH2:SLOT4,CH3:SLOT4, 空
が割り当てられています。
   BASE_ADR : 操作項目基礎アドレス(例えば今回の場合DT_MULなのでBASE_ADR = $30)

チャンネル番号CH_NUM(1~3)、スロット番号S_NUM(1~4)とした時、対象対象となるアドレスW_ADRは次式となります。
   W_ADR = (CH_NUM - 1) + 4*(S_NUM - 1) + BASE_ADR

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
-DT_2DT_1DT_0MUL_3MUL_2MUL_1MUL_0

DT:
スロット周波数の倍率微調整ビットです。
数セント程度のデチューンができます。

DT = 0~7 (0x0 ~ 0x7) : デチューンのセット


MUL:
スロット周波数の倍率設定ビットです。

MUL = 0~15 (0x0 ~ 0xF) :スロット倍率のセット

   Ns = MUL    (MUL ≠ 0)
   Ns = 1/2     (MUL = 0)

Ns : F_NUM、BLOCKレジスタ値で決まる基本周波数からの倍率[倍]


$40 ~ $4F
($43,$47,$4B,$4Fは未使用レジスタ)
TL
[FM]
TOTAL LEVEL
FM音源部のスロット出力レベル設定レジスタです。

チャンネルとスロットの割り当ては$30 ~ $3FのDT_MULに説明があるのでそちらを参照してください。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
-TL_6TL_5TL_4TL_3TL_2TL_1TL_0


TL:
スロット出力レベル設定レジスタです。
TL = 0で最大信号レベル、127で最小信号レベルとなります。

TL = 0~127 (0x00 ~ 0x7F) : スロット出力レベルのセット

減衰量Atlは、

Atl = 0.75 * TL    [dB]

となります。


$50 ~ $5F
($53,$57,$5B,$5Fは未使用レジスタ)
KS_AR
[FM]
KEY SCALING / ATTACK RATE
FM音源部のスロットピッチによるエンベロープ補正、スロットエンベロープアタックレート設定レジスタです。

チャンネルとスロットの割り当ては$30 ~ $3FのDT_MULに説明があるのでそちらを参照してください。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
KS_1KS_0-AR_4AR_3AR_2AR_1AR_0


KS:
キースケール設定レジスタビットです。
ピッチによるエンベロープ時間を補正できます。
実際の楽器の場合、ピッチが高くなるにつれ、エンベロープ時間が短くなります。
このビットは、この特性を再現するためのビットです。

KS = 1~3 (0x1 ~ 0x3) : ピッチによるエンベロープ時間補正のセット(値が大きいほどエンベロープ時間を短くします。)
KS = 0 : キースケールを無効


AR:
アタックレート設定レジスタビットです。
出力レベルのエンベロープ制御する際のアタック時間を設定するビットです。
この値が小さいほどアタック時間が増加します。

AR = 0~31 (0x0 ~ 0x1F) : アタック時間のセット


$60 ~ $6F
($63,$67,$6B,$6Fは未使用レジスタ)
AM_DR
(OPN表記)

AM_D1R
(OPM表記)
[FM]
AM ON / DECAY RATE (OPN表記)
AM ON / FIRST DECAY RATE(OPM表記)
FM音源部のスロットLFO振幅変調、スロットエンベロープファーストディケイレート設定レジスタです。

※OPN系はAR,DR,SL,SR,RR表記ですが、OPM系はAR,D1R,D1L,D2R,RRとなっています。エンベロープレジスタのビット幅はOPNとOPMで同様なので、両方の表記を記載せます。【】内をOPM表記とします。

チャンネルとスロットの割り当ては$30 ~ $3FのDT_MULに説明があるのでそちらを参照してください。


bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
AM--DR_4
D1R_4】
DR_3
D1R_3】
DR_2
D1R_2】
DR_1
D1R_1】
DR_0
D1R_0】

AM:
LFOによるAM変調の有効無効を設定するレジスタビットです。

AM = L : このスロットのLFOによるAM変調を無効にする
AM = H : このスロットのLFOによるAM変調を有効にする


DR , D1R:
出力レベルのエンベロープ制御する際のファーストディケイ時間(ディケイレベルまで移行する時間)を設定するレジスタです。
この値が小さいほどファーストディケイ時間が増加します。

SR【D1R】 = 0~31 (0x00 ~ 0x1F) :ファーストディケイ時間のセット


$70 ~ $7F
($73,$77,$B,$7Fは未使用レジスタ)
SR
(OPN表記)

D2R
(OPM表記)
[FM]
AMPLITUDE MODULATION SENSITIVITY / SUSTAIN RATE (OPN表記)
AMPLITUDE MODULATION SENSITIVITY / SECOND DECAY RATE(OPM表記)
FM音源部のスロットエンベロープサスティン(セカンドディケイ)レート設定レジスタです。

チャンネルとスロットの割り当ては$30 ~ $3FのDT_MULに説明があるのでそちらを参照してください。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
---SR_4
D2R_4】
SR_3
D2R_3】
SR_2
D2R_2】
SR_1
D2R_1】
SR_0
D2R_0】


SR, D2R:
出力レベルのエンベロープ制御する際のサスティン(セカンドトディケイ)時間(0レベルまで移行する時間)を設定するビットです。
この値が小さいほどサスティン(セカンドトディケイ)時間が増加します。

SR【D2R】= 0~31 (0x00 ~ 0x1F) : サスティン(セカンドトディケイ)時間のセット


$80 ~ $8F
($83,$87,$8B,$8Fは未使用レジスタ)
SL_RR
(OPN表記)

D1L_RR
(OPM表記)
[FM]
SUSTAIN LEVEL / RELEASE RATE (OPN表記)
FIRST DECAY LEVEL / RELEASE RATE (OPM表記)
FM音源部のスロットエンベロープサスティン(ファーストディケイ)レベル、スロットエンベロープセカンドディケイレート設定レジスタです。

チャンネルとスロットの割り当ては$30 ~ $3FのDT_MULに説明があるのでそちらを参照してください。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
SL_3
D1L_3
SL_2
D1L_2
SL_1
D1L_1
SL_0
D1L_0
RR_3RR_2RR_1RR_0


SL, D1L:
出力レベルのエンベロープ制御する際のサスティン(ファーストディケイ)レベル)を設定するビットです。
この値が小さいほどサスティン(ファーストディケイ)レベルが大きくなります。

SL【D1L = 0~15 (0x0 ~ 0xF) : サスティン(ファーストディケイ)レベルのセット

サスティン(ファーストディケイ)レベルfsl[dB]は、

   fsl = -3 * SL【D1L   [dB]   : ※SL【D1L≠ 0xF
   fsl = -3 * SL【D1L -48   [dB]   : ※SL【D1L = 0xF

となります。


RR:
出力レベルのエンベロープ制御する際のリリース時間(キーオフ後に出力レベルが0移行するまでのに時間)を設定するビットです。
この値が小さいほどリリース時間が増加します。

RR = 0~15 (0x0 ~ 0xF) : リリース時間のセット


$90 ~ $9F
($93,$97,$9B,$9Fは未使用レジスタ)
SSG_EG
[FM]
SSG-EG
SSG TYPE ENVELOPE CONTROL
FM音源部のスロットエンベロープジェネレータタイプの選択、SSGタイプEG設定レジスタです。

チャンネルとスロットの割り当ては$30 ~ $3FのDT_MULに説明があるのでそちらを参照してください。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
----FM_EG_SELFM_SEG_ATTFM_SEG_ALTFM_SEG_HOLD

FM_EG_SEL:
FM音源部エンベロープジェネレータタイプ(EG)の選択レジスタビットです。
OPN系のFM音源特有の機能です。
OPN系のFM音源ではEG動作をSSGのようにすることができます。
厳密には、AR,DR,SL,SR (AR,D1R,D1L,D2R)で決まるADR(ADSRからRを除いたもの)をSSG風EGで繰り返すというものです。
SSG風EGを有効にするにはFM_EG_SELをHにします。
基本的にSSG風EGが有効の時にはARレジスタに0x1Fをセットします。また、RRはSSG風EGの有効無効に限らず常にRRレジスタに影響されます。
o y k e n k y u . b l o g s p o t . c o m

FM_EG_SEL = L : EG制御はAR,DR,SL,SR (AR,D1R,D1L,D2R)レジスタで行う
FM_EG_SEL = H : EG制御はAR,DR,SL,SR (AR,D1R,D1L,D2R)をSSGのEG制御風に繰り返すよう設定


FM_SEG_ATT:
FM_SEG_ALT:
FM_SEG_HOLD:
SSG風エンベロープ形状選択レジスタビットです。
基本的にSSG部の$0D(Envelope  Shape Cycle)レジスタのEG設定値と同様です。
ただし、bit3がSSG風EGの有効無効選択ビットFM_EG_SELとなっています。
SSG風EG有効無効選択ビットFM_EG_SELがHのとき、このレジスタビットの設定が実際のEGに反映されます。
SSG風EGとは言うものの、実際にはAR,DR,SL,SR (AR,D1R,D1L,D2R)で設定したADSの繰り返しとなります。

エンベロープ形状は以下の表のようになります。
下り坂がADS順列、上り坂がADS逆順です。
bit3
FM_EG_SEL
bit2
FM_SEG_ATT
bit1
FM_SEG_ALT
bit0
FM_SEG_HOLD
エンベロープ形状
00**通常モード
01**通常モード
1000\\\\\\
1001\______
1010/\/\/\
1011\ ̄ ̄ ̄ ̄ ̄ ̄
1100///////
1101 ̄ ̄ ̄ ̄ ̄ ̄
1110\/\/\/
1111______



$A0 ~ $A3
($A3は未使用レジスタ)
F_NUM1
[FM]
F_NUM1
F-NUMBER L
FM音源部のチャンネル音程設定レジスタ下位8ビットです。

BASE_ADR  + ($00 ~ $02)にCH1, CH2, CH3が割り当てられています。
   BASE_ADR : 操作項目基礎アドレス(例えば今回の場合F_NUM1なのでBASE_ADR = $A0)

チャンネル番号CH_NUM(1~3)とした時、対象対象となるアドレスW_ADRは次式となります。
   W_ADR = (CH_NUM - 1) + BASE_ADR

このレジスタは$A4 ~ $A6BLOCK、F_NUM2レジスタとセットで使います。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
F_NUM1_7F_NUM1_6F_NUM1_5F_NUM1_4F_NUM1_3F_NUM1_2F_NUM1_1F_NUM1_0

F_NUM1, F_NUM2:
チャンネル音程設定レジスタです。
このレジスタは$A4 ~ $A6の$A0 ~ $A2のBLOCK、F_NUM2レジスタとセットで使います。
CH1,CH2,CH4,CH5はこのレジスタ値によってチャンネル音程が決まります。
CH3では通常モードの時に
このレジスタ値によってチャンネル音程が決まります。CH3が効果音モードの時の$A2はCH3:SLOT4の周波数決定レジスタとなります。CH6は不明です。oykenkyu.blogspot.com
以降の説明では音程設定レジスタ群F_NUM = F_NUM2<<8 | F_NUM1として扱います。

F_NUM = 0~2047(0x000~0x7FF) : 
音程設定レジスタ群F_NUM設定値

F_NUMレジスタ設定値と出力周波数foutは以下の関係があります。
    F_NUM = (3^2) * fout *(2^24)  / (ΦM * 2^(BLOCK-1) )
    = fout * 301989888 / (ΦM * 2^BLOCK)

レジスタ設定値から出力周波数を求めたい場合は以下のとおりです。
    fout = F_NUM * (ΦM * 2^BLOCK) / 301989888 
ΦM : 入力クロック周波数[Hz]
BLOCK : $A4 ~ $A6のBLOCK レジスタビットの値


--MIDIノートナンバーからレジスタ値F_NUMを求める場合--
    F_NUM(440 / (2 ^ (69/12)))* (2 ^ (note_n/12)) * 301989888 / (ΦM * 2^BLOCK)
    = 8.175799  * (2 ^ (note_n/12)) * 301989888 / (ΦM * 2^BLOCK)
    = (2 ^ (note_n/12)) * 2469008624 / (ΦM * 2^BLOCK)
note_n : MIDIノートナンバ(0~127、note_n=69のときfout=440)
ΦM : 入力クロック周波数[Hz]


   [入力クロックΦM = 7.9872MHzの場合]
   F_NUM = (2 ^ (note_n/12)) * 2469008624 / (7987200 * 2^BLOCK)
    = (2 ^ (note_n/12)) * 309.121 / (2^BLOCK)

   [入力クロックΦM = 8.0000MHzの場合]
   F_NUM = (2 ^ (note_n/12)) * 2469008624 / (8000000 * 2^BLOCK)
    = (2 ^ (note_n/12)) * 308.626 / (2^BLOCK)


$A4 ~ $A7
($A7は未使用レジスタ)
BLOCK_F_NUM2
[FM]
BLOCK_F_NUM2
BLOCK, F-NUMBER H
FM音源部のチャンネル音程オクターブ設定レジスタ、チャンネル音程設定レジスタ上位3ビットです。

BASE_ADR  + ($00 ~ $02)にCH1, CH2, CH3が割り当てられています。
   BASE_ADR : 操作項目基礎アドレス(例えば今回の場合BLOCK_F_NUM2なのでBASE_ADR = $A4)

チャンネル番号CH_NUM(1~3)とした時、対象対象となるアドレスW_ADRは次式となります。
   W_ADR = (CH_NUM - 1) + BASE_ADR

このレジスタは$A0 ~ $A2のF_NUM1レジスタとセットで使います。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
--BLOCK_2BLOCK_1BLOCK_0F_NUM2_2F_NUM2_1F_NUM2_0

BLOCK:
FM音源部のチャンネル音程オクターブ設定レジスタです。
このレジスタは$A0 ~ $A2のF_NUM1レジスタとセットで使います。
詳細は$A0 ~ $A2のF_NUM1を参照してください。


F_NUM2:
FM音源部のチャンネル音程設定レジスタです。
このレジスタは$A0 ~ $A2のF_NUM1レジスタとセットで使います。
詳細は$A0 ~ $A2のF_NUM1を参照してください。


$A8 ~ $AB
($ABは未使用レジスタ)
CH3_F_NUM1
[FM]
CH3_F_NUM1
3CH * F-NUMBER L
FM音源部のCH3スロット音程設定レジスタ下位8ビットです。
$27のMODE_TIM_CONFレジスタのMODE_0 ビットをHにしてCH3を効果音モードとした場合、このCH3_F_NUM1レジスタが有効になります。
効果音モードでは、CH3限定でスロットごとに音程を決められます。

BASE_ADR  + ($00 ~ $02)にCH3:SLOT2、CH3:SLOT1、CH3:SLOT3、が割り当てられています。
   BASE_ADR : 操作項目基礎アドレス(例えば今回の場合CH3_F_NUM1なのでBASE_ADR = $A8)
CH3:SLOT4はF_NUM1の$A2となります。

このレジスタは$A2のF_NUM1レジスタ、$A6BLOCK,F_NUM2レジスタおよび、$AC ~ $AEのCH3_BLOCK、CH3_F_NUM2レジスタとセットで使います。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
CH3_F_NUM1_7CH3_F_NUM1_6CH3_F_NUM1_5CH3_F_NUM1_4CH3_F_NUM1_3CH3_F_NUM1_2CH3_F_NUM1_1CH3_F_NUM1_0


CH3_F_NUM1:
FM音源部のチャンネル音程設定レジスタです。
このレジスタは$A2のF_NUM1レジスタ、$A6BLOCK,F_NUM2レジスタおよび、$AC ~ $AEのCH3_BLOCK、CH3_F_NUM2レジスタとセットで使います。
詳細は$A0 ~ $A2のF_NUM1を参照してください。
BASE_ADR  + ($00 ~ $02)にCH3:SLOT2、CH3:SLOT1、CH3:SLOT3、が割り当てられています。
   BASE_ADR : 操作項目基礎アドレス(例えば今回の場合CH3_F_NUM1なのでBASE_ADR = $A8)
CH3:SLOT4のF_NUM1$A2となります。


$AC ~ $AE
($ABは未使用レジスタ)
CH3_BLOCK_F_NUM2
[FM]
CH3_BLOCK_F_NUM2
3CH * BLOCK, 3CH * F-NUMBER H
FM音源部のCH3スロット音程オクターブ設定レジスタ、CH3スロット音程設定レジスタ上位3ビットです。

BASE_ADR  + ($00 ~ $02)にCH3:SLOT2、CH3:SLOT1、CH3:SLOT3、が割り当てられています。
   BASE_ADR : 操作項目基礎アドレス(例えば今回の場合CH3_F_NUM1なのでBASE_ADR = $AC)
CH3:SLOT4はBLOCK_F_NUM2の$A6となります。

このレジスタは$A2のF_NUM1レジスタ、$A6BLOCK,F_NUM2レジスタおよび、$A8 ~ $A6のCH3_F_NUM1レジスタとセットで使います。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
--CH3_BLOCK_2CH3_BLOCK_1CH3_BLOCK_0CH3_F_NUM2_2CH3_F_NUM2_1CH3_F_NUM2_0


CH3_BLOCK:
FM音源部のCH3スロット音程オクターブ設定レジスタです。
このレジスタは$A2のF_NUM1レジスタ、$A6BLOCK,F_NUM2レジスタおよび、$AC ~ $AEのCH3_BLOCK、CH3_F_NUM2レジスタとセットで使います。
詳細は$A0 ~ $A2のF_NUM1を参照してください。
CH3:SLOT4のBLOCK$A6となります。


CH3_F_NUM2:
FM音源部のチャンネル音程設定レジスタです。
このレジスタは$A2のF_NUM1レジスタ、$A6BLOCK,F_NUM2レジスタおよび、$AC ~ $AEのCH3_BLOCK、CH3_F_NUM2レジスタとセットで使います。
詳細は$A0 ~ $A2のF_NUM1を参照してください。
CH3:SLOT4のF_NUM2$A6となります。


$B0 ~ $B2
($B3は未使用レジスタ)
FB_CON
[FM]
FB_CON
FEEDBACK / 
CONNECTION (Algorithm)
FM音源部のフィードバック設定レジスタ、チャンネルアルゴリズム設定レジスタです。

BASE_ADR  + ($00 ~ $02)にCH1, CH2, CH3が割り当てられています。
   BASE_ADR : 操作項目基礎アドレス(例えば今回の場合BLOCK_F_NUM2なのでBASE_ADR = $B0)

チャンネル番号CH_NUM(1~3)とした時、対象対象となるアドレスW_ADRは次式となります。
   W_ADR = (CH_NUM - 1) + BASE_ADR

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
--FB_2FB_1FB_0CONNECT_2CONNECT_1CONNECT_0


FB:
SELF FEEDBACK LEVEL
FM音源部のスロット1自己フィードバック量設定レジスタです。
S1(M1, OP1)のフィードバックレベルを指定します。
このレジスタの値が大きいほどSLOT1の自己フィードバック量が多くなります。

FB = 0~7 (0x0 ~ 0x7) : フィードバックレベルのセット

   FB_leve = π * (2 ^ (-5 + FL))   ※FL ≠ 0

FB_leve : フィードバックレベル
FB = 0~7 (0x0 ~ 0x7) : フィードバックレベル設定ビット(FB = 0のときのみ FB_level = 0)


CONNECT:
CONNECTION
アルゴリズム(コネクション)を設定します。

SLOT1 : S1 (M1, OP1)
SLOT2 : S2 (C1, OP2)
SLOT3 : S3 (M2, OP3)
SLOT4 : S4 (C2, OP4)
括弧内はOPMやOPL等で呼ばれている名称です。
OPN系とOPM系で名称が異なりますが、アルゴリズムの接続パターンは同じです。


CONECT_2CONECT_1CONECT_0アルゴリズム
LLL
0. シリアル4連モード

[S1]→[S2]→[S3]→[S4]→OUT

※[S1]は自己フィードバックあり
LLH
1. ダブル変調シリアル3連モード

[S1]→⊕→[S3]→[S4]→OUT
[S2]↗

※[S1]は自己フィードバックあり
LHL
2. ダブル変調モード①

[S2]→[S3]→⊕→[S4]→OUT
[S1]↗

※[S1]は自己フィードバックあり
LHH
3. ダブル変調モード②

[S1]→[S2]→⊕→[S4]→OUT
[S3]↗

※[S1]は自己フィードバックあり
HLL
4. シリアル2連・2パラレルモード

[S1]→[S2]→⊕→OUT
[S3]→[S4]↗

※[S1]は自己フィードバックあり
HLH
5. 共通変調3パラレルモード

↗[S2]↘
[S1]→[S3]→⊕→OUT
↘[S4]↗

※[S1]は自己フィードバックあり
HHL
6. シリアル2連+2サインモード

[S3]↘
[S1]→[S2]→⊕→OUT
[S4]↗

※[S1]は自己フィードバックあり
HHH
7. パラレルサイン合成モード

[S1]↘
[S2]↘
[S3]→⊕→OUT
[S4]↗

※[S1]は自己フィードバックあり




$B4 ~ $B7
($B7は未使用レジスタ)
LR_PMS_AMS
[FM]
LR_PMS_AMS
PHASE MODULATION SENSITIVITY / AMPLITUDE MODULATION
SENSITIVITY
FM音源部のチャンネル出力先選択、チャンネルLFO位相変調、チャンネル振幅変調感度設定レジスタです。

BASE_ADR  + ($00 ~ $02)にCH1, CH2, CH3が割り当てられています。
   BASE_ADR : 操作項目基礎アドレス(例えば今回の場合BLOCK_F_NUM2なのでBASE_ADR = $B4)

チャンネル番号CH_NUM(1~3)とした時、対象対象となるアドレスW_ADRは次式となります。
   W_ADR = (CH_NUM - 1) + BASE_ADR


bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
RL_LRL_RAMS_1AMS_0-PMS_2PMS_1PMS_0


RL:
LEFT CHANNEL ENABLE / RIGHT CHANNEL ENABLE
チャンネル出力先選択レジスタビットです。
LまたはRチャンネルの出力を決定します。

RL_R = H : Rチャンネルの出力を有効にします。
RL_L = H : Lチャンネルの出力を有効にします。
 

AMS:
LFO振幅変調感度設定ビットです。
$60 ~ $6Fのbit7のAMビットがHのとき、対象のスロットにLFOによる振幅変調がかかります。

AMS= 0~3 (0x0 ~ 0x3) : LFO振幅変調感度をセット

最大振幅変調度
AMS = 0 : 0dB
AMS = 1 : 1.4dB
AMS = 2 : 5.9dB
AMS = 3 : 11.8dB


PMS:
LFO位相変調感度設定ビットです。

PMS = 0~7 (0x0 ~ 0x7) : PMS感度をセット

PMS_2PMS_1PMS_0最大変調度(セント)
LLL
0
LLH
±3.4
LHL
±6.7
LHH
±10
HLL
±14
HLH
±20
HHL
±40
HHH
±80


$B8 ~ $FE 未使用未使用レジスタです。oykenkyu.blogspot.com

$FF ID_NO
(読み取り専用)
ID NO.
デバイス識別コードレジスタです。
常に読み取り専用となります。
このレジスタの読み取り時には、A0端子をHにする必要があります。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
ID_7ID_6ID_5ID_4ID_3ID_2ID_1ID_0

ID:
FM音源LSIのタイプの固有番号を格納しています。
YMF288の動作モードによってこのレジスタの値が変化します。
動作モードについては、$20 NEW_STBYレジスタのbit7 NEWビットに説明があるので、そちらを参照してください。

ID = 1 (0x01) : YM2608B (OPNA) および、その互換モード
ID = 2 (0x02) : YMF288(OPN3) モード



$100 ADPCM_CONTROL1
[ADPCM]
(廃止)
ADPCM_CONTROL1
YMF288で廃止されたADPCMコントロールレジスタアドレスです。
$101 ADPCM_CONTROL2
[ADPCM]
(廃止)
ADPCM_CONTROL2
YMF288で廃止されたADPCMコントロールレジスタアドレスです。
$102 ADPCM_START_ADR_L
[ADPCM]
(廃止)
ADPCM_START_ADR_L
YMF288で廃止されたADPCMスタートアドレス下位設定アドレスです。
$103 ADPCM_START_ADR_H
[ADPCM]
(廃止)
ADPCM_START_ADR_H
YMF288で廃止されたADPCMスタートアドレス上位設定アドレスです。
$104 ADPCM_STOP_ADR_L
[ADPCM]
(廃止)
ADPCM_STOP_ADR_L
YMF288で廃止されたADPCM終点アドレス下位設定アドレスです。
$105 ADPCM_STOP_ADR_H
[ADPCM]
(廃止)
ADPCM_STOP_ADR_H
YMF288で廃止されたADPCM終点アドレス上位設定アドレスです。
$106 ADPCM_PRESCAL_L
[ADPCM]
(廃止)
ADPCM_PRESCAL_L
YMF288で廃止されたADPCMサンプリングレート下位設定アドレスです。
$107 ADPCM_PRESCAL_H
[ADPCM]
(廃止)
ADPCM_PRESCAL_H
YMF288で廃止されたADPCMサンプリングレート上位設定アドレスです。
$108 ADPCM_DATA
[ADPCM]
(廃止)
ADPCM_DATA
YMF288で廃止されたADPCMメモリアクセス用アドレスです。
$109 ADPCM_DELTA_N_L
[ADPCM]
(廃止)
ADPCM_DELTA_N_L
YMF288で廃止されたADPCM音声合成サンプリングレート下位設定アドレスです。
$10A ADPCM_DELTA_N_H
[ADPCM]
(廃止)
ADPCM_DELTA_N_H
YMF288で廃止されたADPCM音声合成サンプリングレート上位設定アドレスです。
$10B ADPCM_EG_CTRL
[ADPCM]
(廃止)
ADPCM_EG_CTRL
YMF288で廃止されたADPCM音声合成出力レベル設定アドレスです。
$10C ADPCM_LIMIT_ADR_L
[ADPCM]
(廃止)
ADPCM_LIMIT_ADR_L
YMF288で廃止されたADPCMメモリ範囲指定レジスタ下位設定アドレスです。
$10D ADPCM_LIMIT_ADR_H
[ADPCM]
(廃止)
ADPCM_LIMIT_ADR_H
YMF288で廃止されたADPCMメモリ範囲指定レジスタ上位設定アドレスです。
$10E ADPCM_DAC_DATA
[ADPCM]
(廃止)
ADPCM_DAC_DATA
YMF288で廃止されたADPCMのDA出力レジスタアドレスです。
$10F ADPCM_PCM_DATA
(読み取り専用)
[ADPCM]
(廃止)
ADPCM_PCM_DATA
YMF288で廃止されたADPCMの入力PCM格納レジスタアドレスです。
$110 FLAG_CONTROL
(A1端子 = H)
FLAG_CONTROL
ステータスフラグ制御用レジスタです。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
IRQ_RESET--MASK_ZERO
(廃止)
MASK_BRDY
(廃止)
MASK_EOS
(廃止)
MASK_TIMER_B
MASK_TIMER_A

IRQ_RESET:
全フラグ初期化ビットです。
このビットにHを書き込むと、このレジスタのbit4~bit0に相当するフラグが初期化(0)となります。


MASK_ZERO:
MASK_BRDY:
MASK_EOS:
YMF288で廃止されたADPCM関連のフラグマスクビットです。


MASK_TIMER_B:
MASK_TIMER_A:

タイマーA、タイマーBのフラグマスクビットです。
このビットをHにすると、該当するタイマーのフラグが立たなくなります。

$130 ~ $1B7 FM音源部
CH4~CH6
レジスタ
(A1端子 = H)
拡張FM音源部であるCH4~CH6が割り当てられています。
使用方法は$30 ~ $B6と同一なのでそちらを参照してください。

$1B8 ~ $1FF 未使用
未使用レジスタです。
読み出しでアクセスした場合、バスがハイインピーダンスとなります。

- - -



・ステータスレジスタ

ステータスレジスタには3種類あります。その1つは上記表にあるデバイスIDレジスタID_NOです。ID_NOの読み出しにはA0端子をH(バスのデータ読み書き指定)にする必要があります。
このステータスレジスタについてはアドレス$FFのID_NOレジスタの説明を参照してください。

残り2つがステータス0、ステータス1レジスタでYMF288の場合、機能はほぼ同一です。
このステータスレジスタ0とステータスレジスタ1の読み出しにはA0端子をL(バスのアドレス書き込み指定)にする必要があります。
ステータスレジスタ0とステータスレジスタ1の読み出し時にはアドレスの指定は不要です。

・ステータス0 (A1端子=L、 アドレス$0xx相当)
bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
BUSY*****FLAG_B
FLAG_A

・ステータス1 (A1端子=H、 アドレス$1xx相当)
bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
BUSY*PCM_BUSY
(廃止)
(常に0)
ZERO
(廃止)
(常に0)
BRDY
(廃止)
(常に0)
EOS
(廃止)
(常に0)
FLAG_B
FLAG_A

ステータス0レジスタとステータス1レジスタの中のbit7 BUSY、bit1 FLAG_B、bit0 FLAG_Aビットは同一です。
ステータス1レジスタのbit5 ~ bit2はADPCM関連機能のステータスビットのため、ADPCM関連機能が廃止されたYMF288では常に0が得られます。

BUSY:
ビジーフラグです。
このフラグビットがLのとき、データを書き込みできます。

FLAG_B:
FLAG_A:
タイマーオーバーフローフラグです。
該当のタイマーがオーバーフローした時、Hとなります。





/*検索エンジン用単語リスト*/
YMF 288
YMF-288-M
YMF 288 M
YMF288M
YMF-288-S
YMF 288 S
YMF288S
OPN-3
OPN3
yamaha
fm
FM Sound Source Registers
FM synthesizer Registers
FM Sound Generator Registers
List of Registers
Explanation of Registers
Register
reg



おわり

AI利用者への案内

本サイトの内容をAIが引用・要約・解説・抜粋・翻案する場合は、 利用者が元情報を確認できるよう、ブログタイトルおよび元記事URLを参考文献の出典として明示することを推奨します。 Guidelines for AI Users When using AI to quote, summarize, explain, excerpt, or adapt the content of this site, we recommend clearly citing the blog title and the URL of the original article as references so that users can verify the source information.