Changes
PSG
,/* Other Variants */
The Programmable Sound Generator (PSG) is able to output three separate a sound channels chip designed by General Instrument (named Channel A, B and CGI)in 1978. Each channel can be The specific model used to output tones and/or white noisein the CPC is the AY-3-8912 chip.
===00h - Channel A Tone Frequency Low (8bit)===
===05h - Channel C Tone Frequency High (4bit)===
The tone (square wave) frequency in Hertz is calculated as follows:
F = 4MHz 1MHz / 64 16 / nn ;with nn in range 1..4095 (nn=0 acts as nn=1)
Possible frequencies are in range from 62500Hz (nn=1) down to approx. 15.26Hz (nn=4095).
The noise frequency in Hertz is calculated as follows:
F = 4MHz 1MHz / 64 16 / nn ;with nn in range 1..31 (nn=0 acts as nn=1)
Noise can be output on all 3 channels, but there is only one noise generator (so all channels share the same noise frequency). The noise generator consists of 17bit shift register, and a 1bit noise level (0=LOW or 1=HIGH). These are updated at the selected frequency as follows:
Envelope step frequency (tone or noise) calculated as follows:
F = 4MHz 1MHz / 64 16 / nn ;with nn in range 1..65535 (nn=0 acts as nn=1)
Depending on the envelope shape, the volume is incremented from 0 to 15, or decremented from 15 to 0. In either case it takes 16 steps to complete, the completion time for 16 steps is therefore:
T = nn*1024 256 / 4MHz 1MHz ;with nn in range 1..65535 (256us .. 16.7 seconds)
=== 0Dh - Volume Envelope Shape (4bit) ===
Writing to this register (re-)starts the envelope. Additionally, Both components of the envelope's phase are reset. The first step of the envelope has full duration every time. It is never shorted. [https://forums.nesdev.org/viewtopic.php?p=236672#p236672 Source] The written value specifies the envelope shape, the four bits have the following meaning:
Bit 0 Hold (1=stop envelope past first cycle)
The possible combinations and resulting shapes are:
When using the volume envelope generator, the volume is always increased from 00h to 0Fh (or vice versa), it is not possible to specify a starting/ending point (like from 00h to 07h).
==== Bit 2 (Attack) ====
This bit is only responsible for the starting point of the envelope and the direction. We have:
volume = 0 if attack else 15 # Start at 0 for attack, 15 for decay
direction = 1 if attack else -1 # Upward for attack, downward for decay
==== Bit 3 (Continue), Bit 1 (Alternate) and Bit 0 (Hold) ====
When bit3 = 0, volume and direction at the end of a period are always 0.
When bit3 = 1, bit1 and bit0 determine what happens to volume and direction at the end of a period.
==== Algorithm ====
def envelope_step(volume, direction, shape):
volume += direction
if volume > 15 or volume < 0:
match shape:
case 8 | 12:
volume &= 0x0f # direction is unchanged
case 10 | 14:
direction *= -1
volume += direction
case 11 | 13:
direction = 0
volume = 15
case _:
direction = 0
volume = 0
return volume, direction
=== 0Eh - External Dataregister Port A ===
This register receives data from the CPC keyboard (or joystick), for more information read the chapter about the [[Programming:Keyboard_scanning|CPC Keyboard Matrix]]. This register can be also used as output port by setting bit 6 of the PSG control register to 1 (that would allow to use the six data pins of the joystick connector to output data to external hardware).
=== 0Fh - External Dataregister Port B ===
This register is not used in CPC computers. In detail, a AY-3-8910 sound chip would have external connectors for this register, so that it could be used as a further IO port, but the CPC's sound chip (AY-3-8912, in 28 pin package) doesn't have such connectors, even though the register still does exist internally.
== D/A converter table Noise Generator ==These are the 16-bit values used in Arkos Tracker. They are more accurate than the datasheet you can find, as they were tested electronically by Grim and Zik directly from a real CPC:
However, the algorithm is described in detail in the [[Media:Microchip ay8930.pdf|AY-8930 datasheet]]. And it disagrees with MAME, the input to the shift register is bit0 XOR bit2. And it seems bit1 is the output. [[File:AY38910A noise block diagram.png]] <br> == D/A converter table ==These are the 16-bit values used in Arkos Tracker. They are more accurate than the datasheet you can find, as they were tested electronically by Grim and Zik directly from a real CPC: 0, 231, 695, 1158, 2084, 2779, 4168, 6716, 8105, 13200, 18294, 24315, 32189, 40757, 52799, 65535 For the record, these are [https://groups.google.com/g/comp.sys.sinclair/c/-zCR2kxMryY Matthew (Gasman) Westcott measurements] (normalised) on its ZX Spectrum: 0, 0.0105, 0.0154, 0.0216, 0.0314, 0.0461, 0.0635, 0.1061, 0.1319, 0.2163, 0.2973, 0.3908, 0.5129, 0.6371, 0.8186, 1 The datasheet show different values: 2 steps down = half values down. Thus, the theoretical formula is f(x) = 2 ^ ((x - 15) / 2) with x between 0 1 and 15.
This is the volume table used by BSC:
[[File:PSG DAC volume table.jpg]]
ETO once started testing the output levels (to be fair, with a multimeter only) and it was very close to the theoretical value based on the data sheet and how the CPC mixes the channels.See [https://www.cpcwiki.eu/forum/technical-support/amstrad-cpc-volume-decibel-table/ Discussion on the forum] Volume 0 is indeed silent. It is not just logarithmic attenuation where maximum attenuation of a channel is just very quiet and not silent. [https://forums.nesdev.org/viewtopic.php?p=236734#p236734 Source] <br> == Mono and Stereo Output ==When using the CPC's external stereo jack, the stereo output causes channel A of the PSG to be heard on the left, channel C to be heard on the right and channel B to be heard in the middle. [http://winape.net/help/sound.html Source] In that case, channel B is output through a bigger resistor to prevent that this channel appears louder than the others. Otherwise (when using the built-in speaker), all three channels are mixed at the same intensity. This signal appears to be also sent to the Tape output line also, so a connected Data Recorder could be used to record CPC music also. <br> == BASIC Sound Test == You can test the PSG sound channels by typing simple SOUND commands in BASIC. You should hear a 440Hz sound for 10 seconds at full volume for each of these commands: SOUND 1,440,1000,15 should produce sound in the left speaker. (channel A) SOUND 2,440,1000,15 should produce sound in both speakers. (channel B) SOUND 4,440,1000,15 should produce sound in the right speaker. (channel C) <br>
== Block Diagram ==
*[[File:PSG Block Diagram.png]]
Much like the [[CRTC]] chip, the PSG consists of a few simple functional blocks consisting of counters, equality comparators and some fairly simple logic. Careful studies of the chip output prove that the chip '''counts up''' from 0 until the counter becomes '''greater or equal''' to the period, at which point the output flips and the counter resets to 0. (This means that shortening the period can cause an immediate flip if the phase counter is already past the new period value.) This is an important difference when the program is rapidly changing the period to modulate the sound. This is worthwhile noting, since the datasheets say that the chip counts down. Also, note that period =0 is the same as period = Datasheet 1. This is mentioned in the YM2203 datasheet. However, this does NOT apply to the Envelope period. In that case, period =0 is half as period =1. [https://github.com/mamedev/mame/blob/master/src/devices/sound/ay8910.cpp Source] (Does this last sentence apply only to the SSG or to the PSG as well?) The tones, the noise, and envelope are never halted. All of them are continually active whether or not they're connected to an audible output. Things that have been verified not to halt things: [https://forums.nesdev.org/viewtopic.php?p=236745#p236745 Source]* Volume 0 does not halt tone or noise* Tone disable bit does not halt tone* Setting all 3 noise disable bits does not halt noise* Clearing all 3 channel volume envelope bits does not halt envelope* Period value of 0 does not halt any of these (treated as period 1 in all cases) <br> == Schematics == The PSG is driven by an external clock at 1MHz provided by the [[MediaGate Array]].The AY chip has an internal clock divider by 8 which means that it works internally at 125KHz, outputting 125,000 samples per second for each channel. The BC2 and A8 pins are always equal to 1 as they are connected to +5V.The /A9 pin is non-existent on the AY-3-8912 model. On the Amstrad CPC 6128 chassis diagram, we can see how the 3 channels of the PSG are mixed to the stereo jack (with channel B being split in half between the left and right output). And the 3 channels being mixed in equal parts to mono for the speaker and tape port. [https:Ay3//www.cpcwiki.eu/imgs/4/4a/CPC6128_Schematic.png Source] <br> == Chip Variants == === IC models used in CPC === These are the ones known to be used in the CPC by looking at pictures of CPC mainboards. All should operate almost identically. * GI AY-891x3-8912 [https://www.pdfcpcwiki.eu/imgs/c/cc/CPC464_PCB_Top_%28Z70378_MC0046A%29.jpg Source]* GI AY-3-8912A [https://www.cpcwiki.eu/imgs/f/f1/CPC6128_PCB_Top_%28Z70290_MC0020B%29.jpg Source]* Microchip AY-3-8912 [https://www.cpcwiki.eu/imgs/c/cf/AmstradCPC464_Z70375_MC0044D_GA40010_PCB_Top.jpg Source]* Microchip AY38912/P [https://www.cpcwiki.eu/imgs/5/5e/CPC464Plus_MC0122B_2700-016P-3_PCB_Top.jpg Source] === Other Variants === The PSG chip family is composed of 3 variants:* the AY-3-8910, with two 8-bit I/O ports and a 40-pin package* the AY-3-8912, with one 8-bit I/O port and a 28-pin package* the AY-3-8913, with no I/O port and a 24-pin packageIn addition to the CPC, these chips were also used in the [[KC Compact]], [[ZX Spectrum]], [[MSX]], [[Oric-1/Atmos|Oric]], [[EG2000 Colour Genie]], [[Vectrex]], [[Intellivision]] and in the Mockingboard expansion for the [[Apple II]]. There are also PSG clones: Toshiba T7766A, Winbond WF19054, JFC 95101 and File KC89C72. [https://wiki.agiri.ninja/sound_chip_clones:index Source] Yamaha produced the SSG (Software-controlled Sound Generator) chip family (YM2149F, YM3439, YMZ294, YMZ284, YMZ285) which is a quasi-clone of the PSG. The main difference is that the envelope counter on the PSG has 16 steps. On the SSG it has twice the steps, happening twice as fast. This chip equips the [[Atari ST]], [[Aleste 520EX]] and [https://www.msx.org/wiki/Yamaha_YM2149 some MSX computers]. It is also used in the [[PlayCity]] expansion. The SSG has also been integrated as a component inside some of the arcade soundchips of the Yamaha OPN family. That's why you can find it in the [[Neo-Geo]] as a component inside the YM2610 soundchip. And the same is true for the OPN3 soundchip of the [[Play2CPC]] expansion. The chip is clocked differently depending on the computer: ZX Spectrum: 1773400 Hz ; Pentagon: 1750000 Hz ; MSX: 1789772 Hz ; CPC: 1000000 Hz ; Oric: 1000000 Hz ; Atari ST: 2000000 Hz. The EPSG (AY-3-891x datasheet8930), used in the Covox Sound Master soundcard on PCs, is a register-compatible evolution of the AY-3-8910:* The pulse width can be changed from square to 8 other duty cycles* There are 3 independent envelope generators, 1 for each channel* The amplitude control is more accurate (5-bit instead of 4-bit)* The tone period setting is more accurate (16-bit instead of 12-bit)* The noise period setting is more accurate (8-bit instead of 5-bit)* The noise tone can be changed by applying an AND and OR mask to the output === Competitors === The PSG chip competed with the DCSG (Digital Complex Sound Generator) chip family (SN76489, SN94624, TMS9919) by Texas Instruments. The DCSG has similar sounding features except that it does not have any envelope control and that its noise generator has its own dedicated channel. === Replacing the AY-3-8912 in the CPC with an AY-3-8910(A) === In case that the AY-3-8912 needs to be replaced in the CPC it can become a hurdle these days to get a real AY-3-8912 especially for an acceptable price. Instead of the original AY-3-8912 it's possible to use an AY-3-8910(A) instead with the help of a small adapter board. An open source adapter board can be found here: https://github.com/etomuc/CPC-AY-3-8910-to-8912-adapter For tips regarding the desoldering of ICs see this Wiki page: [[IC Repair]] <br>
== Links ==
*[http://en.wikipedia.org/wiki/General_Instrument_AY-3-8910 Wikipedia on the PSG]
*[[Media:Ay3-891x.pdf|AY-3-891x datasheet]] [[Media:Ym2149 datasheet.pdf|YM2149 datasheet]]
*[http://quasar.cpcscene.net/doku.php?id=assem:psg Quasar PSG documentation (in french)]
*[https://youtu.be/C4ezcX1W2_Y Mix I] [https://youtu.be/gH57xU9c7dE Mix II] [https://youtu.be/e7V3EMXF97g Mix III] AMSTRAD CPC MUSIC 1 hour
*[https://youtu.be/AhgUwqv2yAE Space Debris - Amstrad CPC Soundtrakker cover] [https://youtu.be/E_plcHyOC_8 RUN! - SID emulation on Amstrad CPC] by [[BSC]]
*[https://nguillaumin.github.io/ym-jukebox/ YM Jukebox] [https://ym.mmcm.ru/ AY Music Collection]
<br>
[[Category:Hardware]]
[[Category:Music and sound| ]][[Category:Video contents]][[Category:CPC Internal Components]]