SC−3000/SG−1000ではSN76489を搭載していたのですが、
MARKIIIではVDP315−5124に内蔵されています。動作クロックは3.579MHz
トーンジェネレータ3つとノイズジェネレータ1つの計4声
内蔵レジスタは8つあります。
I/Oポート
ポート07FHを使用します(出力専用)
07FH:PSGレジスタ
制御方法
マーク(内蔵レジスタ 8個)
000:トーンジェネレータA
001:アッテネータA
010:トーンジェネレータB
011:アッテネータB
100:トーンジェネレータC
101:アッテネータC
110:ノイズジェネレータ
111:ノイズジェネレータアッテネータ
音量の設定
各チャンネルのアッテネータに音量データ(4ビット)を設定します。
d7 :1
d6〜4:マーク(ChA=001、ChB=011、ChC=101、Noise=111)
d3〜0:音量(0000で最大音量、1111でオフ)
チャンネルAの音量を最大にするには、
1001000Bになるので
ポート07FHに090Hを出力します。
チャンネルAの音量OFFの場合、
10011111Bで09FHになります
周波数の設定(トーンジェネレータ)
各チャンネルのトーンジェネレータに周波数データ(10ビット)を設定します
d7:1
d6〜4:マーク(ChA=000、ChB=010、ChC=100、Noise=110)
d3:周波数d3
d2:周波数d2
d1:周波数d1
d0:周波数d0
d7:0
d6:0
d5:周波数d9
d4:周波数d8
d3:周波数d7
d2:周波数d6
d1:周波数d5
d0:周波数d4
周波数データの求め方
F=3.579533/32*D
F:周波数、D:周波数データ、3.575933:クロック数
近似値で求めるしかないので
D=11860/F
440Hzの周波数ならD=111860/440=254.227272...
254として10Bitの二進数で表すと”0011111110B”
チャンネルAに設定する場合
10001110B、00001111Bになり、08EH,00FHの順に出力します。
周波数の設定(ノイズジェネレータ)
d7 :11
d6〜4:マーク(110)
d3 :0
d2 :ノイズフィードバックコントロール(0:周期ノイズ、1:ホワイトノイズ)
d1〜0:周期コントロール
周期コントロール
00:FC/512
01:FC/1024
10:FC/2048
11:トーンジェネレータCの周波数
FC=3.575933
周波数テーブル
d1 | d2 | d3 | d4 | d5 | |
---|---|---|---|---|---|
C | 0355H | 01AAH | 00D5H | 006AH | |
C+ | 0324H | 0193H | 00C9H | 0064H | |
D | 02F8H | 017CH | 00BEH | 005FH | |
D+ | 02CDH | 0167H | 00B3H | 0059H | |
E | 02A5H | 0152H | 00A9H | 0054H | |
F | 027FH | 0140H | 00A0H | 0050H | |
F+ | 025CH | 012EH | 0097H | 004BH | |
G | 023AH | 011DH | 008EH | 0047H | |
G+ | 0219H | 010DH | 0086H | 0043H | |
A | 03F8H | 01FCH | 00FEH | 007FH | 003FH |
A+ | 03BCH | 01E0H | 00F0H | 0078H | |
B | 038DH | 01C4H | 00E2H | 0071H |