Sunsoft 5B audio

From NESdev Wiki
Revision as of 06:58, 10 March 2012 by Rainwarrior (talk | contribs) (→‎Sound: clarifying CPU clock)
Jump to navigationJump to search

The Sunsoft 5B is a superset of the Sunsoft FME-7. It is identical to the FME-7 except it contains extra audio hardware. This audio hardware was only used in one game, Gimmick! Because this game did not use many features of the chip (e.g. noise, envelope), its features are often only partially implemented by emulators.

Registers

The audio hardware is a type of the General Instrument AY-3-8910 PSG, or Yamaha's YM2149F variant.

Audio Register Select ($C000)

7......0
----RRRR
    ++++- The 4-bit internal register to select for use with $E000

Audio Register Write ($E000)

7......0
VVVVVVVV
++++++++- The 8-bit value to write to the internal register selected with $C000

Internal audio registers

The AY-3-8910 has 16 internal audio registers, selected with $C000 and written to with $E000.

Register Bitfield Description
$00 LLLL LLLL Channel A low period
$01 ---- HHHH Channel A high period
$02 LLLL LLLL Channel B low period
$03 ---- HHHH Channel B high period
$04 LLLL LLLL Channel C low period
$05 ---- HHHH Channel C high period
$06 ---P PPPP Noise period
$07 --CB Acba Noise enable on channels C/B/A, Tone enable on channels c/b/a
$08 ---E VVVV Channel A envelope enable (E), volume (V)
$09 ---E VVVV Channel B envelope enable (E), volume (V)
$0A ---E VVVV Channel C envelope enable (E), volume (V)
$0B LLLL LLLL Envelope low period
$0C HHHH HHHH Envelope high period
$0D ---- CAaH Envelope shape: continue (C), attack (A), alternate (a), hold (H)
$0E ---- ---- I/O port A (unused)
$0F ---- ---- I/O port B (unused)

Sound

There are three channels that output a square wave tone. In addition there is one noise generator, and one envelope generator, both of which may be used by any of the three channels.

Tone

The tone generators produce a square wave with a period controlled by the Clock rate and the 12-bit period value in registers $00-05.

Frequency = Clock / (16 * Period) (Clock = 1.78977267 MHz)

Register $07 controls the mixing of tone and noise components of each channel. The tone and noise components are combined with a logical OR. If both are disabled the channel outputs a constant signal at the specified volume.

If bit 4 of registers $08-$0A is set, the volume of the channel is controlled by the envelope generator. Otherwise, it is controlled by the 4-bit value in bits 3-0 of the same register.

Noise

The noise generator produces a 1-bit random wave with a period controlled by the CPU clock and the 5-bit period value in register $06.

Frequency = Clock / (16 * Period)

Envelope

The envelope produces a 4-bit ramp that can be directed up or down, or to oscillate by various shape parameters listed below. The ramp has 16 steps in it, and the steps are advanced with a frequency controlled by the CPU clock and the 16-bit period value in registers $0B-0C. (Note this formulat is the frequency of a single step, not of the complete ramp.)

Frequency = Clock / (256 * Period)

The envelope shape has four parameters: continue, attack, alternate, and hold.

  • Continue specifies whether the envelope continues to oscillate after the attack. If it is 0, the alternate and hold parameters have no effect.
  • Attack specifies whether the attack goes from high to low (0) or low to high (1).
  • Alternate specifies whether the signal continues to alternate up and down after the attack. If combined with hold it provides an immediate flip after the attack followed by the hold.
  • Hold specifies that the value shall be held after the attack. If combined with alternate, the value at the end of the attack will be immediately flipped before holding.
Value Continue Attack Alternate Hold Shape
$00 - $03 0 0 x x \_______
$04 - $07 0 1 x x /_______
$08 1 0 0 0 \\\\\\\\
$09 1 0 0 1 \_______
$0A 1 0 1 0 \/\/\/\/
$0B 1 0 1 1 \"""""""
$0C 1 1 0 0 ////////
$0D 1 1 0 1 /"""""""
$0E 1 1 1 0 /\/\/\/\
$0F 1 1 1 1 /_______

Output

The tone channels each produce a 4-bit signal which is then converted to analog with a logarithmic DAC.