Sinclair QL Programación Avanzada
Anterior Siguiente

2. El microprocesador 68008

2.1 Introducción para los principiantes en Código Máquina

La mayoría de la gente aprende el BASIC como primer lenguaje de programación. Como lenguaje, el BASIC (y el SuperBASIC) es bastante fácil de entender y de dominar por los principiantes. Si se cometen errores en BASIC, éste sabe lo que está mal y nos advierte de ello con comentarios como 'No completado'.

Hasta cierto punto, el BASIC es suficiente para la mayoría de las tareas, sin embargo, la mayoría de los programadores llegan a una fase en la que el BASIC detiene sus progresos. Muchas ideas no pueden llevarse a cabo en BASIC debido a la velocidad de operación que requieren para operar adecuadamente. Los juegos de estilo 'Arcade' son un claro ejemplo de esto, ya que los gráficos en tiempo real requieren generalmente gran velocidad.

Una vez que hemos llegado a este punto, necesitamos el código máquina. Esta nueva forma de programación es varias veces más rápido que el BASIC. Como todos sabemos, requerimos más tiempo para leer un libro escrito en una lengua extranjera que el que nos llevaría uno escrito en la nuestra propia. Para el QL, el BASIC es una lengua extranjera y el código máquina es la lengua propia.

Para comprender cómo puede tener el QL un lenguaje propio más fundamental que el BASIC, necesitamos conocer algunas cosas sobre la estructura interna del QL.

En el interior de cada QL hay un potente microprocesador llamado 68008. Este es el cerebro del ordenador, y le proporciona toda su potencia. En términos simples, el 68008 toma las instrucciones de la memoria (una cada vez) y realiza algunas funciones que están directamente relacionadas con la instrucción. Esto puede implicar la lectura de datos, realizar sumas, salvar datos en memoria o cualquier otra tarea simple. Una vez que ha ejecutado una instrucción, el 68008 toma la siguiente, y así sucesivamente en una secuencia sin fin (hasta que se apaga el ordenador).

Aunque a la memoria se accede por octetos (bytes), cada instrucción ocupa una palabra (dos octetos). Esta palabra contiene toda la información necesaria para que el 68008 pueda decidir lo que debe hacer a continuación. Ya que es sumamente difícil para el programador memorizar los códigos de cada una de las instrucciones que se pueden construir con 16 bits (hasta 65536 códigos diferentes), existe un lenguaje especial de alto nivel (escrito en código 68008) que convierte los códigos fácilmente comprensibles para los humanos (como 'ADD') en los que entiende el 68008. El programa que lo hace se llama ensamblador.

La programación en código máquina con un ensamblador es sustancialmente diferente del BASIC. Para empezar, solamente se pueden utilizar dieciséis variables. Éstas se llaman registros y tienen 32 bits de longitud. Ocho de ellos se usan para almacenar direcciones de memoria, y se llaman registros de dirección. Los otros ocho se usan generalmente para almacenar datos, y se llaman registros de datos. ¡Imagínese lo difícil que sería programar en BASIC con sólo 16 variables! Para obviar esta limitación de almacenamiento, los registros se pueden almacenar en memoria y recuperarlos posteriormente cuando se necesiten. El microprocesador puede, también, ejecutar operaciones aritméticas, pero no de coma flotante como en BASIC. Tenemos suma, resta, multiplicación y división de enteros simples, además de las operaciones lógicas como AND, OR, etc. También disponemos de instrucciones para saltar de una parte a otra del programa en código máquina. En definitiva, se ha creado un potente rango de instrucciones en el 68008, para permitir la creación de programas bastante sofisticados. El intérprete BASIC es también un programa en código máquina.

El código máquina difiere considerablemente del BASIC, principalmente en el manejo de errores. Si a una instrucción 'SAVE' se le da una dirección incorrecta, probablemente la ejecutará en medio de un programa. Si se ejecuta este programa modificado, normalmente hará fallar el QL. La única posibilidad de recuperarlo será el botón de RESET, en cuyo caso perderemos el programa y los datos.

