El W65C816S (también 65C816 o 65816 ) es un microprocesador (MPU) de 16 bits desarrollado y vendido por Western Design Center (WDC). Introducido en 1983, [4] el W65C816S es una versión mejorada del MPU de 8 bits WDC 65C02 , en sí mismo 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 amplía el direccionamiento de la memoria a 24 bits , admitiendo 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 mejorar la gestión del hardware del sistema.
Al reiniciar , el W65C816S se inicia en "modo de emulación", lo que significa que se comporta sustancialmente como un 65C02. A partir de entonces, el W65C816S se puede cambiar al "modo nativo" con una secuencia de dos instrucciones, lo que hace que habilite todas las funciones mejoradas y aún así mantenga 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 ninguna otra MPU de la familia 6502.
El W65C802 o 65802 es completamente compatible en software con el 65C816, pero es eléctricamente compatible con el 6502 y el 65C02. Por lo tanto, el 65C802 podría usarse como reemplazo directo en la mayoría de los sistemas equipados con un 6502 o 65C02. Sin embargo, el 65C802 no puede emitir una dirección de 24 bits, lo que la limita a un espacio de direcciones de 64 KB. El 65C802 ya no se produce.
En 1981, Bill Mensch , fundador y director ejecutivo de WDC, comenzó el desarrollo del 65C02 con sus socios de producción, principalmente Rockwell Semiconductor y Synertek . El objetivo principal del esfuerzo 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, entre 1 ⁄ 10 y 1 ⁄ 20 a cualquier velocidad de reloj determinada. También se deseaba la posibilidad de aumentar la velocidad de reloj máxima admitida. El diseño 65C02 abordó las erratas del chip presentes en el NMOS 6502 (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, habría mejorado los gráficos y el sonido. Apple quería una MPU que fuera compatible con el software 6502 que entonces se usaba en el Apple II, pero con la capacidad de gestionar 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 lanzamiento completo en 1985. [6] Mensch contó con la ayuda durante el proceso de diseño de su hermana Kathryn, quien era responsable para parte del diseño del dispositivo.
El mismo proceso también condujo al 65C802, que era idéntico por dentro 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 el mismo diseño que el 6502 original, lo que permitía usarlo como reemplazo directo y al mismo tiempo permitir el procesamiento de 16 bits de la CPU. Sin embargo, como usaba el pinout original, sólo tenía 16 pines de direccionamiento y, por lo tanto, sólo podía acceder a 64 KB de memoria externa. [7] Normalmente, cuando los fabricantes de hardware diseñaban un proyecto desde cero, utilizaban el 65C816 en lugar del 65C802, lo que provocaba que este último fuera retirado de producción.
Posteriormente, Apple integró el 65C816 en la computadora Apple IIGS . El diseño básico del 65C816 fue adquirido por VLSI Technology , [8] GTE , Sanyo y otros desde mediados y finales de los años 1980 hasta principios de los 1990.
En la década de 1990, tanto el 65C816 como el 65C02 se convirtieron a un núcleo totalmente estático , lo que hizo posible detener completamente el reloj Ø2 del procesador sin pérdida de contenido de registro. Esta característica, junto con el uso de RAM estática asíncrona , hizo posible producir diseños que utilizaban una energía mínima cuando estaban en estado de espera.
A partir de abril de 2024 [actualizar], el W65C816S está disponible en WDC en formato 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] (para (por ejemplo , la serie W55V9x de circuitos integrados de entretenimiento educativo para TV de Winbond [12] ).
Características del WDC 65c816:
C
), puntero de pila ( SP
) y registros de índice ( X
y Y
).DP
).DB
) y del banco de programas ( PB
), que generan los bits 16 a 23 de código de 24 bits y direcciones de datos. Los registros separados del programa y del banco de datos permiten la segmentación del programa y el direccionamiento de datos lineales de 16 MB.VDA
) y la dirección de programa válida ( ) controlan las salidas para la calificación de la memoria, la cachéVPA
dual y la implementación de DMA de robo de ciclo .VPB
) para indicar cuándo se está recuperando un vector de interrupción .ABORTB
) y el vector asociado admiten la reparación del procesador de condiciones de error del bus, como fallas de página e violaciones de acceso a la memoria.MVN
y MVP
), que permiten la copia rápida de 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
) 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 de 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 el códigos de operación; y el "modo nativo", que expone todas las funciones nuevas. La CPU ingresa automáticamente al modo de emulación cuando se enciende o se reinicia, lo que le permite reemplazar un 65(C)02, suponiendo que se realicen los cambios de circuito necesarios 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 distintos registros de tamaños de 8 a 16 bits. Esta mejora afecta al acumulador ( A
), los registros de índiceX
y y el puntero de pila ( ). No afecta al contador del 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 utilizaban, aunque el bit 4 se conoce como b
indicador de interrupción ( ). En modo nativo, el bit 4 se convierte en la x
bandera y el bit 5 se convierte en la m
bandera. 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 vuelven modificables cuando el procesador se cambia al modo nativo. [13]
En la operación en modo nativo, los registros de índice y acumulador se pueden configurar en tamaños de 16 u 8 bits a discreción del programador usando las instrucciones REP
y SEP
para manipular los bits del registro de estado m
y x
. Esta característica le brinda al programador la capacidad de realizar operaciones en datos de tamaño de palabra y byte. Como los tamaños del acumulador y del registro de índice se pueden configurar de forma independiente, es posible, por ejemplo, configurar el acumulador en ocho bits y los registros de índice en 16 bits, lo que brinda al programador la capacidad de manipular bytes individuales en un rango de 64 KB sin necesidad de configurarlos. para realizar aritmética de punteros.
Cuando los tamaños de registro 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 y escritura, como ROR <addr>
, cuando se usa mientras el acumulador está configurado en 16 bits, afectará dos bytes contiguos de memoria, no uno, y consumirá más ciclos de reloj que cuando el acumulador está configurado 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 en el 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 utiliza dos registros de 8 bits, el banco de datos registro ( DB
) y el registro del banco del programa ( PB
), para configurar los bits 16-23 de la dirección, generando efectivamente direcciones de 24 bits. En ambos casos, 'banco' se refiere a un segmento de memoria contiguo de 64 KB que está delimitado por el rango de direcciones $xx0000-$xxFFFF
, donde xx
está la dirección del banco, es decir, los bits 16-23 de la dirección efectiva. Ambos DB
y PB
se inicializan $00
al encender o restablecer. [15]
Durante un ciclo de búsqueda de código de operación o de operandoPB
, se antepone al contador del programa ( PC
) para formar la dirección efectiva de 24 bits. En caso de PC
"ajustarse" (volver a cero), PB
no se incrementará. Por tanto, un programa está limitado por los límites del banco en el que se ejecuta. Este modelo de memoria implica que los objetivos de rama y subrutina deben estar en el mismo banco que la instrucción que realiza la rama o llamada, a menos que se utilicen saltos "largos" o llamadas de subrutina para ejecutar código en otro banco. No existe ningún medio programático que PB
pueda cambiarse directamente. [dieciséis]
Durante un ciclo de recuperació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 hace posible ejecutar con sensatez 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 se podría hacer 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 actualmente en 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 este último caso, $00
se utiliza un banco implícito para generar la dirección efectiva. [17]
Otra adición 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 denomina página directa . El direccionamiento directo de páginas 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 direccionamiento indirecto solo son posibles en página directa. En 65(c)02, la página directa son siempre los primeros 256 bytes de memoria, por lo tanto, “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 inicial de 16 bits en DP
. Hay una penalización de acceso de un ciclo si DP
no se establece un límite de página exacto, es decir, si el valor en DP
no es $xx00
, donde xx
está 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 bits nuevos x
y m
al conjunto anterior de seis indicadores en el registro de estado ( SR
), no quedaban suficientes bits para contener el bit de nuevo modo. En su lugar, se utilizó una solución única en la que el bit de modo se dejaba "invisible", sin poder acceder 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 desea ingresar al modo nativo después de que el procesador se haya iniciado, se debe CLC
borrar el bit de acarreo y luego XCE
escribirlo en el bit de emulación. [19] Al volver al modo de emulación 65c02 se utiliza SEC
seguido de XCE
. [20]
Internamente, el 65c816 tiene un diseño totalmente de 16 bits. Los m
bits x
y SR
determinan cómo aparecen los registros de usuario (acumulador e índice) en el resto del sistema. Tras el reinicio, el 65c816 se inicia en el modo de emulación 6502, en el que m
y x
están bloqueados en 1
. Por tanto, los registros están bloqueados en un tamaño de ocho bits. No se puede acceder directamente al byte más significativo (MSB) del acumulador (el B
acumulador), pero se puede intercambiar con el byte menos significativo (LSB) del acumulador (el A
acumulador) mediante la XBA
instrucción. No existe ninguna operación correspondiente para los registros de índice ( X
y Y
), cuyos MSB están bloqueados en $00
.
Al cambiar al modo nativo, el MSB de X
y Y
será cero y el B
acumulador no cambiará. Si se borra el m
bit de entrada , el acumulador se "conectará" al acumulador para formar un registro de 16 bits (llamado acumulador). Una operación de carga/almacenamiento o aritmética/lógica que involucre el acumulador o la memoria será una operación de 16 bits; se requieren dos ciclos de bus para recuperar/almacenar un valor de 16 bits.SR
B
A
C
Si se borra el x
bit 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 se establece el m
bit in SR
, 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 configuró 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 establece el x
bit SR
, no solo los registros de índice volverán a ser de 8 bits, sino que también se perderá todo lo que había en el MSB mientras tenían 16 bits de ancho, algo que un programador en lenguaje ensamblador no puede permitirse el lujo de olvidar. [21]
Sistemas basados en variantes 65c816: