== 8255 Part numbers used in the CPC during its lifetime ==
* Mitsubishi M5L8255AP-5 [https://www.cpcwiki.eu/imgs/8/80/MC0001A-v2-components.jpg Source]* NEC D8255AC-2[https://www.cpcwiki.eu/imgs/d/da/Amstrad_CPC464_Z70200_MC0003A_PCB_Top.jpg Source]* NEC D8255AC-5[https://www.cpcwiki.eu/imgs/c/c6/CPC464_270100_MC0001A_PCB_Top.jpg Source]* Toshiba TMP8255AP-5[https://www.cpcwiki.eu/imgs/0/0d/CPC464_Z70100_MC0001A_PCB_Top.jpg Source]
All of these are almost identical in their operation. It According to Kevin Thacker, it is possible to detect each version by writing and then reading from the ppi control i/o port. Each can give a different pattern of values that are read back. The KP580BB55A is a Soviet clone of the Intel i8255. It is used in the [[KC Compact]] and the [[Aleste 520EX]] clones of the Amstrad CPC computer.
<br>
The [[8255 PPI chip]] is a general purpose input/output IC. This document will describe its role in the Amstrad CPC, CPC+ and KC compact systems. To understand its full functions please read the datasheet.
In these systems it is connected to the [[PSG|AY-3-8912 Programmable Sound Generator (PSG)]], keyboard, cassette recorder, the VSYNC of the [[CRTC|6845 CRTC ]] and the "busy" signal from the parallel port.
The PPI is selected when A11 of the I/O port address is set to "0", A9 and A8 then define the PPI function access (as shown below), A15-A12 and A10 should be "1" (to prevent conflicts with other hardware), A7-A0 are don't care. So, resulting Port addresses are:
{| class="wikitable"
!I/O address
!/CS (A11)!A1 (A9)!A0 (A8)
!Description
!Read/Write status
!Used for
|-
|&F4xx||0||0||0||Port A Data||Read/Write||In/Out||[[PSG]] (Sound/Keyboard/Joystick)
|-
|&F5xx||0||0||1||Port B Data||Read/Write||In||Vsync/Jumpers/PrinterBusy/CasIn/Exp
|-
|&F6xx||0||1||0||Port C Data||Read/Write||Out||KeybRow/CasOut/PSG
|-
|&F7xx||0||1||1||Control||Write Only||Out||Control
|-
|}
* Input
{|{{Prettytable|width: 700px; font-size: 2em;}}class="wikitable"|''!Bit''||''!Description''||''!Usage in CPC''||''!Usage in [[KC Compact'']]
|-
|7||CAS.IN||Cassette data input||Same as on CPC
|4||LK4||Screen Refresh Rate ("1"=50Hz, "0"=60Hz)||Set to "1"=50Hz (but ignored by the KC BIOS, which always uses 50Hz even if LK4 is changed)
|-
|3||LK3|| rowspan="3" |3bit Distributor ID. Usually set to 4=[[Awa]], 5=[[Schneider]], or 7=[[Amstrad]], see See [[LK-selectable Brand Names]] for details.||Purpose unknown (set to "1")
|-
|2||LK2||Purpose unknown (set to "0")
|0||[[CRTC]] VSYNC||Vertical Sync ("1"=VSYNC active, "0"=VSYNC inactive)||Same as on CPC
|-
|}
{| class="wikitable"
|+ Distributor ID
!Bit 3
!Bit 2
!Bit 1
!Brand name
|-
|0
|0
|0
|Isp
|-
|0
|0
|1
|Triumph
|-
|0
|1
|0
|Saisho
|-
|0
|1
|1
|Solavox
|-
|1
|0
|0
|Awa
|-
|1
|0
|1
|Schneider
|-
|1
|1
|0
|Orion
|-
|1
|1
|1
|Amstrad
|}
* upper: output, lower: output
{|{{Prettytable|width: 700px; font-size: 2em;}}class="wikitable"|''!Bit''||''!Description''||''!Usage''
|-
|7||PSG BDIR(Bus DIRection)||rowspan=2|PSG function selection
|-
|6||PSG BC1||(Bus Control 1)
|-
|5||Cassette Write data||Cassette Out (sometimes also used as Printer Bit7, see [[8bit Printer Ports]])
|-
|3||rowspan=4|Keyboard line||rowspan=4|Select keyboard line to be scanned (0-15)
See [[Programming:Keyboard scanning]] for details
|-
|2
|}
{| class="wikitable"|+ [[PSG ]] function selection: {|{{Prettytable|width: 700px; font-size: 2em;}}|''!Bit 7''||''!Bit 6''||''!Function''
|-
|0||0||Inactive
[[File:8255 Block Diagram.png]]
The PPI 8255 does not have a clock pin. It relies purely on control signals from the CPU to operate. It uses Read, Write, and Control signals to manage data transfers instead of a clock signal. This allows it to work effectively without needing its own clock input.
<br>
* [[Media:Intel8255A_datasheet.pdf]] PPI Datasheet (Intel)
* [[Media:PPI M5L8255AP-5.pdf]] PPI Datasheet (Mitsubishi)
* [[Media:Programmable Peripheral Interface TMP8255AP-5.pdf]] PPI Datasheet (Toshiba)
* [https://github.com/jotego/jt8255 JT8255] Verilog implementation of the 8255 PPI