En este punto podría pensar que no es muy interesante programar en código máquina si se nos puede presentar este tipo de problemas. Esto no es cierto, si tenemos en cuenta la enorme diferencia de velocidad con que podemos contar, aparte que muchas de las facilidades del QDOS son únicamente accesibles desde el código máquina. Una de las más notables es la multitarea, que nos permite ejecutar varios programas diferentes al mismo tiempo. Hay muchas otras ventajas que podrá apreciar después de haber leído este libro.

Para resumir, el microprocesador 68008 ejecuta programas escritos en código máquina. Estos se ejecutan mucho más rápidamente que en BASIC, pero son más complicados de escribir. Solamente se pueden utilizar todas las ventajas del QL con programas en código máquina.

El QDOS es una colección de subrutinas que pueden ser utilizadas por el usuario en código máquina. Estas rutinas proporcionan una amplia selección de funciones estándar, lo que significa que el programador no tiene por que escribir subrutinas una y otra vez. Una de las cosas que se pueden hacer a través de las subrutinas del QDOS es escribir letras en la pantalla. Si un programador lo quiere hacer por si mismo, necesitaría almacenar en memoria la estructura por puntos de cada carácter, copiarlo a su lugar de la pantalla y ejecutar algunas comprobaciones. Esto necesitará de varias operaciones, como comprobar si el carácter es el último de la línea (si lo es, el siguiente carácter se debe escribir en la línea siguiente) etc. Usted puede apreciar por si mismo lo tedioso que es programar de esta manera. Afortunadamente, el QDOS tiene una rutina que lo hace por usted. Sólo hay que pasarle el código del carácter, el QDOS hace el resto. Además de estas rutinas simples, el QDOS soporta otras funciones más complejas. Cubre operaciones como salvar datos en microdrive, soportar la multitarea y reservar memoria. Todas estas posibilidades se exploran con profundidad en los siguientes capítulos.

Para comprender como se accede a las diferentes rutinas del QDOS, necesitamos conocer como opera el 68008. El resto del capítulo está dedicado a este punto.

2.2 Estructura interna del 68008



Figura 2.1 - Estructura interna de 68008

Internamente, el microprocesador consta de varios registros. Estos se ilustran en la figura 2.1. Los registros se pueden dividir en cinco grupos funcionales:

2.2.1 Registros de datos

Hay ocho registros de datos, cada uno de 32 bits de longitud (una 'palabra larga'). La mayoría de las operaciones de almacenamiento y transferencia de datos se realizan con este juego de registros. Se pueden cargar datos dentro de ellos desde otro registro, memoria o dispositivos periféricos como los microdrives. Una vez cargados los datos, se pueden manipular de diferentes formas, como sumarles algún valor. Los datos pueden volver a ser almacenados en memoria o mandados a un periférico.

2.2.2 Registros de dirección

Hay ocho registros generales de dirección (el octavo es especial, porque se usa normalmente como apuntador de la pila – ya lo veremos con más detalle en la siguiente sección). Estos registros de dirección se usan para ayudar en el movimiento de datos. Contienen las direcciones desde las que se toman los datos y en las que se almacenan. Los datos tomados de memoria se pueden cargar tanto en los registros de datos como en los de dirección. También se pueden usar brevemente en algunas operaciones (para sumarlo a alguno de los registros de datos). Los datos pueden ser salvados desde cualquiera de 1os registros a la posición de memoria apuntada por el registro de dirección adecuado. Hay varias formas de apuntar los registros de dirección a los datos en menoría. De todas ellas se habla en la sección 2.5 donde se explican los modos de direccionamiento.

2.2.3 Apuntadores de pila

El octavo registro de dirección (A7) tiene una función especial. Actúa como el apuntador de pila. Una pila es un área de memoria en la que se apilan los datos y se toman posteriormente en orden inverso. El primer ítem que se almacena en la pila es el último que se toma – igual que una pila de cajas. A7 mantiene el apuntador a la dirección, del último ítem almacenado, y se actualiza automáticamente a medida que se almacenan o se toman datos.

