LÓGICA DIGITAL Y MICROPROGRAMABLE
CAPITULO 11. MICROPROCESADORES
Concepto de procesador
Desde la aparición de las primeras máquinas para calcular, como el ábaco
chino, el Hombre ha tendido a perfeccionarlas cada vez más para descargarse de los
cálculos repetitivos y complicados. Se pasó de ábaco a las primeras y rudimentarias
máquinas mecánicas que fueron perfeccionándose hasta la aparición de la electrónica.
Fueron entonces desplazadas por voluminosas y costosísimas calculadoras a válvulas
hacia el año 1944.
Posteriormente con los transistores se obtuvo una gran reducción en el tamaño
y consumo de las calculadoras electrónicas (1958), pero no fue hasta que aparecieron
los circuitos integrados (1960) el momento en el que las grandes máquinas de calcular
se redujeron desde el tamaño de una habitación hasta el volumen ocupado por una caja
de zapatos.
Emparejada con la evolución tecnológica apareció una nueva ciencia para el
tratamiento de la información denominada Informática.
Entrando ya en el tema del procesador u ordenador en sí, podríamos definirlo
en líneas generales, como el dispositivo mediante el cual una serie de datos o
informaciones que llegan a sus entradas son elaborados siguiendo una serie de
instrucciones, variables en cada caso conforme al objetivo perseguido, y cuyos
resultados son enviados a unas salidas donde quedan disponibles para su uso
posterior.
Estructura básica de los procesadores
La estructura básica de cualquier sistema procesador es, independientemente de
su capacidad de trabajo, la mostrada en la figura 11.1.
Figura 11.1
CÁNDIDO HERNÁNDEZ AGERO 1
LÓGICA DIGITAL Y MICROPROGRAMABLE
Describimos a continuación cada una de los bloques sucintamente :
• MEMORIA INTERNA :
Es el centro de almacenamiento de datos y programas. No debemos
confundirla con las unidades de memoria de masa, las cuales son un sistema periférico
y se encuentran fuera.
• UNIDAD CENTRAL DE PROCESO (CPU) :
Centro de interpretación, ejecución y gobierno que, controlado por el
Reloj, interpreta y ejecuta las ordenes del programa. Está constituida a su vez por la
Unidad Central (UC) y la Unidad Aritmético Logica (ALU), es el cerebro del sistema.
• UNIDADES DE ENTRADA/SALIDA (INTERFACE):
Circuito que controla la comunicación entre interior y el exterior del
sistema. Sirve también para adaptar los códigos binarios con que trabaja la CPU a los
de los periféricos.
• PERIFÉRICOS :
Constituyen un amplio grupo de elementos que, controlados por el
sistema, realizan un trabajo en el exterior.
Los microprocesadores son, en realidad, un tipo de CPU estandarizado y muy
versátil, que al encontrarse integrado en un solo circuito es capaz de formar en torno
suyo equipos de diversa potencia para aplicaciones tanto informáticas como de
automatización y control industrial.
Los sistemas de ordenadores se clasifican según su capacidad de trabajo y
tratamiento de datos en los siguientes grupos :
• MAINFRAMES :
Corresponde esta denominación a los grandes ordenadores,
normalmente destinados al tratamiento de datos, tanto informáticos como industriales.
• MINIORDENADORES :
Se trata de ordenadores de pequeño tamaño, pero con una elevada
capacidad de trabajo. Una red de este tipo de ordenadores puede sustituir a un
mainframe.
• MICROORDENADORES :
Son ordenadores que emplean como CPU un microprocesador y en la
actualidad son amplísimamente utilizados en todos los campos dado su reducido
precio y tamaño.
CÁNDIDO HERNÁNDEZ AGERO 2
LÓGICA DIGITAL Y MICROPROGRAMABLE
Hay que advertir que la rápida evolución de los ordenadores hace que esta
división haya de ser revisada continuamente, pues en un corto periodo de tiempo un
ordenador personal puede superar en prestaciones lo que antes hacía un mainframe.
Definición de términos básicos
Cuando se habla de microprocesadores se utiliza una terminología que es
preciso conocer antes de afrontar un estudio detallado de su funcionamiento.
• HARDWARE :
Se denomina hardware de un sistema microprocesado, a todos los
circuitos y componentes físicos que constituyen el sistema.
• SOFTWARE :
El software de un sistema microprocesado es el conjunto de
instrucciones con que se programa dicho sistema.
• FIRMWARE :
Es el conjunto de instrucciones y programas de un sistema
microprocesado, que son inalterables por el usuario y se encuentran implícitos en la
estructura electrónica de sus circuitos. Es por lo tanto un término que define elementos
intermedios entre el hardware y el software.
El software que reciben los sistemas microprocesados, está formado por los
siguientes elementos :
• INSTRUCCIONES :
Son las ordenes que debe realizar el sistema. En toda instrucción se
distinguen dos partes :
• CÓDIGO DE OPERACIÓN. Es la tarea a realizar por el sistema.
• OPERANDO. Es el dato sobre el que se ejecuta la instrucción.
• PROGRAMA :
Es el conjunto ordenado de instrucciones y datos, que ha de recibir el
sistema para realizar una determinada función.
Los programas han de introducirse en el sistema previamente
codificados en código binario, ya que tanto el microprocesador como el resto de los
circuitos electrónicos, solo son capaces de procesar los valores 1 y 0. La terminología
empleada en los procesos de codificación y decodificación de las informaciones, es la
siguiente :
• BITS. Es la unidad básica de información formada por 1 y 0.
CÁNDIDO HERNÁNDEZ AGERO 3
LÓGICA DIGITAL Y MICROPROGRAMABLE
• PALABRA. Es el conjunto de bits con que se codifica una
información para su introducción en el sistema. Este término sirve para
clasificar los microprocesadores en función de su longitud de palabra ;
se dice así que un microprocesador de 8 bits tiene codificados sus
programas en palabras de 8 bits.
• REPERTORIO DE INSTRUCCIONES. Es el conjunto de palabras que es
capaz de entender o procesar el microprocesador. Su número máximo
dependerá de la longitud de palabra con que trabaje el sistema y vendrá dado
por :
Nºmax Instr = 2 longitud palabra
Por ejemplo, un microprocesador de 8 bits puede tener un máximo de 256
instrucciones.
Estructura Hardware
Los sistemas de microordenadores que basan su estructura en un
microprocesador, se estructuran por una serie de bloques interconectados por mazos de
cables llamados Buses.
En la figura 11.2 podemos ver la estructura de un sistema microordenador.
Figura 11.2
CÁNDIDO HERNÁNDEZ AGERO 4
LÓGICA DIGITAL Y MICROPROGRAMABLE
Podemos apreciar que está formada por :
• Un microprocesador
• Un reloj que controla el microprocesador
• Un conjunto de memorias (RAM y ROM)
• Un bloque para la lógica de selección
• Una unidad de entrada/salida
• Tres buses
• Los elementos periféricos y de control externo que se comunican con el
sistema mediante la unidad de E/S.
Veamos con mas detalle cada uno de estos bloques.
Buses
Un bus podríamos definirlo como un conjunto de hilos eléctricos
caracterizados por una función común.
Los sistemas a uP están dotados de tres buses que son :
• Bus de Direcciones
Cuya función es seleccionar o direccionar las distintas partes del
sistema. a través de él la CPU es capaz de indicar, colocando su dirección sobre este
bus, con que dispositivo desea establecer contacto. El bus de direcciones siempre sale
de la CPU, es decir, es un bus de salida.
Hay que notar que cuantos más hilos tenga el bus de direcciones, podremos
apuntar a un mayor número de posiciones distintas de memoria. Diremos que el
sistema, en cierta manera, es más potente.
• Bus de Datos
Su misión es transporta de una parte a otra del sistema los datos. Dado
que los datos podrán viajar tanto hacia la CPU como desde ella, podemos decir se trata
de un bus bidireccional o de entrada/salida. La dirección de los datos vendrá
determinada por el estado de alguno de los hilos del bus de control.
También el bus de datos tiene su influencia en la potencia del uP, pues a mayor
tamaño de este bus, mayor cantidad de información se puede mandar o recibir a la vez.
Al número de bits de datos que tiene un uP, se le llama tamaño de palabra de
dicho uP.
• Bus de Control
La misión de este bus, como indica su nombre, es controlar y coordinar
las acciones de los elementos del sistema. Este bus está compuesto por unos hilos que
entran en la CPU y otros (distintos) que salen.
Por supuesto, toda la información que viaja a través de los buses está
codificada en binario.
CÁNDIDO HERNÁNDEZ AGERO 5
LÓGICA DIGITAL Y MICROPROGRAMABLE
Unidad Central de Proceso (CPU)
Está formada por el uP. Su estructura es la de un circuito integrado VLSI que
posee en su interior entre otros elementos, los siguientes :
• Una unidad de decodificación e interpretación
• Una unidad aritmético-logica
• Un contador de programa
• Varios registros de almacenamiento de la información
La CPU controla, a instancias de las instrucciones que decodifica e interpreta,
las memorias, la unidad de E/S y a través de esta última, a los periféricos y sistemas
exteriores.
Reloj
La CPU es ayudada en su función por el reloj, que proporciona señales
cuadradas de frecuencia constante, con las que genera todos los impulsos de gobierno
del sistema.
La frecuencia del reloj determina la velocidad de operación del uP y por lo
tanto del sistema.
Lógica de Selección
Es un conjunto de decodificadores y multiplexores que tienen la finalidad de
canalizar a cada bloque del sistema, las direcciones de memoria que le corresponden, y
que harán que ese dispositivo y no otro esté activo en ese instante. Se trata en
consecuencia de un circuito que partiendo de la dirección solicitada por la CPU active
el dispositivo que le corresponde.
Básicamente se trata de generar lo que se denomina un mapa de memoria, en
el que se sitúe, sobre la extensión total de memoria direccionable por el uP, la posición
sobre la que cada dispositivo del sistema actuará.
Memoria RAM
Su función en los sistemas de microordenadores es contener los programas y
datos que el usuario puede variar a voluntad.
Cuando la CPU necesita leer o escribir una información en la memoria RAM,
lo primero que hace es presentar en el bus de direccciones el código binario de la
dirección de memoria sobre la que va a operar. Este código es decodificado en el
decodificador de direcciones de la RAM es interpretado, activando la posición de
memoria solicitada.
Dependiendo de la operación a efectuar (lectura o escritura), la CPU enviará
por el bus de control la señal de R/W cuyo valor corresponda a la operación deseada.
CÁNDIDO HERNÁNDEZ AGERO 6
LÓGICA DIGITAL Y MICROPROGRAMABLE
Al mismo tiempo, la lógica de selección enviará a la memoria RAM una señal
de habilitación (CS) generada a partir de la dirección solicitada por el uP en el bus de
direcciones.
En función de la operación efectuada, el bus de datos de la memoria enviará o
recibirá la información binaria solicitada.
Memoria ROM
La función de este tipo de memoria es contener los datos y programas básicos
(programa monitor) que precisa el ordenador para su arranque.
Al ser una memoria de solo lectura, si se desea modificar el programa en ella
contenido, habrá que cambiar la memoria o regrabarla de nuevo.
Unidad de Entrada/Salida
Todo microordenador o sistema de desarrollo para uP, necesita comunicarse
con el exterior, bien sea para recibir información o para transmitirla.
Las unidades o Interfaces de Entrada/Salida, marcan la frontera entre los
circuitos internos y los externos al uP.
La necesidad de emplear circuitos específicos para realizar las funciones de
entrada/salida, vienen impuestas básicamente, por la naturaleza de las señales que
intercambian los diferentes bloques del sistema. Dichas señales están sometidas a unas
temporizaciones muy rígidas, que dificilmente podría entender y seguir un periférico
externo.
Su grado de complejidad varia y pueden estar compuestas por unos pocos
componentes o formadas por varias placas de circuitos.
En general, podemos clasificarlas en dos grandes bloques :
• Interface Paralelo
• Interface Serie
En ambos casos la conexión a la CPU se realiza en paralelo a través del bus de
datos.
Interfaces paralelo
Son aquellas en las que sus entradas y/o salidas se realizan a través de varios
hilos conductores agrupados, es decir, se transmiten y/o recibeninformaciones de
varios bits (4, 8, 16, etc) en un mismo momento. A cada grupo de salida y/o entrada se
le da el nombre de puerto (ports) o puerta.
CÁNDIDO HERNÁNDEZ AGERO 7
LÓGICA DIGITAL Y MICROPROGRAMABLE
Figura 11.3
Este tipo de interface recibe numerosos nombres, siendo los más ussados el
PIO (Parallel Input Output) y el de PIA (Parallel Interface Adaptador).
Interface serie
Si la unidad periférica o el proceso para su control requiere muchos hilos y
además esta situada lejos de la CPU, su conexión sería , además de costosa por el
número de hilos, complicada, pues las señales con la distancia se van atenuando y
además al ser los hilos paralelos se pueden producir interferencias (diafonías) entre
ellos.
Es por esto que se prefiere utilizar la conexión serie en la que la señal de datos
va por un solo cable.
En la interface serie un dato de salida, por ejemplo, le llega de la CPU en
paralelo a través del bus de datos, es memorizado y luego, mediante un reloj de alta
precisión se van sacando los bits de datos uno a uno y se envían por el cable hacia el
dispositivo conectado a la interface.
Con esta forma de transmisión se pueden alcanzar distancias de unos 11 mts.
Dentro de la transmisión serie podemos distinguir dos tipos :
• Síncrona
• Asíncrona
Síncrona
En esta forma de transmisión serie de datos el transmisor envía una serie de
bits, con una determinada configuración, antes de enviar los verdaderos datos, con el
fin de que el reloj del receptor se sincronice con el suyo.
Los caracteres se envían uno tras otro sin ninguna separación entre ellos, no
obstante delante de cada bloque de datos se colocan unos caracteres de sincronismo
que sirven al receptor para sincronizar el carácter.
CÁNDIDO HERNÁNDEZ AGERO 8
LÓGICA DIGITAL Y MICROPROGRAMABLE
Cada mensaje normalmente se envía precedido por dos caracteres de
sincronismo.
El numero de bits necesario para enviar un mensaje de N palabras sería de :
(N + 2) x 8
Asíncrona
En esta otra forma, en reposo, es decir, sin recibir ni transmitir nada, está
siempre a nivel alto. Cuando comienza la transmisión lo primero que se envía (de
manera automática) es un bit de inicio (start) que sirve para decirle al receptor que
después de este bit van a llegar bits de datos. A partir del bit de inicio el reloj patrón
del receptor hace que se comience a muestrear la línea cada determinado numero de
pulsos, si esta no presenta tensión (nivel bajo) se considera un 0 y si presenta tensión
se considera un 1. Cuando se envía el último bit de dato (puede ser 7 u 8) es opcional
el enviar un bit de paridad (ya sea par o impar) y por último se añade el bit o bits de
paro (stop) para indicar que el dato ya ha sido enviado.
Figura 11.4
Este tipo de interfaces recibe los nombres de UART (Unidad Asíncrona
Receptora-Transmisora), de USART (Unidad Síncrona o Asíncrona Receptora-
Transmisora) o de SIO (Serial Input/Output).
El número de bits necesario para enviar un mensaje de N palabras
(considerando 8 bits de datos y uno de paro) sería :
10 x N
Comparando este valor con el obtenido para el modo síncrono, vemos que para
mensajes superiores a 8 bits el sistema síncrono es más eficiente.
CÁNDIDO HERNÁNDEZ AGERO 9
LÓGICA DIGITAL Y MICROPROGRAMABLE
Periféricos
Estos dispositivos realizan dos tipos de funciones :
• Comunicación entre el sistema y el usuario
• Almacenamiento masivo de información
Los periféricos más comunes se describen a continuación.
Teclados
Están formados por un conjunto de teclas, que pueden ser o no, similar al de
una máquina de escribir y que están adaptados al lenguaje de programación utilizado
por el sistema. Existen teclados hexadecimales que sirven para programar en código
máquina, teclados alfanuméricos que sirven para programar en un lenguaje de alto
nivel y teclados especiales que además de llevar la parte alfanumérica incorporan
nuevas teclas para funciones específicas.
Pantallas de TRC
Es el periférico de comunicación para salida más usual junto con la impresora.
Consta de un monitor de televisión en el cual van apareciendo escritas, tanto las
informaciones que se introducen en el sistema como las que este indica al usuario.
Actualmente existen también los monitores LCD.
Displays
Poseen una función similar a las de los monitores pero en lugar de utilizar una
pantalla usan cierto número de indicadores matriciales o de 7 segmentos.
Este tipo de periférico se utiliza mucho en los sistemas de desarrollo de uP.
Impresoras
Es el periférico básico de salida, está especializado en sacar informes o listados
sobre papel. Existen varios tipos destacando las de matriz de puntos, inyección y las
laser.
Plotters
Es un periférico de salida utilizado para obtener copias impresas sobre papel de
dibujos y esquemas. Pueden ser de plumillas, inyección o laser (Fotoploter).
CÁNDIDO HERNÁNDEZ AGERO 10
LÓGICA DIGITAL Y MICROPROGRAMABLE
Interface para comunicaciones
Son dispositivos periféricos que no deben confundirse con las unidades de
entrada /salida y que sirven para comunicar sistemas de ordenadores que se encuentran
separados. Los tipos más corrientes son el interface serie RS-2323 y el interface
paralelo Centronics.
Modem (MOdulador-DEModulador)
Este periférico permite comunicar bidireccionalmente dos sistemas separados a
gran distancia mediante el empleo de la línea telefónica.
Unidades de cinta magnética
Es un periférico de almacenamiento masivo de información. Existen dos tipos
fundamentales, las cintas abiertas y las cintas de tipo cassette. Son los dispositivos de
almacenamiento que permiten guardar mayor cantidad de información, pero también
son los más lentos.
Unidades de disco
Es otro periférico de almacenamiento masivo que puede ser de dos tipos
básicos, de soporte magnético o de soporte óptico. Emplean un soporte plano y
circular, que puede ser de tamaño diverso : 5 ¼” , 3 ½” , 12”.
Sistemas de control externo
Constituyen un conjunto de circuitos que sirven para realizar la comunicación
entre el microordenador y los procesos industriales o máquinas que él controla. En su
estructura intervienen elementos y circuitos tales como :
• Transductores y sensores
• Convertidores A/D, D/A, V/I, etc
• Relés, Tiristores, Contactores, etc.
• Circuitos de amplificación
CÁNDIDO HERNÁNDEZ AGERO 11
LÓGICA DIGITAL Y MICROPROGRAMABLE
Lenguajes de programación
Para codificar la información que se introduce a un sistema microprocesado, es
necesario un lenguaje que sea comprensible tanto por el sistema como al usuario que
realiza la programación. El microprocesador solo entiende un lenguaje binario y éste
resulta muy complejo para el programador.
La evolución de los lenguajes de programación partió del lenguaje más
próximo al sistema (binario) y luego emplear programas de codificación automática a
binario, a emplear lenguajes más próximos al programador.
Los lenguajes de programación se clasifican, en función de su proximidad al
lenguaje del sistema, como se explica a continuación.
Lenguaje máquina o de bajo nivel
Es el único lenguaje que entiende el sistema microprocesado y es directamente
interpretado y ejecutado por el microprocesador para el cual ha sido escrito.
Está formado por palabras binarias cuya longitud depende del tipo de
microprocesador empleado. Así un uP de 8 bits empleará palabras de lenguaje
máquina formadas por 8 dígitos binarios.
Con este lenguaje se codifican : instrucciones, cifras, letras, símbolos, etc.
El problema del lenguaje máquina es, que además de no ser fácilmente
interpretable por el usuario, cada microprocesador posee sus propios códigos máquina.
Esto provoca que los programas en lenguaje máquina no sean intercambiables entre
distintos microprocesadores.
En la práctica el programador realiza los programas en otro tipo de lenguaje de
más alto nivel y luego un programa se encarga de compilarlos o ensamblarlos a
lenguaje máquina.
En los sistemas de uP se emplea la codificación hexadecimal para facilitar la
interpretación de los códigos máquina. En dicho sistema de numeración cada dígito se
corresponde exactamente con otros cuatro dígitos binarios. Por esta razón al ser su
codificación a binario muy sencilla el programador emplea habitualmente como
lenguaje máquina los códigos del uP en hexadecimal.
Para codificar un número binario a hexadecimal lo que se hace es dividir en
grupos de 4 dígitos el número hexadecimal empezando por la izquierda de la coma
fraccionaria, y posteriormente se traduce cada uno de estos grupos en su equivalente
hexadecimal. Veamos como se haría para codificar el número binario
11100011101,001111 en hexadecimal :
0111 0001 1101 , 0011 1100 = 71D,3C
En el caso inverso, se traducirá cada dígito en hexadecimal a su equivalente
binario. Por ejemplo, AB1,F3B se traduciría a binario como :
1010 1011 0001 , 1111 0011 1011
CÁNDIDO HERNÁNDEZ AGERO 12
LÓGICA DIGITAL Y MICROPROGRAMABLE
Lenguaje simbólico o Ensamblador
El lenguaje máquina no es útil para el programador dada su elevada
complejidad, es por lo tanto preciso el empleo de un lenguaje más cercano al usuario.
El lenguaje simbólico o ensamblador emplea grupos de caracteres
alfanuméricos que simbolizan a las diferentes instrucciones. Estos grupos de
caracteres se denomina Nemónicos, ya que se corresponden con las iniciales del
nombre de la instrucción en inglés y sirven como regla nemotécnica que facilita su
memorización.
Cada uP posee su propio set de instrucciones con sus correspondientes
nemónicos, y aunque dichos nemónicos se parezcan entre diversos uP, sus códigos
máquina son muy diferentes.
El lenguaje ensamblador se utiliza mucho en los sistemas microprocesados
destinados a la automatización y a la robótica. En el mundo de la informática este
lenguaje se utiliza a nivel de programador profesional y no de los usuarios.
Los programadores profesionales de uP emplean programas que realizan la
estructuración de los programas realizados en ensamblador y los codifican
automáticamente en código máquina. Estos programas reciben el nombre de
Programas Editores-Ensambladores.
Lenguajes de alto nivel
Es el tipo de lenguaje más evolucionado y por lo tanto, más cercano al del
usuario. Está constituido por conjuntos de caracteres alfanuméricos y signos
matemáticos y gramaticales.
El nombre de sus instrucciones y sentencias se corresponden con el nombre en
inglés de la tarea que realizan. El juego de instrucciones no depende del uP que se
utilice, sino del paquete de software con que se trabaja. Es, por tanto, un tipo de
lenguaje más universal.
Los lenguajes de alto nivel más importantes son :
Fortran (Formula Translation)
Desarrollado en el año 1956 es uno de los primeros en utilizarse. Fue diseñado
para la realización de cálculos técnicos y científicos.
Cobol (Common Business Oriented Language)
Es un tipo de lenguaje especializado en tareas de gestión.
Basic (Beginners All-Purpose Symbolic Instruction)
Es el lenguaje de aplicaciones más popular, existiendo varias versiones, el GW
Basic, MSX Basic, etc.
CÁNDIDO HERNÁNDEZ AGERO 13
LÓGICA DIGITAL Y MICROPROGRAMABLE
Pascal
Es un tipo de lenguaje estructurado que se emplea para generar programas cuya
estructura sea fácilmente comprensible.
Ada (1975)
Está inspirado en el Pascal y puede convertirse en un estandar universal.
Logo (1976)
Orientado a la enseñanza asistida por ordenador.
C
Uno de los lengujes más módernos orientado principalmente a la
automatización y la robótica.
Lisp
Orientado a las aplicaciones de inteligencia artificial.
Forth
Lenguaje moderno que permite crear al usuario sus propias instrucciones y
comandos.
Como ya sabemos, con los lenguajes de programación se realizan los
programas que utilizarán los uP. Los programadores utilizan la siguiente terminología
al hablar de los programas :
• Programa Fuente. Es el programa realizado en ensamblador o alto nivel.
• Programa Objeto. Es el programa fuente codificado ya en lenguaje
máquina.
Estados o ciclos de la CPU
La CPU es capaz de ejecutar un número finito de acciones que le vienen
indicadas mediante una información binaria que hemos denominado instrucción. La
instrucción por tanto indica a la CPU cual es la siguiente operación a realizar. Por otro
lado, como ya sabemos, el elemento de la CPU que conoce la secuencia de
microoperaciones a realizar para cada instrucción es la Unidad Central. Por tanto el
código binario que constituye la instrucción deberá presentarse y permanecer
memorizada cierto tiempo en la entrada de la Unidad Central.
CÁNDIDO HERNÁNDEZ AGERO 14
LÓGICA DIGITAL Y MICROPROGRAMABLE
De todo lo dicho se deduce que la Unidad Central está continuamente
fluctuando entre dos estados:
• Estado de búsqueda (Fetch) de la instrucción
• Estado de ejecución de la instrucción
Las instrucciones, que escritas en la secuencia adecuada pueden formar un
programa, deben estar almacenadas en la memoria. Durante el estado de fetch de la
instrucción la Unidad Central genera las microórdenes adecuadas para leer una de estas
instrucciones y dejarla a la entrada de la Unidad Central memorizada en el llamado
Registro de Datos.
Una vez la instrucción se encuentra en el registro de datos, se decodifica para
conocer cual es la secuencia de microórdenes que tiene asociada y se empieza la
ejecución sincronizada de estas microórdenes. Según el número de microórdenes y
según los elementos que utilice, la operación implicará la necesidad de más o menos
ciclos de reloj para sincronizar todas las microoperaciones. Cuando este estado de
ejecución termina se inicia un nuevo estado de fetch de la siguiente instrucción.
Una instrucción debería contener, de forma explícita o implícita, la siguiente
información:
• Qué proceso ha de realizar el sistema, cuál de las posibles secuencias de
microórdenes tiene que ejecutar. Esta información constituye el código de
operación de la instrucción.
• Cuál es el operando o los operandos.
• Cuál es la dirección del resultado.
• Cuál es la dirección de la siguiente instrucción.
El código de operación es totalmente necesario en todas las instrucciones. En
los microprocesadores de 8 bits más utilizados, el código de operación es el primer
byte de la instrucción. Este byte es el que ocupa el Registro de Datos.
En general las instrucciones se realizan en secuencia lineal y están a1
almacenadas en posiciones contiguas de memoria. Por ello se puede prescindir, en
algunos casos, de la información que indica la dirección de memoria donde se
encuentra la instrucción siguiente.
Para reducir más el número de bits del campo de información de la instrucción
el resultado de una operación se puede almacenar en la misma dirección de uno de los
operandos, de manera que se haga innecesario especificar en la instrucción la dirección
del resultado.
De lo dicho anteriormente se deduce que la información, mínima, que debe
proporcionar una instrucción se reduce a:
• Un código de operación (OPCODE), que indique la operación a efectuar.
CÁNDIDO HERNÁNDEZ AGERO 15
LÓGICA DIGITAL Y MICROPROGRAMABLE
• Un operando que indica sobre qué dato o datos se ha de efectuar la
operación.
Durante la ejecución de un programa, la CPU está permanentemente llevando a
cabo ciclos de búsqueda (fetch) y ejecución de instrucciones, excepto si por alguna
razón se ha detenido la operación mediante alguna de las líneas de control que se citan
más adelante.
MICROPROCESADOR ELEMENTAL
El estudio de un microprocesador puede resultar difícil debido a su
complejidad, ya que puede tener una docena de registros que varían en tamaño desde 1
a 32 bits.
Partiremos del estudio de un microprocesador elemental, aunque aproximado a
la realidad, para facilitar su comprensión. La figura 11.5 representa dicho uP.
Figura 11.5
En nuestro uP básico observamos que casi todos los registros son de 8 bits.
Veamos la aplicación de cada uno de estos registros.
CÁNDIDO HERNÁNDEZ AGERO 16
LÓGICA DIGITAL Y MICROPROGRAMABLE
Acumulador
Es el registro principal del uP. Durante las operaciones aritméticas y lógicas
desempeña una misión de gran importancia, pues antes de realizar la operación guarda
uno de los operandos que intervienen en ella, y posteriormente, el resultado de la
operación.
Unidad Aritmético-Lógica
Como su nombre indica es la encargada de realizar todas las operaciones
aritméticas y lógicas.
La ALU tiene dos entradas, una generalmente recibe los datos del acumulador y
la otra los que hay en el registro de datos.
Dependiendo de la orden que reciba a través de las líneas de control, la ALU
sumará, restará u operará lógicamente las dos entradas.
Registro de datos
Es el almacén temporal de los datos que llegan o abandonan al uP. Es decir,
cuando una instrucción llega al uP, el número binario que la representa permanece en
este registro durante el tiempo de decodificación.
De la misma forma, un dato que vaya a ser sumado al contenido del
acumulador está presente en el registro de datos durante toda la operación de suma.
Registro de direcciones
Este registro es también un almacén temporal que guarda la dirección de la
celda de memoria o interface de E/S que está interviniendo en la operación que realiza
en cada instante.
Contador de programa
Controla la secuencia en que se ejecutan las instrucciones. Normalmente cuenta
en secuencia : 0, 1, 2, .....etc.
En cualquier momento el contenido de este contador indica la dirección de
memoria de donde debe sacar el siguiente byte de información.
En los casos de ejecución de un programa sin saltos ni bifurcaciones, es
suficiente incrementar su contenido en una unidad después de realizar cada instrucción
para obtener la dirección de la siguiente instrucción a ejecutar
CÁNDIDO HERNÁNDEZ AGERO 17
LÓGICA DIGITAL Y MICROPROGRAMABLE
Decodificador de Instrucciones
La misión que tiene este registro es, como su nombre indica, decodificar las
instrucciones que le llegan a través del registro de datos.
El decodificador determina que operación hay que realizar examinando el
código que corresponde a la instrucción.
Secuenciador
Recibiendo la señal/s generadas por el decodificador de instrucciones, produce
todas las señales de control necesarias para realizar la instrucción.
También determina la secuencia en que deben ir realizándose las diferentes
operaciones que forman parte de la ejecución de una instrucción.
Ejecución de un programa elemental
Para poder ejecutar un programa se deben cumplir una serie de requisitos :
• El programa debe estar en memoria, más adelante veremos como se hace
esto. En nuestro ejemplo el programa a ejecutar ya se encuentra en la
memoria.
• El contador de programa deberá colocarse en el valor de la dirección de
partida del programa, en el ejemplo, la dirección 00000000.
El programa que se pretende ejecutar es el siguiente :
MEMORIA
DIRECCION [Link] NEMONICO
0000 0000 1010 1001 LDA
0000 0001 0000 0111 7
0000 0010 0110 1001 ADC
0000 0011 0000 1010 10
0000 0100 1110 1010 NOP
Este programa quiere sumar los números decimales 7 y 10 dejando su resultado
en el Acumulador.
El primer paso que se debe hacer es buscar la primera instrucción. Esto ocurre
durante la fase de búsqueda, que está controlada por los pulsos generados por el
secuenciador.
CÁNDIDO HERNÁNDEZ AGERO 18
LÓGICA DIGITAL Y MICROPROGRAMABLE
Figura 11.6
A continuación se transfiere el contenido del CP al registro de direcciones.
Figura 11.7
Una vez que la dirección 0 esta en el registro de direcciones, se incrementa en
una unidad al CP sin que esto afecte al registro de direcciones.
CÁNDIDO HERNÁNDEZ AGERO 19
LÓGICA DIGITAL Y MICROPROGRAMABLE
Figura 11.8
A continuación el registro de direcciones se transfiere al bus de direcciones. La
memoria decodifica esta dirección y selecta la celda apuntada.
Figura 11.9
El contenido de la celda se transfiere, mediante el bus de datos, al registro de
datos. Después el decodificador de instrucciones se da por enterado de que se trata de
una instrucción LDA (carga lo que viene a continuación en el acumulador). El
CÁNDIDO HERNÁNDEZ AGERO 20
LÓGICA DIGITAL Y MICROPROGRAMABLE
secuenciador envía las señales adecuadas para que se ejecute esa instrucción. Con esto
termina la fase de búsqueda.
Figura 11.10
Ahora el uP ya sabe que debe sacar de la posición contigua de memoria el dato
y situarlo en el acumulador. Empieza transfiriendo el contenido del registro de
direcciones al bus de direcciones y apuntando a la siguiente dirección de memoria.
Figura 11.11
CÁNDIDO HERNÁNDEZ AGERO 21
LÓGICA DIGITAL Y MICROPROGRAMABLE
Una vez decodificada la dirección de memoria, se realizan una serie de pasos
(figura 11.2) :
1. La memoria pone el dato en el bus de datos (07).
2. El registro de datos almacena la información que hay en el bus.
3. Se transfiere el contenido del registro de datos al acumulador.
Con esto termina la fase de ejecución de la instrucción LDA e inmediatamente
se inicia la fase de búsqueda de la segunda instrucción.
Figura 11.12
El procedimiento que sigue es idéntico al descrito para la instrucción LDA. La
figura 11.13 condensa todos los pasos seguidos para sacar de memoria la instrucción
ADC :
1. Se transfiere el contenido del CP al registro de direcciones.
2. Se incrementa el CP pasando a ser 00000011.
3. Se transfiere el contenido de la memoria selectada al registro de datos.
4. Se transfiere el contenido del registro de datos al decodificador, el cual genera las
señales adecuadas y las envía al secuenciador.
CÁNDIDO HERNÁNDEZ AGERO 22
LÓGICA DIGITAL Y MICROPROGRAMABLE
Con esto termina la fase de búsqueda de la instrucción ADC y se inicia la de
ejecución.
Figura 11.13
Para ejecutar la instrucción ADC se precisan de 6 pasos, los cuales están
condensados en la figura 11.14 :
1. Se transfiere el contenido del CP al registro de direcciones.
2. Se incrementa el CP pasando a ser 00000100.
3. Se sitúa en el bus de datos la dirección del operando.
4. Se transfiere el operando (10) a una de las entradas de la ALU.
5. Simultáneamente se transfiere el otro operando (07) desde el acumulador a la ALU.
6. La ALU suma los dos números y le añade el flag de Carry (considerado 0), y el
resultado (17) se almacena en el propio acumulador, con lo que su contenido
anterior se destruye.
El objetivo del programa ya está cumplido, no obstante el uP seguirá buscando
y ejecutando instrucciones continuamente.
CÁNDIDO HERNÁNDEZ AGERO 23
LÓGICA DIGITAL Y MICROPROGRAMABLE
Figura 11.14
La instrucción NOP fuerza al uP a no realizar ninguna operación en el siguiente
ciclo de reloj. Después de esta instrucción vendrán más que no aparecen reflejadas en
el programa planteado.
Figura 11.15
CÁNDIDO HERNÁNDEZ AGERO 24
LÓGICA DIGITAL Y MICROPROGRAMABLE
Rupturas de secuencia. Subrutinas e Interrupciones
El uP ha de poder tomar decisiones, es decir, modificar la secuencia de
operaciones en función del resultado obtenido al realizar una instrucción. Para ello
debe existir, dentro del conjunto de instrucciones, alguna que indique la dirección de la
siguiente instrucción a realizar. A estas instrucciónes se las denomina de salto o de
ruptura de secuencia y pueden ser de tipo condicional o incondicional. Si es
condicional la instrucción realiza una operación y según el resultado obtenido rompe o
no la secuencia. La ruptura de la secuencia se produce cambiando el contenido del CP
por la dirección o añadiendo la longitud del salto indicado en la instrucción.
Subrutinas
En un programa puede ocurrir que una serie de instrucciones deban ser
ejecutadas varias veces a lo largo del mismo. Estos conjuntos de instrucciones pueden
agruparse en bloques independientes del programa principal denominados subrutinas.
Por lo general, existirá una instrucción (o varias) que alteren el contenido del
CP de forma que la ejecución continúe en el inicio de una subrutina. Una vez se ha
llegado al final de la secuencia de instrucciones que forman la subrutina el CP recupera
el valor que tenía y puede continuar la ejecución del programa principal a partir de la
instrucción siguiente a la del salto a subrutina. Este retorno al programa principal
también se indica mediante una instrucción específica.
A modo de ejemplo, supongamos un programa que contiene dos subrutinas.
Cuando se llega a la dirección 8 se hace un salto a una subrutina 1 situada en la
dirección 32, y dentro de esta subrutina se hace otra llamada a una subrutina 2 situada
en la dirección 50 (ver figura 11.16).
Figura 11.16
CÁNDIDO HERNÁNDEZ AGERO 25
LÓGICA DIGITAL Y MICROPROGRAMABLE
Cuando se llega a la instrucción que ocupa la dirección de memoria 8 se hace
una llamada a la subrutina 1, el CP se sitúa automáticamente en la instrucción 32,
guarda en un lugar denominado Stack o Pila, la dirección siguiente a la que a
producido la llamada (9) y ejecuta la subrutina 1. Mientras está ejecutando la subrutina
1, encuentra una llamada a otra subrutina 2, momento en el que mete en el Stack la
dirección 37 que es la de retorno de esta segunda subrutina. En la dirección 54 se
encuentra una instrucción de retorno de subrutina, por lo que recupera del Stack la
dirección 37, que fue la última en entrar. Sigue con la ejecución de la subrutina 1 allí
donde la dejo hasta que en la dirección 39 se encuentra un nuevo retorno de subrutina,
por lo que recupera del Stack la dirección 9, saltando a ella y continuando con la
secuencia principal del programa.
En este ejemplo hemos visto que desde una subrutina se pueden producir saltos
a otras subrutinas, formando lo que se llama un anidamiento de subrutinas. Esto
requiere, como ha sido visto, la memorización del valor del CP en el momento de cada
salto.
Podemos encontrar dos tipos de stack, el primero sería aquel que está
contenido dentro del propio uP, es decir, compuesto por una serie de registros
destinados a ese fin. La capacidad de este tipo de stack dependerá pues del número de
registros que existan. El segundo tipo, y mucho más utilizado, consiste en un solo
registro denominado Puntero de Pila (Stack Pointer) que índica la dirección de
memoria RAM destinada como stack que contiene el último valor almacenado. La
figura 11.17 muestra como funcionaría el mismo programa del ejemplo anterior
mediante un stack pointer.
Figura 11.17
La Pila esta configurada como una zona de memoria de acceso secuencial del
tipo LIFO (Last In First Out) en la que el último dato introducido es también el
primero en salir al ser leida la pila por el programa. Se puede tener una idea bastante
CÁNDIDO HERNÁNDEZ AGERO 26
LÓGICA DIGITAL Y MICROPROGRAMABLE
gráfica de su funcionamiento si imaginamos el stack como el resultado de ir apilando
un conjunto de papeles sobre una mesa. El último papel apilado es el primero que
tenemos disponible para su lectura. De forma equivalente, cada vez que accedemos a
una subrutina, se introduce en la parte superior del stack la dirección de retorno para su
recuperación al final de la misma.
Al ejecutarse un salto a una subrutina además del Contador de Programa,
puede que sea necesario también memorizar los datos contenidos en otros registros de
la CPU con el fin de que a la vuelta al programa principal se reanude la ejecución del
mismo en las mismas condiciones existentes en el momento de producirse el salto a la
subrutina.
Una de las ventajas que tiene la utilización de subrutinas a lo largo de un
programa es que éstos, al ser más cortos, ocupan menos memoria. Del mismo modo,
la tarea del programador también se reducirá al tener que escribir menos instrucciones.
Otra de las ventajas de utilizar subrutinas es que su uso ayuda a la estructuración de los
programas y por tanto a la mejor comprensión de los mismos.
Interrupciones
Las interrupciones son un mecanismo muy importante para la sincronización de
los programas con acontecimientos externos.
El funcionamiento de las interrupciones es muy parecido al de las subrutinas.
La diferencia más importante estriba en la manera en que se produce la interrupción.
Mientras las subrutinas se ejecutan cada vez que se encuentra una instrucción que así
lo indica, las interrupciones se ponen en marcha al activarse una línea de entrada de la
CPU, es decir, mediante un mecanismo "hardware", pudiendo producirse en cualquier
momento de la ejecución del programa.
El segmento de programa que se ejecuta como consecuencia de una
interrupción se denomina rutina de interrupción. Como en el caso de las subrutinas,
las rutinas de interrupción deben terminar con una instrucción de retorno de
interrupción.
También, al igual que las subrutinas, antes de saltar a la rutina de interrupción,
la CPU debe guardar los datos necesarios para posteriormente reanudar la tarea tal y
como la dejo.
EL MICROPROCESADOR 65CO2
Introducción
El 6502 es un microprocesador de 8 bits (ALU y bus de datos) dotado de un
bus de direcciones de 16 bits, que le permite acceder a 64k bytes de memoria. El
acceso a memoria incorpora el concepto de paginación que consiste en suponer que el
mapa de memoria está fraccionado en páginas. Cada una de ellas se direcciona a
través del byte alto del bus de direcciones, y se obtiene. por el byte bajo, la dirección
completa de la posición de memoria seleccionada. Debido a este concepto de
paginación, las instrucciones de salto condicional, pensadas para trabajar dentro de la
CÁNDIDO HERNÁNDEZ AGERO 27
LÓGICA DIGITAL Y MICROPROGRAMABLE
misma página de memoria, tienen un tiempo de ejecución menor que si trabajaran con
direcciones absolutas. No obstante, el tiempo de ejecución se incrementa en un ciclo
de reloj cuando el salto relativo se produce fuera de la página activa.
Dos de estas páginas del mapa de memoria tienen un significado especial para
la CPU. La "página 0" que corresponde a las direcciones absolutas entre 0000H y
00FFH (byte alto de direcciones = 00) permite accesos para lectura/escritura de datos,
sensiblemente más rápidos que en instrucciones equivalentes con direccionamiento
absoluto. La "página 1", situada entre las posiciones 0100H y 01FFH, es la zona
reservada para implementar el stack, que el microprocesador trata de forma automática
como memoria de acceso secuencias.
Otra característica de este microprocesador es el reducido juego de instrucciones
que presenta, en relación a otros microprocesadores de 8 bits, potenciado por el gran
número de direccionamientos posibles en cada una de ellas. Así resulta un tiempo de
aprendizaje reducido además de la facilidad de manipulación de datos en memoria.
La versión CMOS de este microprocesador, utilizada en el Microinstructor MI-
650C presenta algunas mejoras respecto de la versión NMOS. Cabe destacar la
inclusión de 12 nuevas instrucciones. Con un total de 59 nuevos códigos de
operación ; la disminución del consumo, debido a la tecnología empleada; y la
eliminación de algunos errores que se habían detectado en la versión NMOS.
Estructura hardware interna
En La figura 11.18 se presenta el diagrama de bloques de esta CPU.
Figura 11.18
CÁNDIDO HERNÁNDEZ AGERO 28
LÓGICA DIGITAL Y MICROPROGRAMABLE
Las funciones y características de cada uno de estos bloques y señales son las
siguientes :
• Registro de instrucción: Como ya se ha explicado anteriormente este registro es el
encargado de memorizar durante la ejecución, la instrucción que se ha recogido de
memoria mediante un ciclo de búsqueda (fecht). Las instrucciones de este
microprocesador tienen entre 1 y 3 bytes.
• Decodificador de instrucciones : Durante el estado de ejecución, este bloque de
decodificar el código de operación de la instrucción actualmente almacenada en el
registro de instrucción, y generar la secuencia de microordenes asociada ala función
a realiza, sincronizada con la señal de reloj.
• Unidad Aritmético-Lógica: En este bloque tienen lugar las operaciones aritmético-
lógicas que se han de realizar en el uP.
Según se especifique en el programa, estas operaciones pueden efectuarse, bien
sobre un registro aislado (por ejemplo, incrementando el registro X), o bien entre dos
operandos, uno de los cuales siempre es un registro de la CPU.
Para las operaciones aritméticas existen dos modos de funcionamiento. Uno de
ellos considera los dos operandos como números binarios. El otro, es el modo decimal
y considera cada operando como dos números en BCD, dando el resultado también en
BCD. Después de un reset o de una interrupción, el modo de funcionamiento de la
ALU se inicializa en binario (sólo en el 65C02 ) .
• Registros: El número y el propósito de los registros internos de la CPU varía
mucho de un uP a otro. Los registros del 65C02 pueden verse en la figura 11. y
sus funciones son las siguientes :
1. Contador de programa (PC): Este es el único registro de 16 bits que
incorpora el 65C02. En él se mantiene la dirección del siguiente byte de
programa que debe ser leído para su ejecución. Cuando se inicia el ciclo
de búsqueda de la instrucción, el contenido del PC se deposita en el bus
de direcciones. Inmediatamente se incrementa el contenido de este
registro. Este proceso se repite hasta que se recoge algún tipo de
instrucción que modifica el contenido del PC lo cual permite continuar el
programa a partir de otra dirección.
2. Acumulador: En este uP la mayor parte de transferencias entre memoria
y CPU se efectúan a través de este registro.
3. Indices (X,Y): Pese a que estos dos registros están especialmente
indicados para actuar de índices en referencias a memoria, también se
pueden utilizar como contadores, registros para el almacenamiento
temporal de datos, etc.
4. Stack Pointer o Puntero de Pila (S): Como se ha expuesto
anteriormente, el stack se crea en la página 1 del mapa de memoria. En
CÁNDIDO HERNÁNDEZ AGERO 29
LÓGICA DIGITAL Y MICROPROGRAMABLE
ella, el byte alto del bus de direcciones es constante e igual a 0lH, por
tanto, es suficiente un registro de 8 bits para formar el Puntero de Pila.
Este registro contiene el byte de menor peso del Puntero. En el programa
monitor del Microinstructor el registro S se inicializa con el valor FFH,
con el fin de aprovechar al máximo la página 1, empleando de este modo
como área para el Stack las direcciones comprendidas entre 100H y
1FFH.
5. Registro de Estado o Status (P) : En este microprocesador este registro
es también de 8 bits. Cada uno de ellos tiene un significado propio y
refleja el estado de la CPU como indica su nombre. Cada uno de estos
bits. llamados Flags o Indicadores tiene la misión de señalar la
ocurrencia de un hecho concreto. En el apartado de descripción del
juego de instrucciones puede estudiarse con más detalle la misión de
cada uno de estos flags.
Figura 11.19
• Bus de direcciones: Está compuesto por los terminales AD0 a ADl5. Son salidas
con niveles lógicos TTL, capaces cada una de ellas de excitar una carga de tina
puerta TTL estandar. En estos terminales siempre está presente una dirección,
correspondiente al contenido de los "latches" ADL y ADH.
• Bus de datos: Está formado por los terminales DB0 a DB7. Son bidireccionales y
el estado normal es el de alta impedancia (Tri-state) cuando no se realiza ningún
ciclo de lectura o escritura.
• Señal de lectura/escritura (R/W): Indica a la memoria y a los elementos de
entrada/salida si se trata de una operación de lectura (R/W=l) o de escritura
(R/W=0).
• Reloj (clock): La señal de reloj en el Microinstructor se genera mediante un cristal
de cuarzo de 1 MHz. Esta señal se aplica en la patilla 00. En el interior de la CPU
existen unos circuitos que, a partir de 00, generan las dos fases 01 y 02 que aparecen
en los terminales correspondientes para servir de reloj a otros elementos periféricos del
sistema. Durante el tiempo en que 01=1, se producen los cambios en el bus de
CÁNDIDO HERNÁNDEZ AGERO 30
LÓGICA DIGITAL Y MICROPROGRAMABLE
direcciones mientras que cuando 02=1 es cuando se producen las transferencias de
datos. En la figura 11.20 se puede ver la temporización de estas señales.
Figura 11.20
• Señal de 'Ready' (RDY): Esta señal está pensada para retardar la ejecución de un
ciclo de búsqueda de instrucción, durante un ciclo de reloj. Con ello se hace
posible acceder a memorias (o, en general a periféricos) lentos sin tener que
disminuir la frecuencia de reloj del microprocesador y, por tanto, su velocidad de
trabajo). Cuando se aplica un flanco negativo a RDY durante 01=1. se reconoce el
estado de esta señal durante 02=1, v se congela la ejecución del ciclo interno de la
CPU, hasta el siguiente ciclo de reloj. Por tanto se duplica el tiempo de duración
del estado.
• Señal de Sincronismo (SYNC): Se trata de una señal que genera la CPU con el fin
de señalar aquellos ciclos de reloj durante los cuales se produce la lectura del
código de operación de una instrucción. Se utiliza en combinación con la entrada
RDY para la ejecución "instrucción por instrucción". Para ello se provoca la
detención del procesador mediante RDY cuando se detecta el flanco de subida de
SYNC, indicando que va a comenzar una nueva instrucción. Este paro se produce
dejando las salidas de direcciones señalando la posición del programa que contiene
el código de operación de la siguiente instrucción a ejecutar.
• Línea de 'Set Overflow' (S.O.): Esta entrada sirve para poner a el bit de
"overflow" del registro de "Status". Puede usarse para dar servicio a un periférico
que active esta línea que un programa que efectúe continuas comprobaciones del
Flag V del registro de Status.
• Reset (RES): Esta señal se utiliza para inicializar el mícroprocesador, tras la
conexión de la alimentación al circuito. Durante el tiempo de establecimiento de
la tensión de alimentación, la señal de reset debe permanecer a '0' y, al pasar a 'l', la
CPU carga el Contador de Programa (PC) con el vector almacenado en las
direcciones FFFCH-FFFDH e inicia la ejecución normal de un Programa. En el
Mícroinstructor en este vector se encuentra la dirección de inicio del Monitor. Una
de las primeras funciones que realiza el Programa Monitor es la de sacar un
mensaje inicial por el display (650 C) y realizar un test de los LED's y de los
CÁNDIDO HERNÁNDEZ AGERO 31
LÓGICA DIGITAL Y MICROPROGRAMABLE
interruptores conectados a uno de los periféricos del Microinstructor. Durante este
test se encienden los LED's uno a uno, secuencialmente, y se lee el estado de los 8
microinterruptores. Al término de la subrutina de test, el estado de los 8
microinterruptores se transfiere a la fila de LED's. Posteriormente se pasa a un
bucle en el que se va refrescando el display y se analiza el teclado para detectar la
petición de funciones.
• Interrupción enmascarable (/IRQ): Un nivel bajo de esta línea da lugar a una
secuencia de interrupción, en la que se efectúan las siguientes operaciones:
1. Se finaliza la instrucción que se estaba efectuando.
2. La CPU analiza el contenido del bit I del registro P. Si el valor de este bit es 1,
se ignora la interrupción y continúa el trabajo normal. Si. por el contrario, su
valor es 0, la interrupción es aceptada y continúa el proceso.
3. Impide otra Interrupción y guarda el valor del contador de programa (PC) y el
registro P en el Stack.
4. Recoge el vector en FFFEH-FFFFH y comienza la ejecución en la dirección de
memoria indicada por éste.
5. La ejecución finaliza cuando se encuentra una instrucción RTI, tras la cual
recoge los datos antes guardados y continúa la operación en que se detuvo.
• Interrupción no enmascarable (/NMI): Esta interrupción obliga al procesador a
alterar el contenido del PC independientemente del flag I del registro de Estado.
Origina el salto de la ejecución del programa a la dirección contenida en las
posiciones FFFAH y FFFBH, previa salvaguarda del contador de programa y del
registro de Estado en el Stack.
La activación de la línea /NMI se logra manteniéndola en el estado bajo por lo
menos durante dos ciclos de reloj, pudiendo permanecer en este estado
indefinidamente sin que se produzcan nuevas interrupciones, ya que éstas se originan
únicamente por el flanco de bajada (paso de "1" a "0") de /NMI.
El modo de tratamiento de las interrupciones (tanto NMI como IRQ) se efectúa
de manera análoga a las subrutinas. La diferencia está en que, cuando se atiende una
interrupción, se guarda en el Stack, además del PC, el registro Status (P). Otra
diferencia es que el salto a la rutina de interrupción se efectúa a partir de un vector fijo
en memoria. De igual manera que existe una instrucción para indicar que se ha llegado
al final de una subrutina y que debe devolverse el control al programa principal, existe
una instrucción específica (RTI) para finalizar la rutina de atención de la interrupción.
La única diferencia estriba en que RTI recupera, además del PC, el registro de Status.
En cualquier hoja de datos o manual técnico de este microprocesador pueden
estudiarse con detalle los diagramas de temporización de las señales. Cada lectura o
CÁNDIDO HERNÁNDEZ AGERO 32
LÓGICA DIGITAL Y MICROPROGRAMABLE
escritura en memoria dura un ciclo de reloj, por lo que la duración de la ejecución de
una determinada instrucción, depende del numero de accesos a memoria (lectura o
escritura) que requiera.
Durante la ejecución de un programa se alternan ciclos de lectura, ciclos de
escritura v ciclos en los que no se realiza ninguna operación sobre memoria, durante
los cuales la CPU trabaja internamente.
El número de ciclos de reloj que tarda en ejecutarse cada instrucción viene
especificado por el fabricante, y permite calcular el tiempo total de ejecución de un
programa. Las instrucciones en este microprocesador pueden tener entre 2 y 7 ciclos
de reloj. Por tanto, el tiempo de ejecución de una instrucción estará entre 2 y 7
microsegundos, para una frecuencia de reloj de lMHz.
En el primer ciclo de todas las intrucciones se realiza un ciclo de fetch o
búsqueda del código de operación. Durante estos ciclos se activa la señal SYNC. Los
restantes ciclos de cada instrucción pueden ser de lectura, de escritura o de operación
interna. Durante los ciclos ocupados por este último tipo de instrucciones los buses
externos al microprocesador se encuentran libres.
Como ya se ha repetido en varias ocasiones, una vez la CPU ha realizado el
ciclo de búsqueda del código de operación de la siguiente instrucción a ejecutar, se
inicia su decodificación y la ejecución de las diversas microoperaciones
correspondientes. Dado que estas microoperaciones deben estar sincronizadas, cada
una de estas acciones elementales se realizará en un ciclo de reloj. No obstante, en el
65C02, se utilizan elementos distintos para controlar la parte de generación de
direcciones y la de cálculo (pipelining) por lo que se pueden realizar varias
microórdenes simultáneamente en un sólo ciclo de reloj, con lo cual se acorta el
tiempo total de ejecución de la instrucción.
Debido a esta ejecución en paralelo, el 65C02, pese a funcionar a una
frecuencia de reloj menor a la de otros microprocesadores, puede llegar a tener un
tiempo de ejecución de las instrucciones parecido e incluso inferior al de éstos.
Modos de direccionamiento
Una instrucción es un código binario con un significado preestablecido. Sin
embargo, con el fin de facilitar al programador la memorización y el tratamiento de
estos códigos, es conveniente adjudicar a cada instrucción una abreviatura que dé una
idea de la acción que realiza. Esta abreviatura se denomina Nemónico.
Siempre debe tenerse presente que esta abreviatura sólo es una forma más
clara de representar las instrucciones de cara al programador, ya que la CPU sólo
entiende códigos binarios.
La instrucción que indica, por ejemplo, que se efectúe la carga del Acumulador
con un valor determinado tiene en el 65C02 el código máquina :
0 1 1 0 1 0 0 1 = A9H
Y se le asigna el nemónico:
LDA (Load Accumulator)
CÁNDIDO HERNÁNDEZ AGERO 33
LÓGICA DIGITAL Y MICROPROGRAMABLE
Pero cada instrucción debe especificar también, el dato o datos con los que
opera o la situación de los mismos. La forma de indicar cuál es o dónde se encuentra
un dato da lugar a los diversos modos de direccionamiento.
De esta forma, la mayoría de nemónicos dan lugar a varios códigos de
operación según el modo de direccionamiento utilizado. Por ejemplo, la instrucción
LDA (Carga del Acumulador) del 65C02 puede dar lugar a 9 códigos de dirección
distintos (ver tabla 11.1)
INSTRUCCIÓN MODO CÓDIGO LONGITUD
DIRECCIONAMIENTO OPERACIÓN INSTRUCCIÓN
LDA INMEDIATO A9 2 BYTES
LDA ABSOLUTO AD 3 BYTES
LDA ABSOLUTO INDE X BD 3 BYTES
LDA ABSOLUTO INDE Y B9 3 BYTES
LDA PREINDEXADO A1 2 BYTES
LDA POSTINDEXADO B1 2 BYTES
LDA ABS. PAGINA 0 A5 2 BYTES
LDA INDEX. PAGINA 0 B5 2 BYTES
LDA INDIRECTO B2 2 BYTES
Tabla 11.1
Todas estas operaciones tienen en común que realizan una operación de carga,
pero difieren en la forma de encontrar el dato que se va a utilizar en la carga.
Esta gran variedad de modos de direccionamiento distintos facilita la labor del
programador que deberá recordar un grupo de nemónicos más reducido que en otros
microprocesadores. El 65C02 tiene un total de 68 nemónicos, que expandidos en los
15 modos de direccionamiento posibles dan un total de 210 códigos de operación.
Los modos de diréccionamiento admitidos por el microorocesador
65CO2 son los que se explican a continuación.
Direccionamiento implícito
Las instrucciones que utilizan este tipo de direccionamiento contienen toda la
información necesaria para identificar la posición del dato con el que operan o las
direcciones de transferencia necesarias, en el propio código de operación. Por tanto,
sólo tienen 1 byte de longitud.
Este modo de direccionamiento es propio de instrucciones que afectan a un
solo registro interno o que efectúan transferencias de datos entre los registros o entre
éstos y el "Stack". De las 68 instrucciones, 29 utilizan este modo de direccionamiento.
Un ejemplo de este tipo de direccionamiento puede ser:
TAX Transfiere el Acumulador al registro X
CÁNDIDO HERNÁNDEZ AGERO 34
LÓGICA DIGITAL Y MICROPROGRAMABLE
Díreccionamiento de Acumulador [Ac]
En este modo de direccionamiento los datos se encuentran en el Acumulador
antes y después de la ejecución de la instrucción. Estas instrucciones también están
formadas por un solo byte.
En el 65C02 utilizan este tipo de direccionamiento las instrucciones que
implican un desplazamiento de bits de los datos del Acumulador y las que lo
incrementan o decrementan.
Un ejemplo de este tipo de direccionamiento puede ser:
DEC A Decrementa A y deja el resultado en A
Direccionamiento inmediato (#nn)
Las instrucciones que utilizan este modo de direccionamiento tienen una
longitud de 2 bytes. El primero, como en todas las instrucciones, indica el código de
operación y el segundo es el operando. Precediendo al operando se utiliza el símbolo
#.
Un ejemplo de este tipo de direccionamiento puede ser:
LDA #2FH Cargar el Acumulador con 00101111B
Direccionamiento absoluto [ABS]
Las instrucciones que utilizan este tipo de direccionamiento están compuestas de
tres bytes, uno de código de operación y dos de operando. Los dos bytes que siguen al
código de operación especifican la dirección absoluta de memoria en la que se
encuentra el dato a procesar. Esta dirección está almacenada en memoria en orden
inverso., de manera que, primero se encuentra el byte bajo y después el byte alto.
Un ejemplo de este tipo de direccionamiento es la instrucción:
LDX 1234H Carga el registro X con el dato que se encuentra
en la dirección 1234H.
Direccionamiento de página cero [ZP]
Es un caso particular de direccionamiento absoluto que utiliza 2 bytes, uno para el
código de operación y otro para indicar el operando. El operando indica la dirección de
la página 0 a la que deseamos acceder. Al ser ejecutada por el microprocesador, el
byte bajo de la dirección del dato se toma del segundo byte de la instrucción, y el byte
alto del bus de direcciones se coloca automáticamente a 0. Por tanto este método de
direccionamiento proporciona un mayor aprovechamiento de la memoria y una
velocidad de ejecución mayor que el direccionamiento absoluto.
CÁNDIDO HERNÁNDEZ AGERO 35
LÓGICA DIGITAL Y MICROPROGRAMABLE
Todas las instrucciones válidas en direccionamiento absoluto lo son también en
direccionamiento de página cero, con la excepción de JMP y JSR. Es un buen método
de programación reservar la página cero (del byte 0 al byte FFH de la memoria) para la
declaración de variables.
Un ejemplo de este tipo de direccionamiento es la instrucción:
STA 20H Almacena el contenido del Acumulador en la
dirección 0200H.
Direccionamiento absoluto indexado [ABS,X ó Y]
Es una variante del direccionamiento absoluto comentado anteriormente. El
indexado puede efectuarse indistintamente mediante el registro X o el Y. El valor
efectivo de la dirección de memoria con la que se efectúe la transferencia se obtiene
sumando la dirección absoluta , indicada en los dos bytes siguientes al código de
operación, con el valor que en ese momento tenga el registro índice usado. Dado que
tanto el registro x como el Y son de 1 byte, mediante este direccionamiento se puede
acceder a cualquier dirección de un bloque de memoria de 256 bytes. De este modo se
facilitan ciertos tipos de tratamientos de tablas.
Un ejemplo de este tipo de direccionamiento es la instrucción:
LDA 1000,X Cuando X contiene 25H, transfiere al
Acumulador el dato contenido en la
dirección l025H.
Direccionamiento de página cero indexado [ZP,X ó Y]
Las instrucciones que utilizan este tipo de direccionamiento incluyen un solo
byte de operando que constituye la dirección base de página cero a la que se sumará el
registro de índice. Según el valor de este índice se puede acceder a cualquier dirección
de página cero.
Un ejemplo de este tipo de direccionamiento es la instrucción:
LDA 10H,X Cuando X contiene 25H, transfiere al
Acumulador el dato contenido en la
dirección de página cero 35H.
Direccionamiento indirecto post-indexado [(IND),Y]
Las instrucciones que utilizan este tipo de direccionamiento constan de dos bytes.
El primero, como siempre, indica el código de operación y el segundo representa una
dirección de página 0. El contenido de esta dirección de memoria y el de la siguiente
forman a su vez una nueva dirección de memoria que al ser sumada con el contenido
del registro índice Y, proporciona la dirección efectiva del dato.
Este modo de direccionamiento, con la ayuda de las instrucciones INY o DEY
facilita la exploración de tablas situadas en cualquier zona del mapa de memoria.
CÁNDIDO HERNÁNDEZ AGERO 36
LÓGICA DIGITAL Y MICROPROGRAMABLE
Un ejemplo de este tipo de direccionamiento es la instrucción:
LDA (l2H),Y Cuando las direcciones de página 0 l2H y l3H
contengan respectivamente 00H y 10H y el valor
del registro Y sea 5, tras la ejecución de esta
instrucción se colocará en el Acumulador el
contenido de la dirección l005H.
Direccionamiento indirecto preindexado [(INDX)]
Las instrucciones que utilizan este tipo de direccionamiento contienen como
operando una dirección de página cero, que sumada con el contenido del registro X
apunta a otra dirección de página cero. Si la suma de ambos términos excede de FFH,
se ignora el acarreo, no pasando a la página 1 sino produciéndose un truncamiento. En
esta dirección y en la siguiente se encuentra, en orden inverso (primero byte bajo y
luego byte alto) la dirección efectiva donde está el dato.
Este modo de direccionamiento permite escribir programas que, con ayuda de
las instrucciones INX o DEX, obtengan datos situados en posiciones no contiguas en
cualquier punto del mapa de memoria. Por contra exige que en la página cero se
disponga de una tabla contigua con las direcciones de base de cada uno de estos datos.
Un ejemplo de este tipo de direccionamiento es la instrucción:
LDA (20H,X) Si el registro X contiene 0BH, en las posiciones
0028H y 0029H se encuentra respectivamente
34H y l2H y en la direccción 1234H se encuentra
el dato 55H, al ejecutar esta instrucción el
acumulador se cargará con el dato 55H.
Direccionamiento relativo [REL]
Este modo de direccionamiento es utilizado exclusivamente por las instrucciones
de salto condicional (branch). La dirección de memoria a la que se transfiere el control
del programa se ,obtiene sumando el valor del contador de programa al segundo byte
de la instrucción, denominado "offset". Este offset es un número en complemento a 2,
con lo que se pueden efectuar saltos de hasta 127 posiciones hacia adelante o 128 hacia
atrás.
Un ejemplo de este tipo de direccionamiento es la instrucción:
BNE 20H Si la instrucción está contenida en las posiciones
1000H y l00lH del programa, el valor del PC
actualizado será l002H. Si el flag Z del registro
Status es distinto de 0 el valor del "offset" se
sumará al del PC y la ejecución del programa
continuará a partir de la dirección 1022H de
memoria. En caso contrario la siguiente
instrucción a ejecutar será la que ocupe la
dirección l002H.
CÁNDIDO HERNÁNDEZ AGERO 37
LÓGICA DIGITAL Y MICROPROGRAMABLE
Direccionamiento indirecto absoluto [(ABS)]
Estas instrucciones son de tres bytes que contienen el código de la instrucción y la
dirección absoluta en la que se encuentra la parte alta de la dirección efectiva del dato,
La parte baja de la dirección efectiva del dato se encuentra en la siguiente dirección.
Un ejemplo de este tipo de direccionamiento es la instrucción:
LDA (2000H) Si la dirección 2000H contiene el dato 10H y la
siguiente FFH, al ejecutar esta instrucción el
Acumulador se cargará con el dato que contenga
la dirección de memoria FF10H.
Direccionamiento indirecto preindexado absoluto [(ABS,X)]
Este modo de direccionamiento sólo afecta a la instrucción de salto
incondicional JMP. El contenido de los bytes segundo y tercero de la instrucción, y se
suma al registro X. El resultado, de 16 bits, es la dirección de memoria donde se
encuentra el byte bajo de la dirección efectiva del dato. En la siguiente dirección se
encuentra el byte alto de la dirección efectiva del dato.
Un ejemplo de este tipo de direccionamiento es la instrucción:
JMP (1234H,X) Si X contiene 02H y en las direcciones 1236H
y 1237H se encuentran los datos 00H y 30H
respectivamente, después de ejecutar esta
instrucción el PC pasará a ejecutar la que este en
la dirección 3000H.
Registro Status del 65C02
Antes de entrar en el análisis de las instrucciones del 65C02, conviene estudiar
con detalle el registro de Status, ya que gran número de estas instrucciones modifican
o consultan el estado de los bits de este registro (flags).
Estos flags son los siguientes:
• Bit de Acarreo o 'Carry' (C): La misión de este Flag es la de avisar de que,
como consecuencia de una operación aritmética, el resultado desborda la
capacidad de un registro de 8 bits. Este bit puede ser modificado directamente
mediante las instrucciones SEC, que lo pone a "1" y CLC que lo pone a "0".
• Bit de Cero (Z): Cuando Z=l indica que el resultado de una operación es cero.
No se puede modificar directamente el estado de este bit mediante una
instrucción, sin embargo hay algunas que lo consultan (p.e. BEQ, salta si Z=l).
CÁNDIDO HERNÁNDEZ AGERO 38
LÓGICA DIGITAL Y MICROPROGRAMABLE
• Bit de Interrupción (I): Las interrupciones o peticiones de servicio de la CPU
que llegan a través de la línea /IRQ serán atendidas solamente si I=0. Este Flag
puede ser modificado por dos instrucciones: SEI para ponerlo a 'l' y CLI para
ponerlo a '0'.
• Bit de Modo Decimal (D): Cuando este bit está a “1” la ALU realiza las
operaciones aritméticas como si los operandos estuvieran codificados en BCD.
La instrucción SED pone a "1" este Flag y la instrucción CLD lo pone a "0".
• Bit de Break (B): La instrucción BRK (Break) da lugar a una interrupción por
programa, saltando a la posición indicada por el vector que ocupa las posiciones
FFFEH y FFFFH, de la misma manera que si se hubiese recibido una
interrupción por la línea /IRQ. La única forma de distinguir el origen de la
interrupción es consultando este Flag, que será 'l' si la interrupción procede de
una instrucción BRK y si procede de una interrupción externa.
• Bit de 'overflow' o desbordamiento (V): Si, como consecuencia de una
operación aritmética, el número resultante excede al máximo que puede
representarse con 8 bits en complemento a 2 y, por tanto, se ha alterado el bit de
signo, es necesario advertir que se ha producido desbordamiento. En este caso
se pone a "1" el bit V indicando que el resultado es erróneo. Si se está
trabajando con números sin signo, el estado de este Flag no es significativo. Este
bit puede ponerse a "0" directamente mediante la instrucción CLV.
• La CPU tiene un terminal denominado SO ("Set Overflow") que permite la
activación directa de este Flag para dar aviso de un cierto hecho exterior.
• Bit de signo (N): Contiene la copia del bit 7 resultante de todas las operaciones
aritméticas y lógicas. Trabajando con números en complemento a dos, el bit 7
representa el signo, siendo 0 si es signo '+' y 1 si es signo '-'.
Juego de instrucciones del 65C02
En este capítulo se expondrán los distintos grupos en que se pueden dividir las
instrucciones del microprocesador 65C02.
Instrucciones de Movimiento de Datos
Aunque casi todas las instrucciones implican alguna forma de movimiento de
datos, nos referimos aquí a aquellas cuya función básica es la transferencia de datos
entre registros y/o memoria.
CÁNDIDO HERNÁNDEZ AGERO 39
LÓGICA DIGITAL Y MICROPROGRAMABLE
Transferencias entre registros :
TAX Acumulador al reg. X
TXA Reg X al Acumulador
TAY Acumulador al reg. Y
TYA Reg. Al Acumulador
TSX Stack Pointer a reg. X
TXS Reg. X a Stack Pointer
Transferencias entre registros y Stack:
PHA: Ac. al Stack
PLA: Stack al Ac.
PHP: reg. P al Stack
PLP: Stack al reg. P
PHX: reg. X al Stack
PLX: Stack al reg. X
PHY: reg. Y al Stack
PLY: Stack al reg. Y
Transferencias entre registros y memoria:
LDA: Memoria al Ac,
STA: Ac. a Mem.
LDX: Mem. al reg. X
STX: reg, X a Mem,
LDY: Mem. al reg. Y
STY: reg. Y a Mem,
STZ: ‘0’ a Mem.
Los dos primeros grupos de instrucciones son de direccionamiento implícito y,
por tanto, de un solo byte. El grupo de transferencia con memoria admite distintos
tipos de direccionamiento.
Instrucciones Aritmético-lógicas
Son las que efectúan este tipo de operaciones con el contenido de los registros
o de memoria.
CÁNDIDO HERNÁNDEZ AGERO 40
LÓGICA DIGITAL Y MICROPROGRAMABLE
Operaciones aritméticas:
Se reducen a la suma y resta de operandos y al incremento o decremento de
registros o memoria.
ADC Ac+Mem+carry
INC Mem.+l
INX reg,X+I
INY reg.Y+l
SBC Ac-Mem-(/carry)
DEC Mem.-l
DEX reg,X-1
DEY reg.Y-l
Operaciones lógicas
Se reducen a tres funciones básicas que se efectúan entre un operando y el
acumulador. Estas funciones operan bit a bit.
AND Ac. [AND] Mem.
ORA Ac. [OR] Mem.
EOR Ac. [OR-exclusiv] Mem.
Otras funciones lógicas se pueden obtener por combinación de las anteriores.
En particular, es interesante considerar la inversión, bit a bit, del contenido del
acumulador. Esta función puede obtenerse de forma sencilla con la instrucción
EOR #OFFH
Las operaciones de "suma" y "resta" están preparadas para facilitar su
encadenamiento en los cálculos con datos mayores de 1 byte (doble precisión o
mayor). En estos casos; el bit de carry del registro de estado almacena el acarreo entre
cada operación parcial. Así para sumar dos datos de N bytes, sólo es preciso iniciar el
bit de carry a '0' y proceder de forma cíclica con cada uno de los bytes que componen
el dato. Un ejemplo de este procedimiento puede ser:
CLC ;BORRADO INICIAL DEL CARRY
LDA BYTEA_1 ;CARGA DEL PRIMER BYTE DEL DATO A
ADC BYTEB_1 ;SUMA PRIMER BYTE A+B
STA SUMA _1
LDA BYTEA_2 ;IDEM SEGUNDO BYTE
ADC BYTEB_2
CÁNDIDO HERNÁNDEZ AGERO 41
LÓGICA DIGITAL Y MICROPROGRAMABLE
STA SUMA_2
.....
.....
.....
LDA BYTEA_N ;IDEM ULTIMO BYTE
ADC BYTEB_N
STA SUMA_N ;FINAL DE A+B
En el caso de la resta múltiple, conviene recordar que el valor inicial del bit de
carry ha de ser 'l' (SEC).
Otro aspecto importante, es el comportamiento de los flags en estos dos tipos de
operaciones. Dado que el microprocesador desconoce si los datos con los que opera se
consideran con signo o no, duplica la información generada después de cada operación
para cubrir las dos posibilidades. Así, el bit de carry indica cuando se produce acarreo
suponiendo los datos sin signo, y el bit de overflow realiza la misma función pero
considerando que los datos con que se opera están codificados en complemento a 2. El
programador debe utilizar en cada caso la información adecuada al tipo de datos
utilizados.
Las instrucciones de incremento y decremento, no modifican el contenido de
los dos flags que indican acarreo (carry y overflow).
Instrucciones de Comparación
Efectúan una comparación entre uno de los registros y la memoria, El resultado
se presenta como una modificación de los flags N, Z y C que permite deducir si entre
los valores numéricos comparados existe una relación de "MAYOR", "MENOR" o
"IGUAL".
Para efectuar esta comparación, la CPU realiza internamente una resta entre el
registro y la memoria, sin que el resultado modifique ninguno de los operandos. Debe
tenerse en cuenta que los flags se modifican de forma equivalente a si se efectuara la
diferencia con la instrucción SBC, a excepción del flag V (overflow) que no se altera,
y sin tener en cuenta el flag de carry. Por tanto, no es posible conocer si se produce
desbordamiento cuando se comparan valores con signo.
Hay tres instrucciones básicas de comparación, cada una de ellas con distintas
formas de direccionamiento:
CMP compara el Ac, con la Mem.
CPX compara el reg,X con la Mem.
CPY compara el reg,Y con la Mem.
Analizando el valor de cada uno de los flags afectados por esta instrucción,
podemos determinar la relación entre los operandos, registros (R) y memoria (M).
según la tabla siguiente:
CÁNDIDO HERNÁNDEZ AGERO 42
LÓGICA DIGITAL Y MICROPROGRAMABLE
C = 0 --> R < M (menor)
C = 1 --> R >=M (mayor o igual)
Z = 0 --> R <> M (distinto)
Z = 1 --> R = M (igual)
El flag de signo (N) toma el valor del bit 7 del resultado de la operación
diferencia que se realiza para la comparación. Las instrucciones de comparación se
utilizan, en combinación con las de salto condicional, para crear puntos de toma de
decisiones en un programa. Con ello se consigue bifurcar la ejecución de un programa
en función de una condición variable.
Instrucciones de Desplazamiento y Rotación
Son un conjunto de 8 instrucciones que afectan al acumulador o a la memoria
indicada según el modo de direccionamiento, desplazando su contenido a derecha o
izquierda. En estos desplazamientos interviene el flag de carry, que actúa como un
noveno bit del elemento que se desplaza. En las instrucciones de rotación se cierra el
camino de desplazamiento formando un bucle. Por tanto, la información contenida
antes de ejecutar la instrucción de rotación, no se pierde.
En las instrucciones de desplazamiento, se pierde un bit de información que se
sustituye por un '0'.
El nemónico de estas instrucciones varia cuando se refieren al acumulador
según lo siguiente:
ASL desplazar Mem. a la izquierda
LSR desplazar Mem. a la derecha
ROL rotar Mem. a la izquierda
ROR rotar Mem. a la derecha
ASL A desplazar Ac. a la izquierda
LSR A desplazar Ac. a la derecha
ROL A rotar Ac. a la izquierda
ROR A rotar Ac. a la derecha
Una aplicación importante de este tipo de instrucciones es la conversión serie-
paralelo y paralelo-serie de datos. En el Microinstructor se utiliza este procedimiento
para grabar y leer datos de cassette.
Otra aplicación interesante es la multiplicación y división por potencias de 2.
En este caso particular, es suficiente desplazar el dato N veces a izquierda o derecha,
siendo N el exponente de 2. Así, puede realizarse un programa que multiplique el
contenido de una posición de memoria, por ejemplo, por 8 (N=3), utilizando el método
siguiente:
CÁNDIDO HERNÁNDEZ AGERO 43
LÓGICA DIGITAL Y MICROPROGRAMABLE
LDA DATO ;CARGA DEL DATO DE PARTIDA
STA PROD1 ;NO SE DESTRUYE EL DATO DE PARTIDA
ASL PROD1 ;...x2
ROL PROD2 ;DESPLAZAMIENTO AL SEGUNDO BYTE
ASL PROD1 ;...x4
ROL PROD2
ASL PROD1 ;...x8
ROL PROD2
DATO es la posición de memoria que contiene el valor que queremos
multiplicar por 8. El resultado de este producto será una cifra de 16 bits, por lo que se
requieren 2 bytes para guardarlo:
[PROD2] [PRODl] = [DATO] x 8
Un programa equivalente puede realizarse para dividir cambiando el sentido de
desplazamiento.
Instrucciones de Salto
Son todas aquellas que modifican la ejecución lineal de un programa, alterando
el contenido del Contador de Programa (CP). Tal como ya se ha expuesto, al término
de la ejecución de una instrucción, el registro CP se incremento para direccionar la
instrucción siguiente en memoria. Pero, cuando se ejecuta una instrucción de salto, el
nuevo valor del CP se obtiene en función de la instrucción ejecutada. Esta alteración
del CP puede ser incondicional o condicionada al estado de alguno de los flags del
registro de Status.
Salto incondicional
Son aquellas instrucciones cuyo código incluye, en sus distintas formas de
direccionamiento, el nuevo valor del Contador de Programa:
BRA salto relativo incondicional
JMP salto absoluto incondicional
JSR salto a subrutina
BRK salto a subrutina dé Break
RTS retorno de subrutina
RTI retorno de rutina de interrupción
CÁNDIDO HERNÁNDEZ AGERO 44
LÓGICA DIGITAL Y MICROPROGRAMABLE
La instrucción BRK toma la dirección de salto de un vector almacenado en una
posición fija de memoria (FFFEH-FFFFH) e, igual que la instrucción de salto a
subrutina JSR, almacena en el stack la dirección de retorno al punto de partida, para
que sea utilizada por RTS y RTI.
Salto condicional
La modificación del CP depende del valor de alguno de los bits del registro de
Status. Estas Instrucciones siempre producen saltos relativos a la dirección de inicio
de la siguiente instrucción del programa. Estos saltos relativos tienen el valor
contenido en el segundo byte de la instrucción, expresado en complemento a 2:
BCC salto si C = 0
BCS salto si C = 1
BEQ salto si Z = 0
BNE salto si Z = 1
BPL salto si N = 0
BMI salto si N = 1
BVC salto si V = 0
BVS salto si V = 1
BBRn salto si el bit n de Mem. es 'O'
BBSn salto si el bit n de Mem. es 'l'
Dado que estas son las únicas instrucciones que permiten evaluar estados en un
programa, cualquier situación que requiera una toma de decisión debe reducirse a la
modificación de uno de los cuatro flags anteriores o de uno de los bits de una posición
de memoria en página 0.
Instrucciones de Modificación de Flags
Permiten fijar el estado de alguno de los flags del registro de Status. Aunque la
manipulación directa de todos los flags no es posible, se pueden llevar a un estado
conocido por medio de operaciones indirectas.
CLC C = 0
SEC C = 1
CLD D = 0 (pasa a modo binario)
SED D = 1 (pasa a modo decimal)
CLI I = 0 (permite interrupcion /IRQ)
SEI I = 1 (inhibe interrupción /IRQ)
CLV V = 0
CÁNDIDO HERNÁNDEZ AGERO 45
LÓGICA DIGITAL Y MICROPROGRAMABLE
Cualquier bit del registro de Status puede mortificarse indirectamente a través
del Stack., por ejemplo hacer V = l y Z = l:
PHP ;FLAGS AL STACK
PLA ;FLAGS AL ACUMULADOR
ORA #01000010B ;V=l Y Z=l
PHA ;AC. AL STACK
PLP ;AC. AL REG. DE STATUS
Este método permite inicializar simultáneamente el valor de varios flags,
aunque en la mayoría de aplicaciones, la utilización de las instrucciones específicas es
suficiente y más rápida.
Instrucciones de Manipulación y Test de Bits
Son instrucciones que operan directamente sobre los bits de la posición de
memoria seleccionada. Permiten comprobar el estado de cualquiera de los bits y/o
forzarlo a '0' o 'l'.
BIT: test de los bits de Mem. con el Ac.
RMBn: pone a '0' el byte ' l' el byte Mem. con Ac.
SMBn: pone a n' de la Mem. n' de la Mem. y puesta a '0'
TRB: test de Mem. con Ac y puesta a ‘0’
TSB: test de Mem. con Ac. y puesta a 'l'
La operación de test significa que se realiza internamente un AND del
acumulador con la posición de memoria seleccionada. Si su resultado es '0', se activa
el flag Z para su posterior comprobación. En las instrucciones TRB y TSB, solo se
modifican aquellos bits de memoria que corresponden con 'l' en el acumulador. Así, si
queremos poner a '0' todos los bits pares de una posición de memoria genérica MEM1,
podemos seguir el procedimiento siguiente:
LDA #l0101010B ;MASCARA DE SELECCION
TRB MEM1
Analizando posteriormente el flag Z, podemos deducir si alguno de estos bits
estaba previamente a 'l' o no.
CÁNDIDO HERNÁNDEZ AGERO 46
LÓGICA DIGITAL Y MICROPROGRAMABLE
Instrucción Nula
Esta instrucción no modifica el estado de la CPU ni realiza operación alguna,
pero es de gran utilidad cuando se pretende ajustar la duración de un determinado
fragmento de programa a un valor conocido. También puede utilizarse durante el
desarrollo de un programa en RAM, para reservar espacio entre instrucciones, de
forma que pueda posteriormente insertarse alguna instrucción sin tener que introducir
de nuevo una parte del programa.
NOP: no operación
CÁNDIDO HERNÁNDEZ AGERO 47