WDC 65C02 - WDC 65C02

W65c02s8p-14 lg.jpg
Microprocesador W65C02S en un paquete PDIP-40.
Información general
Lanzado 1981 ; ¿ Hace 40 años ? ( 1981 )
Fabricante (s) común (es)
Rendimiento
Max. Frecuencia de reloj de la CPU 1 MHz a 14 MHz
Historia
Predecesor Tecnología MOS 6502

El microprocesador Western Design Center (WDC) 65C02 es una versión CMOS mejorada de la popular tecnología MOS 6502 de 8 bits basada en nMOS . El 65C02 solucionó varios problemas en el 6502 original y agregó algunas instrucciones nuevas, pero su característica principal fue un consumo de energía muy reducido, del orden de 10 a 20 veces menos que el 6502 original funcionando a la misma velocidad. El reducido consumo de energía hizo que el 65C02 fuera útil en funciones de computadoras portátiles y sistemas de microcontroladores en entornos industriales. Se ha utilizado en algunas computadoras domésticas , así como en aplicaciones integradas , incluidos dispositivos implantados de grado médico.

El desarrollo comenzó en 1981 y las muestras se lanzaron a principios de 1983. WDC autorizó el diseño a Synertek , NCR , GTE y Rockwell Semiconductor . El interés principal de Rockwell estaba en el mercado integrado y solicitó que se agregaran varios comandos nuevos para ayudar en esta función. Más tarde, estos se copiaron de nuevo a la versión de referencia, momento en el que WDC agregó dos nuevos comandos propios para crear el W65C02 . Más tarde, Sanyo también obtuvo la licencia del diseño, y Seiko Epson produjo una versión más modificada como la HuC6280 .

Las primeras versiones usaban empaquetamiento DIP de 40 pines y estaban disponibles en versiones de 1, 2 y 4 MHz. Las versiones posteriores se produjeron en paquetes PLCC y QFP , así como en PDIP, y con índices de velocidad de reloj mucho más altos. La versión actual de WDC, el W65C02S-14 tiene un núcleo completamente estático y funciona oficialmente a velocidades de hasta 14 MHz cuando se alimenta a 5 voltios.

Introducción y características

El 65C02 es un bajo costo, de uso general 8-bit microprocesador (8 bits registros y bus de datos ) con un 16-bit contador de programa y bus de direcciones . El conjunto de registros es pequeño, con un solo acumulador de 8 bits (A), dos registros de índice de 8 bits (X e Y), un registro de estado de 8 bits (P) y un contador de programa de 16 bits (PC). Además del acumulador único, los primeros 256 bytes de RAM, la "página cero" ( $0000a $00FF), permiten un acceso más rápido a través de modos de direccionamiento que utilizan una dirección de memoria de 8 bits en lugar de una dirección de 16 bits. La pila se encuentra en los siguientes 256 bytes, página uno ($ 0100 a $ 01FF) y no se puede mover ni extender. La pila crece al revés con el puntero de pila (S) comenzando en $ 01FF y decrementando a medida que crece la pila. Tiene un conjunto de instrucciones de longitud variable, que varía entre uno y tres bytes por instrucción.

La arquitectura básica del 65C02 es idéntica a la del 6502 original y puede considerarse una implementación de bajo consumo de ese diseño. A 1 MHz, la velocidad más popular para el 6502 original, el 65C02 requiere solo 20 mW, mientras que el original usa 450 mW, una reducción de más de veinte veces. El núcleo optimizado manualmente y el uso de baja potencia están destinados a hacer que el 65C02 sea muy adecuado para diseños de sistema en chip (SoC) de baja potencia .

Hay disponible un modelo de descripción de hardware Verilog para diseñar el núcleo W65C02S en un circuito integrado específico de la aplicación (ASIC) o una matriz de puertas programables en campo (FPGA). Como es común en la industria de los semiconductores, WDC ofrece un sistema de desarrollo, que incluye una placa de desarrollo , un emulador en circuito (ICE) y un sistema de desarrollo de software.