Como habrá observado, hay dos apuntadores de pila en el sistema. Solamente puede estar activo uno de ellos a un mismo tiempo. El otro es invisible. El que está seleccionado viene determinado por el estado privilegiado del procesador. Hay dos niveles de privilegio. El más bajo está presente siempre que el 68008 está en modo USUARIO. La mayoría de los programas escritos por el usuario se ejecutan en este estado. Por lo tanto al meter o sacar datos de la pila, lo hacemos en la pila del usuario. El estado de privilegio más alto es el de SUPERVISOR. La mayoría de las rutinas del QDOS se ejecutan en este estado. En este nivel se puede conseguir mayor potencia. Por ejemplo, la instrucción de RESET del sistema solo se puede ejecutar en modo supervisor. El tener dos niveles de seguridad garantiza que el sistema no se pueda interrumpir por un simple programa de usuario (aunque no hay garantía de que no lo pueda hacer). Se pueden usar cualquiera de los otros registros de dirección para usarlos como apuntadores de pila.

2.2.4 El contador de programa

Este registro de 32 bits no es accesible directamente como los de datos o de direcciones. Mantiene la dirección de la instrucción del programa que se está ejecutando en cada momento. Es algo así como el recordar el número de línea BASIC que se está ejecutando. Si se ejecuta un salto a otra dirección del programa, este registro se cambia de acuerdo con la dirección de la instrucción que se debe ejecutar. Se puede usar el contador de programa (o PC) en cálculo de direcciones, como 'carga los datos almacenados 20 octetos después de esta instrucción'. Esto es bastante útil para escribir programas reubicables (los que se pueden ejecutar en cualquier dirección de la memoria).

2.2.5 El registro de estado

Este registro de 16 bits se divide en dos mitades, el octeto del supervisor y el de usuario. Solo se pueden modificar directamente en estado supervisor.

En el octeto de usuario, solamente se usan los cinco bits inferiores. Estos marcan los estados que ocurren normalmente después de ciertas instrucciones aritméticas. Están al nivel de 'aritmética de escuela primaria'. Si usted suma dos números, cuyo resultado sea demasiado largo para caber en un registro de datos, se pondrá el bit de acarreo. Si se resta un número de sí mismo, se pondrá el indicador de cero, y así sucesivamente. Las otras instrucciones que se registran son rebosamiento (V), negativo (N) y extendido (X).

En estado supervisor se usan solo cinco bits. Un bit indica el estado del procesador (usuario o supervisor). Otro bit indica si el modo 'trace' está activo o no ('trace' se usa para ejecutar las instrucciones de un programa, de una en una, cuando se está desarrollando). Los tres bits que quedan contienen la prioridad de interrupción. La prioridad se puede poner a uno de ocho niveles. El nivel 0 es el más bajo y el 7 el más alto. Todas las interrupciones que tengan una prioridad mayor que la especificada en este registro, no serán enmascaradas. Las interrupciones de nivel 7 no se pueden enmascarar.

2.2.6 Interrupciones

Las interrupciones son generadas por dispositivos externos de 'hardware'. El circuito de vídeo del QL, genera interrupciones 50 veces por segundo. La llegada de la señal al 68008 hace que sucedan varias cosas. Se suspende la operación que se está ejecutando en ese momento (asumiendo que la prioridad de la interrupción sea lo suficientemente alta), y el 68008 salta a ejecutar la rutina de servicio de interrupciones. Antes de entrar en esta rutina, debe salvar el contenido de todos los registros, realizar las funciones necesarias para dar servicio a la interrupción, restaurar los registros y devolver el control. El efecto aparente de la interrupción es que se han realizado algunas funciones, pero sin afectar seriamente a la operación que estaba ejecutando el programa, solamente retrasándola unos pocos microsegundos. Las interrupciones se usan generalmente para dar servicio a dispositivos que requieren una atención inmediata. Si no son atendidos inmediatamente, se pueden perder algunos datos (ej. la cinta del microdrive puede pasar de largo los datos esperados).


2.3 Organización de datos en la memoria



Figura 2.2 - Organización de datos en la memoria

El 68008 puede realizar operaciones en memoria con cuatro tipos de datos diferentes. Estos son bit, octetos, palabras y palabras largas, que consisten en 1, 8, 16 y 32 bits respectivamente. En la figura 2.2 se pueden ver los diferentes modos en que se organizan los datos en la memoria.

