POKEY
The Pot Keyboard Integrated Circuit (POKEY)[1] is a digital I/O chip found in the Atari 8-bit family of home computers and many arcade games in the 1980s. It was commonly used to sample (ADC) potentiometers (such as game paddles) and scan matrices of switches (such as a computer keyboard). POKEY is also well known for its sound effect and music generation capabilities, producing a distinctive square wave sound popular among chip tune aficionados. The LSI chip has 40 pins and is identified as C012294. POKEY was designed by Atari employee Doug Neubauer,[2] who also programmed the original Star Raiders.
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".[3] This referred to POKEY's sound generation abilities. The inventors listed were Steven T. Mayer and Ronald E. Milner.
No longer manufactured, POKEY is emulated in software by classic arcade emulators (e.g. MAME) and Atari 8-bit emulators.
Contents |
[edit] 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)
- High-pass filter
- Keyboard scan (up to 64 keys)
- Potentiometer ports (8 independent ports, each with 8-bit 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
- IRQ interrupts
[edit] POKEY music
The design of the POKEY made it possible for games to have polyphonic music and sound effects of up to four channels. 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.
One of the sound-engines developed for the Atari 8-bit family was called the AMP engine (Advanced Music Processor). This was used by the musician Gary Gilbertson.
It is now possible to emulate the POKEY's sound capabilities in software. This can be done with the SAP player [1].
[edit] Generating sound with POKEY
Pokey contains four audio channel, with separate frequency, noise and voice level control.
Each channel has 8-bit frequency divider and 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)
[edit] AUDIOC1-4 registers description
- Bit 0-3
- Control over volume level, from 0 to F.
- Bit 4
- Frequency divider control "1" on, "0" off. When frequency dividier is set to off, constant sounds with volume wrote in bits 0-3 are being generated.
- Bit 5-7
- Shift register responsible for noises — distortion:
- 000
- 5- and 17-bit register
- 001
- 5-bit register
- 010
- 5- and 4-bit register
- 011
- 5-bit register — doubled, non-used
- 100
- 17-bit register
- 101
- without shift register — pure tones
- 110
- 4-bit register
- 111
- without shift register — doubled, non-used
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 probed independently by four audio channels in channel's divider's rate.
[edit] AUDIOCTL register description
"1" means "on", if not descripted:
- Bit 0
- (15 kHz), choice of frequency divider rate "0" - 64 kHz, "1" - 15 kHz 1
- Bit 1
- (FI2+4), high-pass filter for channel 2 rated by frequency of channel 4
- Bit 2
- (FI1+3), high-pass filter for channel 1 rated by frequency of channel 3
- Bit 3
- (CH4+3), connection of dividers 4+3 to obtain 16-bit accuracy
- Bit 4
- (CH2+1), connection of dividers 2+1 to obtain 16-bit accuracy
- Bit 5
- (1,79CH3), set channel 3 frequency "0" - 1.77 MHz PAL, "1" - 1.79 MHz NTSC
- Bit 6
- (1,79CH1), set channel 1 frequency "0" - 1.77 MHz PAL, "1" - 1.79 MHz NTSC
- Bit 7
- (POLY9), switch shift register "0" - 17-bit, "1" – 9-bit
All frequency dividers (AUDIOF) can be at the same time driven by 64 kHz or 15 kHz rate.
Frequency dividers 1 and 3 can be alternately driven by CPU clock (1.79 MHz NTSC, 1.77 MHz PAL). Frequency dividers 2 and 4 can be alternately driven by output of dividers 1 and 3. In this way, POKEY makes possible connecting of 8-bit channels to create sound with 16-bit accuracy.
Possible channel configurations:
- four 8-bit channels
- two 8-bit channels and one 16-bit channel
- two 16-bit channels
[edit] Additional information
Each input/output operation causes the CPU's internal shift registers to change value, so when programming for POKEY, it is necessary to re-initialise some values after each operation is carried out.
[edit] Serial input output port
Contains:
- serial input line
- serial output line
- serial clock output line
- two-way serial clock data line
- registers SKRES, SEROUT, SERIN, SKCTL, SKSTAT
POKEY is a sort of UART. Usually one of the doubled audio channels is used as baud rate generator. The standard baud rate is 19.2 kbit/s, the maximum possible baud rate is 127 kbit/s. A byte put into the SEROUT register is automatically sent over the serial bus. The data frame contains 10 bits: 1 start bit, 8 data bits, 1 stop bit. The voltage levels are 0 V (logical 0) and +4 V (logical 1). It is possible to connect the Atari serial port with an RS-232 port by means of a simple voltage converter.
[edit] Eight IRQ interrupts
- BREAK
- Break (BREAK key interrupt)
- K
- Keyboard (keyboard interrupt)
- SIR
- if Serial Input Ready (read interrupt from serial rail)
- ODN
- if Output Data Needed (write interrupt from serial rail)
- XD
- if eXmitend Data (serial transmission end interrupt)
- T1
- Timer 1, timer 1 interrupt
- T2
- Timer 2, timer 2 interrupt
- T4
- Timer 4, timer 4 interrupt
Interrupts can be set on or off from software by register IRQEN. IRQSTAT register contains interrupts status.
[edit] Keyboard
Six key register of actually pushed keys (K0 K5), which contains values from 00 to 3F. Contains 2 control values. One of them acts as decoder of all 6 values. Second control values is used to decode special key values — CTRL, SHIFT and BREAK.
[edit] Potentiometers
Eight ports to measurement increase of input. Each input has 8-bit timer, counting time when each TV line is being displayed. This had the added advantage of allowing the value read out to be fed directly into screen coordinates of objects being driven by the paddles. Each input has drop transistor, which can be set on or off from software. The timers can also be used to support a light pen, by connecting a photodiode to the drop transistor, which captures the timer when the electron beam in the television passes by the pen. The vertical position of the pen had to be read separately.
[edit] Additional features
- Three timers, which uses audio channel. When timer is being used, audio channels are reset.
- Random number generator.
[edit] POKEY register table
| Register | Write | Read | ||
|---|---|---|---|---|
| Name | Description | Name | Description | |
| $D200 | AUDF1 | channel 1 frequency | POT0 | potentiometer 0 |
| $D201 | AUDC1 | channel 1 generator | POT1 | potentiometer 1 |
| $D202 | AUDF2 | channel 2 frequency | POT2 | potentiometer 2 |
| $D203 | AUDC2 | channel 2 generator | POT3 | potentiometer 3 |
| $D204 | AUDF3 | channel 3 frequency | POT4 | potentiometer 4 |
| $D205 | AUDC3 | channel 3 generator | POT5 | potentiometer 5 |
| $D206 | AUDF4 | channel 4 frequency | POT6 | potentiometer 6 |
| $D207 | AUDC4 | channel 4 generator | POT7 | potentiometer 7 |
| $D208 | AUDCTL | control over audio channels | POTSTAT | read of all 8 potentiometers port lines |
| $D209 | STIMER | timer start | KBCODE | last pressed key code |
| $D20A | SKRES | serial port status reset | RANDOM | random number generator value |
| $D20B | POTGO | start port scanning sequence | ||
| $D20C | ||||
| $D20D | SEROUT | serial port output register | SERIN | serial port input register |
| $D20E | IRQEN | IRQ interrupts activation | IRQSTAT | IRQ interrupts status |
| $D20F | SKCTL | control over serial port | SKSTAT | serial port status |
[edit] See also
- Atari 8-bit TIA (CTIA and GTIA)
- ANTIC
- Sound chip
- Chiptune
- AMP engine
- MOS Technology SID
- General Instruments AY-3-8912
- Atari SAP music format
[edit] References
- ^ "I. Theory of Operation" (PDF). Atari Home Computer Field Service Manual - 400/800. Atari, Inc.. p. 1-11.
- ^ James Hague (2002-06-01). "Interview with Doug Neubauer". Halcyon Days. http://www.dadgum.com/halcyon/BOOK/NEUBAUER.HTM. Retrieved January 14, 2008.
- ^ Atari, Inc. (1979-01-24). "Apparatus for producing a plurality of audio sound effects". United States Patent. http://patft.uspto.gov/netacgi/nph-Parser?patentnumber=4314236. Retrieved January 14, 2008.
[edit] External links
- ASMA — Atari SAP Music Archive A collection of POKEY chip-music (SAP) players and SAP music from various Atari 8-bit games.
- ASAP - Another Slight Atari Player An Atari module player/plugin for foobar2000, Winamp, XMMS, and more.
- POKEY Player for the iPhone based on the ASMA Archive.
- POKEY chip data sheet scanned to PDF.
- POKEY chip data sheet as HTML document.
- POKEY made from small-scale logic chips
