FC机中的VRC6芯片工作机制

 《恶魔城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)。

                                                                                                          

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值