NOTA: Las instrucciones están formadas siempre por palabras, y estas palabras deben empezar en una dirección par. Algunas veces, al almacenar un octeto de datos, es necesario desperdiciar el octeto que hay después de los datos y antes de la siguiente instrucción.

2.4 TRAPS y procesos de excepción

En el 68008 pueden ocurrir varios tipos de excepciones. Estas pueden dividirse en dos categorías según sean generadas interna o externamente. Como ya hemos visto, las interrupciones pertenecen a las excepciones generadas externamente. Las excepciones internas se producen mediante la ejecución de una instrucción TRAP, TRAPV, CHK o DIV.

Cuando ocurre cualquiera de estas excepciones, se ejecuta una llamada a la rutina de servicio adecuada. La dirección de esta rutina de servicio (una por cada excepción) está contenida en el primer kilobyte de memoria (ver figura 2.3).

Las excepciones más comúnmente usadas son las interrupciones (una cada 20 ms. para invocar al planificador) y los TRAPS para invocar a las subrutinas del sistema. Los parámetros que se han de pasar a estas subrutinas deben cargarse en los registros. En D0 cargamos el número de la subrutina requerida, y después generamos un TRAP #N. Las partes finales de este libro explican lo que hace cada una de estas subrutinas. Hay 16 TRAPS, pero sólo se pueden usar 5 para el sistema operativo. Estos realizan las siguientes funciones:

TRAP #0: Pasa de modo usuario a modo supervisor
TRAP #1: Se encarga del manejo de recursos del sistema
TRAP #2: Se encarga de la asignación de entrada/salida
TRAP #3: Se encarga de la utilización de entrada/salida
TRAP #4: Se usa en conjunción con el BASIC, TRAP 2 y 3

2.5 Direcciones efectivas

Las instrucciones del 68008 operan con datos en los registros o en memoria. Por lo tanto es necesario tener bien definida la forma de direccionar los datos. Para ello se ha incluido un potente grupo de modos de direccionamierto que se acoplan a la mayoría de las aplicaciones. Nos solemos referir a estas direcciones como direcciones efectivas. Algunos modos son aplicables a ciertos tipos de argumentos solamente. Por ejemplo, puede ser inadecuado usar un registro de datos como apuntador de pila. En la descripción de los modos, que viene a continuación, se mencionan estas restricciones. Disponemos de los siguientes modos:

2.5.1 MODOS DE REGISTRO DIRECTO

En estos modos de direccionamiento efectivo, el operando (el dato con el que vamos a operar) debe estar en uno de los dieciséis registros multifunción.

2.5.1.1 Registro de datos directo

El operando está en el registro de datos especificado por la dirección efectiva.

2.5.1.2 Registro de dirección directo

El operando está en el registro de dirección especificado por la dirección efectiva.

2.5.2 MODOS DE DIRECCIONAMIENTO DE MEMORIA

En estos modos de direccionamiento efectivo, el operando está en memoria y disponemos de dirección.

2.5.2.1 Registro de dirección indirecto

La dirección del operando está en el registro de dirección especificado. Está. clasificada como referencia de datos, excepto en las instrucciones JMP y JSR.

2.5.2.2 Registro indirecto con post-incremento

La dirección del operando está cargada en el registro (como en direcionamiento por registro indirecto). Después de usar la dirección del operando, se incrementa en uno, dos o cuatro, dependiendo de que la longitud del operando sea un octeto, una palabra o una palabra larga de longitud. Si el registro de dirección es el apuntador de la pila y el tamaño del operando es un octeto, la dirección se incrementa en dos en vez de uno, para mantener el apuntador de la pila en frontera de palabra. Está clasificada como referencia de datos.

2.5.2.3 Registro indirecto con post-decremento

La dirección del operando está cargada en el registro (come en direccionamiento por registro indirecto). Después de usar la dirección del operando, se decrementa en uno, dos o cuatro, dependiendo de la longitud del operando sea un octeto, una palabra a una palabra larga de longitud. Si el registro de dirección es el apuntador de la pila y el tamaño del operando es un octeto, la dirección se decrementa en dos en vez de uno, para mantener el apuntador de la pila en frontera de palabra. Está clasificada como referencia de datos.

