stringtranslate.com

WDC 65C02

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 . Utiliza menos energía que el 6502 original, soluciona varios problemas y agrega nuevas instrucciones. El consumo de energía es del orden de 10 a 20 veces menor que el del 6502 original funcionando a la misma velocidad; [1] su reducido consumo de energía lo ha hecho útil en funciones de computadoras portátiles y sistemas de microcontroladores industriales . El 65C02 también se ha utilizado en algunas computadoras domésticas , así como en aplicaciones integradas , incluidos dispositivos implantados de grado médico.

El desarrollo del WDC 65C02 comenzó en 1981 [a] con muestras lanzadas a principios de 1983. [b] El 65C02 se lanzó oficialmente poco después. [2] WDC otorgó la licencia del diseño a Synertek , NCR , GTE Microcircuits 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. Posteriormente se copiaron nuevamente a la versión base, momento en el que WDC agregó dos nuevos comandos propios para crear el W65C02 . Posteriormente, Sanyo también obtuvo la licencia del diseño y Seiko Epson produjo una versión modificada adicional como HuC6280 .

Las primeras versiones utilizaban paquetes DIP de 40 pines y estaban disponibles en versiones de 1, 2 y 4 MHz, igualando las velocidades de las versiones nMOS originales. Las versiones posteriores se produjeron en paquetes PLCC y QFP , así como 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 oficialmente funciona a velocidades de hasta 14 MHz cuando se alimenta a 5 voltios.

Introducción y características

El 65C02 es un microprocesador de 8 bits de uso general y bajo costo ( registros de 8 bits y bus de datos ) con un contador de programa de 16 bits y bus de direcciones . El conjunto de registros es pequeño, con un único 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 (PC) de 16 bits. Además del acumulador único, los primeros 256 bytes de RAM, la "página cero" ( to ), 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 ampliar. La pila crece hacia atrás con el puntero de la pila (S) comenzando en $01FF y disminuyendo a medida que la pila crece. [3] Tiene un conjunto de instrucciones de longitud variable , que varía entre uno y tres bytes por instrucción. [1]$0000$00FF

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 sólo 20 mW, mientras que el original usa 450 mW, una reducción de más de veinte veces. [4] El núcleo optimizado manualmente y el uso de baja energía están destinados a hacer que el 65C02 sea ideal para diseños de sistema en chip (SoC) de baja potencia. [1]

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

El W65C02S–14 es la versión de producción a partir de 2023 y está disponible en paquetes PDIP , PLCC y QFP . La velocidad de reloj máxima oficialmente admitida Ø2 (primaria) 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 ralentice o se detenga por completo, ya sea en estado alto o bajo, sin pérdida de datos. [7] Los microprocesadores típicos no implementados en CMOS tienen núcleos dinámicos y perderán el contenido de sus registros internos (y por lo tanto fallarán) si no se sincronizan continuamente a una velocidad entre algunos valores mínimos y máximos especificados.

Características lógicas generales

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

Funciones lógicas

Características eléctricas

Funciones de reloj

El W65C02S puede funcionar con cualquier voltaje de alimentación 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 operativas 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 una operación confiable a 20 MHz debería ser fácilmente alcanzable con V DD a 5 voltios, suponiendo que el hardware de soporte lo permita.

