# Atari POKEY

El sonido en los microcomputadores Atari de 8 bits era controlado por POKEY que se encargaba también de leer el teclado, generar números aleatorios y leer el puerto serial de comunicaciones {en inglés:Serial I/O o SIO}. Manejaba cuatro canales de 8 bits con 256 tonos y 16 niveles de volumen. Se le podía aplicar una 'distorsión' de 15 niveles. 1983, y es lo que se supone que debería haber sido la 5200, un sistema retrocompatible con la consola Atari 2600, con un chip gráfico mejorado. En todos los aspectos se supone que es la mejor máquina de las consolas de la serie mil de Atari, pero no lo es de las consolas de Atari de 8 bits, ya que se sitúa por detrás de la XEGS, ya que esta es un ordenador hecho consola y la 7800 es una mejora de la 2600, de manera que el chip de sonido de la 5200 y la XEGS es el POKEY (incluido en la serie 8 bits), es superior al de la 7800, que lo que lleva es una mejora del chip de la del 2600, creando también sonidos en varios canales Controlable por la orden SOUND del BASIC. Los 4 canales podían combinarse por parejas obteniendo 2 canales de 16 bits con 65536 tonos. Los computadores Atari poseían un altavoz interno, a través de él se simulaban los clics de teclado, pero con una programación adecuada podía usarse como un quinto canal de sonido.

## Descripción

El Atari POKEY es un circuito integrado digital de E/S (Entrada/Salida) {en inglés: I/O Input/Output} que se encuentra en la familia de microcomputadores Atari de 8 bits y en muchos juegos de arcade (máquinas recreativas o flippers) de los años 1980. Su nombre se deriva de POtentiometer (potenciómetro o resistencia variable) y KEYboard (teclado), ya que se usaba comúnmente para "leer" las señales capturadas desde potenciómetros (como las "paletas" de juego {en inglés: game paddles}), haciendo una conversión analógico-digital. También procesaba "arreglos o matrices de interruptores" (como los teclados de computadora). POKEY fue conocido por su capacidad para generar música y efectos de sonido, produciendo un característico sonido de onda cuadrada {en inglés: square wave} popular entre los aficionados a la micromúsica {chiptunes}. El circuito integrado a gran escala {en inglés: LSI, Large Scale Integration} tenía 40 patitas {del inglés:pins} y se identifica con el código C012294.
La Oficina de Patentes y Marcas de EE. UU. (USPTO) otorgó a Atari la patente N.º 4.314.236 el 2 de febrero de 1982 por un "Aparato para producir una variedad de audio y efectos de sonido", destacando solamente la sección de audio del circuito. Los inventores mencionados en la patente fueron Steven T. Mayer y Ronald E. Milner.
El POKEY ya no se fabrica, pero es emulado en software por los emuladores de Atari de 8 bits y los emuladores de consolas clásicas de arcade (por ejemplo MAME).
* Audio
** 4 canales de audio semi-independientes
** Los canales pueden tener una de las siguientes configuraciones:
*** Cuatro canales de 8 bits
*** Dos canales de 16 bits
*** Un canal de 16 bits y dos canales de 8 bits
** Cada canal manejaba atributos de volumen, frecuencia, y forma de onda (onda cuadrada con "ciclo de actividad variable" {en inglés duty cycle} o ruido polinómico {polynomial noise} - es decir con variaciones aleatorias de la duración del pulso de la onda cuadrada.)
** Filtro de paso alto
* Lectura del teclado (hasta 64 teclas)
* Puertos de potenciómetro (8 puertos independientes, cada uno con 8 bits de resolución)
* Temporizadores {en inglés: timers} (los canales de audio 1, 2, y 4 pueden configurarse para producir una interrupción de temporización cuando llegan a cero)
* Generador de números aleatorios (puede leer 8 o 9 bits de un contador polinómico de 17 bits)
* Puerto serial de comunicaciones Serial I/O
* Petición de Interrupción IRQ

## Música POKEY

