《恶魔城3》的音质那么好,全得益于这个小芯片啊
译者:马子扬
国外的逆向工程资料,翻译整理了一下:
谢谢啊!Kevin Horton !
VRC6 工作机制(参考文献:Kevin Horton 的 VRCVI Chip info):
VRC6 附加声音芯片用于 Konami 的 基于 VRC6(对应 Mapper24
和 Mapper26)的游戏(例如著名的《恶魔城 3 日文版》)中,目
的是增强声音效果,弥补 NES 自身 APU(2A03)芯片处理能力的不
足。
VRC6 声音芯片有 3 个通道,分别是 2 个 方波/数字通道 和一个
锯齿波通道。方波/数字通道 1 对应的控制寄存器地址为 $9000、
$9001、$9002;方波/数字通道 1 对应的控制寄存器地址为 $A000、
$A001、$A002;锯齿波通道对应的控制寄存器地址为 $B000、$B001、
$B002。
-------------------------方波/数字通道工作机制-------------------------
写 $9000、$A000:
D4-D6 : DDD
方波的占空周期设置,实际占空周期为该值加 1,方波
周期为 16 个计数器滴答。
D7 : G
通道功能设置。0=普通的方波通道,1=数字通道。在数
字通道模式下,$9001($A001)和 $9002($A002)将不
起作用。
D0-D3 : VVVV
通道音量。当处于数字通道模式时,D0-D3 仅仅简单地作
为输出的数字声音振幅样本值;当处于方波模式时,将作
为调制方波振幅的因子,起到设置通道音量的作用。
写 $9001、$A001:FFFFFFFF,计数器频率的低 8 位。
写 $9002、$A002:
D0-D3 : FFFF
计数器频率的高 4 位。
D7 : X
1=该通道使能。
结构框图如下:
| F bits | | D bits| | V bits |
| (12) | | (3) | | (4) |
/___________/ /_______/ /________/
+-----+ +----------------+ +-----------+ +------------+
| | | | | | | |--/
| OSC |-->|Divider (12 bit)|-->| Duty Cycle|-->| AND array |(4)> chan out
|(M2) | | | | Generator | | |--/
+-----+ +----------------+ +-----------+ +------------+
^ ^
| |
| |
G X
M2 接收基准频率(VRC6_BASEFREQ,1789772.5 Hz),然后,Divider 根
据设置的频率值(通过 $9001/$A001 和 $9002/$A002,共 12 位)去除那
个基准频率,得到更低的频率作为计数器滴答的频率。这个 Divider 输出
的频率作为占空周期发生器(Duty Cycle Generator)的工作节奏,在方波
模式下,每 16 个滴答作为一个完整的方波周期,在未到达占空周期前,占
空周期发生器输出 1,到达占空周期后,占空周期发生器输出 0,这样就形
成了方波波形;而在数字模式下,占空周期发生器将始终输出 1。另外,如
果通道被禁止,占空周期发生器则始终输出 0。
占空周期发生器的输出 0 时,通过 AND 门的处理,VVVV 将不被输出,通
道输出声音振幅样本 0;
占空周期发生器的输出 1 时,通过 AND 门的处理,VVVV 将作为最终的输
出声音振幅样本(4 位)被输出。
最后,两个方波/数字通道的工作原理完全相同。
-----------------------------------------------------------------------
-------------------------锯齿波通道工作机制-------------------------
写 $B000:D0-D5 : PPPPPP,振幅累加器的步长。
写 $B001:FFFFFFFF,计数器频率的低 8 位。
写 $B002:
D0-D3 : FFFF
计数器频率的高 4 位。
D7 : X
1=该通道使能。
结构框图如下:
| F bits | | P bits|
| (12) | | (6) |
/___________/ /_______/
+-----+ +----------------+ +-----------+
| | | | | |--/
| OSC |-->|Divider (12 bit)|-->| Phase |(5)> chan out
|(M2) | | | |Accumulator|--/
+-----+ +----------------+ +-----------+
^
|
|
X
M2 接收基准频率(VRC6_BASEFREQ,1789772.5 Hz),然后,Divider 根
据设置的频率值(通过 $9001/$A001 和 $9002/$A002,共 12 位)去除那
个基准频率,得到更低的频率作为计数器滴答的频率(这里和方波/数字通
道的工作逻辑相同)。振幅累加器以计数器滴答的频率的一半作为累加频率。
每 14 个计数器滴答(累加器累加 7 次)复位累加器。累加器共有 8 个位。
高 5 位作为输出声音振幅样本输出,而低 3 位被简单地丢弃。
下面是一个累加器工作的例子(假设 PPPPPP=03h ):
计数器滴答:累加器:输出声音振幅样本:
======================================
0、 1 00h 00h(复位累加器)
2、 3 03h 00h
4、 5 06h 00h
6、 7 09h 01h
8、 9 0Ch 01h
10、11 0Fh 01h
12、13 12h 02h
14、15 00h 00h(复位累加器)
产生的锯齿波形如下所示:
- - - 2
--- --- --- 1
--- --- --- 0
另外,如果通道被禁止,振幅累加器则始终输出 0,这样声道就静音了。
--------------------------------------------------------------------
VRC6 的 2 个方波/数字通道加起来,产生 5 位的输出,再与锯齿波通道产
生的 5 位输出相加,最终的 6 位数字声音样本由 VRC6 芯片输往数模转换
器(DAC)。