La CPU de la NES es un Ricoh 2A03 , basado en el popular MOS Technology 6502 de 8 bits que trabaja a 1.79 MHz (o 1.66 MHz en sistemas PAL). Este es el componente central que ejecuta el código del cartucho del juego.
Un poco de contexto
Para entender los circuitos que alberga la placa base de la NES, conviene echar antes un vistazo al estado de la industria en aquella época. El mercado de procesadores a finales de los 70 y principios de los 80 fue bastante diverso.

Un Commodore PET, con una CPU 6502.

Un Tandy TRS-80, con una CPU Z80.
Si una compañía planeaba construir un microordenador asequible, las opciones disponibles eran:
- El Intel 8080 (1974): una CPU popular presente en el Altair, el primer ordenador 'personal'. Dispone de un bus de datos de 8 bits y otro de direcciones de 16 bits, además de siete registros de 8 bits. Estas prestaciones trazaron la línea entre la simple calculadora y el verdadero ordenador.
- Zilog Z80 (1976): insatisfechos con el rumbo de Intel, antiguos ingenieros del 8080 fundaron su propia empresa para producir un sucesor 'no oficial', mejorado con más instrucciones, registros y componentes internos. Se vendía a un precio económico y podía ejecutar programas del 8080 . Amstrad y Sinclair fueron algunas de las empresas que optaron por esta CPU.
- Motorola 6800 (1974): otra CPU de 8 bits diseñada en la misma época. Aunque competidor directo del 8080, el 6800 se programaba con un set de instrucciones más sofisticado, si bien a menor frecuencia de reloj . El 6800 se incluía en ordenadores de tipo todo-en-uno y "hágalo-usted-mismo", y en sintetizadores.
De forma análoga a lo ocurrido con Intel, ingenieros de Motorola frustrados con la falta de interés de la compañía en capitalizar el potencial del 6800 se unieron a una pequeña pero ambiciosa empresa de semiconductores, MOS, donde desarrollaron una versión rediseñada del 6800: el MOS 6502. Pese a ser incompatible con el resto, el nuevo chip era mucho, mucho más barato de producir y fue cuestión de tiempo que muchos de los famosos fabricantes de ordenadores (Commodore, Tandy, Apple, Atari, Acorn y otros) eligieran el 6502 como pieza central de sus máquinas.
En Japón, Nintendo necesitaba un CPU barato y conocido, por lo que optó por utilizar el 6502. Ricoh, su proveedor de procesadores, fabricó con éxito un procesador compatible con el 6502.
Funcionalidad central
Para comprender las capacidades de esta consola, conviene examinar primero lo que ofrece el MOS 6502 original:
- La Arquitectura de Set de Instrucciones (ISA, del inglés 'Instruction Set Architecture') del 6502: MOS quería ofrecer mejoras drásticas a costa de la compatibilidad con terceros (en especial con Motorola) . Así pues, el set de instrucciones del 6502 sigue manejando palabras de 8 bits como el 6800 y otros, pero su programación no es compatible entre sí.
- Un bus de datos de 8 bits y un bus de direcciones de 16 bits. Esta era la combinación habitual en los microprocesadores de la época. En esencia, permite operar datos en bloques de ocho bits sin agotar las ubicaciones de memoria (al menos, no demasiado deprisa).
- En teoría, las direcciones de 16 bits obligan a la CPU de 8 bits a emplear ciclos adicionales para procesar el tamaño extra. Sin embargo, gracias a los nuevos modos de direccionamiento de MOS (explicados más adelante), estas penalizaciones se aliviaron sin necesitar demasiados circuitos adicionales.
- Tres registros de uso general (
X,YyA), que pueden parecer insuficientes frente a ficheros de registros más amplios. Esta decisión reduce costes, aunque implica que la CPU deba mover datos en memoria con mayor frecuencia. En el 6502,XeYse denominan 'registros de índice' y se usan para direccionar memoria, mientras queAestá conectado directamente a la ALU y se dedica a las operaciones aritméticas.- En comparación, el Motorola 6800 dispone de dos registros acumuladores y un único registro de índice, lo que permite un set de instrucciones más sencillo.
- Una Unidad Aritmético-Lógica (ALU, del inglés 'Arithmetic Logic Unit') de 8 bits, lo que no sorprende en una CPU de 8 bits; aunque vale la pena señalar que otros como el Zilog Z80 incorporaban una ALU de 4 bits.
- Un puntero de pila de 8 bits: no es algo que suela tratarse en este tipo de análisis, pero merece mención por su notable divergencia respecto al diseño de Motorola. Como se ha indicado, el bus de direcciones es de 16 bits, por lo que un componente dependiente de memoria como el puntero de pila debería, en principio, tener ese mismo tamaño. No obstante, MOS optó por reducirlo a la mitad y almacenar la pila en un rango fijo de memoria. Con todo, fue una ingeniosa medida de reducción de costes, ya que alentó a los desarrolladores a adoptar técnicas de programación eficientes para aprovechar al máximo el espacio de pila.
- 13 modos de direccionamiento. Gracias a la inclusión de dos registros de índice, los programas pueden elegir entre múltiples formatos para acceder a la memoria. Algunos están optimizados para el direccionamiento de página cero (los primeros 256 bytes de memoria), mientras que otros codifican una dirección de búsqueda para recuperar la dirección real de forma dinámica. En definitiva, esto permitió ahorrar el mayor número posible de ciclos de memoria, a costa de una mayor complejidad.
- En comparación, el 6800 y su único registro de índice solo ofrecen siete modos de direccionamiento, sin equivalente para los tipos más flexibles.
Como puede apreciarse, la notable ingeniería del 6502 permitió a MOS ofrecer un producto sólido a un precio enormemente asequible.
El enigma de la licencia de Ricoh
Hasta hoy en día sigue sin ser claro cómo Ricoh logró clonar el 6502. Uno esperaría que MOS le diera la licencia del diseño del chip a Ricoh, pero hay muchas contradicciones al respecto:
- Tanto la variante de Ricoh como la de MOS presentan el mismo diseño, pero la de Ricoh contiene buses cortados (deshabilitando ciertas funciones) . Lo detallaré más adelante.
- No se ha encontrado ningún documento que afirme explícitamente que MOS dio la licencia del 6502 a Ricoh.
- Un artículo publicado en 2008 por Nikkei Trendy establece que Ricoh obtuvo la licencia de Rockwell, un fabricante autorizado de chips . Sin embargo, es debatible si una segunda fuente pudo otorgar la propiedad intelectual a un tercero, mucho menos con la aprobación de MOS.
- No sería la primera vez que Nintendo pudo eludir derechos de propiedad intelectual, dado que el juicio Ikegami Tsushinki vs. Nintendo dictaminó que Nintendo no era dueño del código del Donkey Kong original .
Funcionalidad descartada
El 2A03 de Ricoh omite el modo Binary-Coded Decimal (BCD) incluido originalmente en el 6502 . El BCD permite la codificación de cada dígito decimal de un número como un binario separado de 4 bits. El 6502 usa palabras de 8 bits - lo que significa que cada palabra almacena dos dígitos decimales.
Como un ejemplo para los curiosos, el número decimal 42 se representa como:
0010 1010en binario.0100 0010en BCD.
Este modo es útil en aplicaciones que requieran tratar cada dígito decimal por separado (como por ejemplo, un reloj digital). Sin embargo, requiere más almacenamiento ya que cada palabra de 8 bits solo puede codificar hasta el número decimal 99 - mientras que el binario tradicional puede codificar hasta el 255.
Ricoh deliberadamente rompió el modo BCD en su chip cortando las líneas de control que lo activan. Esto se hizo presumiblemente para evitar el pago de regalías a MOS, dado que BCD estaba patentado por ellos (y la legislación que permitía registrar derechos de autor sobre diseños de circuitos integrados no se estableció sino hasta 1984 ).
Memoria
Tanto el Ricoh 2A03 como el MOS 6502 contienen un bus de datos de 8 bits y un bus de direcciones de 16 bits, lo que les permitía acceder hasta a 64KB de memoria. Entonces, ¿cómo llenó Nintendo ese espacio de memoria?
Por un lado, la placa base contiene un chip que otorga 2 KB de RAM estática (SRAM) . Nintendo llama esta área «Work RAM» (WRAM) y puede usarse para almacenar:
- Variables para manejar el estado del juego y/o para buscar información.
- La «pila», la cual temporalmente guarda los valores de registros mientras que el procesador ejecuta subrutinas.
- Un «área de búfer» para que el procesador pueda copiar datos grandes entre dos ubicaciones.
Por el otro lado, los componentes del sistema son mapeados en memoria , lo que significa que son accedidos usando direcciones de memoria, por lo que ocupan parte del espacio de direcciones del procesador. Por lo tanto, el espacio de memoria del procesador se llena de direcciones que apuntan al cartucho del juego, la WRAM, el PPU, la APU y dos controles (no se preocupen por cada componente, ya que se explican a lo largo de este artículo).
Fallo de segmentación
Heredada del diseño de MOS, esta consola incorpora también una 'anomalía' especial denominada Bus abierto (Open Bus): si una instrucción intenta leer desde una dirección no mapeada o inválida, se devuelve en su lugar el último valor leído . Si el programa no lo gestiona adecuadamente, la ejecución puede continuar en un estado impredecible.
Datos del cartucho/juego
Solo en caso de que no lo sepas, los juegos de NES se distribuyen en forma de cartuchos, y los buses del cartucho se conectan directamente al procesador.
Nintendo conectó las líneas del cartucho de forma que sólo se puede acceder a 49120 Bytes (~ 49.97 KB) de datos del cartucho . Ahora, ¿a qué me refiero con "datos del cartucho"? Bueno, a cualquier chip conectado a esos buses, por ejemplo:
- Una ROM de programa donde reside el programa del juego. Esto excluye los datos gráficos, como verás después en la sección de 'Gráficos'. Naturalmente y a diferencia de otros chips, este es obligatorio.
- Chips de RAM para extender la WRAM.
- Una RAM alimentada por baterías para almacenar partidas.
El hecho de que haya diferentes combinaciones se debe a que al procesador no le importa de qué componente esté leyendo información, solo ve las ubicaciones de la memoria. Así que es a criterio de los desarrolladores de escoger (o crear) un esquema factible para guardar el juego.