2.5.2.4 Registro de dirección indirecto con desplazamiento

Requiere una palabra de extensión. La dirección del operando se calcula añadiendo al registro de dirección, el entero de desplazamiento de 16 bits, con signo extendido, contenido en la palabra de extensión. Está clasificada como referencia de datos, excepto en las instrucciones JMP y JSR.

2.5.2.5 Registro de dirección indirecto con índice

Requiere una palabra de extensión. La dirección del operando se calcula sumando al registro de dirección, el entero de desplazamiento con signo extendido, contenido en los 8 bits inferiores de la palabra de extensión, más el contenido del registro de índice. Está clasificada como referencia de datos, excepto en las instrucciones JMF y JSR.

2.5.3 MODOS ESPECIALES DE DIRECCIONAMIENTO

Para especificar el modo especial de direccionamiento, se usa la dirección efectiva en vez del número de registro.

2.5.3.1 Dirección absoluta corta

Requiere una palabra de extensión. La dirección del operando es la palabra de extensión. La dirección de 16 bits se extiende con signo antes de usarse. Está clasificada como referencia de datos, excepto en las instrucciones JMP y JSR.

2.5.3.2 Dirección absoluta larga

Requiere dos palabras de extensión. La dirección del operando se encuentra contenida íntegramente en las palabras de extensión. Está clasificada como referencia de datos, excepto en las instrucciones JMP y JSR.

2.5.3.3 Contador de programa con desplazamiento

Requiere una palabra de extensión. La dirección del operando se obtiene añadiendo el contenido de esta palabra de desplazamiento de 16 bits con signo extendido, al valor del contador de programa. Está clasificada como referencia de programa.

2.5.3.4 Contador de programa con índice

Requiere una palabra de extensión. La dirección del operando se obtiene añadiendo el desplazamiento de signo extendido contenido en los ocho bits inferiores de la palabra de extensión y el contenido del registro de índice, al contador de programa. Está clasificada como una referencia de programa.

2.5.3.5 Datos inmediatos

Requiere uno o dos octetos de extensión, dependiendo del tamaño de la operación.

Hay tres alternativas posibles:

  Operación de octeto El operando está en el octeto inferior de la palabra de extensión.
  Operación de palabra El operando es la palabra de extensión
  Palabra larga El operando está en las dos palabras de extensión que van a continuación

2.5.3.6 Referencia implícita

Algunas instrucciones hacen referencia implícita al contador de programa (PC), al apuntador de la pila del sistema (SP), al apuntador de la pila del supervisor (SSP), al apuntador de la pila de usuario (USP), o al registro de estado. Un grupo seleccionado de instrucciones pueden referirse al registro de estado mediante su dirección efectiva, estas son instrucciones privilegiadas.

2.6 Sumario del juego de instrucciones

Esta sección contiene una visión general del juego de instrucciones del 68008. Las instrucciones se pueden agrupar bajo ocho enunciados principales:

1. Movimiento de datos
2. Aritmética con enteros
3. Operaciones lógicas
4. Desplazamiento y rotación
5. Manipulación de bit
6. Decimal codificado en binario
7. Control de programa
8. Control del sistema

A continuación vamos a explicarlos más detalladamente. Hemos usado los siguientes códigos para indicar los tipos particulares de operandos:

An - Registro de dirección
Dn - Registro de datos
Rn - Registro de datos o de dirección
PC - Contador de programa
SR - Registro de estado
CCR - Códigos de condición
(octeto inferior del registro de estado)
SSP - Apuntador de pila. del supervisor
USP - Apuntador de pila del usuario
SP - Apuntador de pila activo (equivalente a A7)
X - Operación extendida (de los códigos de condición)
Z - Código de condición cero
V - Código de condición de rebosamiento
Inmediate data - Datos inmediatos de la instrucción
d - Desplazamiento de dirección
Source - Dirección efectiva de origen
Destination - Dirección efectiva de destino
Vector - Situación del vector de excepción

2.6.1 Operaciones de movimiento de datos

