SCCの仕様

SCCには、メガロムに搭載されているものと、スナッチャー、SDスナッチャーに付属のサウンドカートリッジの2種類があります。また、スナッチャー、SDスナッチャー付属のサウンドカートリッジは、メガロムのSCCと互換で動くモード(このページでは、互換モードと表記)と、全く別の動作をするモード(同じく、固有モードと表記)を持っています。

SCC5チャンネルのウェーブ音源を搭載し、各チャンネル独立(メガロムは制限有り)で波形データを持つことができ、波形データの再生レートは、各チャンネルごとに独立で指定することがます。また、各チャンネルごとに16段階の音量を指定することがでます。

・スナッチャー系SCCのレジスタマップ
固有モード
このモードは、0BFFEHに20Hを書き込み、0B000Hに80Hを書き込むことで、このモードになります。
B800-B81FH チャンネルA用波形データ
B820-B89FH  同様に、32バイトずつチャンネルB〜E用波形データ

B8A0-B8A1H  チャンネルA用分周比
B8A2-B8A9H  同様に、2バイトずつチャンネルB〜E用分周比

B8AAH       チャンネルA用音量
B8AB-B8AEH  同様に、1バイトずつチャンネルB〜E用音量

B8AFH       チャンネルイネーブル。

B8C0-B8DFH  モード設定レジスタ
互換モード
このモードは0BFFEHに0を書き込み、9000Hに3FHを書き込むことで、このモードになります。
9800-981FH チャンネルA用波形データ
9820-987FH  同様に、32バイトずつチャンネルB〜D用波形データ

9880-9881H  チャンネルA用分周比
9882-9889H  同様に、2バイトずつチャンネルB〜E用分周比

988AH       チャンネルA用音量
988B-988EH  同様に、1バイトずつチャンネルB〜E用音量

988FH       チャンネルイネーブル。

98A0-98BFH チャンネルE波形データ(読み込み専用)

98C0-98DFH  モード設定レジスタ

チャンネルEの波形データは、固有モードに変更してから書き込むか、互換モードでチャンネルDの波形データを変更すると、チャンネルEも同一内容に変更されます。
・メガロムのSCCのレジスタマップ
SCCをアクセスするには、9000Hに3FHを書き込む必要があります。

9800-981FH チャンネルA用波形データ
9820-985FH 同様に、32バイトずつチャンネルB〜C用波形データ
9860-987FH チャンネルD、E共通波形データ

9880-9881H チャンネルA用分周比
9882-9889H 同様に、2バイトずつチャンネルB〜E用分周比

988AH   チャンネルA用音量
988B-988EH 同様に、1バイトずつチャンネルB〜E用音量

988FH       チャンネルイネーブル。

98E0-98FFH モード設定レジスタ。
基本的に、スナッチャー系SCCの互換モードと同一ですが、モード設定レジスタのアドレスが異なります。また、チャンネルEの波形データはチャンネルDと共用となり、独立で設定はできません。
・各レジスタの動作について
・波形データ
8ビット符号付きPCMデータと同一形式で、-128(80H)から+127(7FH)までです。各チャンネル32バイトあります。

・分周比
波形データを再生する時の、再生レートを指定します。実際の再生レートは、システムクロック(3.58MHz)をこのレジスタの値+1で割った値になります。
指定できる範囲は、0〜0FFFHの12ビットですが、0〜8を指定した場合は、発音はしません。
※ちなみに、『このレジスタの値「+1」で割った値』なので、PSGの周波数設定レジスタとは1ずれます。たとえば、波形データとして1周期分の矩形波を設定した場合、PSGと同じ周波数にするのであればPSGより1減算した値を設定する必要があります。

・音量
再生する音量を指定します。範囲は0〜0FHです。

・チャンネルイネーブル
発音するチャンネルを設定します。
ビット0がチャンネルAに対応し、順にBIT1はB、・・・、BIT4がEになります。
それぞれに対応したビットを1にする事で、発音できるようになります。

・モード設定レジスタ
モード設定レジスタは、32バイトありますが、どのアドレスに書き込んでも結果は変わりません。
動作はビットごとに分かれており、次のような機能があります。1にすると有効になります。リセット直後は0です。
bit0:分周比を4ビットにします。実際の分周比は、分周比レジスタの1/256になります。
bit1:分周比を8ビットにします。ビット8〜11は0になります。
bit2:?
bit3:?
bit4:?
bit5:分周比レジスタに値を書き込むと、対応する波形データを先頭から再生しなおします。
bit6:全チャンネルの波形データがローテートします。方向は、+0にあったデータが+1に移動します。ローテートする時間は、3.58MHz÷(分周比レジスタの値+1)です。波形データメモリは全チャンネル書き込み禁止になります。
bit7:チャンネルDの波形データのみがローテートします。波形データメモリはチャンネルD,Eだけが書き込み禁止になります。このビットは、メガロムでのみ有効です。

・SCCのバグ?
勝手に解析をしておいて、その解析結果に当てはまっていない動作をバグと言うのかどうかは疑問が残るところですが、とりあえずバグとしておきます。
恐らく、ハードウェアの設計の簡略化段階で、このバグが発生することは明らかだったとは思いますが、コスト削減と、通常の音楽用音源としての用途からするとほぼ気にならないレベルなので、そのまま残ってしまったものと思われます。スナッチャー系で若干改良されているのは、音楽担当者のこだわりでしょうか。

現在、解かっている点は、以下のような物です。 おそらく、これらは各チャンネルの波形メモリが2つ以上の処理を同時に処理できないために起こる障害だと思われます。
例として、SCCが波形メモリに対して読み込み動作を行い、その値をDAコンバーターに出力する際に、同時に波形メモリに対してMSXがアクセスをすると、MSX側が優先され、SCCが波形メモリからデータを読みとれずにノイズとなってしまう、という事だと思います。これらについては、そのうち詳しく調べてみたいと思います。

・SCCの波形データ、音量と、DAコンバーターに出力される値の関係
SCCは、各チャンネル音量が16段階、波形データが256段階あるので、DAコンバーターは、16×256×5=20480段階以上の分解能(15ビット)を必要とするはずですが、実際にはメガロム、スナッチャー系のどちらも11ビットのDAコンバーターしかついていません。ここに出力される値は次の様に丸め処理がおこなわれています。
この数式は、メガロム、スナッチャー系(互換、固有の両モード)のどちらも同じ式が使われています
各チャンネルの出力される値(Cout)
 Cout=波形データ値×音量÷16+128
ただし、値は整数値で計算され、小数点以下の値は切り捨てられます。
ここで、16でわり算をしていることで、4ビットの丸め処理がおこなわれます。
チャンネルイネーブルレジスタで、発音を禁止している場合は、128に固定されます。
最終的にDAコンバーターへ出力される値は、単純に上記の式で求まった値を全チャンネル分足し算したものになります。つまり、初期状態では640が出力され、最小値で40、最大値で1235が出力されます。
※このページの内容は、裕之が独自に解析したものであり、また、その内容についての保証もありません。このページの内容について、コナミ株式会社に質問をするという行為は絶対にしないで下さい。

感想、要望、バグ報告、その他何かありましたら、メールもしくは掲示板にてご連絡ください。
裕之  
ホームに戻る