El Motorola 68000 es un microprocesador diseñado en los años 80, pero cuya potencia y características fueron determinantes para que se usara en ordenadores como los Amiga, los Atari, los Sun, las familias de Macintosh, y en consolas de videojuegos como la Neo-Geo y la Mega-Drive. Actualmente este micro está completamente anticuado, pero su uso sigue vigente en sistemas empotrados, como por ejemplo algunas PDAs.El 68000 dió origen a toda una familia de microprocesadores: 68010, 68020… que mantenían la compatibilidad introduciendo progresivas mejoras. En este documento no se van a tener en cuenta estas diferencias y sólo se explicarán los fundamentos de la famila.
Características principales
- Lo primero que cabe destacar es que sus registros son de 32 bits, que para la epoca era descomunal comparado con los 8 bits con los que trabajaban los procesadores de entonces.
- Su otra característica principal es que está preparado para multitarea, ya que posee dos modos de ejecucion, el modo usuario y el modo supervisor. Este último esta destinado para programar las rutinas del nucleo de un sistema operativo, teniendo los dos modos de ejecución espacios de pila disjuntos.
Registros
Estos son los registros presentes en el motorola 68000:
D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 |
A0 | A1 | A2 | A3 | A4 | A5 | A6 | SSP |
PC | SR | USP |
La explicación de los registros:
-
- D0-D7: Registros de datos.
- A0-A6: Registros de direcciones.
- SSP, USP: Son los punteros de pila del modo supervisor y del modo usuario respectivamente. Nos referimos a ellos directamente con A7, seleccionando el micro cual es el que corresponde segun el estado en el que nos encontremos. Los punteros de pila apuntan al elemento que está en el tope de la pila, y ésta crece hacia abajo, es decir que para introducir un elemento en la pila hay primero que decrementar el puntero de pila correspondiente y luego poner el dato en la posición a donde apunta.
- PC: Contador de programa, es un puntero a la posición de la memoria con la siguiente instrución a ejecutar.
- SR: Registro de estado, su composicion por bits es la siguiente:
T | S | I2 | I1 | I0 | X | N | Z | V | C |
- Bits aritméticos (X N Z V C): Bits que se activan según el resultado de la última operacion aritmética.
- Máscara de interrupciones (I2 I1 I0): Sólo pueden entrar las interrupciones de nivel menor que la máscara.
- Bit de modo Supervisor (S): 1 si estamos en modo supervisor.
- Bit de modo Traza (T): Para cuando se depuran programas y se va ejecutando paso a paso.
Formato de las instrucciones
Las instrucciones del ensamblador del 68000, estan formadas por un mnemónico y dos operandos. Estos dos últimos van separados por una coma y sin ningún espacio en medio:
etiqueta: mne.x op1,op2
Donde ‘mne’ es el nombre del nemónico y a diferencia de otros muchos ensambladores, op1 es el operando origen y op2 es el operando destino. El ‘.x’ es soportado en la mayoria de las instrucciones del repertorio y puede ser:
- .B – Si la instrucción se refiere a bytes.
- .W – Si la instruccion realiza su efecto sobre palabras (2 bytes).
- .L – Si la instrucción se refiere a palabras largas (4 bytes).
Para indicar un valor en hexadecimal debemos precederlo de un ‘$’. Las etiquetas pueden ser especificadas incluyendo su nombre al principio de la línea seguido por ‘:’ y nos podremos referir a ellas como si fueran posiciones de memoria.
Tipos de operandos
Los tipos de operandos admitidos por las instrucciones pueden ser:
- Registros: Como los de direcciones (Ax), los de datos (Dx), el contador de programa (PC) o el registro de estado (SR). Para referirnos al puntero de pila de modo usuario cuando estamos en modo supervisor usaremos USP.
- Valores inmediatos: Van precedidos por el símbolo ‘#’ e indica directamente el valor que lo sigue. (Ej: #23 ).
- Valores directos: Dados por la dirección de memoria a la que queremos acceder. (Ej: 23 ).
- Indexados: Dados por un desplazamiento al que le sumamos un registro. (Ej: 23(A0) ).
- Relativo a contador de programa: Data una posicion calcula su desplazamiento con respecto al PC y lo ensambla en las instrucción. (Ej: bra 23(PC) ensambla un salto a la posición 23).
- Indirecto a registro con índice: A un valor dado por un registro de direcciones, le sumamos uno de datos y un desplazamiento. (Ej: 23(A0,D0.w) Quiere decir (A0 )+ D0.w + 23).
Ha de notarse que cada instrucción sólo soporta un determinado tipo de operandos, y no todos ellos.
Repertorio de instrucciones
El repertorio completo de las instrucciones de la familia del 68000 puede ser conseguido de Motorola.
Excepciones
Las excepciones son un mecanismo por el cual el microprocesador interrumpe el flujo de un programa para saltar a una subrutina (la rutina de servicio de la excepción), donde se ejecutan las acciones asignadas a esta excepción y se vuelve a donde se había dejado la ejecución del programa. Estas rutinas de excepción se atienden en modo supervisor y se vuelve de ellas con la instrucción RTE.
La tabla de excepciones es el lugar donde se guarda para cada excepción se guarda el vector, que es un valor de 4 bytes con el PC del comienzo de la subrutina. Si tenemos el número de un vector, para calcular su posición en memoria basta con multiplicar por 4. Las excepciones pueden ser clasificadas en internas y externas. Dentro de las internas nos encontramos con:
- Reset: Cuando se resetea el micro.
- Error de Bus: Producido cuando ponemos en el bus de direcciones una direccion no válida.
- Interrupciones: Originadas por los periféricos. í‰stas a su vez pueden ser Vectorizadas, cuando el elemento externo pone el vector de interrupción o Autovectorizadas cuando el vector está puesto en la tabla de excepciones.
Y las internas son las siguientes:
- Traza: Generada tras la ejecucion de cada instrucción si nos encontramos en modo traza.
- Errores: provocada por una instrucción ilegal, por una división por 0, o por una violación de privilegio.
- De programa: Dentro de estas nos encontramos los traps, o llamadas al sistema, el emulador de línea o la instrucción CHK.
Cuando se salta a una excepción se mete en la pila primero el PC (4 bytes) y luego el SR (2 bytes), en algunas excepciones se apilan más cosas, como en la de error de bus. El PC que se introduce en la pila es el puntero a la instrucción siguiente a la que , salvo en la excepción de emulación de línea, donde se carga el puntero a la instrucción actual.
Emulación de Línea
Esta es una excepción usada para emular instrucciones que no se encuentran en el repertorio del microprocesador, como por ejemplo rutinas de operaciones con números en coma flotante.
Hay dos interrupciones de emulación de línea: la $AA (vector 10) y la $FF (vector 11), este byte es por el que comienzan las instrucciones que al ser encontradas por el microprocesador originan una excepción de emulación de línea.
Al entrar en la rutina de servicio recibimos en la pila el PC con la posición donde se encontró el byte $AA o $FF. A partir de esta posicion recogemos el resto de la instruccion y tras llevar a cabo las acciones pertinentes, debemos substituir el PC de la pila por un nuevo PC apuntando a la instrucción siguiente.
Consejos, Trucos…
- Situar todo el código en posiciones superiores a la $1000, porque hasta esa posición hay vectores de interrupción y situar código ahi puede provocar que el micro haga cosas raras.
- Hay instrucciones que no nos dejan usar cualquier dirección efectiva, pero para conseguir pasar cualquier direccion efectiva a un registro de dirección para usar con la primera instrucción podemos usar la instruccion LEA Dx,
- Dentro de una rutina de servicio de una interrupcion de nivel 7, tocar la máscara de interrupción del SR origina una interrupción de nivel 7, lo que puede provocar una recursividad “infinita”, hasta que se desborde la pila.
- Para modificar SR dentro de una rutina de servicio de una excepción y que permanezca modificado al volver, es preciso modificar los bytes correspondientes a SR introducidos en la pila.
- las instrucciones JMP y BRA se diferencian en que JMP almacena la dirección de salto de forma absoluta, y BRA de forma relativa, por lo que si usamos instrucciones de tipo BRA, podremos mover el programa de posición en la memoria y seguirá funbcionando, con lo que tendremos un programa reubicable.
Directivas del Compilador
Estas son las directivas presentes en la mayor parte de los compiladores para el 68000:
- “DC x ” Introduce en la posición en la que se está ensamblando el valor x.
- “DS x ” Reserva x posiciones de memoria.
- “ORG x ” Sigue ensamblando a partir de la posición x.
- “END” Indica la finalización de un programa.
- “x EQU y” Substituye las ocurrencias del símbolo x por el simbolo y.