La misma PCB con las partes importantes etiquetadas. El significado del chip "Lockout" se explica en la sección "Antipiratería".
Por ejemplo, 'Super Mario Bros' de Nintendo utilizó un diseño que llamaron NES-NROM-256 y que consiste de 32KB de programa ROM y 8KB de 'Character ROM' para gráficos (veremos más sobre esto en la sección de 'Gráficas') . La NES-NROM-256 también se preparó para almacenar hasta 3KB de WRAM extra, aunque el juego no haga uso de ella.
Más allá de las capacidades existentes
Una de las mayores limitaciones de los buses de direcciones de 16 bits (que afectan la 3ra y 4ta generación de consolas) es su espacio compacto de direcciones. Hoy en día, los ordenadores de 32 bits pueden direccionar hasta 4GB de memoria (y las máquinas de 64 bits se dan el lujo de disfrutar hasta 16 exabytes) así que esto ya no es una preocupación, pero en aquel entonces la NES sólo tenía 64KB de espacio de direcciones y una gran parte de este era ocupada por el hardware mapeado en memoria (algo que sus competidores evitaron).
Entonces, ¿esto significaba que los desarrolladores sólo podían desarrollar juegos que no excedieran el límite de 49.97KB? ¡Por supuesto que no! Si algo nos ha enseñado la historia, es que siempre hay una solución ingeniosa a un problema desafiante; y este problema se abordó con un Mapeador.

