# Ricoh 2A03 y 2A07

El Ricoh 2A03 o RP2A03 es una CPU de 8 bits fabricada por Ricoh, famosa por ser la escogida para equipar la videoconsola Nintendo Family Computer / Nintendo Entertainment System. Contiene un clon del MOS Technology 6502, con el modo decimal deshabilitado para eludir las patentes relativas a dicho modo. Se diferencia de 6502 estándar en que sólo puede operar con enteros, se le añaden 22 registros mapeados en memoria que controlan generadores de sonido programables, una rudimentaria DMA y leían los mandos de juegos. Los equipos vendidos en zonas PAL (Europa y Australia, principalmente) usan las CPU Ricoh 2A07 o RP2A07, idénticos al 2A03, excepto porque usan un divisor diferente del reloj y una tabla de frecuencias de la CPU diferentes. En todos los casos vienen en un encapsulado DIP de 40 pines.
La CPU en NTSC funciona a una frecuencia de reloj de 1,79 MHz, mientras que su variante PAL funciona más lento, a una frecuencia de 1,66 MHz, con unos "ajustes" en el sonido para que no suene a una velocidad inferior que la versión americana y japonesa.

## Historia

Cuando el ingeniero Masayuki Uemura estaba diseñando la videoconsola Famicom (como se llamaba a la NES en Japón) para Nintendo a principios de los años 80, acabó por decidirse por una CPU 6502 como procesador para este nuevo soporte.
Contactaron con muchos fabricantes de semiconductores, pero la mayoría rechazaron sus ofertas, ya que buscaban que alguien se fabricase realmente muy barato. Nintendo buscaba precios por los suelos, aunque a cambio prometía compras enormes. Finalmente, la empresa Ricoh, sin mucho trabajo en su división de semiconductores, aceptó la propuesta ofrecida por Nintendo, que no iba a pagar más de 2.000 yens por chip (lo que a Ricoh le pareció absurdamente bajo), pero prometía comprar tres millones de CPUs en dos años. Además, para que a Ricoh le fuese más rentable, hicieron ciertas restricciones al 6502 y añadieron otras cosas necesarias para el diseño final de la consola.
Aunque en Nintendo se preguntaron qué iban a hacer con tanto chip si la Famicom no tenía éxito, acabó siendo la videoconsola más vendida a lo largo de los años 80 y hasta mediados de los años 90.
La máquina arcade Unisystem VS (que puso en los salones de recreativas a Super Mario Bros y otras joyas de Nintendo), utiliza también la Ricoh 2A03 como CPU.

## Generador de sonido del 2A03 (PSG)

El 2A03 posee un generador de sonido integrado que tiene 5 voces. Éstas son:
* 2 canales de pulsos ajustables de onda cuadrada
* 1 canal de onda triangular (usado generalmente para las notas graves y tambores)
* 1 generador de ruido blanco (también se puede configurar para obtener ruido periódico, es decir, ruido tonal o en bucle)
* 1 canal de reproducción de muestras de sonido basada en Modulación Delta (DMC) de 1 bit (también puede reproducir PCM de 7 bits sin comprimir activando la reproducción con el registro DMC_RAW)
El ciclo de las ondas de pulso se puede ajustar a valores de 12,5%, 25%, 50% y 75%.

## Registros de memoria del 2A03

Al núcleo MOS 6502 se le agregan 22 registros de memoria o "mapeadores" adicionales que se usan para el generador de sonido, las muestras de sonido DMC, la lectura de los controles y la rudimentaria DMA on-die.
| $4000 | SQ1_VOL | Ajuste de ciclo y volumen para el canal de pulso 1 |
| $4001 | SQ1_SWEEP | Registro del control de barrido para el canal de pulso 1 |
| $4002 | SQ1_LO | Contador de byte bajo para el periodo del canal de pulso 1 |
| $4003 | SQ1_HI | Contador de byte alto para el periodo y longitud para el canal de pulso 1 |
| $4004 | SQ2_VOL | Ajuste de ciclo y volumen para el canal de pulso 2 |
| $4005 | SQ2_SWEEP | Registro del control de barrido para el canal de pulso 2 |
| $4006 | SQ2_LO | Contador de byte bajo para el periodo del canal de pulso 2 |
| $4007 | SQ2_HI | Contador de byte alto para el periodo y longitud para el canal de pulso 2 |
| $4008 | TRI_LINEAR | Contador lineal para el canal de onda triangular |
| $4009 | N/U | Sin usar, pero se puede acceder a él en bucles de limpieza de memoria |
| $400A | TRI_LO | Contador de byte bajo para el canal de onda triangular |
| $400B | TRI_HI | Contador de byte alto para el periodo y longitud del canal de onda triangular |
| $400C | NOISE_VOL | Control de volumen para el generador de ruido blanco |
| $400D | N/U | Sin usar, pero se puede acceder a él en bucles de limpieza de memoria |
| $400E | NOISE_LO | Forma del periodo y longitud para el generador de ruido blanco |
| $400F | NOISE_HI | Contador de longitud para el generador de ruido blanco |
| $4010 | DMC_FREQ | Modo para la reproducción y frecuencia de las muestras de sonido DMC |
| $4011 | DMC_RAW | Reproducción de PCM de 7 bits sin comprimir |
| $4012 | DMC_START | Inicio de la forma de onda de las muestras de sonido DMC, es la dirección: $C000 + $40*$xx |
| $4013 | DMC_LEN | Longitud de la forma de onda de las muestras de sonido es de $10 * $ xx + 1 bytes (128 * $ xx + 8 muestras) |
| $4014 | OAM_DMA | Escritura de copias en $xx de 256 bytes de lectura desde $xx00-$xxFF y escribir a OAM_DATA ($2004) |
| $4015 | SND_CHN | Usado para habilitar los canales de sonido y para el estado de los mismos |
| $4016 | JOY1 | Datos del mando 1 |
| $4017 | JOY2 | Datos del mando 2 y controlador del contador de cuadros |
| $4018-$401F | $4018-$401F | Funcionalidad de la APU y I/O están normalmente desactivadas |
(N/U= No usado)

### Fuente

* El Museo de los 8 Bits