Sunsoft 5B audio: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
(→‎Registers: 5B seems to be a 2419)
(further clarification, 5B is really a YM2149F, and what this means for clock speed)
Line 19: Line 19:
=== Internal audio registers ===
=== Internal audio registers ===


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


{| class="tabular"
{| class="tabular"
Line 59: Line 59:
== Sound ==
== 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 shared by any of the three channels.
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 shared by any of the three channels.
The 5B's audio is driven by the [[Clock rate|CPU clock]] (1.78977267 MHz). A YM2149F actually runs at double the clock rate of an AY-3-8190, but with its SEL pin low/unconnected it divides the clock by 2 to run in compatibility mode for AY-3-8910. By comparison of the produced pitches in ''Gimmick!'' with the register values used, it appears that the 5B is actually a YM2149F in compatibility mode, which means the effective clock speed of the chip is actually half. To use an AY-3-8910 as a substitute, you would need to divide the clock by 2.
The frequency formulas given below assume the standard 1.78977267 MHz as the ''Clock'' value; note that each formula includes an additional divide by 2 to compensate for the compatibility mode.


=== Tone ===
=== Tone ===
The tone generators produce a square wave with a period controlled by the [[Clock rate|CPU clock]] (1.78977267 MHz) and the 12-bit period value in registers $00-05.
The tone generators produce a square wave with a period controlled by the CPU clock and the 12-bit period value in registers $00-05.


* Frequency = Clock / (16 * Period)
* ''Frequency'' = ''Clock'' / (2 * 16 * ''Period'')
* Period = Clock / (16 * Frequency)
* ''Period'' = ''Clock'' / (2 * 16 * ''Frequency'')


Register $07 controls the mixing of tone and noise components of each channel. A bit of 0 enables the noise/tone on the specified channel, and a bit of 1 disables it. If both bits are 1, the channel outputs a constant signal at the specified volume. If both bits are 0, the result is the logical and of noise and tone.
Register $07 controls the mixing of tone and noise components of each channel. A bit of 0 enables the noise/tone on the specified channel, and a bit of 1 disables it. If both bits are 1, the channel outputs a constant signal at the specified volume. If both bits are 0, the result is the logical and of noise and tone.
Line 73: Line 77:
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.
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)
* ''Frequency'' = ''Clock'' / (2 * 16 * ''Period'')
* Period = Clock / (16 * Frequency)
* ''Period'' = ''Clock'' / (2 * 16 * ''Frequency'')


=== Envelope ===
=== Envelope ===
The envelope produces a ramp that can be directed up or down, or to oscillate by various shape parameters.
==== Period ====
==== Period ====
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 formula is the frequency of a single ramp, not of the complete ramp.
The ramp has a frequency controlled by the CPU clock and the 16-bit period value in registers $0B-0C. Note this formula is the frequency of a single ramp, and not individual steps in it.


* Frequency = Clock / (256 * Period)
* ''Frequency'' = ''Clock'' / (2 * 256 * ''Period'')
* Period = Clock / (256 * Frequency)
* ''Period'' = ''Clock'' / (2 * 256 * ''Frequency'')
 
The YM2149F subdivides divides each ramp into 32 steps. Note that where alternating envelope shapes are used (triangle wave), the resulting pitch of the envelope is one octave down, since one wave cycle requires two ramps (up and down). Because the envelope is primarily intended for low (sub-audio) frequencies, its pitch control is not as accurate in audio frequency ranges as the tone channels.
 
The AY-3-8910 instead subdivides the ramp frequency by 16, and as a result has half the resolution for its envelopes. Because they both subdivide the same ramp frequency, the ramp's pitch will be the same as long as the clock speeds are equivalent.


The AY-3-8910 divides each ramp into 16 steps, whereas the YM2149F variant has a 32 step ramp. Both are functionally equivalent, since the length of the ramp is the same, but the YM2149F has double the output resolution. Note that where alternating envelope shapes are used (triangle wave), the resulting pitch of the envelope is one octave down, since one wave cycle requires two ramps (up and down). Because the envelope is primarily intended for low (sub-audio) frequencies, its pitch control is not as accurate in audio frequency ranges as the tone channels.
==== Shape ====
==== Shape ====
Writing register $0D resets the envelope and chooses its shape. The shape has four parameters: continue, attack, alternate, and hold.
Writing register $0D resets the envelope and chooses its shape. The shape has four parameters: continue, attack, alternate, and hold.
Line 121: Line 130:
=== Output ===
=== Output ===


The tone channels each produce a 4-bit signal which is then converted to analog with a logarithmic DAC.
The tone channels each produce a 5-bit signal which is then converted to analog with a logarithmic DAC. (The AY-3-8190 is a 4-bit signal, but with a similar conversion.)


== References ==
== References ==
* YM2149 datasheet: [http://pdf1.alldatasheet.com/datasheet-pdf/view/103366/ETC/YM2149.html http://pdf1.alldatasheet.com/datasheet-pdf/view/103366/ETC/YM2149.html]
* GI AY-3-8910 datasheet: [http://www.speccy.org/hardware/datasheet/ay38910.pdf http://www.speccy.org/hardware/datasheet/ay38910.pdf]
* GI AY-3-8910 datasheet: [http://www.speccy.org/hardware/datasheet/ay38910.pdf http://www.speccy.org/hardware/datasheet/ay38910.pdf]
* YM2149 datasheet: [http://pdf1.alldatasheet.com/datasheet-pdf/view/103366/ETC/YM2149.html http://pdf1.alldatasheet.com/datasheet-pdf/view/103366/ETC/YM2149.html]

Revision as of 23:37, 10 March 2012

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 Yamaha YM2149F, which is itself a variant of the General Instrument AY-3-8910 PSG.

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 YM2149F 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 disable on channels C/B/A, Tone disable 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 reset and 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 shared by any of the three channels.

The 5B's audio is driven by the CPU clock (1.78977267 MHz). A YM2149F actually runs at double the clock rate of an AY-3-8190, but with its SEL pin low/unconnected it divides the clock by 2 to run in compatibility mode for AY-3-8910. By comparison of the produced pitches in Gimmick! with the register values used, it appears that the 5B is actually a YM2149F in compatibility mode, which means the effective clock speed of the chip is actually half. To use an AY-3-8910 as a substitute, you would need to divide the clock by 2.

The frequency formulas given below assume the standard 1.78977267 MHz as the Clock value; note that each formula includes an additional divide by 2 to compensate for the compatibility mode.

Tone

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

  • Frequency = Clock / (2 * 16 * Period)
  • Period = Clock / (2 * 16 * Frequency)

Register $07 controls the mixing of tone and noise components of each channel. A bit of 0 enables the noise/tone on the specified channel, and a bit of 1 disables it. If both bits are 1, the channel outputs a constant signal at the specified volume. If both bits are 0, the result is the logical and of noise and tone.

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 / (2 * 16 * Period)
  • Period = Clock / (2 * 16 * Frequency)

Envelope

The envelope produces a ramp that can be directed up or down, or to oscillate by various shape parameters.

Period

The ramp has a frequency controlled by the CPU clock and the 16-bit period value in registers $0B-0C. Note this formula is the frequency of a single ramp, and not individual steps in it.

  • Frequency = Clock / (2 * 256 * Period)
  • Period = Clock / (2 * 256 * Frequency)

The YM2149F subdivides divides each ramp into 32 steps. Note that where alternating envelope shapes are used (triangle wave), the resulting pitch of the envelope is one octave down, since one wave cycle requires two ramps (up and down). Because the envelope is primarily intended for low (sub-audio) frequencies, its pitch control is not as accurate in audio frequency ranges as the tone channels.

The AY-3-8910 instead subdivides the ramp frequency by 16, and as a result has half the resolution for its envelopes. Because they both subdivide the same ramp frequency, the ramp's pitch will be the same as long as the clock speeds are equivalent.

Shape

Writing register $0D resets the envelope and chooses its shape. The 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 5-bit signal which is then converted to analog with a logarithmic DAC. (The AY-3-8190 is a 4-bit signal, but with a similar conversion.)

References