Representación simplificada de cómo un mapeador extiende las capacidades de direccionamiento de la CPU. Con la inclusión de un mapeador, la CPU puede acceder a bancos extra (grupos de direcciones) de una gran ROM de programa. Aunque el juego/programa tiene la nueva tarea de cambiar manualmente entre bancos siempre que sea necesario.

La misma configuración pero sin un mapeador instalado. Aunque es más simple y económico, la CPU solo puede acceder a un número finito de bancos.
Un mapeador es un chip extra incluido en el cartucho que se ubica entre la memoria del chip y la línea de direcciones de la consola. Su tarea principal es extender el espacio de direcciones para que los desarrolladores puedan tener más chips. Esto se logra a través de cambio de bancos: las direcciones de memoria se agrupan en bancos, y el mapeador dispone de interruptores (controlados por direcciones de memoria) para alternar entre bancos. Ahora, la CPU sigue viendo la misma cantidad de memoria, así que es el juego, que fue programado con un mapeador presente, quien está a cargo de operarlo. Debido a su rentabilidad, los mapeadores eran la orden del día en la tecnología de los 80 hasta principios de los 90.

PCB de Super Mario Bros 2 . Super Mario Bros. 3 también usa este diseño, pero incluye una ROM de programa de 256 KB en su lugar.

La misma imagen con las partes importantes marcadas. Al principio, pensé que la SRAM adicional era para guardar partidas, pero luego me di cuenta de que no hay guardados en este juego (y tampoco hay una batería). En realidad, ese chip de RAM se usa para almacenar un nivel descomprimido.
Volviendo a la NES, juegos como 'Super Mario Bros 2' y 'Super Mario Bros 3' venían con el mapeador 'MMC3' (fabricado por Nintendo) en sus cartuchos. En comparación, el MMC3 proporcionó hasta 512 KB de espacio para la ROM de programa, hasta 256 KB para Character memory y hasta 8 KB de WRAM extra . Ahora puedes ver porqué 'Super Mario Bros 3' difiere significativamente en calidad comparado con su primer entrega.
En general, mientras que esta consola pueda parecer limitada al examinar sus características internas, Nintendo se aseguró de que se pudiera adaptar a medida que evolucionaba la tecnología. Por otro lado, mientras que esta técnica ayudó a mantener los costos de la consola bajos, trasladó parte de la responsabilidad al cartucho del juego. Así, la calidad del juego y los costos del cartucho eran dos aspectos que los desarrolladores debían equilibrar.