El W65C02S – 14 es la versión de producción a partir de 2020 y está disponible en paquetes PDIP , PLCC y QFP . La máxima velocidad de reloj de Ø2 (primaria) admitida oficialmente es de 14  MHz cuando se opera a 5 voltios, indicada por el sufijo de número de pieza –14 (los aficionados han desarrollado sistemas caseros 65C02 que funcionan más rápido que la clasificación oficial). La designación "S" indica que la pieza tiene un núcleo completamente estático , una característica que permite que Ø2 se desacelere o se detenga por completo en el estado alto o bajo sin pérdida de datos. Los microprocesadores típicos no implementados en CMOS tienen núcleos dinámicos y perderán su contenido de registro interno (y por lo tanto fallarán) si no se sincronizan continuamente a una velocidad entre algunos valores mínimos y máximos especificados.

65C02 registros
1 5 1 4 1 3 1 2 1 1 1 0 0 9 0 8 0 7 0 6 0 5 0 4 0 3 0 2 0 1 0 0 (posición de bit)
Registros principales
  A Un acumulador
Registros de índice
  X Registro de índice X
  Y Registro de índice Y
0 0 0 0 0 0 0 1 SP S tack P ointer
Contador de programa
ordenador personal P ROGRAMA C ounter
Registro de estado
  norte V - B D I Z C S tatus R egister

Características lógicas generales

Fotografía de matriz de un microcontrolador Sitronix ST2064B que muestra el núcleo W65C02S integrado en la parte superior derecha

Características lógicas

Caracteristicas electricas

  • Voltaje de suministro especificado de 1,71 V a 5,25 V
  • Consumo de corriente (núcleo) de 0,15 y 1,5 mA por MHz a 1,89 V y 5,25 V respectivamente
  • El conjunto de instrucciones de longitud variable, que permite la optimización del tamaño del código en procesadores de conjuntos de instrucciones de longitud fija, genera ahorros de energía
  • Los circuitos completamente estáticos permiten detener el reloj para ahorrar energía

Funciones de reloj

El W65C02S puede funcionar con cualquier voltaje de suministro conveniente (V DD ) entre 1.8 y 5 voltios (± 5%). La tabla de características de CA de la hoja de datos enumera las características de funcionamiento a 5 V a 14 MHz, 3,3 V o 3 V a 8 MHz, 2,5 V a 4 MHz y 1,8 V a 2 MHz. Esta información puede ser un artefacto de una hoja de datos anterior, ya que un gráfico indica que los dispositivos típicos son capaces de operar a velocidades más altas que las sugeridas por la tabla de características de CA, y que la operación confiable a 20 MHz debería ser fácilmente alcanzable con V DD a 5 voltios, asumiendo que el hardware de soporte lo permita.

El soporte del W65C02S para velocidades de reloj arbitrarias le permite usar un reloj que funciona a una velocidad ideal para alguna otra parte del sistema, como 13,5 MHz (frecuencia de muestreo de luma de SDTV digital), 14.31818 MHz (frecuencia de portadora de color NTSC × 4), 14,75 MHz (píxeles cuadrados PAL), 14,7456 (cristal de velocidad en baudios), etc., siempre que V DD sea ​​suficiente para soportar la frecuencia. El diseñador Bill Mensch ha señalado que F MAX se ve afectado por factores fuera del chip, como la carga capacitiva en los pines del microprocesador. Minimizar la carga mediante el uso de pistas de señal cortas y la menor cantidad de dispositivos ayuda a aumentar F MAX . Los paquetes PLCC y QFP tienen menos capacitancia pin a pin que el paquete PDIP y son más económicos en el uso del espacio de la placa de circuito impreso .

WDC ha informado que las realizaciones FPGA del W65C02S se han operado con éxito a 200 MHz.

Comparación con NMOS 6502

Arquitectura básica

Aunque el 65C02 se puede considerar principalmente como un 6502 de bajo consumo, también corrige varios errores encontrados en el original y agrega nuevas instrucciones, modos de direccionamiento y características que pueden ayudar al programador a escribir programas más pequeños y de ejecución más rápida. Se estima que el programa de lenguaje ensamblador 6502 promedio se puede hacer entre un 10 y un 15 por ciento más pequeño en el 65C02 y ver una mejora similar en el rendimiento, en gran parte a través de accesos a la memoria evitados mediante el uso de menos instrucciones para realizar una tarea determinada.

