FPGA 版 FM 音源 (37) -- YMF297 (OPN3/OPL3) 測定 (2)

Nucleo F401RE と YMF297 との間の配線を完了させ、レジスタ・アクセスできるようにしました。 (リセット信号は 8 番ピンのみに接続しています)
いろいろと探っていくうちに、OPN モードと OPL3 モードとの切り替え方法も判明しました。
N/L# (32 番ピン) は当初の予想と違って、OPN/OPL モードの切り替えではなく、OPN モードの中での「YM2608B (OPNA) モード」と「YMF288 (OPN3-L) モード」との切り替えに関するピンであることが分かりました。
「YM2608B (OPNA) モード」と「YMF288 (OPN3-L) モード」との主な違いは、

  • YM2608B (OPNA) モードではFM音源レジスタの内容を読み出せない (ライト・オンリ)
  • スタンバイ(パワーダウン)機能があるのは YMF288 (OPN3-L) モードだけ

の2点です。

という手順で YMF288 (OPN3-L) モードが有効になります。
N/L# = 1 の場合には 0x20 レジスタをいじっても OPNA モードのままで変化しません。
その場合のレジスタ・ダンプを下に示します。

N/L# = 1
CSN# access, A1 = 0
    +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
10: 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 
20: 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 
30: 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 
40: 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 
50: 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 
60: 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 
70: 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 
80: 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 
90: 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F 
A0: A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF 
B0: B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF 
C0: C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF 
D0: D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF 
E0: E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF 
F0: F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE 01 

レジスタの値が読み出せているのは 0x00 〜 0x0F の PSG レジスタのみで、他のレジスタについては、アドレス・レジスタに設定した値がそのままデータとして読み出されているだけで、そのレジスタの内容ではありません。
レジスタ・アドレス 0xFF には「ID コード」の値が読み出されており、YM2608B (OPNA) モードであることを示す「0x01」になっています。
上に示した手順で YMF288 (OPN3-L) モードに設定した場合のレジスタ・ダンプを下に示します。

N/L# = 0
CSN# access, A1 = 0
    +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 DF DF 
20: 02 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 
30: 00 00 00 7F 00 00 00 7F 00 00 00 7F 00 00 00 7F 
40: 00 00 00 7F 00 00 00 7F 00 00 00 7F 00 00 00 7F 
50: 00 00 00 DF 00 00 00 DF 00 00 00 DF 00 00 00 DF 
60: 00 00 00 9F 00 00 00 9F 00 00 00 9F 00 00 00 9F 
70: 00 00 00 1F 00 00 00 1F 00 00 00 1F 00 00 00 1F 
80: 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 
90: 00 00 00 0F 00 00 00 0F 00 00 00 0F 00 00 00 0F 
A0: 00 00 00 FF 00 00 00 3F 00 00 00 FF 00 00 00 3F 
B0: 00 00 00 3F C0 C0 C0 F7 00 00 00 00 00 00 00 00 
C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 

リセット時にFM音源レジスタは、出力チャンネル指定の「L」「R」ビットを除き、すべてゼロ・クリアされます。
レジスタ・アドレス 0xB4 〜 0xB6 のレジスタに L (b7)、R (b6) が割り付けられているので、レジスタ内容としては 0xC0 が読み出されています。
各スロット・レジスタの未使用ビットは「0」に強制され、未使用レジスタは 0xFF と読み出されるので、両方の影響により、スロット・レジスタとして割り当てられていないアドレス、たとえば 0x33 では 0x7F が内容として読み出されています。
アドレス 0xFF の値は 0x02 で、これは YMF288 (OPN3-L) モードであることを示しています。
マイコンとのインターフェースのため、YMF297 では制御信号として、

  • アドレス A1 (10 番ピン)
  • アドレス A0 (9 番ピン)
  • リード・ストローブ RD# (6 番ピン)
  • ライト・ストローブ WR# (4 番ピン)
  • OPN 用チップ・セレクト CSN# (2 番ピン)
  • OPL 用チップ・セレクト CSL# (3 番ピン)

が用意されています。
CSN# でアクセスできるのは OPN レジスタで、CSL# でアクセスできるのは OPL レジスタで、両者は完全に独立しており、後に示すモード切り替えはレジスタ内容に影響しません。
リセット後のデフォルトは OPN モードとなっており、これを OPL モードにするには次のようにします。

  • OPL レジスタ領域のアレイ 1 (A1 = 1) のレジスタ・アドレス 0x05 の b2 (NEW3 ビット) を「1」にする
  • OPL レジスタ領域のレジスタ・アドレス 0xF7 にライト・アクセスする (データの内容は不問)

NEW3 ビットは YMF289 で追加された機能 (レジスタの読み出し、クリア、パワーダウンなど) を有効にするためのビットですが、これを「1」にしなくても最初から OPL 側のレジスタはリード可能です。
通常、OPL2 ではなく OPL3 として利用するので、OPL3 モードを指定する b0 (NEW ビット) と合わせて、アドレス 0x05 のレジスタにはデータとして 0x05 を書き込みます。
NEW3/NEW ビットの設定は初期化時に一回だけ行えばよく、モード切り替えのたびに設定する必要はありません。
OPN モードに戻すには次のようにします。

  • OPN レジスタ領域のレジスタ・アドレス 0xF7 にライト・アクセスする (データの内容は不問)

レジスタ・アドレスは共通の 0xF7 で、違いは OPN 側のレジスタ領域にライト・アクセスすることです。
(2014 年 8 月 6 日追記: これは YMF288 (OPN3-L) モードから OPL モードに移行した場合のみ可能です。 もとが YM2608B (OPNA) モードの場合は OPL モードから OPN モードへは復帰できません。)
OPL モードでは、1 オーディオ・フレームが 68 ビット・クロックで構成され、ビット・クロックの周波数自体は OPN モードと同一のマスタークロックの 1/5 になります。
サンプリング周波数変換は行われていないので、DAC 出力としてのサンプリング周波数と、FM音源としてのサンプリング周波数は同一です。
したがって、16.9344 MHz のマスタークロックを使うと、サンプリング周波数は
16.9344 MHz / (5 × 68) = 3.38688 MHz / 68 = 49.807 kHz
となります。
オリジナルの YMF262 では、マスタークロックとして NTSC カラー・サブキャリア周波数の 4 倍の 14.31818 MHz を使った場合のサンプリング周波数は、
14.31818 MHz / 288 = 49.716 kHz
となりますから、これと比較した場合のサンプリング周波数誤差は約 +0.18 % です。
また、マスタークロックに 33.8688 MHz を使う YMF289 ではFM音源としてのサンプリング周波数は、
33.8688 MHz / 684 = 49.516 kHz
なので、こちらと比較した場合のサンプリング周波数誤差は約 +0.61 % となります。 (YMF289 ではサンプリング周波数変換により DAC 出力のサンプリング周波数は 44.1 kHz となる)
YMF297 では 44.1 kHz サンプリング周波数の 384 倍のマスタークロック 16.9344 MHz を使いますが、DAC 出力およびFM音源としてのサンプリング周波数は 44.1 kHz とは関係のない周波数になっています。