La instrucción MOVE permite transferir o almacenar datos. Los datos se pueden mover en unidades de octeto, palabra o palabra larga. Se pueden transferir datos de memoria a memoria, de memoria a un registro, de un registro a. memoria, o de un registro a otro. Las operaciones con registros de dirección solamente permiten operaciones de transferencia de palabra o de palabra larga. Además de las instrucciones generales de transferencia, hay varias instrucciones especiales de movimiento de datos. MOVEM mueve registros múltiples, MOVED mueve datos de los periféricos, EXG intercambia el contenido de registros, LEA carga una dirección efectiva, PEA introduce una dirección efectiva en la pila, LINK conecta la pila, UNLK desconecta la pila y MOVEQ mueve un octeto a la dirección especificada. Las operaciones de movimiento de datos se ilustran en la figura 2.4.



Figura 2.4 - Operaciones de movimiento de datos

2.6.2 Operaciones aritméticas con enteros

En el 68008 se soportan las cuatro operaciones aritméticas básicas, ADD (suma), SUB (resta), MUL (multiplicación) y DIV (división). Hay también una comparación aritmética CMP, limpiar CLR y negar NEG. La suma y la resta se pueden utilizar en operaciones de datos y de direcciones (pero deben tener una palabra o una palabra larga de longitud en el caso de direcciones).

Se pueden multiplicar y dividir operandos con signo y sin signo. La multiplicación de palabras produce una palabra larga en el resultado. Dividir una palabra larga por una palabra produce como resultado una palabra para el cociente y otra para el resto.

También tenemos una serie de instrucciones que permiten realizar operaciones de precisión múltiple y aritmética de tamaños mezclados. Estas instrucciones son: suma con extensión ADDX, resta con extensión SUBX, signo extendido EXT y negación binaria con extensión NEGX.

Se puede comparar el operando con cero mediante la instrucción TST (test). Esta hace que se pongan los códigos de condición como resultado de la operación. En la figura 2.5 tenemos un resumen de las operaciones de aritmética con enteros.



Figura 2.5 - Operaciones aritméticas con enteros

2.6.3 - Operaciones lógicas

Con las operaciones lógicas estándar AND, OR, EOR y NOT, se pueden manipular operandos de datos enteros de un octeto, una palabra o una palabra larga de longitud. Hay también un juego de instrucciones inmediatas equivalentes, ANDI, ORI y EORI, que permiten estas operaciones lógicas con cualquier tamaño de datos inmediatos. En la figura 2.6 tenemos un resumen de las operaciones lógicas.



Figura 2.6 - Operaciones lógicas

2.6.4 Operaciones de desplazamiento y rotación

Este grupo de operaciones permite el desplazamiento y giro de los bits dentro de un octeto, una palabra o una palabra larga (para registros - en memoria sólo se puede hacer con palabras).

El contador del desplazamiento se puede especificar en el registro de datos siempre que la operación se realice en un registro. Las operaciones en memoria sólo soportan desplazamientos y rotaciones de un bit.

Hay dos tipos de desplazamientos. Las instrucciones de desplazamiento aritmético son ASR y ASL. Las instrucciones lógicas son LSR y LSL, para desplazamiento a la derecha y a la izquierda respectivamente.

Las rotaciones se pueden hacer con o sin el bit de extensión en el bucle. Las instrucciones son ROXR, ROXL, ROR y ROL. En la figura 2.7 se puede ver como funcionan.



Figura 2.7 - Instrucciones de desplazamiento y rotación

2.6.5 Operaciones de manipulación de bits

Hay cuatro instrucciones de manipulación de bits; test de bit BTST, test y puesta de bits BSET, test y limpieza de bits BCLR y test y cambio de bits BCHG. Se pueden ver en la figura 2.8. Tenga en cuenta que la 'Z' se refiere al bit de 'cero', que es el bit 2 del registro de estado.


Figura 2.8 - Operaciones de manipulación de bits

2.6.6 Operaciones decimales codificadas en binario

Con los números decimales codificados en binario, se pueden realizar tres operaciones de precisión múltiple. Estas son: suma decimal con extensión ABCD, resta decimal con extensión SBCD y negación decimal con extensión NBCD. Estas instrucciones se pueden ver en la figura 2.9.


Figura 2.9 - Operaciones BCD

