El W65C816S (también 65C816 o 65816 ) es un microprocesador (MPU) de 16 bits desarrollado y vendido por el Western Design Center (WDC). Introducido en 1983, [4] el W65C816S es una versión mejorada del MPU de 8 bits WDC 65C02 , a su vez una mejora CMOS del venerable MPU NMOS 6502 de MOS Technology . El 65C816 es la CPU del Apple IIGS y, en forma modificada, del Super Nintendo Entertainment System .
El 65 en la designación de la pieza proviene de su modo de compatibilidad 65C02, y el 816 significa que la MPU tiene tamaños de registro seleccionables de 8 y 16 bits . Además de la disponibilidad de registros de 16 bits, el W65C816S extiende el direccionamiento de memoria a 24 bits , lo que admite hasta 16 megabytes de memoria de acceso aleatorio . Tiene un conjunto de instrucciones mejorado y un puntero de pila de 16 bits , así como varias señales eléctricas nuevas para una mejor gestión del hardware del sistema.
Al reiniciar , el W65C816S se inicia en "modo de emulación", lo que significa que se comporta básicamente como un 65C02. A partir de entonces, el W65C816S puede cambiarse al "modo nativo" con una secuencia de dos instrucciones, lo que hace que habilite todas las funciones mejoradas, pero aún mantiene un grado sustancial de compatibilidad con la mayoría del software 65C02. Sin embargo, a diferencia de la versión PDIP40 del 65C02, que es un reemplazo compatible con pines para su antecesor NMOS, el PDIP40 W65C816S no es compatible con pines con ningún otro MPU de la familia 6502.
El W65C802 o 65802 es totalmente compatible en cuanto al software con el 65C816, pero es compatible eléctricamente con el 6502 y el 65C02. Por lo tanto, el 65C802 podría utilizarse como reemplazo directo en la mayoría de los sistemas equipados con un 6502 o un 65C02. Sin embargo, el 65C802 no puede emitir una dirección de 24 bits, lo que lo limita a un espacio de dirección de 64 KB. El 65C802 ya no se fabrica.
En 1981, Bill Mensch , fundador y CEO de WDC, comenzó a desarrollar el 65C02 con sus socios de producción, principalmente Rockwell Semiconductor y Synertek . El objetivo principal del proyecto 65C02 era pasar del proceso NMOS del 6502 original al proceso CMOS, lo que le permitiría funcionar a niveles de potencia mucho más bajos, en algún lugar entre 1 ⁄ 10 y 1 ⁄ 20 a cualquier velocidad de reloj dada. También se deseaba la capacidad de aumentar la velocidad de reloj máxima admitida. El diseño del 65C02 abordó las erratas del chip presentes en el 6502 NMOS (por ejemplo, el infame error) e introdujo nuevas instrucciones y nuevos modos de direccionamiento para algunas instrucciones existentes. [5]JMP (<addr>)
El desarrollo del W65C816S comenzó en 1982 después de que Mensch consultara con Apple Computer sobre una nueva versión de la serie de computadoras personales Apple II que, entre otras cosas, tendría gráficos y sonido mejorados. Apple quería una MPU que fuera compatible con el software del 6502 que se usaba entonces en el Apple II, pero con la capacidad de direccionar más memoria y cargar y almacenar palabras de 16 bits. El resultado fue el 65C816, terminado en marzo de 1984, con muestras proporcionadas tanto a Apple como a Atari en la segunda mitad del año y lanzado al mercado en 1985. [6] Mensch recibió la ayuda de su hermana Kathryn durante el proceso de diseño, quien fue responsable de parte del diseño del dispositivo.
El mismo proceso también dio lugar al 65C802, que era idéntico en su interior al 65C816. Ambos se produjeron en las mismas líneas de fabricación y divergieron solo durante las últimas etapas de metalización cuando el chip se conectaba a los pines externos. En el 65C802, esos pines tenían la misma disposición que el 6502 original, lo que permitió que se lo utilizara como reemplazo directo al mismo tiempo que se permitía utilizar el procesamiento de 16 bits de la CPU. Sin embargo, como utilizaba la distribución de pines original, solo tenía 16 pines de direccionamiento y, por lo tanto, solo podía acceder a 64 KB de memoria externa. [7] Por lo general, cuando los fabricantes de hardware diseñaban un proyecto desde cero, utilizaban el 65C816 en lugar del 65C802, lo que provocó que este último se retirara de la producción.
Posteriormente, Apple integró el 65C816 en la computadora Apple IIGS . El diseño básico del 65C816 fue desarrollado por VLSI Technology , [8] GTE , Sanyo y otros desde mediados y fines de la década de 1980 hasta principios de la década de 1990.
En la década de 1990, tanto el 65C816 como el 65C02 se convirtieron en un núcleo completamente estático , lo que hizo posible detener por completo el reloj Ø2 del procesador sin pérdida de contenido de registros. Esta característica, junto con el uso de RAM estática asíncrona , hizo posible producir diseños que usaban energía mínima cuando estaban en estado de espera.
A partir de abril de 2024 [actualizar], el W65C816S está disponible en WDC en paquetes PDIP de 40 pines , PLCC44 o TQFP de 44 pines , como MCU a través del W65C265, [9] y como núcleos IP para integración ASIC [10] [11] (por ejemplo, la serie W55V9x de circuitos integrados de educación y entretenimiento para televisión de Winbond [12] ).
Características del WDC 65c816:
C
), puntero de pila ( SP
) y registros de índice ( X
y Y
).DP
).DB
) y de banco de programa ( ) de 8 bits , que generan los bits 16 a 23 de direcciones de datos y código de 24 bits. Los registros de banco de datos y de programa separados permiten la segmentación de programas y el direccionamiento de datos lineales de 16 MB.PB
VDA
) y la dirección de programa válida ( ) controlan las salidas para la calificación de memoria, la cachéVPA
dual y la implementación de DMA de robo de ciclo .VPB
) para indicar cuándo se está obteniendo un vector de interrupción .ABORTB
) y el vector asociado admiten reparaciones del procesador de condiciones de error de bus, como fallas de página y violaciones de acceso a la memoria.MVN
y MVP
), que permiten copiar rápidamente estructuras de datos de un área de RAM a otra con un código mínimo.WAI
) y Stop-the-Clock ( STP
) reducen aún más el consumo de energía , disminuyen la latencia de interrupción y permiten la sincronización con eventos externos.COP
) con vector asociado admite configuraciones de coprocesador, por ejemplo, procesadores de punto flotante .WDM
) reservada para futuros códigos de operación de dos bytes y un enlace a diseños futuros (WDM son las iniciales del diseñador de W65C816S, William D. Mensch ).El 65C816 tiene dos modos de funcionamiento: "modo emulación", en el que las operaciones de 16 bits son invisibles (los registros de índice se fuerzan a ocho bits) y el chip parece ser muy similar al 6502, con los mismos tiempos de ciclo para los códigos de operación; y "modo nativo", que expone todas las nuevas características. La CPU entra automáticamente en modo emulación cuando se enciende o se reinicia, lo que le permite reemplazar un 65(C)02, suponiendo que se realicen los cambios necesarios en el circuito para adaptarse a la diferente disposición de pines. [5]
El cambio más obvio en el 65C816 cuando se ejecuta en modo nativo es la expansión de los diversos registros de 8 bits a 16 bits. Esta mejora afecta al acumulador ( A
), los registros de índiceX
y de pila y el puntero de pila ( ). No afecta al contador de programa ( ), que siempre ha sido de 16 bits. [13]Y
SP
PC
Cuando se ejecuta en modo nativo, dos bits en el registro de estado cambian su significado. En el 6502 original, los bits 4 y 5 no se usaban, aunque el bit 4 se conoce como el b
indicador de interrupción ( ). En modo nativo, el bit 4 se convierte en el x
indicador y el bit 5 se convierte en el m
indicador. Estos bits controlan si los registros de índice ( x
) y el acumulador/memoria ( m
) tienen un tamaño de 8 o 16 bits. Los ceros en estos bits establecen tamaños de 16 bits, los unos establecen tamaños de 8 bits. Estos bits se bloquean en unos cuando el procesador se enciende o se reinicia, pero se pueden cambiar cuando el procesador cambia al modo nativo. [13]
En el modo de funcionamiento nativo, los registros de índice y acumulador pueden configurarse en tamaños de 16 u 8 bits a discreción del programador utilizando las instrucciones REP
y SEP
para manipular los bits de los registros de estado m
y x
. Esta característica le da al programador la capacidad de realizar operaciones en datos de tamaño de palabra y de byte. Como los tamaños de los registros de índice y acumulador se pueden configurar de forma independiente, es posible, por ejemplo, tener el acumulador configurado en ocho bits y los registros de índice configurados en 16 bits, lo que le da al programador la capacidad de manipular bytes individuales en un rango de 64 KB sin tener que realizar aritmética de punteros.
Cuando los tamaños de los registros se establecen en 16 bits, un acceso a la memoria buscará o almacenará dos bytes contiguos a una velocidad de un byte por ciclo de reloj. Por lo tanto, una instrucción de lectura-modificación-escritura, como ROR <addr>
, cuando se utiliza mientras el acumulador está establecido en 16 bits, afectará a dos bytes contiguos de memoria, no a uno, y consumirá más ciclos de reloj que cuando el acumulador está establecido en ocho bits. De manera similar, todas las operaciones aritméticas y lógicas serán operaciones de 16 bits. [14]
El otro cambio importante del sistema mientras se ejecuta en modo nativo es que el modelo de memoria se expande a un formato de 24 bits desde el formato original de 16 bits del 6502. El 65c816 hace uso de dos registros de 8 bits, el registro de banco de datos ( DB
) y el registro de banco de programa ( PB
), para establecer los bits 16-23 de la dirección, generando efectivamente direcciones de 24 bits. En ambos casos, 'banco' se refiere a un segmento contiguo de memoria de 64 KB que está limitado por el rango de direcciones $xx0000-$xxFFFF
, donde xx
es la dirección del banco, es decir, los bits 16-23 de la dirección efectiva. Tanto DB
y PB
se inicializan en $00
al encender o reiniciar. [15]
Durante un ciclo de obtención de operando o código de operación , PB
se antepone al contador de programa ( PC
) para formar la dirección efectiva de 24 bits. Si se PC
"enrolla" (regresa a cero), PB
no se incrementará. Por lo tanto, un programa está limitado por los límites del banco en el que se está ejecutando. Este modelo de memoria implica que los destinos de bifurcación y subrutina deben estar en el mismo banco que la instrucción que realiza la bifurcación o la llamada, a menos que se utilicen saltos "largos" o llamadas a subrutinas para ejecutar código en otro banco. No hay ningún medio programático por el cual PB
se pueda cambiar directamente. [16]
Durante un ciclo de obtención o almacenamiento de datos, DB
se antepone a una dirección de datos de 16 bits para formar la dirección efectiva de 24 bits en la que se accederá a los datos. Esta característica del procesador permite ejecutar de forma sensata código 6502 o 65c02 que utiliza direcciones de 16 bits para hacer referencia a elementos de datos. A diferencia de PB
, DB
se puede cambiar bajo el control del programa, algo que podría hacerse para acceder a datos más allá de los límites del direccionamiento de 16 bits. Además, DB
se incrementará temporalmente si una dirección se indexa más allá de los límites del banco en el que se encuentra actualmente DB
. DB
se ignora si se especifica una dirección de 24 bits como operando de una instrucción de obtención/almacenamiento de datos, o si la dirección efectiva está en la página directa (cero) o en la pila de hardware . En el último caso, $00
se utiliza un banco implícito para generar la dirección efectiva. [17]
Una adición adicional al conjunto de registros es el registro de página directa de 16 bits ( DP
), que establece la dirección base para lo que antes se llamaba página cero , pero ahora se conoce como página directa . El direccionamiento de página directa utiliza una dirección de 8 bits, lo que da como resultado un acceso más rápido que cuando se utiliza una dirección de 16 o 24 bits. Además, algunos modos de direccionamiento que ofrecen indirección solo son posibles en la página directa. En el 65(c)02, la página directa siempre son los primeros 256 bytes de memoria, de ahí "página cero". En modo nativo, el 65c816 puede reubicar la página directa (cero) en cualquier lugar del banco $00
(los primeros 64 KB de memoria) escribiendo la dirección de inicio de 16 bits en DP
. Hay una penalización de acceso de un ciclo si DP
no se establece en un límite de página exacto, es decir, si el valor en DP
no es $xx00
, donde xx
es el byte más significativo. [18]
El modo de operación actual se almacena en el e
bit de emulación ( ). Habiendo agregado ya los nuevos bits x
y m
al conjunto anterior de seis indicadores en el registro de estado ( SR
), no quedaban suficientes bits para contener el nuevo bit de modo. En su lugar, se utilizó una solución única en la que el bit de modo se dejó "invisible", sin poder acceder a él directamente. La instrucción XCE
(e X change C arry with Emulation ) intercambia el valor del bit de emulación con el c
bit de acarreo ( ), bit 0 en SR
. Por ejemplo, si uno quiere ingresar al modo nativo después de que el procesador se haya iniciado, uno usaría CLC
para borrar el bit de acarreo y luego XCE
escribirlo en el bit de emulación. [19] Volviendo al modo de emulación 65c02, se usan SEC
seguidos de XCE
. [20]
Internamente, el 65c816 es un diseño de 16 bits. Los bits m
y en determinan cómo aparecen los registros de usuario (acumulador e índice) en el resto del sistema. Al reiniciarse, el 65c816 comienza en modo de emulación 6502, en el que y están bloqueados en . Por lo tanto, los registros están bloqueados en un tamaño de ocho bits. El byte más significativo (MSB) del acumulador (el -acumulador) no es directamente accesible pero se puede intercambiar con el byte menos significativo (LSB) del acumulador (el -acumulador) utilizando la instrucción. No hay una operación correspondiente para los registros de índice ( y ), cuyos MSB están bloqueados en .x
SR
m
x
1
B
A
XBA
X
Y
$00
Al cambiar al modo nativo, el bit más significativo de X
y Y
será cero y el B
acumulador permanecerá inalterado. Si se borra el m
bit en , el acumulador se "unirá" al acumulador para formar un registro de 16 bits (llamado acumulador). Una operación de carga/almacenamiento o aritmética/lógica que involucre al acumulador o la memoria será una operación de 16 bits: se requieren dos ciclos de bus para obtener/almacenar un valor de 16 bits.SR
B
A
C
Si se borra el x
bit en SR
, ambos registros de índice se establecerán en 16 bits. Si se utiliza para indexar una dirección, por ejemplo, LDA SOMEWHERE,X
, el valor de 16 bits en el registro de índice se agregará a la dirección base para formar la dirección efectiva.
Si el m
bit en SR
está establecido, el acumulador volverá a ser un registro de 8 bits y las operaciones posteriores en el acumulador, con algunas excepciones, serán operaciones de 8 bits. El B
-acumulador conservará el valor que tenía cuando el acumulador se estableció en 16 bits. Las excepciones son las instrucciones que transfieren el registro de página directa ( DP
) y el puntero de pila ( SP
) hacia/desde el acumulador. Estas operaciones siempre tienen 16 bits de ancho en modo nativo, independientemente de la condición del m
bit en SR
.
Si se activa el x
bit SR
, no solo los registros de índice volverán a tener 8 bits, sino que además se perderá todo lo que había en el MSB mientras tenían 16 bits de ancho, algo que un programador de lenguaje ensamblador no puede darse el lujo de olvidar. [21]
Sistemas basados en variantes 65c816: