El microprocesador 65C02 de Western Design Center (WDC) es una versión CMOS mejorada del popular 6502 de 8 bits basado en nMOS . Utiliza menos energía que el 6502 original, corrige varios problemas y agrega nuevas instrucciones. El consumo de energía es del orden de 10 a 20 veces menor que el 6502 original funcionando a la misma velocidad; [1] su consumo de energía reducido lo ha hecho útil en funciones de computadora portátil 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 fue lanzado oficialmente poco tiempo después. [2] WDC licenció el 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. Estos se copiaron más tarde en la versión base, momento en el que WDC agregó dos nuevos comandos propios para crear el W65C02 . Más tarde, Sanyo también licenció el diseño y Seiko Epson produjo una versión modificada adicional como HuC6280 .
Las primeras versiones utilizaban un encapsulado DIP de 40 pines y estaban disponibles en versiones de 1, 2 y 4 MHz, que igualaban las velocidades de las versiones nMOS originales. Las versiones posteriores se produjeron en encapsulados PLCC y QFP , así como PDIP, y con índices de velocidad de reloj mucho más altos. La versión actual de WDC, la W65C02S-14, tiene un núcleo completamente estático y funciona oficialmente a velocidades de hasta 14 MHz cuando se alimenta a 5 voltios.
El 65C02 es un microprocesador de 8 bits de bajo costo y propósito general ( registros de 8 bits y bus de datos ) con un contador de programa de 16 bits y un 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 único acumulador, los primeros 256 bytes de RAM, la "página cero" ( a ), 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, la página uno ($0100 a $01FF), y no se puede mover ni extender. La pila crece hacia atrás con el puntero de pila (S) comenzando en $01FF y decreciendo 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 solo 20 mW, mientras que el original utiliza 450 mW, una reducción de más de veinte veces. [4] El núcleo optimizado manualmente y el bajo consumo de energía tienen como objetivo hacer que el 65C02 sea adecuado para diseños de sistema en chip (SoC) de bajo consumo. [1]
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). [5] Como es común en la industria de 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. [6]
El W65C02S–14 es la versión de producción a partir de 2023 [actualizar]y está disponible en paquetes PDIP , PLCC y QFP . La velocidad de reloj máxima oficialmente admitida de Ø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 en el 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, se bloquearán) si no se sincronizan continuamente a una velocidad entre algunos valores mínimos y máximos especificados.
VPB
) indica cuándo se están direccionando los vectores de interrupciónMLB
) indica a otros maestros de bus cuando se está procesando una instrucción de lectura-modificación-escrituraWAI
) y ST o P ( STP
) reducen el consumo de energía, disminuyen la latencia de interrupción y permiten la sincronización con eventos externos.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 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 funcionar a velocidades más altas que las sugeridas por la tabla de características de CA, y que el funcionamiento confiable a 20 MHz debería lograrse fácilmente con V DD a 5 voltios, suponiendo que el hardware de soporte lo permita.
El soporte del W65C02S para frecuencias de reloj arbitrarias le permite usar un reloj que funcione a una frecuencia ideal para alguna otra parte del sistema, como 13,5 MHz (frecuencia de muestreo de luma digital SDTV), 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 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 encapsulados PLCC y QFP tienen menos capacitancia pin a pin que el encapsulado 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. [ cita requerida ]
Aunque el 65C02 puede considerarse en su mayor parte 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 promedio en lenguaje ensamblador 6502 puede hacerse 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 memoria evitados mediante el uso de menos instrucciones para realizar una tarea determinada. [1]
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, y el conjunto de códigos con 4 bits de orden inferior con 3, 7, B o F queda totalmente sin usar, mientras que el código con 2 de orden inferior tiene solo un único código de operación. [8]
En el 6502, algunos de estos códigos sobrantes realmente realizan cálculos. Debido a la forma en que funciona el decodificador de instrucciones del 6502, simplemente al configurar ciertos bits en el código de operación se realizan partes del procesamiento de la instrucción. Algunos de estos códigos de operación bloquean inmediatamente el procesador, mientras que otros realizan funciones útiles e incluso algunos programadores les dieron mnemotécnicos 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, se utiliza $FF para la nueva BBS
instrucción. Las que permanecen realmente sin usar son equivalentes a NOP
s. Los programas 6502 que utilizan esos códigos de operación no funcionarán en el 65C02. [1]
El 6502 original tenía varias erratas cuando se lanzó inicialmente.
Las primeras versiones del procesador de 1975 no tenían ROR
instrucción (rotar a la derecha), aunque sí tenían ROL
instrucción (rotar a la izquierda). Esta fue una elección de diseño deliberada por parte de MOS Technology, ya que se consideró que la implementación ROR
era demasiado costosa en el área de chips para los beneficios que proporcionaba. [10] Sin embargo, los clientes se quejaron de la falta de instrucción ROR
y se implementó en partes fabricadas a partir de junio de 1976. La ausencia de instrucción ROR
afectó especialmente el rendimiento de la normalización de mantisa en rutinas matemáticas de punto flotante. [11] La gran mayoría de las máquinas que utilizan el procesador admiten esta instrucción. [12]
Un error que está presente en todas las variantes NMOS del 6502 involucra la instrucción de salto cuando se utiliza direccionamiento indirecto . En este modo de direccionamiento, la dirección de destino de la JMP
instrucción se obtiene de la memoria, el vector de salto, en lugar de ser un operando de la JMP
instrucción. Por ejemplo, JMP ($1234)
obtendrí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 de 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, obtendrá 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 de $1200 en lugar de $1300 . El 65C02 corrigió este problema. [1]JMP
JMP ($12FF)
Más que un error, se trata de un descuido: 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 tienen que establecer el indicador en un valor conocido para evitar errores relacionados con operaciones aritméticas. Como resultado, se encuentra una CLD
instrucción (CLear Decimal) en casi todos los controladores de interrupciones del 6502 , así como al principio del código de reinicio. El 65C02 borra automáticamente este indicador después de colocar el registro de estado en la pila en respuesta a cualquier interrupción o en respuesta a un reinicio de hardware, lo que coloca al procesador nuevamente en modo aritmético binario. [13]
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 de que el procesador realice la corrección decimal. Por el contrario, el 65C02 establece estos indicadores de acuerdo con el resultado de la aritmética decimal, al costo de un ciclo de reloj adicional por instrucción aritmética. [13]
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 generar errores difíciles de resolver si addr es un registro de hardware. Esto puede ocurrir si el hardware está observando los 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 vez con el nuevo valor. El 65C02, en cambio, realiza una doble lectura de addr , seguida de una sola escritura.INC addr
Al realizar el direccionamiento indexado, si la indexación cruza un límite de 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 al realizar una lectura ficticia del código de operación de la instrucción cuando la indexación cruza un límite de página. Sin embargo, esta corrección introdujo un nuevo error [ cita requerida ] que ocurre cuando la dirección base está en un límite de página par (lo que significa que la indexación nunca cruzará a la siguiente página). Con el nuevo error, se realiza una lectura ficticia en la dirección base antes de la indexación, de modo que LDA $1200,X
se realizará 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 se produce una interrupción de hardware, se ignorará la BRK mientras el procesador reacciona a la interrupción de hardware. El 65C02 maneja correctamente esta situación al atender la interrupción y luego ejecutar la BRK.
El 6502 tiene dos modos de direccionamiento indirecto que desreferencian a través de direcciones de 16 bits almacenadas en la página cero:
LDA ($10,X)
, agrega el registro X a la dirección de la página cero indicada antes de leer el vector de 16 bits. En este 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.LDA ($10),Y
agrega el registro Y al vector de 16 bits leído desde la dirección de página cero dada. Por ejemplo, si Y es 5 y $10/$11 contiene el vector $1000 , esto lee el valor de $1005 . Esto realiza el direccionamiento de desplazamiento de puntero.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 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 indirectos indexados e indirectos indexados, liberando los registros de índice. [14]
JMP
La instrucción del 6502 tenía un modo de direccionamiento único (entre las instrucciones del 6502) conocido como "absolutamente indirecto" 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 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 construir tablas de ramificación , una lista de puntos de entrada para subrutinas a las que se puede acceder usando 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 uno se usaría algo similar a . 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 .READ
READ
JMP ($A004)
El 65C02 agregó el nuevo modo "indexado absoluto indirecto" que facilitó el uso de tablas de ramificación. 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 READ
funció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 ramificación ya que se utiliza una única dirección base junto con un desplazamiento de 8 bits. [14] Lo mismo se podía lograr en la versión NMOS utilizando 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 redujo la demanda de este recurso, sino que también permitió que las tablas se construyeran en ROM.
Además de los nuevos modos de direccionamiento, el "modelo base" 65C02 también agregó un conjunto de nuevas instrucciones. [15]
INC
y DEC
sin parámetros ahora incrementan o decrementan el acumulador. Esto fue un descuido extraño en el conjunto de instrucciones original, que solo incluía INX
/ DEX
, INY
/ DEY
y / . Algunos ensambladores usan las formas alternativas / o / . [15]INC addr
DEC addr
INA
DEA
INC A
DEC A
STZ addr
, Almacena cero en la dirección . Reemplaza la necesidad de y no requiere cambiar el valor del acumulador. Como esta tarea es común en la mayoría de los programas, el uso de puede reducir el tamaño del código, tanto al eliminar el como cualquier código necesario para guardar el valor del acumulador, generalmente un par. [16]LDA #0;STA addr
STZ
LDA
PHA
PLA
PHX
, PLX
, PHY
, PLY
, empujan y jalan los registros X e Y hacia/desde la pila. Anteriormente, solo el acumulador y el registro de estado tenían instrucciones de empujar y jalar. X e Y solo se podían apilar moviéndolos primero al acumulador con TXA
o TYA
, cambiando así el contenido del acumulador, y luego usando PHA
. [17]BRA
, ramifica siempre. Opera como una JMP
pero usa una dirección relativa de 1 byte como otras ramificaciones, ahorrando un byte. La velocidad es a menudo la misma que la absoluta de 3 ciclos JMP
a menos que se cruce una página, lo que haría que la BRA
versión sea 1 ciclo más larga (4 ciclos). [18] Como la dirección es relativa, también es útil al escribir código reubicable, [16] una tarea común en la era anterior a las unidades de administración de memoria .Tanto WDC como Rockwell aportaron 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.
BIT
En el 65C02 se añade el modo inmediato, la página cero indexada por X y el direccionamiento absoluto indexado por X. [15] 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 AND
operación cambia el valor del acumulador, por lo que se pierde el valor original cargado desde $1234. El uso BIT
deja el valor del acumulador sin cambios, por lo que el código posterior puede realizar pruebas adicionales contra el valor original, evitando tener que volver a cargar el valor desde la memoria.
Además de las mejoras de la BIT
instrucción, WDC agregó dos instrucciones diseñadas para manipular convenientemente los campos de bits:
TSB addr
y , bits de prueba y configuración y bits de prueba y reinicio.TRB addr
.A
) se combina lógicamente con la memoria en addr , cuya ubicación puede ser la página cero o absoluta. El indicador Z en el registro de estado se condiciona de acuerdo con el resultado del AND lógico; no se ven afectados otros indicadores del registro de estado. Además, los bits en addr se activan (TSB) o se borran (TRB) de acuerdo con la máscara en .A
. TSB realiza una operación lógica OR
después de la operación lógica AND
y almacena el resultado de la operación lógica OR
en addr , mientras que TRB almacena los resultados de la operación lógica AND
en addr . En ambos casos, el indicador Z en el registro de estado indica el resultado de antes de que se cambie el contenido de addr . TRB y TSB reemplazan así una secuencia de instrucciones, combinando esencialmente 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 addr
BIT
Los cambios de Rockwell añadieron más instrucciones de manipulación de bits para configurar y probar directamente cualquier bit, y combinar la prueba, el borrado y la bifurcación en un único código de operación. Las nuevas instrucciones estaban disponibles desde el principio en la familia R65C00 de Rockwell, [19] pero no formaban parte de la especificación 65C02 original y no se encontraban en las versiones realizadas por WDC o sus otros licenciatarios. Estas se copiaron posteriormente en el diseño de referencia y estuvieron disponibles en versiones posteriores de WDC.
Las instrucciones específicas de Rockwell son:
SMBbit# zp
y . Establecer o restablecer (borrar) el número de bit bit# en el byte de página cero zp .RMBbit# zp
SMB1 $12
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 se lo reemplace por un nombre de variable o un número calculado. [16]SMB 1,$12
BBSbit# zp,addr
y . Rama en Bit Set/Reset.BBRbit# zp,addr
BBS1 $12,addr
BBS 1,$12,addr
Además de los nuevos comandos anteriores, WDC también agregó las instrucciones STP
y WAI
para admitir modos de bajo consumo.
STP
, Detener el procesador, detenía todo el procesamiento hasta que se emitía un reinicio de hardware. Esto se podía utilizar 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.
WAI
Tuvo 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 " girar ", verificar el tipo cuando se recibe una y luego saltar al código de procesamiento. Esto significaba que el procesador estaba funcionando durante todo el proceso, incluso cuando no se producían interrupciones.
En cambio, en el 65C02, el código de interrupción podía escribirse con un WAI
seguido inmediatamente por un JSR
o JMP
en el controlador. Cuando WAI
se encontraba el, el procesamiento se detenía y el procesador pasaba al modo de bajo consumo. Cuando se recibía la interrupción, procesaba inmediatamente el JSR
y manejaba 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 pasa un ciclo para 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 se completarán, por lo que cuando llega la interrupción, no es posible que interrumpa una instrucción y el procesador puede continuar de manera segura sin pasar un ciclo guardando el estado.
El 65 SC 02 es una variante del WDC 65C02 sin instrucciones de bits. [20] [21]
Los indicadores N, V y Z eran incorrectos después de la operación decimal (pero C era correcto).