2.6.7 Operaciones de control de programa

Las operaciones de control de programa usan una serie de instrucciones de bifurcación condicionales e incondicionales, de salto y de retorno.

Las instrucciones condicionales pueden ser llamadas para bifurcar en cualquiera de las siguientes condiciones:

CC(HS) acarreo quitado LS menor o igual
CS(LO) acarreo puesto LT menor que
EQ igual MI menos
F falso NE no igual
GE mayor o igual PL más
GT mayor que T cierto
HI mayor VC sin rebosamiento
LE menor o igual VS rebosamiento

Instruction
Operation
Conditional
   BCC

   DBCC

   SCC

   Branch Conditionally (14 Conditions)
      8 and 16 Bit Displacement
   Test Condition, Decrement and Branch
      16 Bit Displacement
   Set Byte Conditionally (16 Conditions)

Unconditional
   BRA

   BSR

   JMP
   JSR
   Branch Always
      8 and 16 Bit Displacement
   Branch to Subroutine
      8 and 16 Bit Displacement
   Jump
   Jump to Subroutine
Returns
   RTR
   RTS
   Return and Restore Condition Codes
   Return from Subroutine

Figura 2.10 - Operaciones de control de programa

2.6.8 Operaciones de control del sistema

Bajo este título se agrupan una serie de instrucciones privilegiadas, de generación de TRAPS y otras que usan o modifican el registro de estado. Las diferentes opciones disponibles se pueden ver en la figura 2.11.

Instruction
Operation
Privileged
   ANDI to SR
   EORI to SR
   MOVE EA to SR
   MOVE USP
   ORI to SR
   RESET
   RTE
   STOP
   Logical AND to Status Register
   Logical FOR to Status Register
   Load New Status Register
   Move User Stack Pointer
   Logical OR to Status Register
   Reset External Devices
   Return from Exception
   Stop Proqram Execution
Trap Generating
   CHK
   TRAP
   TRAPV
   Check Data Register Against Upper Bounds
   Trap
   Trap on Overflow
Status Register
   ANDI to CCR
   EORI to CCR
   MOVE FA to CCR
   MOVE SR to EA
   ORI to CCR
   Logical AND to Condition Codes
   Logical EOR to Condition Codes
   Load New Condition Codes
   Store Status Register
   Logical OR to Condition Codes

Figura 2.11 - Operaciones de control del sistema

Vector
Number(s)
Address
Assignment
Dec
Hex
Space
0
0
000
SP
Reset Initial SSP
-
4
004
SP
Reset Initial PC
2
8
008
SD
Bus Error
3
12
00C
SD
Address Error
4
16
010
SD
Illegal instruction
5
20
014
SD
Zero Divide
6
24
018
SD
CHK Instruction
7
28
01C
SD
TRAPV Instruction
8
32
020
SD
Privilege Violation
9
36
024
SD
Trace
10
40
028
SD
Line 1010 Emulator
11
44
02C
SD
Line 1111 Emulator
12
48
030
SD
(Unassigned, Reserved)
13
52
034
SD
(Unassigned, Reserved)
14
56
038
SD
(Unassigned, Reserved)
15
60
03C
SD
Uninitialized Interrupt vector
16-23
64
04C
SD
(Unassigned, Reserved)
 
95
05F
 
24
96
060
SD
Spurious Interrupt
25
100
064
SD
Level 1 Interrupt Autovector
26
104
068
SD
Level 2 Interrupt Autovector
27
108
06C
SD
Level 3 Interrupt Autovector
28
112
070
SD
Level 4 Interrupt Autovector
29
116
074
SD
Level 5 Interrupt Autovector
30
120
078
SD
Level 6 Interrupt Autovector
31
124
07C
SD
Level 7 Interrupt Autovector
32-47
128
080
SD
TRAP Instruction Vectors
 
191
08F
 
48-63
192
0C0
SD
(Unassigned, Reserved)
 
255
0FF
 
64-255
256
100
SD
User Interrupt Vectors
 
1023
3FF
 

Figura 2.12 - Tabla de Vectores


Anterior Tabla de contenidos Siguiente
Introducción   QDOS - Visión general