5.- PROGRAMACION DE UN
MICROPROCESADOR DE 16 BITS:
EL 68000 DE MOTOROLA
 
     A continuación se irán describiendo los tres componentes principales del computador, la memoria, el procesador y la unidad de entrada/salida, según el esquema adjunto.
 
 
 I N D I C E
1.- La Memoria
2.- Registros de Datos
3.- Modos de Direccionamiento
4.- Formatos de instrucciones
5.- Instrucciones condicionales
6.- Entrada/Salida
7.- Gestión de Subrutinas

  1.- La Memoria

    La memoria principal de este computador está formada por celdas de un byte (8 bits), que constituyen la unidad básica de lectura o escritura, identificándose mediante una dirección.
    Los procesos de lectura y escritura pueden realizarse con varias celdas consecutivas simultáneamente, debiendo indicar el procesador a la memoria principal dos parámetros, la dirección de la primera celda de memoria y la longitud de la información a la que se desea acceder. Siendo esta longitud de un byte, dos bytes (una palabra) o cuatro bytes (palabra larga).
    El tamaño máximo de la memoria viene determinado por el número de bits de los registros de direcciones que tiene el procesador, siendo en el caso del Motorola 68000 de 32 bits pero, debido a limitaciones en el montaje solo pueden utilizarse 24 como máximo, así que la máxima longitud que se puede usar de la memoria principal es de 224 bytes, desde 0 hasta FFFFFF .
    El procesador puede leer y escribir información de diferentes tamaños, existiendo una norma para almacenar las palabras (W) y las palabras largas (L), y siendo esta la de comenzar por el byte más significativo.
    Existen 7 registros de direcciones y son: A0, A1, A2, A3, A4, A5 y A6, siendo estos de 32 bits aunque solo pudiendose utilizar 24 bits para direccionar como antes se ha mencionado.
 
 