El diseño de POKEY posibilitó que los juegos tuvieran música polifónica y efectos de sonido de hasta cuatro canales. Uno de los sistemas de manejo de sonido desarrollados para la familia de Atari de 8 bits se llamó AMP engine {Advanced Music Processor} (en castellano: dispositivo PMA {Procesador Musical Avanzado})
Hoy en día es posible emular por software las capacidades de sonido de POKEY usando el programa reproductor SAP player.

## Generación de sonido con POKEY

POKEY poseía 4 canales de audio, con controles separados de frecuencia, ruido y volumen.
Cada canal tenía un divisor de frecuencia de 8 bits y un registro de 8 bits para seleccionar ruido y volumen. AUDF1 a AUDF4 – (AUDio Frequency) registro de frecuencia
AUDC1 a AUDC4 – (AUDio Control) registro de volumen y ruido
AUDCTL – (AUDio ConTroL) registro general, que controla los generadores.

### Descripción de los registros AUDIOC1-4

Bit 0-3 - Control del volumen, desde 0 hasta F (hexadecimal). 4 - Control del divisor de frecuencia "1" encendido {on}, "0" apagado {off}.  Cuando el divisor de frecuencia está desactivado, se generan sonidos constantes con el volumen escrito en los bits 0-3. 5-7 – registro de desplazamiento responsable de los ruidos - distorsión:
La generación de ruidos al azar se logra leyendo 8 bits desde el extremo superior del registro de desplazamiento de 17 bits. Esos registros son controlados por la frecuencia de 1,79 MHz para NTSC o 1,77 MHz para PAL. Su salida puede ser medida independientemente por cuatro canales de audio en la frecuencia divisora de los canales {en inglés: channel's divider's rate}.

### Descripción del registro AUDIOCTL

Si no se especifica, „1” significa "activado" {"on"}: Bit 0 – (15 kHz), permite seleccionar la frecuencia divisora „0” - 64 kHz, „1” - 15 kHz 1
Bit 1 – (FI2+4), filtro de paso alto para el canal 2, modulado por la frecuencia del canal 4, Bit 2 – (FI1+3), filtro de paso alto para el canal 1, modulado por la frecuencia del canal 3,
Bit 3 – (CH4+3), combinación de los divisores 4+3 para lograr 16 bits de precisión,
Bit 4 – (CH2+1), conexión de divisores 2+1 para conseguir una exactitud de 16 bits, Bit 5 – (1,79CH3), determina la frecuencia del canal 3 „0” - 1,77 MHz PAL, „1” - 1,79 MHz NTSC Bit 6 – (1,79CH1), establece la frecuencia para el canal 1 „0” - 1,77 MHz PAL, „1” - 1,79 MHz NTSC Bit 7 – (POLY9), conmuta el registro de despalzamiento entre „0” - 17 bits, y „1” – 9 bits
Todos los divisores de frecuencia (AUDIOF), pueden ser controlados al mismo tiempo por 64 kHz o 15 kHz de frecuencia.
Los divisores de frecuencia 1 y 4 pueden ser controlados alternativamente por el reloj de la CPU (1,79 MHz NTSC, 1,77 MHz PAL).
Los divisores de frecuencia 2 y 4 pueden ser controlados alternativamente por la salida de los divisores 1 y 3.
De esta manera, POKEY hace posible la conexión de canales de 8 bits para crear sonidos con 16 bits de precisión.
Configuraciones de canales posibles: - cuatro canales de 8 bits - dos canales de 8 bits y un canal de 16 bits - dos canales de 16 bits

### Información adicional

Toda operación de entrada/salida reemplaza los valores de los registros de desplazamiento {shift registers} con el contenido de los controles del generador, por lo tanto, cuando cada vez que se usa POKEY para generar sonido, debe ser reinicializado.

## Puerto Serial de entrada y salida

