Story Transcript
E. U. DE INFORMÁTICA
UNIVERSIDAD POLITÉCNICA DE MADRID
ARQUITECTURA DE COMPUTADORES Departamento de Informática Aplicada
Motorola 68000 Entorno de Prácticas Octubre-2006
CONTENIDO 1.
INTRODUCCIÓN .......................................................................4
2.
INSTALACIÓN DEL SIMULADOR SIM68000...............................5
2.1
Instalación desde Sim68000.zip........................................................ 5
2.2
Instalación desde el Instalador Automático .................................... 5
3.
ENSAMBLADO DE PROGRAMAS ...............................................8
4.
MANUAL DE USUARIO DEL SIM68000 ......................................9
4.1 Pantalla Principal ............................................................................... 9 4.1.1 Menú Archivo .............................................................................. 13 4.1.2 Menú Edición .............................................................................. 13 4.1.3 Menú Ejecución .......................................................................... 14 4.1.4 Menú Configuración.................................................................... 14 4.1.5 Menú Ver .................................................................................... 15 4.2 Mapa de Memoria ............................................................................. 16 4.2.1 Menú Archivo .............................................................................. 17 4.2.2 Menú Editar ................................................................................ 17 4.2.3 Menú Ver .................................................................................... 17 4.3
Configuración de Dispositivos en SIM68000 ................................. 18
4.4
Consola de Comandos .................................................................... 20
4.5
Teclas de Acceso Rápido................................................................ 23
5.
DESCRIPCIÓN Y PROGRAMACIÓN DE LOS DISPOSITIVOS......24
5.1 RAM................................................................................................... 24 5.1.1 Descripción ................................................................................. 24 5.1.2 Configuración.............................................................................. 24 5.2 DUART M68681................................................................................. 25 5.2.1 Descripción ................................................................................. 25 5.2.2 Configuración.............................................................................. 31 5.3 Timer M68230 ................................................................................... 32 5.3.1 Descripción ................................................................................. 32 5.3.2 Configuración.............................................................................. 35 5.4 DMA................................................................................................... 36 5.4.1 Descripción ................................................................................. 36 5.4.2 Configuración.............................................................................. 38 6.
ENSAMBLADOR DEL MOTOROLA 68000 ................................39
6.1 Formato de la línea fuente............................................................... 39 6.1.1 El campo ETIQUETA .................................................................. 39 6.1.2 El campo OPERACIÓN .............................................................. 39 6.1.3 El campo OPERANDO ............................................................... 39 6.1.4 El campo de COMENTARIOS .................................................... 40 6.1.5 Símbolos ..................................................................................... 40 6.1.6 Expresiones ................................................................................ 40
Entorno de Prácticas 68000
Pag.-2
6.1.7 6.1.8 6.1.9
Operandos en expresiones ......................................................... 40 Operadores en expresiones........................................................ 41 Especificaciones del modo de direccionamiento......................... 41
6.2 Algunos Detalles del ensamblador................................................. 43 6.2.1 Instrucciones de salto ................................................................. 43 6.2.2 La instrucción MOVEM ............................................................... 43 6.2.3 Instrucciones rápidas (MOVEQ, ADDQ y SUBQ) ....................... 43 6.3 Directivas del ensamblador ............................................................ 44 6.3.1 ORG - Establecer el origen ......................................................... 44 6.3.2 EQU – Igualar Símbolo ............................................................... 44 6.3.3 SET – Establecer Símbolo .......................................................... 44 6.3.4 REG – Rango de Registros ........................................................ 44 6.3.5 DC – Definir Constante ............................................................... 45 6.3.6 DCB – Definir Bloque Constante................................................. 45 6.3.7 DS – Definir Almacenamiento ..................................................... 46 6.3.8 END – Final del fichero fuente .................................................... 46 6.3.9 INCLUDE – Inclusión .................................................................. 47 6.4 Utilización ......................................................................................... 47 6.4.1 Línea de comandos .................................................................... 47 6.4.2 Formato del fichero de listado..................................................... 48 6.4.3 Formato del fichero de código objeto.......................................... 48
Entorno de Prácticas 68000
Pag.-3
1. INTRODUCCIÓN Sim68000 es un simulador de Motorola 68000 con fines didácticos. Está programado especialmente para satisfacer las necesidades de la asignatura Arquitectura de Computadores de la Escuela Universitaria de Informática de la UPM. Este simulador ha sido diseñado y programado por Jorge Pardo Serrano e Ignacio Martínez Rivera, como Trabajo Fin de Carrera de la Escuela Universitaria de Informática de la Universidad Politécnica de Madrid
Este simulador está desarrollado de forma que sea sencillo ampliarlo en caso de que las prácticas de la asignatura lo requieran, permitiendo programar nuevos dispositivos como módulos independientes sin que sea necesario conocer a fondo la estructura interna de la aplicación. También posee un interfaz muy intuitivo y es fácil de utilizar, de modo que los alumnos no tengan necesidad de aprender el uso de una herramienta compleja al enfrentarse a las prácticas de la asignatura. Así mismo está dotado de una simulación realista que permite que los dispositivos se comporten de la manera esperada en todas las ejecuciones de los programas, sin que ocurran anomalías aleatorias. En este simulador, además del propio procesador Motorola 68000 y el dispositivo de la RAM, que es imprescindible para la carga de programas, también se incluyen los dispositivos DUART M68681, Timer M68230 y un dispositivo genérico de DMA.
Entorno de Prácticas 68000
Pag.-4
2. INSTALACIÓN DEL SIMULADOR SIM68000 En este capítulo se encuentran las instrucciones para poder instalar correctamente el simulador. Se explicarán las 2 formas existentes de instalarlo, desde un archivo ZIP comprimido y usando su propio instalador. Para el correcto funcionamiento del simulador es necesario tener instalado Windows 95 o superior. El PC debe ser un Pentium 200 con 64 MB o superior y se debe tener aproximadamente unos 10 MB de espacio libre en el disco duro. También se explica como instalar el compilador 68kasm incluido en el CD que acompaña a este libro.
2.1 Instalación desde Sim68000.zip El archivo Sim68000.zip contiene el simulador y los ficheros necesarios para su funcionamiento. Para instalar el simulador simplemente se debe descomprimir el contenido del fichero en una carpeta cualquiera en el disco duro. Para descromprimir el fichero se pueden utilizar programas como WinRAR, WinZip o WinACE. En el caso de Windows XP/2003 el propio sistema operativo trae soporte para los ficheros .zip, en este caso no haría falta ningún programa adicional.
Una vez descomprimidos los ficheros, para abrir el simulador se deberá ejecutar el fichero sim68000.exe.
2.2 Instalación desde el Instalador Automático Este es el método más sencillo de instalación, para arrancar el instalador del simulador simplemente es necesario introducir el CD-ROM que acompaña a este libro en la unidad y se abrirá la pantalla del instalador. En el caso de que no se abra automáticamente, se deberá ejecutar el fichero Setup.exe que se encuentra en la carpeta raíz del CD-ROM. 1) Una vez abierto el programa de instalación se verá esta pantalla:
Entorno de Prácticas 68000
Pag.-5
2) Simplemente se debe pulsar el boton “Siguiente”. Con lo cual aparecerá esta pantalla:
En esta pantalla se nos pregunta donde queremos instalar el simulador, además de ofrecernos la posibilidad de instalar el simulador para todos los usuarios del PC o solo para el usuario actual. Una vez elegidas las opciones deseadas se debe pulsar en “Siguiente”.
Entorno de Prácticas 68000
Pag.-6
3) Pantalla de confirmación
Esta pantalla simplemente pide confirmación para la instalación, si se pulsa “Siguiente”, empezará la instalación.
4) Fin de la instalación
Esta pantalla es mostrada al terminar la instalación, simplemente se debe pulsar el boton “Cerrar” para terminar el programa de instalación.
Una vez que la instalación haya terminado aparecerá en el escritorio un acceso directo llamado Sim68000, así como en el menú Inicio aparecerá una carpeta llamada Sim68000 con un acceso directo al simulador en su interior. Usando cualquiera de los 2 accesos directos puede arrancarse el simulador.
Entorno de Prácticas 68000
Pag.-7
3. ENSAMBLADO DE PROGRAMAS Los programas deben escribirse con cualquier editor de texto. Pero para poder ejecutarlos usando el simulador, primero deben ensamblarse mediante la herramienta externa 68kasm. Dicho ensamblñador generará el archivo con extensión “h68”, el cual está en un formato legible por el simulador. Para utilizarlo se usa la línea de comandos. Es recomendable utilizar la opción “-l” al ensamblar. Dicha opción genera un archivo adicional con información extra que el simulador puede utilizar. Si no se ensambla con dicha opción, no se podrán utilizar todas las opciones del simulador. Un ejemplo de uso del ensamblador es: 68kasm –l programa.asm En este caso generará los archivos “programa.h68” y “programa.lis”. Si existieran errores de ensamblado , el 68kasm informará al usuario. Al final de este documento, en el capítulo 6, se incluye el Manual de Usuario del Ensamblador del Motorola 68000
Entorno de Prácticas 68000
Pag.-8
4. MANUAL DE USUARIO DEL SIM68000 4.1 Pantalla Principal
Al abrir la aplicación se mostrará la pantalla principal. En el centro podremos ver la lista con el código del programa. Dicha lista tiene tres modos de visualización posibles: Listado, Desensamblado y Trazas. Cada uno de ellos se explicará más adelante.
Entorno de Prácticas 68000
Pag.-9
En la zona inferior del diálogo veremos el contenido de los distintos registros internos del Motorota 68000. Abajo a la izquierda aparecen los registros de datos numerados desde D0 hasta D7. En el centro los registros de direcciones numerados desde A0 hasta A7. Finalmente, a la derecha el puntero de pila (SSP), el contador de Programa (PC), el registro de estado (SR) y los bits de Traza, Supervisor, Máscara de Interrupción y los Flags. Registros de Datos
Registros de Direcciones
SSP, USP, PC y SR
Sobre la lista del código del programa aparecen tres pestañas. Cada una de ellas corresponde a un modo de visualización.
•
Modo Listado: Este es el modo por defecto. Veremos la lista del programa tal y como ha sido escrito por el usuario, con comentarios y líneas en blanco incluidos. Además, a la izquierda aparecerá la dirección de memoria en la que se ha ubicado cada instrucción. Haciendo clic sobre una línea en la que haya una instrucción se añadirá un breakpoint sobre ella. Volviendo a pulsar se eliminará el breakpoint.
Entorno de Prácticas 68000
Pag.-10
•
Modo Desensamblado: Muestra las instrucciones como han sido desensambladas por el simulador. Si el compilador 68kasm ha sustituido una instrucción por otra por motivos de optimización, en este modo aparece la instrucción real que hay en memoria. Si por una escritura indebida en memoria se modifica una instrucción, se actualizará en el listado. Pulsando sobre cualquier línea se añadirá un breakpoint en la instrucción correspondiente o se eliminará si ya existía.
•
Modo Trazas: Con cada ejecución paso a paso, se añadirá una línea en este modo que indicará la última instrucción ejecutada. También se mostrarán los ciclos de reloj consumidos por la instrucción. En este modo, al no aparecer el listado del programa, no pueden añadirse breakpoints.
Entorno de Prácticas 68000
Pag.-11
En la parte superior de la pantalla, encima de la lista del código, podremos ver los menús del simulador y la barra de herramientas. Pulsando sobre los iconos de la barra de herramientas podremos realizar acciones o acceder a opciones de forma más rápida y cómoda que desde los menús.
Cortar
Pegar
Ejecutar
Reset
Abrir
Consola
Acerca de… Copiar Paso a Paso
Parar
Memoria
Dispositivos
En orden de izquierda a derecha, el significado y la utilidad de los iconos es el siguiente: − − − − − − − − − − − −
Abrir: Abre un nuevo programa. Cortar: Corta texto y lo guarda en el portapapeles. Copiar: Copia texto y lo guarda en el portapapeles. Pegar: Pega texto desde el portapapeles. Paso a Paso: Ejecuta la instrucción situada en la dirección de memoria contenida en el contador de programa. Ejecución: Ejecuta indefinidamente el programa desde la dirección de memoria contenida en el contador de programa. Parar: Para la ejecución. Reset: Hace un reset en la máquina. Mapeado de Memoria: Abre el diálogo con el mapeado completo de la memoria. Consola de Comandos: Abre la consola de comandos. Configuración de Dispositivos: Muestra el diálogo mediante el cuál es posible añadir, quitar o configurar dispositivos. Acerca del Simulador: Muestra información adicional sobre la aplicación.
Todas las acciones son accesibles desde los menús explicados a continuación. Asimismo también se explican con más detenimiento cada una de las opciones.
Entorno de Prácticas 68000
Pag.-12
4.1.1 Menú Archivo Este menú permite abrir un nuevo programa de Motorota 68000. Si es un programa abierto recientemente aparecerá en la lista de programas recientes.
Al seleccionar la opción Abrir se desplegará un menú de navegación para elegir el archivo deseado. El simulador es capaz de abrir cualquier archivo con extensión “h68” compilado con 68kasm. Si al compilarse no se incluyó la opción “-l”, la aplicación sólo permitirá el tipo de vista Trazas y se indicará con un mensaje. Al abrir un programa, el simulador tratará de ubicarlo en memoria. Si el simulador no encuentra memoria donde ubicarlo por no haber sido mapeada con dispositivos, devolverá mensajes de error en cada fallo de escritura en memoria.
4.1.2 Menú Edición En este menú aparecen las opciones básicas de Windows para poder copiar y pegar texto del portapapeles.
Entorno de Prácticas 68000
Pag.-13
4.1.3 Menú Ejecución Utilizando las opciones de este menú podremos hacer que la máquina ejecute el programa hasta que termine, ejecutar instrucciones paso a paso, hacer un reset sobre la máquina o bien parar la ejecución.
− Paso a Paso: Ejecuta la instrucción que se encuentra en la dirección del contador de programa. Si el programa entra en estado de Halt o finaliza su ejecución se indicará con un mensaje. Tras ejecutar la instrucción se actualizarán en el interfaz todos los registros y el mapeado de memoria. − Ejecutar: Ejecuta el programa indefinidamente desde la dirección que señala el contador de programa y a la velocidad para la que esté configurada la CPU. Sólo finalizará cuando se alcance una dirección con un Breakpoint definido por el usuario, se seleccione la opción de parar, entre en estado de Halt o se alcance el final del programa. En estos dos últimos casos se indicará con un mensaje. − Parar: En caso de que se esté ejecutando el programa, es posible detenerlo manualmente mediante esta opción. Si no se está ejecutando, la opción aparecerá deshabilitada. − Reset: Realiza un reset sobre la máquina, inicializando de nuevo el Contador de Programa, el registro de estado y la dirección de la pila.
4.1.4 Menú Configuración En este menú es posible realizar la configuración de los dispositivos conectados a la máquina o definir la velocidad de la CPU.
− Velocidad de CPU: Despliega un diálogo en el que se muestra una caja de texto con la velocidad actual de la CPU en Mhz. Editándola podremos definir una nueva velocidad, teniendo en cuenta que los límites son 0.01 y 99.99 Mhz. Pulsando sobre Aceptar cambiaremos la velocidad. Pulsando en el botón Cancelar el cambio no tendrá efecto. − Dispositivos: Pulsando sobre este menú abriremos el diálogo que permite la configuración de los dispositivos conectados a la máquina. Este diálogo se explica en la sección 7.4.
Entorno de Prácticas 68000
Pag.-14
4.1.5 Menú Ver A través de este menú podremos acceder a las opciones para poner o quitar la barra de herramientas y la barra de estado, o visualizar el mapeado de memoria y abrir la consola de comandos.
− Barra de Herramientas: Permite quitar la barra de herramientas. En dicha barra aparecen los iconos rápidos con funciones también accesibles a través de los menús. Dicha barra ofrece comodidad pero quitándola se gana algo de espacio haciendo que la lista del programa aparezca más grande. − Barra de Estado: Permite quitar o poner la barra de estado donde aparece escrito el estado en el que se encuentra la máquina. Al igual que antes, quitar esta barra permite ganas algo de espacio vertical. − Mapeado de Memoria: Muestra el diálogo con el mapeado de memoria. Este diálogo se explica en la sección 7.5. − Consola: Abre la consola de comandos. El uso de la consola y los comandos disponibles se explican en la sección 7.6.
Entorno de Prácticas 68000
Pag.-15
4.2 Mapa de Memoria En este diálogo podremos ver el mapa completo de la memoria que es capaz de direccionar el Motorola 68000.
En la pantalla principal vemos una tabla donde se despliega el contenido de la memoria. En cada fila aparecen dieciséis direcciones divididas en columnas. La primera columna indica la dirección base y las columnas siguientes el contenido de la memoria en las dieciséis direcciones sucesivas. La última columna muestra la representación ASCII del contenido de la memoria que servirá para poder localizar cadenas de texto con facilidad para depurar. Dirección base de Memoria
Direcciones consecutivas
Representación ASCII
Para desplazarnos por el contenido de la memoria utilizaremos la barra de desplazamiento que se encuentra a la derecha. Este diálogo tiene a su vez varios menús con distintas opciones: Archivo, Editar y Ver.
Entorno de Prácticas 68000
Pag.-16
4.2.1 Menú Archivo
En este menú podremos elegir la opción de Volcar a Fichero. Aparecerá un diálogo donde se nos preguntará por el rango de direcciones que deseamos volcar y el nombre del fichero destino. Tras pulsar Aceptar, en el fichero elegido se guardará el contenido de la memoria en modo texto y en un formato similar al de la tabla del diálogo del mapeado. 4.2.2 Menú Editar
Desde este menú podemos cambiar el contenido de la memoria. Tenemos dos opciones disponibles para ello: Cambiar Valor y Cambiar Bloque de Direcciones. − En Cambiar Valor se abrirá un diálogo que nos pedirá una dirección de memoria y el nuevo valor que deseemos darle. Tras pulsar el botón Aceptar el cambio tendrá efecto. − En Cambiar Bloque de Direcciones se abrirá otro diálogo que en vez de pedirnos una dirección, nos pedirá un rango de direcciones y un valor. Tras pulsar Aceptar, el contenido de la memoria que se encuentre en el rango dado se verá modificado y tendrá como valor el especificado.
4.2.3 Menú Ver Desde aquí tendremos dos opciones disponibles: Ir a Dirección de Memoria y Filtrar Direcciones de Memoria.
− Con Ir a Dirección de Memoria podremos ir directamente a una dirección especificada por el usuario. Se abrirá un diálogo donde se pedirá dicha dirección. Tras rellenar el cuadro de texto correspondiente y pulsar Aceptar, la lista con el mapeado de memoria avanzará o retrocederá hasta la dirección indicada. − Pulsando sobre Filtrar Direcciones de Memoria podremos establecer un rango límite de direcciones. Se abrirá un diálogo que pedirá dicho rango y tras pulsar Aceptar, los límites por los que se podrá navegar en el mapeado de memoria serán los especificados. De esa manera será más cómodo para el usuario desplazarse por la lista.
Entorno de Prácticas 68000
Pag.-17
4.3 Configuración de Dispositivos en SIM68000 En este diálogo es posible añadir dispositivos a la máquina, modificar su configuración, o eliminarlos.
Dispositivos Disponibles
Dispositivos Conectados
Al abrir el diálogo observaremos dos listas. La lista de la izquierda indica los dispositivos disponibles. La ventana de la derecha indica los dispositivos que ya están instalados, junto con su configuración. Eligiendo un dispositivo de la izquierda y pulsando sobre el botón Añadir, se incluirá dentro de los dispositivos instalados. Aparecerá un diálogo con sus opciones de configuración, que son propias de cada dispositivo. Es posible añadir varios dispositivos del mismo tipo siempre y cuando se mapeen en direcciones de memoria distintas. También podremos modificar la configuración de los dispositivos que ya se encuentran conectados. Para ello pulsaremos sobre el dispositivo que queramos modificar y después sobre el botón Configurar. Aparecerá el mismo menú de configuración que se muestra al conectar el dispositivo. Para retirar un dispositivo conectado lo elegiremos en la lista y pulsaremos sobre el botón Borrar.
Entorno de Prácticas 68000
Pag.-18
Actualmente hay disponibles cuatro tipos de dispositivos: RAM, Timer M68230, Duart M68681 y DMA. Para configurar cada dispositivo se deben introducir los siguientes datos: •
RAM:
o La dirección base donde se ubicará el dispositivo. o El tamaño de la memoria en bytes.
•
Timer M68230:
o La dirección base. o El nivel de interrupción con el que funcionará.
Entorno de Prácticas 68000
Pag.-19
•
Duart M68681:
o o o o
•
La dirección base donde se ubica. El nivel de interrupción con el que funcionará la Duart. El espacio que utiliza como separación entre sus registros internos. Se deben indicar además cuáles de los dos puertos estarán activos.
DMA:
o La dirección base donde se ubica el dispositivo. o El nivel de interrupción con el funcionará el DMA. Una vez realizados los cambios, se deberá pulsar sobre el botón Aceptar para que los cambios sean efectivos. La máquina hará un reset, pero antes la aplicación avisará con un mensaje.
4.4 Consola de Comandos Desde la consola de comandos podremos realizar diversas acciones como modificar el contenido de direcciones de memoria, desensamblar un conjunto de direcciones, poner y quitar breakpoints, etc.
Entorno de Prácticas 68000
Pag.-20
Algunas instrucciones reciben valores y direcciones como parámetros. Pueden ser escritos tanto en decimal como en hexadecimal. Para escribirlos en decimal, será suficiente con escribir el valor. Para hacerlo en hexadecimal, lo precederemos de 0x. Por ejemplo: 0xAA77. Las instrucciones disponibles son: − HELP [Comando]: Muestra información sobre un comando concreto. Si se omite el parámetro, devuelve una lista con los comandos disponibles. − MB : Escribe en la dirección indicada el byte especificado. Si el valor que introduce el usuario no se puede escribir en un byte, se trunca. − MW : Escribe en la dirección indicada el word especificado. Si el valor que introduce el usuario no se puede escribir en un word, se trunca. − ML : Escribe en la dirección indicada el longword especificado. − R : Escribe en un registro el valor especificado. Todos los registros son válidos y su sintaxis es la siguiente: o Registros de datos: D0, D1, D2, D3, D4, D5, D6, D7 o Registros de direcciones: A0, A1, A2, A3, A4, A5, A6, A7 o Pila del supervisor: SSP o Pila del usuario: USP o Contador de Programa: PC o Registro de Estado: SR − P [numero]: Ejecuta el número de instrucciones especificada. Si no se especifica ningún número, ejecuta una sóla instrucción. Devuelve el número de ciclos transcurrido durante la ejecución.
Entorno de Prácticas 68000
Pag.-21
− S [lineas]: Vuelca el número de líneas de dieciséis bytes indicado a partir de la pila. Para ello se tiene en cuenta si el modo actual es el de supervisor o el de usuario. En caso de que se omita el parámetro se muestran cuatro líneas. − D [direccion] [lineas]: Vuelca el número de líneas de dieciséis bytes indicado a partir de la dirección de memoria especificada. Si no se especifica número de líneas, se vuelcan cuatro. Si tampoco se especifica la dirección de memoria, se utiliza por defecto el contador de programa. − C [direccion] [instrucciones]: Desensambla el número de instrucciones especificado desde la dirección de memoria indicada. De esta manera se podrán desensamblar direcciones de memoria que no aparezcan en el archivo “.lis”. Si se omite el número de instrucciones, desensambla diez. Si se omite también la dirección de memoria, se utiliza por defecto el contador de programa. − BPS [direccion]: Establece un breakpoint en la dirección especificada. De esta manera podrán añadirse también breakpoints en direcciones que no se contemplen en el archivo “.lis”. Si no se indica una dirección, se toma por defecto el contador de programa. − BPR [direccion]: Elimina un breakpoint de la dirección especificada. Si se omite la dirección, se toma por defecto el contenido del contador de programa. − BPCLEAR: Elimina todos los breakpoints establecidos. − RESET: Hace un reset a la CPU e inicializa los dispositivos. − CLEAR: Limpia la consola.
Entorno de Prácticas 68000
Pag.-22
4.5 Teclas de Acceso Rápido Algunas opciones del simulador son accesibles mediante teclas y combinaciones de teclas de acceso rápido. Se enumeran a continuación: − − − − − − − − − − − − − − − − −
Ejecutar: F5 Parar: F9 Paso a paso: F10 Reset: Ctrl + R Consola de Comandos: Ctrl + S Mostrar Memoria: Ctrl + M Pestaña Siguiente: F6 Pestaña Anterior: Mayúsculas + F6 Abrir: Ctrl + O Copiar: Ctrl + C Copiar: Ctrl + Insert Cortar: Mayúsculas + Suprimir Cortar: Ctrl + X Pegar: Ctrl + V Pegar: Mayúsculas + Insertar Deshacer: Ctrl + Z Deshacer: Alt + Borrar
Entorno de Prácticas 68000
Pag.-23
5. DESCRIPCIÓN Y PROGRAMACIÓN DE LOS DISPOSITIVOS
5.1 RAM 5.1.1 Descripción Este dispositivo simula un bloque de memoria RAM (Random Access Memory), desde la CPU puede leerse y escribirse en cualquier dirección asignada a este dispositivo. Al escribir en este dispositivo se guardará el dato escrito en la posición de memoria indicada. Al leer de este dispositivo se leerá el dato almacenado en la posición de memoria indicada. Los accesos pueden ser de 8 bits (byte), 16 bits (word), o 32 bits (longword). Este dispositivo nunca genera ningún tipo de interrupción.
5.1.2 Configuración La pantalla de configuración de la RAM es la siguiente:
-
Dirección base: Indica la dirección más baja donde se empezará a mapear la RAM. Su valor es en hexadecimal.
-
Tamaño (en bytes): Tamaño, en bytes de la memoria RAM. Su valor es en hexadecimal.
Entorno de Prácticas 68000
Pag.-24
5.2 DUART M68681 5.2.1 Descripción El dispositivo M68681 contiene 2 USART (Universal Sychronous Asynchronous Receiver Transmitter), en este caso solo se encuentra implementado el modo asíncrono que es el utilizado en las prácticas. La USART dispone de un amplio conjunto de registros que permiten variar su funcionamiento. Se puede configurar: -
La velocidad a la que son enviados los caracteres. El modo de funcionamiento, por interrupciones o por sondeo (polling). Si hay o no bit de paridad. El tamaño del carácter a enviar o recibir, de 5 a 8 bits.
Todos los registros de configuración del dispositivo se acceden a través de direcciones mapeadas en memoria. La dirección indicada de cada registro es a partir de la dirección base del dispositivo. El tamaño de todos los registros es de 8 bits. En cada registro se indica si es de solo lectura (L), solo escritura (E), o de lectura/escritura (L/E).
Direccion (decimal) 0 0 2 2 4 6 6 8 10 10 16 16 18 18 20 22 22 24
L/E L/E L/E L E E L E E L E L/E L/E L E E L E L/E
Entorno de Prácticas 68000
Registro MR1A (Mode Register 1) - canal A MR2A (Mode Register 2) - canal A SRA (Status Register) – canal A CSRA (Clock Select Register) – canal A CRA (Command Register) – canal A RBA (Receive Buffer) – canal A TBA (Transmit Buffer) – canal A ACR (Auxiliary Control Register) ISR (Interrupt Status Register) IMR (Interrupt Mask Register) MR1B (Mode Register 1) – canal B MR2B (Mode Register 2) – canal B SRB (Status Register) – canal B CSRB (Clock Select Register) – canal B CRB (Command Register) – canal B RBB (Receive Buffer) – canal B TBB (Transmit Buffer) – canal B IVR (Interrupt Vector Register)
Pag.-25
MR1x (Mode Register 1) Registro de control. Una vez realizado un acceso de lectura o escritura sobre este registro se selecciona en la misma dirección de memoria el registro MR2. 7 Rx RTS Control
6 Rx IRQ Select
5 Error Mode
4 3 Parity Mode
2 Parity Type
1 0 Bits per character
Bit 7: 0: Inhibida la señal de control RTS (Request To Send) en recepción. 1: Habilitada la señal de control RTS en recepción. Bit 6: 0: Interrupción cuando se recibe un nuevo carácter. 1: Interrupción cuando la memoria FIFO esta llena. Bit 5: No se utiliza. Bits 4-3: 00 y 01: Con paridad 10: Sin paridad. Bit 2: 0: Paridad par 1: Paridad impar Bits 1-0: 00: 5 bits por carácter 01: 6 bits por carácter 02: 7 bits por carácter 03: 8 bits por carácter
MR2x (Mode Register 2) Se accede a este registro después de escribir o leer el registro MR1. Permite describir más características de la comunicación. 7 6 Channel Mode
5 Tx RTS
4 Tx CTS
3
2 1 Stop bit length
0
Bits 7-6: 00: Normal. 01: Eco automático. 10: Bucle local. 11: Bucle remoto.
Entorno de Prácticas 68000
Pag.-26
Bit 5: 0: Inhibido el control RTS en el transmisor 1: Habilitado. Bit 4: 0: Inhibido el control CTS (Clear To Send) en el transmisor 1: Habilitado Bits 3-0: Número de bits de stop a utilizar. Valor 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
6 a 8 bits por carácter 0,563 0,625 0,688 0,750 0,813 0,875 0,938 1,000 1,563 1,625 1,688 1,750 1,813 1,875 1,938 2,000
5 bits por carácter 1,063 1,125 1,188 1,250 1,313 1,375 1,438 1,500 1,563 1,625 1,688 1,750 1,813 1,875 1,938 2,000
SRx (Status Register) Registro de estado. Indica los diferentes estados que pueden presentarse durante una comunicación. 7 Received Break
6 Framing Error
5 Parity
4 Overrun Error
3 TxEMT
2 TxRDY
1 FFULL
0 RxRDY
Bit 7: No utilizado. Bit 6: 1: Error de marco 0: Sin error
Bit 5: 1: Error de paridad 0: Sin error Entorno de Prácticas 68000
Pag.-27
Bit 4: 1: Overrun 0: Sin error Bit 3: 1: Transmisor vacío. El último bit ya ha salido por la línea. 0: Ocupado transmitiendo un carácter. Bit 2: 1: Registro TB disponible para colocar otro carácter 0: Ocupado Bit 1: 1: La FIFO de recepción está llena 0: No está llena Bit 0: 1: Está disponible un nuevo carácter en el registro de recepción RB 0: No ha llegado un carácter CSRx (Clock Select Register) Permite seleccionar las velocidades de transmisión y recepción. 7
6 5 Receiver clock select
4
3
2 1 Transmitter clock select
0
Bits 7-4: Velocidad a la que se reciben caracteres (ver tabla). Bits 3-0: Velocidad a la que se transmiten caracteres (ver tabla).
Valor 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100
Entorno de Prácticas 68000
Velocidad si bit 7 de ACR = 0 50 bps 110 bps 134,5 bps 200 bps 300 bps 600 bps 1.200 bps 1.500 bps 2.400 bps 4.800 bps 7.200 bps 9.600 bps 38.400 bps
Velocidad si bit 7 de ACR = 1 75 bps 110 bps 134,5 bps 150 bps 300 bps 600 bps 1.200 bps 2.000 bps 2.400 bps 4.800 bps 1.800 bps 9.600 bps 19.200 bps
Pag.-28
CRx (Command Register) Permite el envío de órdenes de funcionamiento a la UART. 7 Not Used
6
5 Miscellaneous Commands
4
3
2
Tx Commands
1
0
Rx Commands
Bit 7: Sin uso Bits 6-4: 000: Orden nula 001: Permite volver a escribir/leer el registro MR1 010: Reiniciar la recepción de caracteres 011: Reiniciar la transmisión de caracteres 100: Elimina una condición de error en el registro de estado El resto de combinaciones no se utiliza. Bits 3-2: 00: Orden nula 01: Transmisor habilitado 10: Transmisor inhibido 11: Sin uso Bits 1-0: 00: Orden nula 01: Receptor habilitado 10: Receptor inhibido 11: Sin uso
RBx (Receive Buffer) De este registro se puede leer el último carácter que llegó por la línea de comunicaciones.
TBx (Transmit Buffer) Sobre este registro se escribirá el carácter que se quiera enviar por la línea de comunicaciones.
ACR (Auxiliary Control Register) Bit 7: Indica la velocidad de transmisión/recepción junto con el registro CSRx (ver la tabla de velocidad del registro CSRx).
Entorno de Prácticas 68000
Pag.-29
ISR (Interrupt Status Register) Proporciona información acerca de la causa que provocó una interrupción. 7 N/A
6 N/A
5 Rx RDY (B)
4 Tx RDY (B)
3 N/A
2 N/A
1 Rx RDY (A)
0 Tx RDY (A)
Bit 5: 0: No hay ningún carácter disponible en el registro de recepción del canal B. 1: Está disponible un carácter en el registro de recepción RBB para ser leído. Bit 4: 0: Se está transmitiendo un carácter por el canal B. 1: LA USART está lista para transmitir un nuevo carácter por el canal B. Bit 1: 0: No hay ningún carácter disponible en el registro de recepción del canal A. 1: Está disponible un carácter en el registro de recepción RBA para ser leído. Bit 0: 0: Se está transmitiendo un carácter por el canal A. 1: LA USART está lista para transmitir un nuevo carácter por el canal A.
IMR (Interrupt Mask Register) Mediante este registro se puede seleccionar que interrupciones deseamos que nos envíe la UART.
7 N/A
6 N/A
5 Rx RDY (B)
4 Tx RDY (B)
3 N/A
2 N/A
1 Rx RDY (A)
0 Tx RDY (A)
Bit 5: 0: No se recibe una interrupción cuando llegue un nuevo carácter por el canal B. 1: Se recibirá una interrupción cuando llegue un nuevo carácter por el canal B. Bit 4: 0: No se recibe una interrupción cuando la USART esta lista para transmitir por el canal B. 1: Se recibe una interrupción cuando la USART esta lista para transmitir por el canal B. Bit 1: 0: No se recibe una interrupción cuando llegue un nuevo carácter por el canal A. 1: Se recibirá una interrupción cuando llegue un nuevo carácter por el canal A.
Entorno de Prácticas 68000
Pag.-30
Bit 0: 0: No se recibe una interrupción cuando la USART esta lista para transmitir por el canal A. 1: Se recibe una interrupción cuando la USART esta lista para transmitir por el canal A. IVR (Interrupt Vector Register) En este registro se colocará el número del vector de interrupción de la rutina de tratamiento de interrupción.
5.2.2 Configuración A continuación se muestra la pantalla de configuración de la DUART M68681:
-
Dirección base (hex): Dirección del primer registro de la DUART. Esta será la dirección de memoria más baja mapeada por el dispositivo. Su valor es en hexadecimal.
-
Nivel IRQ: Nivel de prioridad de interrupción. Será la prioridad con la que solicitará las interrupciones a la CPU. Su valor debe estar entre 1 y 7.
-
Espacio entre registros: Indica el número de bytes de diferencia que habrá entre un registro y el siguiente. El valor mínimo es 1, que indicaría que los registros se encuentran consecutivos. En el caso del MC68000, este valor será 2, ya que, en el MC 68000, los registros de los dispositivos periféricos deben estar en direcciones impares.
-
Ventanas de E/S: Indica que ventanas de Entrada/Salida desean mostrarse, se puede elegir mostrar la ventana del puerto A y/o del puerto B. Independienmente de la selección, en el dispositivo funcionarán los 2 puertos.
Entorno de Prácticas 68000
Pag.-31
5.3 Timer M68230 5.3.1 Descripción El dispositivo Timer M68230 nos permite conectar un controlador M68230 al simulador, en concreto el timer (temporizador) que incorpora. Este dispositivo nos permite generar interrupciones de forma periódica utilizando un contador de 24 bits. El Timer se programa mediante sus registros, los cuales se encuentran mapeados en memoria. El Timer dispone de un contador de 24 bits en el que se puede fijar un valor inicial. Cada 32 ciclos de la CPU este contador se decrementará en 1, al llegar el valor a 0 generará una interrupción. Por ejemplo, para generar una interrupción cada segundo sabiendo que la CPU trabaja a 4 Mhz (4 millones de ciclos por segundo), el valor del contador debería ser 4.000.000 / 32 = 125.000. Es posible configurar el valor inicial de 24 bits utilizado como contador y el número de vector de interrupción que se desea generar. A continuación se explicarán los diferentes registros del Timer. El tamaño de todos los registros es de 8 bits. La dirección de cada registro será la dirección que aparece en la tabla más la dirección base del Timer (elegida en la configuración).
Dirección (decimal) 0 2 6 8 10 14 16 18 20
Registro TCR (Timer Control Register) TIVR (Timer Interrupt Vector Register) CPRH (Counter Preload Register High) CPRM (Counter Preload Register Medium) CPRL (Counter Preload Register Low) CNTRH (Counter Register High) CNTRM (Counter Register Medium) CNTRL (Counter Register Low) TSR (Timer Status Register)
A continuación se muestra el contenido y la explicación detallada de cada uno de estos registros. CNTRH, CNTRM y CNTRL (Counter Register) Permiten conocer el valor del contador, este valor se irá decrementando en 1 cada 32 ciclos. CNTRH contiene el byte más significativo del contador, CNTRM contiene el segundo byte más significativo del contador y CNTRL el byte menos significativo del contador. Son registros de solo lectura, no se puede escribir en ellos.
Entorno de Prácticas 68000
Pag.-32
CPRH, CPRM y CPRL (Counter Preload Register) Son 3 registros de 8 bits cada uno (en total 24 bits), permiten fijar el valor inicial del contador. El registro CPRH permite fijar el byte más significativo. CPRM contiene el segundo más significativo, y CPRL contiene el menos significativo. Una forma posible de cargar un valor de 24 bits en el contador podría ser así (teniendo en cuenta que el valor a cargar se encontrase en el registro D0): MOVE.B LSR.L MOVE.B LSR.L MOVE.B
D0,(DIR_BASE_TIMER+OFFSET_CPRL) #8,D0 D0,(DIR_BASE_TIMER+OFFSET_CPRM) #8,D0 D0,(DIR_BASE_TIMER+OFFSET_CPRH)
TCR (Timer Control Register) En este registro se indica el modo de trabajo del timer así como el arranque-paro del mismo. 7
6
5
Modo de funcionamiento
1
0
1
00X: No se usan 01X: Onda cuadrada 100: No genera int. 101: Int. Vectorizada 111 y 110: Int. Autovect.
Modo 0: Modo 1: Modo 2: Modo 3:
4
3
ZD CPRÆCNTR
-
0
X
0: SI 1: NO
2
1
Control del reloj 0
0
00: Modo 0 01: Modo 1 10: Modo 2 11: Modo 3
0 Enable
1 0: NO 1: SI
Temporizador. Decrementa el contador cada 32 ciclos del reloj del sistema Temporizador. Decrementa el contador con PC2/Tin = 1 Contador de pulsos (entrada TC2/Tin) con preescala de 32 Contador de pulsos (entrada TC2/Tin)
El timer de esta pastilla tiene distintas aplicaciones. En los bits 5 a 7 se indica la aplicación que se desea utilizar. Nosotros lo utilizaremos como un timer convencional que genera un interrupción vectorizada cada vez que el registro CONTADOR (CNTR) llega a cero, por lo que en estos bits se deberá poner el valor 101. El bit 4 (ZD, Zero Detect), indica lo que se debe hacer cuando el registro CONTADOR llega a cero. Si este bit tiene un cero, cuando el CONTADOR llega a cero se recarga automáticamente con el valor indicado en el registro de precarga (CPDR). Si tiene el valor 1, cuando el CONTADOR llega a cero, se resta uno más al contador (resta binaria), con lo que pasa a tener el valor $FFFFFF, y continúa el decremento de manera habitual, considerando al CONTADOR como un valor entero sin signo.
Entorno de Prácticas 68000
Pag.-33
Nosotros lo pondremos simpre con el valor 0, para tener activada la recarga con el valor del CPDR. Con los bits 1 y 2 se programa el modo en el que se decrementa el registro CONTADOR (CNTR). Nosotros utilizaremos el modo 0 (ambos bits a cero). En este modo, el registro CONTADOR se decrementa una unidad cada 32 ciclos de reloj. NOTA: Se debe tener en cuenta que este simulador del Motorola 68000 utiliza una frecuencia de reloj de 4 MHz (4 millones de ciclos por segundo). Por último, el bit 0 de este registro indica si el timer está arrancado (decrementando el CONTADOR) o está parado: 0: El Timer esta inhibido. 1: Habilitado. Para inicializar el Timer, lo mejor es inhibirlo (bit 0 = 0), programar convenientemente el timer y por último programar este registro TCR con el bit 0 igual a 1 para que el Timer empiece a contar.
TIVR (Timer Interrupt Vector Register) Permite definir el número de vector de interrupción que será utilizado cuando el Timer genere la interrupción.
TSR (Timer Status Register) Solamente consideraremos el bit 0 (ZDS, Zero Detect Status) de este registro de estado. Este bit se pone a 1 cuando el CONTADOR del timer alcanza el valor 0. Para cualquier otro valor del CONTADOR, este bit estará a 0.
Entorno de Prácticas 68000
Pag.-34
5.3.2 Configuración A continuación se muestra la pantalla de configuración del Timer:
-
Dirección Base: Valor en hexadecimal. Indica la dirección base del dispositivo, es decir, la dirección en memoria de su primer registro.
-
Nivel IRQ: Indica con que nivel de prioridad se solicitará la interrupción a la CPU. Su valor puede estar entre 1 y 7.
Entorno de Prácticas 68000
Pag.-35
5.4 DMA 5.4.1 Descripción El dispositivo DMA permite realizar transferencias de memoria a memoria de hasta 64 kilobytes de longitud de forma independiente a la CPU. Es decir, operará en paralelo a la CPU. Para conseguir esto se debe configurar en el dispositivo a través de sus registros mapeados en memoria, la dirección inicial de los datos que se desean copiar, la dirección destino, y la longitud de la copia (todo esto antes de iniciar la transferencia). Una vez que el dispositivo haya terminado la copia o se produzca algún error, nos avisará generando una interrupción. La dirección de los registros del DMA se obtendrá sumando la dirección del registro de la tabla siguiente con la dirección base indicada en la configuración del dispositivo. Los registros del dispositivo DMA son los siguientes: Dirección (decimal) 0 0 2 4 6 8 10 12 14 16 18
L/E
Registro
E L L/E L/E L/E L/E L/E L/E L/E L/E L/E
DCR (DMA Control Register) DSR (DMA Status Register) DIVR (DMA Interrupt Vector Register) SPRH (Source Preload Register High) SPRM (Source Preload Register Medium) SPRL (Source Preload Register Low) DPRH (Destination Preload Register High) DPRM (Destination Preload Register Medium) DPRL (Destination Preload Register Low) LPRH (Length Preload Register High) LPRL (Length Preload Register Low)
DCR (DMA Control Register) Registro de control del DMA, permite indicar la velocidad de la transferencia e indicar cuando debe empezar esta. 7 N/A
6 N/A
5 N/A
4 N/A
3 N/A
2
1 Speed
0 Start
Bit 0: 0: Lo escrito en este registro es ignorado. 1: Comienza la transferencia de memoria. Bits 1-2: Velocidad de transferencia 00: Copia un byte cada 4 ciclos. 01: Copia un byte cada 8 ciclos. 10: Copia un byte cada 16 ciclos. 11: Copia un byte cada 32 ciclos.
Entorno de Prácticas 68000
Pag.-36
DSR (DMA Status Register) Permite conocer el estado del DMA, y si se ha producido algún error. 7 N/A
6 N/A
5 N/A
4 N/A
3 N/A
2 1 Error Type
0 Status
Bit 0: 0: El DMA esta parado. 1: El DMA esta transfiriendo. Bits 1-2: 00: No hay error 01: Se ha producido un error de lectura 10: Se ha producido un error de escritura El valor 11 no se utiliza.
DIVR (DMA Interrupt Vector Register) Contiene el número del vector de interrupción que se generará cuando termine una transferencia o se produzca un error.
SPRH, SPRM y SPRL (Source Preload Register) Estos 3 registros de 8 bits, contienen la dirección de memoria origen de 24 bits de la transferencia. El byte más significativo de la dirección se almacenará en SPRH, el segundo más significativo en SPRM y el menos significativo en SPRL. Una forma posible de cargar un valor de 24 bits como dirección origen podría ser así (teniendo en cuenta que el valor a cargar se encontrase en el registro D0): MOVE.B LSR.L MOVE.B LSR.L MOVE.B
D0,(DIR_BASE_DMA+OFFSET_SPRL) #8,D0 D0,(DIR_BASE_DMA+OFFSET_SPRM) #8,D0 D0,(DIR_BASE_DMA+OFFSET_SPRH)
DPRH, DPRM y DPRL (Destination Preload Register) Estos 3 registros de 8 bits, contienen la dirección de memoria destino de 24 bits de la transferencia. El byte más significativo de la dirección se almacenará en SPRH, el segundo más significativo en SPRM y el menos significativo en SPRL.
Entorno de Prácticas 68000
Pag.-37
Una forma posible de cargar un valor de 24 bits como dirección destino podría ser así (teniendo en cuenta que el valor a cargar se encontrase en el registro D0): MOVE.B LSR.L MOVE.B LSR.L MOVE.B
D0,(DIR_BASE_DMA+OFFSET_DPRL) #8,D0 D0,(DIR_BASE_DMA+OFFSET_DPRM) #8,D0 D0,(DIR_BASE_DMA+OFFSET_DPRH)
LPRH y LPRL (Length Preload Register) Estos 2 registros de 8 bits, contienen el valor de 16 bits de la longitud de la transferencia (en bytes). El byte más significativo de este valor se almacenará en el registros LPRH, mientras que el menos significativo se almacenará en LPRL. La transferencia será siempre 1 byte más que el valor indicado en estos registros, es decir, si se indica el valor 0, se transferirá 1 byte, si se indica el valor $FFFF se transferirán 65.536 bytes (64 KBytes). Una forma posible de cargar un valor de 16 bits como longitud de la transferencia podría ser así (teniendo en cuenta que el valor a cargar se encontrase en el registro D0): MOVE.B LSR.L MOVE.B
D0,(DIR_BASE_DMA+OFFSET_LPRL) #8,D0 D0,(DIR_BASE_DMA+OFFSET_LPRH)
5.4.2 Configuración A continuación se muestra la pantalla de configuración del DMA:
-
Dirección Base: Valor en hexadecimal. Indica la dirección base del dispositivo, es decir, la dirección en memoria de su primer registro.
-
Nivel IRQ: Indica con que nivel de prioridad se solicitará la interrupción a la CPU. Su valor puede estar entre 1 y 7.
Entorno de Prácticas 68000
Pag.-38
6. ENSAMBLADOR DEL MOTOROLA 68000 6.1 Formato de la línea fuente El ensamblador del 68000 es muy similar a la mayoría de los compiladores y ensambladores de los sistemas UNIX. La entrada al ensamblador es un fichero que contiene instrucciones, directivas de ensamblaje y comentarios. Cada línea del fichero puede tener hasta 256 caracteres de longitud. Se recomienda, sin embargo, que las líneas de código fuente no excedan de 80 caracteres, de este modo se asegura que las líneas del fichero de listado no superen los 132 caracteres de longitud. El ensamblador no hace distinción entre mayúsculas y minúsculas. El ensamblador acepta ficheros con el siguiente formato de línea: ETIQUETA OPERACIÓN OPERANDOS COMENTARIOS El campo ETIQUETA es opcional, pero si se usa debe comenzar en la primera columna de la línea. Los campos se deben separar por cualquier combinación de espacios o tabulaciones. Excepto en el campo de comentarios y en las cadenas entrecomilladas, no deben existir espacios ni tabulaciones en el interior de un campo. El siguiente es un ejemplo de lenguaje ensamblador: START LOOP
6.1.1
ORG CLR.W MOVE.W ADD.W SUB.W BNE BREAK SUM COUNT
$2000 SUM COUNT,D0 D0,SUM #1,D0 LOOP DS.W 1 DC.W 25
Start at location 2000 Hex Clear variable SUM Load COUNT value Add D0 to SUM Decrement counter Loop if counter not zero Tell the simulator to BREAK if running Reserve one word for SUM Initial value for COUNT
El campo ETIQUETA
Las etiquetas válidas siguen las reglas para la construcción de nombres de símbolos descritas en la sección de símbolos. Las etiquetas se distinguen de dos formas: (1) deben comenzar en la columna 1, (2) pueden finalizar con dos puntos, que no forman parte de la etiqueta, pero que sirven para indicar dónde finaliza. Una línea de código puede consistir en una sola etiqueta. Cuando una etiqueta se encuentra en el código fuente, se le asigna el valor del contador de localización actual. Este símbolo puede utilizarse en cualquier otra parte del programa para referirse a dicha dirección.
6.1.2
El campo OPERACIÓN
El campo operación especifica la instrucción que debe ser ensamblada o la directiva de ensamblaje que debe realizarse. Al código de operación puede ir añadido un código de tamaño (.B, .W, .L, o .S) si es que lo permite, para especificar que la operación se realiza sobre un dato de tamaño Byte, Word, Long o Short (1, 2, 4, 1 respectivamente). El campo de operación no puede comenzar en la columna 1, porque la operación podría confundirse con una etiqueta. 6.1.3
El campo OPERANDO
El campo operando sólo es obligatorio cuando la instrucción o directiva que está siendo utilizada así lo requiere. Si está presente, el campo consiste en uno o más items separados por comas y sin espacios o tabulaciones intermedias (pueden darse espacios y tabulaciones intermedias dentro de cadenas entrecomilladas).
Entorno de Prácticas 68000
Pag.-39
6.1.4
El campo de COMENTARIOS
El campo de comentarios normalmente consiste en cualquier cosa que está a continuación de los operandos. No necesitan ningún carácter especial en su comienzo y pueden contener cualquier carácter deseado. Los comentarios también pueden insertarse en los ficheros fuente de otro modo: Un asterisco (“*”) en el comienzo de una línea o después de una etiqueta provoca que el resto de la línea sea ignorado, es decir, que sea tratada como un comentario. 6.1.5
Símbolos
Los símbolos aparecen en el código fuente como etiquetas, constantes y operandos. El primer carácter de un símbolo debe ser una letra (A-Z) o un punto (“.”). El resto de los caracteres pueden ser letras, signos de dólar (“$”), puntos (“.”), o guiones bajos (“_”). Un símbolo puede tener cualquier longitud, pero sólo los 8 primeros caracteres son significativos. No hay distinción entre mayúsculas y minúsculas. 6.1.6
Expresiones
Una expresión consiste en uno o más operandos (números o símbolos), combinados con un operador unario o binario. Sus componentes se describen más abajo. El valor de la expresión y sus valores intermedios son siempre representados con 32 bits, sin tener en cuenta los desbordamientos que puedan darse. (La división por cero, sin embargo, provoca un error).
6.1.7
Operandos en expresiones
Un operando en una expresión es tanto un símbolo como uno de los siguientes tipos de constantes: c Números decimales: un número decimal consiste en una secuencias de dígitos decimales (0-9) de cualquier longitud. d Números hexadecimales: un número hexadecimal consiste en un signo de dólar (“$”) seguido de una secuencia de dígitos hexadecimales (0-9 y A-F) de cualquier longitud. e Números binarios: un número binario consiste en un signo de porcentaje (“%”) seguido de una secuencia de dígitos binarios (0 y 1) de cualquier longitud. f Números octales: un número octal consiste en un signo de arroba (“@”) seguido de una secuencia de dígitos octales (0-7) de cualquier longitud. En todas las constantes numéricas se genera una advertencia (“warning”) si el valor del número no puede ser expresado con 32 bits. g Constantes ASCII: una constante ASCII consiste en un grupo de uno a cuatro caracteres ASCII encerrados entre comillas simples. Si se desea poner una comilla sencilla dentro de una constante ASCII, ésta se debe acompañar de otra comilla simple. Si la constante ASCII consiste en un solo carácter, entonces éste se colocará en byte inferior de un valor de 32 bits; si consiste en dos caracteres, se colocarán en la
Entorno de Prácticas 68000
Pag.-40
palabra más baja, con el primer carácter en la posición más alta. Si se utilizan cuatro caracteres, entonces todos los bytes contendrán caracteres, con el primero en la posición de orden mayor. Sin embargo, si consiste en tres caracteres, estos se colocarán en los tres bytes de orden mayor de un valor de 32 bits, con 0 en el byte menor (esto se realiza de este modo para acomodarse al sistema de direccionamiento utilizado en el 68000 – el byte más alto primero-). Hay que tener en cuenta que las constantes ASCII en las expresiones son diferentes de las cadenas utilizadas en la directiva DC, puesto que estas últimas pueden ser de cualquier longitud. 6.1.8
Operadores en expresiones
Los operadores permitidos en las expresiones se muestran en la siguiente tabla, en orden decreciente de precedencia. Dentro de cada grupo, los operadores se evalúan en orden de izquierda a derecha (excepto los del grupo 2, que se evalúan de derecha a izquierda). GRUPO OPERADOR SIGNIFICADO
1
() -
2
~ > & ! * / \ + -
3 4 5 6
6.1.9
Paréntesis Resta unaria (complemento a dos) Negación a nivel de bit (complemento a 1) Desplazamiento a la izquierda Desplazamiento a la derecha Y a nivel de bit O a nivel de bit Multiplicación División entera Módulo Suma Resta
Especificaciones del modo de direccionamiento
El 68000 y el 68010 proporcionan 14 modos generales de direccionamiento. Los formatos utilizados para especificar estos modos en el lenguaje ensamblador se listan en la siguiente tabla: MODO Directo a registro de datos Directo a registro de direcciones
FORMATO ENSAMBLADOR Dn An
Indirecto a registro de direcciones
(An)
Indirecto a registro de direcciones con predecremento
-(An)
Indirecto a registro de direcciones con postincremento
(An)+
Entorno de Prácticas 68000
Pag.-41
Indirecto a registro de direcciones con desplazamiento Indirecto a registro de direcciones con índice
(An) (An, Xn.s)
Absoluto corto o largo (elegido por el ensamblador)
Contador de programa con desplazamiento Contador de programa con índice
(PC) (PC,Xn.s)
Inmediato
#
Los siguientes símbolos se utilizan para describir los formatos de los operandos: Dn
= registro de datos
An
= registro de direcciones (se puede utilizar SP en lugar de A7)
Xn
= registro de datos o de direcciones
.s .w .l = código de tamaño del registro índice (si se omite se supone .w) = expresión que evalúa un valor de 8 bits (puede ser vacía, en cuyo caso se toma el valor 0) = expresión que evalúa un valor de 16 bits (puede ser vacía, en cuyo caso se toma el valor 0) PC
= contador de programa (Program Counter)
Como complemento a los modos de direccionamiento, los siguientes nombres de registros pueden ser utilizados como operandos en ciertas instrucciones (p.e. MOVEC o EORI a CCR): SR
= Registro de Estado
CCR
= Registro de Código de Condición
USP
= Puntero de Pila de Usuario
Entorno de Prácticas 68000
Pag.-42
6.2 Algunos Detalles del ensamblador 6.2.1
Instrucciones de salto
Las instrucciones de salto (Bcc, BRA, y BSR) son las únicas que pueden tener asociado el código de tamaño “.S”. Este sufijo indica al ensamblador que las ensamble como instrucciones de salto corto, es decir, como instrucciones de una palabra con un rango entre –128 y +127 bytes. Si se utiliza el código de tamaño “.S” y el destino está actualmente fuera de este rango, entonces el ensamblador genera un mensaje de error. Si se utiliza el código de tamaño “.L”, el ensamblador utilizará un salto largo, que es una instrucción de dos palabras con un rango entre –32768 y 32767 bytes. Si no se especifica ningún código de tamaño, el ensamblador utiliza el salto corto si es posible (el destino del salto debe ser conocido en la primera pasada para poder estar dentro del rango del salto corto), en otro caso utiliza el salto largo. 6.2.2
La instrucción MOVEM
La instrucción MOVEM, que se utiliza para almacenar y cargar conjuntos de registros, puede tomar cualquiera de los dos formatos siguientes: MOVEM , MOVEM , La lista de registros debe ser una lista explícita de registros con el formato descrito para los rangos de registros. Por otra parte, si se utilizan conjuntos de registros en operaciones de almacenar y cargar de forma reiterativa, se puede utilizar la directiva REG para crear símbolos que representen dichas listas de registros. Por ejemplo, la siguiente directiva define el símbolo WORKSET como una lista de registros: WORKSET REG A0-A4/D1/D2 Una vez definido WORKSET, las siguientes instrucciones realizan la misma función: MOVE.L
WORKSET, -(SP)
MOVE.L
A0-A4/D1/D2, -(SP)
Si se va a utilizar un símbolo para representar una lista de registros, éste se debe definir previamente a su utilización en cualquier instrucción.
6.2.3
Instrucciones rápidas (MOVEQ, ADDQ y SUBQ)
Las instrucciones MOVE, ADD y SUB tienen variaciones de una palabra (denominadas “rápidas”) que pueden utilizarse en ciertos modos de direccionamiento y con ciertos valores para los operandos. El ensamblador utiliza estas variaciones más rápidas de forma automática cuando es posible, estas variaciones también se pueden utilizar especificando explícitamente sus códigos mnemónicos MOVEQ, ADDQ o SUBQ. La instrucción MOVEQ puede utilizarse para cargar registros de datos con valores inmediatos dentro del rango –128 a +127. El ensamblador ensamblará una instrucción MOVE.L #, Dn , como una MOVEQ si el se conoce en la primera pasada. La instrucción ADDQ (SUBQ) añade (resta) cualquier valor de 1 a 8 al (del) operando de destino. El ensamblador utilizará el modo rápido si el valor es conocido en la primera Entorno de Prácticas 68000
Pag.-43
pasada y está dentro del rango de 1 a 8.
6.3 Directivas del ensamblador 6.3.1
ORG - Establecer el origen
El ensamblador mantiene un contador de posiciones de 32 bits, cuyo valor es inicialmente 0 y se incrementa una cierta cantidad siempre que una instrucción es ensamblada o se encuentra una directiva de almacenamiento de datos. El valor del contador de posición puede establecerse con la directiva ORG. Esta directiva se suele situar normalmente en el comienzo del programa y en lugares apropiados dentro de él. El formato de la directiva ORG es el siguiente:
ORG
Donde es una expresión que no contiene posteriores referencias, es decir, es un valor conocido en la primera pasada en el punto en que la directiva ORG aparece. Se produce un error cuando se intenta establecer el contador de posición a un valor impar; en este caso el contador de posición se establece al valor dado más uno. La es opcional, pero si aparece, el símbolo especificado se establecerá al nuevo valor del contador de posición.
Directivas de definición de símbolos 6.3.2
EQU – Igualar Símbolo
La directiva EQU se utiliza para definir símbolos de valores constantes, cuyo valor no cambiará dentro del programa. El formato de esta directiva es:
EQU
Donde es una expresión que no contiene posteriores referencias, es decir, es un valor conocido en la primera pasada en el punto en que la directiva EQU aparece. La debe especificarse, puesto que indica el símbolo que está siendo definido. Si se omite la etiqueta se produce un error. Si se realiza un intento de redefinir un símbolo que ha sido definido previamente con EQU, a través de una etiqueta o de cualquier otra directiva de definición de símbolos, se produce un error.
6.3.3
SET – Establecer Símbolo
La directiva SET es similar en función y formato a la directiva EQU, con una diferencia importante: los símbolos definidos usando SET pueden redefinirse posteriormente utilizando otra directiva SET (pero no usando las directivas EQU o REG). El formato de esta directiva es:
6.3.4
SET
REG – Rango de Registros
Los rangos de registros consisten en listas de registros separadas por el carácter “/”. Cada rango de registros puede contener un solo registro (“An” o “Dn”) o un rango de ellos (“An-Am” o “Dn-Dm”), los cuales incluyen todos los registros entre los dos Entorno de Prácticas 68000
Pag.-44
indicados (pueden darse en cualquier orden). Por ejemplo, la lista de registros D0, D1, D2, D3 D7, A1, A2 y A3 puede indicarse con: D3-D0/D7/A1-A3 Los registros y los rangos pueden especificarse en cualquier orden. El mismo formato para las listas de registros se utiliza en la instrucción MOVEM. Para evitar confusiones, es preferible no especificar rangos que incluyan registros de direcciones y registros de datos, a pesar de que el ensamblador no los trate como rangos erróneos.
Directivas de almacenamiento de datos 6.3.5
DC – Definir Constante
La directiva DC se utiliza para almacenar cadenas y listas de constantes en memoria. El formato de la directiva DC es:
DC.
,,...
La etiqueta queda definida con la dirección de inicio de la lista de datos. El código de tamaño especifica que la lista es de bytes (.B), palabras (.W) o dobles palabras (.L); si se omite se utiliza el tamaño de palabra (.W). Una lista de items sigue a la directiva; cada item puede ser una expresión o una cadena. Si el item es una expresión, ésta se evalúa y almacena en el tamaño indicado, es decir, en un byte, una palabra o una doble palabra. Se genera un error si el valor no encaja (como valor con signo o sin signo) dentro del tamaño especificado. Si el item es una cadena, delimitada por comillas simples, entonces la cadena se almacenará en entidades sucesivas del tamaño especificado; si la cadena no encaja dentro de un número completo de palabras o dobles palabras, entonces la cadena se rellena por su final con ceros. En una directiva DC pueden mezclarse cadenas y expresiones. Si se están generando palabras (DC.W) o dobles palabras (DC.L), entonces el comienzo de la lista de constantes debe estar alineada a frontera de palabra, incrementando el contador de posición en uno si es necesario. Esto no se realiza para las directivas DC.B, por tanto, las cadenas de bytes pueden estar contiguas en la memoria. Si una instrucción sigue a una directiva DC.B, el ensamblador ajusta automáticamente el contador de localización (si es necesario) para ajustar las instrucción a frontera de palabra. Lo siguiente es un ejemplo de una directiva DC que define una cadena terminada con un valor nulo: TEXT
DC.B ‘Ejemplo de DC’, $0D, $0A, 0
Esta directiva da como resultado la siguiente información en la dirección de TEXT: 44 43 20 45 78 61 6D 70 6C 65 0D 0A 00
6.3.6
(hexadecimal)
DCB – Definir Bloque Constante
La directiva DCB genera un bloque de bytes, palabras o dobles palabras, inicializadas con el mismo valor por el ensamblador. El formato de la directiva es:
DCB.
,
La etiqueta queda definida con la dirección de inicio del bloque de datos. El código de
Entorno de Prácticas 68000
Pag.-45
tamaño especifica que el bloque es de bytes (.B), palabras (.W) o dobles palabras (.L); si se omite se utiliza el tamaño de palabra (.W). El argumento es una expresión que indica el número de bytes, palabras o dobles palabras que compondrán el bloque. Este valor debe ser conocido en la primera pasada en el punto en que la directiva DCB aparece y además no puede ser negativo. El argumento es una expresión cuyo valor va a inicializar cada uno de los items de datos que componen el bloque; no necesita ser conocido en la primera pasada. Se produce un mensaje de advertencia si el valor no encaja (como un número con signo o sin él) dentro del tamaño de datos seleccionado. Si se están generando palabras (DCB.W) o dobles palabras (DCB.L), entonces el comienzo de la lista de constantes debe estar alineada a frontera de palabra, incrementando el contador de localización en uno si es necesario. Si una directiva DCB.B va seguida de una instrucción, el ensamblador ajusta automáticamente el contador de posición (si es necesario) para ajustar las instrucción a frontera de palabra.
6.3.7
DS – Definir Almacenamiento
La directiva DS reserva un bloque de bytes, palabras o dobles palabras sin inicializar. El formato de la directiva es:
DS.
La etiqueta queda definida con la dirección de inicio del bloque de datos. El código de tamaño especifica que el bloque es de bytes (.B), palabras (.W) o dobles palabras (.L); si se omite se utiliza el tamaño de palabra (.W). El argumento es una expresión que indica el número de bytes, palabras o dobles palabras que compondrán el bloque. Este valor debe ser conocido en la primera pasada en el punto en que la directiva DS aparece y además no puede ser negativo. El efecto de la directiva DS es básicamente aumentar el contador de posición con el valor del tamaño (si se está utilizando DS.B), con dos veces el tamaño (si se está utilizando DS.W) o con cuatro veces el tamaño (si se está utilizando DS.L). Si se están reservando palabras (DS.W) o dobles palabras (DS.L), entonces el comienzo de la lista de constantes debe ser alineada a frontera de palabra, incrementando el contador de posición en uno si es necesario. Así, DS.W 0 se puede utilizar para forzar al contador de posición a alinearse a frontera de palabra, sin asignar ningún espacio. Si una directiva DS.B va seguida de una instrucción, el ensamblador ajusta automáticamente el contador de posición (si es necesario) para ajustar la instrucción a frontera de palabra.
6.3.8
END – Final del fichero fuente
La directiva END se utiliza para indicar el final del fichero fuente. Es puramente opcional. Su formato es sencillo: END El ensamblador ignorará cualquier cosa en el fichero fuente después de la directiva END.
Entorno de Prácticas 68000
Pag.-46
6.3.9
INCLUDE – Inclusión
Esta directiva se utiliza para hacer que otro fichero parezca que es parte del fichero fuente actual. Cuando se encuentra esta directiva, se para el procesamiento del fichero fuente y se comienza inmediatamente con el fichero nombrado en la directiva. El efecto es que el contenido del fichero incluido se inserta en el fichero fuente en el punto en que aparece la directiva. El procesamiento continúa en el fichero incluido hasta que se encuentra el final del fichero. Posteriormente se reanuda el procesamiento sobre el fichero original en la línea inmediatamente posterior a la que incluía la directiva. Su formato es: INCLUDE
función.asm
Hay que tener en cuenta que si se define la misma etiqueta en el fichero fuente y en el fichero incluido se produce un error.
6.4 Utilización 6.4.1
Línea de comandos
La línea de comandos utilizada para arrancar el ensamblador del 68000 tiene el siguiente formato: 68kasm Las opciones son cadenas de letras, precedidas por un carácter “-“, que alteran el comportamiento del ensamblador. Se permiten las siguientes letras de opción: c = muestra todas las constantes definidas con la directiva DC l = produce un fichero de listado n = no produce un fichero de código objeto a = produce sólo direccionamiento absoluto de doble palabra Si no se indica ninguna de estas opciones, los valores por defecto son: mostrar una sola línea de datos por directiva DC, no producir fichero de listado, y producir un fichero con código objeto. El argumento es el nombre del fichero a ensamblar, incluyendo especificaciones de directorio. Los nombres de los ficheros de código objeto y listado, si se generan, se construyen utilizando el nombre del fichero fuente con extensiones “.lis” (para el listado) y “.h68” (para el código objeto); los ficheros de salida siempre se generan en el directorio de trabajo del usuario. El programa muestra la línea “68000 Assembler by PGM” cuando comienza a ejecutarse. Si se produce cualquier error el programa muestra un línea con la siguiente información “ERROR in line X” o “WARNING in line X” (esta información también se muestra en el fichero de listado). Es decir, se muestran el número de errores y avisos generados durante el ensamblaje. Si se produce un error en la línea de comandos (por ejemplo, no se especifica nombre de fichero), el ensamblador muestra por pantalla un breve resumen de su utilización y aborta.
Entorno de Prácticas 68000
Pag.-47
6.4.2
Formato del fichero de listado
El ensamblador produce un fichero de listado que muestra el código fuente al lado del código objeto producido por el ensamblador. Una línea típica del fichero de listado tiene un formato como el siguiente: 0000102E
22D8
200 LOOP MOVE.L (A0)+, (A1)+
Ejemplo
El número formado por los ocho dígitos hexadecimales de la izquierda son el contador de posiciones del ensamblador; el código objeto generado, $22D8, está situado en dicha posición. El siguiente número es el número de línea dentro del fichero de código fuente; el resto de la línea simplemente repite la línea fuente. Recuérdese que si las líneas fuente no son mayores de 80 columnas, las líneas del fichero de listado no excederán de 132 columnas. Si se encuentra un error o se genera un aviso en una línea, entonces el listado de dicha línea irá seguido por una descripción del error. Al final del listado del programa se muestra el total de errores y avisos generados durante el ensamblado. En el formato utilizado para listar el código objeto hay espacio suficiente para la mayoría de las posibles instrucciones. Pero la directiva DC plantea un problema, puede generar docenas de dobles palabras con una simple línea de código. La opción “-c” de la línea de comando del ensamblador controla las acciones que se provocan cuando el código objeto generado excede del espacio disponible de una línea. Si no se especifica la opción “-c” , el ensamblador generará solamente una línea de listado con una elipsis (“...”) al final del campo del código objeto, indicando que algunos de los datos definidos con la directiva se omiten del listado. Si se incluye la opción “-c” en la línea de comandos, el ensamblador utilizará tantas líneas de listado como necesite para mostrar todos los datos producidos por la directiva. Cada línea después de la primera contendrá sólo el contador de posición y el campo del código objeto (la línea fuente no se repite).
6.4.3
Formato del fichero de código objeto
El ensamblador del 68000 genera un fichero de salida con código objeto en el formato S-record de Motorola. El nombre de este fichero objeto se obtiene del nombre del fichero fuente con la extensión “.h68”. El fichero objeto y el fichero de listado se generan siempre en el directorio de trabajo del usuario. El formato S-record está diseñado para permitir el intercambio de ficheros con formato de texto y con códigos de detección de errores. No vamos a describir el formato completo de dichos ficheros, pero sí la estructura básica, que es la siguiente: la primera línea del fichero objeto es un registro S0 (cabecera) y la última línea es un registro S9 (terminación). Las líneas entre ambas son registros S1, S2 y S3, dependiendo de si la dirección del primer byte de un registro requiere 2, 3 o 4 bytes para ser representada. Ningún registro es mayor de 80 caracteres.
Entorno de Prácticas 68000
Pag.-48