2.- Registros de Datos

    El Motorola 68000 consta de 8 registros de datos, que son D0, D1, D2, D3, D4, D5, D6 y D7. Cada uno consta de 32 bits. En muchas instrucciones existe la posibilidad de especificar el tamaño del dato, indicándose este mediante el sufijo S (B, W y L), que va añadido al nemotécnico de la instrucción.
    La forma en que se almacenan los datos en los registros, viene dada por su longitud, ya que como esta es variable, irán ocupándolos de izquierda a derecha empezando por el bit menos significativo del registro.

 3.- Modos de Direccionamiento
 
    Existen cuatro modos de direccionamiento:
 

    1.- Direccionamiento inmediato: almacena el operando precedido del símbolo # en el registro indicado. Ejemplo: MOVE.L #$18,D6

    2.- Direccionamiento absoluto: almacena el operando que está en la dirección de memoria especificada en el registro de datos indicado.
    Ejemplo: ADD.W %000000001000111110001,D2 suma la palabra que está en la dirección de memoria indicada, a D2.

    3.- Direccionamiento mediante registro: apunta a la dirección del registro donde está el dato. Ejemplo: MOVE.B D3,D4 copia el contenido del registro D3 (byte) a D4.

    4.- Direccionamiento relativo a registro:

    a) Direccionamiento mediante registro normal: se da la dirección del registro donde está la dirección del dato. El nombre del registro se escribe entre paréntesis.
    Ejemplo: ADD.B (A0),D6 suma el contenido de la posición de memoria (byte) cuya dirección está en A0 al registro D6, guardando el resultado en este último.

    b) Direccionamiento relativo a registro con posincremento: incrementa en una cantidad de memoria, según sea el tamaño del operando (1 para B, 2 para W y 4 para L), después de traer el contenido de la posición de memoria indicada por el registro de direcciones.
    Ejemplo: MOVE.W (A0)+,D0 copia en D0 el contenido de la posición de memoria direccionada por A0 y luego incrementa en 2 el contenido de A0.

    c) Direccionamiento relativo a registro con predecremento: Decrementa en una cantidad de memoria, según sea el tamaño del operando, el registro de direcciones y trae despues el contenido de la posición de memoria cuya dirección es el nuevo valor de dicho registro.
    Ejemplo: MOVE.B  -(A0),D0 decrementa en uno el contenido del registro A0 y luego copia en D0 el contenido de la nueva posición de memoria direccionada por A0.

    d) Direccionamiento relativo a registro con desplazamiento: El contenido de la posición de memoria cuya dirección viene dada por la suma del valor del registro de direcciones y una cantidad fija denominada desplazamiento, pudiendo ser este positivo o negativo y su valor viene condiciondo por el tamaño del operando.
    Ejemplo: MOVE.L N(A0),D1 copia en el registro D1 el contenido de la posición de memoria cuya dirección viene dada por la suma de N multiplicado por 4(L) al contenido de A0.

    e) Direccionamiento relativo a registro con índice: Este modo de direccionamiento es la extensión natural del anterior, ya que permite usar desplazamientos variables, utilizando como desplazamiento el resultado de sumar un número fijo al contenido de un registro de datos denominado registro índice.
    Ejemplo: MOVE.B 4(A0,D1), D0 copia en el registro D0 el contenido de la posición de memoria cuya dirección es el resultado de sumar el número 4, el contenido del registro A0 y el contenido del registro D1. Este modo de direccionamiento no altera el registro de direcciones ni el registro índice.

    f) Direccionamiento relativo al contador de programa con desplazamiento: Cuando es necesario hacer referencia a un operando relativo a la posición de la proxima instrucción que va a ser ejecutada.
    Ejemplo: MOVE.B 24(PC),D0 copia en el registro D0 el contenido de la posición de memoria cuya dirección es la suma de 24 y el valor del contador del programa.

    g) Direccionamiento relativo al contador de programa con índice: Utiliza como desplazamiento el resultado de sumar un número fijo al contenido de un registro de datos.
    Ejemplo: MOVE.B 24(PC,D0),D1 copia en el registro D1 el contenido de la posición de memoria cuya dirección es el resultado de sumar el número 24, el contador de programa y el contenido del registro D0.
     

 4.- Formatos de instrucciones
 
    Los formatos empleados para las instrucciones utilizan una o más palabras de 16 bits. La primera palabra especifica el código de la operación y en muchos casos la dirección de un operando. Las especificaciones para completar los operandos, cuando no es suficiente con una palabra van a continuación de la primera palabra. Cada operando utilizará como máximo dos palabras de ampliación, equivalente a una palabra larga, después de la del código de operación, por lo que la instrucción más larga del Motorola 68000 ocupa 5 palabras (10 bytes), siendo 1 para el código de instrucción, 2 palabras de ampliación para el operando origen, y 2 palabras de ampliación más para el operando destino.
    La información que identifica la situación exacta del operando, denominada dirección efectiva, se codifica en los formatos de instrucción mediante dos campos, siendo uno el modo de direccionamiento (MD) y el otro el de registro. Cada campo tiene un tamaño de 3 bits y se incluyen en la primera palabra de instrucción. El campo MD identifica el modo de direccionamiento empleado y el campo CR indica el registro empleado para obtener la dirección del operando. A veces se utilizan las palabras de ampliación ya que la dirección efectiva requiere incluir más información sobre la situación del operando en la palabra de instrucción.
 
 5.- Instrucciones condicionales
 

    Al realizar operaciones matemáticas existe la posibilidad de desbordamiento, por lo que se realiza un test automáticamente,  quedando el resultado almacenado en un registro de control, dedicado especialmente a tal efecto, denominado registro de código de condición (CCR), pudiendose leer mediante la instrucción MOVE. Este registro consta de 5 flags que se almacenan en los 5 bits menos significativos del registro de estado (SR).
    Estos  5 bits tienen las siguientes denominaciones, ordenadas desde el bit menos significativo:
 
        - C indicador de acarreo o carry flag: indica el valor del bit de acarreo de la posición más significativa del  resultado de una operación, poniendose a 1 si existe desbordamiento.
        - V indicador de desbordamiento o overflow flag: indica si en el resultado de una operación en complemento a 2 existe desbordamiento, poniendose a 1.
        - Z es el indicador de cero o zero flag, poniendose a 1 cuando sea 0 el resultado de una operación aritmetica o lógica.
        - N es el indicador de número negativo o negative flag, poniendose a 0 si es positivo y a 1 si es negativo el signo del resultado de una operación en complemento a 2.
        - X es el indicador extendido o extended flag que funciona de la misma manera que C, pero unicamente con operaciones aritméticas o de desplazamiento.
 
 6.- Entrada/Salida

    Los computadores disponen de unos registros especiales, denominados puertos de E/S o I/O en inglés para poder comunicarse con el exterior. El Motorola 68000 consta de tres puertos de este tipo en las siguientes direcciones de memoria:
                    - FFF000   de  E
                    - FFF002   de  S
                    - FFF004   de  E/S
 

 7.- Gestión de Subrutinas
 

     Una subrutina es un conjunto de instrucciones que realizan una tarea concreta, que no puede ser ejecutada directamente sino que debe ser llamada por un programa principal. Esta subrutina denominada también subprograma, procedimiento o simplemente rutina se comienza a ejecutar cuando es llamada por el programa principal, desde la primera instrucción. Cuando se ha llegado a la última instrucción, se vuelve a ejecutar la siguiente instrucción del programa principal anterior a la invocación de la subrutina.
    La gestión de las subrutinas se realiza mediante una estructura de almacenamiento de tipo de pila. El espacio en memoria que se reserva para la pila se define a partir de dos direcciones, la dirección de la posición inicial o fondo de la pila y la dirección de la posición máxima permitida o valor máximo que puede alcanzar la cima de la pila.
    El puntero de pila indica la posición de la cima de la pila, utilizando un registro de direcciones denominado SP (stack pointer) y que es el A7.