Se quitaron las instrucciones sin documentar

El original 6502 tenía 56 instrucciones, que, cuando se combina con diferentes modos de direccionamiento, produjo un total de 151 códigos de operación de los posibles 256 patrones de 8 bits de código de operación. Los 105 códigos de operación restantes no utilizados estaban indefinidos, con el conjunto de códigos con 4 bits de orden bajo con 3, 7, B o F completamente sin usar, el código con 2 de orden bajo solo tenía un código de operación único.

El 6502 era famoso por la forma en que algunos de estos códigos sobrantes realizaban acciones. Debido a la forma en que funcionaba el decodificador de instrucciones del 6502, simplemente establecer ciertos bits en el código de operación haría que se llevaran a cabo partes del procesamiento de instrucciones. Algunos de estos códigos de operación colapsarían inmediatamente el procesador, mientras que otros realizaban funciones útiles e incluso los usuarios les daban mnemónicos de ensamblador no oficiales.

El 65C02 agregó varios códigos de operación nuevos que consumieron varias de estas ranuras de "instrucción no documentada", por ejemplo, $ FF ahora se usaba para la nueva BBSinstrucción (ver más abajo). Aquellos que quedaron realmente sin usar estaban listos para realizar NOPs. Los programas que aprovecharon estos códigos no funcionarán en el 65C02, pero estos códigos siempre se documentaron como no operativos y no deberían haberse utilizado.

Corrección de errores

El 6502 original tenía varias erratas cuando se lanzó inicialmente. Las primeras versiones del procesador tenían una RORinstrucción defectuosa (girar a la derecha), lo que solucionó el problema de la tecnología MOS al no documentar la instrucción. RORse corrigió muy temprano en la producción y no fue un problema para la gran mayoría de las máquinas que usaban el procesador.

En contraste, un error notorio que está presente en todas las variantes NMOS del 6502 involucra la instrucción de salto ( JMP) cuando se usa direccionamiento indirecto . En este modo de direccionamiento, la dirección de destino de la JMPinstrucción se obtiene de la memoria (el vector de salto), en lugar de ser un operando de la JMPinstrucción. Por ejemplo, JMP ($1234)buscaría el valor en las ubicaciones de memoria $ 1234 (byte menos significativo) y $ 1235 (byte más significativo) y cargaría esos valores en el contador del programa , lo que haría que el procesador continuara la ejecución en la dirección almacenada en el vector de salto.

El error aparece cuando la dirección del vector termina en $ FF, que es el límite de una página de memoria . En este caso, JMPobtendrá el byte más significativo de la dirección de destino de $ 00 de la página original en lugar de $ 00 de la nueva página. Por JMP ($12FF)lo tanto , obtendría el byte menos significativo de la dirección de destino en $ 12FF y el byte más significativo de la dirección de destino de $ 1200 en lugar de $ 1300. El 65C02 corrigió este problema.

Más un descuido que un error, el estado de la bandera (D) ecimal en el registro de estado del NMOS 6502 no está definido después de un reinicio o una interrupción . Esto significa que los programadores deben establecer la bandera en un valor conocido para evitar errores relacionados con las operaciones aritméticas. Como resultado, se encuentra una CLDinstrucción (CLear Decimal) en casi todos los manejadores de interrupciones 6502 , así como al principio del código de reinicio. El 65C02 borra automáticamente este indicador después de empujar el registro de estado a la pila en respuesta a cualquier interrupción o en respuesta a un reinicio del hardware, colocando así el procesador nuevamente en modo aritmético binario.

Durante la aritmética en modo decimal , el NMOS 6502 actualizará los indicadores (N) egative, o (V) erflow y (Z) ero para reflejar el resultado de la aritmética binaria subyacente, es decir, los indicadores reflejan un resultado calculado antes del procesador. realizar la corrección decimal. Por el contrario, el 65C02 establece estos indicadores de acuerdo con el resultado de la aritmética decimal, a costa de un ciclo de reloj adicional por instrucción aritmética.

