Sunsoft 5B audio: Difference between revisions
No edit summary |
Rainwarrior (talk | contribs) (→Period: trying to make this clearer: the envelope has one-shot and alternating modes, each of which has different pitch, more appropriate to give step frequency (and maybe not muddle things further by unnecessarily describing AY at the same time)) |
||
Line 88: | Line 88: | ||
==== Period ==== | ==== 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 | 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 step of the ramp. | ||
* ''Frequency'' = ''Clock'' / ( | * ''Frequency'' = ''Clock'' / (16 * ''Period'') | ||
* ''Period'' = ''Clock'' / ( | * ''Period'' = ''Clock'' / (16 * ''Frequency'') | ||
The | The 5B divides each ramp into 32 steps, so for repeating ("sawtooth") envelope shapes the resulting frequency will be 1/32 of the step frequency, and for the repeating alternating ("triangle") envelope shapes it will sound at 1/64 of the step frequency. | ||
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 ==== |
Revision as of 06:18, 28 March 2019
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-$DFFF)
7......0 ----RRRR ++++- The 4-bit internal register to select for use with $E000
Audio Register Write ($E000-$FFFF)
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.789773 MHz), but like the NES's APU, the YM2149F has an optional clock divider which halves the internal clock speed. By comparison of the produced pitches in Gimmick! with the register values used, it appears that the 5B is a YM2149F operating in this mode. To use an AY-3-8910 as a substitute, you would need an external divider to reduce the clock speed by half.
The frequency formulas given below assume the standard 1.789773 MHz as the Clock value; note that each formula includes an additional divide by 2 to compensate for the YM2149F's internal divider.
Unlike the 2A03 and VRC6 pulse channels' frequency formulas, the formula for 5B does not add 1 to the period. A period value of 0 appears to produce the same result as a period value of 1.
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)
It is likely implemented as a 17-bit linear feedback shift register with taps at bits 16 and 13.
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 step of the ramp.
- Frequency = Clock / (16 * Period)
- Period = Clock / (16 * Frequency)
The 5B divides each ramp into 32 steps, so for repeating ("sawtooth") envelope shapes the resulting frequency will be 1/32 of the step frequency, and for the repeating alternating ("triangle") envelope shapes it will sound at 1/64 of the step frequency.
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
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. Note that the least significant bit cannot be controlled by the volume register, it is only used by the YM2149F's double-resolution envelope generator. The logarithmic curve increases by 1.5 decibels for each step in the 5-bit signal. This can easily be implemented as a lookup table.
Some emulator implementations that are based on the AY-3-8190 instead treat it as a 4-bit signal with a 3dB per step curve. Since the only extant 5B game does not use the envelope, the difference is unimportant unless accuracy is desired for homebrew 5B work.
The three output channels are mixed together linearly. The output is mixed with the 2A03 and amplified. It is very loud compared to other audio expansion carts.
References
- YM2149 datasheet: http://pdf1.alldatasheet.com/datasheet-pdf/view/103366/ETC/YM2149.html
- GI AY-3-8910 datasheet: http://www.speccy.org/hardware/datasheet/ay38910.pdf