Contiene: - línea de entrada serial - línea de salida serial - línea de salida de reloj serial - línea de datos de reloj serial de dos vías - registros SKRES, SEROUT, SERIN, SKCTL, SKSTAT
POKEY es un tipo de UART. Generalmente se usa uno de los canales de audio duplicados como generador de baudrate (velocidad o frecuencia de transmisión en baudios). El baudrate estándar es 19,2 kbit/s, el baudrate máximo posible es 127 kbit/s. Un byte puesto en el registro SEROUT se envía automáticamente a través del bus serial. La estructura de datos {data frame} contiene 10 bits: 1 bit de arranque, 8 bits de datos, 1 bit de detención. Los niveles de voltaje son 0V (0 lógico) y +4V (1 lógico). Así se puede conectar el puerto serial de Atari con un puerto RS-232 mediante un simple convertidor de voltaje.

## Ocho peticiones de interrupción IRQ

BREAK - Break (interrupción de la tecla BREAK) K - Keboard (interrupción de teclado) SIR - if Serial Input Ready (si la entrada serial está lista) entonces (leer la interrupción del bus serial)
ODN - if Output Data Needed (si se requiere datos de salida) entonces (escribir una interrupción desde el bus serial) XD - eXmitend Data (interrupción de fin de transmisión serial) T1 - Timer 1, interrupción del temporizador 1 T2 - Timer 2, interrupción del temporizador 2 T4 - Timer 4, interrupción del temporizador 4 Las interrupciones pueden ser activadas (on) o desactivadas (off) por software a través del registro IRQEN. El registro IRQSTAT contiene el estado de las interrupciones.

## Teclado

POKEY tiene un registro de las seis últimas teclas presionadas (K0... K5), los cuales contienen valores entre 00 y 3F (hexadecimal). Se almacenan 2 valores de control. Uno de ellos actúa como decodificador de los 6 valores. El segundo dato de control se usa para decodificar los valores de las teclas especiales - CTRL, SHIFT y BREAK.

## Potenciómetros

POKEY tiene ocho puertos para medir el incremento de la señal de entrada {increase of input}. Cada puerto tiene un temporizador de 8 bits, que calcula el tiempo durante el despliegue de cada línea de TV. Cada entrada tiene un transistor de caída de voltaje variable {variable voltaje drop transistor}, que puede ser activado o desactivado por software.

## POKEY además ofrece

* Tres temporizadores, que usan el canal de audio. Cuando se usa el temporizador, los canales de audio se reinicializan.
* Generador de números aleatorios.

## Tabla de registros de POKEY

16 registros de POKEY - $D200–$D20F :
| Registro | Escritura | Escritura | Lectura | Lectura |
| Registro | Nombre | Descripción | Nombre | Descripción |
| $D200 | AUDF1 | frecuencia del canal 1 | POT0 | potenciómetro 0 |
| $D201 | AUDC1 | generador en el canal 1 | POT1 | potenciómetro 1 |
| $D202 | AUDF2 | frecuencia del canal 2 | POT2 | potenciómetro 2 |
| $D203 | AUDC2 | generador en el canal 2 | POT3 | potenciómetro 3 |
| $D204 | AUDF3 | frecuencia en del canal 3 | POT4 | potenciómetro 4 |
| $D205 | AUDC3 | generador en el canal 3 | POT5 | potenciómetro 5 |
| $D206 | AUDF4 | frecuencia en el canal 4 | POT6 | potenciómetro 6 |
| $D207 | AUDC4 | generador en el canal 4 | POT7 | potenciómetro 7 |
| $D208 | AUDCTL | control sobre los canales de audio | POTSTAT | lectura de las líneas de puerto de los 8 potenciómetros |
| $D209 | STIMER | lanzamiento (inicio) del temporizador | KBCODE | código de la última tecla presionada |
| $D20A | SKRES | reinicialización del estatus del puerto serial | RANDOM | valor del generador de números aleatorios |
| $D20B | POTGO | inicio de la secuencia de exploración de puertos | | |
| $D20C | | | | |
| $D20D | SEROUT | registro de salida del puerto serial | SERIN | registro de entrada del puerto serial |
| $D20E | IRQEN | activación de la interrupción IRQ | IRQSTAT | estado de las peticiones de interrupción IRQ |
| $D20F | SKCTL | control sobre el puerto serial | SKSTAT | estatus del puerto serial |