Al ejecutar una instrucción de lectura-modificación-escritura (RMW), por ejemplo , todas las variantes de NMOS realizarán una doble escritura en addr , primero reescribiendo el valor actual encontrado en addr y luego escribiendo el valor modificado. Este comportamiento puede resultar en errores difíciles de resolver si addr es un registro de hardware. En cambio, el 65C02 realiza una lectura doble de addr , seguida de una sola escritura. INC addr

Al realizar el direccionamiento indexado, si la indexación cruza el límite de una página, todas las variantes de NMOS leerán desde una dirección no válida antes de acceder a la dirección correcta. Al igual que con una instrucción RMW, este comportamiento puede causar problemas al acceder a los registros de hardware a través de la indexación. El 65C02 solucionó este problema realizando una lectura ficticia del código de operación de la instrucción cuando la indexación cruza el límite de una página. Sin embargo, esta corrección introdujo un nuevo error que ocurre cuando la dirección base está en un límite de página uniforme (lo que significa que la indexación nunca pasará a la página siguiente). Con el nuevo error, se realiza una lectura ficticia en la dirección base antes de la indexación, de modo que LDA $1200,Xhará una lectura ficticia en $ 1200 antes de que el valor de X se agregue a $ 1200. Nuevamente, si se indexa en direcciones de registro de hardware, este error puede resultar en un comportamiento indefinido.

Si un NMOS 6502 está obteniendo un código de operación BRK (interrupción de software) al mismo tiempo que ocurre una interrupción de hardware, BRK se ignorará cuando el procesador reaccione a la interrupción. El 65C02 maneja correctamente esta situación dando servicio a la interrupción y luego ejecutando BRK.

Nuevos modos de direccionamiento

El 6502 tiene dos modos de direccionamiento indirecto que eliminan la referencia a través de direcciones de 16 bits almacenadas en la página cero:

  • Indicado indirecto, por ejemplo LDA ($10,X), agrega el registro X a la dirección cero de la página dada antes de leer el vector de 16 bits. Por ejemplo, si X es 5, lee la dirección de 16 bits de la ubicación $ 15 / $ 16. Esto es útil cuando hay una matriz de punteros en la página cero.
  • Indirect indexado LDA ($10),Yagrega el registro Y al vector de 16 bits leído desde la dirección cero de la página dada. Por ejemplo, si Y es 5 y $ 10 / $ 11 contiene el vector $ 1000, esto lee el valor de $ 1005. Esto realiza el direccionamiento con desplazamiento de puntero.

Una desventaja de este modelo es que si no se necesita indexación, uno de los registros de índice aún debe establecerse en cero y usarse en una de estas instrucciones. El 65C02 agregó un modo de direccionamiento indirecto no indexado LDA ($10)a todas las instrucciones que usaban modos indexados indirectos e indirectos indexados, liberando los registros de índice.

La JMPinstrucción del 6502 tenía un modo de direccionamiento único (entre 6502 instrucciones) conocido como "indirecto absoluto" que leía un valor de 16 bits de una dirección de memoria dada y luego saltaba a la dirección en ese valor de 16 bits. Por ejemplo, si la ubicación de memoria $ A000 contiene $ 34 y $ A001 tiene $ 12, JMP ($A000)leería esos dos bytes, construiría el valor $ 1234 y luego saltaría a esa ubicación.

Un uso común del direccionamiento indirecto es crear tablas de rama , una lista de puntos de entrada para subrutinas a las que se puede acceder mediante un índice. Por ejemplo, un controlador de dispositivo podría enumerar los puntos de entrada para OPEN, CLOSE, READ, etc en una mesa en $ A000. READes la tercera entrada, indexada a cero, y cada dirección requiere 16 bits, por lo que para llamar a READuna se usaría algo similar a JMP ($A004). Si el controlador se actualiza y el código de la subrutina se mueve en la memoria, cualquier código existente seguirá funcionando siempre que la tabla de punteros permanezca en $ A000.

