YM2203のレジスタ設定についてまとめます。ググればYM2203のデータシート(英語版)は入手できますが、はっきり言ってデータシートだけではレジスタ設定についてはさっぱり分かりません。いろいろ資料を漁って照らし合わせることで情報を補完しています。まるで古文書研究ですね…
まずはPSG音源(SSG音源)の設定から。FM音源については次回まとめます。なお、「PSG音源(SSG音源)」て書くのめんどくさいので、以降は単にPSG音源と表記します。
※ まだ実機検証してないので、内容の正確性は一切保証いたしません。
レジスタマップ
表記について
表記を簡単にするため、レジスタ値については、@アドレス でそのアドレスの値とします。またレジスタ値の表記では、[ビット番号]で特定の1ビットを表し、[MSB:LSB] の形でビットの範囲を表すことにします。たとえば、 @06h[4:0] は06h番地のビット0〜ビット4の5ビット値を示します。
トーン周波数(音程)
チャンネルA,B,Cの矩形波トーンの周波数を設定します。要は音程の設定です。
f_tone = φM / (64 * TP)
f_tone: トーン周波数
φM: マスタークロック周波数
TP[チャンネルA] = ( @01h[3:0] << 8 ) + @00h[7:0]
TP[チャンネルB] = ( @03h[3:0] << 8 ) + @02h[7:0]
TP[チャンネルC] = ( @05h[3:0] << 8 ) + @04h[7:0]
ノイズ周波数
PSG音源は、矩形波トーン以外に疑似乱数によるランダムノイズを発声することもできます。ランダムノイズは効果音などに用います。その周波数を設定します。
f_noise = φM / (64 * NP)
f_noise: ノイズ周波数
φM: マスタークロック周波数
NP = @06h[4:0]
トーンとノイズのミキサ設定
PSG音源は、チャンネルA,B,Cそれぞれに対し、トーンとノイズのミキシングができます。トーン発生器は3系統ありますが、ノイズ発生器は1系統しかないので、チャンネルA,B,Cで共用です。またミキシングといっても加算されいるわけではなく、高速にチョッパされているそうです。
@07h[0]: チャンネルAのトーン出力制御 (0:ON / 1:OFF)
@07h[1]: チャンネルBのトーン出力制御 (0:ON / 1:OFF)
@07h[2]: チャンネルCのトーン出力制御 (0:ON / 1:OFF)
@07h[3]: チャンネルAのノイズ出力制御 (0:ON / 1:OFF)
@07h[4]: チャンネルBのノイズ出力制御 (0:ON / 1:OFF)
@07h[5]: チャンネルCのノイズ出力制御 (0:ON / 1:OFF)
エンベロープor固定音量
チャンネルA,B,Cの音量をエンベロープで変化させるか、固定音量にするかを設定します。
固定音量は1,3,5,...,31の16段階で設定できます。
@08h[4]: チャンネルAの音量モード (0:固定音量 / 1:エンベロープ)
@09h[4]: チャンネルBの音量モード (0:固定音量 / 1:エンベロープ)
@0Ah[4]: チャンネルCの音量モード (0:固定音量 / 1:エンベロープ)
音量[チャンネルA] = (@08h[3:0] << 1) + 1
音量[チャンネルB] = (@09h[3:0] << 1) + 1
音量[チャンネルC] = (@0Ah[3:0] << 1) + 1
エンベロープ周期
エンベロープの周期を設定します。なお、エンベロープ発生器は1系統しかないので、チャンネルA,B,Cで共用です。
f_envelope = φM / (1024*EP)
f_envelope: エンベロープ周波数
φM: マスタークロック周波数
EP = (@0Ch[7:0] << 8) + @0Bh[7:0]
IOAとIOBの方向とデータ
汎用入出力ポート機能です。これは音源とは直接関係ない機能です。アタリ規格のジョイスティックの接続によく活用されていました。
@07h[6]: IOA[7:0]の方向 (0:入力 / 1:出力)
@07h[7]: IOB[7:0]の方向 (0:入力 / 1:出力)
@0Eh[7:0]: IOA[7:0]の値
@0Fh[7:0]: IOB[7:0]の値