Changes
/* Reading to the selected PSG register */ section title was missing (format)
The [[Amstrad CPC]], CPC+ and [[KC Compact]] use a AY-3-8912 Programmable sound generator (referred to as [[PSG Stands for '''Programmable Sound Generator'']] in this document), operating at 1Mhz. This document will describe it's role in these systems. To understand the full functions please read the [[Datasheet AY-8913|datasheet]].
In these systems it is accessed through and connected to the [[8255]] PPI. (You should understand the operation of the 8255 if you wish to access the PSG)
The PSG function, defined by the BC1,BC2 and BDIR signals, is controlled by bit 7 and bit 6 of PPI Port C.
=== PSG signals: function selection ===
{|{{Prettytable|width: 700px; font-size: 2em;}}
|colspan=2|''PPI Port C BitBits''||rowspan=2|''PSG SignalFunction''
|-
|7||Bit7 BDIR|-|6||Bit6 BC1|-|} PSG function selection: {|{{Prettytable|width: 700px; font-size: 2em;}}|''PPI Port C Bit''||''PSG Function''|-|7||6
|-
|0||0||Inactive
|}
=== Note: ===
The "inactive" mode must be used between function changes. If it is not used then there will be problems with the program on the CPC+. See the document about CPC+ extra information for a description of this. The "inactive" mode can be used to prevent register corruption between changing modes. == Programming the PSG ==
The PSG has 16 internal registers and these control the operation. Before a register can be read from/written to it must be selected.
=== Register selection===
To write data to the PSG, PPI Port A must be operating as output. (See the document on the 8255 to see how to do this)
The register will remain selected until another is chosen.
=== Writing to the selected PSG register===
To write data to the PSG, PPI Port A must be operating as output. (See the document on the 8255 to see how to do this)
write data to PPI Port A,
set bit 7 to "1" and bit 6 to "0" of PPI Port C
The data will then be written into the register.
=== Reading from the selected PSG register===
To read data from the PSG, PPI Port A must be operating as input. (See the document on the 8255 to see how to do this)
set bit 7 to "0" and bit 6 to "1" of PPI Port C
read data from PPI Port A,
The register data is available at PPI Port A. === Notes ===
If the tone period is in the range 0-4 I can not hear any tone output.
== Programming Examples== === Reading a value from a PSG register. ===
This routine can be used to read data from a PSG register.
.read_from_psg
ld b,&f4 ;} Setup register index on PPI port Aout (c),c ;}
ld bc,&f6c0 ;} Tell PSG to select register using data on PPI port Aout (c),c ;}
ld bc,&f600 ;} Put PSG into inactive stateout (c),c ;
ld b,&f7 ; 8255 PPI Control
ld c,%10010010 ; mode and port configurationout (c),c ; Port A input, Port B input, Port C output ; All operating in mode 0. (see Programming ; 8255 PPI)
ld bc,&f640 ;} Tell PSG to put the data of the selected register to PPI port A toout (c),c ;}
ld b,&f4 ;} Read data from PPI port Ain a,(c) ;}
ld c,%10000010
out (c),c ;Port A output, Port B input, Port C output
ld bc,&f600 ;} Return PSG to inactive mode.out (c),c ;}
ret
</pre>
=== Writing to a PSG register ===
This routine can be used to write to registers on the PSG. C contains the index of the PSG register to write. A contains the data to write to the PSG register.
<pre>
;; entry conditions:
;; C = register number
.write_to_psg
ld b,&f4 ;} setup PSG register number on PPI port Aout (c),c ;}
ld bc,&f6c0 ;} Tell PSG to select register from data on PPI port Aout (c),c ;}
ld bc,&f600 ;} Put PSG into inactive state.out (c),c ;}
ld b,&f4 ;} setup register data on PPI port Aout (c),a ;}
ld bc,&f680 ;} Tell PSG to write data on PPI port A into selected registerout (c),c ;}
ld bc,&f600 ;} Put PSG into inactive stateout (c),c ;}
ret
</pre>
== Resources ==* [[Media:Ay3-891x.pdf|AY-3-891x datasheet]]
== Links ==
[[Category:Stub]]
[[Category:HardwareProgramming]][[Category:Music and sound| ]][[Category:Video contents]][[Category:CPC Internal Components]]