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.
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 [actualizar]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.
VPB
) indica cuándo se están abordando los vectores de interrupciónMLB
) indica a otros maestros de bus cuando se está procesando una instrucción de lectura, modificación y escritura.WAI
) 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 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 ]
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]
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 BBS
instrucción. Los que quedan realmente sin utilizar equivalen al NOP
s. Los programas 6502 que utilicen 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 no tenían ROR
instrucciones (girar a la derecha) y los manuales de tecnología MOS tampoco lo documentaban. ROR
se 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 JMP
instrucción se recupera de la memoria, el vector de salto, en lugar de ser un operando de la JMP
instrucció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]JMP
JMP ($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 CLD
instrucció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,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 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.
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:
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. 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 serie 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 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 del 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 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 JMP
tení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 .READ
READ
JMP ($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 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 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.
Además de los nuevos modos de direccionamiento, el "modelo base" 65C02 también agregó un conjunto de nuevas instrucciones. [13]
INC
y DEC
sin parámetros ahora aumenta o disminuye el acumulador. Este fue un descuido extraño en el conjunto de instrucciones original, que solo incluía INX
/ DEX
, INY
/ DEY
y / . Algunos ensambladores utilizan las formas alternativas / o / . [13]INC addr
DEC addr
INA
DEA
INC A
DEC A
STZ addr
, ALMACENE Cero en la dirección . Reemplaza la necesidad y no requiere cambiar el valor del acumulador. Como esta tarea es común en la mayoría de los programas, su uso puede reducir el tamaño del código, tanto eliminando el como cualquier código necesario para guardar el valor del acumulador, normalmente un par. [14]LDA #0;STA addr
STZ
LDA
PHA
PLA
PHX
, PLX
, PHY
, PLY
, empuja y tira de los registros X e Y hacia/desde la pila. Anteriormente, sólo el acumulador y el registro de estado tenían instrucciones de empujar y tirar. X e Y solo se pueden apilar moviéndolos primero al acumulador con TXA
o TYA
, cambiando así el contenido del acumulador y luego usando PHA
. [15]BRA
, sucursal siempre. Funciona como JMP
pero usa una dirección relativa de 1 byte como otras ramas, ahorrando un byte. La velocidad suele ser la misma que la de 3 ciclos absolutos, JMP
a menos que se cruce una página, lo que alargaría la BRA
versión de 1 ciclo (4 ciclos). [16] Como la dirección es relativa, también es útil al escribir código reubicable, [14] una tarea común en la era anterior a las unidades de gestión de memoria .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.
BIT
en 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 AND
operación cambia el valor en el acumulador, por lo que se pierde el valor original cargado desde $1234. El uso BIT
deja 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 BIT
instrucción, WDC agregó dos instrucciones diseñadas para manipular convenientemente campos de bits:
TSB addr
y Bits de prueba y configuración y Bits de prueba y reinicio.TRB addr
.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 OR
después de la lógica AND
y almacena el resultado de la lógica OR
en addr , mientras que TRB almacena los resultados de la lógica AND
en 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 addr
BIT
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:
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
el 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
BBSbit# zp,addr
y . Rama en Set/Reset de bits.BBRbit# zp,addr
BBS1 $12,addr
BBS 1,$12,addr
Además de los nuevos comandos anteriores, WDC también agregó instrucciones STP
y WAI
para 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.
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 " 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 WAI
siga inmediatamente a JSR
o JMP
al controlador. Cuando WAI
se encontró, el procesamiento se detuvo y el procesador entró en modo de bajo consumo. Cuando se recibió la interrupción, inmediatamente procesó JSR
y 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.
El 65 SC 02 es una variante del WDC 65C02 sin instrucciones de bits. [18] [19]
Los indicadores N, V y Z eran incorrectos después de la operación decimal (pero C estaba bien).