La compatibilidad del W65C02S con velocidades de reloj arbitrarias le permite utilizar un reloj que funciona a una velocidad ideal para alguna otra parte del sistema, como 13,5 MHz (frecuencia de muestreo de luma SDTV digital), 14,31818 MHz (frecuencia 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 externos al chip, como la carga capacitiva en las clavijas 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 han funcionado con éxito a 200 MHz. [ cita necesaria ]

Comparación con el NMOS 6502

Arquitectura básica

Aunque el 65C02 puede considerarse principalmente como un 6502 de bajo consumo, también corrige varios errores encontrados en el original y agrega nuevas instrucciones, modos de direccionamiento y funciones 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 promedio en lenguaje ensamblador 6502 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 medida evitando los accesos a la memoria mediante el uso de menos instrucciones para realizar una tarea determinada. [1]

Se eliminaron las instrucciones no documentadas

El 6502 original tiene 56 instrucciones que, cuando se combinan con diferentes modos de direccionamiento, producen un total de 151 códigos de operación de los 256 patrones de códigos de operación de 8 bits posibles. Los 105 códigos de operación restantes no utilizados no están definidos, con el conjunto de códigos con 4 bits de orden inferior con 3, 7, B o F completamente sin usar, el código con 2 de orden inferior tiene solo un código de operación. [8]

En el 6502, algunos de estos códigos sobrantes en realidad realizan cálculos. Debido a la forma en que funciona el decodificador de instrucciones del 6502, simplemente configurar ciertos bits en el código de operación hace que se lleven a cabo partes del procesamiento de instrucciones. Algunos de estos códigos de operación bloquean inmediatamente el procesador, mientras que otros realizan funciones útiles e incluso algunos programadores les dieron mnemónicos de ensamblador no oficiales. [9]

El 65C02 agrega nuevos códigos de operación que utilizan algunas de estas ranuras de instrucciones no documentadas anteriormente. Por ejemplo, $FF se utiliza para la nueva BBSinstrucción. Los que quedan realmente sin utilizar equivalen al NOPs. Los programas 6502 que utilicen esos códigos de operación no funcionarán en el 65C02. [1]

Corrección de errores

El 6502 original tenía varias erratas cuando se lanzó inicialmente. Las primeras versiones del procesador no tenían RORinstrucciones (girar a la derecha) y los manuales de tecnología MOS tampoco lo documentaban. RORse implementó muy temprano en la producción y la gran mayoría de las máquinas que utilizan el procesador admiten esta instrucción. [10]

Un error que está presente en todas las variantes NMOS del 6502 implica la instrucción de salto cuando se utiliza direccionamiento indirecto . En este modo de direccionamiento, la dirección de destino de la JMPinstrucción se recupera 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 luego haría que el procesador continuara la ejecución en la dirección almacenada en el vector.

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, recuperará 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 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 en $1200 en lugar de $1300 . El 65C02 corrigió este problema. [1]JMPJMP ($12FF)

Más un descuido que un error, el estado del indicador (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 el indicador 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. [11]

Durante la aritmética en modo decimal , el NMOS 6502 actualizará los indicadores (N)egativo, 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. realizando la corrección decimal. Por el contrario, el 65C02 establece estos indicadores según el resultado de la aritmética decimal, a costa de un ciclo de reloj adicional por instrucción aritmética. [11]

Al ejecutar una instrucción de lectura-modificación-escritura (RMW), como , 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 provocar errores difíciles de resolver si addr es un registro de hardware. Esto puede ocurrir si el hardware está atento a cambios en el valor en el registro y luego realiza una acción; en este caso, realizará dos acciones, una con el valor original y luego otra con el nuevo valor. En cambio, el 65C02 realiza una doble lectura de addr , seguida de una sola escritura.INC addr

Al realizar un 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 registros de hardware mediante 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 solución introdujo un nuevo error [ cita necesaria ] que ocurre cuando la dirección base está en un límite de página par (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,Xse realizará una lectura ficticia en $1200 antes de que el valor de X se agregue a $1200 . Nuevamente, si se indexa en direcciones de registros de hardware, este error puede resultar en un comportamiento indefinido.

Si un NMOS 6502 está recuperando un código de operación BRK (interrupción de software) al mismo tiempo que ocurre una interrupción de hardware, el BRK se ignorará cuando el procesador reaccione a la interrupción de hardware. El 65C02 maneja correctamente esta situación al atender la interrupción y luego ejecutar 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:

Una desventaja de este modelo es que si no se necesita indexación pero la dirección está en la página cero, 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, liberando los registros de índice. [12]

La instrucción del 6502 JMPtenía un modo de direccionamiento único (entre las instrucciones 6502) conocido como "indirecto absoluto" que leía un valor de 16 bits de una dirección de memoria determinada 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 contiene $12, leería esos dos bytes, construiría el valor $1234 y luego saltaría a esa ubicación.JMP ($A000)

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 tabla en $A000 . es la tercera entrada, indexada a cero y cada dirección requiere 16 bits, por lo que para llamar a una se usaría algo similar a . Si el controlador se actualiza y el código de subrutina se mueve en la memoria, cualquier código existente seguirá funcionando siempre que la tabla de punteros permanezca en $A000 .READREADJMP ($A004)

El 65C02 agregó el nuevo modo "indirecto absoluto indexado" que facilitó el uso de tablas de sucursales. 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ía 4 en X, luego JMP ($A000,X). Este estilo de acceso simplifica el acceso a las tablas de sucursales, ya que se utiliza una dirección base única junto con un desplazamiento de 8 bits. [12] Se podría lograr lo mismo en la versión NMOS usando el modo indirecto indexado, pero solo si la tabla estaba en la página cero, un recurso limitado. Permitir que se construyeran fuera de la página cero no solo disminuyó la demanda de este recurso, sino que también permitió que las tablas se construyeran en ROM.

Instrucciones nuevas y modificadas.

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

Instrucciones de manipulación de bits

Tanto WDC como Rockwell contribuyeron con mejoras a las funciones de manipulación y prueba 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.

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

LDA $1234
BIT #%00010000

puede usarse en lugar de:

LDA $1234
AND #%00010000

La ANDoperación cambia el valor en el acumulador, por lo que se pierde el valor original cargado desde $1234. El uso BITdeja el valor en el acumulador sin cambios, por lo que el código posterior puede realizar pruebas adicionales con el valor original, evitando tener que volver a cargar el valor desde la memoria.

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

Una máscara en el acumulador ( .A) se conecta lógicamente con la memoria en addr , cuya ubicación puede ser página cero o absoluta. El indicador Z en el registro de estado está condicionado según el resultado del AND lógico; ningún otro indicador del registro de estado se ve afectado. Además, los bits en addr se establecen (TSB) o se borran (TRB) según la máscara en .A. TSB realiza una lógica ORdespués de la lógica ANDy almacena el resultado de la lógica ORen addr , mientras que TRB almacena los resultados de la lógica ANDen addr . En ambos casos, el indicador Z en el registro de estado indica el resultado antes de que se cambie el contenido de addr . Por lo tanto, TRB y TSB reemplazan una secuencia de instrucciones, esencialmente combinando la instrucción con pasos adicionales para guardar los cambios computacionales, pero de una manera que informa el estado del valor afectado antes de que se cambie. [1].A AND addrBIT

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 único código de operación. Las nuevas instrucciones estuvieron disponibles desde el principio en la familia R65C00 de Rockwell, [17] pero no formaban parte de la especificación 65C02 original y no se encontraban en las versiones fabricadas por WDC o sus otros licenciatarios. Posteriormente se copiaron nuevamente en el diseño básico y estuvieron disponibles en versiones posteriores de WDC.

Las instrucciones específicas de Rockwell son:

RMB y SMB se utilizan para borrar (RMB) o configurar (SMB) bits individuales en un campo de bits, cada uno de los cuales reemplaza una secuencia de tres instrucciones. Como RMB y SMB son direcciones de página cero únicamente, 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. [ cita necesaria ] El componente bit# de la instrucción a menudo se escribe como parte del mnemotécnico, como SMB1 $12el que 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, , lo que tiene la ventaja de permitir que sea reemplazado por un nombre de variable o un número calculado. [14]SMB 1,$12
Se aplican las mismas limitaciones y direccionamiento de página cero que RMB y SMB, pero se bifurca a addr si el bit seleccionado del byte de página cero zp está limpio (BBR) o establecido (BBS). Al igual que con RMB y SMB anteriores, el componente # de bit de la instrucción a menudo se escribe como parte del mnemotécnico, como por ejemplo, cuál se bifurca a la etiqueta de dirección addr si el bit 1 del byte en la dirección de página cero $12 está configurado. Algunos ensambladores tratan el bit# como parte del operando de la instrucción, por ejemplo, , lo que tiene la ventaja de permitir que sea reemplazado por un nombre de variable o un número calculado. Como es el caso de RMB y SMB, BBR y BBS reemplazan una secuencia de tres instrucciones. [14]BBS1 $12,addrBBS 1,$12,addr

Modos de bajo consumo

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

STP, DETENGA el procesador, detuvo todo el procesamiento hasta que se emitió un reinicio del 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 mucho.

WAITuvo un efecto similar, entrando en 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 conocido como " giro ", verificar el tipo cuando se recibe una y luego saltar al código de procesamiento. Esto significaba que el procesador estuvo funcionando durante todo el proceso, incluso cuando no se producían interrupciones.

Por el contrario, en el 65C02, el código de interrupción se podría escribir haciendo que a WAIsiga inmediatamente a JSRo JMPal controlador. Cuando WAIse encontró, el procesamiento se detuvo y el procesador entró en 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 del giro, la interrupción podría llegar en medio de una de las instrucciones del bucle y, para permitir que se reinicie después de regresar del controlador, el procesador dedica un ciclo a guardar su ubicación. Con WAI, el procesador ingresa al estado de bajo consumo en una ubicación conocida donde se garantiza que todas las instrucciones estarán completas, de modo que cuando llega la interrupción no es posible interrumpir una instrucción y el procesador puede continuar de manera segura sin gastar un estado de ahorro de ciclo.

65SC02

El 65 SC 02 es una variante del WDC 65C02 sin instrucciones de bits. [18] [19]

Usos notables del 65C02

Computadoras domésticas

Consolas de videojuegos

Otros productos

Ver también

Notas

  1. ^ Algunas fuentes, incluidas versiones anteriores de este artículo, afirman que fue 1978. Esta fue la fecha en que Bill Mensch, el diseñador principal, formó WDC. En un artículo de 1984, Mensch indica específicamente 1981 como fecha de inicio.
  2. ^ El artículo de Wagner de junio de 1983 menciona que estará disponible durante "varios meses". Dados los retrasos típicos en la publicación en ese momento, esto puede fecharlo a fines de 1982. Otra fuente apunta a 1980, consulte la página de discusión.

Referencias

Citas

  1. ^ abcdefg Wagner 1983, pag. 204.
  2. ^ "Habla suave". Publicación Softalk . vol. 3, núm. 10 de junio de 1983. p. 199 . Consultado el 24 de mayo de 2022 .
  3. ^ Koehn, Philipp (2 de marzo de 2018). "Pila 6502" (PDF) .
  4. ^ Taylor y Watford 1984, pág. 174.
  5. ^ "Proyectos de CPU 6502 en HDL (para FPGA)".
  6. ^ "Placa de desarrollador W65C02DB".
  7. ^ "W65C02S-14".
  8. ^ Parker, Neil. "El conjunto de instrucciones 6502/65C02/65C816 decodificado". Página de Neil Parker sobre Apple II .
  9. ^ Vardy, Adam (22 de agosto de 1995). "Instrucciones adicionales de la CPU de la serie 65XX".
  10. ^ Archivo: Conjunto de instrucciones MCS650x.jpg
  11. ^ ab "Diferencias entre NMOS 6502 y CMOS 65c02" . Consultado el 27 de febrero de 2018 . Los indicadores N, V ​​y Z eran incorrectos después de la operación decimal (pero C estaba bien).
  12. ^ ab Clark, Bruce. "Códigos de operación 65C02".
  13. ^ abc Wagner 1983, pag. 200.
  14. ^ abcd Wagner 1983, pag. 203.
  15. ^ Wagner 1983, págs. 200-201.
  16. ^ "Hoja de datos del W65C02S" (PDF) .
  17. ^ Wagner 1983, pag. 199.
  18. ^ Agenda de microcircuitos GTE. Microcircuitos GTE. 1984. pág. 1-3 . Consultado el 2 de mayo de 2024 .
  19. ^ Zaks, Rodnay (1983). Programando el 6502. Sybex. pag. 348.ISBN 0895881357.
  20. ^ "8-La Apple IIc". Historia de Apple II . 23 de junio de 2010 . Consultado el 31 de octubre de 2023 .
  21. ^ "Computadora BBC Master Acorn". www.old-computers.com . Consultado el 31 de octubre de 2023 .
  22. ^ "Tecnología de vídeo LASER 128 / 128EX / 128EX2". www.old-computers.com . Consultado el 31 de octubre de 2023 .
  23. ^ "HuC6280 - Píxeles arcaicos".

Bibliografía

Lectura adicional

Enlaces externos