El 65C02 agregó el nuevo modo "indirecto absoluto indexado" que facilitó el uso de tablas de rama. Este modo agregó el valor del registro X a la dirección absoluta y tomó la dirección de 16 bits de la ubicación resultante. Por ejemplo, para acceder a la READfunción de la tabla anterior, se almacenarían 4 en X, luego JMP ($A000,X). Este estilo de acceso simplifica el acceso a las tablas de sucursales, ya que se utiliza una única dirección base junto con un desplazamiento de 8 bits.

Instrucciones nuevas y modificadas

Además de los nuevos modos de direccionamiento, el "modelo base" 65C02 también agregó un conjunto de nuevas instrucciones.

  • INCy DECsin parámetros ahora incrementa o decrementa el acumulador. Este fue un descuido extraño en el conjunto de instrucciones original, que solo incluía INX/ DEX, INY/ DEYy / . Algunos ensambladores usan las formas alternativas / o / .INC addrDEC addrINADEAINC ADEC A
  • STZ addr, STore Zero en addr . Reemplaza la necesidad y no requiere cambiar el valor del acumulador. Como esta tarea es común en la mayoría de los programas, el uso de STZ puede reducir el tamaño del código, tanto al eliminar el LDA como cualquier código necesario para guardar el valor del acumulador, generalmente un par.LDA #0;STA addrPHA PLA
  • PHX, PLX, PHY, PLY, Empuje y tire de la X y registros Y a / de la pila. Anteriormente, solo el acumulador y el registro de estado tenían instrucciones de empujar y tirar. X e Y solo podían apilarse moviéndolos al acumulador primero con TXAo TYA, cambiando así el contenido del acumulador y luego usando PHA.
  • BRA, rama siempre. Funciona como un JMPpero usa una dirección relativa de 1 byte como otras ramas, ahorrando un byte. La velocidad es a menudo la misma que la absoluta de 3 ciclos, a JMPmenos que se cruce una página, lo que haría que el BRAciclo de la versión 1 sea más largo (4 ciclos). Como la dirección es relativa, también es útil al escribir código reubicable, una tarea común en la era anterior a las unidades de gestión de memoria .

Instrucciones de manipulación de bits

Tanto WDC como Rockwell contribuyeron con mejoras a las funciones de prueba y manipulación de bits en el 65C02. WDC agregó nuevos modos de direccionamiento a la instrucción BIT que estaba presente en el 6502, así como dos nuevas instrucciones para la manipulación conveniente de campos de bits, una actividad común en los controladores de dispositivos.

BIT en el 65C02 agrega modo inmediato, página cero indexada por X y absoluta indexada por direccionamiento X. El direccionamiento en modo inmediato es particularmente conveniente porque es completamente no destructivo. Por ejemplo:

LDA <registro>
BIT #% 00010000

puede usarse en lugar de:

LDA <registro>
Y #% 00010000

El primero conserva el valor cargado desde <register> para que se pueda realizar más de una prueba en él. La última secuencia es destructiva para el valor del registro.

Además de las mejoras de la instrucción BIT, WDC agregó dos instrucciones diseñadas para manipular convenientemente los campos de bits:

  • TSB addry , T est y S et B its y T est y R eset B its.TRB addr
Una máscara en el acumulador ( .A) es un AND lógico con memoria en addr , cuya ubicación puede ser página cero o absoluta. La bandera Z en el registro de estado está condicionada de acuerdo con el resultado del Y lógico; ningún otro indicador de registro de estado se ve afectado. Además, los bits en addr se establecen (TSB) o se borran (TRB) de acuerdo con la máscara en .A. De manera sucinta, TSB realiza un OR lógico después del AND lógico y almacena el resultado del OR lógico en addr , mientras que TRB almacena los resultados del AND lógico en addr . En ambos casos, la bandera Z en el registro de estado indica el resultado de antes de que el contenido del addr se cambia. Por lo tanto, TRB y TSB reemplazan una secuencia de instrucciones, esencialmente combinando la instrucción BIT con pasos adicionales para guardar los cambios computacionales, pero de una manera que informa el estado del valor afectado antes de que se cambie..A AND addr

