Changes

How to access the PSG via PPI

10 bytes added, 23:48, 10 February 2021
/* 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]].
The Amstrad CPC,CPC+ and KC Compact use a == Role of the AY-3-8912 Programmable sound generator (referred to as PSG 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. ==
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 ==
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 ===
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 ;
;** Set PPI port A to input mode. **
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) ;}
;** Set PPI port A to output mode. *ld b,&f7 ;8255 PPI control
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 ===
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]]
1
edit