POKEY (Pot Keyboard Integrated Circuit) is a digital I/O chip designed by Doug Neubauer at Atari, Inc. for the Atari 8-bit computers. It was first released with the Atari 400 and Atari 800 in 1979 and is included in all later models and the Atari 5200 console.
POKEY combines functions for reading paddle controllers (potentiometers) and computer keyboards as well as sound generation and a source for pseudorandom numbers. It produces four voices of distinctive square wave audio, either as clear tones or modified with distortion settings. Neubauer also developed the Atari 8-bit killer application Star Raiders which makes use of POKEY features.
POKEY chips are used for audio in many arcade video games of the 1980s including Centipede, Missile Command, Asteroids Deluxe, and Gauntlet. Some of Atari's arcade systems use multi-core versions with 2 or 4 POKEYs in a single package for more audio channels. The Atari 7800 console allows a game cartridge to contain a POKEY, providing better sound than the system's audio chip. Three licensed games make use of this: the ports of Ballblazer, Commando, and Tiger-Heli.
The LSI chip has 40 pins and is identified as C012294.Michael Current, "What are the SALLY, ANTIC, CTIA/GTIA, POKEY, and FREDDIE chips?", Atari 8-Bit Computers: Frequently Asked Questions It contains about 5,000 transistors. The USPTO granted U.S. Patent 4,314,236 to Atari on February 2, 1982 for an "Apparatus for producing a plurality of audio sound effects". The inventors listed are Steven T. Mayer and Ronald E. Milner.
Features Audio 4 semi-independent audio channels Channels may be configured as one of: Four 8-bit channels Two 16-bit channels One 16-bit channel and two 8-bit channels Per-channel volume, frequency, and waveform (square wave with variable duty cycle or pseudorandom noise) 15 kHz or 64 kHz frequency divider. Two channels may be driven at the CPU clock frequency. High-pass filter Keyboard scan (up to 64 keys) + 2 modifier bits (Shift, Control) + Break Potentiometer ports (8 independent ports, each with 8-bit resolution) High Resolution Timers (audio channels 1, 2, and 4 can be configured to cause timer interrupts when they cross zero) Random number generator (8 bits of a 17-bit polynomial counter can be read) Serial I/O port Eight IRQ interrupts
Versions By part number: C012294 — Used in all Atari 8-bit computers, including the Atari XEGS, and the Atari 5200 console. The suffix on the chip refers to the manufacturer: C012294B-01 — AMI C012294-03 — Signetics C012294-19 — National Semiconductor C012294-22 — OKI Semiconductor C012294-31 — IMP 137430-001 — Part number sometimes used in Atari arcade machines for POKEY. 137324-1221 — Quad-Core POKEY used in Atari arcade machines Major Havoc, I, Robot, Firefox, and Return of the Jedi.
Atari used several different manufacturers for the chip, however AMI produced most of them in 1983 onward. Early chips were manufactured on a 5 micrometer process, this was later shrunk to 3 micrometers. AMI-produced POKEYs have been reported as having a high failure rate compared with other brands of the chip; the reasons for this are unclear, but speculated to be a fault of the chip packaging or bonding wires. Some limited success in reviving nonfunctional POKEYs by heating them in an oven has been reported. There also exist modern FPGA replacements such as POKEYOne.
Pinout
Pin Name Pin Number(s) Function Direction A0 - A3 36, 35, 34, 33 Address Bus I AUDIO 37 Audio Out O BCLK 26 Bidirectional Clock I/O 30 Chip Select I CS1 31 Chip Select I D0 - D7 38, 39, 40, 2, 3, 4, 5, 6 Data Bus I/O 29 Interrupt Request O - 23, 22, 21, 20, 19, 18 Keyboard Scan O - 25, 16 Keyboard Scan I OCLK 27 Serial Output Clock O P0 - P7 14, 15, 12, 13, 10, 11, 8, 9 Pot Scan I R/ 32 Read/Write Control I SID 24 Serial Input Data I SOD 28 Serial Output Data O VDD 17 5 V Power I VSS 1 Ground I Φ2 7 Phase 2 Clock I
Registers The Atari 8-bit computers map POKEY to the $D2xxhex page and the Atari 5200 console maps it to the $E8xxhex page.
POKEY provides 29 Read/Write registers controlling Sound, Paddle input, keyboard input, serial input/output, and interrupts. Many POKEY register addresses have dual purposes performing different functions as a Read vs a Write register. Therefore, no code should read Hardware registers expecting to retrieve the previously written value.
This problem is solved for some registers by Operating System "Shadow" registers implemented in regular RAM that mirror the values of hardware registers. During the Vertical Blank the Operating System copies the Shadow registers in RAM for Write registers to the corresponding hardware register, and updates Shadow values for Read registers from the hardware accordingly. Therefore, writes to hardware registers which have corresponding shadow registers will be overwritten by the value of the Shadow registers during the next vertical blank.
Reading values directly from hardware at an unknown stage in the display cycle may return inconsistent results (an example: reading potentiometers). Operating System Shadow registers for Read registers would usually be the preferred source of information.
Some Write hardware registers do not have corresponding Shadow registers. They can be safely written by an application without the value being overwritten during the vertical blank. If the application needs to know the last value written to the register then it is the responsibility of the application to implement its own shadow value to remember what it wrote.
Name Description Read/Write Hex Addr Dec Addr Shadow Name Shadow Hex Addr Shadow Dec Addr AUDF1 Audio Channel 1 Frequency Write $D200 53760 POT0 Potentiometer (Paddle) 0 Read $D200 53760 PADDL0 $0270 624 AUDC1 Audio Channel 1 Control Write $D201 53761 POT1 Potentiometer (Paddle) 1 Read $D201 53761 PADDL1 $0271 625 AUDF2 Audio Channel 2 Frequency Write $D202 53762 POT2 Potentiometer (Paddle) 2 Read $D202 53762 PADDL2 $0272 626 AUDC2 Audio Channel 2 Control Write $D203 53763 POT3 Potentiometer (Paddle) 3 Read $D203 53763 PADDL3 $0273 627 AUDF3 Audio Channel 3 Frequency Write $D204 53764 POT4 Potentiometer (Paddle) 4 Read $D204 53764 PADDL4 $0274 628 AUDC3 Audio Channel 3 Control Write $D205 53765 POT5 Potentiometer (Paddle) 5 Read $D205 53765 PADDL5 $0275 629 AUDF4 Audio Channel 4 Frequency Write $D206 53766 POT6 Potentiometer (Paddle) 6 Read $D206 53766 PADDL6 $0276 630 AUDC4 Audio Channel 4 Control Write $D207 53767 POT7 Potentiometer (Paddle) 7 Read $D207 53767 PADDL7 $0277 631 AUDCTL Audio Control Write $D208 53768 ALLPOT Read 8 Line POT Port State Read $D208 53768 STIMER Start Timers Write $D209 53769 KBCODE Keyboard Code Read $D209 53769 CH $02FC 764 SKREST Reset Serial Status (SKSTAT) Write $D20A 53770 RANDOM Random Number Generator Read $D20A 53770 POTGO Start POT Scan Sequence Write $D20B 53771 SEROUT Serial Port Data Output Write $D20D 53773 SERIN Serial Port Data Input Read $D20D 53773 IRQEN Interrupt Request Enable Write $D20E 53774 POKMSK $10 16 IRQST IRQ Status Read $D20E 53774 SKCTL Serial Port Control Write $D20F 53775 SSKCTL $0232 562 SKSTAT Serial Port Status Read $D20F 53775
In the individual register listings below the following legend applies: Bit Value Description 0 Bit must be 0 1 Bit must be 1 ? Bit may be either 0 or 1, and is used for a purpose. - Bit is unused, or should not be expected to be a certain value label Refer to a later explanation for the purpose of the bit.
Audio Pokey contains a programmable sound generator; four audio channels with separate frequency, noise and voice level controls.
Each channel has an 8-bit frequency divider and an 8-bit register to select noise and volume. AUDF1 to AUDF4 – frequency register (AUDio Frequency) AUDC1 to AUDC4 – volume and noise register (AUDio Control) AUDCTL – general register, which controls generators (AUDio ConTroL)
POKEY's sound is distinctive: when the four channels are used independently, there is noticeable detuning of parts of the 12-tone equal temperament scale, due to lack of pitch accuracy. Channels may be paired for higher accuracy; in addition, multiple forms of distortion are available, allowing a thicker sound. The distortion is primarily used in music for bass parts.
Audio Channel Frequency
The AUDF* registers control the frequency or pitch of the corresponding sound channels. The AUDF* values also control the POKEY hardware timers useful for code that must run in precise intervals more frequent than the vertical blank.
Each AUDF* register is an 8-bit value providing a countdown timer or divisor for the pulses from the POKEY clock. So, smaller values permit more frequent output of pulses from POKEY, and larger values, less frequent. The values $0hex/0dec to $FFhex/255dec are incremented by POKEY to range from $1hex/1dec to $100hex/256dec. The actual audible sound pitch is dependent on the POKEY clock frequency and distortion values chosen. See Audio Channel Control and Audio Control.
AUDF1 $D200 Write Audio Channel 1 Frequency
AUDF2 $D202 Write Audio Channel 2 Frequency
AUDF3 $D204 Write Audio Channel 3 Frequency
AUDF4 $D206 Write Audio Channel 4 Frequency
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 ? ? ? ? ? ? ? ?
Audio Channel Control
The Audio Channel control registers provide volume and distortion control over individual sound channels. Audio may also be generated independently of the POKEY clock by direct volume manipulation of a sound channel which is useful for playing back digital samples.
AUDC1 $D201 Write Audio Channel 1 Control
AUDC2 $D203 Write Audio Channel 2 Control
AUDC3 $D205 Write Audio Channel 3 Control
AUDC4 $D207 Write Audio Channel 4 Control
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Noise 2 Noise 1 Noise 0 Force Volume Volume 3 Volume 2 Volume 1 Volume 0
Bit 0-3: Control over volume level, from 0 to F.
Bit 4: Forced volume-only output. When this bit is set the channel ignores the AUDF timer, noise/distortion controls, and high-pass filter. Sound is produced only by setting volume bits 0:3 . This feature was used to create digital audio via pulse-code modulation.
Bit 5-7: Shift register settings for noises/distortion. Bit values described below:
Noise Value Bits Value Description 0 0 0 $00 5-bit then 17-bit polynomials 0 0 1 $20 5-bit poly only 0 1 0 $40 5-bit then 4-bit polys 0 1 1 $60 5-bit poly only 1 0 0 $80 17-bit poly only 1 0 1 $A0 no poly (pure tone) 1 1 0 $C0 4-bit poly only 1 1 1 $E0 no poly (pure tone)
Generating random noises is served by reading 8 bits from top of 17-bit shift register. That registers are driven by frequency 1.79 MHz for NTSC or 1.77 MHz for PAL. Its outputs can by used independently by each audio channels' divider rate.
AUDCTL $D208 Write
Audio Control allows the choice of clock input used for the audio channels, control over the high-pass filter feature, merging two channels together allowing 16-bit frequency accuracy, selecting a high frequency clock for specific channels, and control over the "randomness" of the polynomial input.
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 17 vs 9 Poly CH1 1.79 CH3 1.79 CH2 + 1 CH4 + 3 FI1 + 3 FI2 + 4 64 vs 15 kHz
"1" means "on", if not described:
Bit 0 $01: (15 kHz), choice of frequency divider rate "0" - 64 kHz, "1" - 15 kHz Bit 1 $02: (), high-pass filter for channel 2 rated by frequency of channel 4 Bit 2 $04: (), high-pass filter for channel 1 rated by frequency of channel 3 Bit 3 $08: (), connection of dividers 4+3 to obtain 16-bit accuracy Bit 4 $10: (), connection of dividers 2+1 to obtain 16-bit accuracy Bit 5 $20: (), set channel 3 frequency "0" is 64 kHz. "1" is 1.79 MHz NTSC or 1.77 MHz PAL Bit 6 $40: (), set channel 1 frequency "0" is 64 kHz. "1" is 1.79 MHz NTSC or 1.77 MHz PAL Bit 7 $80: (POLY 9), switch shift register "0" - 17-bit, "1" – 9-bit
All frequency dividers (AUDF) can be driven at the same time by 64 kHz or 15 kHz rate.