Los cambios de Rockwell agregaron más instrucciones de manipulación de bits para configurar y probar directamente cualquier bit, y combinar la prueba, borrar y bifurcar en un solo código de operación. Las nuevas instrucciones estaban disponibles desde el principio en la familia R65C00 de Rockwell, pero no formaban parte de la especificación 65C02 original y no se encuentran en las versiones fabricadas por WDC o sus otros licenciatarios. Posteriormente se copiaron de nuevo en el diseño de línea de base y estuvieron disponibles en versiones posteriores de WDC.

Las instrucciones específicas de Rockwell son:

  • SMBbit# zp/ . Establecer o restablecer (borrar) el número de bit bit # en el byte de página cero zp .RMBbit# zp
RMB y SMB se utilizan para borrar (RMB) o establecer (SMB) bits individuales en un campo de bits, cada uno reemplazando una secuencia de tres instrucciones. Como RMB y SMB son solo direccionamiento de página cero, estas instrucciones tienen una utilidad limitada y son principalmente valiosas en sistemas en los que los registros de dispositivos están presentes en la página cero. El componente de bit # de la instrucción a menudo se escribe como parte del mnemónico, como el SMB1 $12que establece el bit 1 en la dirección de página cero $ 12. Algunos ensambladores tratan el bit # como parte del operando de la instrucción, por ejemplo, que tiene la ventaja de permitir que sea reemplazado por un nombre de variable o un número calculado.SMB 1,$12
  • BBR bit#,offset,addry bifurcación en el ajuste / reinicio de bits.BBS bit#,offset,addr
El mismo direccionamiento de página cero y limitaciones que RMB y SMB, pero se bifurca a addr si el bit seleccionado está limpio (BBR) o establecido (BBS). Como es el caso de RMB y SMB, BBR y BBS reemplazan una secuencia de tres instrucciones.

Modos de bajo consumo

Además de los nuevos comandos anteriores, WDC también agregó las instrucciones STPy WAIpara admitir modos de bajo consumo.

STP, DETENGA el procesador, detuvo todo el procesamiento hasta que se emitió un reinicio de hardware. Esto podría usarse para poner un sistema en "suspensión" y luego reactivarlo rápidamente con un reinicio. Normalmente, esto requeriría algún sistema externo para mantener la memoria principal y no se usaba ampliamente.

WAITuvo un efecto similar, ingresando al modo de bajo consumo, pero esta instrucción despertó al procesador nuevamente al recibir una interrupción. Anteriormente, manejar una interrupción generalmente implicaba ejecutar un bucle para verificar si se había recibido una interrupción, a veces conocida como " girar ", verificar el tipo cuando se recibe una y luego saltar al código de procesamiento. Esto significó que el procesador estuvo funcionando durante todo el proceso.

Por el contrario, en el 65C02, el código de interrupción podría escribirse teniendo a WAIseguido inmediatamente por a JSRo JMPal controlador. Cuando WAIse encontró el, el procesamiento se detuvo y el procesador pasó al modo de bajo consumo. Cuando se recibió la interrupción, inmediatamente procesó JSRy manejó la solicitud.

Esto tenía la ventaja adicional de mejorar ligeramente el rendimiento. En el caso de giro, la interrupción puede llegar en medio de una de las instrucciones del bucle, y para permitir que se reinicie después de regresar del controlador, el procesador pasa un ciclo para guardar su ubicación. Con WAI, el procesador ingresa al estado de bajo consumo de energía en una ubicación conocida donde se garantiza que todas las instrucciones están completas, por lo que cuando llega la interrupción no puede interrumpir una instrucción y el procesador puede continuar de manera segura sin pasar un estado de ahorro de ciclo.

65SC02

El 65 SC 02 es una variante del WDC 65C02 sin instrucciones de bit.

Usos notables del 65C02

Ordenadores domésticos

Juegos de consolas

Otros productos

Ver también

Notas

Referencias

Citas

Bibliografía

  • Wagner, Robert (junio de 1983). "Líneas de montaje" . Softtalk . págs. 199–204.
  • Taylor, Simon; Watford, Bob (julio de 1984). "6502 avivamiento" . Mundo de la computadora personal . págs. 174-175.

Otras lecturas

enlaces externos